diff --git a/.github/workflows/ci-test-docker-compose.yaml b/.github/workflows/ci-test-docker-compose.yaml index 162aa159b9..e996c12d8d 100644 --- a/.github/workflows/ci-test-docker-compose.yaml +++ b/.github/workflows/ci-test-docker-compose.yaml @@ -1,4 +1,4 @@ -name: CI Docker Compose +name: CI Docker permissions: contents: read @@ -19,7 +19,7 @@ jobs: files: | packages/twenty-docker/** docker-compose.yml - test: + test-compose: needs: changed-files-check if: needs.changed-files-check.outputs.any_changed == 'true' timeout-minutes: 30 @@ -30,10 +30,10 @@ jobs: - name: Run compose run: | echo "Patching docker-compose.yml..." - # change image to localbuild using yq yq eval 'del(.services.server.image)' -i docker-compose.yml yq eval '.services.server.build.context = "../../"' -i docker-compose.yml yq eval '.services.server.build.dockerfile = "./packages/twenty-docker/twenty/Dockerfile"' -i docker-compose.yml + yq eval '.services.server.build.target = "twenty"' -i docker-compose.yml yq eval '.services.server.restart = "no"' -i docker-compose.yml echo "Setting up .env file..." @@ -89,11 +89,64 @@ jobs: echo "Still waiting for server... (${count}/300s)" done working-directory: ./packages/twenty-docker/ - ci-test-docker-compose-status-check: + test-app-dev: + needs: changed-files-check + if: needs.changed-files-check.outputs.any_changed == 'true' + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Create frontend placeholder + run: | + mkdir -p packages/twenty-front/build + echo 'CI placeholder' > packages/twenty-front/build/index.html + - name: Build app-dev image + run: | + docker build \ + --target twenty-app-dev \ + -f packages/twenty-docker/twenty/Dockerfile \ + -t twenty-app-dev-ci \ + . + - name: Start container + run: | + docker run -d --name twenty-app-dev \ + -p 3000:3000 \ + twenty-app-dev-ci + docker logs twenty-app-dev -f & + - name: Wait for server health + run: | + echo "Waiting for twenty-app-dev to become healthy..." + count=0 + while true; do + status=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/healthz 2>/dev/null || echo "000") + if [ "$status" = "200" ]; then + echo "Server is healthy!" + curl -s http://localhost:3000/healthz + break + fi + + container_status=$(docker inspect --format='{{.State.Status}}' twenty-app-dev 2>/dev/null || echo "unknown") + if [ "$container_status" = "exited" ]; then + echo "Container exited unexpectedly" + docker logs twenty-app-dev + exit 1 + fi + + count=$((count+1)) + if [ $count -gt 300 ]; then + echo "Server did not become healthy within 5 minutes" + docker logs twenty-app-dev + exit 1 + fi + echo "Still waiting... (${count}/300s) [HTTP ${status}]" + sleep 1 + done + ci-test-docker-status-check: if: always() && !cancelled() timeout-minutes: 5 runs-on: ubuntu-latest - needs: [changed-files-check, test] + needs: [changed-files-check, test-compose, test-app-dev] steps: - name: Fail job if any needs failed if: contains(needs.*.result, 'failure') diff --git a/.github/workflows/preview-env-keepalive.yaml b/.github/workflows/preview-env-keepalive.yaml index 93d8bdffdf..cb7beb87cd 100644 --- a/.github/workflows/preview-env-keepalive.yaml +++ b/.github/workflows/preview-env-keepalive.yaml @@ -24,10 +24,12 @@ jobs: yq eval 'del(.services.server.image)' -i packages/twenty-docker/docker-compose.yml yq eval '.services.server.build.context = "../../"' -i packages/twenty-docker/docker-compose.yml yq eval '.services.server.build.dockerfile = "./packages/twenty-docker/twenty/Dockerfile"' -i packages/twenty-docker/docker-compose.yml + yq eval '.services.server.build.target = "twenty"' -i packages/twenty-docker/docker-compose.yml yq eval 'del(.services.worker.image)' -i packages/twenty-docker/docker-compose.yml yq eval '.services.worker.build.context = "../../"' -i packages/twenty-docker/docker-compose.yml yq eval '.services.worker.build.dockerfile = "./packages/twenty-docker/twenty/Dockerfile"' -i packages/twenty-docker/docker-compose.yml + yq eval '.services.worker.build.target = "twenty"' -i packages/twenty-docker/docker-compose.yml echo "Adding SIGN_IN_PREFILLED environment variable to server service..." yq eval '.services.server.environment.SIGN_IN_PREFILLED = "${SIGN_IN_PREFILLED}"' -i packages/twenty-docker/docker-compose.yml diff --git a/packages/twenty-docker/Makefile b/packages/twenty-docker/Makefile index fbcbcf5302..d2d1203746 100644 --- a/packages/twenty-docker/Makefile +++ b/packages/twenty-docker/Makefile @@ -18,7 +18,7 @@ DOCKER_NETWORK=twenty_network # ============================================================================= prod-build: - @cd ../.. && docker build -f ./packages/twenty-docker/twenty/Dockerfile --platform $(PLATFORM) --tag twenty:$(TAG) . && cd - + @cd ../.. && docker build --target twenty -f ./packages/twenty-docker/twenty/Dockerfile --platform $(PLATFORM) --tag twenty:$(TAG) . && cd - prod-run: @docker run -d -p 3000:3000 --name twenty twenty:$(TAG) diff --git a/packages/twenty-docker/twenty-app-dev/Dockerfile b/packages/twenty-docker/twenty-app-dev/Dockerfile deleted file mode 100644 index 258f4b437d..0000000000 --- a/packages/twenty-docker/twenty-app-dev/Dockerfile +++ /dev/null @@ -1,130 +0,0 @@ -ARG APP_VERSION - -# === Stage 1: Common dependencies === -FROM node:22-alpine AS common-deps - -WORKDIR /app - -COPY ./package.json ./yarn.lock ./.yarnrc.yml ./tsconfig.base.json ./nx.json /app/ -COPY ./.yarn/releases /app/.yarn/releases -COPY ./.yarn/patches /app/.yarn/patches - -COPY ./packages/twenty-emails/package.json /app/packages/twenty-emails/ -COPY ./packages/twenty-server/package.json /app/packages/twenty-server/ -COPY ./packages/twenty-server/patches /app/packages/twenty-server/patches -COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/ -COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/ -COPY ./packages/twenty-front/package.json /app/packages/twenty-front/ -COPY ./packages/twenty-sdk/package.json /app/packages/twenty-sdk/ - -RUN yarn && yarn cache clean && npx nx reset - -# === Stage 2: Build server from source === -FROM common-deps AS twenty-server-build - -COPY ./packages/twenty-emails /app/packages/twenty-emails -COPY ./packages/twenty-shared /app/packages/twenty-shared -COPY ./packages/twenty-ui /app/packages/twenty-ui -COPY ./packages/twenty-sdk /app/packages/twenty-sdk -COPY ./packages/twenty-server /app/packages/twenty-server - -RUN npx nx run twenty-server:build -RUN yarn workspaces focus --production twenty-emails twenty-shared twenty-sdk twenty-server - -# === Stage 3: Build frontend from source === -# Requires ~10GB Docker memory. To skip, pre-build on host first: -# npx nx build twenty-front -# The COPY below will pick up packages/twenty-front/build/ if it exists. -FROM common-deps AS twenty-front-build -COPY --from=twenty-server-build /app/package.json /tmp/.build-sentinel - -COPY ./packages/twenty-front /app/packages/twenty-front -COPY ./packages/twenty-ui /app/packages/twenty-ui -COPY ./packages/twenty-shared /app/packages/twenty-shared -COPY ./packages/twenty-sdk /app/packages/twenty-sdk -RUN if [ -d /app/packages/twenty-front/build ]; then \ - echo "Using pre-built frontend from host"; \ - else \ - NODE_OPTIONS="--max-old-space-size=8192" npx nx build twenty-front; \ - fi - -# === Stage 4: s6-overlay === -FROM alpine:3.20 AS s6-fetch -ARG S6_OVERLAY_VERSION=3.2.0.2 -ARG TARGETARCH -RUN if [ "$TARGETARCH" = "arm64" ]; then echo "aarch64" > /tmp/s6arch; \ - else echo "x86_64" > /tmp/s6arch; fi -RUN S6_ARCH=$(cat /tmp/s6arch) && \ - wget -O /tmp/s6-overlay-noarch.tar.xz \ - "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz" && \ - wget -O /tmp/s6-overlay-noarch.tar.xz.sha256 \ - "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz.sha256" && \ - wget -O /tmp/s6-overlay-arch.tar.xz \ - "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz" && \ - wget -O /tmp/s6-overlay-arch.tar.xz.sha256 \ - "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz.sha256" && \ - cd /tmp && \ - NOARCH_SUM=$(awk '{print $1}' s6-overlay-noarch.tar.xz.sha256) && \ - ARCH_SUM=$(awk '{print $1}' s6-overlay-arch.tar.xz.sha256) && \ - echo "$NOARCH_SUM s6-overlay-noarch.tar.xz" | sha256sum -c - && \ - echo "$ARCH_SUM s6-overlay-arch.tar.xz" | sha256sum -c - - -# === Stage 5: Final all-in-one image === -FROM node:22-alpine - -# s6-overlay -COPY --from=s6-fetch /tmp/s6-overlay-noarch.tar.xz /tmp/ -COPY --from=s6-fetch /tmp/s6-overlay-arch.tar.xz /tmp/ -RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz \ - && tar -C / -Jxpf /tmp/s6-overlay-arch.tar.xz \ - && rm /tmp/s6-overlay-*.tar.xz - -# Infrastructure: Postgres, Redis, and utilities -RUN apk add --no-cache \ - postgresql16 postgresql16-contrib \ - redis \ - curl jq su-exec - -# tsx for database setup scripts -RUN npm install -g tsx - -# Twenty application (both server and frontend built from source) -COPY --from=twenty-server-build /app /app -COPY --from=twenty-front-build /app/packages/twenty-front/build /app/packages/twenty-server/dist/front - -# s6 service definitions -COPY packages/twenty-docker/twenty-app-dev/rootfs/ / - -# Data directories -RUN mkdir -p /data/postgres /data/redis /app/.local-storage \ - && chown -R postgres:postgres /data/postgres \ - && chown 1000:1000 /data/redis /app/.local-storage - -ARG REACT_APP_SERVER_BASE_URL -ARG APP_VERSION=0.0.0 - -# Tell s6-overlay to preserve container environment variables -ENV S6_KEEP_ENV=1 - -# Environment defaults -ENV PG_DATABASE_URL=postgres://twenty:twenty@localhost:5432/default \ - SERVER_URL=http://localhost:2020 \ - REDIS_URL=redis://localhost:6379 \ - STORAGE_TYPE=local \ - APP_SECRET=twenty-app-dev-secret-not-for-production \ - REACT_APP_SERVER_BASE_URL=$REACT_APP_SERVER_BASE_URL \ - APP_VERSION=$APP_VERSION \ - NODE_ENV=development \ - NODE_PORT=3000 \ - DISABLE_DB_MIGRATIONS=true \ - DISABLE_CRON_JOBS_REGISTRATION=true \ - IS_BILLING_ENABLED=false \ - SIGN_IN_PREFILLED=true - -EXPOSE 3000 -VOLUME ["/data/postgres", "/app/.local-storage"] - -LABEL org.opencontainers.image.source=https://github.com/twentyhq/twenty -LABEL org.opencontainers.image.description="All-in-one Twenty image for local development and SDK usage. Includes PostgreSQL, Redis, server, and worker." - -ENTRYPOINT ["/init"] diff --git a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh index 451ae42195..582ccf4959 100755 --- a/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh +++ b/packages/twenty-docker/twenty-app-dev/rootfs/etc/s6-overlay/scripts/init-db.sh @@ -32,7 +32,7 @@ has_schema=$(PGPASSWORD=twenty psql -h localhost -U twenty -d default -tAc \ if [ "$has_schema" = "f" ]; then echo "Database appears to be empty, running initial setup..." - NODE_OPTIONS="--max-old-space-size=1500" tsx ./scripts/setup-db.ts + NODE_OPTIONS="--max-old-space-size=1500" node ./dist/scripts/setup-db.js fi # Always run migrations (idempotent — skips already-applied ones) diff --git a/packages/twenty-docker/twenty/Dockerfile b/packages/twenty-docker/twenty/Dockerfile index 7c2147dd8f..c80b02e3c9 100644 --- a/packages/twenty-docker/twenty/Dockerfile +++ b/packages/twenty-docker/twenty/Dockerfile @@ -1,9 +1,11 @@ -# Base image for common dependencies +# =========================================================================== +# Shared build stages (used by both targets) +# =========================================================================== + FROM node:24-alpine AS common-deps WORKDIR /app -# Copy only the necessary files for dependency resolution COPY ./package.json ./yarn.lock ./.yarnrc.yml ./tsconfig.base.json ./nx.json /app/ COPY ./.yarn/releases /app/.yarn/releases COPY ./.yarn/patches /app/.yarn/patches @@ -16,14 +18,11 @@ COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/ COPY ./packages/twenty-front/package.json /app/packages/twenty-front/ COPY ./packages/twenty-sdk/package.json /app/packages/twenty-sdk/ -# Install all dependencies RUN yarn && yarn cache clean && npx nx reset -# Build the back FROM common-deps AS twenty-server-build -# Copy sourcecode after installing dependences to accelerate subsequents builds COPY ./packages/twenty-emails /app/packages/twenty-emails COPY ./packages/twenty-shared /app/packages/twenty-shared COPY ./packages/twenty-ui /app/packages/twenty-ui @@ -37,9 +36,20 @@ RUN npx nx run twenty-server:lingui:extract && \ RUN npx nx run twenty-server:build +# Bundle setup-db script into a standalone JS file so the final image +# doesn't need tsx or the TypeScript source tree at runtime. +RUN npx esbuild packages/twenty-server/scripts/setup-db.ts \ + --bundle --platform=node --outfile=packages/twenty-server/dist/scripts/setup-db.js \ + --external:typeorm --external:dotenv --external:pg + +# Clean server build output (type declarations and compiled tests are not needed at runtime; +# source maps are kept because twenty-infra extracts them from the image for Sentry uploads) +RUN find /app/packages/twenty-server/dist -name '*.d.ts' -delete \ + && rm -rf /app/packages/twenty-server/dist/packages/twenty-server/test + RUN yarn workspaces focus --production twenty-emails twenty-shared twenty-sdk twenty-server -# Build the front + FROM common-deps AS twenty-front-build ARG REACT_APP_SERVER_BASE_URL @@ -50,18 +60,24 @@ COPY ./packages/twenty-shared /app/packages/twenty-shared COPY ./packages/twenty-sdk /app/packages/twenty-sdk RUN npx nx run twenty-front:lingui:extract && \ npx nx run twenty-front:lingui:compile -RUN npx nx build twenty-front +# To skip the memory-intensive frontend build, pre-build on the host: +# npx nx build twenty-front +# The check below will use packages/twenty-front/build/ if it already exists. +RUN if [ -d /app/packages/twenty-front/build ]; then \ + echo "Using pre-built frontend from host"; \ + else \ + NODE_OPTIONS="--max-old-space-size=8192" npx nx build twenty-front; \ + fi -# Final stage: Run the application +# =========================================================================== +# Target: twenty (production) +# docker build --target twenty -f packages/twenty-docker/twenty/Dockerfile . +# =========================================================================== + FROM node:24-alpine AS twenty -# Used to run healthcheck in docker -RUN apk add --no-cache curl jq - -RUN npm install -g tsx - -RUN apk add --no-cache postgresql-client +RUN apk add --no-cache curl jq postgresql-client COPY ./packages/twenty-docker/twenty/entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh @@ -73,20 +89,135 @@ ENV REACT_APP_SERVER_BASE_URL=$REACT_APP_SERVER_BASE_URL ARG APP_VERSION ENV APP_VERSION=$APP_VERSION -# Copy built applications from previous stages -COPY --chown=1000 --from=twenty-server-build /app /app -COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-server /app/packages/twenty-server +# Workspace root config +COPY --chown=1000 --from=twenty-server-build /app/package.json /app/yarn.lock /app/.yarnrc.yml /app/ +COPY --chown=1000 --from=twenty-server-build /app/tsconfig.base.json /app/nx.json /app/ +COPY --chown=1000 --from=twenty-server-build /app/.yarn /app/.yarn +COPY --chown=1000 --from=twenty-server-build /app/node_modules /app/node_modules + +# Server package (compiled dist + package.json only, no src/) +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-server/package.json /app/packages/twenty-server/ +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-server/dist /app/packages/twenty-server/dist +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-server/patches /app/packages/twenty-server/patches + +# Workspace packages (dist + package.json; node_modules symlinks resolve to these) +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-shared/package.json /app/packages/twenty-shared/ +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-shared/dist /app/packages/twenty-shared/dist +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-emails/package.json /app/packages/twenty-emails/ +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-emails/dist /app/packages/twenty-emails/dist +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-sdk/package.json /app/packages/twenty-sdk/ +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-ui/package.json /app/packages/twenty-ui/ +COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-front/package.json /app/packages/twenty-front/ + +# Frontend static build COPY --chown=1000 --from=twenty-front-build /app/packages/twenty-front/build /app/packages/twenty-server/dist/front -# Set metadata and labels LABEL org.opencontainers.image.source=https://github.com/twentyhq/twenty -LABEL org.opencontainers.image.description="This image provides a consistent and reproducible environment for the backend and frontend, ensuring it deploys faster and runs the same way regardless of the deployment environment." +LABEL org.opencontainers.image.description="Production Twenty image with backend and frontend." RUN mkdir -p /app/.local-storage /app/packages/twenty-server/.local-storage && \ - chown -R 1000:1000 /app + chown 1000:1000 /app/.local-storage /app/packages/twenty-server/.local-storage -# Use non root user with uid 1000 USER 1000 CMD ["node", "dist/main"] ENTRYPOINT ["/app/entrypoint.sh"] + + +# =========================================================================== +# Target: twenty-app-dev (all-in-one with Postgres + Redis) +# docker build --target twenty-app-dev -f packages/twenty-docker/twenty/Dockerfile . +# =========================================================================== + +FROM alpine:3.20 AS s6-fetch +ARG S6_OVERLAY_VERSION=3.2.0.2 +ARG TARGETARCH +RUN if [ "$TARGETARCH" = "arm64" ]; then echo "aarch64" > /tmp/s6arch; \ + else echo "x86_64" > /tmp/s6arch; fi +RUN S6_ARCH=$(cat /tmp/s6arch) && \ + wget -O /tmp/s6-overlay-noarch.tar.xz \ + "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz" && \ + wget -O /tmp/s6-overlay-noarch.tar.xz.sha256 \ + "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz.sha256" && \ + wget -O /tmp/s6-overlay-arch.tar.xz \ + "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz" && \ + wget -O /tmp/s6-overlay-arch.tar.xz.sha256 \ + "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz.sha256" && \ + cd /tmp && \ + NOARCH_SUM=$(awk '{print $1}' s6-overlay-noarch.tar.xz.sha256) && \ + ARCH_SUM=$(awk '{print $1}' s6-overlay-arch.tar.xz.sha256) && \ + echo "$NOARCH_SUM s6-overlay-noarch.tar.xz" | sha256sum -c - && \ + echo "$ARCH_SUM s6-overlay-arch.tar.xz" | sha256sum -c - + +FROM node:24-alpine AS twenty-app-dev + +# s6-overlay +COPY --from=s6-fetch /tmp/s6-overlay-noarch.tar.xz /tmp/ +COPY --from=s6-fetch /tmp/s6-overlay-arch.tar.xz /tmp/ +RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz \ + && tar -C / -Jxpf /tmp/s6-overlay-arch.tar.xz \ + && rm /tmp/s6-overlay-*.tar.xz + +RUN apk add --no-cache \ + postgresql16 postgresql16-contrib \ + redis \ + curl jq su-exec + +# Workspace root config +COPY --from=twenty-server-build /app/package.json /app/yarn.lock /app/.yarnrc.yml /app/ +COPY --from=twenty-server-build /app/tsconfig.base.json /app/nx.json /app/ +COPY --from=twenty-server-build /app/.yarn /app/.yarn +COPY --from=twenty-server-build /app/node_modules /app/node_modules + +# Server package (compiled dist + package.json only, no src/) +COPY --from=twenty-server-build /app/packages/twenty-server/package.json /app/packages/twenty-server/ +COPY --from=twenty-server-build /app/packages/twenty-server/dist /app/packages/twenty-server/dist +COPY --from=twenty-server-build /app/packages/twenty-server/patches /app/packages/twenty-server/patches + +# Workspace packages (dist + package.json; node_modules symlinks resolve to these) +COPY --from=twenty-server-build /app/packages/twenty-shared/package.json /app/packages/twenty-shared/ +COPY --from=twenty-server-build /app/packages/twenty-shared/dist /app/packages/twenty-shared/dist +COPY --from=twenty-server-build /app/packages/twenty-emails/package.json /app/packages/twenty-emails/ +COPY --from=twenty-server-build /app/packages/twenty-emails/dist /app/packages/twenty-emails/dist +COPY --from=twenty-server-build /app/packages/twenty-sdk/package.json /app/packages/twenty-sdk/ +COPY --from=twenty-server-build /app/packages/twenty-ui/package.json /app/packages/twenty-ui/ +COPY --from=twenty-server-build /app/packages/twenty-front/package.json /app/packages/twenty-front/ + +# Frontend static build +COPY --from=twenty-front-build /app/packages/twenty-front/build /app/packages/twenty-server/dist/front + +# Source maps are not needed in the dev image (no Sentry) +RUN find /app/packages/twenty-server/dist -name '*.js.map' -delete + +# s6 service definitions +COPY packages/twenty-docker/twenty-app-dev/rootfs/ / + +RUN mkdir -p /data/postgres /data/redis /app/.local-storage \ + && chown -R postgres:postgres /data/postgres \ + && chown 1000:1000 /data/redis /app/.local-storage + +ARG REACT_APP_SERVER_BASE_URL +ARG APP_VERSION=0.0.0 + +ENV S6_KEEP_ENV=1 +ENV PG_DATABASE_URL=postgres://twenty:twenty@localhost:5432/default \ + SERVER_URL=http://localhost:2020 \ + REDIS_URL=redis://localhost:6379 \ + STORAGE_TYPE=local \ + APP_SECRET=twenty-app-dev-secret-not-for-production \ + REACT_APP_SERVER_BASE_URL=$REACT_APP_SERVER_BASE_URL \ + APP_VERSION=$APP_VERSION \ + NODE_ENV=development \ + NODE_PORT=3000 \ + DISABLE_DB_MIGRATIONS=true \ + DISABLE_CRON_JOBS_REGISTRATION=true \ + IS_BILLING_ENABLED=false \ + SIGN_IN_PREFILLED=true + +EXPOSE 3000 +VOLUME ["/data/postgres", "/app/.local-storage"] + +LABEL org.opencontainers.image.source=https://github.com/twentyhq/twenty +LABEL org.opencontainers.image.description="All-in-one Twenty image for local development and SDK usage. Includes PostgreSQL, Redis, server, and worker." + +ENTRYPOINT ["/init"] diff --git a/packages/twenty-docker/twenty/entrypoint.sh b/packages/twenty-docker/twenty/entrypoint.sh index 9b4aaf4d65..dfaad41a0c 100755 --- a/packages/twenty-docker/twenty/entrypoint.sh +++ b/packages/twenty-docker/twenty/entrypoint.sh @@ -13,7 +13,7 @@ setup_and_migrate_db() { has_schema=$(psql -tAc "SELECT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'core')" ${PG_DATABASE_URL}) if [ "$has_schema" = "f" ]; then echo "Database appears to be empty, running migrations." - NODE_OPTIONS="--max-old-space-size=1500" tsx ./scripts/setup-db.ts + NODE_OPTIONS="--max-old-space-size=1500" node ./dist/scripts/setup-db.js yarn database:migrate:prod fi diff --git a/packages/twenty-front/vite.config.ts b/packages/twenty-front/vite.config.ts index 1018faba39..6bbcadc017 100644 --- a/packages/twenty-front/vite.config.ts +++ b/packages/twenty-front/vite.config.ts @@ -143,7 +143,7 @@ export default defineConfig(({ mode }) => { build: { minify: 'esbuild', outDir: 'build', - sourcemap: VITE_BUILD_SOURCEMAP === 'true', + sourcemap: VITE_BUILD_SOURCEMAP === 'true' ? 'hidden' : false, chunkSizeWarningLimit: CHUNK_SIZE_WARNING_LIMIT, rollupOptions: { // Don't use manual chunks as it causes many issue