Aller au contenu

Référence de configuration

La configuration est volontairement un simple fichier texte lisible plutôt qu’une base de données. On peut la sauvegarder avec cp, la comparer à la copie de la semaine dernière, la versionner et la modifier à la main via SSH lorsque l’interface web est injoignable — c’est-à-dire précisément quand vous avez le plus besoin de changer quelque chose. Il n’existe aucun stockage d’état séparé à maintenir synchronisé avec elle.

Castmux réécrit le fichier à chaque modification faite dans l’interface web ; une modification manuelle et une modification via l’interface sont donc la même opération sur le même fichier. Modifier le fichier à la main pendant que le service tourne expose votre changement à être écrasé par la prochaine action dans l’interface : arrêtez le service, modifiez, puis redémarrez-le.

Lors d’une mise à jour, les clés ajoutées par une version plus récente sont automatiquement complétées avec leurs valeurs par défaut, de sorte qu’un fichier plus ancien continue de fonctionner. Une copie .pre-migration de l’original est écrite avant toute modification : c’est le fichier à restaurer si une migration ne vous convient pas.

—config

Chemin du fichier de configuration. Vaut par défaut config.yaml dans le répertoire de travail. Les déploiements en conteneur passent un chemin explicite vers un volume monté, normalement /config/config.yaml.

—port

Port TCP de l’interface web et de l’API HTTP. Vaut 8080 par défaut. L’API n’est pas sur un port séparé : il n’y a qu’un seul point d’écoute.

-debug

Journalisation détaillée, y compris les lignes de commande complètes des moteurs et le détail de chaque redémarrage. Utile pour diagnostiquer une chaîne qui refuse de démarrer. Elle est bavarde : ne la laissez pas activée en permanence sur un appareil dont la partition de journaux est petite.

CASTMUX_WEB_USERNAME

Nom d’utilisateur de l’interface web et de l’API.

CASTMUX_WEB_PASSWORD

Mot de passe de l’interface web et de l’API.

Un fichier fonctionnel pour un petit site : deux chaînes, l’une en HLS et l’autre en SRT, toutes deux transportées sur un multiplex DVB-C ainsi qu’en multicast.

/config/config.yaml
global:
default_engine: tsduck # pass-through unless a channel overrides it
udp_device: 192.168.10.4 # source address, NOT the egress interface
startup_stagger_seconds: 3
hls_live_start_index: -1
on_demand_enabled: true
on_demand_fail_open: true # viewer detection broken => keep streaming
igmp_active_query: true
igmp_grace_seconds: 90
igmp_linger_seconds: 30
igmp_query_interval_seconds: 30
igmp_interfaces:
- eth0
- eth1
enable_dummy_listeners: true
overwrite_srt_latency: true
overwrite_pkt_size: true
ping_hosts:
- 192.168.10.1 # the site gateway
- origin.example.net # the content provider
location_name: Seaview Court
re_seller: Northern AV
ts_monitoring: true
ts_pcr_jitter_max_ms: 200
licence:
identity_dir: /config/identity # must be on a persistent volume
site_ref: seaview-court
streams:
- id: 1
name: Example One # also the DVB service name and metric label
description: Main lounge line-up
active: true
source:
type: hls
url: https://origin.example.net/one/master.m3u8
destination:
address: 239.10.0.1
port: 5000
force_always_on: false # on-demand: runs when somebody joins
engine: tsduck
epg_id: example-one.uk # the channel's id in the XMLTV guide
resolution_profile: hd # closest rung wins; not an exact-match filter
min_output_kbps: 500
pdt_shift_ms: 0 # 0 disables the PDT drift restart
- id: 2
name: Example Two
description: Contribution feed from the studio
active: true
source:
type: srt
url: srt://feed.example.net:9001?streamid=two
destination:
address: 239.10.0.2
port: 5000
force_always_on: true # always on air, viewers or not
engine: tsduck
resolution_profile: "" # SRT has no ladder; nothing to select
min_output_kbps: 500
dvb_muxes:
- id: 1
name: Mux A
device: 0 # modulator device index
frequency: 474000000 # Hz, not MHz
qam: 256
symbol_rate: 6900
network_id: 1
ts_id: 1
network_name: Seaview Court
active: true
channel_ids: [1, 2] # order decides slot, PID block, service ID

Tout ce qui se trouve sous global s’applique à chaque chaîne, sauf si la chaîne le redéfinit. Une modification faite via l’interface web est appliquée aux chaînes en cours sans redémarrage : ce sont des réglages actifs à chaud, pas des réglages de démarrage.

CléDéfautRôle
Moteurs et sortie
default_enginetsduckLe moteur utilisé par les chaînes qui n'en désignent pas elles-mêmes. Le moteur pass-through conserve les PID, pistes audio et descripteurs de langue d'origine ; le moteur de remultiplexage les réécrit, ce qu'exigent certains équipements en aval. Voir Moteurs de diffusion.
udp_devicevideAdresse source de l'UDP sortant. Notez bien que ce réglage lie l'adresse source et ne choisit pas l'interface de sortie : le noyau consulte toujours la table de routage pour décider par quel port les paquets sortent. Si le multicast sort par la mauvaise interface, corrigez la route, pas ce réglage.
startup_stagger_seconds3Intervalle entre les démarrages de chaînes au boot. Sans lui, toutes les chaînes ouvrent leur source en même temps, et huit démarrages HLS simultanés sur une liaison montante de 100 Mbit la saturent pendant la rafale initiale de segments : les huit échouent au lieu d'une seule. Mettez 0 pour désactiver si votre liaison montante n'y est réellement pas sensible.
hls_live_start_index-1Le segment de la playlist en direct par lequel commencer, compté depuis le direct. -1 est le dernier segment. Plus près du direct signifie moins de latence et moins de tampon pour absorber la gigue du serveur d'origine ; plus en arrière est plus tolérant mais plus en retard sur le direct.
overwrite_pkt_sizetrueForce des datagrammes UDP complets de 1316 octets sur les chaînes HLS — sept paquets transport par datagramme, ce qu'attendent les décodeurs. Sans ce réglage, certaines sources produisent des datagrammes courts et gaspillent une part notable de la bande passante.
overwrite_srt_latencytrueDéduit la latence SRT du temps d'aller-retour mesuré vers l'émetteur au lieu d'utiliser une valeur fixe. Une latence réglée à la main, juste pour un trajet, est généralement fausse sur le site suivant.
À la demande et IGMP
on_demand_enabledtrueInterrupteur général de la diffusion pilotée par les spectateurs. Désactivé, chaque chaîne marquée active tourne en continu, que quelqu'un regarde ou non.
on_demand_fail_opentrueMaintient la diffusion des chaînes lorsque la détection des spectateurs est indisponible — la capture ne démarre pas, l'interface disparaît, le processus de surveillance meurt. Laissez-le activé. Désactivé, le mode de défaillance est un bâtiment entier d'écrans noirs causé par un composant de supervision, ce qui est pire à tous égards qu'un peu de bande passante gaspillée.
igmp_active_querytrueEnvoie nos propres requêtes générales IGMP. Les clients ne se signalent spontanément qu'au moment où ils rejoignent un groupe, puis restent silencieux jusqu'à ce qu'on les interroge ; sans requêtes, un redémarrage fait donc perdre toute connaissance des spectateurs existants. Ne désactivez ce réglage que si le segment dispose déjà d'un vrai querier ; deux queriers sur un même segment, c'est peu élégant mais pas fatal.
igmp_grace_seconds90Durée pendant laquelle un spectateur peut rester silencieux avant d'être considéré comme parti. Doit dépasser nettement igmp_query_interval_seconds, faute de quoi un seul rapport perdu évince un spectateur qui regarde toujours.
igmp_linger_seconds30Durée pendant laquelle une chaîne continue de tourner après le départ du dernier spectateur. C'est ce qui rend le zapping supportable : revenir pendant cette fenêtre est instantané au lieu de subir un démarrage à froid.
igmp_query_interval_seconds30Intervalle entre les requêtes générales. Plus court, il permet de détecter plus vite un téléviseur éteint à la prise, au prix de davantage de trafic de contrôle.
igmp_interfacestoutes celles qui ont une adresseLes interfaces sur lesquelles capturer les abonnements. Par défaut, toutes les interfaces ayant une adresse configurée. Nommez-les explicitement sur une machine à plusieurs cartes réseau dont une seule fait face aux téléviseurs.
enable_dummy_listenerstrueMaintient un consommateur local attaché à chaque groupe. Sans lui, les paquets envoyés vers un groupe que personne n'a rejoint s'accumulent dans les tampons de socket et finissent par provoquer des débordements qui ressemblent à des défauts de source.
Supervision et identité du site
ts_monitoringtrueMesure la qualité du transport stream de chaque chaîne — débit et sa dispersion, timing PCR, erreurs de transport et de continuité — pour les graphiques par chaîne et les métriques exportées. Sur une chaîne pass-through, la mesure s'effectue dans le pipeline même de la chaîne ; sur une chaîne en remultiplexage, un second processus en lecture seule écoute le groupe multicast de la chaîne, et mesure donc ce que reçoit réellement un récepteur. Dans les deux cas, on se contente d'observer, sans jamais modifier le flux. Mettez false pour économiser le faible coût CPU par chaîne sur un appareil très chargé.
ts_pcr_jitter_max_ms200L'écart maximal, en millisecondes, entre une référence d'horloge de programme et le timing réel de son paquet avant que cela compte comme un événement de gigue PCR. Il s'agit d'une tolérance aux rafales de livraison, pas du chiffre de précision MPEG-2 : les serveurs d'origine SRT entrelacent couramment par rafales d'environ 160 ms, et un relais qui réempaquette du HLS livre des segments entiers d'un coup. 200 laisse passer l'entrelacement ordinaire et signale les rafales que le tampon d'un récepteur devrait réellement encaisser. Augmentez-le si un serveur d'origine connu pour ses rafales inonde le graphique d'événements sur lesquels personne ne peut agir.
ping_hostsliste videHôtes supplémentaires pour le moniteur d'accessibilité, en plus de ceux déduits de la configuration. Les entrées utiles sont la passerelle du site et le serveur d'origine du contenu : quand une chaîne tombe, la première question est de savoir si le site a perdu Internet ou si le fournisseur a perdu la chaîne, et ceci y répond.
location_namevideLe site desservi par cet appareil, tel que vous le nommeriez — affiché comme Location dans Settings. Il étiquette les métriques exportées pour qu'une flotte d'appareils puisse être distinguée dans un même tableau de bord, il est transmis au serveur de licences comme nom du site, et c'est le nom de réseau DVB-C affiché par les décodeurs sauf si un autre est défini explicitement. Cette clé s'appelait auparavant hotel_name ; un fichier plus ancien est migré automatiquement au chargement.
re_sellervideLe partenaire ou l'installateur responsable du site. C'est aussi une étiquette de métrique, pour filtrer un tableau de bord sur le parc d'un seul revendeur.

Ces clés contiennent des chaînes d’arguments brutes transmises aux programmes sous-jacents : FFmpeg pour les chaînes en remultiplexage, TSDuck pour les chaînes pass-through, et mpv pour la sortie HDMI. Elles ne figurent volontairement pas dans l’interface web. On peut les modifier en éditant le fichier ou via PUT /api/settings, et l’enregistrement de l’une d’elles redémarre toutes les chaînes actives.

La raison de les tenir à l’écart de l’interface est l’étendue des dégâts possibles. Chaque chaîne d’arguments s’applique à toutes les chaînes qui utilisent ce moteur. Un moteur qui ne démarre pas à cause d’un seul argument mal formé met toute la grille hors antenne d’un coup, pas une seule chaîne. Un champ capable de faire cela à un bâtiment ne doit pas se trouver à une frappe de clavier d’un opérateur qui cherche à renommer une chaîne.

CléDéfautRôle
ffmpeg_paramsvaleur livréeOptions placées tout au début de la ligne de commande FFmpeg de chaque chaîne en remultiplexage, avant l'entrée — réparation des horodatages, taille de sondage et mise en tampon. La valeur livrée est réglée pour les serveurs d'origine HLS ; sa taille de sondage de 15 MB est la raison d'être de startup_stagger_seconds. Si la clé est vide, un minimum -fflags +genpts -rw_timeout 10000000 est utilisé à la place.
ffmpeg_udp_paramsvaleur livréeChaîne de requête ajoutée à l'URL de sortie udp:// de chaque chaîne en remultiplexage : TTL, taille de datagramme, tampons de socket et FIFO. Deux éléments sont partagés ou remplacés. Le ttl indiqué ici est aussi utilisé par les chaînes pass-through, afin que les deux moteurs émettent avec le même TTL. Et avec overwrite_pkt_size activé, tout pkt_size est retiré des chaînes HLS, car l'application fixe elle-même la taille des datagrammes.
ffmpeg_preview_paramsvaleur livréeOptions supplémentaires pour le processus FFmpeg de l'aperçu dans le navigateur, insérées avant son entrée. Elles n'affectent que les aperçus, jamais ce qui part sur le réseau.
tsduck_paramsvideOptions et plugins tsp supplémentaires, ajoutés à chaque chaîne pass-through après le traitement intégré et avant la mesure de qualité et la sortie. Deux étapes intégrées s'effacent devant eux : s'ils nomment le plugin svrename ou sdt, le nommage automatique du service DVB est omis plutôt que doublé ; et s'ils choisissent eux-mêmes un niveau HLS (par exemple --lowest-bitrate), la sélection par défaut du débit le plus élevé n'est pas ajoutée, car tsp refuse deux sélecteurs.
mpv_paramsvaleur livréeOptions supplémentaires pour le lecteur de la sortie HDMI, ajoutées après les choix d'affichage et d'audio faits sur la page HDMI. mpv retient la dernière occurrence d'une option, si bien qu'une option indiquée ici remplace la liste déroulante correspondante. La valeur livrée désigne un contexte d'affichage et une carte son précis ; sur un matériel autre que celui pour lequel elle a été écrite, supprimez ces options et utilisez plutôt les sélections de la page HDMI.

Le bloc hdmi_stream sous global configure la sortie HDMI. Tout ce qu’il contient se règle depuis la page HDMI.

CléDéfautRôle
hdmi_stream.namevideLibellé de la sortie dans l'affichage d'état et les journaux.
hdmi_stream.stream_idaucunL'id de la chaîne à lire. Le lecteur rejoint le groupe multicast de cette chaîne, en utilisant l'adresse udp_device si elle est définie. 0, ou l'identifiant d'une chaîne supprimée, laisse la sortie sans rien à lire, et le journal indique lequel des deux.
hdmi_stream.activefalseDémarre et arrête la lecture.
hdmi_stream.vodéfaut du lecteurLa sortie vidéo du lecteur, par exemple gpu, gpu-next ou drm. Les deux sorties gpu reçoivent automatiquement un contexte DRM/KMS, puisqu'un appareil n'a pas de bureau dans lequel dessiner.
hdmi_stream.drm_devicedéfaut du lecteurLe périphérique d'affichage, sous forme de chemin comme /dev/dri/card0. Nécessaire sur un matériel doté de plusieurs contrôleurs d'affichage, où la valeur par défaut peut désigner le mauvais connecteur.
hdmi_stream.audio_devicedéfaut du lecteurLe périphérique de sortie audio, ou none pour une image sans son. Les noms de périphériques audio diffèrent d'une carte à l'autre ; une valeur copiée depuis un autre appareil est donc la raison habituelle pour laquelle le lecteur refuse de démarrer.

Le bloc licence sous global configure la manière dont l’appareil s’identifie auprès du serveur de licences. L’adresse du serveur et sa clé de signature sont intégrées à la version et ne sont pas des réglages. server_url ou token_public_key dans ce bloc sont acceptés mais ignorés, et un avertissement le signalant est journalisé au démarrage.

CléDéfautRôle
licence.identity_dir/config/identityL'emplacement où l'appareil conserve sa clé d'appareil, son certificat et son dernier état de licence. Il doit se trouver sur un stockage persistant. Sinon, chaque recréation du conteneur génère une nouvelle identité, qui apparaît au serveur de licences comme un nouvel appareil non approuvé, et la diffusion reste bloquée jusqu'à ce qu'il soit à nouveau approuvé.
licence.enroll_keyvideClé d'enrôlement prépartagée facultative, fournie avec un lot d'appareils. Traitez-la comme un mot de passe : elle n'est jamais écrite dans les journaux, mais elle est lisible par quiconque peut lire ce fichier.
licence.site_refvideUne référence en texte libre, comme un numéro de commande ou de site, envoyée à l'enrôlement pour aider à reconnaître l'appareil au moment de l'approuver. C'est une indication destinée à des personnes, pas un identifiant d'authentification.
licence.agent_versionla version en coursLa version logicielle déclarée au serveur de licences. Laissez-la non définie.

Chaque entrée sous streams est une chaîne : une source, une destination, un ensemble de règles de supervision.

CléDéfautRôle
Identité
idattribuéIdentifiant numérique, unique dans le fichier. C'est l'identifiant utilisé dans les chemins de l'API et dans channel_ids sur un multiplex. Les identifiants sont réutilisés après une suppression : ne les considérez pas comme des références permanentes pour un système externe.
nameobligatoireNom affiché. Il n'est pas cosmétique : il devient aussi le nom de service DVB affiché dans la liste des chaînes du téléviseur, et l'étiquette attachée aux métriques exportées de cette chaîne. Renommer une chaîne change ce que voient les spectateurs et la manière dont votre tableau de bord regroupe les données.
descriptionvideTexte libre à l'usage de l'opérateur. Transmis nulle part.
epg_idvideL'identifiant de cette chaîne dans le guide des programmes XMLTV — l'identifiant de chaîne propre au guide, typiquement quelque chose comme rtl.de. Il se règle sur la page EPG, et c'est lui qui permet à une synchronisation du guide d'enregistrer les programmes de cette chaîne. Vide signifie aucune donnée de guide pour la chaîne. Voir Guide des programmes (EPG).
managed_byvideLe propriétaire de la chaîne. Vide signifie qu'un opérateur l'a ajoutée, et rien d'autre ne la modifie jamais. licence signifie que le serveur de licences l'a fournie : il peut remplacer la source et la destination de la chaîne à chaque actualisation, et l'interface web refuse donc de la modifier ou de la supprimer. Ne définissez pas licence à la main sur une chaîne que vous avez créée : l'actualisation suivante pourrait l'écraser.
activetrueIndique si la chaîne est configurée pour tourner. Une chaîne inactive est conservée dans le fichier mais jamais démarrée : c'est ainsi que l'on retire une chaîne sans perdre ses réglages.
Source
source.typehlsL'une des valeurs hls, srt, rtmp ou mpegts. mpegts est un transport stream brut, en UDP (udp://group:port) ou en HTTP (http(s)://…) — voir sources MPEG-TS. Le type détermine plus que la récupération : seul HLS possède une échelle, les profils de résolution ne s'appliquent donc qu'à HLS.
source.urlobligatoireL'URL du serveur d'origine. En HLS, il s'agit normalement de la playlist maître, pas d'une variante : donnez l'échelle à Castmux et laissez le profil de résolution choisir, afin que la chaîne survive à une réorganisation des niveaux par le serveur d'origine.
Destination
destination.addressobligatoireDestination IPv4. Utilisez la plage multicast à portée administrative 239.0.0.0/8 pour la distribution à l'intérieur d'un bâtiment. L'unicast est accepté pour les liaisons point à point.
destination.portobligatoirePort UDP de destination. Des groupes distincts peuvent partager un port ; un même groupe et un même port utilisés par deux chaînes constituent un émetteur en double et produisent des images inregardables sur les deux.
Comportement
force_always_onfalseFait tourner cette chaîne en continu, sans tenir compte de la détection des spectateurs. À utiliser pour une chaîne qui doit être disponible instantanément, ou pour une chaîne transportée sur un multiplex DVB-C, où il n'y a de toute façon aucun abonnement IGMP à observer.
enginehéritéRemplace default_engine pour cette chaîne. La raison habituelle est une source que le moteur pass-through ne sait pas lire, ou un équipement en aval qui exige une sortie remultiplexée.
resolution_profilevideL'une des valeurs 4k, fullhd, hd, sd, mobile, ou vide pour laisser le choix au serveur d'origine. La sélection retient la hauteur la plus proche, les égalités allant au débit le plus élevé — une chaîne qui diffuse en 480p quand personne ne publie de 576p vaut mieux qu'une chaîne qui refuse de démarrer. Le choix est appliqué à chaque démarrage et jamais réécrit dans ce fichier. Voir Profils de résolution.
Supervision — fichier de configuration uniquement
min_output_kbps500Le plancher en dessous duquel cette chaîne est considérée comme ne produisant rien, et redémarrée. Abaissez-le pour la radio et les autres services uniquement audio : une chaîne radio à 128 kbps évaluée contre un seuil dimensionné pour la vidéo est jugée muette en permanence et redémarrée en boucle. Non exposé dans l'interface web.
pdt_shift_ms0Seuil de redémarrage pour la dérive du programme-date-time, en millisecondes : si la chronologie déclarée par la source saute de plus que cette valeur, la chaîne est redémarrée plutôt que laissée tourner sur une horloge faussée. 0 désactive la vérification ; c'est la valeur par défaut, car un serveur d'origine qui réhorodate légitimement provoquerait sinon des redémarrages. Non exposé dans l'interface web.

Chaque entrée sous dvb_muxes est une porteuse RF : un ensemble de chaînes assemblées en un seul transport stream et modulées sur le réseau coaxial. Voir Multiplexage DVB-C pour le choix des paramètres RF.

CléValeurRôle
Identité
idattribuéIdentifiant numérique du multiplex, utilisé dans les chemins de l'API.
nameobligatoireLibellé du multiplex à l'usage de l'opérateur. Non transmis.
deviceindex ou cheminLe matériel de modulation sur lequel ce multiplex est émis, identifié par index ou par chemin de périphérique selon la carte installée. Un multiplex par périphérique.
Paramètres RF
frequencyHzFréquence centrale de la porteuse, en hertz et non en mégahertz. 474000000, pas 474. Doit respecter le plan de fréquences du réseau câblé existant du bâtiment et ne doit pas entrer en collision avec une porteuse déjà présente.
qam16 / 32 / 64 / 128 / 256Ordre de modulation. Plus il est élevé, plus il transporte de débit dans les mêmes 8 MHz et moins il tolère le bruit. Sur un coaxial intérieur sain, le 256-QAM est la norme ; descendez si le câblage est ancien, très ramifié ou de qualité inconnue.
symbol_rateksym/sDébit de symboles de la porteuse. Avec l'ordre de modulation, il fixe le débit total disponible pour l'ensemble des services du multiplex : c'est donc le chiffre qui décide du nombre de chaînes qui y tiennent.
Signalisation
network_identierIdentifiant de réseau signalé aux récepteurs. Gardez-le identique sur tous les multiplex d'un même site, afin que les téléviseurs les traitent comme un seul réseau plutôt que plusieurs.
ts_identierIdentifiant de transport stream. Doit être unique parmi les multiplex du site ; des doublons conduisent les téléviseurs à écraser une liste de chaînes par une autre pendant une recherche.
network_nametexteNom de réseau signalé aux récepteurs. C'est le texte qu'un client voit pendant la recherche des chaînes ; c'est donc normalement le nom du bâtiment.
activetrueIndique si le multiplex est émis. Le mettre à false arrête la porteuse ; les téléviseurs afficheront toute la grille comme absente, et pas une seule chaîne morte.
Contenu
channel_idsliste ordonnéeLes chaînes transportées, par id. L'ordre est significatif. La position dans cette liste détermine l'emplacement, le bloc de PID attribué au service et l'identifiant de service. Réordonner la liste réidentifie donc les services, et les téléviseurs qui ont déjà effectué une recherche peuvent devoir en refaire une pour être de nouveau d'accord avec vous. Ajoutez en fin de liste lorsque c'est possible.

Sauvegardez l’ensemble du répertoire de configuration, pas seulement config.yaml. Outre la configuration, il contient l’identité de licence de l’appareil et ses données de guide des programmes :

Dans le répertoireDe quoi il s'agit
config.yamlLa configuration décrite sur cette page.
config.yaml.pre-migrationLe fichier tel qu'il était avant que la dernière mise à jour ne le modifie. C'est celui à restaurer si une migration ne vous convient pas.
identity/La clé d'appareil et le certificat de l'appareil pour le serveur de licences. Si vous les perdez, l'appareil restauré apparaît au serveur de licences comme un nouvel appareil non approuvé, et ne diffuse pas tant qu'il n'a pas été à nouveau approuvé.
epg.dbDonnées de guide des programmes enregistrées. Elles peuvent être reconstruites en resynchronisant les sources du guide : il est donc pratique de les conserver, sans que ce soit indispensable.

Les chemins dépendent du côté du conteneur où vous vous trouvez. Avec l’installation décrite dans ce manuel, le répertoire est /opt/castmux/config sur l’hôte, et le conteneur le voit comme /config. Le fichier de configuration est donc /opt/castmux/config/config.yaml depuis un shell sur l’appareil, et /config/config.yaml à l’intérieur du conteneur. Les sauvegardes se font depuis l’hôte :

Terminal window
# on the appliance (host), as root: the files are owned by root
sudo cp -a /opt/castmux/config /backup/seaview-court-$(date +%F)

Copier pendant que le service tourne ne pose normalement pas de problème, car config.yaml n’est réécrit que lorsqu’un réglage est enregistré. N’enregistrez pas de modifications dans l’interface web pendant la copie. Pour une copie garantie cohérente, y compris epg.db au milieu d’une synchronisation du guide, arrêtez d’abord le conteneur.

Pour restaurer, arrêtez le conteneur, remettez le répertoire en place et redémarrez-le. Remplacer des fichiers sous un conteneur en fonctionnement ne marche pas : le service en cours écrit sa propre copie de config.yaml par-dessus la vôtre à la modification suivante.

Terminal window
# on the appliance (host)
sudo docker stop castmux
sudo rm -rf /opt/castmux/config
sudo cp -a /backup/seaview-court-2026-04-11 /opt/castmux/config
sudo docker start castmux

Avec Docker Compose, utilisez plutôt sudo docker compose stop et sudo docker compose start dans /opt/castmux. Si vous avez monté un autre répertoire de l’hôte, remplacez-le partout à la place de /opt/castmux/config.

Le fichier étant du YAML brut, le config.yaml d’une sauvegarde sert aussi de point de départ pour un second site : changez les adresses, les noms et les paramètres RF, le reste se transpose. Copiez uniquement config.yaml dans ce cas, jamais identity/. Deux appareils ayant la même identité sont le même appareil aux yeux du serveur de licences. C’est un processus manuel aujourd’hui.

L’export et l’import en un clic depuis l’interface web, ainsi que le clonage d’une configuration sur une flotte de sites : prévu.