Applications — apps tracken + restart-EAT
Het Applications-systeem doet drie dingen:
- Houdt bij wat hoort te draaien op een host (per app: type, identifier, expected state)
- Vergelijkt elke 60 s de werkelijke state uit de inventory met de verwachte
- Geeft je één knop om met TOTP een restart-EAT te tekenen voor een specifieke app
In het dashboard — een app registreren
Section titled “In het dashboard — een app registreren”- Sidebar → Applicaties (onder ACTIE)
- Knop
+ Track an apprechtsboven - Vul in:
- Agent — welke host hoort deze app te draaien
- Type —
systemd unit/docker container/docker compose service/raw process - Name — vrije naam voor in lijsten (bv. “MyApp web”)
- Identifier — concrete identifier per type:
- systemd: unit-naam (
nginx.service) - docker: container name (
mycontainer) - compose:
<project>::<service>(flowd_dev::app) - process: absoluut pad naar binary (
/opt/myapp/start.sh)
- systemd: unit-naam (
- Documentatie (optioneel maar aangeraden voor MSP-handover):
- Owner email — wie te poken als de app stuk gaat
- Runbook URL — link naar interne docs
- Notes — vrije tekst (deploy-pipeline, dependencies, slack-channel)
- Onder
Discovered on hostzie je de live lijst systemd units + docker containers die de agent net rapporteerde. Klik op een rij om Type + Identifier + Name automatisch in te vullen - Klik op de zwarte
Track this appknop onderaan
Vanaf nu: liveness-worker start binnen 60 s, verwachte state =
running (kan je later wijzigen op de detailpagina van de app).
Wat er hierna gebeurt (per app, elke 60 s)
Section titled “Wat er hierna gebeurt (per app, elke 60 s)”| Fase | Wat |
|---|---|
| 1. observe | Worker leest huidige state uit de LATEST inventory snapshot van de agent |
| 2. compare | expected_state vs observed (running/stopped/unknown) |
| 3. mismatch | Bij verschil: emit app.state_mismatch signal + verhoog consecutive_mismatch counter |
| 4. alert | Na 3 consecutive mismatches: alert met severity warning |
| 5. dashboard | App-row toont rood pixel + last_state_change timestamp |
unknown (worker vindt geen rij voor deze identifier in latest snapshot)
telt niet als mismatch — agent is misschien even down of het is een
nieuwe deployment. Tellt pas mee na vier consecutieve unknowns.
Restart via EAT (Emergency Action Token)
Section titled “Restart via EAT (Emergency Action Token)”Elke app-row heeft een Restart knop. Klik → TOTP-prompt → hub tekent
een Level-2 Ed25519 EAT en pusht via WebSocket naar de agent. Agent
runt monsys-action restart-app <id> als dedicated user (geen permanent
root) en de wrapper kiest:
- systemd:
systemctl restart <unit> - docker:
docker restart <container> - compose:
docker compose -p <project> restart <service> - process: het opgegeven
restart_command(absolute path verplicht)
Resultaat (exit_code + stdout/stderr) wordt teruggepusht en zit in
audit_log + transparency_log als evidence — dezelfde flow als alle
andere EAT-acties op het platform.
Tags + grouping
Section titled “Tags + grouping”Apps erven de tags van hun agent. Een app op een host met tag
production-db verschijnt in alle filters/SLA-engines die op die tag
filteren. Wil je apps per environment groeperen? Tag de host (niet de
app).
Of via API (geavanceerd — voor automatisering)
Section titled “Of via API (geavanceerd — voor automatisering)”# Lijst alle apps voor een tenantcurl https://app.monsys.ai/api/v1/apps \ -H "Authorization: Bearer $TOKEN"
# Registreer een appcurl -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": "Deploys via GitOps · slack #platform · dependency op redis-prod" }'
# Wijzig expected_statecurl -X PATCH https://app.monsys.ai/api/v1/apps/<id> \ -H "Authorization: Bearer $TOKEN" \ -d '{"expected_state": "stopped"}'
# Restart (vereist TOTP-header)curl -X POST https://app.monsys.ai/api/v1/apps/<id>/restart \ -H "Authorization: Bearer $TOKEN" \ -H "X-TOTP-Code: 123456" \ -d '{"reason": "Memory leak per ticket TKT-9001"}'
# Stop met trackencurl -X DELETE https://app.monsys.ai/api/v1/apps/<id> \ -H "Authorization: Bearer $TOKEN"Discovered list is leeg — wat nu
Section titled “Discovered list is leeg — wat nu”- Agent heeft nog geen extended inventory gerapporteerd: nieuwe
agents pushen die elke 6 u (default
inventory_interval_secs). Wacht of trigger handmatig viamonsys-agent --onceop de host - Agent is offline: kijk op
/agents/<id>→last_seen_at. Stale agents reporteren niet - Agent draait een binary ouder dan v0.1.0+20260519: extended inventory shipped sindsdien. Trigger auto-update of upgrade handmatig
- Bug die per 2026-05-20 gefixed is: discovery query miste latest- snapshot scope én tenant guard. Beide nu in de hub. Hard refresh je browser na deze fix
Wat NIET op deze pagina hoort
Section titled “Wat NIET op deze pagina hoort”- Inventory zelf (alle services + packages + ports) → zie Inventaris tab op de agent-detail pagina
- Application-CVE scanning (npm/pip/composer/go deps) → zie Application CVEs
- App-level alerts (cpu/mem/restart-count) → zie Alert builder