102 lines
4.6 KiB
Markdown
102 lines
4.6 KiB
Markdown
# Standalone CVM Deployment Templates
|
||
|
||
本目录提供不依赖 Kubernetes 的生产部署模板。目标形态是 systemd 托管 Docker 容器,公网 CLB 只接 gateway,内部服务通过内网 CLB/DNS 或固定私网地址访问。
|
||
|
||
生产环境 MySQL、Redis、MQ 使用腾讯云托管资源。本目录只管理本仓库 Go 服务容器,不在业务 CVM 上安装或重启 MySQL/Redis/MQ。
|
||
|
||
## Layout
|
||
|
||
- `systemd/*.service`: 每个后端服务一份 systemd unit,负责启动、停止和故障重启 Docker 容器。
|
||
- `docker/*.env.example`: 每个服务一份 Docker 运行参数示例,只保存镜像名、容器名、配置路径和停止等待时间。
|
||
- 服务业务配置仍使用 `services/<service>/configs/config.tencent.example.yaml` 作为线上模板,渲染后放到 `/etc/hyapp/<service>/config.yaml`。
|
||
|
||
## Install One Service
|
||
|
||
以 `gateway-service` 为例:
|
||
|
||
```bash
|
||
sudo mkdir -p /etc/hyapp/gateway-service
|
||
sudo cp deploy/standalone/docker/gateway-service.env.example /etc/hyapp/gateway-service/docker.env
|
||
sudo cp services/gateway-service/configs/config.tencent.example.yaml /etc/hyapp/gateway-service/config.yaml
|
||
sudo vi /etc/hyapp/gateway-service/docker.env
|
||
sudo vi /etc/hyapp/gateway-service/config.yaml
|
||
|
||
sudo cp deploy/standalone/systemd/hyapp-gateway-service.service /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now hyapp-gateway-service
|
||
sudo systemctl status hyapp-gateway-service
|
||
sudo docker inspect --format '{{json .State.Health}}' hyapp-gateway-service
|
||
```
|
||
|
||
`docker.env` 不承载业务密钥;密钥仍在最终 `config.yaml` 中,或者由发布系统先从密钥系统渲染到 `config.yaml`。当前代码只读取单个 YAML,不会自动展开 `${VAR}`。
|
||
|
||
## Network
|
||
|
||
模板默认使用 `--network=host`,让容器直接监听项目约定的 `13xxx` 端口。这样 CLB、安全组和本机排障都以同一个端口工作:
|
||
|
||
- `13000`: gateway HTTP
|
||
- `13001`: room gRPC
|
||
- `13004`: wallet gRPC
|
||
- `13005`: user gRPC
|
||
- `13006`: activity gRPC
|
||
- `13007`: cron gRPC
|
||
- `13008`: game gRPC
|
||
- `13009`: notice gRPC
|
||
|
||
同一台 CVM 上不要启动两个相同端口的同服务实例。做蓝绿发布时优先使用新 CVM 或新容器节点,健康通过后再挂载到 CLB。
|
||
|
||
## Rolling Update
|
||
|
||
普通服务的无感更新流程:
|
||
|
||
1. 在新 CVM 上准备 `/etc/hyapp/<service>/docker.env` 和 `/etc/hyapp/<service>/config.yaml`。
|
||
2. `systemctl start hyapp-<service>`,等待 Docker health 进入 `healthy`。
|
||
3. 将新实例加入对应 CLB 或内部服务入口。
|
||
4. 观察错误率、延迟和服务日志。
|
||
5. 从 CLB 摘除旧实例,等待连接保护或业务 drain 窗口结束。
|
||
6. `systemctl stop hyapp-<service>`,Docker 会先发送 SIGTERM,服务内的 graceful shutdown 会进入 draining 并等待已进入请求结束。
|
||
|
||
`room-service` 已经具备 Redis owner route 和非 owner 自动转发能力,可以把多个 active 实例挂到内网 CLB 后面。每个实例仍必须配置唯一 `node_id`,且 `advertise_addr` 必须是实例私网地址,不能写 CLB 地址。
|
||
|
||
## Tencent TAT Rolling Deploy
|
||
|
||
当前腾讯云 CVM 生产部署使用 `deploy/tencent-tat`:
|
||
|
||
- `inventory.prod.example.json`: 记录 gateway/new-app/new-game/new-app-activity/pay 这批机器和服务映射。
|
||
- `hyapp_tat_deploy.py`: 通过 TAT 在目标机执行 systemd 重启和镜像更新。
|
||
- 发布时对配置了 CLB 的服务逐实例改权重到 `0`,健康恢复后再恢复原权重。
|
||
|
||
常用命令:
|
||
|
||
```bash
|
||
python3 deploy/tencent-tat/hyapp_tat_deploy.py restart \
|
||
--inventory deploy/tencent-tat/inventory.prod.json \
|
||
--services gateway-service \
|
||
--yes
|
||
|
||
python3 deploy/tencent-tat/hyapp_tat_deploy.py deploy \
|
||
--inventory deploy/tencent-tat/inventory.prod.json \
|
||
--services gateway-service,room-service,user-service,wallet-service,activity-service,game-service,notice-service \
|
||
--tag 20260513-1349 \
|
||
--yes
|
||
```
|
||
|
||
详细步骤和无感发布边界见 `deploy/tencent-tat/README.md`。
|
||
|
||
## Service Discovery
|
||
|
||
不使用 Kubernetes 时,第一阶段推荐用内网 CLB/DNS 提供稳定入口,例如:
|
||
|
||
```yaml
|
||
user_service_addr: "user.service.internal:13005"
|
||
wallet_service_addr: "wallet.service.internal:13004"
|
||
activity_service_addr: "activity.service.internal:13006"
|
||
room_service_addr: "room.service.internal:13001"
|
||
game_service_addr: "game.service.internal:13008"
|
||
notice_service_addr: "notice.service.internal:13009"
|
||
```
|
||
|
||
如果后续引入 Consul/Nacos,仍建议让业务配置只保存稳定服务名,不把实例 IP 写进每个服务配置。
|
||
|
||
MySQL、Redis、MQ 不属于这里的服务发现对象。它们在 `config.yaml` 中写腾讯云托管资源的内网 endpoint,变更走对应云产品流程。
|