# Docker 容器化设计

## 背景与目标

Nexus 此前仅支持 Supervisor + 裸机部署。需要提供 **Docker Compose** 一键拉起 MySQL、Redis 与 FastAPI，便于本地开发、CI 与可选生产部署，且不改变 Clean Architecture 与安装向导流程。

## 方案对比

| 方案 | 优点 | 缺点 |
|------|------|------|
| 仅 Dockerfile | 简单 | 仍需自备 MySQL/Redis |
| Compose 全栈 | 一键、可复现 | 需处理 `.env` 与安装模式 |
| K8s | 大规模 | 过重，非当前需求 |

**选定**：`Dockerfile` + `docker-compose.yml`（mysql + redis + nexus）。

## 架构

```
┌─────────────┐     ┌──────────┐     ┌─────────┐
│   Browser   │────▶│  nexus   │────▶│  mysql  │
│  :8600/app  │     │  :8600   │     │  :3306  │
└─────────────┘     └────┬─────┘     └─────────┘
                         │
                         ▼
                    ┌─────────┐
                    │  redis  │
                    │  :6379  │
                    └─────────┘
```

- 单容器内 `uvicorn` 单 worker（后台任务由 Redis primary lock 协调；多副本可水平扩展）。
- 静态前端：镜像内 `web/app/`（与 Git 跟踪的 Vite 产物一致）。
- **安装模式**：无 `.env` 时访问 `/app/install.html`。
- **正常模式**：`docker/.env` 或 Compose `environment` + entrypoint 写入 `/app/.env` 并持久化到 `nexus-state` 卷。

## 接口与配置

| 变量 | 说明 |
|------|------|
| `NEXUS_DATABASE_URL` | `mysql+aiomysql://nexus:pass@mysql:3306/nexus` |
| `NEXUS_REDIS_URL` | `redis://redis:6379/0` |
| `NEXUS_SECRET_KEY` / `API_KEY` / `ENCRYPTION_KEY` | 正常模式必填 |
| `NEXUS_DOCKER_WRITE_ENV` | `1` 时由 entrypoint 从环境生成 `.env` |

## 安全与性能

- 默认密码仅用于开发；生产必须改 `docker/.env` 与 Compose secrets。
- MySQL/Redis 数据用 named volume；`.env` 同步到 `nexus-state` 卷（`chmod 600`）。
- 健康检查：`GET /health` → `ok`。

## 验收标准

- [ ] `docker compose up -d --build` 后 `curl http://localhost:8600/health` 为 `ok`
- [ ] 无 `docker/.env` 时可打开 `/app/install.html`
- [ ] 配置 `docker/.env` 后重启仍保持登录态与 DB 数据
- [ ] `docs/changelog` 与 `docker/README` 含启动说明
