部署仓已改为开箱即用:config/ 直接是配置文件、口令等值内置在
docker-compose.yml、不再有 .env。
同步调整:
- 概览:部署流程改为 git clone + docker compose up -d 三步
- 配置说明:重写为「编排层 + 应用层」,说明为何不用环境变量
(GoFrame 不展开配置文件中的 ${VAR})、改口令需同步三处、
口令不能含 @ : / 等字符
- 启动与验证:去掉准备步骤,schema 脚本数改为 13 个
- 环境准备:镜像仓库改为描述编排文件中的实际地址
- 升级备份/离线/分离/自建镜像:.env 相关操作改为修改编排文件
5.6 KiB
title, description, outline
| title | description | outline |
|---|---|---|
| 分离部署 | 中间件独立部署,业务服务单独一台或多台 | deep |
分离部署
把 MySQL、Redis、RabbitMQ、Consul 放到独立主机或使用云托管,业务服务单独部署。
适用场景
- 数据库已有云托管实例(RDS、云 Redis、云 MQ)
- 中间件已有独立集群,不希望在业务机上再跑一套
- 业务机配置较低,不适合同时承载数据库
部署结构
┌─────────────────────┐ ┌──────────────────────┐
│ 中间件主机 / 云服务 │ │ 业务主机 │
│ │ │ │
│ 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 的机器上执行:
# 按文件名顺序执行全部脚本
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 依赖环境变量,不能直接重定向执行:
MYSQL_ROOT_PASSWORD='<口令>' MYSQL_APP_PASSWORD='<应用口令>' \
MYSQL_HOST=<地址> bash schema/04-users.sh
:::
二、准备业务机 Compose
复制 docker-compose.yml,删除四个中间件服务(mysql、redis、rabbitmq、consul),并移除各处 depends_on 对它们的引用。
# 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
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
registry:
type: "consul"
address: "<Consul地址>:8500"
同时改 database.default.link 与 redis.default。
服务互访地址
若业务服务分散在多台机器,admin-svr、worker-svr、app-server 配置里的上游地址也要改:
upstream:
proxy:
address: "<upstream-proxy所在主机>:8510"
gateway:
address: "<upstream-chan所在主机>:8110"
upstream-proxy 的 gateway.address 同理。
::: danger 最容易出的错
只改数据库地址,忘了改 upstream-proxy:8510、upstream-chan:8110 这类服务名。症状是服务能启动、数据库也通,但批次执行、智能诊断全部超时。
:::
四、启动
# 按需修改 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 不再用于启动中间件容器,但仍作为配置中的变量来源,取值要与中间件实际口令一致。
五、验证
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 同步,否则全量同步的时间窗口判断会出错 |