# 生产环境加固

[English](PRODUCTION_HARDENING.md)

## 上线前校验

准备项目根目录 `.env` 与 `backend_api_python/.env`，替换所有默认凭据，然后执行：

```bash
python backend_api_python/scripts/check_production_config.py \
  --env-file .env \
  --env-file backend_api_python/.env
```

校验会拒绝默认数据库密码、管理员密码、Grafana 密码、JWT 密钥和凭据加密密钥。

## 锁定运行环境

生产覆盖层使用 UID/GID `10001` 运行后端进程，移除 Linux capabilities，将根文件系统
设为只读，并限制 CPU、内存与进程数：

```bash
docker compose \
  -f docker-compose.yml \
  -f docker-compose.production.yml \
  -f docker-compose.observability.yml \
  up -d --build
```

首次锁定启动前必须准备好全部密钥，因为非 root 容器不能生成或回写这些值。数据库结构
更新只能由 `migration` 服务执行，不要让 API Worker 并发迁移。

## 网络边界

- 公网只暴露 TLS 反向代理的 80/443。
- PostgreSQL、两套 Redis、Prometheus、Grafana、Alertmanager 不直接暴露公网。
- 后端 API 若必须独立暴露，应置于认证、限流和 TLS 之后。
- MCP 网络监听必须设置独立的 `QUANTDINGER_MCP_AUTH_TOKEN`，不能复用 Agent Token。

## 数据与恢复

- 备份 PostgreSQL，并定期验证恢复流程。
- 队列任务必须跨主机故障保留时，备份 `celery_redis_data`。
- 缓存 Redis 可以淘汰，不应作为 Celery broker。
- 监控 `redis-jobs` 内存；`noeviction` 会在内存不足时拒绝新写入，而不是丢弃任务。
- 记录密钥轮换、数据库恢复和实盘停机开关的演练结果。
