# 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 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_SECRET: ${JWT_SECRET} JWT_PUBLIC_KEY: ${JWT_PUBLIC_KEY} JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY} # 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} # 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,http://localhost:3000,http://localhost:5173,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 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 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 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" # ============================================ # Networks # ============================================ networks: manacore-network: driver: bridge name: manacore-staging # ============================================ # Volumes # ============================================ volumes: postgres_data: name: manacore-postgres-staging redis_data: name: manacore-redis-staging