version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: hq-postgres environment: POSTGRES_USER: ${POSTGRES_USER:-headquarter} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-headquarter} POSTGRES_DB: ${POSTGRES_DB:-headquarter} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-headquarter} -d ${POSTGRES_DB:-headquarter}"] interval: 10s timeout: 5s retries: 5 start_period: 10s networks: - backend restart: unless-stopped # Redis Cache redis: image: redis:7-alpine container_name: hq-redis command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 start_period: 5s networks: - backend restart: unless-stopped # API Service api: build: context: ./apps/api dockerfile: Dockerfile container_name: hq-api environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-headquarter}:${POSTGRES_PASSWORD:-headquarter}@postgres:5432/${POSTGRES_DB:-headquarter} POSTGRES_HOST: postgres POSTGRES_PORT: 5432 REDIS_URL: redis://redis:6379/0 SESSION_SECRET: ${SESSION_SECRET:-change-me-in-production} REPO_BASE_PATH: /data/repos INSTANCE_BASE_PATH: /data/instances volumes: - repo_data:/data/repos - /data/instances:/data/instances ports: - "8000:8000" depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - backend restart: unless-stopped # Web Frontend web: build: context: ./apps/web dockerfile: Dockerfile args: VITE_API_BASE_URL: http://localhost:8000 container_name: hq-web environment: VITE_API_BASE_URL: http://localhost:8000 ports: - "3000:80" depends_on: - api networks: - backend restart: unless-stopped volumes: postgres_data: redis_data: repo_data: networks: backend: driver: bridge