merge: 集成V2.8 生产硬化与运维闭环

# Conflicts:
#	.gitignore
#	docs/deployment.md
#	docs/roadmap.md
#	package.json
This commit is contained in:
2026-07-08 18:15:07 +08:00
30 changed files with 1895 additions and 43 deletions

View File

@@ -175,12 +175,13 @@ cp .env.production.example .env.production
5. 执行 `docker compose --env-file .env.production -f docker-compose.prod.yml pull web server` 拉取本次 SHA 镜像。
6. 启动数据库与 Redis执行 `pnpm --filter server db:deploy`
7. 执行 `docker compose --env-file .env.production -f docker-compose.prod.yml up -d --remove-orphans` 重启服务。
8. 通过 `/api/v1/health/version` 校验运行中的后端版本是否等于本次 commit SHA。
8. 运行发布 smoke test校验 `/api/v1/health/version`、前端首页、产品页、产品 API、V2.2 读路径和 AI 配置端点,并确认运行中的后端版本等于本次 commit SHA。
如果最后一步失败Actions 会红掉,说明“代码已合并”不等于“线上容器已更新”。本地或服务器也可以手工运行:
如果最后一步失败Actions 会红掉,说明“代码已合并”不等于“线上容器已更新”或关键读路径不可用。本地或服务器也可以手工运行:
```bash
pnpm deploy:check-runtime http://localhost/api/v1/health/version <expected-commit-sha>
pnpm deploy:smoke -- --base-url http://localhost --expected-version <expected-commit-sha>
```
## Nginx 路由
@@ -193,6 +194,30 @@ pnpm deploy:check-runtime http://localhost/api/v1/health/version <expected-commi
生产 Compose 默认只监听 HTTP 80。HTTPS 建议优先交给云负载均衡、CDN 或宿主机外层证书管理工具;如果要让本 Compose 内的 Nginx 直接处理 HTTPS可以在后续增加证书 volume 和 443 server block。
## 监控与告警基线
V2.8 提供可选 `monitoring` profile不影响默认生产启动。启用前先在 `.env.production` 设置 `GRAFANA_ADMIN_PASSWORD`,不要使用示例密码对外暴露 Grafana。
```bash
docker compose --env-file .env.production -f docker-compose.prod.yml --profile monitoring up -d
```
默认入口:
- Prometheus: `http://localhost:9090`
- Grafana: `http://localhost:3002`
配置目录在 `deploy/monitoring/`。基线覆盖:
- `FtbPostgresDown`PostgreSQL 不可用。
- `FtbDiskPressure`:宿主机根分区低于 15% 可用空间。
- `FtbSlowApiLogBurst`:服务端慢 API 日志在 10 分钟内超过阈值。
- `FtbSlowPrismaLogBurst`:慢 Prisma 查询日志在 10 分钟内超过阈值。
- `FtbJobFailureLogBurst`AppData 同步、AI 调用或后台任务失败日志出现。
- `FtbXiaobaoSummaryStale``xiaobao_risk_summaries` 存在 dirty 或超过 6 小时未更新的摘要。
Prometheus 只加载本地规则,不提交真实通知密钥。接入 Slack、企业微信、邮件等通知时把 Alertmanager receiver 放在未跟踪的服务器文件或环境变量中。
## 数据持久化
生产 Compose 使用三个命名 volume
@@ -235,6 +260,76 @@ pnpm consistency:v25 -- --url http://localhost/api/v1/consistency
- `warn` 需要记录原因;历史数据没有审计事件属于预期 warning不阻断 V2.5。
- 后台页面 `/admin/consistency` 展示同一份报告,需要当前用户具备 `consistency:view`
## 备份与恢复
备份分两类PostgreSQL 业务数据和 `server_data` volume 中的运行时配置。真实备份文件默认写到 `backups/`,该目录已加入 `.gitignore`,不要把 dump 或 tar 包提交到仓库。
先演练命令,不写文件:
```bash
pnpm backup:postgres -- --dry-run --env-file .env.production
pnpm backup:server-data -- --dry-run --env-file .env.production
```
执行正式备份:
```bash
pnpm backup:postgres -- --env-file .env.production
pnpm backup:server-data -- --env-file .env.production
```
PostgreSQL 备份使用 `pg_dump --format=custom --no-owner --no-acl`,便于跨环境恢复。`server_data` 备份使用只读 volume mount 和 `tar -czf`,覆盖 AI Provider 配置等后端运行时文件。
恢复数据库必须显式确认覆盖。默认命令会拒绝执行,防止误删现有库:
```bash
pnpm restore:postgres -- --env-file .env.production --input backups/postgres/ftb_pm-postgres-20260708T120000Z.dump
```
确认要把目标数据库重建为 fresh DB 后,再运行:
```bash
pnpm restore:postgres -- \
--env-file .env.production \
--input backups/postgres/ftb_pm-postgres-20260708T120000Z.dump \
--confirm-overwrite
```
恢复前建议先 dry-run 看清将执行的 `psql/dropdb/createdb/pg_restore` 步骤:
```bash
pnpm restore:postgres -- \
--dry-run \
--confirm-overwrite \
--env-file .env.production \
--input backups/postgres/ftb_pm-postgres-20260708T120000Z.dump
```
如果要恢复到临时库做校验,不覆盖当前生产库:
```bash
pnpm restore:postgres -- \
--env-file .env.production \
--input backups/postgres/ftb_pm-postgres-20260708T120000Z.dump \
--target-db ftb_pm_restore_check \
--confirm-overwrite
```
## 运维 Runbooks
生产发布、迁移和异常处置优先使用这些手册:
- `docs/runbooks/migration-rollback.md`:发布失败、迁移失败、数据恢复和镜像回滚。
- `docs/runbooks/appdata-retirement.md`AppData key 分阶段退场、双读核对、归档和回滚。
- `docs/runbooks/xiaobao-background-jobs.md`:小宝摘要 stale 告警、手动刷新和未来后台任务规则。
- `docs/production-readiness.md`:生产发布前后证据清单。
提交前运行 runbook 扫描:
```bash
pnpm docs:check-runbooks
```
## 升级流程
```bash
@@ -248,7 +343,8 @@ docker compose --env-file .env.production -f docker-compose.prod.yml exec server
升级前建议先备份数据库:
```bash
docker compose --env-file .env.production -f docker-compose.prod.yml exec postgres pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > ftb_pm_backup.sql
pnpm backup:postgres -- --env-file .env.production
pnpm backup:server-data -- --env-file .env.production
```
## 常见排查