version: "3.9" services: postgres-db: image: postgres:16-alpine container_name: fundamental-postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: fundamental volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d fundamental"] interval: 5s timeout: 5s retries: 10 ports: - "15432:5432" backend: build: context: . dockerfile: backend/Dockerfile container_name: fundamental-backend working_dir: /workspace/backend command: uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 environment: PYTHONDONTWRITEBYTECODE: "1" PYTHONUNBUFFERED: "1" # SQLAlchemy async driver DATABASE_URL: postgresql+asyncpg://postgres:postgres@postgres-db:5432/fundamental # Config service base URL CONFIG_SERVICE_BASE_URL: http://config-service:7000/api/v1 volumes: # 挂载整个项目,确保后端代码中对项目根目录的相对路径(如 config/)仍然有效 - ./:/workspace ports: - "18000:8000" depends_on: postgres-db: condition: service_healthy config-service: condition: service_started frontend: build: context: . dockerfile: frontend/Dockerfile container_name: fundamental-frontend working_dir: /workspace/frontend command: npm run dev environment: # 让 Next 的 API 路由代理到后端容器 NEXT_PUBLIC_BACKEND_URL: http://backend:8000/api # Prisma 直连数据库(与后端共用同一库) DATABASE_URL: postgresql://postgres:postgres@postgres-db:5432/fundamental?schema=public NODE_ENV: development NEXT_TELEMETRY_DISABLED: "1" volumes: - ./:/workspace # 隔离 node_modules,避免与宿主机冲突 - frontend_node_modules:/workspace/frontend/node_modules ports: - "13001:3001" depends_on: - backend - postgres-db - config-service config-service: build: context: . dockerfile: services/config-service/Dockerfile container_name: fundamental-config-service working_dir: /workspace/services/config-service command: uvicorn app.main:app --host 0.0.0.0 --port 7000 environment: PROJECT_ROOT: /workspace volumes: - ./:/workspace ports: - "17000:7000" volumes: pgdata: frontend_node_modules: