Mettre en service le monitoring des postes (VPS, Coolify, Traefik, cron) #16
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/vps-health-api#16
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Mise en service de la chaine. NON AUTOPILOT : SSH Tailscale en auth navigateur,
sudo, UI Coolify et pose d'un crontab — rien de tout cela n'est une PR reversible. A executer manuellement, apres le merge de #13 et #15.Fichiers concernes
test-curl.sh(modifier)la-compagnie-maximus/docs/coolify-ops.md(modifier)la-compagnie-maximus/docs/secret-rotation-ops.md(modifier)Depends on
Criteres d'acceptation
sudo mkdir -p /data/hosts && sudo chown 1000:1000 /data/hostssur le VPS — le conteneur tourne enuid=1000(node)et/dataestroot:root 755; sans ce chown, toute ecriture echoue en EACCES/data/hosts->/data/hostspose dans l'UI Coolify, puis confirme pardocker inspect—-vdanscustom_docker_run_optionsest ignore en silenceHOSTS_INGEST_TOKENetHOSTS_ALLOWED_IDS=thinkpadenis_runtime=true, is_buildtime=false— le buildtime fait fuiter le secret en clair dansapplication_deployment_queues.logslogto-adminsource_id=null, uuidu8000gsg044wsk0oo0w884ok)~/.config/maximus-host-agent.env(chmod 600) et copie figee de l'agent poses sur le ThinkPad, ligne*/5 * * * *ajoutee au crontabGET /hoststest-curl.shetendu aux deux nouvelles routesdocs/coolify-ops.mddocs/secret-rotation-ops.mdnpx vercel --prod) une fois la-compagnie-maximus#149 mergeeReview caveats
/data/hostsest oublie, les fichiers vivent dans la couche du conteneur et disparaissent a chaque deploiement. Symptome trompeur : « les postes se vident tout seuls de temps en temps ». D'ou la verification pardocker inspect.HEALTH_TOKENen clair dansdefenseurs/.envpour le crondefenseur-auto. Sa perte compromet les deux tokens, qui doivent etre tournes ensemble — la separation des tokens ne protege pas ce poste-la.Decisions prises en planification
planned-*: le triage autopilot-safety ecarte les ops VPS (auth navigateur) et les actions non reversibles.Spec source
la-compagnie-maximus/spec-plan-monitoring-postes.md + spec-decisions-monitoring-postes.md (Issue 6)
Etat de la mise en service — 2026-08-18
Sept criteres sur onze sont soit tenus, soit prets a partir. Le reste attend deux gestes manuels et un merge amont.
Fait
HOSTS_INGEST_TOKEN(genere enopenssl rand -hex 32) etHOSTS_ALLOWED_IDS=thinkpad, verifieesis_runtime=true is_buildtime=falsesur les 4 rows (les jumeaux preview compris : ce sont eux qui reintroduisent la fuite le jour ou les preview deploys sont actives). Le champ passe des le POST sous le nomis_buildtime— c'est l'underscore deis_build_timequi est rejete, pas le moment de l'appel.coolify-ops.mdcorrige en consequence.test-curl.shetendu — PR #26, 17 -> 41 cas. Detail dans la PR.la-compagnie-maximus@7e3ee04,docs/coolify-ops.md.docs/secret-rotation-ops.md.~/.local/share/maximus-host-agent/,~/.config/maximus-host-agent.enven 600,--dry-runrend un payload conforme au contrat. Crontab volontairement pas encore pose : le brancher avant que l'API reponde produirait un echec toutes les cinq minutes dans journald pour rien.Verifie au passage
Baseline pre-deploiement, toutes routes de lecture a 200, et
agents-map.jsonbien present cote VPS — la precondition documentee du deploiement (sinon/defenseurs/findingsrepond 500) est levee.GET /hostsrepond 404 en production : la prod est en retard de plusieurs merges, le deploiement ne sera pas un simple ajout de routes.Bloque sur deux gestes manuels
chownde/data/hosts, le fichier Traefik, ledocker inspectet la lecture dejournalctl./data/hosts->/data/hosts, Directory Mount. Aucun endpoint API (verifie : 404 surstorages,persistent-storages,volumes).Bloque en amont
la-compagnie-maximus#149toujours ouverte. Ce critere ne peut pas tomber dans cette passe.Ecart assume par rapport a la spec
Le middleware de limite de debit ne peut pas suivre le patron
logto-admin. Celui-la vit dans/home/ubuntu/logto/docker-compose.yml, une stack compose geree a la main ;vps-health-apiest une app Coolify, dont le compose est regenere a chaque deploiement et dont l'API n'expose aucun champcustom_labels. Retenu apres arbitrage : un fichier dans le repertoire dynamique du proxy, que Coolify ne reecrit pas et que Traefik recharge a chaud.Deux details qui decident du resultat :
PathPrefix('/hosts/')avec la barre finale, sinon le polling du dashboard surGET /hostsse fait etrangler a 12 req/min lui aussi ; et uneprioritysuperieure a celle du routeur genere par Coolify, faute de quoi le middleware n'est jamais applique et le symptome est une absence totale de 429, quel que soit le debit.Ordre du reste, une fois debloque
Chaque etape est une precondition de la suivante — les variables et les labels sont figes a la creation du conteneur, donc tout ce qui atterrit apres le deploiement ne prend effet qu'au suivant, sans erreur nulle part.
chown 1000:1000 /data/hosts— avant le deploiement. Sinon Docker cree le point de montage enroot:root, chaque ingestion repond 500, etGET /hostscontinue de repondre 200 : la panne ne se voit qu'au moment de compter les battements.docker inspect— apres le deploiement, jamais avant : le bind n'existe que sur un conteneur cree apres la pose du storage, inspecter celui d'avant donne un faux negatif. Exigerbind /data/hosts -> /data/hosts rw=true; un volume nomme choisi par erreur satisfait « il y a un montage » tout en rangeant les snapshots hors de portee.ls -ldn /data/hosts: un point de montage cree par Docker peut avoir reintroduitroot:root./hosts— la prod saute plusieurs merges d'un coup.printf | crontab -naif les effacerait.receivedAtqui avance deux fois sur des frontieres de cinq minutes (preuve que ca vient du cron et pas de la main), croise avecjournalctl -t host-agent.Note
Deux constats hors scope, releves en inspectant les variables :
PAYPERQ_API_KEYest enis_buildtime=truesur sa row production, et le jumeau preview deHEALTH_TOKENaussi. C'est exactement la fuite decrite danscoolify-ops.md. Non corriges — hors perimetre de cette issue.