Commit Graph
2 Commits
Author SHA1 Message Date
zhangtao 1e9e12489d security(deploy): 生产凭据轮换 + 镜像不再携带口令
轮换(MySQL 应用用户 / MySQL root / Redis,实测旧值被拒)
- 旧 MySQL app 口令 → ERROR 1045 (28000) Access denied;旧 root 同被拒
- 旧 Redis 口令 → AUTH failed: WRONGPASS
- 新口令:容器内直连成功;应用健康 db_status=1 / redis_status=1;四端 200;容器全 healthy
- .env 保持 600,轮换前备份 .env.bak-rotate-*

镜像卫生(审计 B3 根治)
- deploy-artifacts.sh 构建时剔除 DATABASE_PASSWORD / REDIS_PASSWORD /
  SECRET_KEY / DATA_ENCRYPTION_KEY / DATA_ENCRYPTION_OLD_KEYS / MYSQL_* 口令键,
  仅保留主机、端口等非敏感项;口令全部由 compose 运行时注入
- 重建后镜像内 /home/env/.env.prod 口令类键命中 0 条;容器 env 仍持有 4 个密钥且应用正常
- 本地 backend/env/.env.prod 中泄露值清空并 chmod 600

文档
- DEPLOYMENT.md 新增「凭据轮换」标准步骤(含 mysql/redis 健康检查需一并重建、
  docker exec -i 会吞脚本 stdin 的排查提示)
- AUDIT-REPORT.md 记录公开仓库历史暴露面与待用户侧吊销项(OpenAI Key)

说明:仓库为 public,历史中真实出现过 OpenAI Key 与旧口令;旧口令本轮已失效,
OpenAI Key 需到控制台吊销(第三方无法代办)。是否用 git-filter-repo 清洗历史见报告 §10。
2026-10-04 06:39:30 +08:00
zhangtao ce9401196a chore(deploy): 成品部署链路、依赖分组与运维基建
部署方式:服务器不再接收源码、不执行构建,改为本地构建成品后交付
- deploy-artifacts.sh:构建→备份→校验→原子替换,支持回滚、镜像/备份轮转、
  mysql 与 postgres 双变体镜像;后端以 docker save|ssh|docker load 交付
- 依赖分组:requirements/{base,storage}.txt + db/{mysql,postgres,sqlite}.txt,
  镜像按所选数据库只装对应驱动(MySQL 变体 565MB → 521MB)

编排与运行时加固
- compose:MySQL/Redis/backend 端口仅绑 127.0.0.1;密钥(SECRET_KEY、
  DATA_ENCRYPTION_KEY、DATA_ENCRYPTION_OLD_KEYS)、PROD_CORS_ORIGINS、
  FORWARDED_ALLOW_IPS、DEMO_ENABLE 一律由 docker/.env 注入
- Dockerfile:对齐依赖分组、以非 root(uid=1000) 运行;.dockerignore 排除全部真实 .env.*
- nginx:静态资源长缓存、隐藏文件拒绝、接口文档仅内网可访问、放行 ACME http-01 校验路径

工程基建
- 新增 CI:backend(uv sync + ruff + pytest)与 frontend(web type-check+vitest、app type-check)
- 新增 DEPLOYMENT.md 运维手册(部署/回滚/密钥轮换/每日巡检/证书/排查)
2026-10-04 04:26:03 +08:00