diff --git a/infra/prod/postgres/Dockerfile b/infra/prod/postgres/Dockerfile new file mode 100644 index 000000000..5f2865444 --- /dev/null +++ b/infra/prod/postgres/Dockerfile @@ -0,0 +1,30 @@ +ARG PG_MAIN_VERSION=14 + +FROM postgres:${PG_MAIN_VERSION} as postgres + +ARG PG_MAIN_VERSION +ARG PG_GRAPHQL_VERSION=1.3.0 +ARG TARGETARCH + +RUN set -eux; \ + ARCH="$(dpkg --print-architecture)"; \ + case "${ARCH}" in \ + aarch64|arm64) \ + TARGETARCH='arm64'; \ + ;; \ + amd64|x86_64) \ + TARGETARCH='amd64'; \ + ;; \ + *) \ + echo "Unsupported arch: ${ARCH}"; \ + exit 1; \ + ;; \ + esac; + +RUN apt update && apt install -y curl + +# Install precompiled pg_graphql extensions +RUN curl -L "https://github.com/supabase/pg_graphql/releases/download/v${PG_GRAPHQL_VERSION}/pg_graphql-v${PG_GRAPHQL_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o pg_graphql.deb +RUN dpkg --install pg_graphql.deb + +COPY ./infra/prod/postgres/init.sql /docker-entrypoint-initdb.d/ \ No newline at end of file diff --git a/infra/prod/postgres/init.sql b/infra/prod/postgres/init.sql new file mode 100644 index 000000000..5123e987c --- /dev/null +++ b/infra/prod/postgres/init.sql @@ -0,0 +1,10 @@ +SELECT 'CREATE DATABASE "default"' +WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'default')\gexec + +SELECT 'CREATE DATABASE "test"' +WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'test')\gexec + +SELECT 'CREATE USER twenty PASSWORD ''twenty''' +WHERE NOT EXISTS (SELECT FROM pg_user WHERE usename = 'twenty')\gexec + +SELECT 'ALTER ROLE twenty superuser'\gexec diff --git a/render.yaml b/render.yaml index 77f4a5e03..f0580091e 100644 --- a/render.yaml +++ b/render.yaml @@ -1,43 +1,64 @@ services: -- type: web - name: server - env: docker - dockerfilePath: ./infra/prod/server/Dockerfile - dockerCommand: "sh -c yarn prisma:migrate && node dist/src/main" - autoDeploy: false - envVars: - - key: ACCESS_TOKEN_SECRET - generateValue: true - - key: LOGIN_TOKEN_SECRET - generateValue: true - - key: API_TOKEN_SECRET - generateValue: true - - key: REFRESH_TOKEN_SECRET - generateValue: true - - key: PG_DATABASE_URL - fromDatabase: - name: twenty-db - property: connectionString - - key: FRONT_BASE_URL - fromService: - name: front - type: web - envVarKey: RENDER_EXTERNAL_URL - disk: - name: twenty-disk - mountPath: /.local-storage - sizeGB: 5 - type: web name: front env: docker dockerfilePath: ./infra/prod/front/Dockerfile autoDeploy: false envVars: - - key: REACT_APP_SERVER_BASE_URL - fromService: - name: server - type: web - envVarKey: RENDER_EXTERNAL_URL -databases: -- name: twenty-db - plan: starter + - key: REACT_APP_SERVER_BASE_URL + fromService: + name: server + type: web + envVarKey: RENDER_EXTERNAL_URL +- type: web + name: server + env: docker + dockerfilePath: ./infra/prod/server/Dockerfile + dockerCommand: "sh -c yarn prisma:migrate && yarn database:setup && node dist/src/main" + autoDeploy: false + envVars: + - key: FRONT_BASE_URL + fromService: + name: front + type: web + envVarKey: RENDER_EXTERNAL_URL + - key: ACCESS_TOKEN_SECRET + generateValue: true + - key: LOGIN_TOKEN_SECRET + generateValue: true + - key: API_TOKEN_SECRET + generateValue: true + - key: REFRESH_TOKEN_SECRET + generateValue: true + - key: PG_DATABASE_HOST + fromService: + name: twenty_postgres + type: pserv + property: host + - key: PG_DATABASE_PORT + fromService: + name: twenty_postgres + type: pserv + property: port + - key: PG_DATABASE_URL + value: postgres://twenty:twenty@twenty-postgres:5432/default?connection_limit=1 + disk: + name: twenty-disk + mountPath: /.local-storage + sizeGB: 5 +- type: pserv + name: twenty_postgres + env: docker + dockerfilePath: ./infra/prod/postgres/Dockerfile + autoDeploy: false + disk: + name: data + mountPath: /var/lib/postgresql/data + sizeGB: 10 + envVars: + - key: POSTGRES_USER + value: twenty + - key: POSTGRES_PASSWORD + value: twenty + - key: POSTGRES_DB + value: default