version: '3.8' services: mysql: image: mysql:8.0 container_name: harborforge-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-harborforge_root} MYSQL_DATABASE: ${MYSQL_DATABASE:-harborforge} MYSQL_USER: ${MYSQL_USER:-harborforge} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-harborforge_pass} volumes: - mysql_data:/var/lib/mysql ports: - "${MYSQL_PORT:-3306}:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 deploy: resources: limits: cpus: '0.5' memory: 512M backend: build: context: ./HarborForge.Backend dockerfile: Dockerfile container_name: harborforge-backend restart: unless-stopped environment: DATABASE_URL: mysql+pymysql://${MYSQL_USER:-harborforge}:${MYSQL_PASSWORD:-harborforge_pass}@mysql:3306/${MYSQL_DATABASE:-harborforge} SECRET_KEY: ${SECRET_KEY:-change_me_in_production} LOG_LEVEL: ${LOG_LEVEL:-INFO} ports: - "${BACKEND_PORT:-8000}:8000" depends_on: mysql: condition: service_healthy deploy: resources: limits: cpus: '0.5' memory: 512M healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s frontend: build: context: ./HarborForge.Frontend dockerfile: Dockerfile args: VITE_API_BASE: ${VITE_API_BASE:-/api} container_name: harborforge-frontend restart: unless-stopped ports: - "${FRONTEND_PORT:-3000}:3000" depends_on: backend: condition: service_healthy deploy: resources: limits: cpus: '0.25' memory: 128M healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"] interval: 30s timeout: 10s retries: 3 volumes: mysql_data: driver: local