services: # PostgreSQL Database db: image: postgres:16-alpine container_name: casera-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_DB: ${POSTGRES_DB:-casera} volumes: - postgres_data:/var/lib/postgresql/data ports: - "${DB_PORT:-5433}:5432" # Use 5433 externally to avoid conflicts healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-casera} -d ${POSTGRES_DB:-casera}"] interval: 10s timeout: 5s retries: 5 networks: - casera-network # Redis Cache redis: image: redis:7-alpine container_name: casera-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "${REDIS_PORT:-6379}:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - casera-network # Casera API api: build: context: . target: api container_name: casera-api restart: unless-stopped ports: - "${PORT:-8000}:8000" environment: # Server PORT: "8000" DEBUG: "${DEBUG:-false}" ALLOWED_HOSTS: "${ALLOWED_HOSTS:-localhost,127.0.0.1}" TIMEZONE: "${TIMEZONE:-UTC}" # Database DB_HOST: db DB_PORT: "5432" POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_DB: ${POSTGRES_DB:-casera} DB_SSLMODE: "${DB_SSLMODE:-disable}" # Redis REDIS_URL: "redis://redis:6379/0" # Security SECRET_KEY: ${SECRET_KEY:-dev-secret-key-change-in-production-min-32-chars} # Email EMAIL_HOST: ${EMAIL_HOST:-smtp.gmail.com} EMAIL_PORT: ${EMAIL_PORT:-587} EMAIL_HOST_USER: ${EMAIL_HOST_USER} EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera } EMAIL_USE_TLS: "${EMAIL_USE_TLS:-true}" # Push Notifications (Direct APNs/FCM - no Gorush) APNS_AUTH_KEY_PATH: "/certs/apns_key.p8" APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID} APNS_TEAM_ID: ${APNS_TEAM_ID} APNS_TOPIC: ${APNS_TOPIC:-com.example.casera} APNS_USE_SANDBOX: "${APNS_USE_SANDBOX:-true}" FCM_SERVER_KEY: ${FCM_SERVER_KEY} volumes: - ./push_certs:/certs:ro - ./uploads:/app/uploads depends_on: db: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8000/api/health/"] interval: 30s timeout: 10s retries: 3 networks: - casera-network # Casera Admin Panel (Next.js) admin: build: context: . target: admin container_name: casera-admin restart: unless-stopped ports: - "${ADMIN_PORT:-3000}:3000" environment: PORT: "3000" HOSTNAME: "0.0.0.0" NEXT_PUBLIC_API_URL: "${NEXT_PUBLIC_API_URL:-http://api:8000}" depends_on: api: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/admin/"] interval: 30s timeout: 10s retries: 3 networks: - casera-network # Casera Worker (Background Jobs) worker: build: context: . target: worker container_name: casera-worker restart: unless-stopped environment: # Database DB_HOST: db DB_PORT: "5432" POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_DB: ${POSTGRES_DB:-casera} DB_SSLMODE: "${DB_SSLMODE:-disable}" # Redis REDIS_URL: "redis://redis:6379/0" # Security SECRET_KEY: ${SECRET_KEY:-dev-secret-key-change-in-production-min-32-chars} # Push Notifications (Direct APNs/FCM - no Gorush) APNS_AUTH_KEY_PATH: "/certs/apns_key.p8" APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID} APNS_TEAM_ID: ${APNS_TEAM_ID} APNS_TOPIC: ${APNS_TOPIC:-com.example.casera} APNS_USE_SANDBOX: "${APNS_USE_SANDBOX:-true}" FCM_SERVER_KEY: ${FCM_SERVER_KEY} # Email EMAIL_HOST: ${EMAIL_HOST:-smtp.gmail.com} EMAIL_PORT: ${EMAIL_PORT:-587} EMAIL_HOST_USER: ${EMAIL_HOST_USER} EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera } EMAIL_USE_TLS: "${EMAIL_USE_TLS:-true}" # Worker settings CELERY_BEAT_REMINDER_HOUR: ${CELERY_BEAT_REMINDER_HOUR:-20} CELERY_BEAT_REMINDER_MINUTE: ${CELERY_BEAT_REMINDER_MINUTE:-0} volumes: - ./push_certs:/certs:ro depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - casera-network volumes: postgres_data: redis_data: networks: casera-network: driver: bridge