Installation svn et apache sur debian etch

références : http://www.exhaustif.com/Installer-un-serveur-svn-sous.html, http://hikage.developpez.com/linux/tutoriels/subversion/?page=page_2 et http://svnbook.red-bean.com/en/1.1/ch06s04.html (voir exemple 6.3 pour authentification mixée anonyme/user)

Installation SVN, Apache et conf du virtualhost

Comme on va par la suite sûrement placer le serveur svn ouvert sur le port 80 derrière un frontal http ouvert au public sur le port 443, on va avoir besoin, pour DAV, de modifier les en-têtes http à la volée (lui demander de réécrire le contenu commençant par https par quelque chose commençant par http).
références ici du problème :
http://silmor.de/49
http://httpd.apache.org/docs/2.2/mod/mod_headers.html   (exemple 5 et description de "edit" dans Header directive).

Pour ceci, il faudra utiliser le mod headers d'apache. La commande edit de ce mode permet cette réécriture, mais elle n'est opérationnelle qu'à partir de la version 2.2.4 d'apache et debian stable etch ne fournit que le 2.2.3.
On va donc aller puiser dans la version testing :

sudo nano /etc/apt/source.list
deb http://ftp.fr.debian.org/debian/ lenny main   (<= ligne à ajouter)

sudo apt-get update


On installe subversion, apache et le module svn  :
 
sudo apt-get install subversion libapache2-svn
sudo apt-get install -t lenny apache2
sudo a2enmod headers


Si ça ne passe pas, vérifier le /etc/apt/apt.conf  (size does matter) :

Acquire::http::Proxy "http://runcache.univ-reunion.fr:8080/";
APT::Clean-Installed false;
APT::Cache-Limit 16777216;


On crée un répertoire pour les dépôts et on crée un premier dépôt de test

mkdir /home/svn
mkdir /home/svn/repo
svnadmin create /home/svn/repo/test
sudo chown -R www-data:www-data /home/svn


Et on modifie le virtual host par défaut :

sudo vim /etc/apache2/sites-enabled/000-default

<VirtualHost 10.230.1.25:80>
...
RequestHeader edit Destination ^https http early     (<= la ligne magique qui ré-écrit le contenu des en-têtes contenant le terme https en http. Attention, si les paths ne 
                                                         sont pas les mêmes sur le frontal https et sur le serveur svn http, il faut clairement spécifier les réécritures)

<Location /svn>
        DAV svn
        <LimitExcept GET PROPFIND OPTIONS REPORT>
         Require valid-user
        </LimitExcept>
        SVNParentPath /home/svn/repo
        AuthType Basic
        AuthName "Depot du LIM"
        AuthUserFile /home/svn/htpasswd
        AuthzSVNAccessFile /home/svn/access
</Location>
</VirtualHost>


Note : le fait de mettre "<LimitExcept GET PROPFIND OPTIONS REPORT>" et "</LimitExcept>" autour require valid-user autorise la lecture des dépôts sans authentification de façon anonyme (les retirer donc si besoin de tout authentifier).

Et on recharge apache :

sudo /etc/init.d/apache2 reload


Attention : Si vous déployez svn sur un vserver, il ne faut pas oublier que  /tmp tel qu'il est monté dans la fstab (/etc/vservers/VSERVER_X/fstab) n'a par défaut que 16 Mo. Il convient donc d'augmenter cette taille afin qu'Apache puisse uploader de façon concurrente de plus gros volumes. Idem sur le frontal http, si votre svn/apache est proxifié.

Configuration des utilisateurs, des groupes et des droits


Reste à créer les fichiers mentionnés dans notre virtual host.
On crée un administrateur et le fichier qui va contenir les users :

htpasswd -cb /home/svn/htpasswd admin MotDePasseAdmin


Et pour les utilisateurs suivants :

htpasswd -b /home/svn/htpasswd tonton MotDePasseDeTonton


On crée le fichier des autorisations :

vim /home/svn/access

[groups]
admins = admin

[test:/]
@admins = rw

[siteweb:/exhaustif]
tonton = rw

[software:/]
@admins = rw


Attention : vous pouvez mentionner dans ce fichier des dépôts qui n'existent pas encore, mais pas des utilisateurs ou des groupes non définis sous peine d'erreur de svn.

Le dépôt de test est désormais accessible via un navigateur à :
http://monserveur/svn/depot

Ajout de SSL (seulement si le serveur est public, sinon voir précédemment la réécriture des en-têtes)

On ajoute ssl à apache et on recharge :

sudo apt-get install libapache-mod-ssl
sudo a2enmod ssl
sudo /etc/init.d/apache2 force-reload


On ajoute le port d'écoute pour ssl :

sudo vim /etc/apache2/ports.conf
Listen 80
Listen 443


Et on crée une clé et un certificat, le tout en étant root :

cd /etc/ssl/certs/
openssl req -new > svn-lim.univ.run.csr
openssl rsa -in privkey.pem -out svn-lim.univ.run.key
openssl x509 -in svn-lim.univ.run.csr -out svn-lim.univ.run.cert -req -signkey svn-lim.univ.run.key -days 365

On crée un nouveau virtual host :

cd /etc/apache2/sites-available
sudo vim default.ssl
NameVirtualHost 10.230.1.25:443
<VirtualHost 10.230.1.25:443>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/
       <Directory />
               Options FollowSymLinks
               AllowOverride None
       </Directory>
       <Directory /var/www/>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
               # This directive allows us to have apache2's default start page
               # in /apache2-default/, but still have / go to the right place
               RedirectMatch ^/$ /apache2-default/
       </Directory>

       SSLEngine on
       SSLCertificateFile /etc/ssl/certs/svn-lim.univ.run.cert
       SSLCertificateKeyFile /etc/ssl/certs/svn-lim.univ.run.key
       CustomLog /var/log/apache2/ssl-access.log combined
       ErrorLog /var/log/apache2/ssl-error.log

<Location /svn>
       DAV svn
       Require valid-user
       SVNParentPath /home/svn/repo
       AuthType Basic
       AuthName "SVN du LIM"
       AuthUserFile /home/svn/htpasswd
       AuthzSVNAccessFile /home/svn/access
</Location>
</VirtualHost>

On charge ssl et on redémarre apache :

sudo a2ensite default.ssl
/etc/init.d/apache2 restart


ATTENTION : La négociation SSL se fait avant tout le reste. Donc si Apache doit utiliser plusieurs certificats différents, il convient de créer des virtual hosts avec chacun une IP différente. Sinon Apache ne pourra pas choisir le certificat pour crypter le trafic et risque de prendre le premier déclaré.

Voir ici comment ajouter des alias d'IP sur un vserver.

Le dépôt est maintenant accessible via :
https://monserveur/svn/test

Notifications par e-mail


Afin que svn notifie par e-mail, on va ajouter une librairie perl :

sudo apt-get install libsvn-notify-perl


On crée/édite le fichier /home/svn/repo/nomdudépôt/hooks/post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
/usr/bin/svnnotify -r $REV -p $REPOS --smtp smtp.univ-reunion.fr -t assyn@univ-reunion.fr --from projets-lim@univ-reunion.fr --reply-to assyn@univ-reunion.fr

(attention, si on l'utilise pour redmine : un groupe de projet a besoin que l'émetteur appartienne au groupe pour accepter le mail)

Et on change les droits :

chwon www-data:www-data post-commit
chmod u+x post-commit
chmod g+x post-commit

Comments