部署指南
本文档只保留当前仓库已有产物对应的部署方式:Docker 镜像、docker compose 和二进制部署。
推荐组件
- Server
- Agent
- MySQL 或 PostgreSQL
- Redis
- 可选:analytics-worker、ingest、ClickHouse
Docker 部署
三份编排按场景分工,别混用:
| 编排 | 镜像来源 | 适用 |
|---|---|---|
docker-compose.quickstart.yml | ghcr 预构建 | 快速体验/演示:一条命令最小栈,无需本地构建 |
docker-compose.yml | 源码构建 | 本地开发:改代码即改容器 |
docker-compose.deploy.yml | ghcr 预构建 | 生产 HA:双实例 server/agent + haproxy |
快速体验(quickstart,开箱即用)
预构建镜像(ghcr.io,匿名可拉)起最小栈:postgres + redis + server + agent + dashboard。
cd docker
docker compose -f docker-compose.quickstart.yml up -d
# 验证:五容器全 healthy;curl http://localhost:18780/healthz 应见
# "ok":true 且 registry.agentsHealthy=1(agent 已注册);Dashboard 在 :8000常用操作:
# 看日志 / 停止
docker compose -f docker-compose.quickstart.yml logs -f server
docker compose -f docker-compose.quickstart.yml down
# 升级全栈(pull + 重建)
docker compose -f docker-compose.quickstart.yml pull
docker compose -f docker-compose.quickstart.yml up -d
# 清数据(⚠️ 连数据卷一起删:业务库、上传文件全没)
docker compose -f docker-compose.quickstart.yml down -v可选组件用 profile 拉起,不混进默认最小栈:
# SDK 六语言 + OpenAPI 示例——只想起示例时显式列服务名(见下「隐式全栈更新」坑)
docker compose -f docker-compose.quickstart.yml --profile sdk-examples \
up -d sdk-demo-go sdk-demo-python sdk-demo-java \
sdk-demo-js sdk-demo-cpp sdk-demo-csharp
# 分析管道(ClickHouse + ingestion + worker);置 ANALYTICS_BRIDGE_ENABLED=true
# 后 server 事件才写入分析流
ANALYTICS_BRIDGE_ENABLED=true docker compose -f docker-compose.quickstart.yml \
--profile analytics up -d隐式全栈更新坑:
--profile sdk-examples pull && up -d会把 server/agent/dashboard 的 main 镜像一并拉新并级联 recreate,效果等同一次 升级(新功能 + 数据库迁移直接上线)。只想重建示例容器时,pull/up 都显式 限定服务名;接受级联就顺手验证新迁移已落库。secret/端口/多游戏单库切换 等说明见docker/docker-compose.quickstart.yml文件头注释。
本地开发(源码构建)
docker compose up -d当前镜像构建入口:
docker/Dockerfile.server->./cmd/serverdocker/Dockerfile.agent->./cmd/agentdocker/Dockerfile.analytics-worker->./cmd/analytics-workerdocker/Dockerfile.ingest->./cmd/ingest
HA 双实例部署(docker-compose.deploy.yml)
生产编排 docker/docker-compose.deploy.yml 按 Server 多实例 HA 架构 部署双实例拓扑:
┌─► croupier-server ── HTTP API 18780 ─┐
浏览器 ──► dashboard nginx ┤ ├─► 共享 postgres/redis
(L7 分流) └─► croupier-server2 ── HTTP API 18780 ─┘
agent/agent2 ── TCP ──► haproxy :19090(L4:leastconn + tcp-check + 运行时重解析)
├─► croupier-server :19090 ──┐
└─► croupier-server2 :19090 ──┴─► 集群互联转发 + 共享目录
sdk-examples ── HTTP ──► agent:19091 haproxy stats ──► :8404(连接分布排查)
openapi-provider-demo ── TCP ──► haproxy :19090(内嵌 Agent,providers.yaml 注册函数)- 双 Server(
server/server2,YAML anchor 共享配置):集群成员表 + owner 转发自动协同;任一实例故障,另一实例接管调用(Agent 断连重连经 LB 分发至存活实例,架构文档 §6 故障语义) - 双 Agent(
agent/agent2):上游统一走haproxy:19090L4 LB;configs/agent2.yaml区分 Agent ID 与 httpAddr(该文件不入库,部署时复制configs/agent.yaml修改差异项生成) - 两层负载均衡各司其职(nginx 管人,HAProxy 管机器):
- dashboard nginx(L7):
split_clients按请求哈希分流到两实例 18780 + docker DNS resolver 运行时解析(10s,实例重建换 IP 不 502);SSE 已关缓冲 - haproxy(L4):Agent 自行开发 transport TCP 长连接
leastconn打散 +tcp-check主动健康检查 +resolvers运行时重解析(实例重建自动跟随)+ stats 页(:8404)
- dashboard nginx(L7):
- 宿主端口只由每组实例 1 发布(server: 8443→19090 transport / 18780 HTTP、agent: 19091);实例 2 仅集群内可达
- openapi-provider-demo(
sdk-examplesprofile,随enable_sdk_examples=true部署):examples/openapi-provider的常驻容器(镜像croupier-openapi-provider-demo),内嵌 Agent 经 providers.yaml 把 players API 注册进 server——Dashboard「OpenAPI Sources → 运行时导入」区块的数据源,scope 跟随CROUPIER_SDK_EXAMPLE_GAME_ID/ENV
cd docker
docker compose -f docker-compose.deploy.yml up -d
# 验证:Dashboard「运维中心 → 集群拓扑」应显示两实例在线 + agent 归属分布历史注意:曾用 dashboard nginx 的 stream 块承担 Agent L4(upstream 仅启动时解析,实例重建换 IP 需
--force-recreate dashboard);现由独立 haproxy 服务承担(运行时重解析 + 主动健康检查),该限制不再存在。
负载均衡方案选型
Agent 的 L4 入口与 Dashboard 的 L7 入口均可按部署环境替换,详细对比(nginx stream vs HAProxy vs keepalived+LVS)、配置示例与迁移路径见独立篇 负载均衡。速记:
| 方案 | 层级 | 适用 |
|---|---|---|
| HAProxy(本仓库默认) | L4 | Agent 接入 LB:运行时 DNS 重解析 + 主动健康检查 + stats 可观测 |
| nginx stream | L4 TCP | 备选:复用 dashboard 镜像零新增组件,但 upstream 仅启动时解析(实例重建需 reload)、无主动健康检查 |
| keepalived + LVS/nginx/HAProxy | VRRP + L4 | LB 自身高可用(VIP 漂移);公有云等价物是云 NLB |
| Kubernetes Service | L4 | K8s 环境无需自建 LB 层 |
无论哪种方案,Agent 侧无需任何改动:单地址连接 + 断线重连 + 重新注册(架构文档 §6.2 故障转移时间线)。
单独构建镜像
docker build -t croupier-server:latest -f docker/Dockerfile.server .
docker build -t croupier-agent:latest -f docker/Dockerfile.agent .二进制部署
Server
make server
./bin/croupier-server --config configs/server.yamlAgent
make agent
./bin/croupier-agent --config configs/agent.yamlAnalytics 链路
make worker
make ingest
./bin/analytics-worker
ANALYTICS_INGEST_SECRET=dev-secret ./bin/ingest --addr :8088 --secret dev-secret服务安装脚本
仓库已提供:
scripts/install-systemd.shscripts/install-launchd.shscripts/install-windows-service.ps1
健康检查
curl http://localhost:18780/healthz
curl http://localhost:8088/healthz部署建议
- 数据库和 Redis 使用外部托管实例,不与应用容器共存储。
- 生产环境不要直接使用仓库默认的
configs/*.yaml,应复制后按环境落地。 - 通过环境变量注入
DATABASE_URL、JWT_SECRET、对象存储密钥等敏感项。 - Server 对外暴露 HTTP 入口;Agent 经 L4 负载均衡入口接入(见上文「负载均衡方案选型」),不要直连单个 Server 实例。
