docs: 补充其他部署方式(二进制、自建镜像、分离、离线)
新增「其他部署方式」分组,共 5 页: - 方式对比与选型:5 种方式对照、服务依赖表、服务间通信易错点 - 二进制部署:各服务 Go 版本/CGO/构建目录/产物名对照表, admin-svr 需 CGO 的说明,交叉编译限制,systemd unit 模板, 静态前端交给 nginx,升级回滚流程 - 自建镜像:各仓 Dockerfile 位置与构建上下文、构建参数、 镜像命名规则、批量构建脚本、常见问题 - 分离部署:中间件独立,业务机精简 compose,配置改为外部地址 - 离线部署:镜像导出导入、校验、内网镜像仓库方案 同时记录一个实际阻塞:openapi/app/admin-ui 共 5 个 Dockerfile 的 FROM 仍指向私有镜像仓库,外部环境无法构建,页内给出替换方法。
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
---
|
||||
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
|
||||
cp .env.example .env
|
||||
vi .env # REGISTRY、TAG、各类口令
|
||||
cp -r config.example config
|
||||
vi config/*/config.yaml # 按上节改为外部地址
|
||||
|
||||
docker compose -f docker-compose.app.yml up -d
|
||||
```
|
||||
|
||||
此时 `.env` 中的 `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 同步,否则全量同步的时间窗口判断会出错 |
|
||||
Reference in New Issue
Block a user