Muntant un servidor de Subversion en un Mac OS X

by marti

He muntat un servidor de Subversion a l’ordinador de la feina, i com que al final he fet servir guies i recomanacions de llocs diferents he escrit aquestes notes per a una futura referència i per si a algú li poden ser d’ajut.

L’ordinador en qüestió és un iMac amb el Mac OS 10.6, i l’objectiu és deixar en funcionament un dipòsit (repository) SVN que sigui accessible a través de HTTP i també remotament per SSH. Per a això últim, Subversion facilita molt les coses amb el protocol svn+ssh. Així doncs, els programes que necessitarem són Subversion, Apache, WebSVN i SSH.

1. Apache i SSH

L’Apache ja ve instal·lat i força preparat per defecte. Per engegar-lo n’hi ha prou amb obrir System Preferences, anar a Sharing i habilitar l’opció Web Sharing. Per comprovar que l’Apache està funcionant, obre http://localhost/ des del navegador i hauries de veure una pàgina de prova.

Per a l’SSH, tres quarts del mateix. Aquí mateix (System Preferences, Sharing) cal habilitar l’opció Remote Login. Per comprovar que tot va bé, pots obrir una sessió amb

$ ssh nom_usuari@localhost

2. SVN

Subversion també ve instal·lat per defecte al Mac, a /usr/bin. En el meu cas, però la versió instal·lada no era la última (ara mateix la 1.6.15) sinó la 1.6.5. Pots instal·lar l’última versió amb qualsevol gestor de continguts, per exemple amb Homebrew:

$ brew install svn

La nova versió queda instal·lada a /usr/local/bin. Assegura’t que aquest directori està per davant de /usr/bin en el path, per a estar segur que fas servir la versió nova i no la vella. Pots comprovar la versió executant

$ svn --version

3. Usuaris i grups

Els dipòsits de Subversion hauran de ser accessibles per l’usuari amb el que corre l’Apache, que en el nostre cas és l’usuari www, i per tots els usuaris que vulguin accedir-hi via SSH, per exemple l’usuari marti. Per fer-ho mantenir-ho ordenat, pots crear un grup, svnusers, i afegir tots els usuaris que hagin de poder accedir als dipòsits. Això es pot fer des de System Preferences, Accounts. Necessitaràs permisos d’administrador per a fer-ho. Clica al “+” i selecciona a la llista New selecciona Group i escriu el nom svnusers. Una vegada tens el grup creat, afegeix-hi els usuaris que hagin de tenir accés, per exemple marti. L’usuari www, de l’Apache, està amagat i no es pot afegir directament per aquí, sinó que cal fer-ho per terminal escrivint (canviant usuari_admin per un usuari amb permisos d’aministrador):

$ dseditgroup -o edit -n /Local/Default -u usuari_admin -p -a www -t user svnusers

Per a que els usuaris que accedeixin al dipòsit via SSH no destrueixin els permisos durant la sessió, cal que afegeixis a l’arxiu .bashrc la següent línia:

umask 002

L’arxiu .bashrc està al teu directori d’usuari, per exemple /Users/marti. Pots obrir-lo amb el teu editor preferit, per exemple

$ vim ~/.bashrc

Comprova que el .bashrc s’utilitza: per a això has de tenir també un altre arxiu, anomenat .profile, al teu directori d’usuari amb el següent contingut:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

Recorda sempre afegir la línia umask 002 a cada nou usuari que afegeixis al grup svnusers.

El següent pas és crear un nou usuari, svnadm, que servirà per gestionar els dipòsits SVN. No és estrictament necessari que ho facis, però ajuda a mantenir una certa abstracció a l’hora de la gestió. Per crear-lo, de nou des de System Preferences, Accounts, i afegeix-lo també al grup svnusers. De nou, repeteix el mateix afegint umask 002 al seu .bashrc, que està a /Users/svnadm, i crea també el .profile.

4. Dipòsit SVN

Ja és hora de crear un dipòsit SVN. Jo ho he fet a /Users/Shared/svn/repository:

$ mkdir -p /Users/Shared/svn/repository

Cal canviar el propietari (a svnadm) i el grup (a svnusers) d’aquest directori, i els permisos a només lectura i escriptura per a ells:

$ sudo chown -R svnadm:svnusers /Users/Shared/svn/repository
$ sudo chmod -R u+wrx,g+wrx,o-wxr /Users/Shared/svn/repository

Ara mateix, ja ens podem connectar via svn+ssh a aquest repositori, però això revela tota l’adreça absoluta (/Users/Shared/svn/repository). Podem fer un petit script per a solucionar-ho. Primer cal moure la comanda svnserve original a svnserve.bin. Normalment està a /usr/local/bin.

$ mv /usr/local/bin/svnserve /usr/local/bin/svnserve.bin

Ara copia el següent text al teu editor preferit i guarda l’arxiu com a svnserve allà on era (en el nostre exemple, a /usr/local/bin/svnserve). Canvia /path/to/repository/root per l’adreça del teu dipòsit (per exemple, /Users/Shared/svn/repository):

#!/bin/sh
# wrap in order to put root in by default
# Script implemented by Adrian Robert 

exec /usr/local/bin/svnserve.bin -r /path/to/repository/root "$@"

Potser et caldrà desar-lo em permisos de root, potser no (en la configuració estàndard de Homebrew no cal). Gràcies a aquest script, es podrà accedir via svn+ssh directament a l’adreça del dipòsit, i a més així no es tindrà accés als altres directoris. L’script, però, ha de ser executable:

$ sudo chmod u+wrx,g+rx-w,o+xr-w svnserve

Un problema que pots tenir més endavant és que l’accés via svn+ssh utilitzi el /usr/bin/svnserve enlloc del /usr/local/bin/svnserve, que és l’última versió que has instal·lat. Si et passa això, mou /usr/bin/svnserve a /usr/bin/svnserve.bin i ara tens dues opcions. La primera: com abans, crear un script (amb els permisos necessaris) a /usr/bin/svnserve que et cridi el svnserve que realment vols executar:

#!/bin/sh
# wrap in order to put root in by default
# Script implemented by Adrian Robert

exec /usr/local/bin/svnserve "$@"

La segona: simplement crear un link al teu script:

$ sudo ln -s /usr/local/bin/svnserve /usr/bin/svnserve

5. El primer projecte

Ja és hora de crear el primer projecte. Per a això has creat l’usuari svnadm, així que fes-lo servir per a fer-ho (el nom projecte1 és només un exemple):

$ su svnadm
$ svnadmin create /Users/Shared/svn/repository/projecte1

Abans de començar a fer-lo servir, cal restringir-ne una mica l’accés per a que només els usuaris autentificats via SSH puguin acedir-hi. L’arxiu que gestiona aquest permisos és /Users/Shared/svn/repository/projecte1/conf/svnserve.conf. Obre’l i afegeix-hi això:

[general]
anon-access = none
auth-access = write

Ja podem comprovar que funciona. Entra:

$ svn list svn+ssh://nom_usuari@localhost/projecte1

I t’hauria de demanar la contrassenya de la connexió SSH. El resultat hauria de ser no obtenir res (i retornar a la línia de comandes), perquè el projecte1 encara està buit. Felicitats! Ja tens accés SSH al dipòsit.

6. Integració amb l’Apache

Ara és el torn de l’Apache. Com que ja has posat l’usuari www dins del grup svnusers, tot el que cal fer és dir-li a l’Apache on tens el dipòsit. Els fitxers de configuració de l’Apache en el Mac estan a /private/etc/apache2. Obre aquest arxiu:

$ vim /private/etc/apache2/users/nom_usuari.conf

I afegeix aquestes línies al final:

LoadModule dav_svn_module     libexec/apache2/mod_dav_svn.so
<Location /svn>
 DAV svn
 SVNParentPath /Users/Shared/svn/repository
</Location>

Reinicia l’Apache (per exemple, des de System Preferences, Sharing, desactivant i tornant a activar Web Sharing). Això fa accessible el teu projecte1 des de http://localhost/svn/projecte1. Ja que hi som, un mínim d’autentificació estaria malament. La manera més simple (i poc segura) és demanant usuari i contrassenya per accedir a svn/ i a tots els subdirectoris amb l’autentificació bàsica d’Apache.

La primera vegada que afegeixis un usuari amb accés (que no cal que tingui res a veure amb els usuaris “normals” del teu Mac), entra

$ htpasswd -cm /etc/svn-auth-file nom_usuari

Et demanarà la contrassenya i la guardarà a /etc/svn-auth-file. Per als següents usuaris, has de fer el mateix però sense l’opció -c:

$ htpasswd -m /etc/svn-auth-file nom_usuari2

Ara cal que al mateix /private/etc/apache2/users/nom_usuari.conf
que abans hi afegeixis algunes línies perquè el que havies escrit quedi així:

LoadModule dav_svn_module     libexec/apache2/mod_dav_svn.so
<Location /svn>
  DAV svn
  SVNParentPath /Users/Shared/svn/repository
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-file
  Require valid-user
</Location>

Recorda, però, que així HTTP Basic Auth està enviant les contrassenyes sense encriptar. L’ideal seria muntar-ho tot a través d’HTTPS, però aquesta guia ja és prou llarga ara per ara.

7. WebSVN

L’últim pas és instal·lar WebSVN, que és molt més agradable que l’interfície bàsica. Te’l pots descarregar aquí. Extreu-ne el contingut i copia’l al teu DocumentRoot, que per defecte és a /Library/WebServer/Documents, de manera que ara hi hauries de tenir un directori /Library/WebServer/Documents/websvn. Dins del directori, copia l’arxiu websvn/include/distconfig.php a websvn/include/config.php. Obre l’arxiu config.php i descomenta (elimina els dos //) la línia

// $config->setSVNCommandPath('Path/to/svn/command/');

canviant el text Path/to/svn/command/ per /usr/local/bin/svn. Descomenta també la línia

// $config->parentPath('Path/to/parent (e.g. c:\\svn)');

canviant el text Path/to/parent (e.g. c:\\svn) per /Users/Shared/svn/repository.

Després, obre el fitxer de configuració de l’Apache (/private/etc/apache2/httpd.conf), busca la línia

#LoadModule php5_module        libexec/apache2/libphp5.so

i descomenta-la (treu-li el coixinet #). Torna a reiniciar l’Apache. I ja hauries de tenir el WebSVN en marxa a http://localhost/websvn.

I això és tot! Per a escriure-ho m’he basat en:

About these ads