Servidor SVN en CentOS: instalación y configuración

Introducción a SVN
SVN (Subversion) es un sistema de control de versiones centralizado creado por desarrolladores del ecosistema Apache. Permite crear y mantener un repositorio central con control granular de acceso por usuario y por ruta. Es útil para gestionar versiones de código, documentos o conjuntos de archivos en equipos y proyectos de software.
Definición rápida: Subversion es un VCS centralizado que almacena históricos de cambios y controla acceso mediante autenticación y autorización.
Nota preliminar
En este tutorial se utiliza CentOS 6.4 de 32 bits como sistema base. Los pasos son aplicables con pequeñas adaptaciones a otras versiones de CentOS/RHEL y distribuciones similares. Los ejemplos de comandos se han probado en un entorno de laboratorio; ajuste rutas y IPs a su infraestructura.
Importante: los comandos que requieren privilegios de administrador se muestran como ejecutados desde la cuenta root (prompt [root@…]).
1. Instalación de paquetes (httpd, subversion, mod_dav_svn)
Para un servidor SVN con acceso vía HTTP/HTTPS usaremos Apache (httpd) y el módulo mod_dav_svn más el paquete subversion.
Puedes usar otros servidores web (nginx, lighttpd) con soluciones alternativas, pero este tutorial sigue la integración estándar con Apache.
Comprobar IP del servidor (ejemplo):
ifconfig
Salida de ejemplo (omitida explicación por brevedad):
[root@SVNSVR641 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:61:E4:88
inet addr:192.168.43.101 Bcast:192.168.43.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe61:e488/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4640 errors:0 dropped:0 overruns:0 frame:0
TX packets:6845 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:444461 (434.0 KiB) TX bytes:549473 (536.5 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2125 errors:0 dropped:0 overruns:0 frame:0
TX packets:2125 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:186888 (182.5 KiB) TX bytes:186888 (182.5 KiB)
Instalación de Apache (httpd):
yum install -y httpd
Salida de ejemplo abreviada (instalando paquete httpd):
[root@SVNSVR641 ~]# yum install -y httpd
Loaded plugins: refresh-packagekit, security
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package httpd.i686 0:2.2.15-26.0.1.el6 will be installed
--> Finished Dependency Resolution
...
Installed:
httpd.i686 0:2.2.15-26.0.1.el6
Complete!
Instalación de Subversion:
yum install -y subversion
Instalación del módulo DAV para Subversion:
yum install -y mod_dav_svn
Al finalizar tendrás httpd, subversion y mod_dav_svn disponibles en el sistema.
2. Creación y configuración del repositorio SVN
Buenas prácticas: mantener repositorios fuera de directorios del sistema (por ejemplo /var/www). En este tutorial usaremos /data/svn.
Crear directorio base para repositorios:
mkdir -p /data/svn
Crear el primer repositorio llamado repo1 y asignar propiedad a apache (usuario que ejecuta httpd):
svnadmin create /data/svn/repo1
chown -R apache:apache /data/svn/repo1
Verás que el repositorio contiene varios ficheros y carpetas por defecto:
cd /data/svn/repo1
ls
Salida:
[root@SVNSVR641 repo1]# ls
conf db format hooks locks README.txt
Archivos de configuración claves
En el directorio conf están: svnserve.conf, passwd y authz. Editaremos estos para controlar autenticación y autorización.
cd /data/svn/repo1/conf
ls
Salida:
[root@SVNSVR641 conf]# ls
authz passwd svnserve.conf
Editar svnserve.conf para políticas básicas (si usas svnserve):
vi svnserve.conf
Contenido mínimo (ejemplo):
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
Nota: aunque usaremos Apache/mod_dav_svn, mantener svnserve.conf coherente ayuda si montas servicios alternativos.
Crear usuarios (archivo passwd)
Se utiliza htpasswd para añadir usuarios al fichero passwd del repositorio. Ejemplo:
htpasswd -c /data/svn/repo1/conf/passwd jay
Salida interactiva (introduce contraseña):
[root@SVNSVR641 conf]# htpasswd -c /data/svn/repo1/conf/passwd jay
New password:
Re-type new password:
Adding password for user jay
Contenido del fichero passwd (cifrado):
[root@SVNSVR641 conf]# cat passwd
jay:14hCNCmBZY/qA
Agregar dos usuarios más:
htpasswd /data/svn/repo1/conf/passwd fikri
htpasswd /data/svn/repo1/conf/passwd farid
Después:
[root@SVNSVR641 conf]# cat passwd
jay:14hCNCmBZY/qA
fikri:/hlooqJMfYLkw
farid:P7Zvu6B3HyFGo
Control de accesos por ruta (archivo authz)
Editar authz para asignar permisos específicos a cada usuario en el repositorio repo1:
vi authz
Ejemplo de contenido:
[repo1:/]
farid = r
fikri = rw
* =
Explicación:
- farid tiene solo lectura (r).
- fikri tiene lectura y escritura (rw).
- jay y cualquier otro usuario (*) no tiene permisos.
3. Integración con Apache (httpd)
Editar /etc/httpd/conf/httpd.conf y asegurar que se incluye la carpeta conf.d si no está ya:
Include conf.d/*.conf
Ir a /etc/httpd/conf.d/ y editar (o crear) subversion.conf para exponer el repositorio vía URL (por ejemplo http://IP/repo1):
cd /etc/httpd/conf.d
vi subversion.conf
Contenido de ejemplo (mantener exactamente los módulos apropiados cargados):
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNPath /data/svn/repo1
Authtype Basic
AuthName "My Repository"
AuthzSVNAccessFile /data/svn/repo1/conf/authz
AuthUserFile /data/svn/repo1/conf/passwd
Require valid-user
Notas:
- SVNPath apunta a la ruta física del repositorio.
- AuthUserFile y AuthzSVNAccessFile señalan los ficheros passwd y authz creados.
- AuthName aparece en el diálogo de autenticación del navegador/cliente.
Reiniciar Apache para aplicar cambios:
service httpd restart
Salida de ejemplo:
[root@SVNSVR641 conf.d]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
4. Pruebas desde clientes: Linux y Windows
Cliente Linux (CentOS)
Instalar subversion en el equipo cliente:
yum install -y subversion
Comprobar checkout del repositorio:
mkdir repo_client
svn co http://192.168.43.101/repo1 repo_client
Se solicitará usuario y contraseña. Ejemplo con usuario fikri (rw):
Authentication realm: My Repository
Password for 'fikri':
Alerta del cliente:
ATTENTION! Your password for authentication realm:
My Repository
can only be stored to disk unencrypted! ...
Store password unencrypted (yes/no)? yes
(Es recomendable configurar almacenamiento seguro de credenciales localmente.)
Si el checkout se completa verá:
Checked out revision 0.
[root@TEST01 ~]# cd repo_client/
[root@TEST01 repo_client]# ls -a
. .. .svn
Probar crear y commitear una carpeta (con usuario que tenga rw):
cd repo_client
svn mkdir first_dir
svn commit -m "My first folder"
Salida esperada:
Committed revision 1.
Cliente Windows con TortoiseSVN
Abrir en un navegador la URL del repositorio: http://192.168.43.101/repo1
Si se intenta con el usuario jay (sin permisos), el navegador mostrará acceso prohibido:
Instalar TortoiseSVN (u otro cliente SVN) en Windows. Crear una carpeta local (por ejemplo testSVN), hacer clic derecho y elegir SVN Checkout.
Introducir la URL y aceptar. Se pedirá autenticación:
Si el usuario tiene permisos de lectura, el checkout finalizará correctamente:
Verás la carpeta creada por otro usuario (first_dir) en tu copia local:
Probar puertas de escritura con usuario solo lectura (farid):
- Crear carpeta dentro de FIRST_DIR (SECOND_DIR).
- Elegir Add en el menú de TortoiseSVN:
- Confirmar selección:
- Se añadirá localmente:
- Intentar Commit (SVN Commit):
- Confirmar commit con comentario:
- Al autenticarse como farid (solo r) se recibirá un error de acceso denegado:
Resultado: la autorización definida en authz funciona correctamente.
Buenas prácticas y seguridad
- Mantén los repositorios fuera de rutas públicas del sistema (usa /data/svn o similar).
- Restringe permisos de sistema (ownership) únicamente a usuarios necesarios (por ejemplo apache para integración con httpd).
- Usa HTTPS en producción: configura mod_ssl y añade certificados, evita exponer credenciales en texto plano.
- No uses el almacenamiento de contraseñas sin cifrar en clientes; configura Gnome Keyring, libsecret o claves seguras según plataforma.
- Haz backups regulares con svnadmin dump y cron para automatizar:
- Ejemplo de volcado: svnadmin dump /data/svn/repo1 > /backups/repo1-$(date +%F).dump
Seguridad adicional:
- Limita acceso a /data/svn vía ACLs de sistema.
- Monitoriza logs de Apache (/var/log/httpd/) para detectar intentos de acceso no autorizados.
- Considera integrar autenticación con LDAP/AD para gestión centralizada de usuarios (mod_authnz_ldap).
Solución de problemas comunes
- Error 403 (Forbidden) en navegador: revisar authz, AuthUserFile y permisos del fichero passwd.
- Error de permiso al escribir: verificar que mod_dav_svn corre como el usuario correcto y que el repositorio pertenece a dicho usuario (chown -R apache:apache /data/svn/repo1).
- Contraseñas no guardadas en el cliente: configurar almacenamiento seguro de credenciales en ~/.subversion/servers o usar gestores de credenciales del sistema.
- Conflictos al commitear: usar svn update antes de svn commit y resolver conflictos manualmente.
Comandos útiles de diagnóstico:
# Ver estado de Apache
service httpd status
# Revisar versiones instaladas
httpd -v
svn --version
rpm -qa | grep mod_dav_svn
# Probar acceso vía curl (puede pedir auth)
curl -v http://192.168.43.101/repo1/
Mini-metodología: checklist de puesta en marcha rápida
- Elegir servidor y IP estática.
- Instalar httpd, subversion y mod_dav_svn.
- Crear /data/svn y svnadmin create repo1.
- chown -R apache:apache /data/svn/repo1.
- Crear passwd y authz con htpasswd y editar permisos.
- Configurar /etc/httpd/conf.d/subversion.conf con SVNPath y ficheros de auth.
- service httpd restart.
- Probar checkout desde cliente y validar permisos (rw/r/none).
- Configurar backups y HTTPS.
Lista de verificación por roles
Administrador del servidor:
- Crear y asegurar directorios (/data/svn).
- Configurar Apache y reiniciar servicio.
- Automatizar backups.
Administrador de repositorio (team lead):
- Definir política de ramas/etiquetas/trunk.
- Crear estructura inicial (trunk, branches, tags).
- Mantener fichero authz.
Desarrollador:
- Configurar cliente (TortoiseSVN, subversion CLI).
- Aprender flujos: checkout, update, commit, merge, revert.
Criterios de aceptación
- El repositorio responde en http(s) y solicita credenciales.
- Usuarios con permiso rw pueden crear y commitear cambios.
- Usuarios con permiso r solo pueden descargar y listar.
- Usuarios sin entrada en passwd/devueltos por authz reciben acceso denegado.
Fact box — cifras y rutas clave
- Distribución de ejemplo: CentOS 6.4 (32 bits).
- Paquetes: httpd, subversion, mod_dav_svn.
- Rutas en este tutorial: /data/svn/repo1, /etc/httpd/conf.d/subversion.conf.
- Puerto por defecto: 80 (HTTP), 443 (HTTPS si activado).
Alternativas y cuándo usarlas
- SVN vía svnserve: útil para conexiones TCP nativas (puerto 3690), más ligera que Apache.
- Git: si quieres DVCS (distribuido) y flujos modernos de ramas; SVN recomendado si necesitas control centralizado o migración desde proyectos existentes.
Migración y compatibilidad
- Para migrar repositorios antiguos, usar svnadmin dump/load.
- Al actualizar SO/paquetes, prueba en entorno staging y convierta rutas relativas a absolutas si cambian versiones de mod_dav_svn.
Ejemplo rápido de backup y restauración
Backup:
svnadmin dump /data/svn/repo1 > /backups/repo1-$(date +%F).dump
Restauración a nuevo repositorio:
svnadmin create /data/svn/repo1-restored
svnadmin load /data/svn/repo1-restored < /backups/repo1-2023-01-01.dump
chown -R apache:apache /data/svn/repo1-restored
Árbol de decisión (simplificado) para elegir despliegue
flowchart TD
A[¿Necesita HTTP/HTTPS?] -->|Sí| B[Usar Apache + mod_dav_svn]
A -->|No| C[¿Conexiones ligeras TCP?]
C -->|Sí| D[Usar svnserve]
C -->|No| E[Evaluar otras opciones o Git]
Pruebas recomendadas (aceptación)
- Checkout completo desde cliente Linux y Windows.
- Crear, añadir y commitear archivo con usuario rw.
- Intentar commitear como usuario r y validar error de permiso.
- Restaurar backup en servidor alternativo y comprobar integridad.
Resumen final
Has aprendido a instalar y configurar un servidor SVN integrado con Apache en CentOS, crear repositorios, gestionar usuarios y permisos mediante passwd y authz, y probarlo desde clientes Linux y Windows (TortoiseSVN). Además, se incluyeron buenas prácticas, seguridad, backups y listas de verificación por roles para producción.
Importante: en entornos de producción, añade HTTPS, políticas de backup y, si procede, integración con LDAP/AD para gestión centralizada de usuarios.
Materiales similares

Cómo elegir proveedor SaaS confiable

Cómo acceder o desactivar Recents en Google App

Usar Android como teclado y ratón para PC

Cómo guardar tus copias de WhatsApp antes del borrado

Subir y ver fotos 360° en Facebook
