From fa50d4f26c624f00aa8c918a1ddfeaf9598263c8 Mon Sep 17 00:00:00 2001
From: poka <poka@p2p.legal>
Date: Mon, 18 Dec 2023 05:18:39 +0100
Subject: [PATCH] feat: can switch dev/prod

---
 Dockerfile                  | 14 ++++++++++++++
 Dockerfile.Hasura           |  7 +++++++
 docker-compose.override.yml | 14 ++++++++++++++
 docker-compose.prod.yml     | 15 +++++++++++++++
 docker-compose.yml          | 35 +++++++----------------------------
 index.ts                    | 30 +++++++++++++++++++++++-------
 lib/update_profile.ts       |  4 +---
 load.sh                     | 16 ++++++++++++++++
 scripts/init-hasura.sh      |  7 +++++--
 9 files changed, 102 insertions(+), 40 deletions(-)
 create mode 100644 Dockerfile
 create mode 100644 Dockerfile.Hasura
 create mode 100644 docker-compose.override.yml
 create mode 100644 docker-compose.prod.yml
 create mode 100755 load.sh

diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..60e8456
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+FROM denoland/deno:alpine
+
+WORKDIR /app
+
+COPY index.ts .
+COPY lib ./lib
+ENV PRODUCTION=true
+
+# cache deps
+RUN deno cache index.ts
+
+EXPOSE 3000
+
+CMD ["deno", "run", "--allow-env", "--allow-read", "--allow-write", "--allow-net", "index.ts"]
diff --git a/Dockerfile.Hasura b/Dockerfile.Hasura
new file mode 100644
index 0000000..66f0a03
--- /dev/null
+++ b/Dockerfile.Hasura
@@ -0,0 +1,7 @@
+FROM hasura/graphql-engine:v2.36.0
+
+COPY ./hasura /hasura
+COPY ./scripts/init-hasura.sh /init-hasura.sh
+COPY ./config.yaml /config.yaml
+
+RUN curl -sL https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash 2>/dev/null
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
new file mode 100644
index 0000000..02cf2c1
--- /dev/null
+++ b/docker-compose.override.yml
@@ -0,0 +1,14 @@
+version: "3.6"
+services:
+  postgres-datapod:
+    ports:
+      - "5432:5432"
+  graphql-engine-datapod:
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    environment:
+      PRODUCTION: "false"
+    volumes:
+      - ./hasura:/hasura
+      - ./scripts/init-hasura.sh:/init-hasura.sh
+      - ./config.yaml:/config.yaml
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
new file mode 100644
index 0000000..b750dfa
--- /dev/null
+++ b/docker-compose.prod.yml
@@ -0,0 +1,15 @@
+version: "3.6"
+services:
+  graphql-engine-datapod:
+    environment:
+      PRODUCTION: "true"
+  datapod-app:
+    image: duniter-datapod-app:latest
+    depends_on:
+      postgres-datapod:
+        condition: service_healthy
+    restart: always
+    environment:
+      DB_USER: ${DB_USER}
+      DB_PASSWORD: ${DB_PASSWORD}
+      DB_DATABASE: ${DB_DATABASE}
diff --git a/docker-compose.yml b/docker-compose.yml
index 33355ef..4fcb406 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,13 +1,10 @@
 version: "3.6"
 services:
-  postgres:
+  postgres-datapod:
     image: postgres:15
     restart: always
     volumes:
       - db_data:/var/lib/postgresql/data
-      # - ./hasura/migrations:/docker-entrypoint-initdb.d
-    ports:
-      - "5432:5432"
     environment:
       POSTGRES_USER: ${DB_USER:-postgres}
       POSTGRES_PASSWORD: ${DB_PASSWORD:-postgrespassword}
@@ -18,39 +15,21 @@ services:
       timeout: 2s
       retries: 5
 
-  graphql-engine:
-    image: hasura/graphql-engine:v2.36.0
+  graphql-engine-datapod:
+    image: duniter-datapod-hasura:latest
     depends_on:
-      postgres:
+      postgres-datapod:
         condition: service_healthy
+    restart: always
     ports:
       - "8080:8080"
-    restart: always
-    # network_mode: "host"
-    extra_hosts:
-    - "host.docker.internal:host-gateway"
     environment:
-      ## postgres database to store Hasura metadata
-      HASURA_GRAPHQL_DATABASE_URL: postgres://${DB_USER:-postgres}:${DB_PASSWORD:-postgrespassword}@postgres:5432/${DB_DATABASE:-postgres}
-      ## enable the console served by server
-      HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
-      ## enable debugging mode. It is recommended to disable this in production
+      HASURA_GRAPHQL_DATABASE_URL: postgres://${DB_USER:-postgres}:${DB_PASSWORD:-postgrespassword}@postgres-datapod:5432/${DB_DATABASE:-postgres}
+      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
       HASURA_GRAPHQL_DEV_MODE: "true"
-      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
-      ## uncomment next line to run console offline (i.e load console assets from server instead of CDN)
-      # HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets
-      ## uncomment next line to set an admin secret
       HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET}
-      # HASURA_GRAPHQL_METADATA_DEFAULTS: '{"backend_configs":{"dataconnector":{"athena":{"uri":"http://data-connector-agent:8081/api/v1/athena"},"mariadb":{"uri":"http://data-connector-agent:8081/api/v1/mariadb"},"mysql8":{"uri":"http://data-connector-agent:8081/api/v1/mysql"},"oracle":{"uri":"http://data-connector-agent:8081/api/v1/oracle"},"snowflake":{"uri":"http://data-connector-agent:8081/api/v1/snowflake"}}}}'
-      ## Name of role when the Authorization header is absent in JWT
       HASURA_GRAPHQL_UNAUTHORIZED_ROLE: public
-      ## Disable telemetry
       HASURA_GRAPHQL_ENABLE_TELEMETRY: "false"
-      ## Define metadata and migrations directories
-    volumes: # for local developement, you want to record the database migrations in git
-      - ./hasura:/hasura
-      - ./scripts/init-hasura.sh:/init-hasura.sh
-      - ./config.yaml:/config.yaml
     command: sh /init-hasura.sh
 
 volumes:
diff --git a/index.ts b/index.ts
index e2d91d8..7ed6ee7 100644
--- a/index.ts
+++ b/index.ts
@@ -3,21 +3,37 @@ import { Client } from "https://deno.land/x/postgres@v0.17.0/mod.ts";
 import { load } from "https://deno.land/std@0.209.0/dotenv/mod.ts";
 import { updateProfile } from "./lib/update_profile.ts";
 
-const env = await load();
+let dbUser, dbDatabase, dbPassword, dbHostname;
+const dbPort = 5432;
+
+const isProduction = Deno.env.get("PRODUCTION") === "true";
+
+if (isProduction) {
+    dbUser = Deno.env.get("DB_USER");
+    dbDatabase = Deno.env.get("DB_DATABASE");
+    dbPassword = Deno.env.get("DB_PASSWORD");
+    dbHostname = "postgres-datapod";
+} else {
+    const env = await load();
+    dbUser = env["DB_USER"];
+    dbDatabase = env["DB_DATABASE"];
+    dbPassword = env["DB_PASSWORD"];
+    dbHostname = "localhost";
+}
 
 const client = new Client({
-  user: env["DB_USER"],
-  database: env["DB_DATABASE"],
-  hostname: "localhost",
-  password: env["DB_PASSWORD"],
-  port: 5432,
+    user: dbUser,
+    database: dbDatabase,
+    hostname: dbHostname,
+    password: dbPassword,
+    port: dbPort,
 });
 
 await client.connect()
 const app = new Application();
 const router = new Router();
 
-// Manage route /update-profile-data
+// Manage routes
 router.post("/update-profile-data", async (ctx: Context) => await updateProfile(ctx, client));
 
 app.use(router.routes());
diff --git a/lib/update_profile.ts b/lib/update_profile.ts
index e1e8301..b1b1262 100644
--- a/lib/update_profile.ts
+++ b/lib/update_profile.ts
@@ -8,9 +8,7 @@ export async function updateProfile(ctx: Context, client: Client) {
       const body = (await ctx.request.body().value);
       const bodyValue = body.variables ? body.variables : (body.input ? body.input : {});
       const { address, hash, signature, avatarBase64, description, geoloc } = bodyValue;
-  
-      // console.log(bodyValue);
-  
+    
       // Verify signature
       const playload = JSON.stringify({description, avatarBase64, geoloc});
       if (!await verifySignature(address, signature, hash, playload)) {
diff --git a/load.sh b/load.sh
new file mode 100755
index 0000000..664b2dc
--- /dev/null
+++ b/load.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+option=$1
+log=$2
+
+if [[ $option == "dev" ]]; then
+    echo "Start datapod in dev mode"
+    docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.override.yml down -v
+    docker compose up -d
+    deno run --allow-env --allow-read --allow-write --allow-net --watch index.ts
+else
+    echo "Start datapod in production mode"
+    docker compose -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.override.yml down
+    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
+    [[ $log == "log" ]] && docker compose -f docker-compose.yml -f docker-compose.prod.yml logs -f
+fi
diff --git a/scripts/init-hasura.sh b/scripts/init-hasura.sh
index ad3cb5b..12367e2 100755
--- a/scripts/init-hasura.sh
+++ b/scripts/init-hasura.sh
@@ -3,8 +3,6 @@
 # start hasura in background
 graphql-engine serve &
 
-[ ! $(which hasura) ] && curl -sL https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
-
 endpoint="http://localhost:8080"
 
 check_hasura_ready() {
@@ -18,6 +16,11 @@ while [ $(check_hasura_ready) -ne 200 ]; do
 done
 
 echo "Hasura is ready."
+if [[ $PRODUCTION == "true" ]]; then
+  sed -i 's/host.docker.internal:3000/datapod-app:3000/g' hasura/metadata/actions.yaml
+else
+  sed -i 's/datapod-app:3000/host.docker.internal:3000/g' hasura/metadata/actions.yaml
+fi
 
 hasura migrate apply --endpoint $endpoint --admin-secret $HASURA_GRAPHQL_ADMIN_SECRET --database-name default
 hasura metadata apply --endpoint $endpoint --admin-secret $HASURA_GRAPHQL_ADMIN_SECRET
-- 
GitLab