Instalación de un servidor de subversion 2 por Juanda Rodríguez


Publicado el mar 05 diciembre 2017 por Juanda Rodríguez
Categoría: tutoriales

Etiquetas: subversion tutorial http control versiones


Hace algún tiempo publiqué un tutorial sobre como instalar un completo servidor de subversion.

En aquel tutorial se decía que:

A un repositorio de subversion se puede acceder de 3 formas:

  1. Directamente a través del sistema de ficheros de la misma máquina. No adecuada para trabajar en equipo.
  2. Usando el demonio svnserve que usa un protocolo propio de subversion.
  3. Usando WebDAV con apache que es una extensión de HTTP que permite usar un servidor web como servidor de ficheros.

Y mostramos la 3ª manera que, a nuestro juicio, es la más completa.

En este tutorial mostraremos la 2ª manera y una variación más completa que usa ssh.

La instalación que describimos es para realizarla en un servidor con GNU Linux Ubuntu 16.04. Utilizaremos systemd como system manager para el inicio automático del servidor, así que los que digamos aquí será portable a cualquier systema que utilice systemd.

Comenzamos instalando subversion, que en cualquier distribución de GNU Linux se encuentraa como paquete instalable.

apt-get install subversion

Ahora creamos el usuario svn y lo añadimos al grupo subversion.

addgroup subversion
adduser svn subversion

Para arrancar el servidor de subversion basta con hacer:

svnserver -d -r /var/lib/svn

y ya podemos acceder desde cualquier cliente de subversion. Atención, por lo pronto no pide ningún tipo de autenticación.

Ahora vamos a ver como integrar svnserver como unidad de systemd, de manera que se arranque automáticamente cuando se arranque el servidor y se pueda gestionar su arranque, parada y estado con el comando systemctl, como cualquier otro servicio.

Primero creamos el archivo de configuración para systemd en /etc/systemd/system/svnserve.service

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
RuntimeDirectory=svnserve
PIDFile=/run/svnserve/svnserve.pid
EnvironmentFile=/etc/default/svnserve
ExecStart=/usr/bin/svnserve $DAEMON_ARGS
User=svn
Group=subversion
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=svnserve.service

Después definimos las opciones de inicio en /etc/default/svnserve:

DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root /var/lib/svn --log-file /var/log/svnserve/svnserve.log"

Y por último configuramos las opciones de rotación de logs en /etc/logrotate.d/svnserve:

/var/log/svnserve/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
    create 640 svn adm
    sharedscripts
    postrotate
            if /bin/systemctl status svnserve > /dev/null ; then \
                /bin/systemctl restart svnserve > /dev/null; \
            fi;
    endscript
}

Y listo, ya podemos arrancar el servicio desde systemctl

systemctl start svnserver

Si queremos que se arranque al inicio:

systemctl enable svnserver

Accediendo a través de tunel ssh

Para esto no es necesario ejecutar el demonio svnserver, simplemente hay que tener bien configurado y ejecutando sshd, entonces, para acceder al repositorio basta que el usuario tenga acceso al servidor a través de ssh (por password o certificado, da igual):

svn co svn+ssh://juanda@curso-svn.juandarodriguez.es/var/lib/svn/mapbundle

Lo que es importante entender en esta manera de acceder al repositorio de subversion, es que el cliente no se conecta a un demonio svnserve que se esté ejecutando en el servidor remoto. El método se basa en la habilidad de ssh de ejecutar en la máquina remota un proceso temporal svnserve, el cual termina cuando la conexión se cierra.

Con este método de acceso es el servidor ssh el que pregunta las credenciales de autenticación, no el cliente svn.

Podemos refinar un poco más y hacer que la url sea la misma que cuando se accede a través del demonio svnserve sin ssh, es decir, quitar la parte que hace referencia a la raíz del directorio: /var/lib/svn. Para ello creamos en el servidor un script que sustituirá a svnserve:

Creamos en algún lugar del servidor (por ejemplo en /root/svnwrapper.sh) el script siguiente:

#!/bin/sh

# set the umask so files are group-writable
umask 002

# call the 'real' svnserve, also passing in the default repo location
exec /usr/bin/svnserve "$@" -r /var/lib/svn

Y lo enlazamos en usr/local/bin

chmod +x svnwrapper.sh
cd /usr/local/bin
ln -s /var/svn/svnwrapper.sh svnserve

Y ya se puede usar la url de siempre:

svn co svn+ssh://juanda@curso-svn.juandarodriguez.es/mapbundle

Posiblemente sea esta la manera más sencilla a la par que segura, de acceder a un repositorio de subversion.