重置项目上下文与规范文档
This commit is contained in:
@@ -1,455 +0,0 @@
|
||||
# 君鸿卡管系统 - 部署指南
|
||||
|
||||
本文档提供从零开始部署君鸿卡管系统到测试环境的完整步骤。
|
||||
|
||||
---
|
||||
|
||||
## 架构概览
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 部署架构图 │
|
||||
└───────────────────────────┬─────────────────────────────────────┘
|
||||
│
|
||||
┌───────────────────▼───────────────────┐
|
||||
│ 开发者 Push 代码到 Gitea │
|
||||
│ (main/dev/test 分支) │
|
||||
└───────────────────┬───────────────────┘
|
||||
│
|
||||
┌───────────────────▼───────────────────┐
|
||||
│ 部署服务器 (47.111.166.169) │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ Act Runner (docker-runner-01) │ │
|
||||
│ │ 自动触发工作流 │ │
|
||||
│ └───────────┬─────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────▼─────────────────────┐ │
|
||||
│ │ 构建 Docker 镜像 │ │
|
||||
│ │ - API 镜像 │ │
|
||||
│ │ - Worker 镜像 │ │
|
||||
│ └───────────┬─────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────▼─────────────────────┐ │
|
||||
│ │ Push 到私有 Docker Registry │ │
|
||||
│ │ registry.boss160.cn │ │
|
||||
│ └───────────┬─────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────▼─────────────────────┐ │
|
||||
│ │ 本地部署(无 SSH) │ │
|
||||
│ │ - Pull 镜像 │ │
|
||||
│ │ - 滚动更新容器 │ │
|
||||
│ │ - 清理旧镜像(保留 3 个) │ │
|
||||
│ └───────────┬─────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────▼─────────────────────┐ │
|
||||
│ │ 服务运行中 │ │
|
||||
│ │ - API: 0.0.0.0:3000 │ │
|
||||
│ │ - Worker: 后台任务处理 │ │
|
||||
│ └──────────────────────────────────┘ │
|
||||
└───────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**关键优势**:Act Runner 在部署服务器本地运行,无需 SSH,配置简单!
|
||||
|
||||
---
|
||||
|
||||
## 前置准备
|
||||
|
||||
### 1. 服务器环境要求
|
||||
|
||||
- **操作系统**:Ubuntu 20.04+ / CentOS 7+
|
||||
- **Docker**:20.10+
|
||||
- **Docker Compose**:1.29+
|
||||
- **内存**:至少 2GB
|
||||
- **磁盘**:至少 20GB
|
||||
- **Act Runner**:已部署并注册到 Gitea(✅ 你已经有了 docker-runner-01)
|
||||
|
||||
### 2. 外部依赖服务
|
||||
|
||||
系统依赖以下外部服务(需提前部署):
|
||||
|
||||
- **PostgreSQL 14+**:数据库
|
||||
- **Redis 6.0+**:缓存和队列
|
||||
|
||||
---
|
||||
|
||||
## 第一步:服务器初始化
|
||||
|
||||
### 1.1 确认 Docker 环境
|
||||
|
||||
```bash
|
||||
# SSH 到服务器
|
||||
ssh qycard001@47.111.166.169 -p 52022
|
||||
|
||||
# 验证 Docker 和 Docker Compose
|
||||
docker --version
|
||||
docker-compose --version
|
||||
|
||||
# 验证 Act Runner 正在运行
|
||||
docker ps | grep runner
|
||||
# 应该能看到 docker-runner-01
|
||||
```
|
||||
|
||||
### 1.2 创建部署目录
|
||||
|
||||
```bash
|
||||
# 创建部署目录
|
||||
mkdir -p /home/qycard001/app/junhong_cmp
|
||||
cd /home/qycard001/app/junhong_cmp
|
||||
|
||||
# 创建日志目录(配置已嵌入二进制文件,无需 configs 目录)
|
||||
mkdir -p logs
|
||||
```
|
||||
|
||||
### 1.3 配置说明
|
||||
|
||||
系统使用**嵌入式配置 + 环境变量覆盖**机制:
|
||||
|
||||
- 默认配置已编译在二进制文件中
|
||||
- 通过 `docker-compose.prod.yml` 中的环境变量覆盖配置
|
||||
- 环境变量前缀:`JUNHONG_`
|
||||
- 格式:`JUNHONG_{配置路径}`,路径分隔符用下划线替代点号
|
||||
|
||||
**无需手动创建配置文件**,所有配置在 `docker-compose.prod.yml` 的 `environment` 中管理。
|
||||
|
||||
### 1.4 部署文件
|
||||
|
||||
`docker-compose.prod.yml` 由 CI/CD 自动从代码仓库复制到部署目录,无需手动操作。
|
||||
|
||||
如需手动部署,可从代码仓库复制:
|
||||
|
||||
```bash
|
||||
# 方式1: 使用 Git
|
||||
git clone <你的仓库地址> temp
|
||||
cp temp/docker-compose.prod.yml ./docker-compose.prod.yml
|
||||
rm -rf temp
|
||||
|
||||
# 方式2: 从本地上传
|
||||
# scp -P 52022 docker-compose.prod.yml qycard001@47.111.166.169:/home/qycard001/app/junhong_cmp/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 第二步:配置 Gitea Secrets
|
||||
|
||||
详细步骤请参考 [Gitea Secrets 配置说明](./gitea-secrets-setup.md)。
|
||||
|
||||
**只需要配置 2 个 Secrets**(非常简单!):
|
||||
|
||||
| Secret 名称 | 值 |
|
||||
|------------|-----|
|
||||
| `REGISTRY_USERNAME` | `junhong_admin` |
|
||||
| `REGISTRY_PASSWORD` | `JunHong@2025!Registry` |
|
||||
|
||||
**配置步骤**:
|
||||
1. 进入 Gitea 仓库 → 设置 → Secrets
|
||||
2. 添加 `REGISTRY_USERNAME`,值为 `junhong_admin`
|
||||
3. 添加 `REGISTRY_PASSWORD`,值为 `JunHong@2025!Registry`
|
||||
4. 完成!
|
||||
|
||||
---
|
||||
|
||||
## 第三步:首次手动部署
|
||||
|
||||
在自动化 CI/CD 生效前,先进行一次手动部署验证环境。
|
||||
|
||||
### 3.1 登录 Docker Registry
|
||||
|
||||
```bash
|
||||
# 在服务器上执行
|
||||
ssh qycard001@47.111.166.169 -p 52022
|
||||
|
||||
docker login registry.boss160.cn -u junhong_admin
|
||||
# 输入密码:JunHong@2025!Registry
|
||||
```
|
||||
|
||||
### 3.2 手动构建镜像(可选)
|
||||
|
||||
如果 CI/CD 还未运行,可以手动构建:
|
||||
|
||||
```bash
|
||||
cd <代码仓库目录>
|
||||
|
||||
# 构建 API 镜像
|
||||
docker build -f Dockerfile.api -t registry.boss160.cn/junhong/cmp-fiber-api:latest .
|
||||
|
||||
# 构建 Worker 镜像
|
||||
docker build -f Dockerfile.worker -t registry.boss160.cn/junhong/cmp-fiber-worker:latest .
|
||||
|
||||
# 推送镜像
|
||||
docker push registry.boss160.cn/junhong/cmp-fiber-api:latest
|
||||
docker push registry.boss160.cn/junhong/cmp-fiber-worker:latest
|
||||
```
|
||||
|
||||
### 3.3 启动服务
|
||||
|
||||
```bash
|
||||
cd /home/qycard001/app/junhong_cmp
|
||||
|
||||
# 拉取镜像
|
||||
docker-compose -f docker-compose.prod.yml pull
|
||||
|
||||
# 启动服务
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose -f docker-compose.prod.yml ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose -f docker-compose.prod.yml logs -f
|
||||
```
|
||||
|
||||
### 3.4 验证部署
|
||||
|
||||
```bash
|
||||
# 测试 API 健康检查
|
||||
curl http://localhost:3000/health
|
||||
|
||||
# 预期输出:
|
||||
# {"code":0,"msg":"ok","data":{"status":"healthy"},"timestamp":1234567890}
|
||||
|
||||
# 查看容器状态
|
||||
docker ps | grep junhong
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 第四步:自动化部署
|
||||
|
||||
配置完成后,每次 Push 代码到 `main` / `dev` / `test` 分支时,会自动触发构建。
|
||||
|
||||
### 工作流触发规则
|
||||
|
||||
| 分支 | 镜像标签 | 是否自动部署 |
|
||||
|------|---------|------------|
|
||||
| `main` | `latest` | ✅ 是 |
|
||||
| `dev` | `dev` | ❌ 否(仅构建镜像)|
|
||||
| `test` | `test` | ❌ 否(仅构建镜像)|
|
||||
|
||||
### 触发自动部署
|
||||
|
||||
```bash
|
||||
# 在本地提交代码
|
||||
git add .
|
||||
git commit -m "测试自动部署"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### 监控部署进度
|
||||
|
||||
1. 在 Gitea 仓库页面点击 **Actions** 标签
|
||||
2. 查看最新的工作流运行状态
|
||||
3. 点击工作流查看详细日志
|
||||
|
||||
**预期日志输出**:
|
||||
```
|
||||
✅ 检出代码
|
||||
✅ 设置镜像标签: latest
|
||||
✅ 登录 Docker Registry
|
||||
✅ 构建 API 镜像
|
||||
✅ 构建 Worker 镜像
|
||||
✅ 推送镜像到 Registry
|
||||
✅ 部署到本地
|
||||
- 拉取最新镜像...
|
||||
- 执行滚动更新...
|
||||
- 等待服务健康检查...
|
||||
- 清理旧镜像(保留最近 3 个版本)...
|
||||
- 部署完成!
|
||||
✅ 构建结果通知
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 运维操作
|
||||
|
||||
### 查看服务日志
|
||||
|
||||
```bash
|
||||
cd /home/qycard001/app/junhong_cmp
|
||||
|
||||
# 查看 API 日志
|
||||
docker-compose -f docker-compose.prod.yml logs -f api
|
||||
|
||||
# 查看 Worker 日志
|
||||
docker-compose -f docker-compose.prod.yml logs -f worker
|
||||
|
||||
# 查看应用日志文件
|
||||
tail -f logs/app.log | jq .
|
||||
tail -f logs/access.log | jq .
|
||||
```
|
||||
|
||||
### 重启服务
|
||||
|
||||
```bash
|
||||
cd /home/qycard001/app/junhong_cmp
|
||||
|
||||
# 重启所有服务
|
||||
docker-compose -f docker-compose.prod.yml restart
|
||||
|
||||
# 重启单个服务
|
||||
docker-compose -f docker-compose.prod.yml restart api
|
||||
docker-compose -f docker-compose.prod.yml restart worker
|
||||
```
|
||||
|
||||
### 手动执行数据库迁移
|
||||
|
||||
```bash
|
||||
# 查看当前迁移版本;即使 API 未启动也可以执行
|
||||
docker compose -f docker-compose.prod.yml run --rm --entrypoint sh api -c '
|
||||
DB_URL="postgresql://${JUNHONG_DATABASE_USER}:${JUNHONG_DATABASE_PASSWORD}@${JUNHONG_DATABASE_HOST}:${JUNHONG_DATABASE_PORT}/${JUNHONG_DATABASE_DBNAME}?sslmode=${JUNHONG_DATABASE_SSLMODE}"
|
||||
migrate -path /app/migrations -database "$DB_URL" version
|
||||
'
|
||||
|
||||
# 在维护窗口人工执行迁移;容器正常启动不会自动迁移
|
||||
docker compose -f docker-compose.prod.yml run --rm --entrypoint sh api -c '
|
||||
DB_URL="postgresql://${JUNHONG_DATABASE_USER}:${JUNHONG_DATABASE_PASSWORD}@${JUNHONG_DATABASE_HOST}:${JUNHONG_DATABASE_PORT}/${JUNHONG_DATABASE_DBNAME}?sslmode=${JUNHONG_DATABASE_SSLMODE}"
|
||||
migrate -path /app/migrations -database "$DB_URL" up
|
||||
'
|
||||
```
|
||||
|
||||
### 回滚到旧版本
|
||||
|
||||
```bash
|
||||
cd /home/qycard001/app/junhong_cmp
|
||||
|
||||
# 查看可用镜像
|
||||
docker images | grep cmp-fiber
|
||||
|
||||
# 示例输出:
|
||||
# registry.boss160.cn/junhong/cmp-fiber-api latest abc123 2 hours ago 50MB
|
||||
# registry.boss160.cn/junhong/cmp-fiber-api def456 def456 1 day ago 50MB
|
||||
|
||||
# 修改 docker-compose.prod.yml 中的镜像标签
|
||||
# 将 :latest 改为具体的 commit SHA
|
||||
sed -i 's/:latest/:def456/g' docker-compose.prod.yml
|
||||
|
||||
# 重新部署
|
||||
docker-compose -f docker-compose.prod.yml pull
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
### 清理磁盘空间
|
||||
|
||||
```bash
|
||||
# 清理未使用的镜像
|
||||
docker image prune -a -f
|
||||
|
||||
# 清理未使用的容器
|
||||
docker container prune -f
|
||||
|
||||
# 清理未使用的卷
|
||||
docker volume prune -f
|
||||
|
||||
# 一键清理所有(谨慎使用)
|
||||
docker system prune -a -f --volumes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 容器启动失败,显示 "unhealthy"
|
||||
|
||||
**排查步骤**:
|
||||
1. 查看容器日志:`docker-compose -f docker-compose.prod.yml logs api`
|
||||
2. 检查 `docker-compose.prod.yml` 中的环境变量配置是否正确(数据库连接、Redis 连接)
|
||||
3. 确认外部依赖(PostgreSQL、Redis)是否可访问
|
||||
4. 手动测试健康检查:`curl http://localhost:3000/health`
|
||||
|
||||
### Q2: 数据库迁移失败
|
||||
|
||||
**可能原因**:
|
||||
- 数据库连接信息错误
|
||||
- 迁移文件损坏
|
||||
- 数据库权限不足
|
||||
|
||||
**解决方法**:
|
||||
```bash
|
||||
# 检查 .env 文件配置
|
||||
cat /home/qycard001/app/junhong_cmp/.env
|
||||
|
||||
# 手动测试数据库连接
|
||||
docker run --rm postgres:14 psql "postgresql://erp_pgsql:erp_2025@cxd.whcxd.cn:16159/junhong_cmp_test?sslmode=disable" -c "SELECT 1;"
|
||||
|
||||
# 查看迁移日志
|
||||
docker logs junhong-cmp-api | grep migrate
|
||||
```
|
||||
|
||||
### Q3: CI/CD 工作流失败
|
||||
|
||||
**常见原因**:
|
||||
1. **Secrets 未配置或错误**:检查 Gitea Secrets 是否配置了 `REGISTRY_USERNAME` 和 `REGISTRY_PASSWORD`
|
||||
2. **Registry 认证失败**:验证用户名密码是否正确
|
||||
3. **磁盘空间不足**:执行 `df -h` 检查磁盘空间
|
||||
|
||||
**排查方法**:
|
||||
- 在 Gitea Actions 页面查看详细日志
|
||||
- 在服务器上手动测试 Registry 登录:`docker login registry.boss160.cn -u junhong_admin`
|
||||
|
||||
### Q4: 镜像拉取慢或超时
|
||||
|
||||
**解决方法**:
|
||||
```bash
|
||||
# 检查 Registry 连接
|
||||
curl -I https://registry.boss160.cn
|
||||
|
||||
# 检查网络
|
||||
ping registry.boss160.cn
|
||||
|
||||
# 查看 Docker 日志
|
||||
journalctl -u docker -f
|
||||
```
|
||||
|
||||
### Q5: Act Runner 权限问题
|
||||
|
||||
**问题现象**:工作流报错 `permission denied` 或 `cannot connect to Docker daemon`
|
||||
|
||||
**解决方法**:
|
||||
```bash
|
||||
# 确认 Act Runner 用户在 docker 组中
|
||||
docker exec -it docker-runner-01 groups
|
||||
|
||||
# 如果缺少 docker 组,重启 Act Runner 容器
|
||||
docker restart docker-runner-01
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **定期更新**:
|
||||
- 定期更新 Docker 和 Docker Compose
|
||||
- 及时应用系统安全补丁
|
||||
|
||||
2. **防火墙配置**:
|
||||
```bash
|
||||
# 仅开放必要端口
|
||||
sudo ufw allow 52022/tcp # SSH
|
||||
sudo ufw allow 3000/tcp # API(如果需要外部访问)
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
3. **日志监控**:
|
||||
- 配置日志轮转,防止磁盘占满
|
||||
- 定期审查访问日志和错误日志
|
||||
|
||||
4. **备份策略**:
|
||||
- 定期备份数据库
|
||||
- 定期备份 `docker-compose.prod.yml`(包含所有配置)
|
||||
|
||||
---
|
||||
|
||||
## 下一步
|
||||
|
||||
部署完成后:
|
||||
1. ✅ 配置域名和反向代理(Nginx / Caddy)
|
||||
2. ✅ 启用 HTTPS(Let's Encrypt)
|
||||
3. ✅ 配置监控和告警(Prometheus + Grafana)
|
||||
4. ✅ 设置自动备份脚本
|
||||
|
||||
---
|
||||
|
||||
## 支持
|
||||
|
||||
如有问题,请联系运维团队或提交 Issue。
|
||||
@@ -1,114 +0,0 @@
|
||||
# Gitea Secrets 配置说明
|
||||
|
||||
本文档说明如何在 Gitea 中配置 CI/CD 工作流所需的 Secrets(密钥)。
|
||||
|
||||
## 重要说明
|
||||
|
||||
因为 Act Runner 运行在部署服务器本地,所以**不需要 SSH 连接**,配置非常简单!
|
||||
|
||||
---
|
||||
|
||||
## 配置步骤
|
||||
|
||||
### 1. 进入仓库设置
|
||||
|
||||
1. 打开你的 Gitea 仓库页面
|
||||
2. 点击右上角的 **设置(Settings)** 按钮
|
||||
3. 在左侧菜单中找到 **Secrets** 或 **密钥** 选项
|
||||
|
||||
### 2. 添加以下 Secrets
|
||||
|
||||
点击 **添加 Secret** 按钮,逐个添加以下密钥:
|
||||
|
||||
#### Docker Registry 认证信息
|
||||
|
||||
| Secret 名称 | 值 | 说明 |
|
||||
|------------|-----|------|
|
||||
| `REGISTRY_USERNAME` | `junhong_admin` | Docker Registry 用户名 |
|
||||
| `REGISTRY_PASSWORD` | `JunHong@2025!Registry` | Docker Registry 密码 |
|
||||
|
||||
**就这么简单!只需要 2 个 Secrets!** ✅
|
||||
|
||||
---
|
||||
|
||||
## 配置完成检查清单
|
||||
|
||||
- [ ] `REGISTRY_USERNAME` 已配置
|
||||
- [ ] `REGISTRY_PASSWORD` 已配置
|
||||
|
||||
---
|
||||
|
||||
## 验证配置
|
||||
|
||||
### 测试 Registry 登录
|
||||
|
||||
在部署服务器上手动测试 Registry 连接:
|
||||
|
||||
```bash
|
||||
# 登录测试
|
||||
docker login registry.boss160.cn -u junhong_admin
|
||||
# 输入密码:JunHong@2025!Registry
|
||||
|
||||
# 预期输出:Login Succeeded
|
||||
```
|
||||
|
||||
如果登录成功,说明配置正确。
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 工作流显示 "secret not found"
|
||||
|
||||
**原因**:Secret 名称拼写错误或未添加
|
||||
|
||||
**解决方法**:
|
||||
1. 检查 Secret 名称是否完全一致(区分大小写)
|
||||
2. 确认 2 个 Secrets 都已添加
|
||||
|
||||
### Q2: Registry 登录失败
|
||||
|
||||
**原因**:用户名或密码错误
|
||||
|
||||
**解决方法**:
|
||||
```bash
|
||||
# 在服务器上手动测试登录
|
||||
docker login registry.boss160.cn -u junhong_admin
|
||||
# 输入密码:JunHong@2025!Registry
|
||||
|
||||
# 如果失败,检查 Registry 认证配置
|
||||
cat /home/qycard001/registry/auth/htpasswd
|
||||
```
|
||||
|
||||
### Q3: 为什么不需要 SSH 密钥?
|
||||
|
||||
**回答**:因为你的 Act Runner (`docker-runner-01`) 运行在部署服务器本地,可以直接执行 `docker-compose` 命令,不需要通过 SSH 连接到其他机器。
|
||||
|
||||
**架构示意**:
|
||||
```
|
||||
┌──────────────────────────────────────────┐
|
||||
│ 部署服务器 (47.111.166.169) │
|
||||
│ │
|
||||
│ ┌────────────────┐ ┌───────────────┐ │
|
||||
│ │ Act Runner │──→│ Docker Daemon │ │
|
||||
│ │(docker-runner) │ │ │ │
|
||||
│ └────────────────┘ └───────────────┘ │
|
||||
│ ↓ ↓ │
|
||||
│ 执行工作流 部署容器 │
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
1. **绝不**在代码中硬编码密钥信息
|
||||
2. **定期更换** Registry 密码
|
||||
3. **监控** Gitea Actions 日志,防止密钥泄露
|
||||
4. 如果 Secrets 泄露,**立即**更换密码
|
||||
|
||||
---
|
||||
|
||||
## 下一步
|
||||
|
||||
配置完成后,参考 [部署指南](./deployment-guide.md) 进行首次部署。
|
||||
@@ -1,328 +0,0 @@
|
||||
# 生产数据库手工上线流程
|
||||
|
||||
## 1. 适用场景
|
||||
|
||||
本文档用于君鸿卡管系统**首次生产上线**时的数据库初始化,目标是:
|
||||
|
||||
1. **不依赖应用启动自动建表**
|
||||
2. **人工创建生产库和表结构**
|
||||
3. **人工导入基础数据**
|
||||
4. **人工对齐 `schema_migrations` 版本**
|
||||
5. 后续继续沿用 `migrations/` 中的新增迁移
|
||||
|
||||
> 截至 **2026-05-06**,仓库内最新迁移版本为 **140**。
|
||||
> 当前仓库缺少可直接用于“全新环境从 0 建表”的 `000114_squash_baseline`,因此首次生产上线建议走“**手工 schema 基线 + 手工基础数据导入 + 手工迁移版本对齐**”。
|
||||
|
||||
---
|
||||
|
||||
## 2. 上线原则
|
||||
|
||||
### 2.1 本次建议做的事
|
||||
|
||||
1. 从你确认过的**源库**生成一份生产首发 schema 基线 SQL
|
||||
2. 在生产环境手工创建空数据库
|
||||
3. 手工执行 schema 基线 SQL 建表
|
||||
4. 导入基础数据
|
||||
5. 手工写入 `schema_migrations=140`
|
||||
6. 启动 API / Worker
|
||||
|
||||
### 2.2 本次不建议做的事
|
||||
|
||||
1. 不依赖应用自动建表
|
||||
2. 不直接把当前活跃 `migrations/` 当作全新建库链路执行
|
||||
3. 不把业务数据表(订单、卡、设备、钱包流水等)从测试库整库导入生产
|
||||
4. 不直接复用测试环境里的密钥、回调地址、商户配置而不做复核
|
||||
|
||||
---
|
||||
|
||||
## 3. 基础数据范围
|
||||
|
||||
### 3.1 建议导入的非敏感基础数据
|
||||
|
||||
以下表建议从已确认的源库导出,再导入生产库:
|
||||
|
||||
1. `tb_permission`
|
||||
2. `tb_role`
|
||||
3. `tb_role_permission`
|
||||
4. `tb_carrier`
|
||||
5. `tb_commission_withdrawal_setting`
|
||||
6. `tb_polling_config`
|
||||
7. `tb_polling_concurrency_config`
|
||||
8. `tb_polling_alert_rule`
|
||||
9. `tb_data_cleanup_config`
|
||||
|
||||
### 3.2 建议单独处理的敏感基础数据
|
||||
|
||||
以下表包含支付、公众号、小程序、证书、密钥等敏感信息,建议单独导出或手工填充:
|
||||
|
||||
1. `tb_wechat_config`
|
||||
|
||||
### 3.3 不建议首发直接导入的数据
|
||||
|
||||
以下数据不属于“生产首发基础数据”,通常不要从测试库带入生产:
|
||||
|
||||
1. `tb_account`
|
||||
2. `tb_account_role`
|
||||
3. `tb_shop`
|
||||
4. `tb_enterprise`
|
||||
5. `tb_iot_card`
|
||||
6. `tb_device`
|
||||
7. `tb_order`
|
||||
8. 各类钱包、流水、日志、审计、导入任务表
|
||||
|
||||
---
|
||||
|
||||
## 4. 关于表结构基线
|
||||
|
||||
### 4.1 建议默认排除的确认遗留表
|
||||
|
||||
以下两张表已具备明确“遗留/保留历史”的语义,生成生产首发 schema 基线时建议默认排除:
|
||||
|
||||
1. `tb_data_usage_record`
|
||||
2. `tb_card_replacement_record_legacy`
|
||||
|
||||
### 4.2 建议保守保留、后续再评估的表
|
||||
|
||||
以下表当前在代码里的活跃引用较少或暂无数据,但仍不建议在首次生产上线时贸然删除,先按兼容方式保留更稳:
|
||||
|
||||
1. `tb_card_replacement_request`
|
||||
2. `tb_number_card`
|
||||
3. `tb_payment_merchant_setting`
|
||||
4. `tb_dev_capability_config`
|
||||
|
||||
---
|
||||
|
||||
## 5. 交付文件
|
||||
|
||||
本目录对应的手工上线辅助文件位于:
|
||||
|
||||
`scripts/manual_db_release/`
|
||||
|
||||
按执行顺序主要包括:
|
||||
|
||||
1. `01_create_database.sql`
|
||||
2. `02_generate_schema_baseline.sh`
|
||||
3. `03_export_base_data_from_source.sh`
|
||||
4. `04_import_base_data_into_target.sh`
|
||||
5. `05_repair_base_data_sequences.sql`
|
||||
6. `06_mark_schema_migrations.sql`
|
||||
7. `07_verify_manual_release.sql`
|
||||
|
||||
---
|
||||
|
||||
## 6. 手工上线步骤
|
||||
|
||||
## 6.1 第一步:确定源库
|
||||
|
||||
源库应满足:
|
||||
|
||||
1. 结构版本已确认正确
|
||||
2. 基础配置完整
|
||||
3. 权限、角色、运营商、轮询配置经过业务验收
|
||||
|
||||
建议不要临时选一个“有人随手改过但未复核”的测试库。
|
||||
|
||||
---
|
||||
|
||||
## 6.2 第二步:手工创建生产数据库
|
||||
|
||||
先修改:
|
||||
|
||||
`scripts/manual_db_release/01_create_database.sql`
|
||||
|
||||
将其中的占位符替换为:
|
||||
|
||||
1. `__DB_NAME__`
|
||||
2. `__DB_USER__`
|
||||
3. `__DB_PASSWORD__`
|
||||
|
||||
然后执行:
|
||||
|
||||
```bash
|
||||
psql "postgres://postgres:你的密码@生产PG主机:5432/postgres?sslmode=disable" \
|
||||
-f scripts/manual_db_release/01_create_database.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6.3 第三步:生成 schema 基线 SQL
|
||||
|
||||
使用脚本:
|
||||
|
||||
```bash
|
||||
SOURCE_DSN="postgres://源库账号:源库密码@源库主机:5432/源库名?sslmode=disable" \
|
||||
OUTPUT_SQL="/你的目录/00_schema_baseline.sql" \
|
||||
bash scripts/manual_db_release/02_generate_schema_baseline.sh
|
||||
```
|
||||
|
||||
默认会排除:
|
||||
|
||||
1. `schema_migrations`
|
||||
2. `tb_data_usage_record`
|
||||
3. `tb_card_replacement_record_legacy`
|
||||
|
||||
生成后请人工复核一次:
|
||||
|
||||
1. 是否包含你确认不需要的历史表
|
||||
2. 是否错误带入测试专用对象
|
||||
3. 是否包含意外的 `OWNER TO`
|
||||
4. 是否包含不应该进入生产的注释性对象
|
||||
|
||||
---
|
||||
|
||||
## 6.4 第四步:在生产库执行 schema 基线
|
||||
|
||||
```bash
|
||||
psql "postgres://junhong_cmp:CtCom1zBzPQbpVNf3rCNxH@cxd.whcxd.cn:16159/junhong_cmp_prod?sslmode=disable" \
|
||||
-v ON_ERROR_STOP=1 \
|
||||
-f /你的目录/00_schema_baseline.sql
|
||||
```
|
||||
|
||||
执行后先不要急着启动应用,先导入基础数据。
|
||||
|
||||
---
|
||||
|
||||
## 6.5 第五步:导出基础数据
|
||||
|
||||
导出非敏感基础数据:
|
||||
|
||||
```bash
|
||||
SOURCE_DSN="postgres://erp_pgsql:erp_2025@cxd.whcxd.cn:16159/junhong_cmp_test?sslmode=disable" \
|
||||
bash scripts/manual_db_release/03_export_base_data_from_source.sh
|
||||
```
|
||||
|
||||
如需连同微信配置一起导出:
|
||||
|
||||
```bash
|
||||
SOURCE_DSN="postgres://erp_pgsql:erp_2025@cxd.whcxd.cn:16159/junhong_cmp_test?sslmode=disable" \
|
||||
INCLUDE_SENSITIVE=1 \
|
||||
bash scripts/manual_db_release/03_export_base_data_from_source.sh
|
||||
```
|
||||
|
||||
导出结果会放到:
|
||||
|
||||
`scripts/manual_db_release/generated/`
|
||||
|
||||
> 注意:`generated/` 下的 SQL 可能包含密钥和证书内容,不要提交到 Git。
|
||||
|
||||
---
|
||||
|
||||
## 6.6 第六步:导入基础数据
|
||||
|
||||
在生产库执行:
|
||||
|
||||
```bash
|
||||
TARGET_DSN="postgres://junhong_cmp:CtCom1zBzPQbpVNf3rCNxH@cxd.whcxd.cn:16159/junhong_cmp_prod?sslmode=disable" \
|
||||
bash scripts/manual_db_release/04_import_base_data_into_target.sh
|
||||
```
|
||||
|
||||
如需导入敏感配置:
|
||||
|
||||
```bash
|
||||
TARGET_DSN="postgres://生产库账号:生产库密码@生产库主机:5432/生产库名?sslmode=disable" \
|
||||
INCLUDE_SENSITIVE=1 \
|
||||
bash scripts/manual_db_release/04_import_base_data_into_target.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6.7 第七步:修正序列值
|
||||
|
||||
```bash
|
||||
psql "postgres://junhong_cmp:CtCom1zBzPQbpVNf3rCNxH@cxd.whcxd.cn:16159/junhong_cmp_prod?sslmode=disable" \
|
||||
-v ON_ERROR_STOP=1 \
|
||||
-f scripts/manual_db_release/05_repair_base_data_sequences.sql
|
||||
```
|
||||
|
||||
这一步用于避免显式插入 ID 后,自增序列仍停留在旧值。
|
||||
|
||||
---
|
||||
|
||||
## 6.8 第八步:手工对齐迁移版本
|
||||
|
||||
```bash
|
||||
psql "postgres://生产库账号:生产库密码@生产库主机:5432/生产库名?sslmode=disable" \
|
||||
-v ON_ERROR_STOP=1 \
|
||||
-f scripts/manual_db_release/06_mark_schema_migrations.sql
|
||||
```
|
||||
|
||||
执行后,生产库会被视为已处于 `140` 版本。
|
||||
后续如果仓库新增 `141+` 迁移,就可以继续正常执行 `migrate up`。
|
||||
|
||||
> 如果你上线时仓库最新迁移版本已经不是 `140`,记得同步修改 `06_mark_schema_migrations.sql`。
|
||||
|
||||
---
|
||||
|
||||
## 6.9 第九步:上线前校验
|
||||
|
||||
```bash
|
||||
psql "postgres://生产库账号:生产库密码@生产库主机:5432/生产库名?sslmode=disable" \
|
||||
-f scripts/manual_db_release/07_verify_manual_release.sql
|
||||
```
|
||||
|
||||
重点关注:
|
||||
|
||||
1. `schema_migrations.version=140`
|
||||
2. 权限、角色、角色权限数量不为 0
|
||||
3. 运营商配置数量不为 0
|
||||
4. 轮询配置数量不为 0
|
||||
5. `tb_wechat_config` 是否按预期导入
|
||||
|
||||
---
|
||||
|
||||
## 6.10 第十步:启动应用
|
||||
|
||||
确认以下环境变量改为生产值:
|
||||
|
||||
1. `JUNHONG_DATABASE_HOST`
|
||||
2. `JUNHONG_DATABASE_PORT`
|
||||
3. `JUNHONG_DATABASE_USER`
|
||||
4. `JUNHONG_DATABASE_PASSWORD`
|
||||
5. `JUNHONG_DATABASE_DBNAME`
|
||||
6. `JUNHONG_REDIS_*`
|
||||
7. `JUNHONG_JWT_SECRET_KEY`
|
||||
|
||||
特别注意:
|
||||
|
||||
1. 当前仓库里的 `docker-compose.prod.yml` 示例仍是测试库参数,不能原样直接用于生产
|
||||
2. 如果生产库里没有超级管理员账号,应用启动时会自动创建一个超级管理员账号
|
||||
3. 如不希望使用默认超管账号,请提前设置 `JUNHONG_DEFAULT_ADMIN_USERNAME`、`JUNHONG_DEFAULT_ADMIN_PASSWORD`、`JUNHONG_DEFAULT_ADMIN_PHONE`
|
||||
|
||||
---
|
||||
|
||||
## 7. 推荐执行顺序汇总
|
||||
|
||||
```text
|
||||
手工创建生产库
|
||||
-> 生成 schema 基线 SQL
|
||||
-> 执行 schema 基线 SQL
|
||||
-> 导出基础数据
|
||||
-> 导入基础数据
|
||||
-> 修正序列
|
||||
-> 写入 schema_migrations=140
|
||||
-> 校验
|
||||
-> 启动 API / Worker
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 风险提醒
|
||||
|
||||
### 8.1 关于 `tb_wechat_config`
|
||||
|
||||
该表包含敏感配置,建议:
|
||||
|
||||
1. 单独导出
|
||||
2. 单独传输
|
||||
3. 单独审批
|
||||
4. 导入后立刻校验回调地址、商户号、证书内容
|
||||
|
||||
### 8.2 关于账号初始化
|
||||
|
||||
本次流程**不建议**直接从测试库导入 `tb_account`。
|
||||
首发生产环境建议只导入权限体系和系统配置,让生产超管账号在受控条件下独立创建。
|
||||
|
||||
### 8.3 关于后续迁移
|
||||
|
||||
本次只是首次生产上线的“人工基线落地”。
|
||||
后续版本发布仍应继续补齐正式的 `000114_squash_baseline`,避免长期依赖手工基线流程。
|
||||
Reference in New Issue
Block a user