62 lines
3.6 KiB
Markdown
62 lines
3.6 KiB
Markdown
# BLOCKED 可执行 Runbook(未执行,需拍板)
|
||
|
||
> 状态:只读落盘,不执行;不输出密钥原文;不提交 git;未改远端。
|
||
> 拍板格式:`B1暂不 / B2暂不 / B3暂不 / B5暂不 / B6暂不` 或注明哪项执行。
|
||
|
||
## B1 线上密钥轮换(需停机窗口)
|
||
- 前置:停机窗口 + 远端 docker.env 备份 + 回滚方案。
|
||
- 步骤(远端执行,占位符,非真实值):
|
||
1. `cp docker.env docker.env.bak.YYYYMMDD-HHMM`
|
||
2. 生成三段随机值分别写入 `DJANGO_SECRET_KEY` / `POSTGRES_PASSWORD` / `REDIS_PASSWORD`(本地生成后粘贴,不在聊天输出原文)
|
||
3. `docker compose --project-name chunyu -f docker-compose.yml -f docker-compose.server.yml restart backend postgres redis`
|
||
4. 验证:登录 /user/login、`/api/apidirectory/categories/` 200、Celery 心跳
|
||
5. 失败回滚:`cp docker.env.bak.* docker.env && restart` 同上
|
||
- 阻塞:缺停机窗口确认。
|
||
|
||
## B2 生产 TLS/HSTS(需域名+证书方案)
|
||
- 前置:域名 + 证书来源(ACME/ALB/WAF)+ 80/443 入口方案。
|
||
- 步骤:
|
||
1. 确认证书签发与续期路径
|
||
2. Nginx 增加 443 server + `Strict-Transport-Security`(仅 HTTPS 生效后加)
|
||
3. `docker exec chunyu-frontend nginx -t && docker restart chunyu-frontend`
|
||
4. 验证:`curl -i https://<domain>/` 安全头 + http→https 跳转
|
||
- 阻塞:缺域名与证书方案。
|
||
|
||
## B3 远端防火墙(需放行 IP 清单)
|
||
- 前置:放行 IP 清单(运维 IP / CI 出口 / 访客范围)。
|
||
- 步骤:
|
||
1. 备份现有 nftables/iptables 或云安全组规则
|
||
2. 仅放行清单 IP 访问 15432/16379/18000/18080,其余 deny
|
||
3. 验证:白名单 `curl` 通、非白名单超时/拒绝
|
||
4. 失败回滚:恢复备份规则
|
||
- 阻塞:缺放行 IP 清单。
|
||
|
||
## B5 容器 USER 非 root(需可用 daemon 构建验证)
|
||
- 现状只读取证:
|
||
- 后端 `chunyu_project/Dockerfile:22-23` 工作区已有 `useradd -m -u 10001 app` + `USER app`,但该文件被 `.gitignore:15` 按 `chunyu_project/` 整目录忽略,未跟踪。
|
||
- 前端 `chunyu_project_react/Dockerfile` 仍双 stage 无 `USER`。
|
||
- 本机 `docker version` server 经 npipe 连接失败,daemon 未起,无法构建验证。
|
||
- 可执行步骤(daemon 可用后,本地先验证,不推远端):
|
||
1. `docker build -f chunyu_project/Dockerfile -t chunyu-backend-nonroot:local chunyu_project`
|
||
2. `docker build -f chunyu_project_react/Dockerfile -t chunyu-frontend-nonroot:local chunyu_project_react`
|
||
3. 启动冒烟:`/user/login`、`/api/apidirectory/categories/`、media/staticfiles 可写
|
||
4. 通过后再谈远端发布与跟踪策略(当前后端 Dockerfile 被忽略,需另行决策是否纳入跟踪)
|
||
- 阻塞:缺可用 daemon + 是否纳入跟踪的确认。
|
||
|
||
## B6 历史清理(需确认执行 git rm --cached)
|
||
- 现状只读取证:`git ls-files | grep -icE` 重数 88,与冻结规格一致。
|
||
- 可执行命令(确认后执行,未执行):
|
||
- `git ls-files | grep -E '\.log$|\.png$|\.tar\.gz$|__pycache__|\.pyc$|^.*dist/|^shots/' > /tmp/b6-list.txt`
|
||
- 核对 `/tmp/b6-list.txt` 后:`xargs -a /tmp/b6-list.txt git rm --cached`
|
||
- `.gitignore` 已新增对应模式,只对新增生效;历史需上条命令去跟踪。
|
||
- 阻塞:缺 `git rm --cached` 执行确认。
|
||
|
||
## 本轮已验证(本地可逆项)
|
||
- `manage.py check` 0 issue CHECK_EXIT=0
|
||
- `makemigrations --check` MIG_EXIT=0
|
||
- 20 测试 TEST_EXIT=0
|
||
- `tsc` TSC_EXIT=0、`vite build` BUILD_EXIT=0
|
||
- `check_routes --base 127.0.0.1:5175` ROUTES=86 PASS=86
|
||
- Playwright 图片 2 passed
|
||
- `git diff --check` EXIT 0
|