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é :
- Récupérer l'IP publique du runner GitHub-hosted (
curl ifconfig.me)
SshWhitelist/add?address=<IP>&port=22
- Déploiement via SSH (
bin/deploy-all.sh, déjà compatible mode non-interactif via les variables *_PRESET)
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
Zone concernée
CI/CD + Déploiement
Effort estimé
M — dépend de la réponse du support o2switch (token vs repli credentials classiques)
Description
Le déploiement en production est actuellement 100% manuel :
bin/deploy.sh --update(oubin/deploy-all.shpour 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 scriptsbin/.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(endpointhttps://<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é :curl ifconfig.me)SshWhitelist/add?address=<IP>&port=22bin/deploy-all.sh, déjà compatible mode non-interactif via les variables*_PRESET)SshWhitelist/remove(stepif: 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
SshWhitelistest un token API cPanel ("Manage API Tokens"), mais cette page apparaît vide dans le cPanel de l'instanceron2cubamalgré 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
.github/workflows/deploy.ymlcréé : whitelist dynamique → déploiement SSH → dé-whitelist, déclenché sur pushmain(après CI verte) et/ouworkflow_dispatchSshWhitelist), jamais committéspublic/deploy.phpcassé/inutilisé est soit réparé soit retiré (éviter la confusion entre deux mécanismes de déploiement).claude/cicd.md,.claude/deploiement.md) pour refléter le nouveau mécanismeZone concernée
CI/CD + Déploiement
Effort estimé
M — dépend de la réponse du support o2switch (token vs repli credentials classiques)