跳转到内容

配置总索引

静态配置字段索引列出源码默认值;实际生效值还会叠加配置文件、环境变量、CLI 覆盖、路径解析和时区 fallback。

完整 YAML 模板见 完整配置示例。当前二进制的生效配置可用 synctv config show --output yaml 查看,secret 会打码。

OAuth2 provider 实例属于 Runtime settings。远程 media provider instance 通过管理 API/CLI 持久化,不属于静态配置文件。

绝大多数字段可以保留默认值。生产上线优先处理 secret、数据库、入口、安全边界和备份。

配置什么时候要改常见错误改动后生产建议
jwt.secret任何生产部署使用 change-me-in-production 或提交到 Git需要重启;旧 token 可能失效用 Secret Manager 或 secret file 注入
security.opaque_server_setup_secret启用本地密码/OPAQUE 登录每次部署随机生成需要重启;随意变更会影响密码记录生成一次,长期备份
security.credential_encryption_key保存加密 Provider 凭据不是 64 个十六进制字符,或丢失 key需要重启;丢失会影响已加密凭据读取openssl rand -hex 32,加密备份
database.url / 拆分字段连接生产 PostgreSQL指向本机开发库或连接数过大需要重启PostgreSQL 必须持久化并备份
redis.url / 拆分字段生产、OAuth2、多副本、限流、L2 缓存多副本使用不同 Redis 或 key prefix 冲突需要重启生产推荐,多副本必需
server.cors_allowed_originsWeb 前端和 API 不同 origin* 或带 path需要重启只填真实 origin,例如 https://app.example.com
server.trusted_proxies前面有反向代理或 Ingress信任全网,导致客户端 IP 可伪造需要重启只填你控制的代理网段
management.*需要 CLI 或运维控制面TCP 暴露公网且无 token需要重启优先 Unix socket;TCP 必须鉴权
metrics.*接入 Prometheus 或告警/metrics 裸露公网需要重启启用鉴权和网络隔离
webauthn.*启用 passkeyrp_origin 与真实访问 origin 不一致需要重启只使用 HTTPS 生产 origin
email.*邮箱验证、找回密码、邮箱 MFA、通知TLS/端口/from_email 不匹配需要重启synctv settings test-email 验证
cluster.* / cluster.secret多副本集群开了集群但没 Redis 或 cluster secret需要重启所有副本共享 PostgreSQL、Redis、secret
livestream.*RTMP/FLV/HLS 直播多副本 HLS 存储模型不一致需要重启高流量使用共享文件系统或 OSS
proxy_slice_cache.*需要代理 Range slice 缓存误以为会缓存完整文件需要重启挂载容量足够的目录,只缓存 Range slice

最短验证闭环:

Terminal window
synctv config validate
synctv config show --output yaml
curl -fsS http://localhost:8080/health/ready

生产 Compose 优先维护 .env.postgres.env.redis.env.synctv,不需要手写完整 YAML。上线前确认:

目标Compose/env 重点对应配置字段
初始管理员SYNCTV_BOOTSTRAP_ROOT_PASSWORDbootstrap.root_password
token 签名SYNCTV_JWT_SECRETjwt.secret
OPAQUE 密码登录SYNCTV_SECURITY_OPAQUE_SERVER_SETUP_SECRETsecurity.opaque_server_setup_secret
Provider 凭据加密SYNCTV_SECURITY_CREDENTIAL_ENCRYPTION_KEYsecurity.credential_encryption_key
Web 前端跨域SYNCTV_SERVER_CORS_ALLOWED_ORIGINS='["https://app.example.com"]'server.cors_allowed_origins
PostgreSQL.env.postgres 和 Compose 数据卷database.*
Redis.env.redis、Compose Redis 服务和 key prefixredis.*
运行时文件Compose /data volumedata_dir

裸机、Kubernetes、secret file 或自定义配置文件使用下面的字段索引。

字段类型默认值详细说明
server对象见下方服务监听与运行时路径
time对象见下方服务监听与运行时路径
public_ids对象见下方公开 ID
security对象见下方安全与密钥
data_dir字符串路径平台相关服务监听与运行时路径
metrics对象见下方Metrics 监控
management对象见下方服务监听与运行时路径
database对象见下方数据库与 Redis
redis对象见下方数据库与 Redis
jwt对象见下方安全与密钥
logging对象见下方服务监听与运行时路径
livestream对象见下方直播配置
chat对象见下方聊天
webauthn对象见下方WebAuthn 配置
email对象见下方邮件与 OAuth2
media_providers对象见下方媒体 Provider
webrtc对象见下方WebRTC 配置
connection_limits对象见下方限流与连接限制
bootstrap对象见下方初始化 root 用户
cluster对象见下方集群配置
password_complexity对象见下方安全与密钥
buffer_sizes对象见下方内部缓冲区
cache对象见下方业务缓存
proxy_slice_cache对象见下方Proxy slice cache
messaging_rate_limits对象见下方限流与连接限制
request_rate_limits对象见下方限流与连接限制
request_rate_limits对象见下方限流与连接限制
字段类型/可选值默认值说明
server.hostIP/监听地址0.0.0.0主 API 监听地址
server.port端口8080HTTP REST、公开 gRPC、健康检查端口
server.enable_reflection布尔值false是否开启公开 gRPC reflection
server.trusted_proxies字符串数组[]可信反向代理 IP/CIDR
server.cors_allowed_origins字符串数组[]允许跨域访问的前端 origin
server.advertise_host字符串""其他节点连接本节点时使用的地址
server.shutdown_drain_timeout_seconds秒数30关闭时等待连接 drain 的时间
server.grpc_max_message_size_bytes字节数16777216gRPC 消息最大大小
server.grpc_compression_enabled布尔值true是否允许 gRPC gzip 压缩协商
字段类型/可选值默认值说明
time.timezoneIANA 时区名""人类可读时间显示和本地时间解析时区
public_ids.sqids对象或空null是否启用 sqids 公开 ID
public_ids.sqids.alphabet字符串或空nullsqids alphabet
public_ids.sqids.min_length整数12sqids 最小长度
security.credential_encryption_key64 个十六进制字符""Provider 凭据加密 key
security.opaque_server_setup_secretsecret 字符串""OPAQUE 密码认证服务端 setup secret
security.ssrf.enabled布尔值false是否启用全局 SSRF 出站防护
security.ssrf.allow_private_network_targets布尔值false是否允许服务端出站访问 private/loopback/link-local/reserved/metadata 目标
security.ssrf.allowed_hosts字符串数组[]全局 SSRF 策略额外允许的主机名
security.ssrf.allowed_ip_rangesIP/CIDR 字符串数组[]全局 SSRF 策略额外允许的 IP 或网段
字段类型/可选值默认值说明
metrics.enabled布尔值false是否启动 metrics 监听器
metrics.hostIP/监听地址0.0.0.0metrics 监听地址
metrics.port端口9090metrics 监听端口
metrics.tls.enabled布尔值falsemetrics 是否启用 TLS
metrics.tls.cert_path文件路径""metrics TLS 证书
metrics.tls.key_path文件路径""metrics TLS 私钥
metrics.auth.modebearer_tokenbasickubernetesbearer_tokenmetrics 鉴权模式
metrics.auth.bearer_tokensecret 字符串""bearer token 模式 token
metrics.auth.basic_username字符串""basic 模式用户名
metrics.auth.basic_passwordsecret 字符串""basic 模式密码
metrics.auth.kubernetes.audience字符串""Kubernetes TokenReview audience
metrics.auth.kubernetes.authentication_cache_ttl_seconds秒数60TokenReview 结果缓存
metrics.auth.kubernetes.authorization_cache_ttl_seconds秒数60SubjectAccessReview 结果缓存
字段类型/可选值默认值说明
management.enabled布尔值true是否启用管理端点
management.transportunixtcpUnix 平台为 unix,其他平台为 tcp管理端点传输方式
management.port端口50052TCP management 端口
management.unix_socket_path文件路径平台相关Unix socket 路径
management.auth_tokensecret 字符串""TCP management bearer token
management.enable_reflection布尔值false管理 gRPC reflection
字段类型/可选值默认值说明
database.urlPostgreSQL URLpostgresql://synctv:synctv@localhost:5432/synctv完整数据库连接串
database.host字符串""拆分配置的数据库主机
database.port端口0拆分配置的数据库端口
database.username字符串""数据库用户
database.passwordsecret 字符串""数据库密码
database.name字符串""数据库名
database.max_connections整数20最大连接数
database.min_connections整数5最小空闲连接数
database.connect_timeout_seconds秒数10连接超时
database.idle_timeout_seconds秒数600空闲连接超时
database.max_lifetime_seconds秒数1800单个连接最大生命周期
字段类型/可选值默认值说明
redis.urlRedis URL""完整 Redis 连接串
redis.host字符串""拆分配置的 Redis 主机
redis.port端口0拆分配置的 Redis 端口
redis.username字符串""Redis 用户
redis.passwordsecret 字符串""Redis 密码
redis.database整数0Redis database index
redis.connect_timeout_seconds秒数5Redis 连接超时
redis.response_timeout_seconds秒数5Redis 命令响应超时
redis.pipeline_buffer_size整数512Redis connection manager pipeline buffer 大小
redis.key_prefix字符串synctv:Redis key 前缀
redis.deployment_modestandalonesentinelstandaloneRedis 部署模式
redis.sentinel_master_name字符串或空nullSentinel master 名称
redis.sentinel_addresses字符串数组[]Sentinel 节点地址
字段类型/可选值默认值说明
jwt.secretsecret 字符串change-me-in-productiontoken 签名密钥
jwt.access_token_duration_hours小时数1access token 有效期
jwt.refresh_token_duration_days天数30refresh token 有效期
jwt.guest_token_duration_hours小时数4guest token 有效期
jwt.clock_skew_leeway_secs秒数60token 时间误差容忍
logging.levelerrorwarninfodebugtraceinfo日志级别
logging.formatprettyjsonpretty日志格式
logging.filtertracing filter 字符串或空null高级模块级日志过滤
logging.backtrace布尔值false是否输出 backtrace
logging.file_path文件路径或空null日志文件路径
字段类型/可选值默认值说明
livestream.rtmp_port端口1935RTMP 推流端口
livestream.public_rtmp_host字符串""返回给推流端的公网 RTMP host
livestream.gop_cache_size整数2每路流 GOP 缓存数量
livestream.stream_timeout_seconds秒数300拉流空闲超时
livestream.cleanup_check_interval_seconds秒数60清理检查间隔
livestream.pull_max_retries整数10拉流最大重试次数
livestream.pull_initial_backoff_ms毫秒1000拉流初始退避
livestream.pull_max_backoff_ms毫秒30000拉流最大退避
livestream.max_flv_tag_size_bytes字节数10485760最大 FLV tag 大小
livestream.gop_cache_max_memory_mbMB100GOP 缓存最大内存
livestream.hls_memory_max_mbMB0内存 HLS 存储上限,0 表示内置默认
livestream.hls_storage_backendmemoryfileshared_fileossmemoryHLS 分片存储后端
livestream.hls_storage_path路径""file / shared_file 后端 HLS 文件存储路径
livestream.hls_oss.endpoint字符串""oss 后端 S3/OSS endpoint,启用 oss 时必填
livestream.hls_oss.access_key_idsecret 字符串""oss 后端 access key ID,启用 oss 时必填
livestream.hls_oss.secret_access_keysecret 字符串""oss 后端 secret access key,启用 oss 时必填
livestream.hls_oss.bucket字符串""oss 后端 bucket,启用 oss 时必填
livestream.hls_oss.region字符串或空nulloss 后端 region
livestream.hls_oss.base_path字符串hls/oss 后端 bucket 内对象前缀
livestream.flv_max_connection_duration_seconds秒数86400HTTP-FLV 最大连接时长
livestream.flv_write_timeout_seconds秒数30HTTP-FLV 写超时
字段类型/可选值默认值说明
file_storage.default_backendbackend 名称disabled各业务默认使用的后端
file_storage.chat_attachments_backendbackend 名称或空""聊天附件后端;空值继承 default_backend
file_storage.user_avatars_backendbackend 名称或空""用户头像后端;空值继承 default_backend
file_storage.media_covers_backendbackend 名称或空""媒体封面后端;空值继承 default_backend
file_storage.room_covers_backendbackend 名称或空""房间封面后端;空值继承 default_backend
file_storage.playlist_covers_backendbackend 名称或空""播放列表封面后端;空值继承 default_backend
file_storage.upload_token_secretsecret 字符串""文件上传/读取 token 签名密钥;空值在启动时由 jwt.secret 派生
file_storage.unreferenced_object_retention_seconds秒数86400未被业务引用的已上传对象清理宽限期;0 表示关闭孤儿对象清理
file_storage.backends.<name>.typedisableddatabases3disabled已注册后端实现类型
file_storage.backends.<name>.database.compressionnonelz4zstdzstdtype: "database" 后端写入 PostgreSQL 永久 file_blob_parts 分段的压缩算法
file_storage.backends.<name>.database.compression_min_size_bytes字节数4096原始 payload 达到该大小后才尝试压缩
file_storage.backends.<name>.database.compression_min_savings_percent010010压缩节省比例达到该百分比才存储压缩结果
file_storage.backends.<name>.s3.*S3 配置S3 默认字段type: "s3" 后端的 S3-compatible 配置;public_base_url 必填,用于上传或 ownership proof 通过后的可读文件 URL

上传会话使用服务端分片计划:客户端先用空 parts 请求 FileUploadPlan,按计划计算每片 SHA-256,再提交 FileUploadManifestPart[]。SyncTV 根据 canonical manifest 计算 content_manifest_sha256,用它命中秒传对象和未完成断点续传会话。Database 后端持久化固定 file_blob_parts 分段,并直接从分段服务 HTTP Range 请求,只解压覆盖请求区间的分段。S3 后端使用原生 multipart upload 和预签名 part URL,part URL 签入 x-amz-checksum-sha256,完成时用已记录分片 manifest 校验对象身份,服务端无需从 S3 读回 GB 级对象。重复对象返回 upload_required=false 和 ownership proof challenge;可读 URL 会在 proof 通过并写入业务引用后签发。

关闭文件存储:

file_storage:
default_backend: "disabled"
backends: {}

使用 PostgreSQL 存储文件二进制:

file_storage:
default_backend: "database"
chat_attachments_backend: "database"
user_avatars_backend: "database"
media_covers_backend: "database"
room_covers_backend: "database"
playlist_covers_backend: "database"
upload_token_secret_file: "/run/secrets/file_upload_token_secret"
backends:
database:
type: "database"
database:
compression: "zstd"

使用 S3-compatible 对象存储:

file_storage:
default_backend: "s3_public"
chat_attachments_backend: "s3_public"
user_avatars_backend: "s3_public"
media_covers_backend: "s3_public"
room_covers_backend: "s3_public"
playlist_covers_backend: "s3_public"
upload_token_secret_file: "/run/secrets/file_upload_token_secret"
backends:
s3_public:
type: "s3"
s3:
endpoint: "https://s3.example.com"
access_key_id_file: "/run/secrets/file_storage_s3_access_key_id"
secret_access_key_file: "/run/secrets/file_storage_s3_secret_access_key"
bucket: "synctv-files"
region: "auto"
base_path: "files/"
public_base_url: "https://cdn.example.com/files"
upload_expires_seconds: 900
字段类型/可选值默认值说明
webauthn.enabled布尔值false是否启用 passkey
webauthn.rp_id域名""WebAuthn relying party ID
webauthn.rp_originorigin""WebAuthn 主 origin
webauthn.rp_name字符串SyncTV认证器显示名称
webauthn.allowed_originsorigin 数组[]额外允许 origin
webauthn.allow_subdomains布尔值false是否允许子域
webauthn.allow_any_port布尔值false是否忽略端口
webauthn.timeout_seconds秒数300challenge 超时
email.smtp_host字符串""SMTP 主机
email.smtp_port端口587SMTP 端口
email.smtp_username字符串""SMTP 用户名
email.smtp_passwordsecret 字符串""SMTP 密码
email.from_email邮箱""发件邮箱
email.from_name字符串SyncTV发件人显示名
email.use_tls布尔值true是否使用 TLS
字段类型/可选值默认值说明
media_providers.alist.request_timeout_seconds秒数30本地 Alist provider 请求总超时
media_providers.alist.connect_timeout_seconds秒数10本地 Alist provider 建连超时
media_providers.bilibili.request_timeout_seconds秒数30本地 Bilibili provider 请求总超时
media_providers.bilibili.connect_timeout_seconds秒数10本地 Bilibili provider 建连超时
media_providers.emby.request_timeout_seconds秒数30本地 Emby/Jellyfin provider 请求总超时
media_providers.emby.connect_timeout_seconds秒数10本地 Emby/Jellyfin provider 建连超时
webrtc.modesignaling_onlypeer_to_peerpeer_to_peerWebRTC 工作模式
webrtc.enable_builtin_stun布尔值true是否启用内置 STUN
webrtc.stun_port端口3478STUN 端口
webrtc.stun_hostIP/监听地址0.0.0.0STUN 监听地址
webrtc.stun_external_addr字符串""对客户端公布的 STUN 外部地址
webrtc.filter_private_ice_candidates布尔值true是否过滤私网 ICE candidate
字段类型/可选值默认值说明
connection_limits.max_per_user整数20每用户最大连接数
connection_limits.max_per_room整数2000每房间最大连接数
connection_limits.max_total整数100000全服务最大连接数
connection_limits.idle_timeout_seconds秒数300空闲连接超时
connection_limits.max_duration_seconds秒数86400单连接最大时长
connection_limits.ws_message_rate_limit_per_second次/秒50每连接 WebSocket 消息速率
bootstrap.create_root_user布尔值false是否自动创建初始 root
bootstrap.root_username字符串root初始 root 用户名
bootstrap.root_passwordsecret 字符串""初始 root 密码
cluster.enabled布尔值false是否启用集群模式
cluster.secretsecret 字符串""集群内部 gRPC 认证密钥
cluster.secret_file文件路径或空""读取集群内部 gRPC 认证密钥的文件
cluster.critical_channel_capacity整数10000高优先级集群事件队列容量
cluster.publish_channel_capacity整数100000普通集群发布队列容量
cluster.discovery_moderedisstatick8s_dnsredis节点发现模式
cluster.leader_election_moderedisk8s_leaseredisleader election 模式
cluster.peers字符串数组[]静态 peer 地址
cluster.catchup_window_secs秒数300Redis Stream catch-up 回放窗口
cluster.stream_max_length整数100000Redis Stream 近似最大长度

password_complexitybuffer_sizescache

Section titled “password_complexity、buffer_sizes、cache”
字段类型/可选值默认值说明
password_complexity.min_length整数8密码最小长度
password_complexity.require_uppercase布尔值true是否要求大写字母
password_complexity.require_lowercase布尔值true是否要求小写字母
password_complexity.require_digit布尔值true是否要求数字
password_complexity.require_special布尔值false是否要求特殊字符
password_complexity.max_repeated_chars整数3最大连续重复字符数,0 表示关闭
password_complexity.zxcvbn_enabled布尔值false是否启用 zxcvbn 熵估算评分
password_complexity.zxcvbn_min_score整数 0-43启用 zxcvbn 时的最低分数
buffer_sizes.websocket_outbound整数256每连接 WebSocket 出站队列
buffer_sizes.audit_buffer整数10000审计事件缓冲容量
cache.l1_capacity整数5000L1 内存缓存容量
cache.l1_ttl_seconds秒数300L1 内存缓存 TTL
cache.l2_ttl_seconds秒数300Redis L2 缓存 TTL
cache.username_cache_capacity整数10000用户名缓存容量
cache.username_cache_ttl_seconds秒数3600用户名缓存 TTL
cache.permission_cache_capacity整数20000权限缓存容量
cache.permission_cache_ttl_seconds秒数300权限缓存 TTL
proxy_slice_cache.enabled布尔值true是否启用代理 slice cache
proxy_slice_cache.slice_size_bytes整数2097152单个 Range 分片大小
proxy_slice_cache.max_cache_size_bytes整数536870912slice cache 最大总容量
proxy_slice_cache.segment_ttl_seconds秒数300分片新鲜期
proxy_slice_cache.stale_max_age_seconds秒数60过期分片可被短暂兜底使用的时间
proxy_slice_cache.stale_while_revalidate布尔值true过期命中时是否后台刷新
proxy_slice_cache.file_backend_enabled布尔值false是否启用文件后端
proxy_slice_cache.file_cache_dir路径""slice cache 文件目录
proxy_slice_cache.eviction_interval_seconds秒数60后台驱逐检查间隔
proxy_slice_cache.watermark_ratio浮点数0.875驱逐后的目标水位比例
字段类型/可选值默认值说明
messaging_rate_limits.chat_per_second整数10聊天消息窗口内最大数量
messaging_rate_limits.window_seconds秒数1聊天限流窗口
字段类型/可选值默认值说明
request_rate_limits.auth_max_requests整数5请求认证接口窗口内最大请求数
request_rate_limits.auth_window_seconds秒数60请求认证接口限流窗口
request_rate_limits.write_max_requests整数120请求写接口窗口内最大请求数
request_rate_limits.write_window_seconds秒数60请求写接口限流窗口
request_rate_limits.read_max_requests整数600请求读接口窗口内最大请求数
request_rate_limits.read_window_seconds秒数60请求读接口限流窗口
request_rate_limits.media_max_requests整数120请求媒体接口窗口内最大请求数
request_rate_limits.media_window_seconds秒数60请求媒体接口限流窗口
request_rate_limits.admin_max_requests整数180请求管理接口窗口内最大请求数
request_rate_limits.admin_window_seconds秒数60请求管理接口限流窗口
request_rate_limits.streaming_max_requests整数1200streaming 接口窗口内最大请求数
request_rate_limits.streaming_window_seconds秒数60streaming 接口限流窗口
request_rate_limits.websocket_max_requests整数60WebSocket 建连窗口内最大请求数
request_rate_limits.websocket_window_seconds秒数60WebSocket 建连限流窗口