104 lines
5.0 KiB
Markdown
104 lines
5.0 KiB
Markdown
# Orbit 容器发布说明
|
||
|
||
本文定义通用 Orbit 镜像的构建内容、启动契约和探针语义。镜像不包含业务 Worker、行业规则或数据库;数据库连接、凭据和 TLS 参数由部署环境注入。
|
||
|
||
## 1. 构建
|
||
|
||
根目录的 `Dockerfile` 使用仓库声明的 Go 1.27.1 构建三个可执行文件:
|
||
|
||
- `/usr/local/bin/orbit`:HTTP、Worker/Event WebSocket 和后台恢复进程。
|
||
- `/usr/local/bin/orbit-migrate`:显式执行迁移;服务启动不会自动改库。
|
||
- `/usr/local/bin/orbit-admin`:结构核验、凭据初始化和只读运维命令。
|
||
|
||
构建阶段关闭 CGO 并使用 `-trimpath`,运行阶段为无 shell 的最小镜像,以减少运行时写入面。镜像保留系统 CA 证书,允许通过受保护 DSN 使用 MySQL TLS。
|
||
|
||
```sh
|
||
docker build --platform linux/amd64 -t registry.example/orbit:dev .
|
||
docker image inspect registry.example/orbit:dev --format '{{.Id}}'
|
||
```
|
||
|
||
生产发布应把标签绑定到不可变提交和镜像摘要,并在目标架构重新构建或执行等价的交叉构建核验。构建时可注入版本身份:
|
||
|
||
```sh
|
||
docker build --platform linux/amd64 \
|
||
--build-arg VERSION=1.0.0 \
|
||
--build-arg REVISION="$(git rev-parse HEAD)" \
|
||
--build-arg BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||
-t registry.example/orbit:1.0.0 .
|
||
```
|
||
|
||
镜像同时写入 OCI `org.opencontainers.image.version`、`org.opencontainers.image.revision` 和 `org.opencontainers.image.created` 标签;可以先核对标签,再在节点启动后通过 `GET /version` 核对进程实际使用的值。`registry.example` 只是占位符,不是平台依赖。
|
||
|
||
构建完成后先保存发布物身份清单:
|
||
|
||
```sh
|
||
docker run --rm --entrypoint /usr/local/bin/orbit-admin \
|
||
registry.example/orbit:1.0.0 release manifest > orbit-release-manifest.json
|
||
```
|
||
|
||
清单把当前构建身份、协议版本和内置迁移校验和固定下来;部署前再用 `orbit-admin verify` 对目标数据库逐项核对。两者不一致时停止发布,不通过人工修改清单来“对齐”。
|
||
|
||
## 2. 迁移、核验和启动
|
||
|
||
迁移与服务使用同一镜像但分开执行;迁移账户和运行账户由数据库权限策略隔离。以下命令只展示容器契约,凭据必须来自秘密管理:
|
||
|
||
```sh
|
||
export ORBIT_MYSQL_DSN='user:password@tcp(db.internal:3306)/orbit'
|
||
|
||
docker run --rm \
|
||
--env ORBIT_MYSQL_DSN \
|
||
--entrypoint /usr/local/bin/orbit-migrate \
|
||
registry.example/orbit:dev up
|
||
|
||
docker run --rm \
|
||
--env ORBIT_MYSQL_DSN \
|
||
--entrypoint /usr/local/bin/orbit-admin \
|
||
registry.example/orbit:dev verify
|
||
|
||
# 发布候选还应带上同一镜像生成的身份清单;不一致时停止发布。
|
||
docker run --rm \
|
||
--env ORBIT_MYSQL_DSN \
|
||
--entrypoint /usr/local/bin/orbit-admin \
|
||
-v "$PWD/orbit-release-manifest.json:/run/orbit-release-manifest.json:ro" \
|
||
registry.example/orbit:1.0.0 verify --manifest /run/orbit-release-manifest.json
|
||
|
||
docker run --rm \
|
||
--env ORBIT_MYSQL_DSN \
|
||
--env ORBIT_HTTP_ADDR=0.0.0.0:8080 \
|
||
--env ORBIT_CONSOLE_QUEUE_ID=queue_xxx \
|
||
--env ORBIT_RUNTIME_BATCH_LIMIT=100 \
|
||
--env ORBIT_WORKFLOW_TICK_INTERVAL=1s \
|
||
--env ORBIT_SCHEDULE_TICK_INTERVAL=1s \
|
||
--env ORBIT_RECOVERY_TICK_INTERVAL=2s \
|
||
--env ORBIT_SHUTDOWN_TIMEOUT=10s \
|
||
--env ORBIT_WORKER_CONNECTION_LIMIT=128 \
|
||
--env ORBIT_EVENT_CONNECTION_LIMIT=128 \
|
||
--env ORBIT_DISPATCH_WORKERS=4 \
|
||
--env ORBIT_DISPATCH_CAPACITY=128 \
|
||
--env ORBIT_METRICS_ADDR=127.0.0.1:9090 \
|
||
--publish 8080:8080 \
|
||
registry.example/orbit:dev
|
||
```
|
||
|
||
`ORBIT_CONSOLE_QUEUE_ID` 是控制台的可选默认队列范围,只用于打开 `/console/` 时预填队列 ID,不是认证凭据。服务端仍要求业务请求携带有权限的 Bearer Token;多队列部署可以省略此变量,改为在浏览器选择凭据 JSON,由其中的 `queue_id` 自动填充。
|
||
|
||
生产编排应先完成迁移和 `verify`,再启动新节点。服务收到 `SIGTERM` 后停止接收新连接并在有限窗口内关闭 HTTP、WebSocket 和后台循环;编排器的终止宽限期必须覆盖该窗口。启动后才能把节点加入流量池。
|
||
|
||
## 3. 探针和监听边界
|
||
|
||
负载均衡或编排器使用:
|
||
|
||
```text
|
||
GET /health/live 进程存活
|
||
GET /health/ready MySQL、迁移账本及零外键检查
|
||
GET /version 版本、提交和协议身份
|
||
```
|
||
|
||
`ready` 返回 `503` 时应摘除节点并保留原幂等键;不能把数据库连接失败解释为业务失败。metrics 监听由 `ORBIT_METRICS_ADDR` 单独启用,默认关闭,不应通过公共业务入口暴露。
|
||
|
||
镜像内没有 shell 和调试工具,故障定位依赖结构化日志、健康响应、受保护指标和 `orbit-admin observe snapshot`。不要在容器中执行迁移回滚、删除历史事件或修改审计数据。
|
||
|
||
## 4. 发布验收
|
||
|
||
镜像构建通过只证明发布物可复现,不等于生产高可用。发布候选仍需按[交付核对清单](release-checklist.md)完成真实 MySQL 回归、滚动替换、复制切换、容量、备份恢复和 RPO/RTO 验收。业务 Worker 继续独立部署,通过 HTTP/WebSocket SDK 接入。
|