services: # Single-container default (HEALTHLOG_PROCESS_TYPE=all). Existing # self-host deployments stay working with `docker compose up`. # For horizontal scaling switch to the web/worker split below # (HEALTHLOG_PROCESS_TYPE=web on this service + uncomment app-worker). app: # Pinned to GHCR :1.3.3 multi-arch image (gestern released, audit-tested). # Production on apps-01 has been 503-ing since today's deploys; rolling back # to the last release that's verifiably running on self-host installs to # rule out runtime / Docker-network issues. No `build:` block on purpose: # we want Coolify to PULL the prebuilt image, not build from source. image: ghcr.io/mbombeck/healthlog:1.3.3 container_name: healthlog-app ports: - "3000:3000" environment: DATABASE_URL: "postgresql://healthlog:${POSTGRES_PASSWORD}@db:5432/healthlog?schema=public" NODE_ENV: production SESSION_SECRET: "${SESSION_SECRET}" ENCRYPTION_KEY: "${ENCRYPTION_KEY}" ENCRYPTION_KEYS: "${ENCRYPTION_KEYS:-}" ENCRYPTION_ACTIVE_KEY_ID: "${ENCRYPTION_ACTIVE_KEY_ID:-}" API_TOKEN_HMAC_KEY: "${API_TOKEN_HMAC_KEY}" NEXT_PUBLIC_APP_URL: "${NEXT_PUBLIC_APP_URL:-http://localhost:3000}" APP_URL: "${APP_URL:-http://localhost:3000}" # all = bundle web + worker in this container (default, single-host) # web = serve HTTP only; pair with a separate app-worker service HEALTHLOG_PROCESS_TYPE: "${HEALTHLOG_PROCESS_TYPE:-all}" BACKUP_ENCRYPTION_KEY: "${BACKUP_ENCRYPTION_KEY:-}" BACKUP_S3_ENDPOINT: "${BACKUP_S3_ENDPOINT:-}" BACKUP_S3_BUCKET: "${BACKUP_S3_BUCKET:-}" BACKUP_S3_ACCESS_KEY: "${BACKUP_S3_ACCESS_KEY:-}" BACKUP_S3_SECRET_KEY: "${BACKUP_S3_SECRET_KEY:-}" BACKUP_S3_REGION: "${BACKUP_S3_REGION:-auto}" BACKUP_RETENTION_DAYS: "${BACKUP_RETENTION_DAYS:-30}" depends_on: db: condition: service_healthy restart: unless-stopped healthcheck: test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/version || exit 1", ] interval: 30s timeout: 5s retries: 3 start_period: 30s # Optional dedicated worker container — uncomment + set # HEALTHLOG_PROCESS_TYPE=web on `app` to split the deployment. # See docs/self-hosting/scaling.md for the full guide. # # app-worker: # image: ghcr.io/mbombeck/healthlog:latest # build: # context: . # dockerfile: Dockerfile # container_name: healthlog-worker # environment: # DATABASE_URL: "postgresql://healthlog:${POSTGRES_PASSWORD}@db:5432/healthlog?schema=public" # NODE_ENV: production # SESSION_SECRET: "${SESSION_SECRET}" # ENCRYPTION_KEY: "${ENCRYPTION_KEY}" # ENCRYPTION_KEYS: "${ENCRYPTION_KEYS:-}" # ENCRYPTION_ACTIVE_KEY_ID: "${ENCRYPTION_ACTIVE_KEY_ID:-}" # API_TOKEN_HMAC_KEY: "${API_TOKEN_HMAC_KEY}" # APP_URL: "${APP_URL:-http://localhost:3000}" # HEALTHLOG_PROCESS_TYPE: "worker" # BACKUP_ENCRYPTION_KEY: "${BACKUP_ENCRYPTION_KEY:-}" # BACKUP_S3_ENDPOINT: "${BACKUP_S3_ENDPOINT:-}" # BACKUP_S3_BUCKET: "${BACKUP_S3_BUCKET:-}" # BACKUP_S3_ACCESS_KEY: "${BACKUP_S3_ACCESS_KEY:-}" # BACKUP_S3_SECRET_KEY: "${BACKUP_S3_SECRET_KEY:-}" # BACKUP_S3_REGION: "${BACKUP_S3_REGION:-auto}" # depends_on: # db: # condition: service_healthy # restart: unless-stopped db: image: postgres:16-alpine container_name: healthlog-db environment: POSTGRES_USER: healthlog POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" POSTGRES_DB: healthlog volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U healthlog"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped volumes: pgdata: