# Nexus Docker

## 前置

- [Docker Desktop](https://www.docker.com/products/docker-desktop/)（Windows/macOS）或 Docker Engine + Compose v2

## 快速启动（正常模式）

```bash
# 1. 生成密钥（写入 docker/.env，已 gitignore）
python docker/generate_env.py

# 2. 构建并启动
docker compose up -d --build

# 3. 健康检查
curl -s http://localhost:8600/health   # 期望: ok

# 4. 打开 SPA
# http://localhost:8600/app/
```

默认管理员需在安装向导或已有 DB 中配置；若 DB 为空且未跑过 install，可删卷后走安装模式。

## 安装向导模式

不创建 `docker/.env`（或清空 `NEXUS_SECRET_KEY`）时，应用以 **安装模式** 启动：

- http://localhost:8600/app/install.html

完成向导后 `.env` 会写入容器；`nexus-state` 卷会在重启时恢复配置。

## 常用命令

```bash
docker compose logs -f nexus
docker compose down          # 停止，保留数据卷
docker compose down -v       # 停止并删除数据卷（清空 DB）
docker compose build --no-cache nexus
```

## 服务

| 环境 | Compose 服务 | 说明 |
|------|-------------|------|
| 本地开发 `docker-compose.yml` | nexus + mysql + redis | 一键本地联调 |
| 生产 `docker-compose.prod.yml` | **仅 nexus** | MySQL/Redis 宿主机或 1Panel 自建 |

生产 1Panel：`docker/.env.prod` 可含 `NEXUS_REDIS_URL`（供 `nx update` 探测同步），**不经 Compose 注入容器**；运行时 Redis/MySQL URL 以安装向导写入的 `/app/.env`（`nexus-state` 卷）为准。MySQL `NEXUS_DATABASE_URL` 仅由向导步骤 3 写入。

## 生产注意

- 修改 `NEXUS_*` 为强密码；MySQL 使用自建库强密码。
- 建议前置 Nginx/TLS，仅暴露 443。
- 多实例部署需共享 MySQL、Redis；后台任务由 Redis primary lock 保证单实例执行。

### 1Panel 生产（Compose + OpenResty）

```bash
cp docker/.env.prod.example docker/.env.prod   # 从宝塔 .env 迁入密钥
docker compose -f docker/docker-compose.prod.yml --env-file docker/.env.prod up -d --build
```

- 镜像：`Dockerfile.prod`（含 `npm ci` + `vite build` + **`web/app/install.html` 安装向导**）
- 仅绑定 `127.0.0.1:8600`；OpenResty 反代见 `deploy/1panel/openresty-nexus.conf.example`
- **2C8G 调优**：`docker/profiles/2c8g.env`（`NEXUS_MEM_LIMIT` + `NEXUS_DB_POOL_SIZE=30`）；外置 MySQL 可参考 `docker/mysql-prod-2c8g.cnf` 手工调优
- 完整迁移步骤：`docs/design/plans/2026-06-04-1panel-docker-production.md`
- 一键安装：`bash deploy/install-1panel-docker.sh`
- 一键升级：`bash deploy/upgrade-1panel-docker.sh`（`--check` 仅查更新）

详见 `docs/design/specs/2026-06-03-docker-design.md`。
