Aller au contenu principal

V0.8.0 — Enregistrement continu

Publiée le 18/10/2026.

Documentation fonctionnelle

Ce que change la version pour les collaborateurs

Pourquoi​

Un Site ArgOS diffuse déjà le Live des Caméras, mais ne garde rien sur disque. L'Administrateur ne pouvait pas enregistrer en continu le Flux des Caméras choisies, ni vérifier qu'un enregistrement écrit bien des fichiers — et le pont ne tirait le RTSP que lorsqu'on regardait.

Ce qu'on peut faire maintenant​

  • Allumer ou couper l'enregistrement continu d'une Caméra depuis l'Administration (interrupteur + indicateur à l'arrêt / enregistre / en erreur). Scénario 1 — enregistrement éteint
  • Voir le chemin du dossier (/enregistrements/camera-\<id>) et l'âge du dernier segment, sans ouvrir le Live. Scénario 2 — enregistrement ON Scénario 2 — segments
  • Conserver les segments déjà écrits quand on coupe l'enregistrement ou qu'on désactive la Caméra ; purger le dossier à la suppression. Scénario 4 — Caméra désactivée Scénario 6 — dossier purgé
  • Continuer à regarder le Live des autres Caméras pendant qu'une Caméra enregistre. Scénario 3 — Live témoin
  • Voir un échec d'écriture (Flux mort, etc.) comme en erreur. Scénario 5 — en erreur
  • Inspecter les fichiers fMP4 dans le volume Docker nommé enregistrements (segments ~1 min, rétention 1 h, sans réencodage) — pas de téléchargement ni de relecture dans l'UI. Scénario 2 — volume Docker Scénario 7 — pas de lecteur

Documentation technique

Spec versionnée : docs/specs/v0.8.0-enregistrement-continu.md

Issue parente : #115

V0.8.0 — Enregistrement continu

Problem Statement​

Un Site ArgOS diffuse déjà le Live des Caméras, mais ne garde rien sur disque. L’Administrateur ne peut pas enregistrer en continu le Flux des Caméras qu’il choisit, ni vérifier qu’un enregistrement écrit bien des fichiers (sans page de relecture). Le pont tire aujourd’hui le RTSP seulement quand quelqu’un regarde (sourceOnDemand), ce qui est incompatible avec un enregistrement vraiment continu.

Solution​

On livre une tranche bout en bout d’enregistrement continu, sans réencodage :

  • MediaMTX enregistre le Flux en segments fMP4 (~1 minute), dans un volume Docker nommé dynamique (comme la DB / l’Autorité), arborescence …/camera-\<id>/\<horodatage…>.
  • L’API pilote l’enregistrement par Caméra (ON / OFF) via l’API de contrôle MediaMTX, et force le tirage RTSP continu seulement quand l’enregistrement est ON ; sinon le comportement à la demande reste inchangé.
  • Dans l’Administration, un interrupteur par Caméra active l’enregistrement (OFF à l’ajout). Une Caméra désactivée ne peut pas enregistrer ; la désactiver coupe l’enregistrement en cours (les segments déjà écrits restent jusqu’à la purge).
  • Conservation fixe : 1 heure ; MediaMTX efface les segments trop vieux (recordDeleteAfter). Pas de réglage UI de la durée (0.8.1).
  • Preuve Administrateur : indicateur (état enregistre / à l’arrêt / en erreur + chemin du dossier + âge du dernier segment) ; l’API lit le volume (montage partagé avec MediaMTX, aussi pour purger à la suppression). Inspection des fichiers via Docker / volume — pas de téléchargement HTTP ni relecture UI.
  • À la suppression d’une Caméra, ArgOS efface le dossier camera-\<id>/.
  • Disque plein : écriture en échec, indicateur en erreur ; pas de filet magique (suivi stockage = 0.8.1).

User Stories​

Interrupteur et règles​

  1. En tant qu’Administrateur, je veux activer ou couper l’enregistrement d’une Caméra depuis la liste Administration, pour n’enregistrer que les Caméras choisies.
  2. En tant qu’Administrateur, je veux qu’une Caméra nouvellement ajoutée ait l’enregistrement OFF, pour ne pas saturer le disque par défaut.
  3. En tant qu’Administrateur, je veux ne pas pouvoir allumer l’enregistrement d’une Caméra désactivée, et que désactiver une Caméra qui enregistrait coupe l’enregistrement, pour que « désactivée » reste le coupe-circuit du Flux.
  4. En tant qu’Administrateur, je veux que, enregistrement OFF, le pont ne tire le RTSP que lorsqu’on visualise (Live / Aperçu), comme aujourd’hui.

Écriture et conservation​

  1. En tant qu’Administrateur, je veux que, enregistrement ON, le pont tire le RTSP en continu même sans Live ouvert, pour que des segments s’écrivent vraiment.
  2. En tant qu’Administrateur, je veux que les segments soient en fMP4 sans réencodage (H.264 ou H.265 tel que la Caméra l’envoie), pour garder la qualité du Flux.
  3. En tant qu’Administrateur, je veux trouver les fichiers sous camera-\<id>/ avec un nom horodaté, pour inspecter le volume à l’œil.
  4. En tant qu’Administrateur, je veux que les segments de plus d’une heure soient effacés automatiquement par MediaMTX, pour borner l’espace en 0.8.0.
  5. En tant qu’installateur, je veux qu’un volume Docker nommé dynamique reçoive les enregistrements sans question à l’install (pas de bind / second disque dans cette version), pour le même geste d’install qu’aujourd’hui.

Preuve et cycle de vie​

  1. En tant qu’Administrateur, je veux voir dans l’Administration l’état d’enregistrement, le chemin du dossier et l’âge du dernier segment (ou « aucun segment »), pour vérifier sans page de relecture.
  2. En tant qu’Administrateur, je veux qu’un échec d’écriture (disque plein, Flux mort, dernier segment trop vieux alors que l’enregistrement est ON) se voie comme en erreur, sans que le Site invente une politique de place disque.
  3. En tant qu’Administrateur, je veux qu’à la suppression d’une Caméra le dossier camera-\<id>/ disparaisse, pour ne pas laisser d’orphelins.
  4. En tant que mainteneur, je veux documenter comment inspecter le volume Docker des enregistrements, pour la preuve labo.

Vocabulaire et décisions​

  1. En tant que mainteneur, je veux que le glossaire définisse Enregistrement (et le segment sur disque si besoin).
  2. En tant que mainteneur, je veux un ADR qui tranche l’enregistrement par MediaMTX (volume, fMP4, tirage RTSP quand ON).

Implementation Decisions​

  • Pilotage par chemin MediaMTX camera-\<id> : record ON/OFF + sourceOnDemand false seulement si enregistrement ON (sinon true comme aujourd’hui).
  • recordPath sous le volume monté, motif …/%path/… avec %path = camera-\<id> ; recordFormat: fmp4 ; recordSegmentDuration ~1 min ; recordDeleteAfter: 1h.
  • Volume Compose nommé (ex. enregistrements) monté en écriture dans MediaMTX et dans api (indicateur + purge unlink de camera-\<id>/ à la suppression ; l’API n’écrit pas les segments).
  • Champ persistant sur la Caméra (ex. enregistrement booléen) ; PATCH depuis l’Administration ; UI : interrupteur dans la liste, pas seulement dans les Réglages.
  • Conservation non configurable en 0.8.0 (constante / config serveur fixe).
  • Pas d’endpoint de téléchargement ni de playback HTTP des segments.
  • ADR nouveau (n’écrase pas ADR 0001) : enregistrement continu et tirage RTSP conditionnel.
  • Hors CI Sonar ; bugs #86 / #95 hors périmètre.

Testing Decisions​

Un bon test vérifie un comportement observable (API, pont, fichiers, UI), pas le détail interne de MediaMTX couche par couche.

Seams :

  • API : PATCH enregistrement ON/OFF ; refus si Caméra désactivée ; désactivation coupe l’enregistrement ; DELETE Caméra efface le dossier de segments (volume de test).
  • Pont / réconciliation : Caméra active + enregistrement ON → chemin avec record et tirage non on-demand ; OFF → on-demand, pas d’enregistrement.
  • Fichiers : après enregistrement ON sur une Caméra simulée, apparition de segments sous camera-\<id>/ ; après délai factice ou config de test, respect de la rétention (ou assertion sur la config MediaMTX poussée).
  • UI Administration : interrupteur visible ; indicateur état / chemin / âge (ou aucun segment).
  • Compose : volume enregistrements présent ; docker compose config autonome.
  • Tests humains : allumer l’enregistrement sur une Caméra simulée, constater segments + indicateur ; couper ; désactiver ; inspecter le volume documenté.

Out of Scope​

  • Page Enregistrement / suivi stockage et débits (0.8.1).
  • Réglage UI de la durée de conservation ou d’un seuil disque (0.8.1).
  • Relecture / parcours des enregistrements depuis l’UI (0.8.2).
  • Bind mount vers un dossier hôte ou second disque choisi à l’install.
  • Téléchargement HTTP des segments ; auth dédiée playback.
  • Filet automatique si disque plein (coupe Caméras, raccourcit rétention).
  • Plages horaires d’enregistrement.
  • Correction des bugs #86 et #95.

Changements apportés aux versions antérieures​

VersionÉlémentAvantAprèsÀ annoter
0.3.0 / ADR 0001Tirage RTSP du pontToujours sourceOnDemand (tiré seulement quand quelqu’un regarde)Si enregistrement ON : tirage continu même sans Live ; sinon inchangév0.3.0, ADR 0001, #12

Further Notes​

  • Disque labo typique ~100 Go / ~50 Go utiles : la rétention 1 h + OFF par défaut bornent l’usage avant 0.8.1.
  • fMP4 = conteneur (pas une compression extra) ; lisible surtout une fois le segment fermé (VLC / navigateurs selon codec H.265).