# 2026-06-06 — Docker .env 持久化与 entrypoint 覆盖修复

## 摘要

修复 1Panel 安装向导完成后 `nx update`/容器重启导致 `nexus-state` 卷内 `.env` 缺少 `NEXUS_DATABASE_URL`、应用连 `127.0.0.1` 崩溃的问题。

## 动机

- `init-db` 仅写 `/app/.env`，卷同步依赖容器 EXIT trap，重建容器时 `restore_persisted_env` 可能恢复 entrypoint 生成的简版 env。
- `write_env_from_environment` 在 `NEXUS_INSTALL_WIZARD_PENDING=0` 时用 `env | grep NEXUS_` 写卷，Compose 无 `NEXUS_DATABASE_URL`。

## 涉及文件

- `server/api/install.py` — `_sync_env_to_persist_volume`；`init-db` / Redis 修补 / lock 后立即同步卷
- `docker/entrypoint.sh` — 无 `NEXUS_DATABASE_URL` 的卷不 restore；无 `NEXUS_DATABASE_URL` 环境变量时不生成 `.env`；`export_app_env` 在启动前 source `/app/.env`，使向导写入的 `DATABASE_URL` / `REDIS_URL` 覆盖 Compose 占位符

## 迁移 / 重启

已损坏的卷内 `.env` 需手工补全 `NEXUS_DATABASE_URL` 与 Redis URL 后 `docker start`；新装/重装向导自动同步。

## 验证

```bash
.venv/bin/pytest tests/test_security_unit.py -q
# 向导 init-db 后：
docker exec nexus-prod-nexus-1 grep NEXUS_DATABASE_URL /var/lib/nexus/.env
```
