Skip to content

feat: 生产上线准备(部署硬化 + 密钥管理 + 备份 + 部署手册) - #2

Merged
miSu7Ultra merged 10 commits into
mainfrom
feat/prod-deploy-readiness
Aug 31, 2026
Merged

feat: 生产上线准备(部署硬化 + 密钥管理 + 备份 + 部署手册)#2
miSu7Ultra merged 10 commits into
mainfrom
feat/prod-deploy-readiness

Conversation

@miSu7Ultra

Copy link
Copy Markdown
Owner

目标

把 QuantMore 从「本地开发」推进到「可上线」:单机云服务器 + Docker Compose 全栈部署、自用/小团队(非公开注册)、暂无域名(先 IP + 80 端口 HTTP 直连)。

改动内容

后端(最小改动,默认行为不变)

  • 注册开关 APP_REGISTRATION_ENABLED(默认 true):关闭后注册返回业务码 12003(ErrorCode.REGISTRATION_DISABLED),新增 AuthProperties 配置类与测试
  • LocalKbSeedRunner:无 ADMIN 用户时由抛异常改为告警跳过,防止生产 crash-loop

配置与编排生产化

  • 新增 application-prod.yml:关闭 Swagger、forward-headers-strategy: native、日志落盘轮转、actuator 收缩、JWT 默认 30 天
  • docker-compose.yml:凭据 :? 必填(去掉 "password"/minioadmin 默认值)、基础设施端口全部内网化(唯一对外入口 frontend:80)、固定项目名 name: quantmore、app 健康检查 + restart + 日志轮转、/root/.quantmore 与日志卷持久化、挂载 ./docs:/seed-docs:ro 种子导入
  • app/Dockerfile 装 curl(healthcheck);frontend/Dockerfile node:24 + --frozen-lockfile(与 CI 对齐);新增 frontend/.dockerignore
  • nginx.conf:XFF 改为 $remote_addr(防伪造 IP 绕过限流)、安全头、server_tokens off

密钥、脚本与文档

  • .env.example 生产段(openssl 生成命令与「加密密钥不可更改」警示,密钥去重)
  • scripts/deploy.sh(升级 + main 分支守卫 + 占位密钥预检)、scripts/backup.sh(PG 自定义格式 + 配置卷 + MinIO 数据卷,14 天保留 + 月备,crontab 示例)
  • ops/production-deployment.md 生产部署手册:服务器初始化、密钥生成、首次部署两阶段顺序(先注册首个 ADMIN 再启用种子导入)、升级/回滚、备份恢复演练、常见故障、生产 schema 变更须知(必须新增 V2 迁移)
  • README 生产部署章节;CI 保持现状(单机部署在服务器直接 build)

验证

  • 后端全量测试 ./gradlew :app:test --rerun --no-daemon BUILD SUCCESSFUL(真实 Redis 6379)
  • 前端 pnpm run builddocker compose config --quiet、nginx 配置 nginx -t 容器验证、bash -n 脚本语法
  • 三轮评审(任务级 × 3 + 全分支终审 + 修波复审 × 2)全部闭环

首次部署顺序(关键)

  1. .env 生成全部密钥,APP_SEED_KB_DIR 留空、APP_REGISTRATION_ENABLED=truedocker compose up -d --build
  2. 浏览器注册第一个账号(自动 ADMIN)
  3. .envAPP_SEED_KB_DIR=/seed-docsAPP_REGISTRATION_ENABLED=false → 重启导入知识库种子
  4. 验证:知识库出现、再注册返回 12003、Swagger 404、ss -tlnp 只有 80/22

后续可选(不在本次范围)

域名 + HTTPS、MinIO 桶私有化 + 预签名 URL、Redis 密码、CI 镜像推送。

🤖 Generated with Claude Code

miSu7Ultra and others added 10 commits August 31, 2026 16:02
- 新增 REGISTRATION_DISABLED(12003) 错误码
- AuthProperties 配置 app.auth.registration-enabled,默认 true 保持现状
- UserService.register 开关关闭时抛 BusinessException(REGISTRATION_DISABLED)
- UserServiceTest 增加开关关闭/开启两个用例

Co-Authored-By: Claude Code <[email protected]>
APP_SEED_KB_DIR 已设置但系统无 ADMIN 时仅告警并跳过,
注册首个用户(自动成为 ADMIN)后重启生效。

Co-Authored-By: Claude Code <[email protected]>
- 新增 application-prod.yml:关闭 Swagger、限制 actuator 暴露、滚动日志、信任代理头
- docker-compose.yml:必填变量 :? 校验、内网端口不再对外暴露、日志锚点与重启策略、app 健康检查与持久化卷
- app/Dockerfile 运行时安装 curl 供 healthcheck;frontend/Dockerfile 升级 node:24 并启用 --frozen-lockfile

Co-Authored-By: Claude Code <[email protected]>
- nginx 隐藏版本号、增加 X-Content-Type-Options 与 Referrer-Policy 安全头
- X-Forwarded-For 改为透传直连 IP,防止伪造 IP 绕过后端限流
- .dockerignore 补充 .env / .env.* 排除,避免密钥进入构建上下文

Co-Authored-By: Claude Code <[email protected]>
- 新增 docs/production-deployment.md 单机生产部署手册
- .env.example 增补生产部署段与密钥生成提示
- README 增加生产部署章节并指向部署手册
- .gitignore 排除 backups/ 并放行生产部署手册
- bootRun 加载 .env 时空值不覆盖开发占位值,避免必填项留空导致启动失败

Co-Authored-By: Claude Code <[email protected]>
- 新增 scripts/deploy.sh 生产升级脚本(git pull + 重建镜像 + 重启 + 前端健康检查)
- 新增 scripts/backup.sh 数据库与配置卷备份脚本,日备保留 14 天、月备长期保留

Co-Authored-By: Claude Code <[email protected]>
- LocalKbSeedRunner 会把 APP_SEED_KB_DIR 挂载目录(./docs)下每个根级 md 导入为公共知识库,compose 又挂载整个 ./docs,手册必须移出 docs/
- 同步更新 README 生产部署章节链接为 ops/production-deployment.md
- 移除 .gitignore 中旧路径的 docs/production-deployment.md 例外

Co-Authored-By: Claude Code <[email protected]>
- deploy.sh:仅允许 main 分支执行升级,防止回滚 checkout 被 git pull 拉回 main;预检拦截 .env 中的 change_me/your_dashscope 占位密钥
- backup.sh:新增 minio_data 卷归档(上传的知识库原始文档),纳入 14 天保留策略
- 手册同步:回滚改为直接命令并注明不能重跑 deploy.sh;备份清单与恢复流程补充 minio_data;常见故障补充占位密钥不对称现象;修正种子目录说明与恢复示例占位符

Co-Authored-By: Claude Code <[email protected]>
- build.gradle:bootRun 空值跳过注释改为实际留空的 POSTGRES_PASSWORD(生产段重新定义且留空)
- UserService:register javadoc 补充注册开放受 app.auth.registration-enabled 开关控制

Co-Authored-By: Claude Code <[email protected]>
- docker-compose.yml 顶层固定 name: quantmore,避免克隆目录名不同导致命名卷前缀漂移
- backup.sh 按实际卷名归档:quantmore_app_quantmore_data / quantmore_minio_data,注释注明前缀来源
- 手册卷名引用同步为 quantmore_ 前缀实际名称;占位密钥字节数 21 更正为 20;备份脚本表格说明补充 MinIO 数据卷

Co-Authored-By: Claude Code <[email protected]>
@miSu7Ultra
miSu7Ultra merged commit a8bf790 into main Aug 31, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant