services: db: image: postgres:16-alpine container_name: planer-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-planer} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD fehlt in .env} POSTGRES_DB: ${POSTGRES_DB:-planer} TZ: ${TZ:-Europe/Berlin} volumes: - db-daten:/var/lib/postgresql/data ports: - '${POSTGRES_PORT:-5432}:5432' healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-planer} -d ${POSTGRES_DB:-planer}'] interval: 10s timeout: 5s retries: 10 start_period: 20s app: build: context: . dockerfile: Dockerfile container_name: planer-app restart: unless-stopped depends_on: db: condition: service_healthy environment: NODE_ENV: production TZ: ${TZ:-Europe/Berlin} INSTANZ: ${INSTANZ:?INSTANZ fehlt in .env} APP_URL: ${APP_URL:?APP_URL fehlt in .env} DATABASE_URL: postgresql://${POSTGRES_USER:-planer}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-planer}?schema=public AUTH_SECRET: ${AUTH_SECRET:?AUTH_SECRET fehlt in .env} AUTH_TRUST_HOST: ${AUTH_TRUST_HOST:-true} ANMELDUNG_PASSWORT: ${ANMELDUNG_PASSWORT:-false} OIDC_NAME: ${OIDC_NAME:-} OIDC_ISSUER: ${OIDC_ISSUER:-} OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-} OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-} WEBAUTHN_RP_ID: ${WEBAUTHN_RP_ID:?WEBAUTHN_RP_ID fehlt in .env} WEBAUTHN_RP_NAME: ${WEBAUTHN_RP_NAME:-Planer} WEBAUTHN_ORIGIN: ${WEBAUTHN_ORIGIN:?WEBAUTHN_ORIGIN fehlt in .env} DEMO_MODUS: 'false' ports: - '${APP_PORT:-3000}:3000' healthcheck: test: [ 'CMD', 'node', '-e', "fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", ] interval: 30s timeout: 5s retries: 5 start_period: 40s volumes: db-daten: