reprepro: presentando al mundo el repositorio

En entradas anteriores he hablado sobre cómo estoy empleando el programa reprepro y git para gestionar repositorios Debian personales.

Ahora vamos a vestir al muñeco para que sea vendible.

Hasta ahora lo que hemos hecho ha sido crear el repositorio para que pueda ser utilizado directamente con apt y, de momento sólo tenemos un árbol pelado de archivos que el servidor web nos muestra.

Queremos conseguir lo siguiente:

Así que, dentro del repositorio git que a su vez contiene el repositorio Debian, vamos a añadir una carpeta con las cosas de la web.

victor@gladius:~/tmp/myrepo$ mkdir html
victor@gladius:~/tmp/myrepo$ mkdir html/{css,images,include}
victor@gladius:~/tmp/myrepo$ cp ~/plantillas/html/include/* html/include/
victor@gladius:~/tmp/myrepo$ cp ~/plantillas/css/* html/css/
victor@gladius:~/tmp/myrepo$ tree html/
html/
├── css
│   └── autoindex.css
├── images
└── include
    ├── FOOTER.html
    └── HEADER.html

3 directories, 3 files

He trampeado un poquillo con los contenidos porque proceden de otro repositorio pero el concepto es el mismo: indicar al servidor web Apache y su módulo autoindex que utilice esos archivos para mejorar la apariencia de la página.

Luego hay tres archivos muy útiles y que en la imagen corresponden al repositorio en astillas:

  • astillas.key: clave de firma de los paquetes.
  • astillas.list: configuración lista para emplear en apt.
  • setup.sh pequeño script que facilita el uso de este repositorio en una máquina Debian.

Extraer la clave pública es sencillo:

$ gpg --armor --output html/astillas.key --export root@astillas.net

El archivo .list debe contener lo siguiente:

#
#   Repositorio de paquetes de astillas.net
#
deb https://debian.astillas.net debian main 
deb-src https://debian.astillas.net debian main

Ajustándolo a la distribución (debian) y a la rama o ramas (main) que tengamos en nuestro repositorio.

Por último está el programa de configuración llamado setup.sh sobre el que quiero comentar dos cosas:

  1. El acceso al repositorio se hace mediante conexión segura. En Debian esto no es necesario ya que la cadena de custodia es muy sólida y no se utilizan credenciales descargar paquetes, pero en mi caso, con todos lo servidores empleando https el tener uno que no era más molesto que beneficioso.
  2. En todas las instalaciones que gestiono -y desde hace mucho tiempo- estoy utilizando el programa etckeeper (de Joey Hess) para mantener el árbol de configuración de la máquina bajo control de git. Es muy recomendable pero tiene como servidumbre que es necesario informarle de cada cambio que hacemos o se perderá su propósito.
#!/usr/bin/env bash

URLBASE=https://debian.astillas.net
URLKEY=$URLBASE/astillas.key
URLLIST=$URLBASE/astillas.list
LIST=/etc/apt/sources.list.d/astillas.list
WGET=$(which wget)

echo "Comprobando si podemos añadir fuentes de paquetes seguras "
if [ ! $(dpkg -s apt-transport-https | egrep installed) ]; then 
    echo "Instalando apt-transport-https..." 
    sudo apt install apt-transport-https || exit 2
fi 

echo "Descargando e instalando clave del repositorio de $URLKEY ..." 

$WGET --quiet -O- $URLKEY | sudo apt-key add -

if [ $? -ne 0 ]; then
    echo "$0: fallo al añadir la clave del repositorio" >&2
    exit 1
fi 

echo "Descargando e instalando fuente de paquetes para apt de $URLLIST" 
$WGET --quiet -O $LIST $URLLIST 

if [ $? -ne 0 ]; then
    echo "$0: error instalando el archivo de fuentes de apt" 
    exit 1
fi 

if [ $(which etckeeper) ]; then 
    echo "Registrando cambios en el repositorio bajo /etc ..." 
    etckeeper commit "Importado repositorio debian.astillas.net"
fi 

echo "Leyendo listas de paquetes ..."
sudo apt update

Si se tiene la suficiente confianza en el administrador del repositorio es posible configurar el sistema de una tacada con algo como lo siguiente:

$ wget --quiet -O- https://debian.astillas.net/setup.sh | sudo bash -

Y así queda todo bastante cuqui y muy sencillo de emplear.

Con seguridad además, que desde que llegó Stretch las cosas se han puesto serias entre apt y los repositorios locales.