# OCDP Docker 服务架构 ## 📋 项目概述 OCDP 采用微服务架构,包含以下核心服务: ### 核心服务 1. **Backend API** - Go 后端服务(支持 Mock/Production 模式) 2. **Frontend** - React + TypeScript 前端应用 3. **PostgreSQL** - 主数据库(生产模式) 4. **Redis** - 缓存服务(生产模式) ### 可选服务 - **pgAdmin** - PostgreSQL 管理工具 - **Swagger UI** - API 文档查看器 --- ## 🎯 运行模式说明 ### 1. **生产模式(Real Mode)** - 所有服务连接真实的数据库和外部依赖 - 适用于:生产环境、集成测试 - 使用配置:`docker-compose.yml` ### 2. **开发模式(Dev Mode)** - 支持热重载(后端使用 Air,前端使用 Vite HMR) - 后端使用 Mock 适配器,不依赖数据库 - 前端连接后端 Mock 数据 - 适用于:日常开发、快速迭代 - 使用配置:`docker-compose.yml` + `docker-compose.dev.yml` ### 3. **Mock 模式(独立测试)** - 每个服务完全独立,Mock 所有外部依赖 - 适用于:单独测试某个服务 - 使用配置:`docker-compose.mock.yml` --- ## 🐳 Dockerfile 说明 ### Backend Dockerfiles | 文件 | 用途 | 特点 | |------|------|------| | `backend/Dockerfile` | 生产环境 | 多阶段构建,连接真实数据库 | | `backend/Dockerfile.dev` | 开发环境 | 使用 Air 热重载,挂载源代码 | | `backend/Dockerfile.mock` | Mock 测试 | Mock 所有外部依赖,独立运行 | ### Frontend Dockerfiles | 文件 | 用途 | 特点 | |------|------|------| | `frontend/Dockerfile` | 生产环境 | Nginx 静态文件服务 | | `frontend/Dockerfile.dev` | 开发环境 | Vite Dev Server + HMR | | `frontend/Dockerfile.mock` | Mock 测试 | 使用前端 Mock 数据 | --- ## 🚀 快速开始 ### 场景 1: 生产环境部署(Real Mode) ```bash # 启动所有服务(包含数据库) docker compose up -d # 查看日志 docker compose logs -f # 访问服务 # - Frontend: http://localhost:3000 # - Backend: http://localhost:8080 # - pgAdmin: http://localhost:5050 (需要 --profile tools) ``` **环境变量**: ```bash export JWT_SECRET="your-production-secret" export ENCRYPTION_KEY="your-production-encryption-key-32-bytes" docker compose up -d ``` ### 场景 2: 开发环境(Dev Mode) ```bash # 启动开发环境(不需要数据库,使用 Mock) docker compose -f docker-compose.yml -f docker-compose.dev.yml up # 或后台运行 docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d # 访问服务 # - Frontend: http://localhost:5173 (Vite Dev Server) # - Backend: http://localhost:8080 (Mock Mode) ``` **特点**: - ✅ 后端自动重载(Air) - ✅ 前端 HMR(Vite) - ✅ 不需要数据库(Mock 模式) - ✅ 快速启动,适合日常开发 ### 场景 3: 独立测试后端(Backend Mock) ```bash # 只启动后端 Mock 服务 docker compose -f docker-compose.mock.yml up backend # 测试 API curl http://localhost:8080/health curl http://localhost:8080/api/v1/registries ``` ### 场景 4: 独立测试前端(Frontend Mock) ```bash # 只启动前端 Mock 服务 docker compose -f docker-compose.mock.yml up frontend # 访问前端 # http://localhost:3000 ``` ### 场景 5: 开发模式 + 真实数据库(可选) ```bash # 如果需要真实数据库进行开发 docker compose -f docker-compose.yml -f docker-compose.dev.yml --profile with-db up ``` --- ## 📁 项目结构 ``` ocdp-go/ ├── backend/ # 后端服务 │ ├── Dockerfile # 生产环境 │ ├── Dockerfile.dev # 开发环境(热重载) │ ├── Dockerfile.mock # Mock 测试 │ ├── .air.toml # Air 配置(热重载) │ ├── cmd/api/main.go # 入口文件 │ ├── internal/ # 内部代码 │ ├── config/ # 配置文件 │ └── data/ # Mock 数据 │ ├── frontend/ # 前端服务 │ ├── Dockerfile # 生产环境 │ ├── Dockerfile.dev # 开发环境(Vite Dev Server) │ ├── Dockerfile.mock # Mock 测试 │ ├── nginx.conf # Nginx 配置 │ ├── src/ # 源代码 │ └── package.json # 依赖配置 │ ├── api/ # API 规范 │ └── openapi.yaml # OpenAPI 定义 │ ├── docs/ # 文档 │ ├── features/ # 功能文档 │ ├── deployment/ # 部署文档 │ └── development/ # 开发文档 │ ├── docker-compose.yml # 生产模式配置 ├── docker-compose.dev.yml # 开发模式覆盖 ├── docker-compose.mock.yml # Mock 模式配置 └── Makefile # 便捷命令 ``` --- ## 🔧 开发工作流 ### 日常开发流程 ```bash # 1. 启动开发环境 docker compose -f docker-compose.yml -f docker-compose.dev.yml up # 2. 修改代码(自动重载) # - 后端代码修改后自动重新编译 # - 前端代码修改后 HMR 立即生效 # 3. 查看日志 docker compose -f docker-compose.yml -f docker-compose.dev.yml logs -f backend docker compose -f docker-compose.yml -f docker-compose.dev.yml logs -f frontend # 4. 停止服务 docker compose -f docker-compose.yml -f docker-compose.dev.yml down ``` ### 测试后端 API ```bash # 启动后端 Mock docker compose -f docker-compose.mock.yml up backend -d # 测试登录 curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' # 测试获取 registries curl http://localhost:8080/api/v1/registries # 停止 docker compose -f docker-compose.mock.yml down ``` ### 构建生产镜像 ```bash # 构建所有镜像 docker compose build # 只构建后端 docker compose build backend # 只构建前端 docker compose build frontend # 无缓存构建 docker compose build --no-cache ``` --- ## 🔍 服务详细说明 ### Backend Service **环境变量**: | 变量 | 说明 | Mock 模式 | Production 模式 | |------|------|-----------|-----------------| | `ADAPTER_MODE` | 适配器模式 | `mock` | `production` | | `PORT` | 服务端口 | `8080` | `8080` | | `DATABASE_URL` | 数据库连接 | 不需要 | 必需 | | `JWT_SECRET` | JWT 密钥 | 任意值 | 强密钥 | | `ENCRYPTION_KEY` | 加密密钥 | 任意值(32字节) | 强密钥(32字节) | **健康检查**: ```bash curl http://localhost:8080/health # 返回: {"status":"healthy"} ``` **Mock 数据位置**: - `backend/data/` - Mock 数据文件 - `backend/internal/adapter/output/persistence/mock/` - Mock 实现 ### Frontend Service **环境变量**: | 变量 | 说明 | 默认值 | |------|------|--------| | `VITE_API_BASE_URL` | 后端 API 地址 | `http://localhost:8080/api/v1` | | `VITE_USE_MOCK` | 使用前端 Mock | `false` | **端口**: - 开发模式:`5173`(Vite Dev Server) - 生产模式:`80`(Nginx) ### PostgreSQL Service **连接信息**: ``` Host: localhost Port: 5432 Database: ocdp User: postgres Password: postgres ``` **管理工具**: ```bash # 启动 pgAdmin docker compose --profile tools up -d pgadmin # 访问: http://localhost:5050 # Email: admin@ocdp.local # Password: admin ``` ### Redis Service **连接信息**: ``` Host: localhost Port: 6379 ``` --- ## 🛠️ 故障排查 ### 问题 1: 后端无法连接数据库 **检查**: ```bash # 确认数据库是否运行 docker compose ps postgres # 查看数据库日志 docker compose logs postgres # 测试连接 docker compose exec postgres psql -U postgres -d ocdp -c "SELECT 1;" ``` **解决方案**: - 确保使用生产模式:`ADAPTER_MODE=production` - 检查 `DATABASE_URL` 环境变量 - 等待数据库健康检查通过 ### 问题 2: 前端无法访问后端 **检查**: ```bash # 查看后端状态 curl http://localhost:8080/health # 查看网络 docker compose ps docker network inspect ocdp-network ``` **解决方案**: - 确认后端服务运行正常 - 检查 `VITE_API_BASE_URL` 环境变量 - 检查 CORS 配置 ### 问题 3: 开发模式热重载不工作 **后端**: ```bash # 确认 Air 正在运行 docker compose -f docker-compose.yml -f docker-compose.dev.yml logs backend | grep air # 检查文件挂载 docker compose -f docker-compose.yml -f docker-compose.dev.yml exec backend ls -la ``` **前端**: ```bash # 确认 Vite 正在运行 docker compose -f docker-compose.yml -f docker-compose.dev.yml logs frontend | grep VITE # 检查 HMR # 浏览器控制台应该显示 [vite] connected ``` ### 问题 4: 容器启动失败 ```bash # 查看详细日志 docker compose logs --tail=100 # 重新构建镜像 docker compose build --no-cache # 清理并重启 docker compose down -v docker compose up -d ``` --- ## 📊 性能建议 ### 开发环境优化 1. **使用 Mock 模式**:避免数据库依赖,加快启动速度 2. **关闭不需要的服务**:只启动正在开发的服务 3. **使用 Docker volumes**:提高文件 I/O 性能 ### 生产环境优化 1. **使用多阶段构建**:减小镜像体积 2. **启用健康检查**:自动重启失败的服务 3. **配置资源限制**:防止服务占用过多资源 4. **使用 Redis 缓存**:减少数据库查询 --- ## 📖 相关文档 - [开发指南](./docs/development/specification.md) - [部署指南](./docs/deployment/docker-guide.md) - [API 文档](../../backend/docs/openapi.yaml) - [Artifact Filter 功能](./docs/features/ARTIFACT_MEDIATYPE_FILTER.md) --- ## 🎓 总结 ### 各模式对比 | 特性 | 生产模式 | 开发模式 | Mock 模式 | |------|---------|---------|----------| | 数据库 | ✅ PostgreSQL | ❌ Mock | ❌ Mock | | 热重载 | ❌ | ✅ Air + Vite | ❌ | | 启动速度 | 慢 | 中 | 快 | | 适用场景 | 生产/集成测试 | 日常开发 | 独立测试 | | 资源占用 | 高 | 中 | 低 | ### 推荐使用场景 - 🚀 **日常开发**:使用开发模式 - 🧪 **单元测试**:使用 Mock 模式 - 🔗 **集成测试**:使用生产模式 - 📦 **部署上线**:使用生产模式 ### 快速命令参考 ```bash # 开发(推荐) make dev # 或 docker compose -f docker-compose.yml -f docker-compose.dev.yml up # 测试后端 docker compose -f docker-compose.mock.yml up backend # 测试前端 docker compose -f docker-compose.mock.yml up frontend # 生产部署 docker compose up -d # 停止所有 docker compose down ```