5a56e5a8cb
- /state 白名单脱敏;init-db db_port 修复;connection-check 后清空 redis_pass - install.html sessionStorage token 与无 token 友好提示 - nx update: 镜像 import 门控、健康失败自动回滚、PENDING=0 回写、卷双写 - Redis 容器改名密码迁移;备份失败默认 WARN;update.sh 管道 ROOT 回退
3.3 KiB
3.3 KiB
1Panel 配置 / 安装向导 / nx update 根治设计
| 项 | 内容 |
|---|---|
| 日期 | 2026-06-06 |
| 状态 | 已实施 |
| 动机 | 三路审计发现安装向导安全泄露、配置不一致、nx update 无门控与回滚 |
背景与目标
生产 1Panel+Docker 链路曾出现:nx update 覆盖 Redis URL、GET /state 泄露 install_token/redis_pass、init-db MySQL 2003 分支 NameError、升级无镜像自检与健康回滚。
目标:在不改向导步骤数、不引入新依赖前提下,根治上述问题并补齐运维文档。
方案对比
| 维度 | 最小修补 | 根治(选定) |
|---|---|---|
/state |
仅删两个字段 | 白名单 _public_install_state + has_token |
nx update |
手工回滚 | 镜像 import 门控 + tag 回滚 + 健康失败自动恢复 |
| 配置一致性 | 文档说明 | PENDING 回写、卷双写、Compose 去重、healthcheck 对齐 |
| 备份失败 | 中止升级 | 默认 WARN 继续;--require-backup 可强制中止 |
选定方案
A. 安装向导
init-db:db_port = int(req.db_port),修复_mysql_connect_error_detailNameError。GET /state:仅返回_INSTALL_STATE_PUBLIC_KEYS;有 token 时设has_token: true。- 前端:
sessionStorage暂存 token;无 token 时步骤 4 友好提示。 connection-check修复 Redis 后_clear_state_redis_pass()。
B. 配置一致性
set_install_complete():检测到.install_locked时将NEXUS_INSTALL_WIZARD_PENDING=0写入docker/.env.prod。sync_env_prod_to_volume():已锁定且docker/.env.prod密钥/URL 变更时同步至nexus-state卷。docker-compose.1panel.yml移除重复NEXUS_1PANEL_*environment。docker-compose.prod.ymlhealthcheck 与Dockerfile.prod对齐。- 文档注明
NEXUS_REDIS_URL不经 Compose 注入。
C. nx update 门控与回滚
- 升级前
tag_rollback_image→nexus-prod-nexus:rollback compose build→gate_new_image_import(python -c "import server.main")compose up -d --no-buildverify_health失败 →rollback_compose_upgrade+ 退出非 0backup_mysql失败默认 WARN;--require-backup时中止resolve_nexus_redis_url:容器改名时迁移redis://:pass@至新 hostsync-install-wizard-to-container.sh仅在 install.html 非 200 时执行,失败可见update.sh管道执行时 ROOT 回退/opt/nexus
接口 / 数据模型
GET /api/install/state响应不再含install_token、redis_pass;可选has_token: boolean。- 无 DB 迁移;无新环境变量(沿用
NEXUS_PUBLISH_PORT、NEXUS_INSTALL_WIZARD_PENDING)。
安全与性能约束
- 白名单脱敏为强制;
sessionStorage仅当前标签页,锁定后 state 文件删除。 - 镜像门控增加约数秒构建后延迟;回滚依赖升级前 tag 成功。
- 卷双写仅在已锁定且 prod 密钥/URL 非空时执行。
验收标准
pytest tests/test_security_unit.py通过ruff check server/ --select F无错误GET /api/install/state无敏感字段nx update门控失败不切换容器;健康失败自动回滚- 已锁定主机
NEXUS_INSTALL_WIZARD_PENDING=0 - Redis 容器改名后 URL 保留密码