Ce document décrit une solution simple et très pratique (à mon humble avis) de gestion des fichiers d'un site web avec sauvegarde et mise à jour distante automatiques.
La longueur de cette documentation peut être laisser croire que la solution est compliquée à mettre en place, mais il n'en est rien; j'ai simplement voulu la détailler suffisamment pour permettre aux personnes ne connaissant pas les outils utilisés de la mettre quand même en pratique.
Cette solution utilise une copie locale du site (c'est à dire située sur votre ordinateur) dont la synchronisation avec la version en ligne (chez un hébergeur web) est automatique dès la validation des nouvelles modifications et nécessite uniquement le transfert des fichiers ajoutés ou modifiés, en utilisant un simple accès FTP.
Elle permet, de plus, de consulter ou de revenir simplement à une version antérieure du site, ou simplement de voir les différences avec la version actuelle.
La solution proposée dans ce document se base fortement sur le système de gestion de version Subversion, et n'a rien de vraiment révolutionnaire pour ceux qui connaissent bien ce système.
Elle propose de conserver une copie locale du site web dans un référentiel Subversion, et de mettre en place un script qui sera déclenché à chaque mise à jour de ce référentiel et transférera les fichiers modifiés ou ajoutés à la copie locale du site vers son hébergement en ligne.
Le transfert de ces fichiers est effectué de façon non-interfactive grâce à un client FTP avancé tel que lftp qui pourra se connecter au site en utilisant un signet (qui conserve également le mot de passe du compte FTP, pour permettre le transfert non-interactif) et lira les commandes FTP à effectuer depuis un fichier généré par le script déclenché par la mise à jour du référentiel Subversion.
Elle a été testée sous GNU/Linux, fonctionnera avec peu de modifications, voire aucune, sous les autres systèmes UNIX (*BSD, Solaris), mais elle ne fonctionnera pas telle quelle sur les systèmes Windows (sauf peut-être dans un environnement cygwin, donc réservé à des utilisateurs plus avancés).
Quelques-unes des commandes données ci-dessous sont spécifiques au système d'exploitation (notamment les commandes d'installation de paquets). Celles qui sont données ici sont celles des systèmes GNU/Debian (qui sont généralement identiques pour les systèmes dérivés de cette distribution, comme Ubuntu). Leur adaptation au système que vous utilisez vous est laissé en exercice ;)
On commence par installer le paquet du serveur Subversion :
apt-get install subversion
On fait l'hypothèse que le site web ne sera mis à jour que par une
personne, donc pour simplifier les choses, on va installer le
référentiel dans notre propre répertoire (S'il doit être accessible
à d'autres utilisateurs, vous pouvez le créer dans un autre
répertoire de votre système, comme par exemple
/var/local/lib et adapter ses permissions).
On crée donc un sous-répertoire de notre répertoire personnel, dans
lequel on crée d'autres sous-répertoires pour mieux s'organiser :
mkdir svn cd svn mkdir bin log repos tmp
Ensuite, on crée un répertoire spécifique à notre site (pour permettre de gérer plusieurs sites dans ce même répertoire) et on initialise un nouveau référentiel :
mkdir repos/monsite.org svnadmin create repos/monsite.org
Dans le répertoire bin, on crée le script qui sera lancé après chaque mise à jour du référentiel et qui effectuera les transferts par FTP et on le rend exécutable (si la commande wget utilisée ci-dessous n'est pas disponible ou installée sur votre système, téléchargez le script update_site.sh.txt et placez-le dans le répertoire bin en supprimant l'extension .txt, et sans oublier d'exécuter la commande chmod ci-dessous) :
wget -O bin/update.sh http://www.reivax.org/informatique/doc/update.sh.txt chmod 755 bin/update_site.sh
Pour que ce script soit appelé après chaque opération de validation des modifications (c'est l'opération appelée commit sous SVN), il faut créer un script du nom de post-commit dans le répertoire repos/monsite.org/hook/post-commit (et lui donner les droits d'exécution).
Ce script est appelé par SVN avec pour arguments le répertoire contenant le référentiel et le numéro de révision qui vient d'être validé. N'oubliez pas de modifier dans cette commande (ou dans le script généré), le nom monsite.org par le nom que vous choisirez pour le signet de lftp, et le nom absolu du répertoire dans lequel vous placerez votre copie de travail du référentiel.
cat <<EOD > repos/monsite.org/hook/post-commit #!/bin/sh REPOS="$1" REV="$2" /home/reivax/svn/bin/update_site.sh "monsite.org" "/home/reivax/www/monsite.org" "$REPOS" "$REV" EOD chmod 755 repos/monsite.org/hook/post-commit
Rajoutez un signet à lftp pour votre site. Adaptez évidemment la ligne créée avec les paramètres d'accès en FTP à votre site, tels qu'ils vous ont été donnés par votre hébergeur :
cat "monsite.org ftp://monlogin:monmotdepasse@ftp.monhebergeur.com/htdocs" >> ~/.lftp/bookmarks
Vous pouvez vérifiez que le signet fonctionne bien avec lftp en vous connectant une fois pour voir (ci-dessous, "moi@mamachine:~/svn$ " représente bien sûr l'invite de votre terminal, après laquelle vous devez taper vos commandes) :
moi@mamachine:~/svn$ lftp monsite.org cd ok, cwd=/htdocs lftp monlogin@ftp.monhebergeur.com:/htdocs> quit moi@mamachine:~/svn$
Enfin, il ne vous reste plus qu'à importer les fichiers de votre site dans votre nouveau référentiel, puis de créer la copie de travail que vous utiliserez ensuite comme copie locale de votre site.
Les développeurs de Subversion encouragent à organiser les fichiers des référentiels dans divers répertoires (pour pouvoir gérer des branches de développement), et notamment de placer la branche de développement active sous le répertoire /trunk. C'est ce qu'on va faire lors de la première commande effectuée avec votre client SVN. Attention, si vous choisissez d'utiliser un autre répertoire (ou de mettre vos fichiers directement dans la racine du référentiel), vous devrez modifier la valeur de la variable REPOS_DIR dans le script update_site.sh.
Modifiez bien entendu /home/reivax pour utiliser votre répertoire personnel. L'option -m utilisée ici permet de préciser directement le message de log qui sera associé à la modification enregistrée dans le référentiel. Si vous n'utilisez pas cette option, le client svn vous demandera d'éditer un fichier temporaire dans lequel vous devrez préciser ce message.
moi@mamachine:~/svn$ svn -m "Creation du tronc de developpement" mkdir file:///home/reivax/svn/repos/monsite.org/trunk Révision 1 propagée.
On importe les fichiers de vote site, si vous en avez déjà, en supposant qu'ils sont dans le répertoire ~/monsite. Cette opération peut être relativement longue selon la taille de votre site. Le client svn affichera les fichiers et répertoires qu'il ajoute dans le référentiel au fur et à mesure :
moi@mamachine:~/svn$ cd ~/monsite moi@mamachine:~/svn$ svn -m "Importation initiale" import . file:///home/reivax/svn/repos/monsite.org/trunk Ajout index.html ... Révision 2 propagée.
Il vous reste à créer une copie de travail SVN (ici dans le répertoire www/monsite.org) qui sera la copie locale de votre site que vous pourrez modifier et qui sera synchronisée automatiquement avec le site en ligne (attention, n'utilisez plus votre ancienne copie dans ~/monsite, elle ne sera pas synchronisée!).
Assurrez-vous que le répertoire où vous placez votre copie de travail est bien celui que vous avez indiqué dans le script post-commit, et qui sera celui où update_site.sh ira chercher les fichiers à mettre en ligne.
mkdir -p ~/www/monsite.org cd ~/www/monsite.org svn checkout file:///home/reivax/svn/repos/monsite.org/trunk .
A partir de maintenant, vous devez manipuler les fichiers du répertoire ~/www/monsite.org avec les commandes svn. En pratique, il y en a peu à connaître. La modification d'un fichier ne nécessite pas l'utilisation d'une commande spéciale, mais la création ou la suppression d'un fichier ou d'un répertoire, ou leur suppression doivent être effectuée avec les commandes ci-dessous, de même que le renommage ou le déplacement d'un fichier :
svn add fichier.html svn mkdir monrepertoire svn delete fichier.html svn delete monrepertoire svn move ancienfichier.html nouveaufichier.html svn move fichier.html autrepertoire/fichier.html
Utilisez la commande svn help seule, ou avec le nom d'une commande svn pour avoir plus d'informations sur ces commandes. Vous pouvez aussi consulter le guide d'utilisation de SVN (malheureusement en anglais) pour tout apprendre sur Subversion.
Enfin, lorsque vous êtes satisfaits des modifications de votre site et que vous voulez les valider les enregistrer dans le référentiel et les mettre en ligne, vous devez utiliser la commande commit. Elle propagera dans le référentiel les changements effectués dans votre copie de travail, notamment à l'aide des commandes citées ci-dessus :
svn -m "Modification des pages d'accueil" commit
Dès que l'opération est effectuée dans le référentiel, le script post-commit est appelé et lance le script update_site.sh qui va effectuer le transfert des fichiers modifiés ou ajoutés. Enfin, SVN vous donnera le numéro de la révision ainsi créée.
Pour vérifier que l'opération de transfert s'est bien déroulée, regardez le contenu des fichiers ~/svn/log/monsite.org.log et ~/svn/log/monsite.org.log.err. Ils contiennent respectivement le journal des commandes FTP effectuées et les derrnières erreurs survenues lors de ce transfert, s'il y en a eu.
En cas de problème, vous pouvez commenter la dernière ligne du script update_site.sh qui supprime le fichier contenant les commandes passées par le script à lftp, pour pouvoir le réexécuter. Ce fichier étant daté et donc unique, il ne risque pas d'être réutilisé. Il est simplement effacé pour ne pas prendre trop de place. Comme indiqué ci-dessus, ces commandes sont aussi ajoutées à la fin du fichier ~/svn/log/monsite.org.log, pour permettre de vérifier ce qui a été transféré.
Enfin, si vous ne souhaitez pas que les fichiers soient transférés automatiquement à votre site web en ligne, vous pouvez commenter (c'est à dire mettre un # en début de ligne) l'appel à lftp fait à la fin du script update_site.sh. Vous pourrez ensuite lancer vous-même le transfert en vous rendant dans le répertoire ~/www/monsite.org et en appelant lftp avec le nom du fichier contenant les instructions de transfert : lftp -f ~/svn/tmp/monsite.org-200803010101 (identifié par la date et l'heure de l'opération commit). Ceci peut être pratique pour s'assurer que tout fonctionne correctement au début, ou pour débugger un problème que vous ne comprenez pas.
Les avantages de cette solution sont plutôt intéressants :
Elle a bien sûr aussi des inconvénients qui font qu'elle n'est pas forcément adaptée à tous les utilisateurs et à tout type de sites web :
Cette méthode est en fait l'adaptation d'une solution que j'ai mise au point dans l'environnement professionnel dont j'ai la charge. Elle permet d'autres usages intéressants, particulièrement dans le cadre d'une utilisation multi-utilisateurs.
Même si ce document ne décrit qu'une utilisation par du système de gestion de version que par une personne seule, le lecteur curieux ou déjà expérimenté pourra facilement l'adapter à une utilisation multi-utilisateurs qui permettra de permettre à plusieurs personnes de modifier tout ou une partie du site local, qui sera automatiquement mis à jour en ligne. Mieux, il serait également possible d'envisager de créer dans le référentiel deux copies du site, l'une étant purement locale, modifiable par plusieurs utilisateurs, et permettant de tester le site en local, et l'autre permettant la synchronisation du site local avec celui mis en ligne, par un nombre plus limité de personnes.
Si vous avez des questions ou des remarques sur ce document, vous pouvez me contacter à contact-web@reivax.org