Aller au contenu principal

V0.9.0 — Le Site, serveur de temps des Caméras

Publiée le 20/10/2026.

Documentation fonctionnelle

Ce que change la version pour les collaborateurs

Pourquoi​

Chaque Caméra gardait sa propre horloge : elles dérivaient chacune de leur côté, l’heure incrustée différait d’une Caméra à l’autre, et sur un réseau des caméras isolé aucun serveur de temps n’était joignable. Depuis la 0.6.0, la seule correction était le bouton « Mettre à l’heure du Site », Caméra par Caméra, à refaire à la main. Le Site sert désormais l’heure (NTP) sur le réseau des caméras et cale chaque Caméra ONVIF dessus : une heure juste et commune à toutes, sans internet ni remise à l’heure manuelle.

Ce qu'on peut faire maintenant​

  • Voir l’heure du Site, d’où elle vient et quel Serveur de temps les Caméras reçoivent, sur une seule page : Administration → Heure du Site.

    Page Heure du Site

  • Une Caméra ONVIF ajoutée au Site est calée sur lui, sans réglage : elle passe « recalée » avec un écart de moins d’une seconde.

    Caméra recalée

  • La date incrustée dans le Live est l’heure juste du Site.

    Live à l’heure du Site

  • Changer le fuseau du Site une fois recale toutes les Caméras actives : la date incrustée suit.

    Live en UTC

  • Choisir la source de l’heure : un serveur NTP externe ou l’horloge du serveur.

    Source horloge du serveur

  • Un serveur NTP injoignable ne casse rien : le Site sert l’horloge du serveur et le dit.

    Repli sur l’horloge du serveur

  • Vérifier l’heure de toutes les Caméras sans attendre la vérification horaire : « Vérifier maintenant ».

    Vérifier maintenant

  • Repérer les Caméras que le Site ne peut pas caler : elles sont marquées « sans ONVIF », sans gêner les autres.

    Caméras sans ONVIF

  • Les Réglages de la Caméra ne parlent plus d’heure : Incrustations, Image et Encodage seulement.

    Réglages sans Horloge

  • Régler à la main l’heure d’une caméra sans ONVIF, en suivant la doc.

    Doc : L’heure de la Caméra

  • Relire sous Safari les enregistrements d’une Caméra H.265 qui envoie aussi du son, comme sous Chrome (vidéo seule, sans son).

  • Le Serveur de temps du Site (temps, image ghcr.io/ulyssoulv/argos-temps) ne répond qu’en NTP sur l’UDP 123 : sur le réseau des caméras à sa propre IP fixe (macvlan), sinon publié sur l’hôte, ce qui permet aussi de caler une vraie caméra du réseau local depuis un Mac. Il tourne sans root ni aucune capacité et ne règle jamais l’horloge de l’hôte.

  • Pour le mainteneur : la promotion des images :staging vers X.Y.Z se lance à la main (workflow Actions Promouvoir images vers Release), une fois staging à jour.

Documentation technique

Spec versionnée : docs/specs/v0.9.0-le-site-serveur-de-temps-des-cameras.md

Issue parente : #133

V0.9.0 — Le Site, serveur de temps des Caméras

Problem Statement​

Chaque Caméra garde sa propre horloge : elles dérivent, chacune de son côté, et l’heure incrustée dans l’image diffère d’une Caméra à l’autre. Sur un réseau des caméras isolé (sans internet), elles n’ont aucun serveur de temps joignable. Depuis la 0.6.0, la seule correction est le bouton « Mettre à l’heure du Site », Caméra par Caméra, à refaire à la main dès que l’heure dérive, et le fuseau se règle aussi Caméra par Caméra.

Solution​

Le Site devient le Serveur de temps du Site : un nouveau service temps (chrony, image argos-temps) sert l’heure en NTP (UDP 123) sur le réseau des caméras. Il suit une source amont (par défaut pool.ntp.org, repli sur l’horloge du serveur quand elle est injoignable), sans toucher l’horloge de l’hôte.

L’Heure du Site (source et fuseau) se règle une fois, dans une nouvelle page Heure du Site de l’Administration. Le Site cale chaque Caméra ONVIF dessus : serveur NTP = le Site, fuseau = le fuseau du Site. Il le fait à l’ajout, à chaque changement de l’Heure du Site, et lors d’une vérification toutes les heures (plus un bouton « Vérifier maintenant »). Une Caméra qui vise un autre serveur ou un autre fuseau est recalée sans demander. Un écart de plus de 2 s sur une Caméra pourtant calée est signalé.

La section Horloge disparaît des Réglages de la Caméra, avec le bouton « Mettre à l’heure du Site ».

L’adresse annoncée aux caméras est une IP fixe de temps sur la prise des caméras (macvlan, prod Linux). Sans macvlan (Mac / Docker Desktop), temps publie l’UDP 123 sur l’hôte et le Site annonce son IP. Seul l’UDP 123 de temps répond sur le réseau des caméras (ADR de cette version, complète l’ADR 0003).

User Stories​

Serveur de temps​

  1. En tant qu’Administrateur, je veux que le Site serve l’heure en NTP sur le réseau des caméras, pour que des Caméras sans accès à internet aient une heure juste et commune.
  2. En tant qu’Administrateur, je veux que l’install et la mise à jour Ubuntu installent et mettent à jour le service de temps comme les autres services, sans étape manuelle.
  3. En tant qu’Administrateur, je veux que le script réseau réserve une IP fixe hors DHCP pour le Serveur de temps du Site sur la prise des caméras, pour que les Caméras le joignent sans routeur.
  4. En tant que développeur sous Mac, je veux que le Serveur de temps soit joignable par l’IP du Site (UDP 123 publié) quand il n’y a pas de macvlan, pour caler une vraie caméra de mon réseau sur ma machine.
  5. En tant que mainteneur, je veux que seul l’UDP 123 du service de temps réponde sur le réseau des caméras, documenté dans docs/securite.md et un ADR.

Heure du Site​

  1. En tant qu’Administrateur, je veux une page Heure du Site dans l’Administration, avec l’heure actuelle du Site, la source effectivement utilisée, le fuseau et l’adresse du Serveur de temps sur le réseau des caméras.
  2. En tant qu’Administrateur, je veux choisir la source de l’heure : un serveur NTP externe (adresse saisie, pool.ntp.org par défaut) ou l’horloge du serveur, avec repli automatique sur l’horloge du serveur quand la source externe est injoignable.
  3. En tant qu’Administrateur, je veux régler le fuseau du Site une fois (fuseau de l’hôte par défaut), pour que toutes les Caméras incrustent la même heure locale.

Calage des Caméras​

  1. En tant qu’Administrateur, je veux qu’une Caméra ONVIF ajoutée soit calée sur le Site (serveur NTP, fuseau) sans rien faire.
  2. En tant qu’Administrateur, je veux que changer la source ou le fuseau recale toutes les Caméras actives.
  3. En tant qu’Administrateur, je veux que le Site vérifie toutes les heures chaque Caméra active, la recale si elle ne vise plus le Site ou n’a plus le fuseau du Site, et signale un écart de plus de 2 s.
  4. En tant qu’Administrateur, je veux un tableau des Caméras sur la page Heure du Site (calée, écart, recalée, sans ONVIF, échec, dernière vérification) et un bouton « Vérifier maintenant ».
  5. En tant qu’Administrateur, je veux qu’une Caméra sans ONVIF (ou ONVIF en clair non accordé) apparaisse « sans ONVIF », avec l’adresse NTP à saisir à la main dans la caméra (doc).

Changements et preuve​

  1. En tant qu’Administrateur, je ne veux plus de section Horloge dans les Réglages de la Caméra : l’heure se règle pour le Site, pas pour une Caméra.
  2. En tant que développeur, je veux que les Caméras simulées démarrent avec une horloge décalée (+7 min) et interrogent vraiment le serveur NTP reçu, pour voir, en local comme en CI, leur écart retomber à ~0 et la date incrustée corrigée.
  3. En tant que mainteneur, je veux que le glossaire définisse Heure du Site et Serveur de temps du Site, et que Horloge et Réglages de la Caméra suivent.

Relecture sans audio (bug #141)​

  1. En tant qu’Administrateur sur Safari, je veux relire les Segments d’une Caméra H.265 dont le Flux RTSP annonce une piste audio, sans message « Enregistrement indisponible », pour que la relecture 0.8.2 marche comme sous Chrome.
  2. En tant qu’Administrateur, je veux que les nouveaux Segments (et/ou le playback) ne portent que la piste vidéo, le son étant mis de côté pour cette génération produit (pas d’audio utile attendu).

Implementation Decisions​

  • Service temps : chrony lancé avec -x (ne règle jamais l’horloge de l’hôte, sert l’heure estimée de la source). Image ghcr.io/ulyssoulv/argos-temps, Dockerfile dans le dépôt, multi-arch, :staging puis promotion de digest aux Releases (ADR 0010), compose de prod autonome et install / MAJ Ubuntu inchangées dans leur principe.
  • Réseau : compose.reseau-cameras.yaml attache temps au macvlan avec une seconde IP fixe (ARGOS_RESEAU_CAMERAS_TEMPS_IP ou équivalent) écrite par scripts/cameras/configurer-detection.sh. Sans macvlan : 123/udp publié sur l’hôte, adresse annoncée = IP du Site (celle du certificat, 0.6.1). En dev, les Caméras simulées joignent temps par le réseau Compose.
  • Configuration : l’API garde l’Heure du Site (source, fuseau) en base et la transmet à temps (fichier de config partagé ou commande chronyc — à trancher à l’implémentation) ; elle lit l’état de temps (source utilisée, joignable ou non).
  • Calage ONVIF : SetNTP (manuel, IP du Serveur de temps du Site), SetSystemDateAndTime en mode NTP avec le fuseau du Site. Jamais FromDHCP. Une vérification relit GetSystemDateAndTime + GetNTP.
  • Vérification périodique : tâche de fond de l’API toutes les heures, plus à l’ajout, au changement de l’Heure du Site et sur « Vérifier maintenant ». Résultat par Caméra mémorisé (état, écart, date).
  • Retraits : section Horloge des Réglages (UI), POST /cameras/\{id\}/reglages/mise-a-l-heure, horloge dans la modification des Réglages, onvif.mettre_a_l_heure.
  • Caméra simulée : horloge décalée au démarrage, vrai client NTP vers le serveur reçu par SetNTP.
  • Docs : nouvel ADR 0014 (Serveur de temps du Site sur le réseau des caméras), docs/securite.md, glossaire, docs/cameras/parametrer-une-camera.md (plus d’Horloge, renvoi vers Heure du Site et réglage manuel pour une caméra sans ONVIF), README si besoin.
  • Relecture / enregistrement (#141) : n’enregistrer et/ou ne servir en playback que la piste vidéo (ignorer l’audio RTSP ipcm / équivalent). Pas de fonctionnalité micro. Les Segments déjà muxés avec audio restent hors obligation de réparation ; les nouveaux Segments (ou un remux vidéo seule au playback) doivent permettre la relecture H.265 sous Safari. Trancher à l’implémentation : filtre à l’enregistrement MediaMTX, remux au /get, ou les deux.
  • Plages d’octets de la relecture (#143) : Safari ouvre la \<video> par Range: bytes=0-1 et n’accepte qu’un 206. En format=mp4, l’API assemble le MP4 vidéo seule en mémoire et répond 200, 206 (Content-Range) ou 416 ; chaque plage relit le Segment au serveur playback (ADR 0013).

Testing Decisions​

Un bon test vérifie un comportement observable (réponse NTP, API, UI, état d’une Caméra simulée), pas la config chrony ligne à ligne.

Seams :

  • temps : répond en NTP sur UDP 123 ; heure servie proche de la source ; repli sur l’horloge du serveur quand la source est injoignable.
  • API : lire / modifier l’Heure du Site ; calage à l’ajout ; recalage au changement ; vérification (calée, écart > 2 s signalé, recalée, sans ONVIF, échec) ; routes de la 0.6.0 retirées.
  • Caméra simulée : décalée au démarrage, écart ~0 après calage.
  • UI : page Heure du Site, tableau des Caméras, « Vérifier maintenant », plus de section Horloge dans les Réglages.
  • Tests humains : page Heure du Site, Caméras simulées qui se recalent (+7 min → ~0, date incrustée corrigée dans le Live), changement de fuseau, et si possible une vraie caméra sous Mac par l’UDP 123 publié.
  • Relecture (#141) : nouveau Segment (ou playback) sans piste audio ; relecture H.265 sous un navigateur qui échouait avec ipcm (Safari) ; preuve ffprobe / test auto si un Flux de test peut exposer de l’audio.

Out of Scope​

  • Surveiller ou recaler l’horloge de l’OS du serveur (pas de SYS_TIME).
  • Datation des Segments enregistrés : ils restent datés à la réception par l’horloge du serveur ; une horloge serveur fausse décale la timeline de la 0.8.2.
  • Affichage des heures de l’UI au fuseau du Site (l’UI garde l’heure du navigateur).
  • Réglage manuel de l’heure du Site.
  • DHCP (dont option 42) sur le réseau des caméras (Plus tard).
  • Caméras sans ONVIF : pas de réglage automatique.
  • Correction des bugs #86 et #95.
  • Audio d’enregistrement « utile » (micro caméra) comme fonctionnalité.
  • Refonte obligatoire de la relecture en HLS (seulement si la vidéo seule ne suffit pas).
  • Fil rouge 1.0.0 / refonte de l’Administration.

Changements apportés aux versions antérieures​

VersionÉlémentAvantAprèsÀ annoter
0.6.0Horloge dans les Réglages de la CaméraFuseau réglé Caméra par Caméra, NTP en lecture seule, bouton « Mettre à l’heure du Site » (mode manuel, heure UTC du serveur)Section retirée des Réglages ; Heure du Site (source, fuseau) réglée une fois dans l’Administration, Caméras calées en NTP sur le Serveur de temps du Sitev0.6.0, #52, #56
0.4.2 / ADR 0003Réseau des camérasUne sortie seulement : aucune requête servie sur le réseau des camérasSeul l’UDP 123 du Serveur de temps du Site y répond (ADR 0014)v0.4.2, ADR 0003, #36
0.8.0 / 0.8.2Segments / relectureEnregistrement et playback muxent les pistes du Flux RTSP (vidéo + éventuel audio ipcm) ; Safari peut échouer en relecture H.265 (#141)Nouveaux Segments et/ou playback vidéo seule ; relecture H.265 sous Safari comme sous Chromev0.8.0, v0.8.2, ADR 0011, ADR 0013, #141

Further Notes​

  • La page Heure du Site sera reprise dans la refonte de l’Administration (1.0.0).
  • Un bouton pour remettre l’horloge de l’OS à l’heure (SYS_TIME) a été écarté : l’heure servie aux Caméras ne dépend pas de l’horloge de l’OS quand une source externe est joignable.