Repository navigation
Git Webhooks and Releases
Deux façons complémentaires de réagir à un événement Git dans
ServerSupervisor : le suivi de releases interroge périodiquement une
API de dépôt ou de registre Docker (modèle pull), tandis qu'un webhook
Git est appelé directement par votre plateforme Git à chaque push/tag
(modèle push, temps réel). Les deux peuvent, optionnellement, déclencher
la même chose côté agent : une tâche custom
déclarée dans tasks.yaml.
Dashboard → Git / Automatisation → onglet Suivi de releases.
| Champ | Valeur |
|---|---|
| Nom | Libre |
| Provider |
github (défaut) / gitlab / gitea
|
| Dépôt |
owner + repo (deux champs séparés) |
| Déclencher une tâche lors d'une mise à jour | Décoché = surveillance seule, enregistre juste la nouvelle version détectée. Coché = exécute une tâche tasks.yaml sur l'hôte choisi |
| Cooldown (heures) |
0–168, délai avant de redéclencher après détection |
Jetons d'authentification — limite actuelle : une seule variable
GITHUB_TOKENexiste côté serveur, réutilisée telle quelle commeAuthorization: Bearer(GitHub) ouPRIVATE-TOKEN(GitLab). Il n'y a pas deGITLAB_TOKEN/GITEA_TOKENdédié, et les clients GitLab/Gitea sont codés en dur surgitlab.com/gitea.io— un dépôt sur une instance GitLab ou Gitea auto-hébergée n'est actuellement pas supporté par le suivi de releases. SansGITHUB_TOKEN, GitHub reste utilisable en anonyme (rate limit public, 60 req/h).
| Champ | Valeur |
|---|---|
| Image Docker | Requis (ex : linuxserver/sonarr) |
| Tag surveillé | Défaut latest
|
| Déclencher une tâche lors d'une mise à jour | Idem — décoché = surveillance seule |
| Mode |
Compose (natif) ou Tâche (tasks.yaml)
|
Mode Compose — pull + up -d directement dispatchés à l'agent, sans
script à écrire :
| Champ | Rôle |
|---|---|
| Hôte cible + Projet compose | Requis (contrainte en base : les deux ou aucun) |
| Service | Optionnel — vide = tout le projet |
| Healthcheck (s) |
0–3600
|
| Rollback si échec / unhealthy | Revert automatique si le healthcheck échoue |
| Nettoyer les images orphelines |
docker image prune ciblé après mise à jour |
| Pré/post-update task | Deux hooks tasks.yaml optionnels autour du déploiement |
| Réconcilier automatiquement en cas de dérive | Voir §1.3 |
| Identifiants de registre | Sélection d'un RegistryCredential sauvegardé, pour un registre privé |
Mode Tâche — comme un tracker Git avec dispatch : exécute une tâche
tasks.yaml de votre choix sur l'hôte cible.
Import groupé : POST /api/v1/release-trackers/bulk accepte jusqu'à
100 trackers Docker en un seul appel (utilisé par l'UI "détecter les
conteneurs suivables" — chaque entrée est validée indépendamment, le
résultat liste succès/erreurs par item).
Si reconcile_drift est activé, le poller ne se limite pas à "y a-t-il une
nouvelle image en amont ?" — quand le digest du registre est inchangé mais
que le digest réellement déployé (rapporté par l'agent) ne correspond
plus à ce que le tracker a enregistré (modification manuelle, échec
silencieux, rollback externe…), il redispatche le même compose_pull +
up -d pour ramener le déploiement en conformité. Désactivé par défaut ;
sans ce flag, une dérive est seulement signalée en lecture (DriftDetected,
recalculé à chaque affichage, jamais stocké).
Un seul intervalle global pilote tous les trackers, Git comme Docker :
GITHUB_POLL_INTERVAL (défaut 15m). Il n'y a pas de fréquence par
tracker — utilisez Vérifier maintenant sur un tracker pour forcer un
check immédiat sans attendre le cycle.
Cases à cocher smtp / ntfy / browser, plus une option "Notifier à
chaque mise à jour détectée" (grisée tant qu'aucun canal n'est coché).
Dashboard → Git / Automatisation → onglet Webhooks.
| Champ | Valeur |
|---|---|
| Nom | Libre |
| Provider |
github / gitlab / gitea / forgejo / custom
|
| Événement |
push (défaut) / tag (couvre aussi create/tag_push) / release
|
| Filtre repo | Glob optionnel (ex : myorg/*) |
| Filtre branche | Glob optionnel (ex : main) |
Tâche (tasks.yaml) |
Requis — l'id de la tâche à exécuter côté agent |
| Notifications | En cas de succès / échec, canaux smtp/ntfy/browser
|
| Activer ce webhook | Switch |
La page détail d'un webhook affiche :
-
URL à coller côté GitHub/GitLab/Gitea/Forgejo :
<origine du dashboard>/api/v1/webhooks/git/<id>/receive, avec bouton copier. - Secret masqué (bouton révéler + copier). Généré par 32 octets aléatoires (hex) à la création.
- Un bloc d'aide spécifique au provider : GitLab attend le secret dans un header
X-Gitlab-Token, les autres providers attendentContent-Type: application/jsonet le secret collé dans le champ "Secret" du webhook côté plateforme (signature HMAC, voir ci-dessous).
Régénérer le secret invalide l'ancien immédiatement — pensez à mettre à jour la configuration côté plateforme Git dans la foulée, ou le prochain push échouera la vérification de signature.
| Provider | Mécanisme |
|---|---|
| GitLab | Header X-Gitlab-Token, comparé directement (temps constant) au secret — pas de HMAC, GitLab envoie le token brut |
| GitHub / Gitea / Forgejo / Custom |
X-Hub-Signature-256 (ou X-Gitea-Signature / X-Forgejo-Signature) au format sha256=<hex>, HMAC-SHA256 du corps brut avec le secret |
Disponibles dans la commande/le script tasks.yaml déclenché :
| Variable | Contenu |
|---|---|
SS_REPO_NAME |
Dépôt (owner/repo) |
SS_BRANCH |
Branche poussée |
SS_COMMIT_SHA |
SHA du dernier commit |
SS_COMMIT_MESSAGE |
Message du commit |
SS_PUSHER |
Auteur du push |
SS_WEBHOOK_NAME |
Nom du webhook ServerSupervisor |
SS_EVENT_TYPE |
Événement normalisé (push/tag/release) |
À la réception, dans l'ordre : vérification de signature → filtre
événement (ignoré seulement si non vide et différent de push) → filtre
repo (glob) → filtre branche (glob) → garde anti-doublon (si une exécution
est déjà pending/running pour ce webhook, la nouvelle requête est
ignorée) → dispatch de la tâche.
- Endpoint public, sans JWT — seule protection : la signature/le token
ci-dessus, plus un rate limiter dédié 5 req/s (burst 10) par IP source
(respecte
TRUSTED_PROXIESpour résoudre l'IP réelle derrière un reverse proxy). - Taille max du payload accepté : 5 Mo. Le payload brut est conservé (tronqué à 64 Ko) pour debug via le bouton Voir le payload reçu sur chaque exécution.
- Pas de liste blanche d'IP — ni pour ce endpoint, ni ailleurs dans l'app.
Commun aux deux features (WebhookExecutionList.vue, paginé 20/page) :
-
Trackers : date, release (tag + nom, lien vers la release), hôte,
statut, un badge cliquable ⚠ N quand N incidents d'alerte se sont
déclenchés sur l'hôte cible dans les 15 minutes suivant le déploiement
(renvoie vers
/alertes→ onglet Incidents), et l'accès aux logs de la commande. - Webhooks : date, repo + branche, commit (SHA court + message tronqué), statut, logs, et le bouton Voir le payload reçu si disponible.
| Symptôme | Cause probable |
|---|---|
| Tracker GitHub bloqué en erreur de rate limit |
GITHUB_TOKEN non configuré (60 req/h en anonyme, partagé par tous les trackers GitHub) |
| Tracker GitLab/Gitea sur une instance self-hosted ne trouve jamais de release | Non supporté actuellement — les clients sont codés en dur sur gitlab.com/gitea.io (voir §1.1) |
| Tracker Docker en mode Compose échoue silencieusement | Vérifiez Hôte cible/Projet compose (les deux sont requis ensemble) et que le projet compose existe bien sur l'agent visé |
| Webhook reçu par la plateforme Git mais rien ne se passe côté ServerSupervisor | Vérifiez le filtre événement/repo/branche (glob), ou qu'une exécution n'est pas déjà pending/running pour ce webhook (garde anti-doublon) |
| Webhook renvoie une erreur de signature | Secret désynchronisé après un Régénérer, ou header de signature absent/mal formé côté plateforme (voir §2.3 pour le header attendu par provider) |
| Payload volumineux tronqué dans "Voir le payload reçu" | Normal — seuls les 64 premiers Ko du payload sont conservés, même si jusqu'à 5 Mo sont acceptés en entrée |
reconcile_drift ne redéploie jamais malgré une dérive visible |
Le flag doit être explicitement activé sur le tracker — par défaut la dérive est seulement affichée, jamais corrigée automatiquement |
Voir aussi les sections Runbooks & Tâches planifiées pour l'autre mécanisme de dispatch de commandes, et la section Git Webhooks & Suivi de releases du README pour le tableau complet des routes API.
Intégrations
Automatisation
Sauvegardes
Alertes & Monitoring
Compte & Sécurité
Hôtes
Interface