22 mar
2008
Installer un serveur subversion avec authentification HTTP / HTTPS et Websvn sur Linux
Posté par KissCoolMan | administration, développement, linux, serveur
Dans cet article, nous allons voir comment installer, sous Linux, le gestionnaire de versions bien connu Subversion, et comment le configurer de façon à utiliser une authentification HTTP et/ou HTTPS, de façon à pouvoir se servir de son serveur même derrière un proxy, comme au boulot, ou à l'université.
On verra aussi comment accéder à son repository (abrégé par la suite en repo) en lecture via son navigateur, avec des fonctionnalités très pratiques, comme présenté ici :
Cet article se veut volontairement très simplifié, pour qu'un maximum de personnes puissent s'en servir, et je pense entre autre aux étudiants à qui l'on apprend à se servir d'un VCS, mais qui ne disposent pas encore d'un serveur leur permettant d'exercer leurs compétences.
(note : toutes les commandes suivantes ont été réalisées sur la distribution Linux Debian 4.0 « Etch ». Cependant, la plupart des commandes et fichiers doivent être identiques ou quelque peu adaptés selon les paquets présents pour fonctionner sur une autre distribution)
Pré-requis
Dans ce tutorial, on part du principe que :
- vous possédez un serveur sous Linux; j'entends par serveur une machine tournant en continu, et accessible de là où vous en avez besoin. Si vous êtes en réseau local, n'importe quel PC fera l'affaire (portable, station de travail ...). Si vous désirez que le serveur soit accessible sur Internet, vous avez la possibilité de rediriger le port 80 vers la machine vous servant de serveur, ou bien de prendre un serveur dédié chez un hébergeur (OVH, Dedibox, etc)
- vous avez un serveur Apache (paquet :
Apache2, mais fonctionne aussi avec Apache) installé et fonctionnel, avec php (paquet :php5, fonctionne aussi avec tout php > 4.3.0) - vous savez vous servir de subversion
Installation de Subversion
On va bien sûr avoir besoin du paquet subversion que l'on peut installer grâce à son gestionnaire de paquets. On aura également besoin des paquets subversion-tools et libapache2-svn. Si vous utilisez le système apt (système par défaut sous Debian et Ubuntu par exemple), vous devez donc écrire, dans un shell, en root :
apt-get install subversion subversion-tools libapache2-svn
Il se peut que des librairies supplémentaires vous soient demandées à l'installation, il suffit de répondre Oui (ou Yes) pour qu'elles soient installées automatiquement.
Configuration
Création du répertoire parent
On va commencer par créer le répertoire où l'on déposera nos repos, /var/svn semble être un bon choix par exemple, on fait donc (en root):
mkdir /var/svn
puis on va tout de suite créer un repo pour nos tests grâce à la commande (en root encore)
svnadmin create /var/svn/test1
Pour que l'authentification http soit totale, il faut que Apache soit capable d'écrire dans les repos. Donc on fait :
chgrp -R www-data /var/svn/test1
chmod -R 775 /var/svn/test1
Par la suite, pour automatiser cette tâche, je vous propose d'utiliser un petit script que j'ai fait qui effectue ces 3 étapes à la suite.
wget http://www.betaphile.net/images/17-03-2008-subversion/svncreate
mv svncreate /usr/local/sbin
chmod +x /usr/local/sbin/svncreate
et après ça, chaque fois que vous aurez besoin de créer un repo, en root :
svncreate /var/svn/nomdurepo
Télécharger le script bash svncreate
Configuration dans Apache2
On va maintenant s'occuper de la partie Apache2, et tout d'abord, activer le module dav_svn, avec la commande :
a2enmod dav_svn
Si vous avez une erreur du genre :
This module does not exist!
c'est que vous n'avez pas installé libapache2-svn.
On va créer l'hôte virtuel qui va nous permettre d'accéder aux repos svn, dans le répertoire /etc/apache2/sites-avaible, on va l'appeller svn par exemple; si vous êtes en mode graphique, vous pouvez utiliser gedit ou KWrite par exemple, mais n'importe quel éditeur de texte fera l'affaire, tant que vous savez vous en servir (vi, vim, nano, pico, emacs, mc, vous avez le choix !)
mcedit /etc/apache2/sites-avaible/svn
Et on va placer ceci dedans :
<Location /repos>
DAV svn
SVNParentPath /var/svn
SVNListParentPath on
SVNAutoVersioning On
AuthType Basic
AuthName "Subversion :: repos"
AuthUserFile /var/svn/svn-passwords
AuthzSVNAccessFile /var/svn/svn-acl
Require valid-user
</Location>
On termine en activant ce site, et en redémarrant Apache2 pour prendre en compte les modifications :
a2ensite /etc/apache2/sites-avaible/svn
/etc/init.d/apache2 restart
Utilisateurs, mots de passe, et droits
On va créer deux fichiers distincts, qui vont être communs à l'ensemble des repos. Ces deux fichiers sont :
- svn-passwords : il va contenir l'ensemble de tous les utilisateurs et leur mot de passe. Chaque utilisateur est unique.
- svn-acl : il va contenir les permissions de chaque utilisateur et/ou groupe en fonction des repos.
Et donc, tout naturellement on va créer les fichiers /var/svn/svn-passwords et /var/svn/svn-acl.
Tout d'abord le fichier contenant les mots de passe, que l'on génère grâce à la commande htpasswd. On commence par créer le fichier :
touch /var/svn/svn-passwords
et ensuite, pour chaque utilisateur à rajouter, on fait
htpasswd /var/svn/svn-passwords USER
où vous remplacez USER par le login de l'utilisateur à rajouter. Une séquence type donne donc :
[root@morpheus][/var/svn] htpasswd svn-passwords kisscoolman [19:17]
New password:
Re-type new password:
Adding password for user kisscoolman
Vous pouvez également demander aux utilisateurs de vous fournir leur login et pass d'un coup, il suffit de leur demander d'utiliser la commande
htpasswd -n USER
qui ne va pas enregistrer le résultat dans un fichier, mais l'afficher à l'écran. Ensuite, vous n'avez qu'à copier/coller le résultat dans le fichier, en respectant simplement le fait de ne mettre qu'un utilisateur par ligne.
On va maintenant gérer les groupes, et les droits (ou permissions) sur les repos, dans le fichier /var/svn/svn-acl. Tout d'abord, pour la gestion des groupes, donc on place le titre de section [groups] puis nos groupes, ce qui donne par exemple :
[groups]
group1 = user1, user2, user3
group2 = user1, user5
projet = group1, group2
(les utilisateurs doivent bien sûr être définis dans le fichier svn-passwords)
Ensuite, on va s'intéresser aux permissions pour chaque repo. On marque ça de cette manière :
[NomDuRepo:/path/dans/le/repo]
user2 = r
@group2 = rw
bien évidemment, comme dans les droits Unix, r signifie read, donc droit de lecture, et w signifie write, donc les droits d'écriture. Comme vous pouvez le constater, on indique soit :
user = droitssoit@group = droits
il faut bien noter le @ devant le nom des groupes. Si vous voulez donner un accès à l'ensemble du répo test1 (que l'on a créé au tout début) au user5, en lecture et écriture par exemple, ca donne :
[test1:/]
user5 = rw
Et si vous voulez donner un accès en lecture seule au group1 pour le repertoire /src du répo test2, ca donne
[test2:/src]
@group1 = r
Avant de passer à l'étape suivante, pensez à donner les droits nécessaires à Apache pour lire ces fichiers :
chgrp www-data svn-acl
chgrp www-data svn-passwords
Avant d'aller plus loin, on va tester que tout cela fonctionne. Il suffit de se rendre à l'adresse : http://votredomaine.tld/repos/test1, (si vous êtes en réseau local, il suffit de taper l'IP ou le nom (host) de la machine serveur) et vous devriez obtenir une page comme celle ci, après vous être authentifié :

Si ce n'est pas le cas, vérifiez que vous avez bien effectué toutes les étapes précédentes, que Apache2 est bien lancé (ps aux | grep apache2), que vous l'avez bien redémarré (/etc/init.d/apache2 restart), que les noms des fichiers utilisés dans les fichiers de configuration sont bien les mêmes que les fichiers réels, etc.
Installation de WebSVN
Vous pouvez installer la version disponible actuellement (1.61) dans les dépots, cependant cette version est assez vieille (novembre 2006), c'est pourquoi je vous propose plutôt d'installer la dernière version que l'on va télécharger sur la page Websvn sur le site de Tigris. Rendez-vous dans la section Documents and Files, et téléchargez par exemple la version 2.0 en tar.gz (veuillez vérifier que c'est la dernière version disponible lorsque vous ferez cela).
(vous pouvez vous réferrer à l'article installer des paquets de plusieurs distributions différentes facilement avec apt pour simplifier l'installation de websvn 2.0)
On télécharge donc le fichier grâce à la commande wget, dans le répertoire /root par exemple, puis on le décompresse :
cd /root
wget http://websvn.tigris.org/files/documents/1380/39378/websvn-2.0.tar.gz
tar xzvf websvn-2.0.tar.gz
il ne nous reste plus qu'à le placer à l'endroit voulu, par exemple dans /var/www/websvn, et à chmoder son répertoire cache en 777 (utilisé pour la génération des flux RSS) :
mv websvn-2.0 /var/www/websvn
chmod 777 /var/www/websvn/cache
On va également installer le paquet enscript qui nous sera nécessaire pour la suite.
Configuration de WebSVN
Tout d'abord, on va réouvrir notre fichier /etc/apache2/sites-avaible/svn, et y ajouter l'url à laquelle on veut que websvn apparaisse. Comme on est intelligent, on va réutiliser notre fichier svn-passwords généré précédemment, ce qui nous permet de centraliser les utilisateurs et les droits sur les repos et Websvn. On rajoute donc dans notre fichier :
Alias /websvn /var/www/websvn/
<Directory /var/www/websvn/>
Options FollowSymLinks
AllowOverride None
AuthType Basic
AuthName "Subversion :: Websvn"
AuthUserFile /var/svn/svn-passwords
Require valid-user
</Directory>
(Merci à DeFr pour son aide régulière à la configuration d'Apache)
On va redémarrer Apache2 pour que ces modifications soient prises en compte :
/etc/init.d/apache2 restart
On va maintenant vérifier que ca fonctionne en se rendant avec notre navigateur préféré sur http://votredomaine.tld/websvn, et si on a tout configuré comme il faut, on devrait ... tomber sur une belle erreur de ce genre !
Et oui, maintenant que la partie Apache est terminée, il va falloir penser à installer/configurer Websvn. On commence par renommer le fichier distconfig.php du répertoire include en config.php :
cd /var/www/websvn
mv include/distconfig.php include/config.php
puis on va éditer ce fichier pour activer ou désactiver les options que l'on veut, et renseigner les champs dont on a besoin. Tous les champs que je cite par la suite sont déjà dans le fichier de configuration, il suffit de suivre dans l'ordre, et de décommenter les champs qu'il faut. On commence par renseigner les paths vers les différents exécutables nécessaires à websvn : enscript, sed, tar, etc. Pour rappel, pour trouver le path d'une commande, utiliser which de cette manière :
[kisscoolman@kiwi][/var/www/websvn] which tar
/bin/tar
Ici, on nous demande juste le répertoire dans lequel se trouve chaque exécutable, donc une fois rempli, pour ma part j'obtiens ça (pensez à décommenter les lignes que vous remplissez en enlevant les doubles slash : //) :
$config->setSVNCommandPath('/usr/bin');
$config->setDiffPath('/usr/bin');
$config->setEnscriptPath('/usr/bin');
$config->setSedPath('/bin');
$config->setTarPath('/bin');
$config->setGZipPath('/bin');
Maintenant, on va définir le répertoire parent de nos repos svn, c'est à dire /var/svn pour nous. Donc après les commentaires présents, retrouvez la ligne : $config->parentPath :
$config->parentPath('/var/svn');
On va configurer les droits par répo, en réutilisant notre fichier /var/svn/svn-acl :
$config->useAuthenticationFile('/var/svn/svn-acl');
Viennent ensuite les options un peu moins importantes, et je vous laisse faire votre choix, les commentaires sont assez explicites. Voici mon fichier de configuration final (sans les commentaires initiaux, mais avec les miens) :
<?php // config.php
// path des exécutables
$config->setSVNCommandPath('/usr/bin');
$config->setDiffPath('/usr/bin');
$config->setEnscriptPath('/usr/bin');
$config->setSedPath('/bin');
$config->setTarPath('/bin');
$config->setGZipPath('/bin');
// répertoire parent des repos
$config->parentPath('/var/svn');
// choix du template
$config->setTemplatePath("$locwebsvnreal/templates/calm/");
// fichier donnant les droits par repo et par utilisateur
$config->useAuthenticationFile('/var/svn/svn-acl');
// autoriser le téléchargement entier d'un répo en tarball
$config->allowDownload();
$config->setMinDownloadLevel(1);
// utilisation de enscript pour la coloration syntaxique
$config->useEnscript();
// remplacer les tabulations par 8 espaces
$config->expandTabsBy(8);
?>
Et voilà le résultat ! (disponible sur http://votredomaine.com/websvn)
Pour aller plus loin, vous pouvez déjà lire la documentation de Websvn, il suffit de lire les fichiers disponibles dans websvn/doc/. Ensuite, je vous conseille de visiter le site officiel de websvn.
Utilisation
L'adresse à utiliser pour votre répo est donc : http://votredomaine.tld/repos/votreprojet, et vous pouvez utiliser svn avec n'importe quelle connexion Internet !!! Et si votre serveur Apache est configuré pour fonctionner avec SSL, vous pourrez utiliser l'authentification HTTPS.
ATTENTION : si vous êtes sur des machines sous Linux, et que vous êtes obligé de passer par un proxy, ce n'est pas un soucis. Cependant, vous devez éditer le fichier ~/.subversion/servers pour changer les lignes suivantes (valable si vous utilisez subversion en ligne de commande, ou via un IDE comme Eclipse) :
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
# http-proxy-host = defaultproxy.whatever.com
# http-proxy-port = 7000
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
en
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = URLDeVotreProxy # ex: wwwcacheetu.univ-orleans.fr
http-proxy-port = PortDeVotreProxy # ex: 3128
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
Have fun.





Commentaires
Le samedi 22 mars 2008 à 14:45, Jean a écrit :
Le samedi 22 mars 2008 à 20:59, Jacky672 a écrit :
Le samedi 22 mars 2008 à 21:59, mr. T a écrit :
Le jeudi 17 avril 2008 à 23:35, bastien003 a écrit :
Le vendredi 18 avril 2008 à 12:21, KissCoolMan a répondu :
Le vendredi 18 avril 2008 à 08:54, Mika a écrit :
Le vendredi 18 avril 2008 à 12:23, KissCoolMan a écrit :
Le lundi 28 avril 2008 à 12:09, bastien003 a écrit :
Le jeudi 22 mai 2008 à 19:12, chessman a écrit :
Ajouter un commentaire