# Simplified staging config: mana-core-auth + chat (backend + web) # Full config archived at: docker-compose.staging.full.yml # # To restore full config: # cp docker-compose.staging.full.yml docker-compose.staging.yml # # To add more services back: # 1. Copy the service block from docker-compose.staging.full.yml # 2. Add corresponding health check in .github/workflows/cd-staging.yml # 3. Add service to workflow_dispatch options in cd-staging.yml # 4. Add Caddy routes to docker/caddy/Caddyfile.staging services: # ============================================ # Infrastructure Services # ============================================ postgres: image: postgres:16-alpine container_name: manacore-postgres-staging restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-manacore} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"] interval: 10s timeout: 5s retries: 5 networks: - manacore-network redis: image: redis:7-alpine container_name: manacore-redis-staging restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD:-redis123} volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 5s retries: 5 networks: - manacore-network # ============================================ # Backend Services # ============================================ mana-core-auth: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/mana-core-auth:${AUTH_VERSION:-latest} container_name: mana-core-auth-staging restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: staging PORT: 3001 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/manacore_auth REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: ${REDIS_PASSWORD:-redis123} # JWT keys managed automatically by Better Auth (EdDSA) - stored in auth.jwks table JWT_ISSUER: ${JWT_ISSUER:-manacore} JWT_AUDIENCE: ${JWT_AUDIENCE:-manacore} # Brevo Email Service BREVO_API_KEY: ${BREVO_API_KEY} EMAIL_SENDER_ADDRESS: ${EMAIL_SENDER_ADDRESS:-noreply@manacore.ai} EMAIL_SENDER_NAME: ${EMAIL_SENDER_NAME:-ManaCore} # Base URL for auth callbacks (password reset, email verification) BASE_URL: ${BASE_URL:-https://auth.staging.manacore.ai} # Frontend URL for password reset and email verification links FRONTEND_URL: ${FRONTEND_URL:-https://staging.manacore.ai} # CORS - Allow all staging web app origins (HTTPS domains + localhost for dev) CORS_ORIGINS: https://chat.staging.manacore.ai,https://staging.manacore.ai,https://calendar.staging.manacore.ai,https://clock.staging.manacore.ai,https://todo.staging.manacore.ai,https://picture.staging.manacore.ai,http://localhost:3000,http://localhost:5173,http://localhost:5175,http://localhost:5186,http://localhost:5187,http://localhost:5188 ports: - "3001:3001" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3001/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" chat-backend: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/chat-backend:${CHAT_VERSION:-latest} container_name: chat-backend-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy postgres: condition: service_healthy environment: NODE_ENV: staging PORT: 3002 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/chat MANA_CORE_AUTH_URL: http://mana-core-auth:3001 # CORS - Allow chat web app and main web app to access backend CORS_ORIGINS: https://chat.staging.manacore.ai,https://staging.manacore.ai,http://localhost:3000,http://localhost:5173 SUPABASE_URL: ${SUPABASE_URL} SUPABASE_SERVICE_KEY: ${SUPABASE_SERVICE_ROLE_KEY} AZURE_OPENAI_ENDPOINT: ${AZURE_OPENAI_ENDPOINT} AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY} AZURE_OPENAI_API_VERSION: ${AZURE_OPENAI_API_VERSION:-2024-12-01-preview} ports: - "3002:3002" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3002/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" chat-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/chat-web:${CHAT_WEB_VERSION:-latest} container_name: chat-web-staging restart: unless-stopped depends_on: chat-backend: condition: service_healthy environment: NODE_ENV: staging PORT: 3000 # Runtime config generation (12-factor pattern) # These vars are used by docker-entrypoint.sh to generate /config.json BACKEND_URL: https://chat-api.staging.manacore.ai AUTH_URL: https://auth.staging.manacore.ai ports: - "3000:3000" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Manacore App # ============================================ manacore-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/manacore-web:${MANACORE_WEB_VERSION:-latest} container_name: manacore-web-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy environment: NODE_ENV: staging PORT: 5173 # Runtime config generation (12-factor pattern) # These vars are used by docker-entrypoint.sh to generate /config.json API_BASE_URL: https://staging.manacore.ai AUTH_URL: https://auth.staging.manacore.ai TODO_API_URL: https://todo-api.staging.manacore.ai CALENDAR_API_URL: https://calendar-api.staging.manacore.ai CLOCK_API_URL: https://clock-api.staging.manacore.ai CONTACTS_API_URL: https://contacts-api.staging.manacore.ai PICTURE_API_URL: https://picture-api.staging.manacore.ai ports: - "5173:5173" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5173/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Todo App # ============================================ todo-backend: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/todo-backend:${TODO_VERSION:-latest} container_name: todo-backend-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy postgres: condition: service_healthy environment: NODE_ENV: staging PORT: 3018 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/todo DB_HOST: postgres DB_PORT: 5432 DB_USER: ${POSTGRES_USER:-postgres} MANA_CORE_AUTH_URL: http://mana-core-auth:3001 CORS_ORIGINS: https://todo.staging.manacore.ai,https://staging.manacore.ai,http://localhost:5188,http://localhost:5173 ports: - "3018:3018" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3018/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" todo-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/todo-web:${TODO_WEB_VERSION:-latest} container_name: todo-web-staging restart: unless-stopped depends_on: todo-backend: condition: service_healthy environment: NODE_ENV: staging PORT: 5188 PUBLIC_BACKEND_URL: http://todo-backend:3018 PUBLIC_MANA_CORE_AUTH_URL: http://mana-core-auth:3001 PUBLIC_BACKEND_URL_CLIENT: https://todo-api.staging.manacore.ai PUBLIC_MANA_CORE_AUTH_URL_CLIENT: https://auth.staging.manacore.ai ports: - "5188:5188" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5188/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Calendar App # ============================================ calendar-backend: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/calendar-backend:${CALENDAR_VERSION:-latest} container_name: calendar-backend-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy postgres: condition: service_healthy environment: NODE_ENV: staging PORT: 3016 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/calendar DB_HOST: postgres DB_PORT: 5432 DB_USER: ${POSTGRES_USER:-postgres} MANA_CORE_AUTH_URL: http://mana-core-auth:3001 CORS_ORIGINS: https://calendar.staging.manacore.ai,https://staging.manacore.ai,http://localhost:5186,http://localhost:5173 ports: - "3016:3016" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3016/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" calendar-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/calendar-web:${CALENDAR_WEB_VERSION:-latest} container_name: calendar-web-staging restart: unless-stopped depends_on: calendar-backend: condition: service_healthy environment: NODE_ENV: staging PORT: 5186 # Runtime config generation (12-factor pattern) # These vars are used by docker-entrypoint.sh to generate /config.json BACKEND_URL: https://calendar-api.staging.manacore.ai AUTH_URL: https://auth.staging.manacore.ai TODO_API_URL: https://todo-api.staging.manacore.ai CONTACTS_API_URL: https://contacts-api.staging.manacore.ai ports: - "5186:5186" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5186/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Clock App # ============================================ clock-backend: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/clock-backend:${CLOCK_VERSION:-latest} container_name: clock-backend-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy postgres: condition: service_healthy environment: NODE_ENV: staging PORT: 3017 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/clock DB_HOST: postgres DB_PORT: 5432 DB_USER: ${POSTGRES_USER:-postgres} MANA_CORE_AUTH_URL: http://mana-core-auth:3001 CORS_ORIGINS: https://clock.staging.manacore.ai,https://staging.manacore.ai,http://localhost:5187,http://localhost:5173 ports: - "3017:3017" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3017/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" clock-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/clock-web:${CLOCK_WEB_VERSION:-latest} container_name: clock-web-staging restart: unless-stopped depends_on: clock-backend: condition: service_healthy environment: NODE_ENV: staging PORT: 5187 # Runtime config generation (12-factor pattern) # These vars are used by docker-entrypoint.sh to generate /config.json API_BASE_URL: https://clock-api.staging.manacore.ai AUTH_URL: https://auth.staging.manacore.ai ports: - "5187:5187" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5187/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Picture App # ============================================ picture-backend: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/picture-backend:${PICTURE_VERSION:-latest} container_name: picture-backend-staging restart: unless-stopped depends_on: mana-core-auth: condition: service_healthy postgres: condition: service_healthy environment: NODE_ENV: staging PORT: 3006 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@postgres:5432/picture DB_HOST: postgres DB_PORT: 5432 DB_USER: ${POSTGRES_USER:-postgres} MANA_CORE_AUTH_URL: http://mana-core-auth:3001 CORS_ORIGINS: https://picture.staging.manacore.ai,https://staging.manacore.ai,http://localhost:5175,http://localhost:5173 # Replicate API for AI image generation REPLICATE_API_TOKEN: ${REPLICATE_API_TOKEN} # S3/MinIO storage S3_ENDPOINT: ${S3_ENDPOINT} S3_REGION: ${S3_REGION} S3_ACCESS_KEY: ${S3_ACCESS_KEY} S3_SECRET_KEY: ${S3_SECRET_KEY} MANACORE_STORAGE_PUBLIC_URL: ${MANACORE_STORAGE_PUBLIC_URL} # Credit system MANA_CORE_SERVICE_KEY: ${MANA_CORE_SERVICE_KEY} APP_ID: picture ports: - "3006:3006" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3006/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" picture-web: image: ${DOCKER_REGISTRY:-ghcr.io/memo-2023}/picture-web:${PICTURE_WEB_VERSION:-latest} container_name: picture-web-staging restart: unless-stopped depends_on: picture-backend: condition: service_healthy environment: NODE_ENV: staging PORT: 5175 # Runtime config generation (12-factor pattern) # These vars are used by docker-entrypoint.sh to generate /config.json BACKEND_URL: https://picture-api.staging.manacore.ai AUTH_URL: https://auth.staging.manacore.ai ports: - "5175:5175" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5175/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - manacore-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================ # Networks # ============================================ networks: manacore-network: driver: bridge name: manacore-staging # ============================================ # Volumes # ============================================ volumes: postgres_data: name: manacore-postgres-staging redis_data: name: manacore-redis-staging