Files
iotlcm/docs/deploy/split.md
T
MiFaZhan 73adad97f3 docs: 部署手册适配一键部署,去掉环境变量与示例配置
部署仓已改为开箱即用:config/ 直接是配置文件、口令等值内置在
docker-compose.yml、不再有 .env。

同步调整:
- 概览:部署流程改为 git clone + docker compose up -d 三步
- 配置说明:重写为「编排层 + 应用层」,说明为何不用环境变量
  (GoFrame 不展开配置文件中的 ${VAR})、改口令需同步三处、
  口令不能含 @ : / 等字符
- 启动与验证:去掉准备步骤,schema 脚本数改为 13 个
- 环境准备:镜像仓库改为描述编排文件中的实际地址
- 升级备份/离线/分离/自建镜像:.env 相关操作改为修改编排文件
2026-10-29 09:20:09 +08:00

182 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 分离部署
description: 中间件独立部署,业务服务单独一台或多台
outline: deep
---
# 分离部署
把 MySQL、Redis、RabbitMQ、Consul 放到独立主机或使用云托管,业务服务单独部署。
## 适用场景
- 数据库已有云托管实例(RDS、云 Redis、云 MQ)
- 中间件已有独立集群,不希望在业务机上再跑一套
- 业务机配置较低,不适合同时承载数据库
## 部署结构
```text
┌─────────────────────┐ ┌──────────────────────┐
│ 中间件主机 / 云服务 │ │ 业务主机 │
│ │ │ │
│ MySQL :3306 │◄───────┤ admin-svr :8008 │
│ Redis :6379 │ │ admin-ui :80 │
│ RabbitMQ :5672 │ │ openapi :8000 │
│ Consul :8500 │ │ app-server :8010 │
│ │ │ worker-svr │
└─────────────────────┘ │ upstream-chan/-proxy│
└──────────────────────┘
```
## 一、准备中间件
在中间件侧完成(云托管通常已就绪):
| 组件 | 需准备 |
| --- | --- |
| MySQL | 建库 `db_iotlcm`、执行 `schema/` 脚本、建应用账号 `u_iotlcm` |
| Redis | 开启认证,记录地址与口令 |
| RabbitMQ | 建用户与 vhost,记录地址与口令 |
| Consul | 单机模式即可,记录地址 |
### 初始化数据库
在能连到目标 MySQL 的机器上执行:
```bash
# 按文件名顺序执行全部脚本
for f in schema/0*.sql; do
echo "执行 $f"
mysql -h <MySQL地址> -uroot -p<口令> < "$f"
done
```
::: warning `.sh` 脚本需单独执行
`schema/04-users.sh` 与 `schema/05-reset-passwords.sh` 依赖环境变量,不能直接重定向执行:
```bash
MYSQL_ROOT_PASSWORD='<口令>' MYSQL_APP_PASSWORD='<应用口令>' \
MYSQL_HOST=<地址> bash schema/04-users.sh
```
:::
## 二、准备业务机 Compose
复制 `docker-compose.yml`,删除四个中间件服务(`mysql`、`redis`、`rabbitmq`、`consul`),并移除各处 `depends_on` 对它们的引用。
```yaml
# docker-compose.app.yml
services:
admin-svr:
image: '${REGISTRY}/iotlcm/iotlcm-admin-svr:${TAG}'
# ... 保留 ports / volumes / environment
# 删除 depends_on 中对 mysql/redis/rabbitmq 的依赖
```
::: tip 网络要求
业务机必须能访问中间件主机的对应端口。若有防火墙,放行:
- 业务机 → 中间件:3306、6379、5672、8500
- 外部 → 业务机:仅反向代理端口(80 / 443)
:::
## 三、修改配置指向外部地址
这是本节最关键的一步。所有配置里以**服务名**书写的地址都要改成实际地址。
### admin-svr
```yaml
database:
default:
link: "mysql:u_iotlcm:<口令>@tcp(<MySQL地址>:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
redis:
default:
address: "<Redis地址>:6379"
pass: "<Redis口令>"
rabbitmq:
dsn: "amqp://<用户>:<口令>@<RabbitMQ地址>:5672/"
```
### openapi
同上三处:`database.default.link`、`redis.default.address`、`rabbitmq.dsn`。
### worker-svr
同上三处。注意 `tsdb.tdengine.dsn` 若使用 TDengine 也要改为实际地址。
### app-server
改 `database.default.link` 与 `redis.default`。
### upstream-chan / upstream-proxy
```yaml
registry:
type: "consul"
address: "<Consul地址>:8500"
```
同时改 `database.default.link` 与 `redis.default`。
### 服务互访地址
若业务服务分散在多台机器,`admin-svr`、`worker-svr`、`app-server` 配置里的上游地址也要改:
```yaml
upstream:
proxy:
address: "<upstream-proxy所在主机>:8510"
gateway:
address: "<upstream-chan所在主机>:8110"
```
`upstream-proxy` 的 `gateway.address` 同理。
::: danger 最容易出的错
只改数据库地址,忘了改 `upstream-proxy:8510`、`upstream-chan:8110` 这类服务名。症状是服务能启动、数据库也通,但批次执行、智能诊断全部超时。
:::
## 四、启动
```bash
# 按需修改 docker-compose.app.yml 的镜像地址、端口与口令
cp -r config.example config
vi config/*/config.yaml # 按上节改为外部地址
docker compose -f docker-compose.app.yml up -d
```
此时 `docker-compose.yml` 中的 `MYSQL_*`、`REDIS_PASSWORD`、`RABBITMQ_PASSWORD` 不再用于启动中间件容器,但仍作为配置中的变量来源,**取值要与中间件实际口令一致**。
## 五、验证
```bash
docker compose -f docker-compose.app.yml ps
# 数据库连通性
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv <MySQL地址> 3306'
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv <Redis地址> 6379'
# Redis 认证
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'redis-cli -h <地址> -a "<口令>" ping'
# 服务日志
docker compose -f docker-compose.app.yml logs --tail=50 admin-svr
```
浏览器登录管理端,确认能查卡、能发起业务办理。
## 六、注意事项
| 项 | 说明 |
| --- | --- |
| 网络延迟 | 业务机到中间件的延迟建议 < 5ms。跨地域部署会造成批次执行明显变慢 |
| 连接池 | 外部数据库延迟较高时,适当调大 `database.default.maxIdle` 与 `maxOpen` |
| 备份 | 分离后数据库备份由中间件侧负责,本仓的 `backup.sh` 需调整连接参数 |
| 时钟 | 各机器需开启 NTP 同步,否则全量同步的时间窗口判断会出错 |