Synchroniser son site web avec Git avec Scaleway avec cPanel

Suite à la migration récente de mon site funix.org sur Scaleway qui me permet de bénéficier des outils cPanel, j’ai mis en place une synchronisation par Git de mon site. C’est à dire que mon site de référence et de travail est celui en local et le site distant visible sur internet se synchronise sur cette référence.

La connexion Git se fait via une connexion chiffrée avec SSH et la première étape est de générer une nouvelle clé SSH au niveau Sécurité->Accès SSH du menu cPanel :

J’ai récupéré ensuite localement la clé privée que j’ai placée sous ~/.ssh sur le PC local et pour voir si ça fonctionne sur le PC on se connecte à distance en tapant :

ssh -p 22 -i ~/.ssh/id_rsa-scaleway cpXXXXX@funix.org

cpXXXXX correspond à mon login sur Scaleway et funix.org à mon domaine.

Maintenant pour que Git puisse se connecter sans avoir à indiquer de mot de passe, il faudra préalablement sur le PC local générer le couple clé publique/clé privée. Sur la console distante, on tape ssh-agent, voilà le résultat:

SSH_AUTH_SOCK=/tmp/ssh-ZG9o8x9NIriY/agent.2569132;
export SSH_AUTH_SOCK;
SSH_AGENT_PID=2569133;
export SSH_AGENT_PID;
echo Agent pid 2569133;

toujours sur le serveur distant dans le fichier .ssh/authorized_keys on y copiera la clé publique locale. Puis on tape, toujours sur la console distante :

eval $(ssh-agent)
ssh-add id_ecdsa-locale

id_ecdsa-locale étant la clé privée locale. On revient maintenant à cPanel et Fichiers->Git Version Control. On va créer un dépôt (il faudra décocher Clone a repository) :

On indique un nom de répertoire pour le dépôt qui ne sera pas forcément celui qui contient le site. Après avoir cliqué sur Créer, cPanel nous donne ces indications :

Dans la pratique mon site se trouve localement sous /ultra/data/homepage/www.funix.org, sur le PC local j’ai initialisé le dépôt Git de référence.

cd /ultra/data/homepage/www.funix.org
git init
git add .
git commit -m "Initial commit site statique"

Pour lier le dépôt distant au dépôt Git local, je tape localement la commande :

git remote add origin ssh://cpXXXXX@funix.org/home/cpXXXXX/repositories
git branch -M main
git push -u origin main

La dernière commande est un peu plus verbeuse et donne

Enter passphrase for key '/home/olivier/.ssh/id_ecdsa-locale':
X11 forwarding request failed on channel 0
Énumération des objets: 2710, fait.
Décompte des objets: 100% (2710/2710), fait.
Compression par delta en utilisant jusqu'à 4 fils d'exécution
Compression des objets: 100% (2680/2680), fait.
Écriture des objets: 100% (2710/2710), 166.51 Mio | 9.46 Mio/s, fait.
Total 2710 (delta 99), réutilisés 0 (delta 0), réutilisés du paquet 0 (depuis 0)
remote: Resolving deltas: 100% (99/99), done.
To ssh://funix.org/home/cpXXXXX/repositories
* [new branch] main -> main
la branche 'main' est paramétrée pour suivre 'origin/main'.

Maintenant on va créer une clé de déploiement qui automatisera chaque mise à jour. C’est le fichier .cpanel.yml qui contiendra :

---
deployment:
tasks:
- export DEPLOYPATH=/home/cpXXXXX/public_html
- export TEMPPATH=/home/cpXXXXX/deploy_tmp
# 1. Préparation du dossier temporaire (copie sélective du dépôt)
- /bin/rm -rf $TEMPPATH
- /bin/mkdir -p $TEMPPATH
- /bin/cp -R [^.]* $TEMPPATH
# 2. Synchronisation intelligente vers la production
# -u (update) : ne copie que si le fichier source est plus récent
# -v (verbose) : utile pour voir quels fichiers ont bougé dans les logs cPanel
- /bin/cp -ru $TEMPPATH/* $DEPLOYPATH/
# 3. NETTOYAGE : Supprimer les fichiers dans DEPLOYPATH qui n'existent pas dans TEMPPATH
# On parcourt les fichiers dans la destination, si absent de la source -> suppression
- find $DEPLOYPATH -type f ! -name ".*" | while read file; do rel=$(echo "$file" | sed "s|^$DEPLOYPATH/||"); if [ ! -f "$TEMPPATH/$rel" ]; then rm -f "$file"; fi; done
# 4. NETTOYAGE : Supprimer les dossiers vides orphelins
- find $DEPLOYPATH -type d -empty ! -path "$DEPLOYPATH" -delete
# 5. Nettoyage final du temporaire
- /bin/rm -rf $TEMPPATH

Le chemin de déploiement est /home/cpXXXXX/public_html, c’est là qu’on retrouve les fichiers du site sur le serveur distant. L’enchaînement de commandes permet en l’absence de la commande rsync de synchroniser le dépôt avec un répertoire temporaire, puis on fait une copie des fichiers modifiés dans le répertoire de déploiement. La commande find permet de supprimer les fichiers du site qui ne sont plus dans le dépôt. C’est une configuration bien adaptée pour un site statique comme le mien. On place ce fichier à la racine du site à distance sur /home/cpXXXXX/public_html

On revient au cPanel et Git Version Control, au niveau de Checked-Out Branch, il faudra indiquer main, voilà le résultat :

Dans l’onglet Pull or Deploy, cela donnera suite à la bonne prise en compte du fichier de déploiement :

La mise à jour au quotidien du site se fera donc en modifiant les fichiers localement puis en tapant toujours localement :

git add .
git commit -m "Mise à jour contenu"
git push


Pour être totalement complet on pourra créer au niveau du dépôt local de référence le fichier .gitignore pour ignorer certains fichiers, le mien contient :

*.old
*.bak
*.swap
*~

On trouvera le fichier de log du déploiement sous /home/cpXXXX/.cpanel/logs.

Quelques sources utiles qui ont pu m’aider à mettre en place cette configuration :

Laisser un commentaire