Aller au contenu

Configuration ​

La stack prise en charge lit les choix de déploiement dans .env. L'installateur crée et met à jour ce fichier pour vous. Pour une installation manuelle, copiez .env.example, remplacez les valeurs signalées ci-dessous et gardez le fichier hors du contrôle de version.

Toutes les variables internes des services n'ont pas leur place dans .env : le fichier Compose central déduit les URL internes et ne transmet à chaque conteneur que les réglages pris en charge. Utilisez un override Compose pour construire une topologie sur mesure.

Ports web et de diagnostic ​

VariableDéfautRôle
HOST_PORT_WEB8082Conteneur web public ; nginx sert l'application, l'API, les WebSockets, SABR et les téléchargements
HOST_BIND_SERVER127.0.0.1Adresse de l'hôte pour le port de diagnostic de Server
HOST_PORT_SERVER8080Port de diagnostic et d'accès direct à l'API de Server
HOST_BIND_TOKEN127.0.0.1Adresse de l'hôte pour le port de diagnostic de Token
HOST_PORT_TOKEN8081Port de santé et de version de Token
HOST_BIND_GARAGE_S3127.0.0.1Adresse de l'hôte pour le provisionnement et le diagnostic de Garage
HOST_PORT_GARAGE_S33900Port S3 de Garage

Seul HOST_PORT_WEB a besoin d'une entrée publique. Gardez les autres liaisons sur la boucle locale, sauf si un réseau de confiance précis en a besoin. Downloader, PostgreSQL et Dragonfly n'ont pas de port stable sur l'hôte dans le fichier Compose pris en charge.

La beta utilise les valeurs HOST_PORT_*_BETA et HOST_BIND_*_BETA correspondantes. Voir Beta et main.

Origines de navigateur autorisées ​

VariableDéfautRôle
ALLOWED_ORIGINSURL de développement en localhostOrigines de navigateur, séparées par des virgules, autorisées à appeler Server

Une origine, c'est le schéma, l'hôte et le port éventuel, sans chemin ni barre oblique finale :

dotenv
ALLOWED_ORIGINS=https://watch.example.com,http://192.0.2.10:8082

L'origine du navigateur doit correspondre exactement. Une page peut se charger normalement alors que l'inscription, la connexion ou d'autres actions de l'API échouent avec un 403 vide si cette valeur est fausse. Après un changement, recréez Server :

sh
docker compose up -d --force-recreate typetype-server

Ce diagnostic a été confirmé par le signalement du premier administrateur de hulmgulm.

Sessions de compte ​

VariableDéfautRôle
AUTH_SESSION_TTL_DAYS30Durée de vie de la session de renouvellement en jours, bornée entre 1 et 365
AUTH_ALLOW_INSECURE_COOKIESfalseAutorise les cookies de renouvellement en HTTP simple avec SameSite=Lax

Les jetons d'accès durent toujours une heure. Une session de renouvellement valide les renouvelle en silence : AUTH_SESSION_TTL_DAYS fixe donc combien de temps un compte peut rester connecté sans nouvelle connexion.

Gardez AUTH_ALLOW_INSECURE_COOKIES=false en HTTPS et pour tout déploiement public. Ne le mettez à true que lorsqu'une instance locale de confiance doit tourner en HTTP simple. Cela affaiblit la sécurité du transport ; voir Durée de vie des sessions.

Recréez Server après avoir changé l'une ou l'autre valeur :

sh
docker compose up -d --force-recreate typetype-server

Base de données et cache ​

Le service PostgreSQL fourni utilise ces valeurs :

VariableDéfautRôle
POSTGRES_DBtypetypeBase principale de l'application
POSTGRES_USERtypetypeUtilisateur PostgreSQL
POSTGRES_PASSWORDtypetypeMot de passe PostgreSQL ; à remplacer pour un vrai déploiement
DRAGONFLY_URLredis://dragonfly:6379URL du cache de Server
DRAGONFLY_MAX_MEMORY2gbMémoire que le cache peut utiliser. Plein, il oublie ses entrées les plus anciennes au lieu de refuser les nouvelles.
DRAGONFLY_THREADS4Fils d'exécution du cache. Dragonfly a besoin de 256 Mo de DRAGONFLY_MAX_MEMORY par fil et ne démarre pas avec moins.

POSTGRES_DB, POSTGRES_USER et POSTGRES_PASSWORD sont la source de vérité au niveau de la stack. Compose en déduit les valeurs DATABASE_* de Server et le DB_URL de Downloader. Changez les valeurs PostgreSQL une seule fois, plutôt que de dupliquer un mot de passe dans plusieurs variables propres aux services.

Choisissez ces valeurs avant le premier démarrage. Une fois que PostgreSQL a initialisé son volume, changer .env seul ne change pas le mot de passe du rôle existant dans la base.

Cette disposition fait suite à l'incohérence relevée par arcoast dans la discussion #123.

Pour une base externe, définissez DATABASE_URL, DATABASE_USER et DATABASE_PASSWORD pour Server, et DB_URL pour Downloader, avec un override Compose. Dans la conception actuelle, Downloader a besoin de sa propre base typetype_downloader.

Téléchargements et Garage ​

VariableDéfautRôle
DOWNLOADER_S3_ACCESS_KEYtexte de remplacementClé d'accès Garage ; doit commencer par GK
DOWNLOADER_S3_SECRET_KEYtexte de remplacementSecret de la clé d'accès Garage
GARAGE_RPC_SECRETtexte de remplacementSecret RPC du cluster Garage, 32 octets en hexadécimal

L'installateur génère les trois valeurs et provisionne le bucket. Une installation sans script doit remplacer les textes de remplacement et suivre Installation manuelle, Partie 2.

Le Downloader fourni utilise http://garage:3900 à la fois pour son client S3 et pour l'URL présignée de l'artefact. Server reconnaît ce nom d'hôte interne et relaie le fichier terminé au navigateur. Il n'y a pas de variable DOWNLOADER_S3_PUBLIC_ENDPOINT requise dans le .env pris en charge.

La génération de GARAGE_RPC_SECRET a été ajoutée après que arcoast a signalé le secret manquant dans la discussion #130.

Configuration fournie et configuration sur mesure des services ​

L'image web possède la configuration nginx prise en charge. La stack centrale ne monte pas de nginx.conf depuis l'hôte : les correctifs du proxy arrivent donc avec les mises à jour normales de l'image web.

Le service d'initialisation garage-config écrit la configuration par défaut de Garage dans le volume nommé garage_config uniquement quand ce volume ne contient pas déjà une configuration. Un contenu existant n'est jamais écrasé. Lors de la migration depuis une ancienne stack, l'installateur met de côté l'ancien garage.toml de l'hôte et le service d'initialisation l'importe à la première utilisation.

Gardez les changements voulus de nginx ou de Garage dans des fichiers séparés et montez-les par docker-compose.override.yml. L'installateur conserve l'override et ne remplace pas les fichiers de configuration qu'il ne gère pas. Voir Configuration nginx ou Garage sur mesure pour un exemple.

YouTube et Token ​

Token reste activé parce que la lecture YouTube utilise ses points d'accès pour les jetons PO, le décodeur, les sous-titres et SABR. Le drapeau suivant ne commande que la connexion distante interactive :

VariableDéfautRôle
YOUTUBE_REMOTE_LOGIN_ENABLEDfalseActive la connexion interactive à YouTube
YOUTUBE_OUTBOUND_PROXY_URLvideProxy sortant optionnel utilisé pour le trafic YouTube
YOUTUBE_REMOTE_LOGIN_CALLBACK_BASE_URLhttp://localhost:8080Origine interne de Server qui reçoit le rappel de fin de Token
YOUTUBE_REMOTE_LOGIN_CALLBACK_ORIGINhttp://typetype-server:8080Origine interne de rappel utilisée par Token
YOUTUBE_REMOTE_LOGIN_TTL_MS480000Durée de vie demandée par Server, bornée entre 1 et 10 minutes
YOUTUBE_REMOTE_LOGIN_MAX_SESSIONS2Sessions de navigateur distant simultanées, bornées entre 1 et 8
YOUTUBE_REMOTE_LOGIN_FRAME_FPS10Cadence de capture de la vue de connexion
YOUTUBE_REMOTE_LOGIN_MAX_FRAME_BYTES524288Taille maximale d'une image de connexion encodée

Gardez le rappel par défaut sur une URL interne de Server. Le navigateur atteint la session de connexion par l'origine web publique et un WebSocket ; il n'appelle pas directement cette adresse de rappel.

Les deux réglages de rappel doivent utiliser la même origine interne de Server dans une stack Compose sur mesure. Donnez à YOUTUBE_REMOTE_LOGIN_CALLBACK_BASE_URL sur Server et à YOUTUBE_REMOTE_LOGIN_CALLBACK_ORIGIN sur Token le nom d'hôte et le port que Token peut joindre sur le réseau Compose, par exemple http://typetype-server:8080. N'utilisez l'URL web publique pour aucun des deux.

Dans le fichier Compose pris en charge, Token garde son propre plafond par défaut de huit minutes, parce que cette variable de durée n'est transmise qu'à Server. Les valeurs au-dessus de huit minutes ne prolongent donc pas la réservation effective sans une configuration de Token sur mesure.

Les stacks Compose sur mesure qui renomment le service typetype-token doivent définir la variable actuelle du point d'accès interne de Server, SUBTITLE_SERVICE_URL, ou garder typetype-token comme alias réseau. Voir Noms sur mesure du service Token.

Limites de requêtes vers YouTube ​

Une instance joint YouTube par une seule adresse, et YouTube refuse une adresse qui demande trop : les vidéos ouvertes se mettent à échouer avec « Sign in to confirm you're not a bot », pendant plus de dix minutes. La recherche, les pages de chaînes et les pages de vidéos tolèrent bien plus que l'ouverture de vidéos.

Server lit ces valeurs dans son propre environnement. Le fichier Compose pris en charge ne les transmet pas : fixez-les avec un override Compose sur typetype-server.

VariableDéfautRôle
YOUTUBE_OPENS_PER_MINUTE0 (pas de limite)Vidéos que toute l'instance ouvre chez YouTube en une minute. Au-delà, chaque vidéo attend son tour, 30 secondes au plus. Une vidéo que personne n'attend ne fait jamais la queue : elle part tout de suite ou pas du tout.
YOUTUBE_SESSION_RENEWALactivéAprès trois vidéos refusées en une minute, Server demande une nouvelle session à Token, une fois, puis attend deux minutes. off le désactive.
YOUTUBE_LIVE_PROBEclient des directs d'abordafter interroge d'abord le client habituel, et le client des directs seulement pour ce qu'il dit être en direct. À utiliser sur une instance chargée : le client des directs traite une vidéo à la fois.
STREAM_PREVIEWSactivéoff refuse toute vidéo demandée avant que quelqu'un la regarde, par exemple au survol d'une carte.
SABR_INITIALIZATION_RANGEactivéoff saute une requête que YouTube refuse à chaque lecture pour certaines adresses.
EXTRACTOR_SIMULTANEOUS_REQUESTS_PER_HOST64Requêtes que l'extracteur peut avoir en cours vers un même hôte en même temps
EXTRACTOR_HTTP_VERSIONHTTP/21 utilise une requête par connexion. À utiliser si Server cesse de répondre sous une foule alors que son processeur est au repos.
SUBSCRIPTION_FEED_MAX_CONCURRENT_FETCHES20Pages de chaînes demandées en même temps quand un flux d'abonnements est construit ; ne peut qu'être abaissé
SUBSCRIPTION_FEED_FRESHNESS_SECONDS60Âge qu'un flux d'abonnements peut avoir avant que sa lecture lance un rafraîchissement ; ne peut qu'être relevé, jusqu'à un jour
YOUTUBE_REQUEST_LOGdésactivé1 écrit une ligne de journal par requête envoyée à YouTube. Pour le diagnostic seulement.
yaml
services:
  typetype-server:
    environment:
      YOUTUBE_OPENS_PER_MINUTE: "120"
      YOUTUBE_LIVE_PROBE: after

Enregistrez-le sous docker-compose.override.yml dans le dossier de la stack, puis recréez Server :

sh
docker compose up -d --force-recreate typetype-server

Server ne demande jamais de lui-même à YouTube le texte d'une piste de sous-titres ; c'est l'adresse que YouTube surveille le plus étroitement.

Service de recommandations ​

Le service de recommandations optionnel a sa propre page, avec ses prérequis et tous ses réglages : Service de recommandations.

Secrets YouTube ​

VariableRôle
YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKENAuthentifie les rappels de connexion distante entre Server et Token
YOUTUBE_SESSION_ENCRYPTION_KEYChiffre les identifiants de session YouTube stockés

Le conteneur d'initialisation typetype-secrets les écrit dans un volume nommé privé. Des valeurs vides et les textes SET_ME_... font générer une valeur au premier démarrage. Fournir une vraie valeur dans .env remplace le fichier généré.

Ne changez pas YOUTUBE_SESSION_ENCRYPTION_KEY à la légère : les sessions YouTube déjà stockées ne peuvent pas être déchiffrées avec une autre clé.

OIDC ​

Les variables OIDC sont prises en charge par Server mais ne font pas partie du .env.example de base. Ajoutez-les par un override Compose, comme décrit dans Authentification (OIDC). Les variables de Server prises en charge sont :

  • OIDC_ISSUER (ou OIDC_ISSUER_URL);
  • OIDC_CLIENT_ID;
  • OIDC_CLIENT_SECRET;
  • en option, OIDC_DISCOVERY_URL, OIDC_SCOPES et OIDC_PROVIDER_NAME.

Images de remplacement ​

Laissez-les vides pour suivre les étiquettes d'images normales, stable ou beta :

StableBeta
TYPETYPE_WEB_IMAGETYPETYPE_WEB_BETA_IMAGE
TYPETYPE_SERVER_IMAGETYPETYPE_SERVER_BETA_IMAGE
TYPETYPE_DOWNLOADER_IMAGETYPETYPE_DOWNLOADER_BETA_IMAGE
TYPETYPE_TOKEN_IMAGETYPETYPE_TOKEN_BETA_IMAGE
TYPETYPE_RECOMMENDER_IMAGETYPETYPE_RECOMMENDER_IMAGE

Donnez-leur des références immuables ghcr.io/...@sha256:... pour un retour arrière ou un déploiement figé. Voir Revenir en arrière après une mise à jour.

Signalements de bugs ​

VariableDéfautRôle
GITHUB_REPOTypeType-Video/TypeTypeDépôt visé par le lien de signalement dans l'application
GITHUB_ISSUE_TEMPLATEbug_report_backend.mdNom du fichier de modèle ajouté au lien de signalement dans l'application

Décalage actuel avec le suivi central

Le dépôt visé et le modèle livrés ne correspondent pas actuellement : bug_report_backend.md existe dans TypeType-Server, pas dans le dépôt central TypeType. Le sélecteur central propose bien bug_report.yml, mais ce fichier est un formulaire d'issue structuré dont les champs ont leurs propres identifiants de requête ; le générateur de l'application envoie un seul body en Markdown. Remplacer le nom du fichier par bug_report.yml n'est donc pas un correctif équivalent pour le préremplissage du diagnostic.

Quand vous visez un fork ou un autre dépôt, utilisez un modèle compatible avec l'URL qu'attend son parcours d'issues. Voir la limite actuelle et le chemin de signalement manuel dans Signaler un problème.

Valider la configuration résolue ​

Compose peut afficher le graphe final des services sans le démarrer :

sh
docker compose config -q
docker compose config

La deuxième commande développe les variables : ne collez donc pas sa sortie en public sans en retirer les mots de passe et les secrets.

Références ​