diff --git a/apps/scheduler/app/api/auth/[...nextauth]/route.ts b/apps/scheduler/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000000..74d6ff9208 --- /dev/null +++ b/apps/scheduler/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,14 @@ +import { getOptions } from "@calcom/features/auth/lib/next-auth-options"; +import type { TrackingData } from "@calcom/lib/tracking"; +import NextAuth from "next-auth"; + +export const dynamic = "force-dynamic"; + +const handler = NextAuth( + getOptions({ + getDubId: () => undefined, + getTrackingData: (): TrackingData => ({}), + }) +); + +export { handler as GET, handler as POST }; diff --git a/docker-compose.yml b/docker-compose.yml index 9cf0b4c63a..872f103b46 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,6 @@ name: cal-diy-oidc volumes: postgres-data: - redis-data: networks: cal-diy: @@ -14,7 +13,7 @@ services: environment: POSTGRES_USER: ${POSTGRES_USER:-calcom} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB:-calcom} + POSTGRES_DB: ${POSTGRES_DB:-vynte_scheduler} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: @@ -25,118 +24,7 @@ services: networks: - cal-diy - redis: - image: redis:7-alpine - restart: unless-stopped - command: ["redis-server", "--appendonly", "yes"] - volumes: - - redis-data:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 10 - networks: - - cal-diy - - calcom: - image: ${CALCOM_IMAGE:-10.0.3.6:4000/zachariahsharma/cal-diy-oidc:latest} - restart: unless-stopped - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - ports: - - "${CALCOM_PORT:-3030}:3000" - environment: - NODE_ENV: production - NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL} - NEXT_PUBLIC_WEBSITE_URL: ${NEXT_PUBLIC_WEBSITE_URL:-${NEXT_PUBLIC_WEBAPP_URL}} - NEXT_PUBLIC_EMBED_LIB_URL: ${NEXT_PUBLIC_WEBAPP_URL}/embed/embed.js - NEXTAUTH_URL: ${NEXTAUTH_URL} - NEXTAUTH_URL_INTERNAL: ${NEXTAUTH_URL_INTERNAL:-http://calcom:3000/api/auth} - NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} - NEXTAUTH_COOKIE_DOMAIN: ${NEXTAUTH_COOKIE_DOMAIN:-} - CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY} - DATABASE_HOST: postgres:5432 - 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} - REDIS_URL: redis://redis:6379 - AUTHENTIK_ISSUER: ${AUTHENTIK_ISSUER} - AUTHENTIK_CLIENT_ID: ${AUTHENTIK_CLIENT_ID} - AUTHENTIK_CLIENT_SECRET: ${AUTHENTIK_CLIENT_SECRET} - ALLOWED_HOSTNAMES: '"${ALLOWED_HOSTNAMES}"' - RESERVED_SUBDOMAINS: ${RESERVED_SUBDOMAINS:-"app","auth","docs","design","console","go","status","api","saml","www","matrix","developer","cal","my","team","support","security","blog","learn","admin"} - CALCOM_TELEMETRY_DISABLED: ${CALCOM_TELEMETRY_DISABLED:-1} - CRON_API_KEY: ${CRON_API_KEY} - CRON_ENABLE_APP_SYNC: ${CRON_ENABLE_APP_SYNC:-false} - EMAIL_FROM: ${EMAIL_FROM:-notifications@example.com} - EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-Cal.diy} - EMAIL_SERVER_HOST: ${EMAIL_SERVER_HOST:-} - EMAIL_SERVER_PORT: ${EMAIL_SERVER_PORT:-587} - EMAIL_SERVER_USER: ${EMAIL_SERVER_USER:-} - EMAIL_SERVER_PASSWORD: ${EMAIL_SERVER_PASSWORD:-} - EMAIL_SERVER_SECURE: ${EMAIL_SERVER_SECURE:-false} - NODE_TLS_REJECT_UNAUTHORIZED: ${NODE_TLS_REJECT_UNAUTHORIZED:-} - NEXT_PUBLIC_DISABLE_SIGNUP: "true" - networks: - - cal-diy - healthcheck: - test: ["CMD-SHELL", "wget --spider -q http://$$(hostname):3000"] - interval: 30s - timeout: 10s - retries: 10 - - cal-api-v2: - image: ${CALCOM_API_V2_IMAGE:-10.0.3.6:4000/zachariahsharma/cal-diy-oidc-api-v2:latest} - build: - context: . - dockerfile: apps/api/v2/Dockerfile - args: - 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} - restart: unless-stopped - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - ports: - - "${CAL_API_V2_PORT:-3031}:5555" - environment: - NODE_ENV: production - API_PORT: 5555 - API_URL: ${API_URL:-http://cal-api-v2:5555} - WEB_APP_URL: ${NEXT_PUBLIC_WEBAPP_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} - DATABASE_READ_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-calcom} - DATABASE_WRITE_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-calcom} - REDIS_URL: redis://redis:6379 - NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} - JWT_SECRET: ${JWT_SECRET} - CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY} - CALCOM_SERVICE_ACCOUNT_ENCRYPTION_KEY: ${CALCOM_SERVICE_ACCOUNT_ENCRYPTION_KEY} - API_KEY_PREFIX: ${API_KEY_PREFIX:-cal_} - REWRITE_API_V2_PREFIX: "1" - STRIPE_API_KEY: ${STRIPE_API_KEY:-sk_test_placeholder} - STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET:-whsec_placeholder} - NEXT_PUBLIC_SENTRY_DSN: "" - CALCOM_TELEMETRY_DISABLED: ${CALCOM_TELEMETRY_DISABLED:-1} - networks: - - cal-diy - healthcheck: - test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:5555/v2/me').then(r=>process.exit(r.ok||r.status===401?0:1)).catch(()=>process.exit(1))\""] - 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 @@ -145,14 +33,23 @@ services: postgres: condition: service_healthy ports: - - "${SCHEDULER_PORT:-3040}:3040" + - "${SCHEDULER_PORT:-3030}: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} + NEXTAUTH_URL: ${NEXTAUTH_URL:-https://cal.internal.vyntehome.com} + NEXTAUTH_COOKIE_DOMAIN: ${NEXTAUTH_COOKIE_DOMAIN:-} + AUTHENTIK_ISSUER: ${AUTHENTIK_ISSUER} + AUTHENTIK_CLIENT_ID: ${AUTHENTIK_CLIENT_ID} + AUTHENTIK_CLIENT_SECRET: ${AUTHENTIK_CLIENT_SECRET} + DATABASE_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-vynte_scheduler} + DATABASE_DIRECT_URL: postgresql://${POSTGRES_USER:-calcom}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-vynte_scheduler} CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY} SCHEDULER_DEMO_MODE: ${SCHEDULER_DEMO_MODE:-0} networks: - cal-diy + healthcheck: + test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:3040/login').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] + interval: 30s + timeout: 10s + retries: 10 diff --git a/portainer.env.example b/portainer.env.example index 1ef8d4dcea..c8f06205aa 100644 --- a/portainer.env.example +++ b/portainer.env.example @@ -1,54 +1,21 @@ # Required public URL settings -NEXT_PUBLIC_WEBAPP_URL=https://cal.example.com -NEXTAUTH_URL=https://cal.example.com/api/auth -ALLOWED_HOSTNAMES=cal.example.com +NEXTAUTH_URL=https://cal.example.com +NEXTAUTH_COOKIE_DOMAIN= +SCHEDULER_PORT=3030 # Required secrets POSTGRES_PASSWORD=replace-with-a-long-random-password NEXTAUTH_SECRET=replace-with-openssl-rand-base64-32 CALENDSO_ENCRYPTION_KEY=replace-with-openssl-rand-base64-24 -CALCOM_SERVICE_ACCOUNT_ENCRYPTION_KEY=replace-with-random-service-account-key -JWT_SECRET=replace-with-a-long-random-jwt-secret -CRON_API_KEY=replace-with-a-long-random-token # Authentik OIDC AUTHENTIK_ISSUER=https://auth.example.com/application/o/cal/ AUTHENTIK_CLIENT_ID=replace-with-authentik-client-id AUTHENTIK_CLIENT_SECRET=replace-with-authentik-client-secret -# Optional stack settings -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 - +# Database POSTGRES_USER=calcom -POSTGRES_DB=calcom -CALCOM_TELEMETRY_DISABLED=1 -CRON_ENABLE_APP_SYNC=false -ORGANIZATIONS_ENABLED=0 -NEXT_PUBLIC_SINGLE_ORG_SLUG= -NEXT_PUBLIC_API_V2_URL= -API_URL=http://cal-api-v2:5555 -API_KEY_PREFIX=cal_ -STRIPE_API_KEY=sk_test_placeholder -STRIPE_WEBHOOK_SECRET=whsec_placeholder -NEXT_PUBLIC_WEBSITE_URL= -NEXTAUTH_URL_INTERNAL=http://calcom:3000/api/auth -NEXTAUTH_COOKIE_DOMAIN= -NODE_TLS_REJECT_UNAUTHORIZED= +POSTGRES_DB=vynte_scheduler -# Optional SMTP settings. Leave blank until you wire email. -EMAIL_FROM=notifications@example.com -EMAIL_FROM_NAME=Cal.diy -EMAIL_SERVER_HOST= -EMAIL_SERVER_PORT=587 -EMAIL_SERVER_USER= -EMAIL_SERVER_PASSWORD= -EMAIL_SERVER_SECURE=false +# Keep SCHEDULER_DEMO_MODE=0 in production: demo mode bypasses Authentik login. +SCHEDULER_DEMO_MODE=0