# 🚀 部署文档 ## 目录 - [快速开始](#快速开始) - [2.4.1 Mock 模式](#241-mock-模式) - [2.4.2 Dev 模式](#242-dev-模式) - [2.4.3 Up 模式](#243-up-模式) - [环境变量配置](#环境变量配置) - [故障排查](#故障排查) --- ## 快速开始 ### 三种部署模式 | 模式 | 命令 | Backend | 数据库 | 热重载 | 适用场景 | |------|------|---------|--------|--------|----------| | **Mock** | `make mock` | 本地 | 内存 | ✅ | 快速开发、API 测试 | | **Dev** | `make db-up`
`make dev` | 本地 | Docker | ✅ | 日常开发 ⭐ 推荐 | | **Up** | `make up` | Docker | Docker | ❌ | 集成测试、生产预演 | ### 使用 Makefile ```bash # 查看所有命令 make help # Mock 模式(零依赖,最快启动) make mock # Dev 模式(推荐日常开发) make db-up # 启动数据库 make dev # 启动 Backend(热重载) # Up 模式(完全容器化) make up # 管理服务 make logs # 查看日志 make stop # 停止服务 ``` ### 验证服务 ```bash # 健康检查 curl http://localhost:8080/health # 测试 API curl http://localhost:8080/api/v1/registries | jq # 访问 Swagger UI open http://localhost:8080/api/docs ``` --- # 2.4.1 Mock 模式 ## 概述 Mock 模式使用内存存储,无需任何外部依赖,适合快速开发和测试。 **特点**: - ✅ **零依赖** - 无需数据库、Docker 等 - ✅ **快速启动** - 3 秒内启动 - ✅ **热重载** - 支持 Air 自动重载 - ✅ **自带测试数据** - Bootstrap 预注入 - ✅ **无需容器** - 本地直接运行 - ❌ **数据不持久** - 重启后数据丢失 **适用场景**: - 🚀 快速功能开发 - 🧪 API 接口测试 - 🎨 前端开发联调 - 📝 编写单元测试 **架构**: ``` ┌─────────────────────────────────────────┐ │ Mock 模式(本地直接运行) │ │ │ │ ┌──────────────────────────────────┐ │ │ │ OCDP Backend (Go Process) │ │ │ │ Port: 8080 │ │ │ │ │ │ │ │ ┌─────────────────────────┐ │ │ │ │ │ Air (Hot Reload) │ │ │ │ │ │ 监听文件变化自动重载 │ │ │ │ │ └─────────────────────────┘ │ │ │ │ │ │ │ │ Adapter: Mock │ │ │ │ Storage: Memory │ │ │ └──────────────────────────────────┘ │ │ │ │ 无外部依赖 ✨ │ └─────────────────────────────────────────┘ ``` --- ## 环境准备 ```bash # 1. 确保已安装 Go go version # 需要 Go 1.21+ # 2. 安装 Air(热重载工具) go install github.com/air-verse/air@latest # 3. 验证安装 air -v ``` --- ## 运行方式 ### 方式 1: 使用 Makefile(推荐) ```bash make mock ``` ### 方式 2: 使用 Air ```bash # 1. 设置环境变量 export ADAPTER_MODE=mock export PORT=8080 export JWT_SECRET=dev-secret-key # 2. 启动 Air air -c .air.toml # 输出示例: # __ _ ___ # / /\ | | | |_) # /_/--\ |_| |_| \_ v1.49.0 # # watching . # building... # running... # 🚀 Starting OCDP Backend (mode=mock) # 🌐 Server starting on :8080 ``` ### 方式 3: 直接运行 Go ```bash # 设置环境变量 export ADAPTER_MODE=mock export PORT=8080 export JWT_SECRET=dev-secret-key # 运行 go run cmd/api/main.go ``` --- ## 热重载演示 修改任何 `.go` 文件后,Air 会自动检测并重启: ``` main.go has changed building... running... 🚀 Starting OCDP Backend (mode=mock) 🌐 Server starting on :8080 ``` **支持的文件类型**: - `.go` - Go 源文件 - `.yaml`, `.json` - 配置文件 - `.toml` - Air 配置文件 --- ## 配置文件 Air 配置文件 `.air.toml` 已包含在项目中: ```toml root = "." testdata_dir = "testdata" tmp_dir = "tmp" [build] cmd = "go build -o ./tmp/main cmd/api/main.go" bin = "./tmp/main" include_ext = ["go", "tpl", "tmpl", "html", "yaml", "json"] exclude_dir = ["assets", "tmp", "vendor", "testdata"] exclude_regex = ["_test.go"] delay = 1000 ``` --- ## 测试数据 Mock 模式自动加载 `config/bootstrap.json` 中的测试数据: ```json { "enabled": true, "users": [ { "username": "admin", "password": "admin123", "email": "admin@example.com" } ], "registries": [ { "name": "Harbor Production", "url": "https://harbor.example.com", "username": "admin", "password": "secret" } ], "clusters": [ { "name": "Production Cluster", "host": "https://k8s.example.com:6443", "description": "生产环境集群" } ] } ``` --- ## 测试 API ```bash # 登录 curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' | jq # 响应: # { # "accessToken": "eyJhbGciOiJIUzI1NiIs...", # "userId": "user-123", # "username": "admin" # } # 查看 Registries curl http://localhost:8080/api/v1/registries | jq # 查看 Clusters curl http://localhost:8080/api/v1/clusters | jq ``` --- ## 环境变量 | 变量 | 说明 | 默认值 | 必需 | |------|------|--------|------| | `ADAPTER_MODE` | 适配器模式 | `mock` | ✅ | | `PORT` | 服务端口 | `8080` | ❌ | | `JWT_SECRET` | JWT 密钥 | - | ✅ | --- ## 优势与限制 ### ✅ 优势 1. **启动极快** - 3 秒内启动,无需等待数据库 2. **零配置** - 无需配置数据库连接、证书等 3. **自带数据** - Bootstrap 自动注入测试数据 4. **热重载** - 代码修改立即生效 5. **易于调试** - 本地运行,支持 IDE 断点调试 6. **完美测试** - 适合 API 测试和前端联调 ### ❌ 限制 1. **数据不持久** - 重启后数据丢失 2. **功能简化** - 某些功能(如真实 K8s 操作)被模拟 3. **不适合生产** - 仅用于开发调试 --- # 2.4.2 Dev 模式 ## 概述 Dev 模式使用 Docker 运行 PostgreSQL 数据库,Backend 在本地热重载运行,适合日常开发。 **特点**: - ✅ **隔离的依赖服务** - 数据库在容器中,避免污染本地环境 - ✅ **本地热重载** - Backend 支持 Air 自动重载 - ✅ **完整的 IDE 支持** - 断点调试、代码补全、性能分析 - ✅ **快速迭代** - 代码修改立即生效,无需重新构建镜像 - ✅ **数据持久化** - PostgreSQL 数据持久保存 - ✅ **最佳开发体验** - 兼顾隔离性和开发效率 **适用场景**: - 📝 **日常功能开发** ⭐ 最推荐 - 🐛 **代码调试** - 支持 IDE 断点 - 🔄 **快速迭代** - 热重载提升效率 - 🧪 **数据持久化测试** - 验证数据库操作 **架构**: ``` ┌──────────────────────────────────────────────────────────┐ │ Dev 模式(部分容器化,推荐日常开发) │ │ │ │ ┌────────────────────────┐ ┌────────────────────┐ │ │ │ OCDP Backend │ │ PostgreSQL │ │ │ │ (本地进程) │───▶│ (Docker 容器) │ │ │ │ Port: 8080 │ │ Port: 5432 │ │ │ │ │ │ │ │ │ │ ┌─────────────────┐ │ │ Volume: │ │ │ │ │ Air (Hot Reload) │ │ │ postgres_data │ │ │ │ └─────────────────┘ │ └────────────────────┘ │ │ └────────────────────────┘ │ │ │ │ Backend: 本地运行(热重载) │ │ Database: Docker 容器(隔离环境) │ └──────────────────────────────────────────────────────────┘ ``` --- ## 环境准备 ```bash # 1. 确保已安装 Docker 和 Docker Compose docker --version docker compose version # 2. 安装 Air(热重载工具) go install github.com/air-verse/air@latest # 3. 验证安装 air -v ``` --- ## 运行步骤 ### 步骤 1: 启动数据库 ```bash # 使用 Makefile(推荐) make db-up # 或手动启动 docker compose up -d postgres # 等待数据库启动(查看健康状态) docker compose ps # 预期输出: # NAME IMAGE STATUS PORTS # ocdp-postgres postgres:17-alpine Up 10s (healthy) 0.0.0.0:5432->5432/tcp ``` **验证数据库连接**: ```bash # 方式 1: 使用 psql psql -h localhost -U postgres -d ocdp # 方式 2: 使用 Docker docker exec -it ocdp-postgres psql -U postgres -d ocdp # 测试查询 SELECT current_database(); \q ``` --- ### 步骤 2: 启动 Backend(热重载) **选项 A: 使用 Makefile(推荐)** ```bash # 设置环境变量(首次) export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable" export ENCRYPTION_KEY="12345678901234567890123456789012" # 启动 Backend make dev # 输出: # 🚀 启动 Dev 模式 - Backend(本地热重载)... # 🔌 Connecting to database... # ✅ Database connected # 🌱 Bootstrap seeding... # 🌐 Server starting on :8080 ``` **选项 B: 使用 Air** ```bash # 设置环境变量 export ADAPTER_MODE=production export PORT=8080 export JWT_SECRET=dev-secret-key export ENCRYPTION_KEY=12345678901234567890123456789012 export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable" # 启动 Air air -c .air.toml ``` **选项 C: 直接运行 Go** ```bash export ADAPTER_MODE=production export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable" export JWT_SECRET=dev-secret-key export ENCRYPTION_KEY=12345678901234567890123456789012 go run cmd/api/main.go ``` --- ## 验证服务 ```bash # 健康检查 curl http://localhost:8080/health # 输出: {"status":"healthy"} # 注册用户 curl -X POST http://localhost:8080/api/v1/auth/register \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "test123", "email": "test@example.com" }' # 登录 curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "test123" }' | jq ``` --- ## 热重载演示 修改代码后,Air 会自动检测并重启: ```bash # 终端 1: Air 运行中 # 修改文件: internal/domain/service/cluster_service.go # Air 输出: # cluster_service.go has changed # building... # running... # 🚀 Starting OCDP Backend (mode=production) # 🔌 Connecting to database... # ✅ Database connected # 🌐 Server starting on :8080 # 终端 2: 测试 curl http://localhost:8080/api/v1/clusters | jq ``` --- ## 开发工作流 ```bash # 1. 启动数据库(首次或停止后) make db-up # 2. 启动 Backend(热重载) make dev # 3. 修改代码 vim internal/domain/service/cluster_service.go # Air 自动检测并重启 # 4. 测试 API curl http://localhost:8080/api/v1/clusters | jq # 5. 查看数据库 make db SELECT * FROM users; \q # 6. 停止服务 # - Backend: Ctrl+C # - Database: make stop ``` --- ## 管理服务 **查看服务状态**: ```bash # 查看所有容器 docker compose ps # 查看 PostgreSQL 日志 docker compose logs -f postgres # 查看 Backend 日志(在 Air 终端中) ``` **停止服务**: ```bash # 停止 Backend: 在 Air 终端按 Ctrl+C # 停止数据库 docker compose stop postgres # 停止并删除容器(数据保留) docker compose down # 停止并删除容器和数据卷(⚠️ 数据丢失) docker compose down -v ``` **重启服务**: ```bash # 重启数据库 docker compose restart postgres # 重启 Backend: 在 Air 终端按 Ctrl+C 后重新运行 make dev ``` --- ## 数据库管理 **连接数据库**: ```bash # 使用 Makefile make db # 使用 psql psql -h localhost -U postgres -d ocdp # 或使用 Docker docker exec -it ocdp-postgres psql -U postgres -d ocdp ``` **常用查询**: ```sql -- 查看所有表 \dt -- 查看用户 SELECT id, username, email, created_at FROM users; -- 查看 Registry SELECT id, name, url, created_at FROM registries; -- 查看集群 SELECT id, name, host, created_at FROM clusters; -- 清空测试数据 TRUNCATE users, registries, clusters, instances CASCADE; -- 退出 \q ``` **数据库备份与恢复**: ```bash # 备份 docker exec ocdp-postgres pg_dump -U postgres ocdp > backup-$(date +%Y%m%d).sql # 恢复 docker exec -i ocdp-postgres psql -U postgres ocdp < backup.sql # 压缩备份 docker exec ocdp-postgres pg_dump -U postgres ocdp | gzip > backup.sql.gz # 从压缩文件恢复 gunzip -c backup.sql.gz | docker exec -i ocdp-postgres psql -U postgres ocdp ``` --- ## IDE 调试配置 ### VS Code (launch.json) ```json { "version": "0.2.0", "configurations": [ { "name": "Launch OCDP Backend (Dev Mode)", "type": "go", "request": "launch", "mode": "auto", "program": "${workspaceFolder}/cmd/api/main.go", "env": { "ADAPTER_MODE": "production", "PORT": "8080", "JWT_SECRET": "dev-secret-key", "ENCRYPTION_KEY": "12345678901234567890123456789012", "DATABASE_URL": "postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable" }, "args": [] } ] } ``` ### GoLand / IntelliJ IDEA 1. Run → Edit Configurations 2. Add New → Go Build 3. 配置: - **Files**: `cmd/api/main.go` - **Working directory**: 项目根目录 - **Environment**: ``` ADAPTER_MODE=production PORT=8080 JWT_SECRET=dev-secret-key ENCRYPTION_KEY=12345678901234567890123456789012 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable ``` --- ## 环境变量 | 变量 | 说明 | 示例 | 必需 | |------|------|------|------| | `ADAPTER_MODE` | 适配器模式 | `production` | ✅ | | `PORT` | 服务端口 | `8080` | ❌ | | `JWT_SECRET` | JWT 密钥 | `dev-secret` | ✅ | | `ENCRYPTION_KEY` | 加密密钥(32字节) | `12345678901234567890123456789012` | ✅ | | `DATABASE_URL` | 数据库连接 | `postgresql://postgres:postgres@localhost:5432/ocdp?sslmode=disable` | ✅ | **生成密钥**: ```bash # JWT Secret openssl rand -base64 32 # Encryption Key(32 字节) openssl rand -base64 32 ``` --- ## 故障排查 **问题 1: 数据库连接失败** ```bash # 错误: connection refused # 检查数据库是否启动 docker compose ps postgres # 检查端口 netstat -tuln | grep 5432 # 或 lsof -i :5432 # 测试连接 psql -h localhost -U postgres -d ocdp -c "SELECT 1;" ``` **问题 2: 数据库未初始化** ```bash # 重新初始化数据库 docker compose down postgres docker compose up -d postgres # 等待健康检查通过 docker compose ps postgres ``` **问题 3: 端口冲突** ```bash # 修改 docker-compose.yml 中的端口映射 # ports: # - "5433:5432" # 使用 5433 而不是 5432 # 更新 DATABASE_URL export DATABASE_URL="postgresql://postgres:postgres@localhost:5433/ocdp?sslmode=disable" ``` --- # 2.4.3 Up 模式 ## 概述 Up 模式使用 Docker Compose 完全容器化部署,PostgreSQL 和 Backend 都在容器中运行。 **特点**: - ✅ **完全容器化** - 一致的运行环境 - ✅ **一键部署** - 简单快速 - ✅ **接近生产** - 与生产环境高度一致 - ✅ **易于分享** - 团队成员快速启动相同环境 - ❌ **无热重载** - 代码修改需重新构建镜像 - ❌ **调试受限** - 需要通过日志调试 **适用场景**: - 🧪 **集成测试** - 测试完整系统 - 🎯 **生产预演** - 验证部署流程 - 👥 **团队协作** - 快速搭建统一环境 - 📦 **交付演示** - 向客户展示系统 **架构**: ``` ┌──────────────────────────────────────────────────────────┐ │ Up 模式(完全容器化) │ │ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ Docker Compose Network │ │ │ │ │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ │ │ OCDP Backend │ │ PostgreSQL │ │ │ │ │ │ (Docker 容器) │───▶│ (Docker 容器) │ │ │ │ │ │ Port: 8080 │ │ Port: 5432 │ │ │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ │ │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ Persistent Volumes │ │ │ │ postgres_data: /var/lib/postgresql/data │ │ │ └────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────┘ ``` --- ## 环境准备 ```bash # 确保已安装 Docker 和 Docker Compose docker --version docker compose version ``` --- ## 目录结构 ``` backend/ ├── docker-compose.yml # Docker Compose 配置 ├── Dockerfile # Backend 镜像 ├── .env # 环境变量 ├── env.example # 环境变量示例 └── config/ └── bootstrap.json # 初始数据(可选) ``` --- ## 部署步骤 ### 步骤 1: 准备环境变量 ```bash # 复制示例文件 cp env.example .env # 编辑环境变量 nano .env ``` **.env 文件内容**: ```bash # 适配器模式 ADAPTER_MODE=production # 端口配置 BACKEND_PORT=8080 POSTGRES_PORT=5432 # 安全密钥(⚠️ 生产环境必须修改) JWT_SECRET=your-jwt-secret-change-in-production ENCRYPTION_KEY=your-32-character-encryption-key-here # 数据库配置 POSTGRES_DB=ocdp POSTGRES_USER=postgres POSTGRES_PASSWORD=your-postgres-password-change-it # 数据库连接 URL(容器内部使用) DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable ``` **生成安全密钥**: ```bash # 生成随机 JWT Secret openssl rand -base64 32 # 生成随机 Encryption Key(32 字节) openssl rand -base64 32 # 生成随机数据库密码 openssl rand -base64 16 ``` --- ### 步骤 2: 启动服务 **使用 Makefile(推荐)**: ```bash make up # 查看服务状态 docker compose ps # 预期输出: # NAME IMAGE STATUS PORTS # ocdp-backend backend:latest Up 30s (healthy) 0.0.0.0:8080->8080/tcp # ocdp-postgres postgres:17-alpine Up 40s (healthy) 0.0.0.0:5432->5432/tcp ``` **手动启动**: ```bash # 使用 profile 启动完整服务 docker compose --profile backend up -d # 查看日志 docker compose logs -f backend postgres ``` --- ### 步骤 3: 验证部署 ```bash # 健康检查 curl http://localhost:8080/health # 输出: {"status":"healthy"} # 测试 API curl http://localhost:8080/api/v1/registries | jq # 访问 Swagger UI open http://localhost:8080/api/docs # 查看容器状态 docker compose ps # 进入 Backend 容器 docker compose exec backend sh # 连接数据库 make db ``` --- ## 管理服务 **停止服务**: ```bash # 停止所有服务 make stop # 或 docker compose down # 停止并删除数据卷(⚠️ 会删除数据) docker compose down -v # 仅停止 Backend docker compose stop backend ``` **重启服务**: ```bash # 重启所有服务 make restart # 或 docker compose restart # 重启 Backend docker compose restart backend # 重启数据库 docker compose restart postgres ``` **查看日志**: ```bash # 查看所有日志 make logs # 或 docker compose logs -f # 查看 Backend 日志 docker compose logs -f backend # 查看最近 100 行 docker compose logs --tail=100 backend ``` --- ## 重新构建镜像 **代码修改后需要重新构建**: ```bash # 方式 1: 使用 Makefile make up-build # 方式 2: 手动构建 docker compose build backend docker compose --profile backend up -d # 方式 3: 强制重新构建(不使用缓存) make up-rebuild # 或 docker compose build --no-cache backend docker compose --profile backend up -d ``` --- ## 数据备份和恢复 ```bash # 备份数据库 docker compose exec postgres pg_dump -U postgres ocdp > backup-$(date +%Y%m%d).sql # 恢复数据库 docker compose exec -T postgres psql -U postgres ocdp < backup.sql # 导出为压缩文件 docker compose exec postgres pg_dump -U postgres ocdp | gzip > backup-$(date +%Y%m%d).sql.gz # 从压缩文件恢复 gunzip -c backup.sql.gz | docker compose exec -T postgres psql -U postgres ocdp ``` --- ## docker-compose.yml 配置 ```yaml version: '3.8' services: # PostgreSQL 数据库 postgres: image: postgres:17-alpine container_name: ocdp-postgres environment: - POSTGRES_DB=${POSTGRES_DB:-ocdp} - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data - ${INIT_DB_SQL_PATH:-./scripts/init-db.sql}:/docker-entrypoint-initdb.d/01-init.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-ocdp}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - ocdp-network # Backend 服务(需要 --profile backend 才启动) backend: profiles: ["backend"] build: context: . dockerfile: Dockerfile container_name: ocdp-backend ports: - "${BACKEND_PORT:-8080}:8080" environment: - ADAPTER_MODE=${ADAPTER_MODE:-production} - PORT=8080 - JWT_SECRET=${JWT_SECRET} - ENCRYPTION_KEY=${ENCRYPTION_KEY} - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable depends_on: postgres: condition: service_healthy restart: unless-stopped networks: - ocdp-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 3s retries: 3 start_period: 40s networks: ocdp-network: driver: bridge volumes: postgres_data: driver: local ``` > 💡 **提示** > 如果与仓库根目录下的 `docker-compose.yml` 联合使用(例如通过 `docker compose -f docker-compose.yml -f backend/docker-compose.yml --profile backend ...`),请确保设置环境变量 `INIT_DB_SQL_PATH=./backend/scripts/init-db.sql`(或绝对路径),以便 PostgreSQL 容器挂载到正确的初始化脚本。 --- ## Dockerfile 配置 ```dockerfile # 多阶段构建,优化镜像大小 # 构建阶段 FROM golang:1.21-alpine AS builder WORKDIR /app # 复制依赖文件 COPY go.mod go.sum ./ RUN go mod download # 复制源代码 COPY . . # 编译(静态链接) RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w -s' -o ocdp-backend cmd/api/main.go # 运行阶段 FROM alpine:latest # 安装 CA 证书 RUN apk --no-cache add ca-certificates tzdata wget # 设置时区 ENV TZ=Asia/Shanghai WORKDIR /root/ # 复制二进制文件 COPY --from=builder /app/ocdp-backend . # 复制配置文件(如果有) COPY config/ config/ # 暴露端口 EXPOSE 8080 # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1 # 运行 CMD ["./ocdp-backend"] ``` --- ## 环境变量 | 变量 | 说明 | 示例 | 必需 | |------|------|------|------| | `ADAPTER_MODE` | 适配器模式 | `production` | ✅ | | `BACKEND_PORT` | Backend 端口 | `8080` | ❌ | | `POSTGRES_PORT` | PostgreSQL 端口 | `5432` | ❌ | | `JWT_SECRET` | JWT 密钥 | `随机字符串` | ✅ | | `ENCRYPTION_KEY` | 加密密钥(32字节) | `随机字符串` | ✅ | | `POSTGRES_DB` | 数据库名 | `ocdp` | ✅ | | `POSTGRES_USER` | 数据库用户 | `postgres` | ✅ | | `POSTGRES_PASSWORD` | 数据库密码 | `随机字符串` | ✅ | | `DATABASE_URL` | 数据库连接 | `postgresql://...` | ✅ | --- ## 故障排查 **问题 1: Backend 容器无法启动** ```bash # 查看容器日志 docker compose logs backend # 查看容器状态 docker compose ps # 重新构建镜像 docker compose build --no-cache backend docker compose --profile backend up -d ``` **问题 2: 数据库连接失败** ```bash # 检查数据库健康状态 docker compose exec postgres pg_isready -U postgres # 查看数据库日志 docker compose logs postgres # 检查网络连接 docker compose exec backend ping postgres # 等待数据库完全启动后重启 Backend sleep 10 docker compose restart backend ``` **问题 3: 端口冲突** ```bash # 修改 .env 文件中的端口 BACKEND_PORT=8081 POSTGRES_PORT=5433 # 重新启动 docker compose down docker compose --profile backend up -d ``` **问题 4: 完全重置** ```bash # 停止所有服务 docker compose down # 删除数据卷(⚠️ 会删除数据) docker compose down -v # 清理 Docker 系统 docker system prune -a --volumes # 重新部署 make up ``` --- # 环境变量配置 ## 环境变量对比 | 变量 | Mock | Dev | Up | 说明 | |------|------|-----|-----|------| | `ADAPTER_MODE` | `mock` | `production` | `production` | 适配器模式 | | `PORT` | `8080` | `8080` | `8080` | 服务端口 | | `JWT_SECRET` | 简单值 | 开发值 | 强随机值 | JWT 密钥 | | `ENCRYPTION_KEY` | - | 开发值 | 强随机值 | 加密密钥 | | `DATABASE_URL` | - | 本地 PostgreSQL | 容器内 PostgreSQL | 数据库连接 | --- ## 模式对比 | 特性 | Mock | Dev | Up | |------|------|-----|-----| | **Backend 运行位置** | 本地进程 | 本地进程 | Docker 容器 | | **依赖服务** | 无 | Docker (PostgreSQL) | Docker (PostgreSQL) | | **热重载** | ✅ Air | ✅ Air | ❌ 需重新构建 | | **数据库** | ❌ 内存 | ✅ PostgreSQL | ✅ PostgreSQL | | **数据持久化** | ❌ | ✅ | ✅ | | **启动时间** | 3 秒 | 5-8 秒 | 15-30 秒 | | **调试能力** | ✅ IDE 断点 | ✅ IDE 断点 | ⚠️ 日志调试 | | **适用场景** | 快速开发、API 测试 | 日常开发 ⭐ 推荐 | 集成测试、生产预演 | | **环境隔离** | ✅ 完全隔离 | ⚠️ 部分隔离 | ✅ 完全隔离 | | **生产一致性** | ❌ 低 | ⚠️ 中 | ✅ 高 | --- ## 推荐使用场景 ### 🚀 Mock 模式 - ✅ 快速功能开发 - ✅ API 接口测试 - ✅ 前端联调 - ✅ 单元测试 ### ⭐ Dev 模式(推荐日常开发) - ✅ 日常功能开发 - ✅ 代码调试 - ✅ 数据持久化测试 - ✅ 快速迭代 ### 🎯 Up 模式 - ✅ 集成测试 - ✅ 生产环境预演 - ✅ 团队协作环境搭建 - ✅ 交付演示 --- # 故障排查 ## 通用问题 ### 1. 端口被占用 ```bash # 查找占用端口的进程 lsof -i :8080 # 或 netstat -tuln | grep 8080 # 关闭进程 kill -9 # 或使用其他端口 export PORT=8081 ``` ### 2. Go 环境问题 ```bash # 检查 Go 版本 go version # 需要 Go 1.21+ # 更新 Go 模块 go mod download go mod tidy # 清理 Go 缓存 go clean -cache -modcache ``` ### 3. Air 找不到命令 ```bash # 确保 GOPATH/bin 在 PATH 中 export PATH=$PATH:$(go env GOPATH)/bin # 重新安装 Air go install github.com/air-verse/air@latest # 验证安装 air -v ``` --- ## Mock 模式问题 ### 1. 服务无法启动 ```bash # 检查环境变量 echo $ADAPTER_MODE # 应该是 mock echo $PORT # 应该是 8080 echo $JWT_SECRET # 不应为空 # 手动运行查看详细错误 export ADAPTER_MODE=mock export JWT_SECRET=test-secret go run cmd/api/main.go ``` ### 2. Bootstrap 数据未加载 ```bash # 检查 bootstrap.json 文件 cat config/bootstrap.json # 确保 enabled 为 true # { # "enabled": true, # ... # } ``` --- ## Dev 模式问题 ### 1. 数据库连接失败 ```bash # 检查 PostgreSQL 是否运行 docker compose ps postgres # 检查端口 lsof -i :5432 # 测试连接 psql -h localhost -U postgres -d ocdp -c "SELECT 1;" # 重启数据库 docker compose restart postgres ``` ### 2. 数据库未初始化 ```bash # 重新初始化数据库 docker compose down postgres docker compose up -d postgres # 等待健康检查通过 docker compose ps postgres ``` ### 3. Air 热重载失败 ```bash # 清理临时文件 rm -rf tmp/ # 重新启动 Air air -c .air.toml # 检查 .air.toml 配置 cat .air.toml ``` --- ## Up 模式问题 ### 1. Backend 容器无法启动 ```bash # 查看容器日志 docker compose logs backend # 查看容器状态 docker compose ps # 重新构建镜像 make up-rebuild ``` ### 2. 镜像构建失败 ```bash # 清理 Docker 缓存 docker builder prune -a # 重新构建 docker compose build --no-cache backend # 检查 Dockerfile cat Dockerfile ``` ### 3. 容器健康检查失败 ```bash # 查看容器日志 docker compose logs backend # 手动执行健康检查 docker compose exec backend wget --no-verbose --tries=1 --spider http://localhost:8080/health # 检查 healthcheck 配置 docker compose config | grep -A 5 healthcheck ``` --- ## 数据库问题 ### 1. 数据库连接超时 ```bash # 检查数据库是否启动完成 docker compose ps postgres # 查看数据库日志 docker compose logs postgres # 手动测试连接 docker compose exec postgres pg_isready -U postgres # 等待更长时间 sleep 10 docker compose restart backend ``` ### 2. 数据丢失 ```bash # 检查数据卷 docker volume ls | grep postgres # 备份当前数据 docker compose exec postgres pg_dump -U postgres ocdp > backup.sql # 恢复数据 docker compose exec -T postgres psql -U postgres ocdp < backup.sql ``` ### 3. 权限问题 ```bash # 检查数据卷权限 docker volume inspect ocdp_postgres_data # 重新创建数据卷 docker compose down -v docker compose up -d postgres ``` --- ## 健康检查 ```bash # 服务健康检查 curl http://localhost:8080/health # 预期: {"status":"healthy"} # 数据库健康检查 # Docker 方式 docker compose exec postgres pg_isready -U postgres # 本地方式 pg_isready -h localhost -p 5432 -U postgres # 检查所有服务状态 docker compose ps ``` --- ## 资源监控 ```bash # 查看容器资源使用 docker stats # 查看磁盘使用 docker system df # 查看日志大小 du -sh $(docker inspect --format='{{.LogPath}}' ocdp-backend) du -sh $(docker inspect --format='{{.LogPath}}' ocdp-postgres) # 清理 Docker 资源 docker system prune -a --volumes ``` --- ## 完全重置 ### Mock 模式 ```bash # 清理临时文件 rm -rf tmp/ # 重新启动 make mock ``` ### Dev 模式 ```bash # 停止服务 docker compose down # 删除数据卷(⚠️ 数据丢失) docker compose down -v # 重新启动 make db-up make dev ``` ### Up 模式 ```bash # 停止所有服务 docker compose down # 删除数据卷(⚠️ 数据丢失) docker compose down -v # 清理 Docker 系统 docker system prune -a --volumes # 重新部署 make up ``` --- ## 服务访问地址 | 服务 | Mock | Dev | Up | 说明 | |------|------|-----|-----|------| | **Backend API** | http://localhost:8080/api/v1 | http://localhost:8080/api/v1 | http://localhost:8080/api/v1 | REST API | | **Health Check** | http://localhost:8080/health | http://localhost:8080/health | http://localhost:8080/health | 健康检查 | | **Swagger UI** | http://localhost:8080/api/docs | http://localhost:8080/api/docs | http://localhost:8080/api/docs | API 文档 | | **PostgreSQL** | - | localhost:5432 | localhost:5432 | 数据库 | --- ## 相关文档 - [架构文档](architecture.md) - 六边形架构、技术选型 - [API 与测试](api-and-test.md) - API 文档、测试指南 - [主 README](../README.md) - 项目概览 --- **Last Updated**: 2025-11-09 **Version**: v3.0.0