From e2d31a36cbf1074fc839aaafaf5311a2ca833cb5 Mon Sep 17 00:00:00 2001 From: Jack W Date: Wed, 1 May 2024 12:23:40 +0100 Subject: [PATCH 1/5] Remove junk. --- .dockerignore | 3 +- .env.example | 61 -------- .github/workflows/scarf-data-export.yml | 14 -- Dockerfile.render | 1 - docker-compose.yaml | 67 --------- render.yaml | 26 ---- scripts/replace-placeholder.sh | 16 --- scripts/start.sh | 11 -- scripts/wait-for-it.sh | 184 ------------------------ 9 files changed, 2 insertions(+), 381 deletions(-) delete mode 100644 .env.example delete mode 100644 .github/workflows/scarf-data-export.yml delete mode 100644 Dockerfile.render delete mode 100644 docker-compose.yaml delete mode 100644 render.yaml delete mode 100755 scripts/replace-placeholder.sh delete mode 100755 scripts/start.sh delete mode 100755 scripts/wait-for-it.sh diff --git a/.dockerignore b/.dockerignore index c9b9f80cd..db87c4588 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ .git .github -.env.example \ No newline at end of file +.env.example +node_modules diff --git a/.env.example b/.env.example deleted file mode 100644 index cd81e8b27..000000000 --- a/.env.example +++ /dev/null @@ -1,61 +0,0 @@ -# Set this value to 'agree' to accept our license: -# LICENSE: https://github.com/calendso/calendso/blob/main/LICENSE -# -# Summary of terms: -# - The codebase has to stay open source, whether it was modified or not -# - You can not repackage or sell the codebase -# - Acquire a commercial license to remove these terms by emailing: license@cal.com -NEXT_PUBLIC_LICENSE_CONSENT= -LICENSE= - -# BASE_URL and NEXT_PUBLIC_APP_URL are both deprecated. Both are replaced with one variable, NEXT_PUBLIC_WEBAPP_URL -# BASE_URL=http://localhost:3000 -# NEXT_PUBLIC_APP_URL=http://localhost:3000 - -NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 - -# Configure NEXTAUTH_URL manually if needed, otherwise it will resolve to {NEXT_PUBLIC_WEBAPP_URL}/api/auth -# NEXTAUTH_URL=http://localhost:3000/api/auth - -# It is highly recommended that the NEXTAUTH_SECRET must be overridden and very unique -# Use `openssl rand -base64 32` to generate a key -NEXTAUTH_SECRET=secret - -# Encryption key that will be used to encrypt CalDAV credentials, choose a random string, for example with `dd if=/dev/urandom bs=1K count=1 | md5sum` -CALENDSO_ENCRYPTION_KEY=secret - -# Deprecation note: JWT_SECRET is no longer used -# JWT_SECRET=secret - -POSTGRES_USER=unicorn_user -POSTGRES_PASSWORD=magical_password -POSTGRES_DB=calendso -DATABASE_HOST=database:5432 -DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB} -# Needed to run migrations while using a connection pooler like PgBouncer -# Use the same one as DATABASE_URL if you're not using a connection pooler -DATABASE_DIRECT_URL=${DATABASE_URL} -GOOGLE_API_CREDENTIALS={} - -# Set this to '1' if you don't want Cal to collect anonymous usage -CALCOM_TELEMETRY_DISABLED= - -# Used for the Office 365 / Outlook.com Calendar integration -MS_GRAPH_CLIENT_ID= -MS_GRAPH_CLIENT_SECRET= - -# Used for the Zoom integration -ZOOM_CLIENT_ID= -ZOOM_CLIENT_SECRET= - -# E-mail settings -# Configures the global From: header whilst sending emails. -EMAIL_FROM=notifications@example.com - -# Configure SMTP settings (@see https://nodemailer.com/smtp/). -EMAIL_SERVER_HOST=smtp.example.com -EMAIL_SERVER_PORT=587 -EMAIL_SERVER_USER=email_user -EMAIL_SERVER_PASSWORD=email_password - -NODE_ENV=production diff --git a/.github/workflows/scarf-data-export.yml b/.github/workflows/scarf-data-export.yml deleted file mode 100644 index 64a76e3ee..000000000 --- a/.github/workflows/scarf-data-export.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Export Scarf data -on: - schedule: - - cron: '0 0 * * *' - -jobs: - export-scarf-data: - runs-on: ubuntu-latest - steps: - - uses: docker://scarf.docker.scarf.sh/scarf-sh/scarf-postgres-exporter:latest - env: - SCARF_API_TOKEN: ${{ secrets.SCARF_API_TOKEN }} - SCARF_ENTITY_NAME: Calcom - PSQL_CONN_STRING: ${{ secrets.PSQL_CONN_STRING }} diff --git a/Dockerfile.render b/Dockerfile.render deleted file mode 100644 index d0f2475c1..000000000 --- a/Dockerfile.render +++ /dev/null @@ -1 +0,0 @@ -FROM calcom.docker.scarf.sh/calcom/cal.com diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 9004bbb62..000000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,67 +0,0 @@ -# Use postgres/example user/password credentials -version: '3.8' - -volumes: - database-data: - -networks: - stack: - name: stack - external: false - -services: - database: - container_name: database - image: postgres - restart: always - volumes: - - database-data:/var/lib/postgresql/data/ - env_file: .env - networks: - - stack - - calcom: - image: calcom.docker.scarf.sh/calcom/cal.com - build: - context: . - dockerfile: Dockerfile - args: - NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL} - NEXT_PUBLIC_LICENSE_CONSENT: ${NEXT_PUBLIC_LICENSE_CONSENT} - CALCOM_TELEMETRY_DISABLED: ${CALCOM_TELEMETRY_DISABLED} - NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} - CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY} - DATABASE_URL: ${DATABASE_URL} - DATABASE_DIRECT_URL: ${DATABASE_URL} - network: stack - restart: always - networks: - - stack - ports: - - 3000:3000 - env_file: .env - environment: - - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB} - - DATABASE_DIRECT_URL=${DATABASE_URL} - depends_on: - - database - -# Optional use of Prisma Studio. In production, comment out or remove the section below to prevent unwanted access to your database. - studio: - image: calcom.docker.scarf.sh/calcom/cal.com - restart: always - networks: - - stack - ports: - - 5555:5555 - env_file: .env - environment: - - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB} - - DATABASE_DIRECT_URL=${DATABASE_URL} - depends_on: - - database - command: - - npx - - prisma - - studio -# END SECTION: Optional use of Prisma Studio. diff --git a/render.yaml b/render.yaml deleted file mode 100644 index f4c3b8d69..000000000 --- a/render.yaml +++ /dev/null @@ -1,26 +0,0 @@ -services: - - type: web - name: cal-web - plan: standard - repo: https://github.com/calcom/docker.git - dockerfilePath: ./Dockerfile.render - env: docker - envVars: - - - key: DATABASE_URL - fromDatabase: - name: cal-postgres - property: connectionString - - - key: CALENDSO_ENCRYPTION_KEY - value: secret - - - key: NEXTAUTH_SECRET - value: secret - - - key: CRON_API_KEY - value: 0cc0e6c35519bba620c9360cfe3e68d0 - -databases: - - name: cal-postgres - plan: starter diff --git a/scripts/replace-placeholder.sh b/scripts/replace-placeholder.sh deleted file mode 100755 index 57dbabbbc..000000000 --- a/scripts/replace-placeholder.sh +++ /dev/null @@ -1,16 +0,0 @@ -FROM=$1 -TO=$2 - -if [ "${FROM}" = "${TO}" ]; then - echo "Nothing to replace, the value is already set to ${TO}." - - exit 0 -fi - -# Only peform action if $FROM and $TO are different. -echo "Replacing all statically built instances of $FROM with $TO." - -find apps/web/.next/ apps/web/public -type f | -while read file; do - sed -i "s|$FROM|$TO|g" "$file" -done diff --git a/scripts/start.sh b/scripts/start.sh deleted file mode 100755 index d92bf2e09..000000000 --- a/scripts/start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -set -x - -# Replace the statically built BUILT_NEXT_PUBLIC_WEBAPP_URL with run-time NEXT_PUBLIC_WEBAPP_URL -# NOTE: if these values are the same, this will be skipped. -scripts/replace-placeholder.sh "$BUILT_NEXT_PUBLIC_WEBAPP_URL" "$NEXT_PUBLIC_WEBAPP_URL" - -scripts/wait-for-it.sh ${DATABASE_HOST} -- echo "database is up" -npx prisma migrate deploy --schema /calcom/packages/prisma/schema.prisma -npx ts-node --transpile-only /calcom/packages/prisma/seed-app-store.ts -yarn start diff --git a/scripts/wait-for-it.sh b/scripts/wait-for-it.sh deleted file mode 100755 index 08c8d6d95..000000000 --- a/scripts/wait-for-it.sh +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/sh - -# The MIT License (MIT) -# -# Copyright (c) 2017 Eficode Oy -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -set -- "$@" -- "$TIMEOUT" "$QUIET" "$PROTOCOL" "$HOST" "$PORT" "$result" -TIMEOUT=15 -QUIET=0 -# The protocol to make the request with, either "tcp" or "http" -PROTOCOL="tcp" - -echoerr() { - if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi -} - -usage() { - exitcode="$1" - cat << USAGE >&2 -Usage: - $0 host:port|url [-t timeout] [-- command args] - -q | --quiet Do not output any status messages - -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout - -- COMMAND ARGS Execute command with args after the test finishes -USAGE - exit "$exitcode" -} - -wait_for() { - case "$PROTOCOL" in - tcp) - if ! command -v nc >/dev/null; then - echoerr 'nc command is missing!' - exit 1 - fi - ;; - wget) - if ! command -v wget >/dev/null; then - echoerr 'wget command is missing!' - exit 1 - fi - ;; - esac - - while :; do - case "$PROTOCOL" in - tcp) - nc -w 1 -z "$HOST" "$PORT" > /dev/null 2>&1 - ;; - http) - wget --timeout=1 -q "$HOST" -O /dev/null > /dev/null 2>&1 - ;; - *) - echoerr "Unknown protocol '$PROTOCOL'" - exit 1 - ;; - esac - - result=$? - - if [ $result -eq 0 ] ; then - if [ $# -gt 7 ] ; then - for result in $(seq $(($# - 7))); do - result=$1 - shift - set -- "$@" "$result" - done - - TIMEOUT=$2 QUIET=$3 PROTOCOL=$4 HOST=$5 PORT=$6 result=$7 - shift 7 - exec "$@" - fi - exit 0 - fi - - if [ "$TIMEOUT" -le 0 ]; then - break - fi - TIMEOUT=$((TIMEOUT - 1)) - - sleep 1 - done - echo "Operation timed out" >&2 - exit 1 -} - -while :; do - case "$1" in - http://*|https://*) - HOST="$1" - PROTOCOL="http" - shift 1 - ;; - *:* ) - HOST=$(printf "%s\n" "$1"| cut -d : -f 1) - PORT=$(printf "%s\n" "$1"| cut -d : -f 2) - shift 1 - ;; - -q | --quiet) - QUIET=1 - shift 1 - ;; - -q-*) - QUIET=0 - echoerr "Unknown option: $1" - usage 1 - ;; - -q*) - QUIET=1 - result=$1 - shift 1 - set -- -"${result#-q}" "$@" - ;; - -t | --timeout) - TIMEOUT="$2" - shift 2 - ;; - -t*) - TIMEOUT="${1#-t}" - shift 1 - ;; - --timeout=*) - TIMEOUT="${1#*=}" - shift 1 - ;; - --) - shift - break - ;; - --help) - usage 0 - ;; - -*) - QUIET=0 - echoerr "Unknown option: $1" - usage 1 - ;; - *) - QUIET=0 - echoerr "Unknown argument: $1" - usage 1 - ;; - esac -done - -if ! [ "$TIMEOUT" -ge 0 ] 2>/dev/null; then - echoerr "Error: invalid timeout '$TIMEOUT'" - usage 3 -fi - -case "$PROTOCOL" in - tcp) - if [ "$HOST" = "" ] || [ "$PORT" = "" ]; then - echoerr "Error: you need to provide a host and port to test." - usage 2 - fi - ;; - http) - if [ "$HOST" = "" ]; then - echoerr "Error: you need to provide a host to test." - usage 2 - fi - ;; -esac - -wait_for "$@" From ed1f79643d7daa0738254a34e7de6ab072177705 Mon Sep 17 00:00:00 2001 From: Jack W Date: Thu, 2 May 2024 08:33:36 +0100 Subject: [PATCH 2/5] Use a more standardised Dockerfile for Next.js monorepos. --- Dockerfile | 94 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/Dockerfile b/Dockerfile index 167c7c41b..7d767d48b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,76 +1,78 @@ -FROM node:18 as builder +FROM node:18-alpine AS base -WORKDIR /calcom +FROM base AS builder +RUN apk add --no-cache libc6-compat +RUN apk update +# Set working directory +WORKDIR /app +RUN yarn global add turbo +COPY calcom/. . +RUN turbo prune @calcom/web --docker + +# Add lockfile and package.json's of isolated subworkspace +FROM base AS installer ARG NEXT_PUBLIC_LICENSE_CONSENT ARG CALCOM_TELEMETRY_DISABLED ARG DATABASE_URL ARG NEXTAUTH_SECRET=secret +ARG NEXT_PUBLIC_API_V2_URL ARG CALENDSO_ENCRYPTION_KEY=secret ARG MAX_OLD_SPACE_SIZE=4096 +ARG NEXT_PUBLIC_WEBAPP_URL -ENV NEXT_PUBLIC_WEBAPP_URL=http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER \ +ENV NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL \ NEXT_PUBLIC_LICENSE_CONSENT=$NEXT_PUBLIC_LICENSE_CONSENT \ CALCOM_TELEMETRY_DISABLED=$CALCOM_TELEMETRY_DISABLED \ DATABASE_URL=$DATABASE_URL \ DATABASE_DIRECT_URL=$DATABASE_URL \ NEXTAUTH_SECRET=${NEXTAUTH_SECRET} \ + NEXT_PUBLIC_API_V2_URL=${NEXT_PUBLIC_API_V2_URL} \ CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY} \ NODE_OPTIONS=--max-old-space-size=${MAX_OLD_SPACE_SIZE} -COPY calcom/package.json calcom/yarn.lock calcom/.yarnrc.yml calcom/playwright.config.ts calcom/turbo.json calcom/git-init.sh calcom/git-setup.sh ./ -COPY calcom/.yarn ./.yarn -COPY calcom/apps/web ./apps/web -COPY calcom/packages ./packages -COPY calcom/tests ./tests - -RUN yarn config set httpTimeout 1200000 && \ - npx turbo prune --scope=@calcom/web --docker && \ - yarn install && \ - yarn db-deploy && \ - yarn --cwd packages/prisma seed-app-store +RUN apk add --no-cache libc6-compat +RUN apk update +WORKDIR /app -RUN yarn turbo run build --filter=@calcom/web +# First install the dependencies (as they change less often) +COPY .gitignore .gitignore +COPY --from=builder /app/out/json/ . +COPY --from=builder /app/out/yarn.lock ./yarn.lock -# RUN yarn plugin import workspace-tools && \ -# yarn workspaces focus --all --production -RUN rm -rf node_modules/.cache .yarn/cache apps/web/.next/cache - -FROM node:18 as builder-two +# app-store packages aren't explicitly required but need to be available +COPY calcom/packages ./packages -WORKDIR /calcom -ARG NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 +RUN yarn install -ENV NODE_ENV production +# Build the project +COPY --from=builder /app/out/full/ . -COPY calcom/package.json calcom/.yarnrc.yml calcom/yarn.lock calcom/turbo.json ./ -COPY calcom/.yarn ./.yarn -COPY --from=builder /calcom/node_modules ./node_modules -COPY --from=builder /calcom/packages ./packages -COPY --from=builder /calcom/apps/web ./apps/web -COPY --from=builder /calcom/packages/prisma/schema.prisma ./prisma/schema.prisma -COPY scripts scripts +# Disable linting and type checking in the next build +ENV CI=1 -# Save value used during this build stage. If NEXT_PUBLIC_WEBAPP_URL and BUILT_NEXT_PUBLIC_WEBAPP_URL differ at -# run-time, then start.sh will find/replace static values again. -ENV NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL \ - BUILT_NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL +RUN yarn turbo run build --filter=@calcom/web... -RUN scripts/replace-placeholder.sh http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER ${NEXT_PUBLIC_WEBAPP_URL} +FROM base AS runner +WORKDIR /app -FROM node:18 as runner +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs +COPY --from=installer /app/apps/web/next.config.js . +COPY --from=installer /app/apps/web/package.json . -WORKDIR /calcom -COPY --from=builder-two /calcom ./ -ARG NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 -ENV NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL \ - BUILT_NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL -ENV NODE_ENV production -EXPOSE 3000 +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ +COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static +COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public -HEALTHCHECK --interval=30s --timeout=30s --retries=5 \ - CMD wget --spider http://localhost:3000 || exit 1 +RUN yarn global add prisma +COPY calcom/packages/prisma/schema.prisma . -CMD ["/calcom/scripts/start.sh"] +# TODO: Consider adding seeding script here +CMD ["sh", "-c", "$(yarn global bin)/prisma migrate deploy --schema=schema.prisma && node apps/web/server.js"] From b05e76c35f251f8d0329dca5681009f2cab22c90 Mon Sep 17 00:00:00 2001 From: Jack W Date: Thu, 9 May 2024 09:09:41 +0100 Subject: [PATCH 3/5] Better .dockerignore. --- .dockerignore | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index db87c4588..d2e33da3b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,6 @@ .git -.github .env.example -node_modules +**/.github +**/node_modules +**/.next +calcom/.yarn/cache From 45f44f9a53cef72f95e64667798a99f07bb0e648 Mon Sep 17 00:00:00 2001 From: Jack W Date: Thu, 9 May 2024 10:44:31 +0100 Subject: [PATCH 4/5] Copy over migration files in Dockerfile. --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7d767d48b..a8171fcc8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,7 +72,8 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/we COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public RUN yarn global add prisma -COPY calcom/packages/prisma/schema.prisma . +COPY calcom/packages/prisma/migrations/. ./prisma/migrations +COPY calcom/packages/prisma/schema.prisma ./prisma/schema.prisma # TODO: Consider adding seeding script here -CMD ["sh", "-c", "$(yarn global bin)/prisma migrate deploy --schema=schema.prisma && node apps/web/server.js"] +CMD ["sh", "-c", "$(yarn global bin)/prisma migrate deploy --schema=prisma/schema.prisma && node apps/web/server.js"] From 34d208f7a63ab463c9dc9bdc6e4c81f81c7713f8 Mon Sep 17 00:00:00 2001 From: Jack W Date: Thu, 9 May 2024 11:39:43 +0100 Subject: [PATCH 5/5] Increase memory limit and pass Sentry DSN as ENV in Dockerfile. --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a8171fcc8..51702a829 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,8 +18,9 @@ ARG DATABASE_URL ARG NEXTAUTH_SECRET=secret ARG NEXT_PUBLIC_API_V2_URL ARG CALENDSO_ENCRYPTION_KEY=secret -ARG MAX_OLD_SPACE_SIZE=4096 +ARG MAX_OLD_SPACE_SIZE=8192 ARG NEXT_PUBLIC_WEBAPP_URL +ARG NEXT_PUBLIC_SENTRY_DSN ENV NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL \ NEXT_PUBLIC_LICENSE_CONSENT=$NEXT_PUBLIC_LICENSE_CONSENT \ @@ -29,7 +30,8 @@ ENV NEXT_PUBLIC_WEBAPP_URL=$NEXT_PUBLIC_WEBAPP_URL \ NEXTAUTH_SECRET=${NEXTAUTH_SECRET} \ NEXT_PUBLIC_API_V2_URL=${NEXT_PUBLIC_API_V2_URL} \ CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY} \ - NODE_OPTIONS=--max-old-space-size=${MAX_OLD_SPACE_SIZE} + NODE_OPTIONS=--max-old-space-size=${MAX_OLD_SPACE_SIZE} \ + NEXT_PUBLIC_SENTRY_DSN=${NEXT_PUBLIC_SENTRY_DSN} RUN apk add --no-cache libc6-compat RUN apk update