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.

-
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.

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

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

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

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

-
Vérifier l’heure de toutes les Caméras sans attendre la vérification horaire : « 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.

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

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

-
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, imageghcr.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
:stagingversX.Y.Zse 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
- 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.
- 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.
- 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.
- 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.
- 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.mdet un ADR.
Heure du Site
- 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.
- En tant qu’Administrateur, je veux choisir la source de l’heure : un serveur NTP externe (adresse saisie,
pool.ntp.orgpar défaut) ou l’horloge du serveur, avec repli automatique sur l’horloge du serveur quand la source externe est injoignable. - 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
- 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.
- En tant qu’Administrateur, je veux que changer la source ou le fuseau recale toutes les Caméras actives.
- 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.
- 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 ».
- 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
- 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.
- 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.
- 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)
- 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.
- 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). Imageghcr.io/ulyssoulv/argos-temps, Dockerfile dans le dépôt, multi-arch,:stagingpuis 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.yamlattachetempsau macvlan avec une seconde IP fixe (ARGOS_RESEAU_CAMERAS_TEMPS_IPou équivalent) écrite parscripts/cameras/configurer-detection.sh. Sans macvlan :123/udppublié sur l’hôte, adresse annoncée = IP du Site (celle du certificat, 0.6.1). En dev, les Caméras simulées joignenttempspar 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 detemps(source utilisée, joignable ou non). - Calage ONVIF :
SetNTP(manuel, IP du Serveur de temps du Site),SetSystemDateAndTimeen mode NTP avec le fuseau du Site. JamaisFromDHCP. Une vérification relitGetSystemDateAndTime+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,horlogedans 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>parRange: bytes=0-1et n’accepte qu’un206. Enformat=mp4, l’API assemble le MP4 vidéo seule en mémoire et répond200,206(Content-Range) ou416; 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) ; preuveffprobe/ 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ément | Avant | Après | À annoter |
|---|---|---|---|---|
| 0.6.0 | Horloge dans les Réglages de la Caméra | Fuseau 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 Site | v0.6.0, #52, #56 |
| 0.4.2 / ADR 0003 | Réseau des caméras | Une sortie seulement : aucune requête servie sur le réseau des caméras | Seul 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.2 | Segments / relecture | Enregistrement 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 Chrome | v0.8.0, v0.8.2, ADR 0011, ADR 0013, #141 |