增加腾讯云生产 Docker 部署编排与一键脚本

- 提供 API/Web 多阶段镜像、Nginx 反代与 WS/文件路径
- docker-compose.prod 含 Postgres、MinIO、API、前端
- deploy.sh 生成密钥、构建启动、可选种子与备份脚本
This commit is contained in:
yml2213
2026-07-15 15:19:04 +08:00
parent 2b18d654b3
commit d744fc790c
8 changed files with 740 additions and 0 deletions
+126
View File
@@ -0,0 +1,126 @@
# 生产部署(Docker / 腾讯云 CVM
单机 Docker Compose 方案:`Nginx + API + PostgreSQL + MinIO`,适合腾讯云轻量/ CVM。
## 架构
```
Internet ──:80──▶ web(nginx)
├── / 前端 SPA
├── /api/* → api:8080(含 WebSocket
├── /health → api
└── /files/* → minio:9000/kefu(图片公共读)
```
## 服务器准备(腾讯云)
1. 购买 **CVM / 轻量应用服务器**(建议 2 核 4G 起,系统 Ubuntu 22.04
2. **安全组**放行:`22``80`(有证书再放 `443`
3. 安装 Docker
```bash
# Ubuntu 示例
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker "$USER"
# 重新登录后 docker 无需 sudo
docker compose version
```
4. 上传代码到服务器,例如:
```bash
git clone <你的仓库地址> kefu_sys
cd kefu_sys
```
## 一键部署
```bash
chmod +x deploy/scripts/*.sh
# 首次会生成 deploy/.env.prod 并提示你改域名/公网地址
./deploy/scripts/deploy.sh
# 需要演示账号时(kefu_admin / kefu_admin123 等)
./deploy/scripts/deploy.sh --seed
```
### 必改配置(`deploy/.env.prod`
| 变量 | 示例 | 说明 |
|------|------|------|
| `APP_BASE_URL` | `http://1.2.3.4``https://kefu.xx.com` | 浏览器访问根地址 |
| `STORAGE_PUBLIC_BASE_URL` | `http://1.2.3.4/files` | **必须**与 Nginx `/files` 一致 |
| `HTTP_PORT` | `80` | 宿主机端口 |
| `DB_PASSWORD` / `JWT_SECRET` / `STORAGE_*` | 强随机 | 脚本可自动生成密钥 |
脚本会校验占位符是否改掉。
### 常用命令
```bash
./deploy/scripts/deploy.sh --status # 状态
./deploy/scripts/deploy.sh --down # 停容器(保留卷)
./deploy/scripts/deploy.sh --seed-only # 仅跑种子
./deploy/scripts/backup-db.sh # 备份数据库到 ./backups
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod logs -f api
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod logs -f web
```
## HTTPS 建议(腾讯云)
任选其一:
1. **CLB / CDN** 终结 HTTPS,回源 CVM `80`(最简单)
2. 本机 **Caddy / Nginx + Lets Encrypt** 反代到本 compose 的 `80`
3.`web` 容器映射改到 `8080`,宿主机 Nginx 做 443 → 8080
配置 HTTPS 后,请同步把 `APP_BASE_URL``STORAGE_PUBLIC_BASE_URL` 改成 `https://…`
## 使用腾讯云 COS 替代 MinIO(可选)
1. 创建 COS 桶,开启公共读或使用 CDN 域名
2.`.env.prod` 配置 S3 兼容参数(见 `.env.prod.example` 注释)
3.`docker-compose.prod.yml` 中去掉 `minio` / `minio-init` 依赖,并修改 Nginx,去掉 `/files` 反代(图片直链 COS
当前一键脚本默认 **内置 MinIO**,零额外云产品即可跑通。
## 默认种子账号(仅 --seed 后)
| 角色 | 用户名 | 密码 |
|------|--------|------|
| 平台管理员 | `platform_admin` | `kefu_admin123` |
| 租户管理员 | `kefu_admin` | `kefu_admin123` |
| 坐席 | `agent1` 等 | `kefu_admin123` |
**上线后立即修改密码或关闭 seed 账号。**
## 目录说明
| 路径 | 说明 |
|------|------|
| `docker-compose.prod.yml` | 生产编排 |
| `deploy/docker/Dockerfile.api` | Go API 镜像 |
| `deploy/docker/Dockerfile.web` | 前端构建 + Nginx |
| `deploy/docker/nginx.conf` | 反代与 SPA |
| `deploy/.env.prod.example` | 环境变量模板 |
| `deploy/scripts/deploy.sh` | 一键部署 |
| `deploy/scripts/backup-db.sh` | 数据库备份 |
## 故障排查
| 现象 | 处理 |
|------|------|
| 页面 502 | `docker compose … logs api`,检查 DB 是否 healthy |
| 图片打不开 | 检查 `STORAGE_PUBLIC_BASE_URL` 是否为 `…/files`MinIO 桶是否 public download |
| WebSocket 断 | 确认走同源 `/api/ws`CLB 需开启 WebSocket/长连接 |
| 构建 Go 失败 | 服务器内存不足时加 swap,或本机 build 后 `docker save` 上传 |
## 升级
```bash
git pull
./deploy/scripts/deploy.sh # 重新 build 并滚动启动
./deploy/scripts/backup-db.sh # 升级前建议备份
```