FEAT: Auto-update agent — mode Docker (images taguées + mise à jour propre) #97

Closed
opened 2026-08-12 10:33:05 +02:00 by nonobis · 2 comments
Owner

Contexte

L'agent Docker (eltruncho/heimdall-agent) est déployé avec image: ...:latest — aucune gestion de version ni de mise à jour automatique. Décision du chef de projet (12/08/2026) : updater intégré (Option B) — l'agent compare sa version à l'endpoint central et se met à jour lui-même. watchtower écarté.

Référence — étude Pangolin (fosrl/pangolin, 12/08/2026)

  • Les images sont taguées par version (make build-release-amd64 tag=$TAG → fosrl/pangolin:${TAG}) — jamais :latest seul pour une release ;
  • la version est embarquée dans le conteneur (--build-arg VERSION) et comparée par l'UI (ProductUpdates.tsx, semver) ;
  • le mécanisme d'update reste côté « installateur » (pull + up -d de la stack).

État actuel Heimdall (constats code)

  • docker/docker-compose.prod.yml : heimdall-agent: image: eltruncho/heimdall-agent:latest (ligne 129) — image jamais publiée par le pipeline (voir #95).
  • Aucune notion de tag de version dans le compose, aucun mécanisme d'update.

À faire — updater intégré

  1. Stratégie d'images : publier heimdall-agent:vX.Y.Z + :latest (voir #95) ; compose prod versionnable (AGENT_IMAGE_TAG env, défaut tag courant) ; documenter le passage de :latest à un tag précis.
  2. DockerUpdateService côté agent :
    • compare sa version runtime (InformationalVersion) à GET /api/updates/latest (même endpoint que le mode natif, ticket #96) ;
    • si nouvelle version : docker pull eltruncho/heimdall-agent:<tag> puis recreate du conteneur via le socket Docker monté en lecture restreinte (accès au conteneur cible uniquement — --label + filtre, pas d'accès administrateur global) ou API Docker en TLS ;
    • draine les captures en cours avant recreate ; rollback sur échec de démarrage du nouveau conteneur ;
    • journalisation via les logs agent existants.
  3. Déclenchement : automatique si auto-update activé (même contrôle par site que #96), sinon bouton « Mettre à jour » dans l'UI.
  4. UI : section « Mise à jour » dans AgentDetail.razor (mode Docker détecté) : version courante, version dispo, badge, bouton « Mettre à jour », statut (à jour / dispo / en cours / échec).
  5. Compatibilité : l'agent tourne en network_mode: host — vérifier que le socket Docker monté fonctionne dans ce mode (le conteneur peut joindre le socket du host).

Critères d'acceptation

  • Le compose prod référence une image taguée par défaut.
  • Un agent Docker peut être mis à jour depuis l'UI (ou automatiquement si activé) via l'updater intégré, sans downtime long.
  • La version affichée dans l'UI correspond à la version réelle du conteneur.
  • Un échec de pull/recreate n'affecte pas le conteneur en cours d'exécution (rollback).

Fichiers concernés

  • src/Heimdall.Agent/Services/DockerUpdateService.cs (nouveau)
  • src/Heimdall.Web/Controllers/UpdatesController.cs (partagé avec #96)
  • src/Heimdall.Web/Components/Pages/AgentDetail.razor
  • docker/docker-compose.prod.yml (+ docker/docker-compose.yml dev)
  • docs/ (déploiement agent, stratégie de mise à jour)


Maquette

Maquette

Description

Mêmes éléments UI que #96 déclinés pour les agents Docker : image installée vs disponible (mono), bouton « Mettre à jour vers 1.1.0 » (pull + recreate), statut, contrôle par site avec straté


Maquette

Maquette

## Contexte L'agent Docker (`eltruncho/heimdall-agent`) est déployé avec `image: ...:latest` — aucune gestion de version ni de mise à jour automatique. **Décision du chef de projet (12/08/2026) : updater intégré (Option B)** — l'agent compare sa version à l'endpoint central et se met à jour lui-même. ~~watchtower~~ écarté. ## Référence — étude Pangolin (fosrl/pangolin, 12/08/2026) - Les images sont **taguées par version** (`make build-release-amd64 tag=$TAG` → `fosrl/pangolin:${TAG}`) — jamais `:latest` seul pour une release ; - la version est embarquée dans le conteneur (`--build-arg VERSION`) et comparée par l'UI (`ProductUpdates.tsx`, semver) ; - le mécanisme d'update reste côté « installateur » (pull + up -d de la stack). ## État actuel Heimdall (constats code) - `docker/docker-compose.prod.yml` : `heimdall-agent: image: eltruncho/heimdall-agent:latest` (ligne 129) — image **jamais publiée** par le pipeline (voir #95). - Aucune notion de tag de version dans le compose, aucun mécanisme d'update. ## À faire — updater intégré 1. **Stratégie d'images** : publier `heimdall-agent:vX.Y.Z` + `:latest` (voir #95) ; compose prod versionnable (`AGENT_IMAGE_TAG` env, défaut tag courant) ; documenter le passage de `:latest` à un tag précis. 2. **`DockerUpdateService` côté agent** : - compare sa version runtime (`InformationalVersion`) à `GET /api/updates/latest` (même endpoint que le mode natif, ticket #96) ; - si nouvelle version : `docker pull eltruncho/heimdall-agent:<tag>` puis recreate du conteneur via le socket Docker monté en **lecture restreinte** (accès au conteneur cible uniquement — `--label` + filtre, pas d'accès administrateur global) ou API Docker en TLS ; - draine les captures en cours avant recreate ; rollback sur échec de démarrage du nouveau conteneur ; - journalisation via les logs agent existants. 3. **Déclenchement** : automatique si auto-update activé (même contrôle par site que #96), sinon bouton « Mettre à jour » dans l'UI. 4. **UI** : section « Mise à jour » dans `AgentDetail.razor` (mode Docker détecté) : version courante, version dispo, badge, bouton « Mettre à jour », statut (à jour / dispo / en cours / échec). 5. **Compatibilité** : l'agent tourne en `network_mode: host` — vérifier que le socket Docker monté fonctionne dans ce mode (le conteneur peut joindre le socket du host). ## Critères d'acceptation - Le compose prod référence une image taguée par défaut. - Un agent Docker peut être mis à jour depuis l'UI (ou automatiquement si activé) via l'updater intégré, sans downtime long. - La version affichée dans l'UI correspond à la version réelle du conteneur. - Un échec de pull/recreate n'affecte pas le conteneur en cours d'exécution (rollback). ## Fichiers concernés - `src/Heimdall.Agent/Services/DockerUpdateService.cs` (nouveau) - `src/Heimdall.Web/Controllers/UpdatesController.cs` (partagé avec #96) - `src/Heimdall.Web/Components/Pages/AgentDetail.razor` - `docker/docker-compose.prod.yml` (+ `docker/docker-compose.yml` dev) - `docs/` (déploiement agent, stratégie de mise à jour) --- --- ## Maquette - **Lien Penpot** : [nonobis-design-system › page agents](https://penpot.tordais.cc/?page=127dfd1c-12b5-80f7-8008-79c6fdaf09f4) ![Maquette](https://forgejo.tordais.cc/attachments/f34da02e-426f-4be0-bc36-e7acc431011c) - [Détails / composants MudBlazor (README)](https://forgejo.tordais.cc/attachments/d5fe0dc5-ebe0-45f4-ad31-1aa75ff14718) - Statut : maquette appliquée dans Penpot ✓ ## Description Mêmes éléments UI que #96 déclinés pour les agents Docker : image installée vs disponible (mono), bouton « Mettre à jour vers 1.1.0 » (pull + recreate), statut, contrôle par site avec straté --- ## Maquette - **Lien Penpot** : [nonobis-design-system › page agents](https://penpot.tordais.cc/?page=127dfd1c-12b5-80f7-8008-79c6fdaf09f4) ![Maquette](https://forgejo.tordais.cc/attachments/f34da02e-426f-4be0-bc36-e7acc431011c) - [Détails / composants MudBlazor (README)](https://forgejo.tordais.cc/attachments/d5fe0dc5-ebe0-45f4-ad31-1aa75ff14718) - Statut : maquette appliquée dans Penpot ✓
Author
Owner

Décision chef de projet (12/08/2026) : updater intégré (Option B). watchtower écarté. L'agent compare sa version via /api/updates/latest et se recrée lui-même via le socket Docker restreint.

Décision chef de projet (12/08/2026) : updater intégré (Option B). watchtower écarté. L'agent compare sa version via /api/updates/latest et se recrée lui-même via le socket Docker restreint.
Author
Owner

Maquette the-designer intégrée (14/08/2026) :

Maquette the-designer intégrée (14/08/2026) : - Aperçu (PNG) : https://forgejo.tordais.cc/attachments/f34da02e-426f-4be0-bc36-e7acc431011c - Détails / composants MudBlazor (README) : https://forgejo.tordais.cc/attachments/d5fe0dc5-ebe0-45f4-ad31-1aa75ff14718 - Statut : application Penpot différée (plugin MCP non connecté) — maquette locale consultable
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#97
No description provided.