Aller au contenu

Applications — tracker des apps + EAT de redémarrage

Le système Applications fait trois choses :

  1. Suit ce qui doit tourner sur un host (par app : type, identifier, état attendu)
  2. Compare l’état réel depuis l’inventaire toutes les 60 s à l’attendu
  3. Vous donne un seul bouton pour signer un EAT de redémarrage gated TOTP pour une app spécifique
  1. Sidebar → Applications (sous ACTION)
  2. Bouton en haut à droite + Track an app
  3. Renseignez :
    • Agent — quel host doit faire tourner cette app
    • Typesystemd unit / docker container / docker compose service / raw process
    • Name — étiquette libre pour les listes (ex. “MyApp web”)
    • Identifier — identifier concret par type :
      • systemd : nom d’unité (nginx.service)
      • docker : nom de conteneur (mycontainer)
      • compose : <project>::<service> (flowd_dev::app)
      • process : chemin absolu vers le binaire (/opt/myapp/start.sh)
  4. Documentation (facultative mais recommandée pour handover MSP) :
    • Owner email — qui contacter quand l’app casse
    • Runbook URL — lien vers docs internes
    • Notes — texte libre (pipeline deploy, dépendances, channel slack)
  5. Sous Discovered on host vous voyez la liste live des unités systemd + conteneurs docker que l’agent vient de rapporter. Cliquez sur une ligne pour auto-remplir Type + Identifier + Name
  6. Cliquez sur le bouton noir Track this app en bas

À partir de maintenant : le worker liveness démarre dans les 60 s, état attendu = running (modifiable plus tard sur la page détail de l’app).

Ce qui se passe ensuite (par app, toutes les 60 s)

Section intitulée « Ce qui se passe ensuite (par app, toutes les 60 s) »
PhaseQuoi
1. observeWorker lit l’état actuel depuis le DERNIER snapshot inventaire de l’agent
2. compareexpected_state vs observé (running/stopped/unknown)
3. mismatchSur différence : émet signal app.state_mismatch + incrémente compteur consecutive_mismatch
4. alertAprès 3 mismatches consécutifs : alerte avec sévérité warning
5. dashboardLigne app montre pixel rouge + timestamp last_state_change

unknown (worker ne trouve pas de ligne pour cet identifier dans le dernier snapshot) ne compte pas comme mismatch — l’agent est peut- être brièvement down ou c’est un nouveau déploiement. Compte seulement après quatre unknowns consécutifs.

Chaque ligne app a un bouton Restart. Cliquer → prompt TOTP → le hub signe un EAT Ed25519 niveau 2 et le pousse via WebSocket à l’agent. L’agent exécute monsys-action restart-app <id> en utilisateur dédié (pas de root permanent) et le wrapper choisit :

  • systemd : systemctl restart <unit>
  • docker : docker restart <container>
  • compose : docker compose -p <project> restart <service>
  • process : la restart_command configurée (chemin absolu requis)

Le résultat (exit_code + stdout/stderr) est repoussé et atterrit dans audit_log + transparency_log comme preuve — même flux que toutes les autres actions EAT sur la plateforme.

Les apps héritent des tags de leur agent. Une app sur un host avec tag production-db apparaît dans chaque filtre/moteur SLA qui filtre sur ce tag. Vous voulez grouper apps par environnement ? Taguez le host (pas l’app).

Fenêtre de terminal
# Lister toutes les apps pour un tenant
curl https://app.monsys.ai/api/v1/apps \
-H "Authorization: Bearer $TOKEN"
# Enregistrer une app
curl -X POST https://app.monsys.ai/api/v1/apps \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "<agent_uuid>",
"name": "MyApp web",
"app_type": "docker",
"identifier": "eurooffice",
"owner_email": "jeroen@gotrust.be",
"runbook_url": "https://wiki.example.com/runbooks/myapp",
"notes": "Déploie via GitOps · slack #platform · dépend de redis-prod"
}'
# Modifier expected_state
curl -X PATCH https://app.monsys.ai/api/v1/apps/<id> \
-H "Authorization: Bearer $TOKEN" \
-d '{"expected_state": "stopped"}'
# Redémarrer (requiert header TOTP)
curl -X POST https://app.monsys.ai/api/v1/apps/<id>/restart \
-H "Authorization: Bearer $TOKEN" \
-H "X-TOTP-Code: 123456" \
-d '{"reason": "Fuite mémoire selon ticket TKT-9001"}'
# Arrêter le tracking
curl -X DELETE https://app.monsys.ai/api/v1/apps/<id> \
-H "Authorization: Bearer $TOKEN"
  • L’agent n’a pas encore envoyé d’extended inventory : nouveaux agents poussent toutes les 6 h (default inventory_interval_secs). Attendez ou déclenchez manuellement avec monsys-agent --once sur le host
  • Agent offline : vérifiez /agents/<id>last_seen_at. Les agents stale ne rapportent pas
  • Agent sur un binaire plus ancien que v0.1.0+20260519 : l’extended inventory existe depuis. Déclenchez auto-update ou upgrade manuel
  • Bug corrigé le 2026-05-20 : la requête discovery manquait le scope latest-snapshot ET le tenant guard. Les deux sont maintenant dans le hub. Hard-refresh votre navigateur après ce fix
  • Inventaire lui-même (tous services + packages + ports) → voir onglet Inventaire sur la page détail de l’agent
  • Scan CVE applicatif (deps npm/pip/composer/go) → voir Application CVEs
  • Alertes app-level (cpu/mem/restart-count) → voir Alert builder