升级与迁移
升级时要把三件事分开看:
- 二进制或镜像版本:决定代码行为和 API。
- 数据库 migration:决定数据库结构,可能不可逆。
- 配置和部署模板:决定服务入口、secret、依赖、缓存、集群和观测行为。
- 阅读新版本 release notes 或变更记录。
- 备份 PostgreSQL 和生产 secret。
- 在测试环境使用生产同结构数据启动目标版本,验证自动 migration 和业务读写。
- 运行
synctv config validate。 - 运行
synctv config show --output yaml保存当前有效配置快照。 - 对比 配置总索引 和 完整配置示例。
- 如果使用 Helm,执行
helm lint和helm template。 - 如果使用 Compose,执行
docker compose config。
数据库 migration
Section titled “数据库 migration”SyncTV 服务启动阶段会自动执行 embedded SQLx migrations。migration 状态记录在 _sqlx_migrations,并由 SQLx 在数据库侧加锁保证同一套 migration 不会被多个副本并发执行。多副本同时启动时,不需要额外用 Job 来人工串行化 migration,也不需要管理员判断“这次是否需要迁移”。
synctv db migrate 仍然保留为显式运维命令,适合发布前预检、CI、测试环境和排障。它执行的 migration 与服务启动时自动执行的是同一套 embedded migrations。
查询状态:
synctv db status可选预检:
synctv db migrate容器中执行示例:
docker compose run --rm synctv synctv db migrate生产环境是否单独运行 synctv db migrate 是发布流程选择,不是正确性要求。单独运行的价值是可观测性和失败边界更清晰:可以在新版本接流量前看到 dirty migration、checksum drift 或数据库权限问题。即使不单独运行,服务启动也会自动迁移。
Docker Compose 升级
Section titled “Docker Compose 升级”- 拉取新镜像。
- 备份数据库和 secret。
- 运行
docker compose config确认最终配置。 - 可选执行
synctv db migrate做发布前预检。 - 重启服务,启动阶段会自动完成 pending migrations。
- 检查
/health/ready、登录、WebSocket、Provider 和 metrics。
常用命令:
docker compose pulldocker compose up -ddocker compose logs -f synctvHelm 升级
Section titled “Helm 升级”helm lint ./helm/synctvhelm template synctv ./helm/synctv -f values.production.yaml重点检查:HTTP Service 和 gRPC Service 是否分开;HTTP Ingress 和 gRPC Ingress 是否分开;gRPC Ingress 是否设置 nginx.ingress.kubernetes.io/backend-protocol: "GRPC";secret、volume、env、ServiceMonitor 或 VMServiceScrape 是否符合预期。
helm upgrade --install synctv ./helm/synctv \ -n synctv \ -f values.production.yaml发布后检查:
kubectl -n synctv rollout status deploy/synctvkubectl -n synctv logs deploy/synctv --tail=200kubectl -n synctv get ingress,svc,pod滚动更新与长连接
Section titled “滚动更新与长连接”SyncTV 有 WebSocket、HTTP-FLV、HLS、gRPC stream 等长连接或流式请求。滚动更新时要给连接 drain 留时间。
建议:
server.shutdown_drain_timeout_seconds与 KubernetesterminationGracePeriodSeconds匹配。- readiness probe 在进程开始关闭时尽快失败。
- 不要把
terminationGracePeriodSeconds设置得比 drain timeout 更短。 - 对直播或大量 WebSocket 场景,先在低峰期发布。
配置变更策略
Section titled “配置变更策略”升级时不要无差别复制全量默认配置。建议:
synctv --config /etc/synctv/synctv.yaml config show --output yaml > effective-before.yaml然后只修改你明确需要负责的字段:
- secret 和 secret 文件路径。
- 数据库、Redis、SMTP、OAuth2、WebAuthn。
- 端口、域名、CORS、可信代理。
- 集群、HLS 共享存储、slice cache 文件后端。
- metrics、日志格式和限流。
回滚前先判断:
| 情况 | 建议 |
|---|---|
| 只改了配置或镜像,目标版本没有新的 migration | 可以按部署系统回滚 |
| 新版本已启动并自动执行 migration,但旧版本兼容新 schema | 可以回滚镜像,但要重点观察错误日志 |
| 新版本已执行不可逆 migration | 优先前滚修复;如必须回滚,需要恢复数据库备份 |
| secret 被错误轮换 | 恢复旧 secret,然后重启服务 |
回滚后仍要运行:
synctv db statussynctv config validatecurl -fsS http://localhost:8080/health/ready至少确认:
- 新 Pod 或容器 ready。
/health/ready返回成功。- root/admin 能登录。
- 开启 2FA 的用户能完成 MFA。
- OAuth2、WebAuthn、邮箱验证码按需正常。
- 房间 WebSocket 同步正常。
- Provider 直连和代理路径正常。
- metrics 能被抓取。
- 日志没有持续 migration、Redis、数据库连接或 Provider 错误。