# 生产部署说明

目标访问地址：

```text
http://hfb.221329.cc.cd:7890
```

生产部署只暴露宿主机 `7890` 端口，避免和服务器已有的 `80`、`443` 服务冲突。后端、MySQL、Redis、MinIO 均通过 Docker 内网通信。

## 1. 准备环境变量

```bash
cp backend/.env.prod.example backend/.env
```

编辑 `backend/.env`，至少替换以下占位值：

```text
MYSQL_ROOT_PASSWORD
MYSQL_PASSWORD
MYSQL_DSN
JWT_SECRET
MINIO_ROOT_USER
MINIO_ROOT_PASSWORD
STORAGE_ACCESS_KEY_ID
STORAGE_SECRET_ACCESS_KEY
```

如果正式对外运营，还需要配置真实短信和实名服务，避免继续使用测试配置。

## 2. 一键部署

```bash
./scripts/deploy-prod.sh
```

脚本会自动完成：

- 检查 `backend/.env` 是否仍指向 `127.0.0.1`、`localhost` 或占位值。
- 构建并启动生产容器。
- 等待 MySQL、Redis、MinIO 就绪。
- 按顺序执行尚未应用的数据库迁移。
- 重启后端并检查 `http://127.0.0.1:7890/api/health`。

如需部署完成后直接跟随查看后端日志：

```bash
./scripts/deploy-prod.sh --logs
```

后端运行日志会同时输出到 Docker 控制台，并写入宿主机：

```text
backend/logs/app-YYYY-MM-DD.log
```

测试阶段需要清空并重建数据库时：

```bash
./scripts/deploy-prod.sh --reset-db
```

## 3. 手动启动服务

```bash
docker compose -f deploy/docker-compose.prod.yml up -d --build
```

## 4. 手动初始化数据库

将命令中的 `change-hfb-password` 替换为 `backend/.env` 里的 `MYSQL_PASSWORD`。

```bash
docker compose -f deploy/docker-compose.prod.yml exec -T mysql \
  mysql -uhfb -pchange-hfb-password hfb_sys < backend/migrations/000001_init.sql
```

## 5. 验证

```bash
curl http://127.0.0.1:7890/health
curl http://127.0.0.1:7890/api/health
```

浏览器访问：

```text
http://hfb.221329.cc.cd:7890
http://hfb.221329.cc.cd:7890/admin/login
```

服务器安全组或防火墙需要放行 `7890/tcp`。
