From 81b8cf8133f413a69d929d89f33ae987b19fea69 Mon Sep 17 00:00:00 2001 From: "Zachariah K. Sharma" Date: Sun, 14 Jun 2026 13:05:38 -0600 Subject: [PATCH] chore: add scheduler deployment hook Add apps/scheduler/Dockerfile, an optional profile-gated `scheduler` service in docker-compose, and SCHEDULER_IMAGE/PORT/DEMO_MODE examples in portainer.env.example. The service stays off by default (scheduler profile) and SCHEDULER_DEMO_MODE defaults to 0 so the Authentik login is never bypassed in production. --- apps/scheduler/Dockerfile | 31 +++++++++++++++++++++++++++++++ docker-compose.yml | 25 +++++++++++++++++++++++++ portainer.env.example | 7 +++++++ 3 files changed, 63 insertions(+) create mode 100644 apps/scheduler/Dockerfile diff --git a/apps/scheduler/Dockerfile b/apps/scheduler/Dockerfile new file mode 100644 index 0000000000..00ca536eed --- /dev/null +++ b/apps/scheduler/Dockerfile @@ -0,0 +1,31 @@ +# Builds the slim @vynte/scheduler app against the shared Cal workspace packages. +FROM node:20 AS builder + +WORKDIR /calcom + +# next build evaluates @calcom/features imports, so provide the same build-time +# secrets the root image uses. Real values are injected at runtime by compose. +ARG NEXTAUTH_SECRET=secret +ARG CALENDSO_ENCRYPTION_KEY=secret +ARG DATABASE_URL=postgresql://calcom:calcom@postgres:5432/calcom +ARG MAX_OLD_SPACE_SIZE=4096 + +ENV NODE_ENV=production \ + NEXTAUTH_SECRET=${NEXTAUTH_SECRET} \ + CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY} \ + DATABASE_URL=${DATABASE_URL} \ + DATABASE_DIRECT_URL=${DATABASE_URL} \ + NODE_OPTIONS=--max-old-space-size=${MAX_OLD_SPACE_SIZE} + +COPY package.json yarn.lock .yarnrc.yml turbo.json i18n.json ./ +COPY .yarn ./.yarn +COPY apps/scheduler ./apps/scheduler +COPY packages ./packages + +RUN yarn config set httpTimeout 1200000 +RUN yarn install +RUN yarn workspace @vynte/scheduler build + +EXPOSE 3040 + +CMD ["yarn", "workspace", "@vynte/scheduler", "start"] diff --git a/docker-compose.yml b/docker-compose.yml index 7ddc146b51..9cf0b4c63a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -131,3 +131,28 @@ services: interval: 30s timeout: 10s retries: 10 + + # Optional slim scheduler UI. Gated behind the "scheduler" profile so it only + # starts with `docker compose --profile scheduler up`. + scheduler: + profiles: ["scheduler"] + image: ${SCHEDULER_IMAGE:-10.0.3.6:4000/zachariahsharma/vynte-scheduler:latest} + build: + context: . + dockerfile: apps/scheduler/Dockerfile + restart: unless-stopped + depends_on: + postgres: + condition: service_healthy + ports: + - "${SCHEDULER_PORT:-3040}:3040" + environment: + NODE_ENV: production + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} + NEXTAUTH_URL: ${NEXTAUTH_URL} + DATABASE_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-calcom} + DATABASE_DIRECT_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-calcom} + CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY} + SCHEDULER_DEMO_MODE: ${SCHEDULER_DEMO_MODE:-0} + networks: + - cal-diy diff --git a/portainer.env.example b/portainer.env.example index 1ccc417f73..1ef8d4dcea 100644 --- a/portainer.env.example +++ b/portainer.env.example @@ -21,6 +21,13 @@ CALCOM_IMAGE=10.0.3.6:4000/zachariahsharma/cal-diy-oidc:latest CALCOM_API_V2_IMAGE=10.0.3.6:4000/zachariahsharma/cal-diy-oidc-api-v2:latest CALCOM_PORT=3030 CAL_API_V2_PORT=3031 + +# Optional scheduler service (enable with the "scheduler" compose profile). +# Keep SCHEDULER_DEMO_MODE=0 in production: demo mode bypasses Authentik login. +SCHEDULER_IMAGE=10.0.3.6:4000/zachariahsharma/vynte-scheduler:latest +SCHEDULER_PORT=3040 +SCHEDULER_DEMO_MODE=0 + POSTGRES_USER=calcom POSTGRES_DB=calcom CALCOM_TELEMETRY_DISABLED=1