Repositorio rpm simple usando Inotify y webdav

En este post, exploraremos el almacenamiento de artefactos RPM utilizando un simple script con inotify + createrepo. La carga de artefactos se realiza a través de WebDAV utilizando Apache HTTPD. Por qué se mencionará Apache HTTPD más adelante en el post.

Por lo tanto, la solución debe cumplir con los siguientes requisitos para establecer un repositorio solo de RPM:

  • Gratis

  • Disponibilidad del paquete en el repositorio en unos segundos después de la carga en el almacenamiento de artefactos.

  • Fácil de instalar y mantener

  • Posibilidad de lograr alta disponibilidad (high availability)

    Por qué no SonaType Nexus o Pulp:

  • Almacenar en SonaType Nexus o Pulp muchos tipos de artefactos provoca que SonaType Nexus o Pulp se conviertan en un único punto de falla.

  • La alta disponibilidad (high availability) en SonaType Nexus es de pago.

  • Pulp me parece una solución innecesariamente complicada.

  • Los artefactos en SonaType Nexus se almacenan en blob. Con un apagón repentino, no podrá recuperar el blob a menos que tenga una copia de seguridad. Tuvimos un error así: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Error durante la lectura de datos para el archivo 'privilege_5.pcl' 1ª intento [java.io](http://java.io/).IOException: Dirección incorrecta. El blob no se recuperó.

Código fuente

→ El código fuente se encuentra en aquí

El script principal se ve así:

#!/bin/bash

source /etc/inotify-createrepo.conf
LOGFILE=/var/log/inotify-createrepo.log

function monitoring() {
    inotifywait -e close_write,delete -msrq --exclude ".repodata|.olddata|repodata" "${REPO}" | while read events 
    do
      echo $events >> $LOGFILE
      touch /tmp/need_create
    done
}

function run_createrepo() {
  while true; do
    if [ -f /tmp/need_create ];
    then
      rm -f /tmp/need_create
      echo "start createrepo $(date --rfc-3339=seconds)"
      /usr/bin/createrepo --update "${REPO}"
      echo "finish createrepo $(date --rfc-3339=seconds)"
    fi
    sleep 1
  done
}

echo "Start filesystem monitoring: Directory is $REPO, monitor logfile is $LOGFILE"
monitoring >> $LOGFILE &
run_createrepo >> $LOGFILE &

Instalación

Inotify-createrepo solo funciona en CentOS 7 o superior. No hemos podido hacerlo funcionar en CentOS 6.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepo

Configuración

De forma predeterminada, inotify-createrepo monitorea el directorio /var/www/repos/rpm-repo/.

Este directorio se puede cambiar en el archivo /etc/inotify-createrepo.conf.

Uso

Al añadir cualquier archivo en el directorio /var/www/repos/rpm-repo/ inotifywait creará un archivo /tmp/need_create. La función run_createrepo se ejecuta en un bucle infinito y monitorea el archivo /tmp/need_create. Si el archivo existe, se ejecuta createrepo --update.

Aparecerá una entrada en el archivo:

/var/www/repos/rpm-repo/ CREATE nginx-1.16.1-1.el7.ngx.x86_64.rpm
start createrepo 2020-03-02 09:46:21+03:00
Spawning worker 0 with 1 pkgs
Spawning worker 1 with 0 pkgs
Spawning worker 2 with 0 pkgs
Spawning worker 3 with 0 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
finish createrepo 2020-03-02 09:46:22+03:00

Posibilidad de lograr alta disponibilidad (high availability)

Para lograr alta disponibilidad (high availability) a partir de una solución existente, creo que se pueden utilizar 2 servidores, Keepalived para HA y Lsyncd para sincronizar los artefactos. Lsyncd — un demonio que supervisa los cambios en un directorio local, los agrega y, después de un cierto tiempo, inicia rsync para sincronizarlos. Los detalles y la configuración están descritos en el post "Sincronización rápida de mil millones de archivos".

WebDav

Los archivos se pueden cargar de varias maneras: SSH, NFS, WebDav. WebDav parece una opción moderna y simple.

Para WebDav, utilizaremos Apache HTTPD. ¿Por qué Apache HTTPD en 2020 y no Nginx?

Quiero usar herramientas automatizadas para construir Nginx + módulos (por ejemplo, WebDAV).

Hay un proyecto para ensamblar Nginx + módulos — Constructor de Nginx. Si usamos nginx + wevdav para subir archivos, necesitamos el módulo nginx-dav-ext-module. Al intentar compilar y usar Nginx con nginx-dav-ext-module con Constructor de Nginx obtendremos un error Usado por http_dav_module en lugar de nginx-dav-ext-module. Se cerró un error similar en verano nginx: [emerg] directiva desconocida dav_methods.

Hice un Pull request Añadir comprobación git_url para incorporado, refactorizado —with-{}_module y si el módulo == "http_dav_module" agregar —with. Pero no los aceptaron.

Configuración webdav.conf

DavLockDB /var/www/html/DavLock

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog /var/log/httpd/error.log
    CustomLog /var/log/httpd/access.log combined

    Alias /rpm /var/www/repos/rpm-repo
    
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted

Creo que harás la otra configuración de Apache httpd por tu cuenta.

Nginx antes de Apache httpd

A diferencia de Apache, Nginx utiliza un modelo de eventos para el procesamiento de solicitudes, lo que significa que se necesita solo un proceso del servidor HTTP para cualquier número de clientes. Puedes usar nginx y reducir la carga en el servidor.

Configuración nginx-front.conf. Creo que harás la otra configuración de nginx por tu cuenta.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name tu-host-virtual;
    access_log /var/log/nginx/nginx-front-access.log main;
    error_log /var/log/nginx/nginx-front.conf-error.log warn;

    location / {
        proxy_pass http://nginx_front;
    }
}

Carga de archivos a través de WebDav

La carga de rpm es muy simple.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://tu-host-virtual/rpm/

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster