reprepro, git y rsync: un repositorio Debian bajo control local

Pues sí, tras varios años empleando mini-dinstall para gestionar los dos repositorios de paquetes Debian de los que soy responsable (el mío y el de la empresa donde trabajo) le voy a dar la vuelta al concepto por completo.

¿ Cuál es el problema con mini-dinstall ? Que me exige mantener una configuración bastante completa en el lado del servidor y para ese viaje no necesitamos tanta alforja. Que estoy solo, oiga, y que no es necesario tanto mecanismo de envío remoto -con su seguridad extra- para cuatro paquetes que creo y mantengo al mes.

Con mini-dinstall el trabajo diario con los paquetes consiste en crearlos primero (obvio) y luego transferirlos al servidor remoto en un directorio concreto. En el otro lado se está vigilando dicho directorio así que se toman los paquetes, se incluyen en el sitio correspondiente del árbol y se firman con la clave del mismo.

Dicho así no parece que la cosa sea muy compleja, ¿ no ? Pues no, porque en el otro lado hay que instalar varios programas que interactúan entre sí con mucho cuidado para que la clave privada con la que se firma no quede expuesta, y siempre termina por existir algún detalle que hace que tenga que entrar como administrador y realizar ajustes a mano. Son varias las claves que proteger  -y demasiados los pasos a vigilar- para que al final un servidor web de acceso simple y pelón a unos archivos.

Ahora que tengo bastante maña con los repositorios git y que he podido reducir los lugares de desarrollo a dos (mi casa y mi trabajo), veo que es mucho más sencillo utilizar un repositorio local para mantener los paquetes y enviar al servidor remoto sólo lo que tiene que presentar al mundo.

reprepro

Ya llevaba un tiempo intentando ver qué otras opciones existían para gestionar un repositorio Debian y este programa ha encajado muy bien. Es sencillo de emplear y lo bastante extensible como para afrontar disposiciones complejas.

Hay muchas referencias y tutoriales para ponerlo en marcha. No tiene mucho misterio y lo mejor de todo es que crea toda la estructura donde le digas sin protestar y luego es muy fácil subirla al servidor para que sea sólo eso lo que se publique.

Las referencias con las que he trabajado son:

Y, por resumir mucho, lo que he hecho ha sido:

  1. Crear una clave PGP para firmar los paquetes y la distribución.
  2. Crear un repositorio git.
  3. Dentro de él añadir una ruta repos/conf con un archivo en su interior llamado distributions.
  4. Rellenar ese archivo con la información correspondiente a mi repositorio e
  5. Indicar al programa que construya el árbol inicial: reprepro -b repos export

Si he configurado el repositorio de la siguiente forma:

Origin: http://debian.example.net
Label: example
Codename: debian
Suite: stable
Components: main 
Architectures: source amd64 i386
Description: Mi repositorio de paquetes
#SignWith: root@example.net

Y sigo estos pasos:

victor@gladius:~$ cd tmp
victor@gladius:~/tmp$ mkdir myrepo
victor@gladius:~/tmp$ cd myrepo
victor@gladius:~/tmp/myrepo$ git init .
Initialized empty Git repository in /home/victor/tmp/myrepo/.git/
victor@gladius:~/tmp/myrepo$ mkdir -p repos/conf
victor@gladius:~/tmp/myrepo$ vim repos/conf/distributions
victor@gladius:~/tmp/myrepo$ reprepro -b repos export

Obtengo lo siguiente:

victor@gladius:~/tmp/myrepo$ tree -puag repos
repos
├── [drwxrwxr-x victor   victor  ]  conf
│   └── [-rw-rw-r-- victor   victor  ]  distributions
├── [drwxrwxr-x victor   victor  ]  db
│   ├── [-rw-rw-r-- victor   victor  ]  checksums.db
│   ├── [-rw-rw-r-- victor   victor  ]  contents.cache.db
│   ├── [-rw-rw-r-- victor   victor  ]  packages.db
│   ├── [-rw-rw-r-- victor   victor  ]  references.db
│   ├── [-rw-rw-r-- victor   victor  ]  release.caches.db
│   └── [-rw-rw-r-- victor   victor  ]  version
└── [drwxrwxr-x victor   victor  ]  dists
    └── [drwxrwxr-x victor   victor  ]  debian
        ├── [drwxrwxr-x victor   victor  ]  main
        │   ├── [drwxrwxr-x victor   victor  ]  binary-amd64
        │   │   ├── [-rw-rw-r-- victor   victor  ]  Packages
        │   │   ├── [-rw-rw-r-- victor   victor  ]  Packages.gz
        │   │   └── [-rw-rw-r-- victor   victor  ]  Release
        │   ├── [drwxrwxr-x victor   victor  ]  binary-i386
        │   │   ├── [-rw-rw-r-- victor   victor  ]  Packages
        │   │   ├── [-rw-rw-r-- victor   victor  ]  Packages.gz
        │   │   └── [-rw-rw-r-- victor   victor  ]  Release
        │   └── [drwxrwxr-x victor   victor  ]  source
        │       ├── [-rw-rw-r-- victor   victor  ]  Release
        │       └── [-rw-rw-r-- victor   victor  ]  Sources.gz
        └── [-rw-rw-r-- victor   victor  ]  Release

8 directories, 16 files

He obviado lo de la firma por no complicar más el ejemplo pero una vez que le das la clave de la misma cualquier cambio es firmado con total normalidad.

Añadiendo paquetes

En los dos repositorios que controlo tengo paquetes Debian nativos y paquetes bajados de cualquier lado y en condiciones extrañas.

Los nativos son los que hago yo porque la mayor parte de mis desarrollos son para este sistema operativo. Sé que el canon Debian insiste mucho en no hacerlo así pero, mira, ya que no voy a distribuirlos oficialmente no veo ventaja alguna en seguirlo en este aspecto.

Aquellos cuyo origen menciono tan a la ligera son principalmente paquetes que proporcionan fabricantes de hardware y similares, en formato Debian, pero sin mucho rigor. Así que me limito a descargarlos y a guardarlos en el repositorio para poder reutilizarlos con facilidad.

Por ejemplo, si muevo de máquina una impresora o la recupero del trastero, no me gusta jugármela con nuevas y emocionantes versiones del fabricante si con las versiones antiguas estaba funcionando. Demasiados disgustos me he llevado ya.

Así que, una vez que tenemos los paquetes Debian para añadir, basta con indicarle al programa que los importe:

victor@gladius:~/tmp/myrepo$ reprepro -b repos includedeb stable ~/Descargas/Rambox_0.5.13-x64.deb
Exporting indices...
victor@gladius:~/tmp/myrepo$ tree repos/pool/
repos/pool/
└── main
    └── r
        └── rambox
            └── rambox_0.5.13-108_amd64.deb

3 directories, 1 file

Listo. No hay más que hacer. Ahora basta con transferir al servidor los archivos necesarios y el repositorio estará disponible.

$ sudo rsync -avl repos/dists repos/pool debrepo@example.net:

Con esos dos basta. La base de datos del repositorio queda bajo nuestra custodia local, la clave de firma también, y como a su vez está gestionado bajo git es fácil de transportar a otra máquina y seguir manteniéndolo.

Hay detalles prácticos que faltan, claro, pero eso da para otra entrada …