You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/helm/synctv/templates/configmap.yaml

475 lines
26 KiB
YAML

{{- if not .Values.existingConfigMap }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "synctv.configMapName" . }}
labels:
{{- include "synctv.labels" . | nindent 4 }}
{{- $connectionLimits := .Values.config.connectionLimits | default dict }}
{{- $messagingRateLimits := .Values.config.messagingRateLimits | default dict }}
{{- $requestRateLimits := .Values.config.requestRateLimits | default dict }}
{{- $passwordComplexity := .Values.config.passwordComplexity | default dict }}
{{- $bufferSizes := .Values.config.bufferSizes | default dict }}
{{- $mediaProviders := .Values.config.mediaProviders | default dict }}
{{- $mediaProviderAlist := $mediaProviders.alist | default dict }}
{{- $mediaProviderBilibili := $mediaProviders.bilibili | default dict }}
{{- $mediaProviderEmby := $mediaProviders.emby | default dict }}
{{- $webauthn := .Values.config.webauthn | default dict }}
{{- $cache := .Values.config.cache | default dict }}
{{- $proxySliceCache := .Values.config.proxySliceCache | default dict }}
{{- $fileStorage := .Values.config.fileStorage | default dict }}
{{- $security := .Values.config.security | default dict }}
{{- $ssrf := $security.ssrf | default dict }}
{{- $time := .Values.config.time | default dict }}
{{- $clockSync := $time.clockSync | default dict }}
{{- $clockSyncProvider := $clockSync.provider | default dict }}
{{- $livestream := .Values.config.livestream | default dict }}
{{- $hlsStorage := $livestream.hlsStorage | default dict }}
{{- $hlsStorageType := $hlsStorage.type | default "memory" }}
data:
synctv.yaml: |
{{ if .Values.config.dataDir }}
data_dir: {{ .Values.config.dataDir | quote }}
{{ end }}
time:
timezone: {{ $time.timezone | default "" | quote }}
clock_sync:
enabled: {{ $clockSync.enabled | default false }}
provider:
type: {{ $clockSyncProvider.type | default "sntp" | quote }}
servers:
{{- range ($clockSyncProvider.servers | default (list "time.cloudflare.com:123" "pool.ntp.org:123")) }}
- {{ . | quote }}
{{- end }}
interval_seconds: {{ $clockSyncProvider.intervalSeconds | default 300 }}
timeout_millis: {{ $clockSyncProvider.timeoutMillis | default 1000 }}
logging:
level: {{ .Values.config.logging.level | default "info" | quote }}
format: {{ .Values.config.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.logging.output }}
output:
type: {{ .Values.config.logging.output.type | default "file" | quote }}
path: {{ .Values.config.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.logging.color | default "auto" | quote }}
server:
host: {{ .Values.config.server.host | quote }}
port: {{ .Values.config.server.port }}
project_url: {{ .Values.config.server.projectUrl | default "https://github.com/synctv-org/synctv" | quote }}
enable_reflection: {{ .Values.config.server.enableReflection | default false }}
shutdown_drain_timeout_seconds: {{ .Values.config.server.shutdownDrainTimeoutSeconds | default 30 }}
grpc_max_message_size_bytes: {{ printf "%d" (int64 (.Values.config.server.grpcMaxMessageSizeBytes | default 16777216)) }}
grpc_compression_enabled: {{ if hasKey .Values.config.server "grpcCompressionEnabled" }}{{ .Values.config.server.grpcCompressionEnabled }}{{ else }}true{{ end }}
logging:
level: {{ .Values.config.server.logging.level | default "info" | quote }}
format: {{ .Values.config.server.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.server.logging.output }}
output:
type: {{ .Values.config.server.logging.output.type | default "file" | quote }}
path: {{ .Values.config.server.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.server.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.server.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.server.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.server.logging.color | default "auto" | quote }}
{{- if .Values.config.server.trustedProxies }}
trusted_proxies:
{{- range .Values.config.server.trustedProxies }}
- {{ . | quote }}
{{- end }}
{{- end }}
{{- if .Values.config.server.corsAllowedOrigins }}
cors_allowed_origins:
{{- range .Values.config.server.corsAllowedOrigins }}
- {{ . | quote }}
{{- end }}
{{- end }}
health:
enabled: {{ if hasKey .Values.config.health "enabled" }}{{ .Values.config.health.enabled }}{{ else }}true{{ end }}
host: {{ .Values.config.health.host | default "0.0.0.0" | quote }}
port: {{ .Values.config.health.port | default 8081 }}
logging:
level: {{ .Values.config.health.logging.level | default "info" | quote }}
format: {{ .Values.config.health.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.health.logging.output }}
output:
type: {{ .Values.config.health.logging.output.type | default "file" | quote }}
path: {{ .Values.config.health.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.health.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.health.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.health.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.health.logging.color | default "auto" | quote }}
{{- if and .Values.config.publicIds .Values.config.publicIds.sqids .Values.config.publicIds.sqids.enabled }}
public_ids:
sqids:
{{- if .Values.config.publicIds.sqids.alphabet }}
alphabet: {{ .Values.config.publicIds.sqids.alphabet | quote }}
{{- else }}
alphabet: null
{{- end }}
min_length: {{ .Values.config.publicIds.sqids.minLength | default 12 }}
{{- end }}
security:
ssrf:
enabled: {{ $ssrf.enabled | default false }}
allow_private_network_targets: {{ $ssrf.allowPrivateNetworkTargets | default false }}
allowed_hosts:{{ if $ssrf.allowedHosts }}
{{- range $ssrf.allowedHosts }}
- {{ . | quote }}
{{- end }}
{{- else }} []
{{- end }}
allowed_ip_ranges:{{ if $ssrf.allowedIpRanges }}
{{- range $ssrf.allowedIpRanges }}
- {{ . | quote }}
{{- end }}
{{- else }} []
{{- end }}
metrics:
enabled: {{ .Values.metrics.enabled | default false }}
host: {{ .Values.metrics.host | default .Values.config.server.host | quote }}
port: {{ .Values.metrics.port | default 9090 }}
tls:
enabled: {{ .Values.metrics.tls.enabled | default false }}
{{- if .Values.metrics.tls.enabled }}
cert_path: "/etc/synctv/metrics/tls/tls.crt"
key_path: "/etc/synctv/metrics/tls/tls.key"
{{- end }}
auth:
mode: {{ .Values.metrics.auth.mode | default "bearer_token" | quote }}
{{- if eq (.Values.metrics.auth.mode | default "bearer_token") "basic" }}
basic_username: {{ .Values.secrets.metrics.basicUsername | default "metrics" | quote }}
{{- end }}
{{- if eq (.Values.metrics.auth.mode | default "bearer_token") "kubernetes" }}
kubernetes:
audience: {{ .Values.metrics.auth.kubernetes.audience | default "" | quote }}
authentication_cache_ttl_seconds: {{ .Values.metrics.auth.kubernetes.authenticationCacheTtlSeconds | default 60 }}
authorization_cache_ttl_seconds: {{ .Values.metrics.auth.kubernetes.authorizationCacheTtlSeconds | default 60 }}
{{- end }}
logging:
level: {{ .Values.metrics.logging.level | default "warn" | quote }}
format: {{ .Values.metrics.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.metrics.logging.output }}
output:
type: {{ .Values.metrics.logging.output.type | default "file" | quote }}
path: {{ .Values.metrics.logging.output.path | quote }}
rotation:
strategy: {{ .Values.metrics.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.metrics.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.metrics.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.metrics.logging.color | default "auto" | quote }}
management:
enabled: {{ .Values.config.management.enabled }}
transport: {{ .Values.config.management.transport | default "unix" | quote }}
unix_socket_path: {{ .Values.config.management.unixSocketPath | default "/run/synctv/synctv.sock" | quote }}
port: {{ .Values.config.management.port | default 50052 }}
enable_reflection: {{ .Values.config.management.enableReflection | default false }}
logging:
level: {{ .Values.config.management.logging.level | default "info" | quote }}
format: {{ .Values.config.management.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.management.logging.output }}
output:
type: {{ .Values.config.management.logging.output.type | default "file" | quote }}
path: {{ .Values.config.management.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.management.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.management.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.management.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.management.logging.color | default "auto" | quote }}
database:
max_connections: {{ .Values.config.database.maxConnections | default 20 }}
min_connections: {{ .Values.config.database.minConnections | default 5 }}
connect_timeout_seconds: {{ .Values.config.database.connectTimeoutSeconds | default 10 }}
idle_timeout_seconds: {{ .Values.config.database.idleTimeoutSeconds | default 600 }}
max_lifetime_seconds: {{ .Values.config.database.maxLifetimeSeconds | default 1800 }}
redis:
connect_timeout_seconds: {{ .Values.config.redis.connectTimeoutSeconds | default 5 }}
response_timeout_seconds: {{ .Values.config.redis.responseTimeoutSeconds | default 5 }}
pipeline_buffer_size: {{ .Values.config.redis.pipelineBufferSize | default 512 }}
key_prefix: {{ .Values.config.redis.keyPrefix | default "synctv:" | quote }}
deployment_mode: {{ .Values.config.redis.deploymentMode | default "standalone" | quote }}
{{- if .Values.config.redis.sentinelMasterName }}
sentinel_master_name: {{ .Values.config.redis.sentinelMasterName | quote }}
{{- end }}
{{- if .Values.config.redis.sentinelAddresses }}
sentinel_addresses:
{{- range .Values.config.redis.sentinelAddresses }}
- {{ . | quote }}
{{- end }}
{{- end }}
jwt:
access_token_duration_hours: {{ .Values.config.jwt.accessTokenDurationHours | default 1 }}
refresh_token_duration_days: {{ .Values.config.jwt.refreshTokenDurationDays | default 30 }}
guest_token_duration_hours: {{ .Values.config.jwt.guestTokenDurationHours | default 4 }}
clock_skew_leeway_secs: {{ .Values.config.jwt.clockSkewLeewaySecs | default 60 }}
cache:
l1_capacity: {{ $cache.l1Capacity | default 5000 }}
l1_ttl_seconds: {{ $cache.l1TtlSeconds | default 300 }}
l2_ttl_seconds: {{ $cache.l2TtlSeconds | default 300 }}
username_cache_capacity: {{ $cache.usernameCacheCapacity | default 10000 }}
username_cache_ttl_seconds: {{ $cache.usernameCacheTtlSeconds | default 3600 }}
proxy_slice_cache:
enabled: {{ if hasKey $proxySliceCache "enabled" }}{{ $proxySliceCache.enabled }}{{ else }}true{{ end }}
slice_size_bytes: {{ printf "%d" (int64 ($proxySliceCache.sliceSizeBytes | default 2097152)) }}
max_cache_size_bytes: {{ printf "%d" (int64 ($proxySliceCache.maxCacheSizeBytes | default 536870912)) }}
segment_ttl_seconds: {{ $proxySliceCache.segmentTtlSeconds | default 300 }}
stale_max_age_seconds: {{ $proxySliceCache.staleMaxAgeSeconds | default 60 }}
stale_while_revalidate: {{ if hasKey $proxySliceCache "staleWhileRevalidate" }}{{ $proxySliceCache.staleWhileRevalidate }}{{ else }}true{{ end }}
file_backend_enabled: {{ $proxySliceCache.fileBackendEnabled | default false }}
{{- if $proxySliceCache.fileCacheDir }}
file_cache_dir: {{ $proxySliceCache.fileCacheDir | quote }}
{{- end }}
eviction_interval_seconds: {{ $proxySliceCache.evictionIntervalSeconds | default 60 }}
watermark_ratio: {{ $proxySliceCache.watermarkRatio | default 0.875 }}
livestream:
rtmp_port: {{ .Values.config.livestream.rtmpPort }}
public_rtmp_host: {{ .Values.config.livestream.publicRtmpHost | default "" | quote }}
logging:
level: {{ $livestream.logging.level | default "info" | quote }}
format: {{ $livestream.logging.format | default "text" | quote }}
{{- if kindIs "map" $livestream.logging.output }}
output:
type: {{ $livestream.logging.output.type | default "file" | quote }}
path: {{ $livestream.logging.output.path | quote }}
rotation:
strategy: {{ $livestream.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ $livestream.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ $livestream.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ $livestream.logging.color | default "auto" | quote }}
gop_cache_size: {{ $livestream.gopCacheSize }}
stream_timeout_seconds: {{ $livestream.streamTimeoutSeconds }}
cleanup_check_interval_seconds: {{ $livestream.cleanupCheckIntervalSeconds }}
pull_max_retries: {{ $livestream.pullMaxRetries | default 10 }}
pull_initial_backoff_ms: {{ $livestream.pullInitialBackoffMs | default 1000 }}
pull_max_backoff_ms: {{ $livestream.pullMaxBackoffMs | default 30000 }}
max_flv_tag_size_bytes: {{ printf "%d" (int64 ($livestream.maxFlvTagSizeBytes | default 10485760)) }}
gop_cache_max_memory_mb: {{ printf "%d" (int64 ($livestream.gopCacheMaxMemoryMb | default 100)) }}
hls_storage:
type: {{ $hlsStorageType | quote }}
{{ if eq $hlsStorageType "memory" }}
memory_max_mb: {{ printf "%d" (int64 ($hlsStorage.memoryMaxMb | default 0)) }}
{{ end }}
{{ if or (eq $hlsStorageType "file") (eq $hlsStorageType "shared_file") }}
path: {{ $hlsStorage.path | default "" | quote }}
{{ end }}
{{ if eq $hlsStorageType "s3" }}
endpoint: {{ $hlsStorage.endpoint | default "" | quote }}
bucket: {{ $hlsStorage.bucket | default "" | quote }}
{{ if $hlsStorage.region }}
region: {{ $hlsStorage.region | quote }}
{{ else }}
region: null
{{ end }}
base_path: {{ $hlsStorage.basePath | default "hls/" | quote }}
{{ end }}
flv_max_connection_duration_seconds: {{ $livestream.flvMaxConnectionDurationSeconds | default 86400 }}
flv_write_timeout_seconds: {{ $livestream.flvWriteTimeoutSeconds | default 30 }}
file_storage:
default_backend: {{ $fileStorage.defaultBackend | default "disabled" | quote }}
chat_attachments_backend: {{ $fileStorage.chatAttachmentsBackend | default "" | quote }}
user_avatars_backend: {{ $fileStorage.userAvatarsBackend | default "" | quote }}
media_covers_backend: {{ $fileStorage.mediaCoversBackend | default "" | quote }}
room_covers_backend: {{ $fileStorage.roomCoversBackend | default "" | quote }}
playlist_covers_backend: {{ $fileStorage.playlistCoversBackend | default "" | quote }}
upload_token_secret: ""
unreferenced_object_retention_seconds: {{ $fileStorage.unreferencedObjectRetentionSeconds | default 86400 }}
{{- $fileStorageBackends := $fileStorage.backends | default dict }}
{{- if $fileStorageBackends }}
backends:
{{- range $name, $backend := $fileStorageBackends }}
{{- $backendType := index $backend "type" | default "disabled" }}
{{ $name }}:
type: {{ $backendType | quote }}
{{ if eq $backendType "database" }}
compression: {{ $backend.compression | default "zstd" | quote }}
compression_min_size_bytes: {{ $backend.compressionMinSizeBytes | default 4096 }}
compression_min_savings_percent: {{ $backend.compressionMinSavingsPercent | default 10 }}
{{ end }}
{{ if eq $backendType "s3" }}
endpoint: {{ $backend.endpoint | default "" | quote }}
{{ if $backend.accessKeyIdFile }}
access_key_id_file: {{ $backend.accessKeyIdFile | quote }}
{{ else }}
access_key_id: {{ $backend.accessKeyId | default "" | quote }}
{{ end }}
{{ if $backend.secretAccessKeyFile }}
secret_access_key_file: {{ $backend.secretAccessKeyFile | quote }}
{{ else }}
secret_access_key: {{ $backend.secretAccessKey | default "" | quote }}
{{ end }}
bucket: {{ $backend.bucket | default "" | quote }}
region: {{ $backend.region | default "auto" | quote }}
base_path: {{ $backend.basePath | default "files/" | quote }}
public_base_url: {{ $backend.publicBaseUrl | default "" | quote }}
upload_expires_seconds: {{ $backend.uploadExpiresSeconds | default 900 }}
{{ end }}
{{- end }}
{{- else }}
backends: {}
{{- end }}
cluster:
enabled: {{ .Values.config.cluster.enabled }}
host: {{ .Values.config.cluster.host | default "0.0.0.0" | quote }}
port: {{ .Values.config.cluster.port | default 50051 }}
advertise_host: {{ .Values.config.cluster.advertiseHost | default "" | quote }}
advertise_port: {{ .Values.config.cluster.advertisePort | default 0 }}
critical_channel_capacity: {{ .Values.config.cluster.criticalChannelCapacity | default 10000 }}
publish_channel_capacity: {{ .Values.config.cluster.publishChannelCapacity | default 100000 }}
discovery_mode: {{ .Values.config.cluster.discoveryMode | default "redis" | quote }}
leader_election_mode: {{ .Values.config.cluster.leaderElectionMode | default "redis" | quote }}
{{- if .Values.config.cluster.peers }}
peers:
{{- range .Values.config.cluster.peers }}
- {{ . | quote }}
{{- end }}
{{- end }}
catchup_window_secs: {{ .Values.config.cluster.catchupWindowSecs | default 300 }}
stream_max_length: {{ .Values.config.cluster.streamMaxLength | default 100000 }}
logging:
level: {{ .Values.config.cluster.logging.level | default "warn" | quote }}
format: {{ .Values.config.cluster.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.cluster.logging.output }}
output:
type: {{ .Values.config.cluster.logging.output.type | default "file" | quote }}
path: {{ .Values.config.cluster.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.cluster.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.cluster.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.cluster.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.cluster.logging.color | default "auto" | quote }}
webrtc:
mode: {{ .Values.config.webrtc.mode | default "peer_to_peer" | quote }}
enable_builtin_stun: {{ .Values.config.webrtc.enableBuiltinStun }}
stun_port: {{ .Values.config.webrtc.stunPort | default 3478 }}
stun_host: {{ .Values.config.webrtc.stunHost | default "0.0.0.0" | quote }}
{{- if .Values.config.webrtc.stunExternalAddr }}
stun_external_addr: {{ .Values.config.webrtc.stunExternalAddr | quote }}
{{- end }}
filter_private_ice_candidates: {{ .Values.config.webrtc.filterPrivateIceCandidates }}
logging:
level: {{ .Values.config.webrtc.logging.level | default "info" | quote }}
format: {{ .Values.config.webrtc.logging.format | default "text" | quote }}
{{- if kindIs "map" .Values.config.webrtc.logging.output }}
output:
type: {{ .Values.config.webrtc.logging.output.type | default "file" | quote }}
path: {{ .Values.config.webrtc.logging.output.path | quote }}
rotation:
strategy: {{ .Values.config.webrtc.logging.output.rotation.strategy | default "daily" | quote }}
max_files: {{ .Values.config.webrtc.logging.output.rotation.maxFiles | default 30 }}
{{- else }}
output: {{ .Values.config.webrtc.logging.output | default "stdout" | quote }}
{{- end }}
color: {{ .Values.config.webrtc.logging.color | default "auto" | quote }}
connection_limits:
max_per_user: {{ $connectionLimits.maxPerUser | default 20 }}
max_per_room: {{ $connectionLimits.maxPerRoom | default 2000 }}
max_total: {{ $connectionLimits.maxTotal | default 100000 }}
idle_timeout_seconds: {{ $connectionLimits.idleTimeoutSeconds | default 300 }}
max_duration_seconds: {{ $connectionLimits.maxDurationSeconds | default 86400 }}
ws_message_rate_limit_per_second: {{ $connectionLimits.wsMessageRateLimitPerSecond | default 50 }}
messaging_rate_limits:
chat_per_second: {{ $messagingRateLimits.chatPerSecond | default 10 }}
window_seconds: {{ $messagingRateLimits.windowSeconds | default 1 }}
request_rate_limits:
auth_max_requests: {{ $requestRateLimits.authMaxRequests | default 5 }}
auth_window_seconds: {{ $requestRateLimits.authWindowSeconds | default 60 }}
write_max_requests: {{ $requestRateLimits.writeMaxRequests | default 120 }}
write_window_seconds: {{ $requestRateLimits.writeWindowSeconds | default 60 }}
read_max_requests: {{ $requestRateLimits.readMaxRequests | default 600 }}
read_window_seconds: {{ $requestRateLimits.readWindowSeconds | default 60 }}
media_max_requests: {{ $requestRateLimits.mediaMaxRequests | default 120 }}
media_window_seconds: {{ $requestRateLimits.mediaWindowSeconds | default 60 }}
admin_max_requests: {{ $requestRateLimits.adminMaxRequests | default 180 }}
admin_window_seconds: {{ $requestRateLimits.adminWindowSeconds | default 60 }}
streaming_max_requests: {{ $requestRateLimits.streamingMaxRequests | default 1200 }}
streaming_window_seconds: {{ $requestRateLimits.streamingWindowSeconds | default 60 }}
websocket_max_requests: {{ $requestRateLimits.websocketMaxRequests | default 60 }}
websocket_window_seconds: {{ $requestRateLimits.websocketWindowSeconds | default 60 }}
password_complexity:
min_length: {{ $passwordComplexity.minLength | default 8 }}
require_uppercase: {{ if hasKey $passwordComplexity "requireUppercase" }}{{ $passwordComplexity.requireUppercase }}{{ else }}true{{ end }}
require_lowercase: {{ if hasKey $passwordComplexity "requireLowercase" }}{{ $passwordComplexity.requireLowercase }}{{ else }}true{{ end }}
require_digit: {{ if hasKey $passwordComplexity "requireDigit" }}{{ $passwordComplexity.requireDigit }}{{ else }}true{{ end }}
require_special: {{ if hasKey $passwordComplexity "requireSpecial" }}{{ $passwordComplexity.requireSpecial }}{{ else }}false{{ end }}
max_repeated_chars: {{ if hasKey $passwordComplexity "maxRepeatedChars" }}{{ $passwordComplexity.maxRepeatedChars }}{{ else }}3{{ end }}
zxcvbn_enabled: {{ if hasKey $passwordComplexity "zxcvbnEnabled" }}{{ $passwordComplexity.zxcvbnEnabled }}{{ else }}false{{ end }}
zxcvbn_min_score: {{ if hasKey $passwordComplexity "zxcvbnMinScore" }}{{ $passwordComplexity.zxcvbnMinScore }}{{ else }}3{{ end }}
buffer_sizes:
websocket_outbound: {{ $bufferSizes.websocketOutbound | default 256 }}
audit_buffer: {{ $bufferSizes.auditBuffer | default 10000 }}
bootstrap:
create_root_user: {{ .Values.config.bootstrap.createRootUser | default false }}
root_username: {{ .Values.config.bootstrap.rootUsername | default "root" | quote }}
media_providers:
alist:
request_timeout_seconds: {{ $mediaProviderAlist.requestTimeoutSeconds | default 30 }}
connect_timeout_seconds: {{ $mediaProviderAlist.connectTimeoutSeconds | default 10 }}
bilibili:
request_timeout_seconds: {{ $mediaProviderBilibili.requestTimeoutSeconds | default 30 }}
connect_timeout_seconds: {{ $mediaProviderBilibili.connectTimeoutSeconds | default 10 }}
emby:
request_timeout_seconds: {{ $mediaProviderEmby.requestTimeoutSeconds | default 30 }}
connect_timeout_seconds: {{ $mediaProviderEmby.connectTimeoutSeconds | default 10 }}
webauthn:
enabled: {{ $webauthn.enabled | default false }}
rp_id: {{ $webauthn.rpId | default "" | quote }}
rp_origin: {{ $webauthn.rpOrigin | default "" | quote }}
rp_name: {{ $webauthn.rpName | default "SyncTV" | quote }}
allowed_origins: {{ $webauthn.allowedOrigins | default list | toJson }}
apple_app_ids: {{ $webauthn.appleAppIds | default list | toJson }}
{{- if $webauthn.androidApps }}
android_apps:
{{- range $webauthn.androidApps }}
- package_name: {{ .packageName | quote }}
sha256_cert_fingerprints: {{ .sha256CertFingerprints | default list | toJson }}
{{- end }}
{{- else }}
android_apps: []
{{- end }}
allow_subdomains: {{ $webauthn.allowSubdomains | default false }}
allow_any_port: {{ $webauthn.allowAnyPort | default false }}
timeout_seconds: {{ $webauthn.timeoutSeconds | default 300 }}
{{- end }}