Déploiement Automatique via Webhook (GitHub & Infomaniak)
Ce guide explique comment automatiser la mise à jour d'un site web à chaque "Push" sur GitHub, particulièrement sur un hébergement type Infomaniak.
1. Préparation du serveur (Console Infomaniak)
Par défaut, les fonctions PHP permettant d'exécuter des commandes système (exec, shell_exec, etc.) sont souvent désactivées.
- Connectez-vous à votre Manager Infomaniak.
- Allez dans Hébergement Web > Votre Site.
- Cliquez sur le bouton Gérer les paramètres avancés.
- Dans l'onglet PHP | Apache, activez l'option permettant de débrider les fonctions PHP exécutives (ce réglage autorise d'un coup
exec,shell_exec, etc.).
2. Configuration de l'accès SSH (GitHub)
Comme le dépôt est privé, le serveur doit être autorisé à "lire" le code.
- Connectez-vous en SSH à votre serveur Infomaniak.
- Générez une clé SSH (si vous n'en avez pas déjà une à la racine) :
ssh-keygen -t ed25519 -C "votre-email@domaine.com" - Affichez la clé publique :
cat ~/.ssh/id_ed25519.pub. - Sur GitHub, allez dans Settings > SSH and GPG keys.
- Cliquez sur New SSH Key, donnez-lui un titre (ex: "Mon Serveur Web"), laissez le type sur Authentication Key et collez le contenu.
3. Installation initiale via SSH
Pour que le Webhook fonctionne, le dossier doit déjà être un dépôt Git initialisé.
- Connectez-vous en SSH à votre serveur.
- Naviguez vers le dossier de votre site :
cd ~/sites/mon-projet/ - Clonez votre dépôt en utilisant l'adresse SSH. L'ajout du
.à la fin permet de cloner directement dans le dossier actuel :git clone git@github.com:utilisateur/depot.git .
4. Le Script Webhook (PHP)
Créez un fichier nommé webhook.php à l'endroit accessible par votre URL (à la racine ou dans un dossier public).
Ce script vide les logs à chaque démarrage pour ne garder que la trace du dernier déploiement.
<?php
/**
* SCRIPT DE MISE À JOUR AUTOMATIQUE (WEBHOOK)
* Version sécurisée avec vérification de signature SHA256.
*/
// 1. CONFIGURATION
$secret = "VOTRE_SECRET_GitHub"; // Le même que celui saisi dans GitHub
// Définition du chemin vers la racine du projet (là où se trouve le dossier .git)
// Si le script est à la racine : __DIR__
// Si le script est dans un sous-dossier (ex: /public) : dirname(__DIR__)
$projectRoot = __DIR__;
// Fichier où seront écrits les résultats
$logFile = $projectRoot . '/webhook.log';
// Sécurité : Vérification du token
// GitHub envoie une signature SHA256 du contenu dans les headers
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
$payload = file_get_contents('php://input');
$hash = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (empty($signature) || !hash_equals($hash, $signature)) {
http_response_code(403);
die("Signature invalide.");
}
// Fonction pour écrire proprement dans le log
function log_cmd($msg, $append = true) {
global $logFile;
$date = date('Y-m-d H:i:s');
// Si $append est faux, on écrase le fichier (nouveau déploiement)
file_put_contents($logFile, "[" . date('Y-m-d H:i:s') . "] " . $msg . PHP_EOL, $append ? FILE_APPEND : 0);
}
log_cmd("--- DÉMARRAGE DU DÉPLOIEMENT ---", false);
// Liste des commandes à exécuter sur le serveur
$commands = [
'git pull origin main', // Récupère le code
'composer install --no-dev --optimize-autoloader' // Met à jour les dépendances (optionnel)
];
foreach ($commands as $cmd) {
$output = [];
// On se déplace dans la racine et on exécute
exec("cd $projectRoot && $cmd 2>&1", $output);
log_cmd("EXEC: $cmd | RESULT: " . implode(" ", $output));
}
echo "Mise à jour terminée.";
4. Configuration sur GitHub
- Allez dans les Settings (Paramètres) de votre dépôt GitHub.
- Menu Webhooks > Add webhook.
- Payload URL :
https://votre-domaine.com/webhook.php - Content type :
application/json. - Secret : Saisissez votre
VOTRE_SECRET_GitHubici. - Cliquez sur Add webhook. GitHub enverra maintenant une signature cryptée à chaque Push.