reivax.org petit site perso

Site web versionné

Gestion des fichiers d'un site web

La solution décrite sur cette page date maintenant de plusieurs années, et des solutions bien plus intéressantes sont aujourd'hui possibles. Cette page est conservée uniquement pour information.

Ce document décrit une solution assez pratique 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.

Sommaire

Généralités

Principes

Idée générale

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.

Plus de détails

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.

Outils utilisés

  • Subversion (aussi appelé SVN) : c'est le système de gestion de versions qui permet de sauvegarder et récupérer toutes les modifications que vous faites sur vos fichiers. La solution décrite dans ce document s'appuie principalement sur les fonctionnalités de ce système, aussi devrez-vous en apprendre les principes (résumés plus bas dans cette page) pour l'utiliser.

  • lftp : c'est un client FTP avancé proposant un système de signets, et qui est capable de lire les commandes FTP à effectuer dans un fichier.

  • un serveur HTTPD, comme par exemple le célèbre apache facultatif) : si vous souhaitez disposer sur votre ordinateur d'une copie exacte de votre site web en ligne pour pouvoir tester vos mises à jour avant de les valider, vous devrez probablement mettre en place un serveur HTTPD. Si votre site est composé de simples fichiers HTML, ou que vous n'avez pas besoin de tester vos modifications avant de les mettre en ligne, vous pourrez vous passer de serveur web.

Portabilité

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).

Mise en œuvre

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 ;)

Installation de SVN et création du référentiel

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

Mise en place du script de hook

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

Configuration de lftp

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$

Importation des fichiers du site dans le référentiel 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 .

Utilisation courante

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](http://svnbook.red-bean.com/ "consulter le SVN book" (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.

Vérifier le bon fonctionnement

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.

Avantages et inconvénients

Les avantages de cette solution sont plutôt intéressants :

  • mise à jour distante automatique : la synchronisation automatique des fichiers du site local avec les fichiers en ligne, même lorsqu'on ne dispose que d'un accès FTP et donc que l'utilisation d'outils de synchronisation spécialisés comme rsync est impossible,
  • mises à jour rapides : seuls les fichiers modifiés ou ajoutés au site local sont transférés sur votre espace web en ligne, sans avoir à télécharger les fichiers déjà en ligne pour les comparer, et évitant aussi de retransférer tous les fichiers à chaque fois,
  • sauvegardes automatiques: chaque version du site mise en ligne est conservée localement, avec possibilité de consulter ou de récupérer facilement un des fichiers du site (ou le site dans son ensemble) tel qu'il était dans une version antérieure.
  • ouvertures vers d'autres possibilités : l'utilisation d'un gestionnaire de version permet d'imaginer bien d'autres possibilités en ce qui concerne la politique de mise à jour du site. Voir à ce sujet le paragraphe sur les adaptations possibles plus bas dans ce document.

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 :

  • elle nécessite d'apprendre à utiliser les commandes (ou un client graphique) SVN pour manipuler les fichiers de la copie locale du site,
  • le mot de passe FTP du site doit être stocké en clair dans un fichier de votre répertoire (lftp le conserve malheureusement en clair dans $HOME/.lftp/bookmarks),
  • si les fichiers de votre site sont bien sauvegardés à chaque mise en ligne, ce n'est pas le cas des bases de données que votre site peut utiliser. Ce n'est de toutes façons généralement pas souhaitable, étant donné qu'une base de données est en constante utilisation et que sa sauvegarde n'obéit donc pas aux mêmes règles que celle des fichiers du site, mais il fallait le mentionner.

Adaptations possibles

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