effective: | builders: builder: fromImage: path: node digest: sha256:0afb7822fac7bf9d7c1bf3b6e6c496dee6b2b64d8dfa365501a3c68e8eba94b2 label: org.opencontainers.image.base.digest: sha256:0afb7822fac7bf9d7c1bf3b6e6c496dee6b2b64d8dfa365501a3c68e8eba94b2 org.opencontainers.image.base.name: docker.io/node:24-slim workdir: /app env: PROJECT_ID_VERCEL: test CRON_SECRET: test DATABASE_URL: http://libsql:8080 DATABASE_AUTH_TOKEN: test UPSTASH_REDIS_REST_TOKEN: test UPSTASH_REDIS_REST_URL: test AUTH_SECRET: build-time-placeholder-min-32-chars-long OPENPANEL_CLIENT_SECRET: test VERCEL_AUTH_BEARER_TOKEN: test TEAM_ID_VERCEL: test TINY_BIRD_API_KEY: test UNKEY_TOKEN: test NEXT_PUBLIC_URL: http://localhost:3002 STRIPE_SECRET_KEY: test UNKEY_API_ID: test NEXT_PUBLIC_OPENPANEL_CLIENT_ID: test PATH: $PNPM_HOME:$PATH NODE_ENV: production SELF_HOST: 'true' PNPM_HOME: /pnpm RESEND_API_KEY: test copy: - paths: - . target: /app/ run: - corepack enable - pnpm install --frozen-lockfile - pnpm turbo run build --filter=@openstatus/dashboard fromImage: path: node digest: sha256:0afb7822fac7bf9d7c1bf3b6e6c496dee6b2b64d8dfa365501a3c68e8eba94b2 label: org.opencontainers.image.base.digest: sha256:0afb7822fac7bf9d7c1bf3b6e6c496dee6b2b64d8dfa365501a3c68e8eba94b2 org.opencontainers.image.base.name: docker.io/node:24-slim io.dofigen.version: 2.5.1 user: user: '1000' group: '1000' workdir: /app/apps/dashboard copy: - fromBuilder: builder paths: - /app/apps/dashboard/.next/standalone/apps/dashboard/ target: ./ chmod: '555' - fromBuilder: builder paths: - /app/node_modules/ target: /app/node_modules/ - fromBuilder: builder paths: - /app/apps/dashboard/.next/static/ target: ./.next/static/ - fromBuilder: builder paths: - /app/apps/dashboard/public/ target: ./public/ root: run: - apt-get update - apt-get install -y --no-install-recommends curl - rm -rf /var/lib/apt/lists/* cmd: - node - server.js expose: - port: 3000 healthcheck: cmd: curl -f http://localhost:3000/ || exit 1 interval: 30s timeout: 10s start: 45s retries: 3 images: docker.io: library: node: 24-slim: digest: sha256:0afb7822fac7bf9d7c1bf3b6e6c496dee6b2b64d8dfa365501a3c68e8eba94b2 resources: dofigen.yml: hash: 9f3113ec1095f913b3cc8e6202c7f1cc93087b2418ad8da90aa7ea0ccbd35579 content: | builders: # Stage 1: Next.js build with Node.js builder: fromImage: node:24-slim workdir: /app copy: - . /app/ env: NODE_ENV: production PNPM_HOME: /pnpm PATH: $PNPM_HOME:$PATH # Build-time environment variables (placeholder values, overwritten by .env.docker at runtime) DATABASE_URL: http://libsql:8080 DATABASE_AUTH_TOKEN: test NEXT_PUBLIC_OPENPANEL_CLIENT_ID: test NEXT_PUBLIC_URL: http://localhost:3002 TEAM_ID_VERCEL: test PROJECT_ID_VERCEL: test VERCEL_AUTH_BEARER_TOKEN: test OPENPANEL_CLIENT_SECRET: test RESEND_API_KEY: test UPSTASH_REDIS_REST_URL: test UPSTASH_REDIS_REST_TOKEN: test UNKEY_TOKEN: test UNKEY_API_ID: test TINY_BIRD_API_KEY: test CRON_SECRET: test STRIPE_SECRET_KEY: test AUTH_SECRET: build-time-placeholder-min-32-chars-long SELF_HOST: "true" run: - corepack enable - pnpm install --frozen-lockfile - pnpm turbo run build --filter=@openstatus/dashboard # Runtime stage fromImage: node:24-slim workdir: /app/apps/dashboard # Copy artifacts from builder copy: # Copy Next.js standalone output - fromBuilder: builder source: /app/apps/dashboard/.next/standalone/apps/dashboard/ target: ./ chmod: "555" # Copy root node_modules (required for pnpm symlinks) - fromBuilder: builder source: /app/node_modules/ target: /app/node_modules/ # Copy static assets - fromBuilder: builder source: /app/apps/dashboard/.next/static/ target: ./.next/static/ # Copy public directory - fromBuilder: builder source: /app/apps/dashboard/public/ target: ./public/ # Install curl for health checks root: run: - apt-get update - apt-get install -y --no-install-recommends curl - rm -rf /var/lib/apt/lists/* # Security: run as non-root user user: "1000:1000" # Expose port expose: "3000" # Health check healthcheck: interval: 30s timeout: 10s start: 45s retries: 3 cmd: curl -f http://localhost:3000/ || exit 1 # Start application cmd: - node - server.js