Repositorio rpm simple usando Inotify y webdav

En esta publicación, veremos un repositorio de artefactos rpm usando un simple script inotify + createrepo. Los artefactos se cargan a través de webdav utilizando apache httpd. Por qué apache httpd se escribirá hacia el final de la publicación.

Por lo tanto, la solución debe cumplir con los siguientes requisitos para organizar solo almacenamiento RPM:

  • Gratis

  • Disponibilidad del paquete en el repositorio unos segundos después de cargarlo en el repositorio de artefactos.

  • Fácil de instalar y mantener

  • Habilidad para hacer alta disponibilidad

    Por qué no SonaType Nexus o Pulpa:

  • Almacenamiento en SonaType Nexus o Pulpa muchos tipos de artefactos conduce al hecho de que SonaType Nexus o Pulpa convertirse en un único punto de falla.

  • Alta disponibilidad en SonaType Nexus está pagado.

  • Pulpa Me parece una solución sobredimensionada.

  • Artefactos en SonaType Nexus almacenado en blob. En caso de un corte de energía repentino, no podrá restaurar el blob si no tiene una copia de seguridad. Tuvimos este error: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Error during data read for file 'privilege_5.pcl' 1-th attempt [java.io](http://java.io/).IOException: Bad address. Blob nunca se recuperó.

Código fuente

→ El código fuente se encuentra aquí

El guión 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 pude 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

Configurando

Por defecto, inotify-createrepo monitorea un directorio /var/www/repos/rpm-repo/.

Puede cambiar este directorio en el archivo /etc/inotify-createrepo.conf.

el uso de

Al agregar cualquier archivo a un 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, ejecute 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

Habilidad para hacer alta disponibilidad

Para lograr una alta disponibilidad de una solución existente, creo que puede usar 2 servidores, Keepalived para HA y Lsyncd para la sincronización de artefactos. Lsyncd - un demonio que monitorea los cambios en el directorio local, los agrega y después de cierto tiempo, rsync comienza a sincronizarlos. Los detalles y la configuración se describen en la publicación "Sincronización rápida de mil millones de archivos".

WebDav

Hay varias formas de cargar archivos: SSH, NFS, WebDav. WebDav parece ser una opción moderna y sencilla.

Para WebDav, usaremos Apache httpd. ¿Por qué Apache httpd en 2020 y no nginx?

Me gustaría usar herramientas automatizadas para construir módulos Nginx + (por ejemplo, Webdav).

Hay un proyecto para construir módulos Nginx + - nginx-constructor. Si usa nginx + wevdav para cargar archivos, entonces necesita un módulo nginx-dav-ext-módulo. Al intentar construir y usar Nginx con nginx-dav-ext-módulo con nginx-constructor obtendremos un error Utilizado por http_dav_module en lugar de nginx-dav-ext-module. El mismo error se cerró en el verano. nginx: [emerg] directiva desconocida dav_methods.

Hice una solicitud de extracción Agregue check git_url para incrustado, refactorizado --with-{}_module и si módulo == "http_dav_module" agregar --con. Pero no fueron aceptados.

config webdav.conf

DavLockDB /var/www/html/DavLock
<VirtualHost localhost:80>
    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
    <Directory /var/www/repos/rpm-repo>
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

Creo que usted mismo hará el resto de la configuración de Apache httpd.

Nginx frente a Apache httpd

A diferencia de Apache, Nginx utiliza un modelo de procesamiento de solicitudes basado en eventos, lo que significa que solo se requiere un proceso de servidor HTTP para cualquier cantidad de clientes. Puede usar nginx y reducir la carga del servidor.

configuración de nginx-front.conf. Creo que harás el resto de la configuración de nginx tú mismo.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name ваш-виртуальных-хост;
    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;
    }
}

Descarga de archivos a través de WebDav

Descargar rpm es muy fácil.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ваш-виртуальный-хост/rpm/

Fuente: habr.com

Añadir un comentario