Files

132 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ubuntu 26.04 LTS 单机部署包
本目录用于把乐活公益平台部署到一台已安装 Ubuntu 26.04 LTS 的云服务器。Docker 官方已将 Ubuntu 26.04(Resolute)列为 Docker Engine 支持系统:<https://docs.docker.com/engine/install/ubuntu/>。
该部署包适合初期单机 staging/production:
- 管理后台与 API:`https://PUBLIC_HOST`
- 私有对象存储签名访问:`https://FILES_HOST`
- 仅向宿主机发布 `80/443`;MySQL、Redis、MinIO 与 API 不发布主机端口
- MySQL 8.4、Redis 7.4、MinIO、NestJS API、Vue 管理后台/Nginx 均使用 Docker Compose
- 数据、对象和 Redis 使用独立持久卷
- 自动 migration、上线前备份、HTTPS 冒烟、不可变 Git 提交标签和应用回滚
- 每日 MySQL 备份、SHA-256 校验、30 天本机保留;异地加密同步仍须由运维配置
这不是“已完成生产上线”的证明。真实域名/备案、TLS、微信配置、隐私材料、staging、UAT、告警接收人和异地备份仍是发布阻断项。
## 1. 云服务器准备
建议最低资源:4 vCPU、8 GiB 内存、100 GiB SSD;测试环境可降低,但生产容量必须以压测结果为准。云安全组仅开放:
- SSH 管理端口(优先限制管理 IP,端口以服务器实际配置为准)
- TCP 80(TLS 跳转/证书验证)
- TCP 443(管理后台、API、小程序请求与签名文件上传)
不要开放 3000、3306、6379、9000 或 9001。Docker 发布端口可能绕过 UFW 规则,因此本 Compose 只发布 80/443;仍需用云安全组做外层限制。
为以下两个不同域名配置 A/AAAA 记录到服务器,并准备覆盖二者的证书(双域名 SAN 或通配证书):
- `admin.example.com`:管理后台和 API
- `files.example.com`:私有对象存储签名上传/下载
## 2. 放置代码与安装 Docker
```bash
sudo install -d -m 0755 /opt/lehuo
sudo git clone --branch main https://gitee.com/climber-ge/wechatapp.git /opt/lehuo/app
cd /opt/lehuo/app
sudo bash ./infra/ubuntu/scripts/install-docker.sh
```
安装脚本严格检查 Ubuntu 26.04,使用 Docker 官方 apt 仓库,并且不会自动卸载已有容器运行时,也不会自动把普通用户加入等同 root 权限的 `docker` 用户组。
## 3. 生成生产环境文件
```bash
cd /opt/lehuo/app
sudo bash ./infra/ubuntu/scripts/generate-env.sh \
--public-host admin.example.com \
--files-host files.example.com
sudo install -m 0600 /path/to/fullchain.pem /opt/lehuo/shared/tls/fullchain.pem
sudo install -m 0600 /path/to/privkey.pem /opt/lehuo/shared/tls/privkey.pem
```
生成结果位于 `/etc/lehuo/lehuo.env`,权限为 `600`,包含随机数据库密码、Redis 密码、对象存储密钥、会话 pepper、审计 HMAC key 和 32 字节 Base64 字段加密密钥。不要提交、复制到聊天、工单或普通日志。
首次部署时微信参数可以保持空值且 `NOTIFICATION_WORKER_ENABLED=false`。取得有效 AppID/AppSecret 和全部模板后再填入真实值并重新部署,禁止使用测试值冒充成功。
如果不用自带 MinIO 而使用腾讯 COS 或其他 S3 兼容私有对象存储,应单独评审并修改 Compose 服务,同时保持 Adapter、私有 Bucket、短期签名 URL、最小权限密钥与 CORS 边界。
## 4. 预检与首次部署
```bash
cd /opt/lehuo/app
sudo bash ./infra/ubuntu/scripts/preflight.sh /etc/lehuo/lehuo.env
sudo bash ./infra/ubuntu/scripts/deploy.sh /etc/lehuo/lehuo.env
sudo bash ./infra/ubuntu/scripts/bootstrap-admin.sh /etc/lehuo/lehuo.env
```
`deploy.sh` 固定执行:预检 → 以 Git 提交号构建不可变镜像 → 启动数据服务 → 初始化私有 Bucket/CORS/版本控制 →(已有版本时)迁移前备份 → Prisma migration → 部署 API/Nginx → HTTPS/ready/对象存储冒烟。
初始管理员脚本从终端隐藏读取密码,不写入环境文件或 shell history;数据库已有后台凭据时服务端会拒绝重复初始化。
## 5. 小程序生产地址
在提审的小程序代码中把 `apps/miniprogram/miniprogram/app.ts` 的 `apiBaseUrl` 改为:
```text
https://admin.example.com
```
并在微信公众平台配置 request 合法域名 `https://admin.example.com`,uploadFile/downloadFile 合法域名 `https://files.example.com`。体验版/正式版会拒绝 localhost、`0.0.0.0` 和非 HTTPS 地址。
## 6. 备份与恢复演练
```bash
sudo bash ./infra/ubuntu/scripts/install-backup-timer.sh
sudo systemctl start lehuo-backup.service
sudo journalctl -u lehuo-backup.service --since today
# 恢复到隔离数据库做演练,不覆盖生产库
sudo bash ./infra/ubuntu/scripts/restore.sh \
/opt/lehuo/backups/lehuo-YYYYMMDDTHHMMSSZ.sql.gz \
lehuo_restore_test --confirm lehuo_restore_test
```
备份文件与 `.sha256` 必须同步到异地加密存储。每季度至少在隔离数据库完成一次恢复演练,核对表数量、关键事实行数、耗时并留存记录。
## 7. 升级与回滚
```bash
cd /opt/lehuo/app
sudo git fetch --all --prune
sudo git switch main
sudo git pull --ff-only
# 把 IMAGE_TAG 更新为本次批准的完整/短 Git commit;禁止 latest
sudo editor /etc/lehuo/lehuo.env
sudo bash ./infra/ubuntu/scripts/deploy.sh /etc/lehuo/lehuo.env
```
应用异常且 migration 向后兼容时:
```bash
sudo bash ./infra/ubuntu/scripts/rollback.sh /etc/lehuo/lehuo.env
```
回滚脚本只切换本机仍存在的上一版 API/管理后台镜像,不回滚数据库。若 migration 不向后兼容,必须停止发布并按已审批的数据库恢复方案处理,不能盲目执行应用回滚。
## 8. 日常检查
```bash
cd /opt/lehuo/app
sudo docker compose --project-directory infra/ubuntu \
--env-file /etc/lehuo/lehuo.env -f infra/ubuntu/compose.yaml ps
curl -fsS https://admin.example.com/health/live
curl -fsS https://admin.example.com/health/ready
sudo docker system df
sudo systemctl status lehuo-backup.timer
```
日志中禁止输出 token、完整手机号、证件、详细地址、儿童信息或服务描述。容器日志轮转、CPU/内存/磁盘/API 5xx/P95、数据库连接、通知死信和备份缺失告警需接入实际有人值守的监控渠道。