effective: | ignore: - node_modules - /apps/docs - /apps/screenshot-service - /apps/web - /apps/dashboard - /apps/status-page - /apps/workflows - /packages/api - /packages/integrations/vercel builders: install: fromImage: path: node digest: sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 label: org.opencontainers.image.stage: install org.opencontainers.image.base.name: docker.io/node:24-slim org.opencontainers.image.base.digest: sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 workdir: /app/ run: - corepack enable pnpm - pnpm install --prod --frozen-lockfile --filter=@openstatus/server... --loglevel debug cache: - target: /root/.local/share/pnpm/store bind: - target: pnpm-workspace.yaml source: pnpm-workspace.yaml - target: pnpm-lock.yaml source: pnpm-lock.yaml - target: package.json source: package.json - target: apps/server/package.json source: apps/server/package.json - target: packages/analytics/package.json source: packages/analytics/package.json - target: packages/db/package.json source: packages/db/package.json - target: packages/proto/package.json source: packages/proto/package.json - target: packages/emails/package.json source: packages/emails/package.json - target: packages/notifications/base/package.json source: packages/notifications/base/package.json - target: packages/notifications/discord/package.json source: packages/notifications/discord/package.json - target: packages/notifications/email/package.json source: packages/notifications/email/package.json - target: packages/notifications/grafana-oncall/package.json source: packages/notifications/grafana-oncall/package.json - target: packages/notifications/google-chat/package.json source: packages/notifications/google-chat/package.json - target: packages/notifications/ms-teams/package.json source: packages/notifications/ms-teams/package.json - target: packages/notifications/ntfy/package.json source: packages/notifications/ntfy/package.json - target: packages/notifications/opsgenie/package.json source: packages/notifications/opsgenie/package.json - target: packages/notifications/pagerduty/package.json source: packages/notifications/pagerduty/package.json - target: packages/notifications/slack/package.json source: packages/notifications/slack/package.json - target: packages/notifications/telegram/package.json source: packages/notifications/telegram/package.json - target: packages/notifications/bird-whatsapp/package.json source: packages/notifications/bird-whatsapp/package.json - target: packages/notifications/twillio-sms/package.json source: packages/notifications/twillio-sms/package.json - target: packages/notifications/webhook/package.json source: packages/notifications/webhook/package.json - target: packages/error/package.json source: packages/error/package.json - target: packages/regions/package.json source: packages/regions/package.json - target: packages/tinybird/package.json source: packages/tinybird/package.json - target: packages/tracker/package.json source: packages/tracker/package.json - target: packages/upstash/package.json source: packages/upstash/package.json - target: packages/utils/package.json source: packages/utils/package.json - target: packages/tsconfig/package.json source: packages/tsconfig/package.json - target: packages/subscriptions/package.json source: packages/subscriptions/package.json - target: packages/assertions/package.json source: packages/assertions/package.json - target: packages/theme-store/package.json source: packages/theme-store/package.json - target: packages/locales/package.json source: packages/locales/package.json - target: packages/services/package.json source: packages/services/package.json - target: packages/importers/package.json source: packages/importers/package.json build: fromImage: path: denoland/deno digest: sha256:fa335acdf6b72106eda2cb6a8cb5f4187e7630e357467489db4b2e7352d5e432 label: org.opencontainers.image.base.name: docker.io/denoland/deno:2.9.7 org.opencontainers.image.stage: build org.opencontainers.image.base.digest: sha256:fa335acdf6b72106eda2cb6a8cb5f4187e7630e357467489db4b2e7352d5e432 workdir: /app/apps/server env: NODE_ENV: production copy: - paths: - . target: /app/ - fromBuilder: install paths: - /app/node_modules target: /app/node_modules - fromBuilder: install paths: - /app/apps/server/node_modules target: /app/apps/server/node_modules - fromBuilder: install paths: - /app/packages target: /app/packages run: - deno bundle --platform=deno --sloppy-imports --node-modules-dir=manual --output src/_serve.bundle.mjs src/serve.ts - deno compile --no-check -A --node-modules-dir=none --include static/openapi.yaml --include static/openapi.json --include static/openapi-v1.json --output app src/_serve.bundle.mjs fromImage: host: registry.access.redhat.com port: 443 path: hi/curl digest: sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 label: org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus org.opencontainers.image.authors: OpenStatus Team org.opencontainers.image.title: OpenStatus Server org.opencontainers.image.vendor: OpenStatus org.opencontainers.image.base.digest: sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 io.dofigen.version: 2.8.0 org.opencontainers.image.description: REST API server with Hono framework for OpenStatus user: user: '1000' group: '1000' copy: - fromBuilder: build paths: - /app/apps/server/app target: /bin/ chmod: '555' entrypoint: - /bin/app expose: - port: 3000 healthcheck: cmd: '["curl", "-f", "http://localhost:3000/ping"]' interval: 30s timeout: 10s start: 30s retries: 3 images: docker.io: denoland: deno: 2.9.7: digest: sha256:fa335acdf6b72106eda2cb6a8cb5f4187e7630e357467489db4b2e7352d5e432 library: node: 24-slim: digest: sha256:0e0ff40c39bc087845bfb27465a0df4ea419520094bc35842ff83dd8cbe6f9b6 resources: dofigen.yml: hash: fcdbbd75320dc75f953ef46785f13b2074d77e280ff609f767ae87727918b785 content: | # Files to exclude from Docker context ignore: - node_modules - /apps/docs - /apps/screenshot-service - /apps/web - /apps/dashboard - /apps/status-page - /apps/workflows - /packages/api - /packages/integrations/vercel builders: # Stage 1: Install production dependencies install: fromImage: node:24-slim workdir: /app/ labels: org.opencontainers.image.stage: install bind: - pnpm-workspace.yaml - pnpm-lock.yaml - package.json - apps/server/package.json - packages/analytics/package.json - packages/db/package.json - packages/proto/package.json - packages/emails/package.json - packages/notifications/base/package.json - packages/notifications/discord/package.json - packages/notifications/email/package.json - packages/notifications/grafana-oncall/package.json - packages/notifications/google-chat/package.json - packages/notifications/ms-teams/package.json - packages/notifications/ntfy/package.json - packages/notifications/opsgenie/package.json - packages/notifications/pagerduty/package.json - packages/notifications/slack/package.json - packages/notifications/telegram/package.json - packages/notifications/bird-whatsapp/package.json - packages/notifications/twillio-sms/package.json - packages/notifications/webhook/package.json - packages/error/package.json - packages/regions/package.json - packages/tinybird/package.json - packages/tracker/package.json - packages/upstash/package.json - packages/utils/package.json - packages/tsconfig/package.json - packages/subscriptions/package.json - packages/assertions/package.json - packages/theme-store/package.json - packages/locales/package.json - packages/services/package.json - packages/importers/package.json run: - corepack enable pnpm - pnpm install --prod --frozen-lockfile --filter=@openstatus/server... --loglevel debug cache: - /root/.local/share/pnpm/store # Stage 2: Build application (compile to binary with Deno) build: fromImage: denoland/deno:2.9.7 workdir: /app/apps/server labels: org.opencontainers.image.stage: build env: NODE_ENV: production copy: - . /app/ - fromBuilder: install source: /app/node_modules target: /app/node_modules - fromBuilder: install source: /app/apps/server/node_modules target: /app/apps/server/node_modules - fromBuilder: install source: /app/packages target: /app/packages # 1) bundle to a self-contained mjs; manual node_modules resolves pnpm catalog: + workspace deps, sloppy-imports the extensionless relative imports. # no --minify: it makes deno 2.9 drop its createRequire shim, so CJS deps requiring node: builtins throw "Dynamic require of ... is not supported". # 2) compile the bundle with node-modules-dir=none so node_modules is NOT embedded — keeps the binary ~110MB instead of ~390MB. run: - deno bundle --platform=deno --sloppy-imports --node-modules-dir=manual --output src/_serve.bundle.mjs src/serve.ts - deno compile --no-check -A --node-modules-dir=none --include static/openapi.yaml --include static/openapi.json --include static/openapi-v1.json --output app src/_serve.bundle.mjs # Runtime stage: distroless glibc base that already ships curl (for the healthcheck). # Pinned to the multi-arch index digest of hi/curl:latest — dofigen mis-resolves this registry's tag to an unpullable digest. fromImage: registry.access.redhat.com/hi/curl@sha256:848b81ab5d5e55371d7193fd4f1ea7b605d14dbb039344ffad34a4c1f0d880f4 # Metadata labels labels: org.opencontainers.image.title: OpenStatus Server org.opencontainers.image.description: REST API server with Hono framework for OpenStatus org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus org.opencontainers.image.vendor: OpenStatus org.opencontainers.image.authors: OpenStatus Team # Copy compiled binary copy: - fromBuilder: build source: /app/apps/server/app target: /bin/ chmod: "555" # Security: run as non-root user user: "1000:1000" # Expose port expose: "3000" # Health check — exec form (JSON array) because the base has no shell for CMD-SHELL healthcheck: interval: 30s timeout: 10s start: 30s retries: 3 cmd: '["curl", "-f", "http://localhost:3000/ping"]' # Start application entrypoint: /bin/app