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