version: '3.8' services: postgres: image: postgres:15-alpine container_name: picpeak-postgres environment: POSTGRES_USER: ${DB_USER:-picpeak} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME:-picpeak} volumes: - postgres-data:/var/lib/postgresql/data networks: - picpeak-network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-picpeak}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: picpeak-redis command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - redis-data:/data networks: - picpeak-network restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 5s retries: 5 backend: # Use pre-built image from GitHub Container Registry image: ghcr.io/the-luap/picpeak/backend:latest container_name: picpeak-backend env_file: .env environment: - NODE_ENV=production - DB_HOST=${DB_HOST:-postgres} - REDIS_HOST=redis - PHOTOS_DIR=/app/storage/events volumes: - ${APP_STORAGE}:/app/storage - ${LOGS}:/app/logs - ${APP_DATA}:/app/data ports: - "${BACKEND_PORT:-3001}:3000" networks: - picpeak-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped healthcheck: # Backend exposes /health on internal port 3000 test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 frontend: # Use pre-built image from GitHub Container Registry image: ghcr.io/the-luap/picpeak/frontend:latest container_name: picpeak-frontend # Note: Pre-built frontend uses Nginx to proxy /api to backend:3001. # Prefer keeping API base as '/api' in builds to avoid CORS. ports: - "${FRONTEND_PORT:-3000}:80" networks: - picpeak-network depends_on: - backend restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 # Optional: Nginx reverse proxy for production with SSL # Uncomment and configure if you want built-in HTTPS support # nginx: # image: nginx:alpine # container_name: picpeak-nginx # ports: # - "80:80" # - "443:443" # volumes: # - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # - ./nginx/ssl:/etc/nginx/ssl:ro # - ./nginx/conf.d:/etc/nginx/conf.d:ro # networks: # - picpeak-network # depends_on: # - frontend # - backend # restart: unless-stopped volumes: postgres-data: driver: local redis-data: driver: local networks: picpeak-network: driver: bridge