# 后端 Docker 部署

## 部署架构

| 架构 | compose 文件 | 说明 |
|------|-------------|------|
| 单体 | `docker-compose.yml` | 一个 App 容器 |
| Spring Cloud | `docker-compose.cloud.yml` | Nacos + Gateway + System |

中间件（MySQL / Redis / MinIO）**独立选择**，不绑定架构：

| 中间件 | 选项 | 说明 |
|--------|------|------|
| MySQL | `docker` / `external` | Docker 安装 or 连接外部服务 |
| Redis | `docker` / `external` | Docker 安装 or 连接外部服务 |
| MinIO | `docker` / `external` / `none` | Docker 安装 / 外部 / 不使用 |

## 前置条件

- Docker + Docker Compose
- **外部 MySQL 场景**：需提前建好 `nacos` 和 `ghb_base` 两个库（见下文）

---

## 快速开始

```bash
cd deploy

# 1. 交互式配置
bash deploy.sh init

# 2. 编译镜像（首次 10-20 分钟）
bash deploy.sh build

# 3. 启动
bash deploy.sh start
```

---

## 完整步骤（Spring Cloud + 外部 MySQL/Redis）

### 第一步：初始化数据库

```bash
# Nacos 内部存储库（必须）
mysql -h <MySQL地址> -u root -p < db/tables_nacos.sql

# 业务库
mysql -h <MySQL地址> -u root -p -e "CREATE DATABASE IF NOT EXISTS ghb_base DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mysql -h <MySQL地址> -u root -p ghb_base < db/ghb_base_init.sql
```

### 第二步：交互式配置

```bash
cd deploy
bash deploy.sh init
```

按提示填写：

```
部署架构:           2. Spring Cloud
MySQL:              2. 连接外部服务 → 10.13.13.1:3306
Redis:              2. 连接外部服务 → 10.13.13.1:56379
MinIO:              3. 不使用
外接数据库是否已建表？ Y
是否集成前端？        Y（需先 pnpm build）
```

### 第三步：编译 + 启动

```bash
bash deploy.sh build && bash deploy.sh start
```

`start` 在 Spring Cloud 模式下自动执行：

```
Phase 1: 启动 Nacos → 等待健康检查 → 无配置则自动导入
Phase 2: 启动 System → Gateway
```

### 第四步：验证

| 服务 | 地址 |
|------|------|
| Nacos | `http://localhost:8848/nacos` |
| Gateway 文档 | `http://localhost:9999/doc.html` |
| System 文档 | `http://localhost:7001/doc.html` |
| 前端 | `http://localhost:3001`（如启用） |

Nacos 服务列表应有 `jeecg-gateway`、`jeecg-system`。

---

## 架构链路

```
前端 :3001
  ↓
Gateway :9999 ──┐
  ↓              │ ghb-net（Docker 内部网络）
System :7001 ────┤
  ↓              │
Nacos :8848 ─────┘  ← init-nacos.sh 自动推送配置
  ↓
外部 MySQL / Redis  ← Nacos 配置中地址已被替换
```

---

## Nacos 配置原理

`deploy/nacos/config/*.yaml` 模板中用占位符，`init-nacos.sh` 运行时从 `.env` 读取实际值替换后推送到 Nacos：

```yaml
# 模板（nacos/config/jeecg-dev.yaml）
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${DB_NAME}?...
host: ${REDIS_HOST}
port: ${REDIS_PORT}

# ↓ init-nacos.sh 替换后推送到 Nacos ↓

# Nacos 中实际配置
url: jdbc:mysql://10.13.13.1:3306/ghb_base?...
host: 10.13.13.1
port: 56379
```

服务启动时从 Nacos 拉取配置，自动连到外部 MySQL/Redis。

### 数据库要求

| 库 | 用途 | 谁建 | SQL |
|----|------|------|-----|
| `nacos` | Nacos 内部存储 | **手动** | `db/tables_nacos.sql` |
| `ghb_base` | 业务数据 | 手动 or `deploy.sh init-db` | `db/ghb_base_init.sql` |

---

## 命令速查

| 命令 | 作用 |
|------|------|
| `bash deploy.sh init` | 交互式生成 .env |
| `bash deploy.sh start` | 停旧容器 → 启动（不编译） |
| `bash deploy.sh build` | 编译镜像 |
| `bash deploy.sh rebuild [分支]` | 拉代码 + 编译 + 启动 |
| `bash deploy.sh stop` | 停止所有容器 |
| `bash deploy.sh logs` | 查看日志 |
| `bash deploy.sh status` | 容器状态 |
| `bash deploy.sh config` | 查看配置 |
| `bash deploy.sh init-db` | 初始化外部业务数据库 |
| `bash deploy.sh init-nacos` | 强制重新导入 Nacos 配置 |

---

## 目录结构

```
deploy/
├── deploy.sh                      # 主脚本
├── init-nacos.sh                  # Nacos 配置导入
├── .env                           # 实际配置（gitignore）
├── docker-compose.yml             # 单体编排
├── docker-compose.cloud.yml       # Spring Cloud 编排
├── config/
│   └── application-prod.yml       # 单体外部配置
└── nacos/config/
    ├── jeecg.yaml                 # 公共配置
    ├── jeecg-dev.yaml             # 环境配置（含占位符）
    ├── jeecg-gateway-dev.yaml     # 网关配置
    └── jeecg-gateway-router.json  # 路由表
```
