in debian NginX shell ~ read.

Crear un repositorio Debian con reprepro

Creo que todo usuario de Debian tarde o temprano termina creando sus propios paquetes deb. Ya sea por facilitar la instalación de un software o distribuirlo con el resto del mundo.

Ahora estoy en ese mismo punto, tengo mis paquetes deb y puedo copiarlos y instalarlos perfectamente. Pero cuando se te acumulan unos cuantos y no los puedes llevar encima, surge otra necesidad, tan inevitable como crear los paquetes: montar un repositorio.

Lo he intentado alguna vez y siempre he desistido solamente con leer la documentación oficial. Pero de tanto insistir buscando una alternativa, di con la aplicación reprepro que simplifica mucho el montaje de un repositorio.

Estos son los pasos que seguí para tener mi propio repositorio.

Lo primero es decidir como se va a servir el repositorio. Las formas mas utilizadas son ftp o http, y como ya tengo nginx instalado pues me decanto por http. La segunda decision a tomar es la ubicación: según cuantos paquetes tengamos, deberemos optar por tenerlo en el disco de sistema o en algun otro disco o carpeta. En este caso me decanto por un disco montado en /media/HD-Repo/Mi-Repositorio/.

Empecemos a instalar el software que necesitaremos para montar todo esto:

sudo apt install reprepro gnupg nginx  

Los paquetes a servir estarán firmados mediante una clave gpg que deberos generar haciendo uso del siguiente comando:

sudo gpg --gen-key  

Nos preguntara que tipo de llave deseamos crear, optamos por la opción RSA. A continuación no solicita el tamaño de la misma, que en este caso ya viene predefinida como 2048 por lo que pulsamos intro. El periodo de validez es importante ya que una vez caduque deberemos crear otra nueva, por lo que optamos por la opción 0, que no caduca nunca. Confirmamos que todo es correcto y por ultimo asociamos un nombre y correo a la llave junto a una contraseña.

Seleccione el tipo de clave deseado:  
   (1) DSA y ElGamal (por defecto)
   (2) DSA y ElGamal (por defecto)
   (3) DSA (sólo firmar)
   (4) RSA (sólo firmar)
¿Su elección?4
las claves RSA pueden tener entre 1024 y 4096 bits de longitud.  
¿De qué tamaño quiere la clave? (2048) 
El tamaño requerido es de 2048 bits  
Especifique el período de validez de la clave.  
         0 = la clave nunca caduca
      <n>  = la clave caduca en n días
      <n>w = la clave caduca en n semanas
      <n>m = la clave caduca en n meses
      <n>y = la clave caduca en n años
¿Validez de la clave (0)? 
La clave nunca caduca  
¿Es correcto? (s/n) s

Necesita un identificador de usuario para identificar su clave. El programa  
construye el identificador de usuario a partir del Nombre Real, Comentario y Dirección  
de Correo Electrónico de esta forma:  
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Nombre y apellidos: Repositorio  
Dirección de correo electrónico: Mi@email.com  
Comentario: clave para firmar paquetes de mi repositorio  
Ha seleccionado este identificador de usuario:  
    "Repositorio (clave para firmar paquetes de mi repositorio) <Mi@email.com>"

¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? V
Necesita una contraseña para proteger su clave secreta.  

Para ver si todo ha ido bien ejecutamos el siguiente comando para que nos muestre todas nuestras llaves gpg:

sudo gpg --list-keys  

Nos mostrara algo parecido al siguiente texto:

pub   2048R/0A09023D 2016-10-01  
uid   Repositorio (Clave para firmar paquetes de mi repositorio) <Mi@email.com>  

A nosotros nos interesa el identificador 0A09023D , ya que sera el que apunte a la llave que firmara el contenido de nuestro repositorio.

Nos dirigimos a la carpeta donde estará nuestro repositorio /media/HD-Repo/Mi-Repositorio/ y empezamos creando una carpeta que almacene la configuración necesaria:

cd /media/HD-Repo/Mi-Repositorio/  
sudo mkdir conf  
cd conf  
sudo nano distributions  

Ahora que tenemos el editor nano abierto copiamos el siguiente texto:

Origin: mi.repositorio.com  
Label: mi.repositorio.com.  
Codename: jessie  
Architectures: amd64 i386 armhf armel  
Components: main contrib non-free  
Description: mi repositorio personal  
SignWith: 1A2D5G4  
DebIndices: Packages Release . .gz .bz2  

Tendras que modificar los siguientes apartados:

  • Origin: Seria la url de nuestro repositorio
  • Label: Pequeña etiqueta que defina el repositorio.
  • Codename: Los paquetes pueden ser compilados para distintas versiones de Debian (Jessie, Wheezy, Squeeze...). En mi caso los paquetes que creo son para Jessie, pero es posible poner varias versiones.
  • Architectures: Esto es importante, aquí hay que poner las arquitecturas para las que se han compilado los binarios que hay dentro de nuestros paquetes.
  • Components: Tus paquetes pueden ser definidos como no-libres, contribuciones o principales. Aquí deberemos poner cuales servirá nuestro servidor.
  • Description: una breve definición del repositorio.
  • SignWith: recuerdas la llave GPG que creamos hace un momento?, pues aquí deberemos poner el identificador (0A09023D) de la misma.

Después de modificar los campos necesarios, guardamos los cambios, Ctrl+X.

Ahora usando reprepro generamos la estructura de carpetas y enlaces necesarios dentro de nuestro repositorio:

cd /media/HD-Repo/Mi-Repositorio/  
sudo reprepro export  
sudo reprepro createsymlinks  

Nos pedirá que metamos 2 veces la contraseña que definimos para la llave RSA.

Ya tenemos el repositorio montado pero ahora toca servirlo mediante http con nginx. Vamos a la carpeta de configuración de nginx y creamos una archivo para definir como servirá nuestro repositorio:

cd /etc/nginx/sites-available/  
sudo nano repositorio  

Copia el siguiente texto en el editor:

server {  
  listen 80;
  server_name mi.repositorio.com;

  access_log /var/log/nginx/packages-error.log;
  error_log /var/log/nginx/packages-error.log;

  location / {
    root /etc/nginx/sites-available/;
    index index.html;
    autoindex on;
  }

  location ~ /conf/ {
    deny all;
  }

  location ~ /db/ {
    deny all;
  }
}

Modifica los siguientes campos:

  • server_name: aqui pon la url de tu repositorio.
  • root: la ubicación, path completo, de la carpeta que almacena tu repositorio.

Guardamos los cambios ,Ctrl+X, y activamos esta configuración creando un enlace simbólico en la carpeta de activación de nginx:

cd /etc/nginx/sites-enabled  
sudo ln -s ../sites-available/repositorio .  

Para que todo estos cambios surjan efecto reiniciamos nginx:

sudo service ngingx restart  

Para terminar nos hace falta exportar la parte publica de la llave que creamos en un principio, para que los usuarios del repositorio puedan certificar que los paquetes firmados sean verdaderos:

sudo gpg --armor --export IDENTIFICADOR > /media/HD-Repo/Mi-Repositorio/repo-gpg.key  

Ya tenemos nuestro repositorio totalmente configurado y en marcha. Pero sin ningún paquete deb dentro, por lo que deberemos ir agregando los paquetes con el siguiente comando:

cd /media/HD-Repo/Mi-Repositorio/  
sudo reprepro includedeb CODENAME /PATH/AL/PAQUETE/mi_paquete.deb  

Cambia CODENAME por el definido en el archivo distributions y a continuación pon el path completo al paquete deb. No solicitara dos veces la contraseña dela llave gpg generada y automáticamente se agregara el paquete al repositorio.

Ahora si, tenemos un repositorio con un paquete deb servido por http, totalmente funcional. Solo nos hace falta probarlo desde otro equipo con Debian, agregando nuestro recién creado repositorio junto a los oficiales de Debian.

Tomamos prestado el portátil de un amigo con Debian instalado y editamos su archivo sources.list:

sudo nano /etc/apt/sources.list  

Al final del archivo agregamos nuestro repositorio de la siguiente manera:

# Repositorio Personal
deb http://apt.sith.su/ CODENAME COMPONENTS  

Tened en cuenta que debéis poner el CODENAME y COMPONENTS definidos en el archivo de configuración distributions. Guardamos los cambios Ctrl+X, y descargamos la clave publica de la llave con la que están firmados los paquetes del repositorio:

cd ~/  
wget http://mi.repositorio.com/repo-gpg.key  
sudo apt-key add repo-gpg.key  

Actualizamos todos los repositorio que tenemos, incluido el nuestro:

sudo apt update  

Ahora si que si, ya podemos instalar el paquete que agregamos a nuestro repositorio como cualquier otro paquete de los repositorios oficiales de Debian:

sudo apt install mi_paquete.deb  

Ahora ya nada te puede impedir compilar tus binarios y empaquetarlos, para servirlos al mundo desde tu repositorio.

Por si te interesa puedes usar mi repositorio apt.fortu.io


Fuentes:

comments powered by Disqus