Installer un serveur subversion avec authentification HTTP / HTTPS et Websvn sur Linux - Betaphile.net : Amoureux des versions Beta...

Betaphile.net : Amoureux des versions Beta...

Linux, Développement, Administration, Logiciels Libres ...

Aller au contenu - Aller au menu - Aller à la recherche



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 :

Liste des projets dans WebSVN (miniature) Liste des fichiers d'un projet dans WebSVN (miniature) Aperçu d'un fichier dans WebSVN (miniature)

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 = droits soit @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é :

Revision 0

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 !

Erreur dans WebSVN (miniature)

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)

Liste des projets dans WebSVN (miniature)

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.

Trackbacks

Aucun trackback pour le moment.

Les trackbacks pour ce billet sont fermés.

Commentaires

Le samedi 22 mars 2008 à 14:45, Jean a écrit :

Un truc sympa aussi c'est USVN

http://www.usvn.info

Le samedi 22 mars 2008 à 20:59, Jacky672 a écrit :

Excellent tuto, justement ce dont j'avais besoin, merci beaucoup!

Le samedi 22 mars 2008 à 21:59, mr. T a écrit :

Très très bon tutorial, comme tous les autres du site d'ailleurs.

Longue vie à betaphile :)

Le jeudi 17 avril 2008 à 23:35, bastien003 a écrit :

Salut,

Excellent tuto, il m'a servi pour mettre l'authentification, dommage de ne pas l'avoir trouvé avant.

Sinon j'ai une question, quelles sont les nouveautés de la version 2.0 de WebSVN, à part un design pas mal vu les photos ?

Le vendredi 18 avril 2008 à 12:21, KissCoolMan a répondu :

Pour ma part, j'avais quelques soucis d'encodage, impossible à résoudre, même en changeant la configuration du serveur (la locale), l'encodage des pages dans Apache2, et l'encodage dans la configuration de Websvn. De ce fait, les commentaires des commits n'apparaissaient pas correctement ...

Il y a surement beaucoup d'autres améliorations qui ont été faites, mais voilà pourquoi je suis passé à Websvn 2.0

Le vendredi 18 avril 2008 à 08:54, Mika a écrit :

Excellent tuto, mise en oeuvre extremement rapide et claire. Actuellement en production de mon coté. Felicitations :)

Mik@

Le vendredi 18 avril 2008 à 12:23, KissCoolMan a écrit :

Merci à tous pour vos commentaires encourageants, je vais bientôt écrire de nouveaux tutoriels :).

Le lundi 28 avril 2008 à 12:09, bastien003 a écrit :

Merci de ta réponse KissCoolMan, effectivement j'avais eu le même problème d'encodage que toi, alors par la suite tous mes commentaires étaient sans accents.

Je viens de passer a la version 2 pour recommencé a mettre des accents mais aussi pour la gestion des groupes que l'on ne pouvait pas faire avec les précédentes version.

Merci encore pour ce super tuto.

Le jeudi 22 mai 2008 à 19:12, chessman a écrit :

Bonjour, très bon tutoriel.

Par contre je galère depuis 3 heures pour arriver à configurer mon vhost si quelqu'un peut partager le sien ?

Ajouter un commentaire