services: # ── Backend: Flask API ────────────────────────────────── backend: build: context: . dockerfile: docker/Dockerfile.backend env_file: - path: .env required: false environment: CHATAPI_ADMIN_USERNAME: ${CHATAPI_ADMIN_USERNAME:-admin} CHATAPI_ADMIN_PASSWORD: ${CHATAPI_ADMIN_PASSWORD:-change-me} CHATAPI_HOST: 0.0.0.0 CHATAPI_PORT: 5000 CHATAPI_DB_PATH: /app/data/chatapi.sqlite3 CHATAPI_DATA_DIR: /app/data CHATAPI_CORS_ORIGINS: ${CHATAPI_CORS_ORIGINS:-http://localhost} volumes: - chatapi_data:/app/data restart: unless-stopped networks: - chatapi-net healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/api/health"] interval: 15s timeout: 5s retries: 3 start_period: 10s # ── Nginx: Frontend static files + API reverse proxy ─── nginx: build: context: . dockerfile: docker/Dockerfile.nginx ports: - "${NGINX_PORT:-80}:80" depends_on: backend: condition: service_healthy restart: unless-stopped networks: - chatapi-net volumes: chatapi_data: networks: chatapi-net: