ci(diag): probe the runner cache server from a job container — do not merge (#234) #374
No reviewers
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/Simpl-Resultat#374
Loading…
Reference in a new issue
No description provided.
Delete branch "diag/234-cache-probe"
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?
Refs #234
PR de diagnostic, à ne jamais merger. Elle ajoute un workflow jetable (
.forgejo/workflows/diag-cache-probe.yml) qui ne se déclenche que sur sa propre PR.Pourquoi
Depuis #232, plus aucun workflow n'appelle le cache Actions. Le dernier symptôme observé date du 2026-07-21 (run 326 :
getCacheEntryetreserveCacheenRequest timeout), et rien ne dit s'il est toujours là. Cette sonde le vérifie depuis l'intérieur d'un conteneur de job, sans accès au VPS.Ce que fait le job
ACTIONS_CACHE_URL), l'adresse IPv4 de la forge, les adresses du conteneur et sa passerelle. Le chemin de l'URL est masqué : il peut porter un jeton propre au run, et les journaux de ce dépôt sont publics.172.17.0.1sur le port du cache.actions/cache: sauvegarde d'un fichier minuscule sous une clé unique, suppression de la copie locale, restauration avecfail-on-cache-miss, comparaison du contenu.Le job est vert seulement si le fichier revient du serveur de cache.
Lecture des sondes TCP
OPENREFUSEDTIMEOUTComparer l'adresse annoncée aux ports 22 et 443 du même hôte sépare deux cas : un filtrage du seul port du cache, ou un hôte injoignable dans son ensemble depuis le conteneur.
check-frontendtournera aussi sur cette PR, le nouveau fichier n'étant pas dans sa liste d'exclusion. Ce run est sans rapport avec la sonde.Vérifié avant le push
Le script de sonde a tourné en local contre des cibles maîtrisées : port ouvert, port fermé, adresse de documentation muette (
192.0.2.1), URL absente, adresse IPv6. Le chemin de l'URL n'apparaît jamais dans la sortie.🤖 Generated with Claude Code
Résultat — run 455 (2026-10-03)
Le symptôme de juillet est toujours là, et la sonde le localise : l'adresse du cache est joignable, mais son port est filtré sur l'hôte.
Le runner (
linux-builder, v12.7.0, déjà la version du run 326 de juillet) annonce le cache surhttp://54.39.97.77:41511/…. C'est l'IPv4 publique du VPS, la même que la forge. Le conteneur du job est en10.0.4.2, avec la passerelle10.0.4.1.54.39.97.77:41511(cache annoncé)TIMEOUT(10 s)54.39.97.77:22(sshd, même IP)OPEN(9 ms)54.39.97.77:443(Traefik)OPEN(6 ms)10.0.4.1:41511(passerelle du job, port du cache)TIMEOUT10.0.4.1:22(passerelle du job, sshd)OPEN(7 ms)172.17.0.1:41511(docker0, port du cache)TIMEOUTAller-retour
actions/cache:reserveCache failed: Request timeoutà la sauvegarde, puisgetCacheEntry failed: Request timeoutà la restauration, 20 s chacun. Ce sont les messages exacts de juillet.Lecture
cache.hostsur une IP joignable ») ne suffirait pas : l'IP est joignable, c'est le port qui est filtré.À lire sur l'hôte (lecture seule)
Si le bloc
cache:laisse ses ports à0, le runner en tire un au hasard à chaque démarrage, et aucune règle de pare-feu ne peut le viser.Correctif probable
OPENsur le port du cache, puisROUND TRIP OK.Notes
shell: bashenbash --noprofile --norc -e -o pipefail. Corrigé dans68aef2a.263a97ad) apparaît en clair dans les avertissements d'actions/cache, malgré le masquage de la sonde. Il change d'un run à l'autre (8f50bf31au run 326) et ce run est terminé.Correctif appliqué : run 457 vert
Cause confirmée sur l'hôte (lecture du 2026-10-03) :
172.16.0.0/12. Or Docker (daemon.json, réglé par Coolify) alloue ses réseaux dans10.0.0.0/8: les conteneurs de jobs ne correspondaient à aucune règle.cache.proxy_portvalait0, donc un port tiré au hasard à chaque démarrage, qu'aucune règle ne pouvait viser.Correctif : config produite par
forgejo-runner generate-configavecproxy_port: 28100, fichier complémentaire systemd qui passe--config, règle ufwallow proto tcp from 10.0.0.0/8 to any port 28100, redémarrage du runner. Le détail et le retour arrière sont dans la section « Cache Actions :Request timeout» dela-compagnie-maximus/docs/forgejo-ops.md.Run 457 :
OPENsur l'IP publique comme sur la passerelle du job ;Cache savedpuisCache restored: l'aller-retour prend environ 1 s, contre 20 s d'attente par appel avant ;172.17.0.1reste sans réponse, sans incidence : ce n'est pas l'adresse qu'annonce le runner.Les ports du proxy et du serveur interne restent fermés depuis Internet (vérifié de l'extérieur).
La sonde a rempli son rôle : je ferme cette PR sans la merger et je supprime sa branche. Reste pour #234 : remettre
Swatinem/rust-cacheet le cache npm (la suite reportée de #232). Le deuxième run de cette PR-là prouvera la restauration d'un run à l'autre.Pull request closed