跳转到内容

备份与恢复

生产环境必须备份两类数据:

数据是否必须原因
PostgreSQL必须用户、房间、权限、Provider 实例、用户偏好、审计和业务数据都在数据库中
生产 secret必须JWT、OPAQUE、Provider 凭据加密 key、cluster secret、management token 等影响登录和数据解密
配置文件强烈建议恢复时需要精确还原监听、域名、依赖、路径和功能开关
HLS 共享存储按需如果你需要保留直播 HLS 文件或多副本共享片段
proxy slice cache通常不必这是可再生缓存,丢失后只会降低缓存命中率
Redis通常不必长期备份Redis 保存短期状态和协调状态,清空会影响正在进行的登录、验证码、限流窗口和集群短期状态

适合中小规模部署和人工备份:

Terminal window
pg_dump \
--format=custom \
--file=synctv-$(date +%Y%m%d-%H%M%S).dump \
"$DATABASE_URL"

恢复:

Terminal window
createdb synctv_restore
pg_restore \
--dbname=postgresql://synctv:password@localhost:5432/synctv_restore \
--clean \
--if-exists \
synctv-20260504-120000.dump

至少保存这些值:

配置建议保存位置
jwt.secretSecret Manager、Kubernetes Secret、密码管理器
security.opaque_server_setup_secretSecret Manager、离线加密备份
security.credential_encryption_keySecret Manager、离线加密备份
server.cluster_secretKubernetes Secret 或 Secret Manager
management.auth_tokenSecret Manager
metrics.auth.*监控系统 secret
email.smtp_passwordSecret Manager
Provider token/API key/cookieSecret Manager 或数据库内加密存储

如果你使用 _file 配置,把文件内容备份,而不是只备份路径。

  1. 停止 SyncTV 服务,避免恢复过程中继续写入。
  2. 恢复生产 secret,确保所有 key 与备份时一致。
  3. 恢复配置文件或部署 values。
  4. 恢复 PostgreSQL。
  5. 按需要恢复 HLS 共享存储。
  6. 启动同版本 SyncTV,执行 synctv db status
  7. 如果需要升级,先按 升级与迁移 的流程完成配置、镜像和回滚风险检查。
  8. 启动服务。服务启动阶段会自动执行 embedded SQLx migrations,然后检查 /health/ready、登录、Provider 访问、WebSocket 和 metrics。

恢复后至少验证:

Terminal window
synctv db status
synctv config validate
curl -fsS http://localhost:8080/health/ready

业务层验证:

  • root/admin 能登录。
  • 开启 2FA 的用户仍能完成登录。
  • 已保存的 Provider 凭据能解密并访问上游。
  • 房间列表、成员、播放列表和权限正常。
  • 如果启用 WebAuthn,passkey challenge 和 origin 配置正常。
  • 如果启用 OAuth2,redirect state 能在 Redis 正常读写。

建议:

  • 每次大版本升级前做一次恢复演练。
  • 每次调整 secret 管理方式后做一次恢复演练。
  • 至少定期确认备份文件可读、可解密、可导入。

不要只检查“备份任务成功”。真正有价值的是确认备份能恢复成可登录、可播放、可管理的 SyncTV 实例。

Redis 丢失通常不破坏持久业务数据,但会造成短期行为变化:

  • OAuth2 state 失效,用户需要重新开始 OAuth2 登录。
  • WebAuthn challenge 失效,用户需要重新发起认证。
  • 邮箱验证码失效,需要重新发送。
  • token blacklist 丢失,被拉黑的旧 token 可能直到 JWT 自身过期才失效。
  • 限流计数重置。
  • 集群节点需要重新注册和 catch-up。

如果你依赖强 token 吊销语义,Redis 应使用高可用部署,并把 token 有效期设置得足够短。