chore(deploy): 数据库与各服务增加资源限制和优雅关闭保护

- postgres 增加 mem_limit/cpus/shm_size/stop_grace_period 与 PG
  性能参数(shared_buffers 等,env 可覆盖);backend/web 增加
  内存/CPU 限额与更长的优雅关闭宽限(生产与开发编排同步)
- ubuntu-deploy.sh 增加部署前磁盘空间预检,防止备份或迁移
  中途磁盘写满
- .env.server.example 补充资源变量;文档补充容器资源限制说明
This commit is contained in:
yml2213
2026-08-30 13:59:19 +08:00
parent 02c9de8b9c
commit 6dcdec43f1
5 changed files with 90 additions and 0 deletions
+17
View File
@@ -38,3 +38,20 @@ ORDER BY query_start;
- `DATABASE_MAX_CONNECTIONS` 按后端实例数总量评估;扩容后端实例时不能简单地每实例增加连接数。
- CPU 限额只能防止数据库拖垮整机,不能替代 SQL 优化。
- 数据量持续增长后,排行榜和历史统计应迁移到汇总表、缓存或只读副本,不应继续依赖在线全量聚合。
## 容器资源限制
Compose 对 postgres 与各服务已配置资源限额,默认值按 2G 内存机器设置,均可在 `.env` 覆盖(见 `.env.server.example``POSTGRES_*` / `BACKEND_MEM_LIMIT` / `WEB_MEM_LIMIT` 等):
| 服务 | 限额 | 说明 |
| --- | --- | --- |
| postgres | `mem_limit` 1g、`cpus` 2、`shm_size` 512mb | `shm_size` 不足会导致并行查询/大排序报错;`stop_grace_period` 60s 保证检查点能完整落盘 |
| backend | `mem_limit` 512m、`cpus` 1 | `stop_grace_period` 30s 保证优雅关闭(HTTP 收尾 + 连接池释放)能跑完 |
| web | `mem_limit` 256m、`cpus` 0.5 | Caddy 静态服务,低占用 |
| dev postgres | 同生产默认 | 仅 postgres 受限;backend/frontend 开发容器不设限,避免 tsx watch / npm install 内存波动被误杀 |
调整原则:
- 内存限额不要低于 RSS 峰值的 1.3 倍,否则会触发 OOM 杀容器(`restart: unless-stopped` 会崩溃循环)。
- 内存类 PG 参数遵循大致比例:`shared_buffers` ≈ 内存的 1/8~1/4`effective_cache_size` ≈ 内存的 1/2~3/4,且两者之和不宜超过可用内存的 80%。
- 修改限额后 `docker compose config` 会以明文展示最终值,可用它核对插值结果;变更仅对重建/重启的容器生效。