# ================================================== # OCDP Docker Compose (frontend + gateway layer) # ================================================== # 使用方式: # docker compose -f docker-compose.yml \ # -f ./backend/docker-compose.yml \ # --profile backend up --build -d # # 说明: # - 本文件只负责前端构建和 Nginx。 # - Backend / PostgreSQL / pgAdmin 由 backend/docker-compose.yml 提供。 # - Nginx 统一监听 80/443(默认映射 WEB_HTTP_PORT=80、WEB_HTTPS_PORT=443), # 根据路径转发:/api/* → backend,其他路径 → 前端静态文件。 # ================================================== services: # -------------------------------------------------- # 构建前端静态资源 (一次性 Job) # -------------------------------------------------- frontend-build: image: node:20-alpine container_name: ocdp-frontend-build init: true working_dir: /app restart: "no" environment: NODE_ENV: production NPM_CONFIG_PRODUCTION: "false" # ensure devDependencies (tsc, vite) are installed for build # 默认通过 Nginx 代理到 backend -> /api/v1 VITE_API_BASE_URL: ${VITE_API_BASE_URL:-/api/v1} FILE_OWNER_UID: ${FILE_OWNER_UID:-1000} FILE_OWNER_GID: ${FILE_OWNER_GID:-1000} command: > sh -c " set -eux; npm ci; npm run build; mkdir -p /build; rm -rf /build/*; cp -R dist/. /build/; if [ -d dist ]; then chown -R "$$FILE_OWNER_UID:$$FILE_OWNER_GID" dist; fi; if [ -d /build ]; then chown -R "$$FILE_OWNER_UID:$$FILE_OWNER_GID" /build; fi " volumes: - ./frontend:/app - frontend_node_modules:/app/node_modules - frontend_dist:/build networks: - ocdp-network # -------------------------------------------------- # Nginx - 静态文件 + /api 反向代理统一入口 # -------------------------------------------------- nginx: image: nginx:1.27-alpine container_name: ocdp-nginx depends_on: frontend-build: condition: service_completed_successfully ports: - "${WEB_HTTP_PORT:-80}:80" - "${WEB_HTTPS_PORT:-443}:443" volumes: - frontend_dist:/usr/share/nginx/html:ro - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - ./infra/nginx/certs:/etc/nginx/certs:ro healthcheck: test: ["CMD-SHELL", "wget -qO- http://localhost/healthz || exit 1"] interval: 30s timeout: 5s retries: 5 networks: - ocdp-network # ================================================== # Networks # ================================================== networks: ocdp-network: driver: bridge name: ocdp-network # ================================================== # Volumes # ================================================== volumes: frontend_dist: driver: local frontend_node_modules: driver: local