3.d. Installation et configuration de SubVersion

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille


^ Sommaire ^

3.c. Apache2 / PHP5 ‹

› 3.e. Tomcat



Dans le cadre de la configuration de mon HTPC, je voulais qu'il soit orienté autant multimédia que serveur de développement.
Pour cette raison, je comptais y installer SubVersion (connu également sous le nom SVN).

Voici la configuration que j'ai adoptée, ou plutôt son installation pas-à-pas.



1. installation des modules nécessaires

Apache étant déjà installé et configuré (ici) je passerai cette étape. Je noterai simplement que j'ai créé un certificat pour pouvoir utiliser SVN en mode sécurisé.

Je passe tout de suite à l'installation de SVN.

sudo apt-get install subversion libapache2-svn subversion-tools



2. préparation de subversion

La racine svn sera située sur un disque dur séparé, monté dans /mnt/dev.
Je vais d'abord créer la racine et y affecter les droits nécessaires

# déplacement dans le répertoire de travail
cd /mnt/dev
# création de la racine svn
sudo mkdir svn
# affectation des droits à l'utilisateur apache (www-data)
sudo chown www-data:www-data svn

Il faut ensuite créer un ou plusieurs dépôts. J'en crée deux, pour les besoins des tests d'authentification

# déplacement dans le répertoire de travail
cd /svn
# création des dépôts
sudo svnadmin create private
sudo svnadmin create public



3. configuration de subversion

J'ai maintenant 2 choix pour la configuration. Soit je dois modifier le fichier /etc/apache2/mods-available/dav_svn.conf pour y intégrer ma configuration, soit je vais créer un nouveau virtualHost spécialisé pour le SVN, en utilisant un sous-domaine de titouille.ch, comme expliqué dans le tutorial précédant, installation d'apache.
J'opte pour cette seconde solution qui me semble plus propre que la première.

sudo nano /etc/apache2/sites-available/svn.titouille.ch

J'y place la configuration suivante :

<VirtualHost 192.168.1.20:443>
 
	DocumentRoot		/mnt/dev/svn
	ServerName		svn.titouille.ch
 
	# LoadModule dav_module		/usr/lib/apache2/modules/mod_dav.so
	# LoadModule dav_svn_module	/usr/lib/apache2/modules/mod_dav_svn.so
	LoadModule ssl_module		/usr/lib/apache2/modules/mod_ssl.so
 
	SSLEngine		On
	SSLCertificateFile	/etc/apache2/ssl/apache.pem
 
	<Location /svn>
 
		Order deny,allow
		deny from all
		Options -Indexes
 
		Satisfy Any
 
		DAV			svn
		SVNParentPath		/mnt/dev/svn
 
		AuthType		Basic
		AuthName		"Titouille Subversion repository"
		AuthUserFile		/etc/apache2/dav_svn.passwd
 
		AuthzSVNAccessFile	/etc/apache2/auth-files/private-svn-authzfile
 
		Require			valid-user
	</Location>
 
	ErrorLog	/var/log/apache2/error.log
	LogLevel	warn
	CustomLog	/var/log/apache2/access.log combined
 
</VirtualHost>

Quelques explications :

Tout d'abord, je fait pointer l'hôte virtuel sur le port 443, qui est le port sécurisé via https. Je définis ensuite la racine du répertoire contenant les dépôts via la directive DocumentRoot, ainsi que le nom du serveur (qui pointe vers l'url que je désire pour y accéder)

Je charge les modules nécessaires (mod_dav, mod_dav_svn et mod_ssl). les 2 premiers sont chargés par défaut dans apache, je les mets donc en commentaire pour éviter les alertes lors du chargement d'apache.

J'active ensuite le mode SSL et je pointe sur le fichier de certificat que j'ai généré lors de l'installation d'apache.

La suite se passe dans la balise Location :
Comme vous pouvez le voir, le chemin de la location est /svn, pour cibler le répertoire racine décidé. J'avais au départ mis / et tout fonctionnait correctement sur mon mac, mais pas sur mon pc. C'est en modifiant cette directive que ça a fonctionné.
J'utilise SVNParentPath en lieu et place de SVNPath pour spécifier que /mnt/dev/svn est le répertoire parent de tous mes dépôts.
Enfin, j'utilise deux fichiers pour l'authentification : AuthUserFile va contenir les paires "nom d'utilisateur/mot de passe", tandis que AuthzSVNAccessFile va contenir les droits des utilisateurs et groupes associés à subversion.



4. Création du fichier des utilisateurs / mots de passe

On peut créer ce fichier via la commande htpasswd. L'option -c va créer un nouveau fichier. Je vais pour ma part créer deux utilisateurs, encore une fois pour tester les autorisations par la suite :

sudo htpasswd -cm /etc/apache2/dav_svn.passwd titouille
sudo htpasswd -m /etc/apache2/dav_svn.passwd testuser

Enfin, j'attribue à ce fichier les autorisations apache :

sudo chown www-data:www-data /etc/apache2/dav_svn.passwd



5. Création du fichier des utilisateurs / groupes

Si je désire pouvoir donner des accès restreints à mes différents dépôts, il est maintenant temps de créer le fichier private-svn-authzfile spécifié dans l'option AuthzSVNAccessFile :

# tout d'abord, création du répertoire de stockage
sudo mkdir /etc/apache2/auth-files
# ensuite, édition du fichier 
sudo nano /etc/apache2/auth-files/private-svn-authzfile

Voici le contenu du fichier :

[groups]
owner=titouille
sabugo-developers=titouille
test=testuser
[/]
@owner=rw
[private:/]
@sabugo-developers=rw
@test=
[public:/]
@sabugo-developers=rw
@test=rw

Quelques explications : la section [groups] permet de créer les groupes d'utilisateurs et d'y affecter des utilisateurs (déclarés dans /etc/apache2/dav_svn.passwd)

Les autres sections définissent les accès à chaque dépôt

Dans mon cas, j'ai créé 3 groupes : owner, sabugo-developers et test. l'utilisateur "titouille" appartient aux groupes "owner" et "sabugo-developers" tandis que l'utilisateur "testuser" appartient au groupe "test" uniquement

La racine (section [/]) est accessible en lecture / écriture (rw) au groupe owner uniquement, c'est à dire à l'utilisateur "titouille".
Le dépôt "private" (section [private:/]) est accessible en lecture / écriture (rw) au groupe sabugo-developers uniquement
Le dépôt "public" (section [public:/] est accessible en lecture / écriture (rw) aux groupes "sabugo-developers" et "test".

Au final, l'utilisateur "titouille" a accès à tout, alors que l'utilisateur "test" n'a accès qu'au dépôt "public".

Il est nécessaire de donner les droits apache à ce fichier et relancer apache pour terminer la configuration :

sudo chown www-data:www-data /etc/apache2/auth-files/private-svn-authzfile
sudo /etc/init.d/apache2 restart



6. Tests

Je peux maintenant tester si ma configuration fonctionne correctement. En allant sur l'url https://svn.titouille.ch, le navigateur m'affiche l'alerte concernant mon certificat personnalisé. Puis il m'affiche une page d'erreur. Je vais rajouter un fichier index.html dans /mnt/dev/svn pour que le serveur n'affiche pas d'erreur mais plutôt un message d'accueil et la liste des dépôts. Si je vais sur https://svn.titouille.ch/svn, le navigateur me demande alors un login et un mot de passe : titouille / ****** et je suis connecté. Je ne peux par contre naviguer dans le répertoire svn lui-même, je ne sais pas exactement pourquoi... Il faudrait que je mette une règle qui redirige https://svn.titouille.ch/svn sur https://svn.titouille.ch pour éviter des problèmes.
Je peux par contre tenter de naviguer à l'url https://svn.titouille.ch/svn/private ou https://svn.titouille.ch/svn/public et je peux voir les racines des dépôts.
Je ferme maintenant mon navigateur puis je le relance, me reconnecte à https://svn.titouille.ch/svn avec testuser / ******. L'authentification est passée, mais je ne peux toujours pas voir le contenu de /svn. Si je navigue sur https://svn.titouille.ch/svn/public, j'ai accès et je peux voir l'arborescence du dépôt. Si je navigue sur https://svn.titouille.ch/svn/private, cette fois je suis rejeté.

Après moultes tests, j'ai trouvé certaines solutions.
Tout d'abord, j'ai pu remarquer qu'avec cette configuration et mon virtualHosts, je pouvais naviguer sur https://svn.titouille.ch/public (ou private) et je vois la véritable arborescence du répertoire de dépôts (/conf, /db, etc...).
Il a été nécessaire de faire certaines modifications pour éviter ce problèmes.
Tout d'abord, j'ai créé un répertoire "/ressources" dans mon www. J'y ai ensuite ajouté les répertoires "/css", "/images" et "/errors". J'ai rajouté un fichier css dans /css, mon logo dans le répertoire /images et j'ai créé plusieurs fichiers dans le répertoire /errors. Un pour chaque erreur à intercepter.
Comme je voulais que ces éléments agissent de manière globale, j'ai directement modifié mon fichier de configuration apache :

Alias /css/ /chemin/absolu/vers/ressources/css/
Alias /images/ /chemin/absolu/vers/ressources/images/
Alias /errors/ /chemin/absolu/vers/ressources/errors/
 
ErrorDocument 403 /errors/forbidden.html

Ces quelques directives permettent de déclarer en global des alias pour des chemins sur le disque. Je peux maintenant intégrer /css/ma-css.css pour récupérer une css qui est située dans le répertoire /chemin/absolu/ver/ressources/css/. Plutôt pratique.

Après avec fait des tests avec l'url https://svn.titouille.ch/svn (qui m'affichait automatiquement une erreur d'accès, j'ai pu constater que ma page personnalisée s'affichait correctement à la place du message d'erreur apache.
J'ai modifié le virtualHost /etc/apache2/sites-available/svn.titouille.ch pour y rajouter ces directives :

<Location /public>
Order deny,allow
deny from all
Options -Indexes
</Location>
 
<Location /private>
Order deny,allow
deny from all
Options -Indexes
</location>

Et l'accès aux véritables répertoires public / private est maintenant bloqué avec une jolie page d'erreur personnalisée.
Dans ce cas précis, je pourrais tout à fait faire en sorte de rediriger (via javascript par exemple) l'utilisateur vers la page d'accueil du svn. Il faudrai que je surdéfinisse la directive ErrorDocument par défaut de my-apache.conf à l'intérieur même de mon virtualHost pour avoir une page personnalisée non pas au niveau serveur (les erreurs affichent le message global partout), mais au niveau virtualHost (chaque virtualHost peut avoir ses propres pages d'erreur personnalisées).

Tout fonctionne comme je le désirais, avec authentification en prime et accès sécurisé par SSL.

Dès maintenant, lorsque je veux me connecter sur un des dépôts, je peux passer par l'url https://svn.titouille.ch/svn/[dépot] et y récupérer ou y déposer des projets.

Un projet sera à l'adresse https://svn.titouille.ch/svn/[dépôt]/[projet]

Jusqu'ici tout va bien ou presque, un SVN fonctionnel !

Ajout :

Après avoir fait un peu joujou avec SVN, je me suis retrouvé dans une situation où il a fallu que je supprime certains projets, et la doc officielle n'en parle pas beaucoup.

J'ai un projet "monProjet" sur le svn "private" que j'aimerai supprimer. Pour ce faire, j'utilise la commande suivante : 

svn delete -m "supression du projet monProjet" https://192.168.1.20/svn/private/monProjet

Le système me demande d'abord le mot de passe du serveur, puis les login / mot de passe de l'utilisateur SVN.

sources qui m'ont permis de mettre en place subversion de manière correcte :
Running Subversion on Debian Sarge or Etch and Apache 2
Subversion - documentation officielle ubuntu
How to setup a Ubuntu development server - Part 1
Supprimer un projet dans dépôt subversion



^ Sommaire ^

3.c. Apache2 / PHP5 ‹

› 3.e. Tomcat