Skip to content

Industrialiser le déploiement via GitHub Actions (whitelist SSH dynamique o2switch) #288

Description

@ronan-develop

Description

Le déploiement en production est actuellement 100% manuel : bin/deploy.sh --update (ou bin/deploy-all.sh pour toutes les instances) est lancé à la main depuis un poste dev, en SSH vers o2switch. Le webhook GitHub existant (public/deploy.php, déclenché par un webhook repo GitHub sur push) est cassé depuis plusieurs jours (401 "Invalid signature" sur les 87 dernières livraisons observées) et n'est de toute façon plus utilisé — les vrais déploiements passent par les scripts bin/.

Objectif : industrialiser via GitHub Actions plutôt que de dépendre d'une exécution manuelle du script (risque d'oubli d'étape, pas de trace centralisée, dépendant de la présence de quelqu'un pour lancer le script).

Cause

Le blocage principal identifié : o2switch restreint l'accès SSH à une liste d'IP whitelistées (cPanel → Outils → Autorisation SSH). Un runner GitHub-hosted classique (runs-on: ubuntu-latest) change d'IP à chaque exécution et ne peut pas être whitelisté durablement — d'où l'abandon initial de cette piste (absence d'IP fixe côté FAI pour un éventuel runner self-hosted local).

Piste de correction

o2switch expose une micro-API dédiée à ce cas d'usage CI/CD : SshWhitelist (endpoint https://<serveur>:2083/execute/SshWhitelist/), permettant d'ajouter/retirer dynamiquement l'IP éphémère d'un runner avant/après un déploiement (max 5 exceptions simultanées, opération quasi-bloquante ~35s). Workflow envisagé :

  1. Récupérer l'IP publique du runner GitHub-hosted (curl ifconfig.me)
  2. SshWhitelist/add?address=<IP>&port=22
  3. Déploiement via SSH (bin/deploy-all.sh, déjà compatible mode non-interactif via les variables *_PRESET)
  4. SshWhitelist/remove (step if: always(), pour ne jamais laisser une IP éphémère whitelistée en permanence)

Secrets nécessaires en GitHub Encrypted Secrets : clé SSH dédiée au déploiement, credentials pour l'API SshWhitelist.

Blocage en cours : l'authentification recommandée par o2switch pour SshWhitelist est un token API cPanel ("Manage API Tokens"), mais cette page apparaît vide dans le cPanel de l'instance ron2cuba malgré une offre (Unique Cloud) qui y donne théoriquement droit. Ticket ouvert auprès du support o2switch (prioritaire 24/7 N2) — en attente de réponse.

Repli possible si le token reste indisponible : authentification par identifiants cPanel classiques (login/mot de passe cPanel) auprès de l'API SshWhitelist — dépréciée par o2switch mais fonctionnelle, avec un niveau de sécurité moindre (mot de passe cPanel entier en secret GitHub plutôt qu'un token scopé/révocable individuellement).

Critères d'acceptation

  • Réponse du support o2switch obtenue sur la disponibilité de "Manage API Tokens"
  • .github/workflows/deploy.yml créé : whitelist dynamique → déploiement SSH → dé-whitelist, déclenché sur push main (après CI verte) et/ou workflow_dispatch
  • Secrets configurés côté GitHub (clé SSH dédiée + credentials SshWhitelist), jamais committés
  • Le webhook public/deploy.php cassé/inutilisé est soit réparé soit retiré (éviter la confusion entre deux mécanismes de déploiement)
  • Documentation mise à jour (.claude/cicd.md, .claude/deploiement.md) pour refléter le nouveau mécanisme

Zone concernée

CI/CD + Déploiement

Effort estimé

M — dépend de la réponse du support o2switch (token vs repli credentials classiques)

Metadata

Metadata

Assignees

No one assigned

    Labels

    ciCI/CD, déploiement, scriptsfeatureNouvelle fonctionnalité

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions