# 安装锁持久化 + 1panel-network 升级校验

| 项 | 内容 |
|----|------|
| 日期 | 2026-06-06 |
| 动机 | 生产 `nx update` 重建容器后丢失 `.install_locked`；容器未接入 `1panel-network` 导致 MySQL/Redis DNS 失败与 502 |

## 变更摘要

1. **安装锁写入 nexus-state 卷**：`install.py` 锁定后同步至 `/var/lib/nexus/.install_locked`；`entrypoint.sh` 启动时恢复至 `/app/.install_locked`，退出时双写。
2. **升级后 1panel-network 校验**：`deploy/nexus-1panel.sh` 新增 `verify_nexus_1panel_network`，`compose up` 后自动检测；未接入则叠加 `docker-compose.1panel.yml` 重建，失败则回滚。
3. **entrypoint 日志**：MySQL/Redis 等待日志区分服务名（不再误标为 Redis）。
4. **部署脚本**：`set_install_complete` / `sync_env_prod_to_volume` 识别卷内锁文件并恢复至 `/app`。

## 涉及文件

- `server/api/install.py`
- `docker/entrypoint.sh`
- `deploy/nexus-1panel.sh`
- `tests/test_security_unit.py`

## 迁移 / 重启

- 需重建 Nexus 镜像（entrypoint 变更）并 `compose up`。
- 无 DB 迁移。

## 后续修补（nx 上帝菜单巡检）

- `uninstall-mysql-compose.sh`：`compose up` 叠加 `docker-compose.1panel.yml`，避免升级 purge 阶段摘掉 `1panel-network`。
- `deploy/nx`：`ops_start_stack` / 菜单 `[8]` 重建后调用 `verify_nexus_1panel_network`；`install-auto` 已安装时改走 `update.sh`。
- `cmd_upgrade`：同步 install.html 前等待 `/health`，减少误触发 `sync-install-wizard` 重启。

## 验证

```bash
bash -n deploy/nx && bash -n deploy/nexus-1panel.sh && bash -n deploy/uninstall-mysql-compose.sh
pytest tests/test_security_unit.py -k "sync_lock or install_reject" -q
# 升级后容器应同时在 1panel-network 与 nexus-internal
docker inspect nexus-prod-nexus-1 --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}'
# 锁定后卷内应有锁文件
docker exec nexus-prod-nexus-1 test -f /var/lib/nexus/.install_locked
```
