# 2026-06-06 — 安装脚本按机自动生成唯一密钥

## 摘要

Docker / 1Panel 全新安装路径统一通过 `scripts/generate_nexus_secrets.py` 生成每台服务器独立的 `MYSQL_*` 与 `NEXUS_SECRET_KEY` / `NEXUS_API_KEY` / `NEXUS_ENCRYPTION_KEY`，写入 `docker/.env.prod` 并备份到 `/root/.nexus-install-secrets-*.env`。安装向导 `init-db` 复用容器环境内预生成密钥，避免与 Compose 不一致。

## 动机

新机安装不应从 `nexus-1panel.secrets.sh` 复制生产密钥；此前 `--fresh` 留空密钥导致 Compose 校验失败或各机密钥相同。

## 涉及文件

- `scripts/generate_nexus_secrets.py`（新建）
- `deploy/nexus-1panel.sh` — `write_env_prod` / `--reuse-secrets` / `--fresh` 忽略 secrets 中 NEXUS 项
- `deploy/install-nexus-fresh.sh` / `deploy/quick-install.sh`
- `docker/generate_env.py` — 复用同一生成器
- `docker/entrypoint.sh` — `NEXUS_INSTALL_WIZARD_PENDING=1` 时不写 `/app/.env`
- `docker/docker-compose.prod.yml` — 传递 `NEXUS_INSTALL_WIZARD_PENDING`
- `server/api/install.py` — `_install_keys_from_environment()`
- `deploy/README-1panel.md` · `deploy/nexus-1panel.secrets.sh.example`

## 迁移 / 重启

已部署实例无需变更。新机安装后需完成 `/app/install.html` 向导。

## 验证

```bash
python3 scripts/generate_nexus_secrets.py write-prod \
  --template docker/.env.prod.example --output /tmp/t.env.prod \
  --domain test.example.com --profile-env docker/profiles/2c8g.env --fresh --wizard-pending
grep NEXUS_SECRET_KEY /tmp/t.env.prod
ruff check server/api/install.py scripts/generate_nexus_secrets.py
```
