Repositorio rpm sinxelo usando Inotify e webdav

Nesta publicación analizaremos o almacenamento de artefactos rpm usando un script sinxelo con inotify + createrepo. A carga de artefactos realízase a través de webdav usando apache httpd. Por que apache httpd se escribirá ao final da publicación.

Polo tanto, a solución debe cumprir os seguintes requisitos para organizar só o almacenamento RPM:

  • De balde

  • Dispoñibilidade do paquete no repositorio uns segundos despois da carga no repositorio de artefactos.

  • Fácil de instalar e manter

  • Capacidade de facer alta dispoñibilidade

    Por que non SonaType Nexus ou Pulpa:

  • Almacenamento en SonaType Nexus ou Pulpa moitos tipos de artefactos leva ao feito de que SonaType Nexus ou Pulpa converterse nun único punto de fracaso.

  • Alta dispoñibilidade en SonaType Nexus é pagado.

  • Pulpa Paréceme unha solución demasiado complicada.

  • Artefactos en SonaType Nexus almacénanse en blob. Se hai un apagón repentino, non poderás restaurar o blob se non tes unha copia de seguridade. Tivemos este erro: 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 foi restaurado.

Código fonte

→ Localízase o código fonte aquí

O script principal ten o seguinte aspecto:

#!/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 só funciona en CentOS 7 ou superior. Non se puido facelo 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

Por defecto, inotify-createrepo supervisa o directorio /var/www/repos/rpm-repo/.

Podes cambiar este directorio no ficheiro /etc/inotify-createrepo.conf.

Usar

Ao engadir calquera ficheiro a un directorio /var/www/repos/rpm-repo/ inotifywait creará o ficheiro /tmp/need_create. A función run_createrepo execútase nun bucle interminable e supervisa o ficheiro /tmp/need_create. Se o ficheiro existe, execútase createrepo --update.

No ficheiro aparecerá unha entrada:

/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

Capacidade de facer alta dispoñibilidade

Para facer unha alta dispoñibilidade dunha solución existente, creo que pode usar 2 servidores, Keepalived para HA e Lsyncd para sincronizar artefactos. Lsyncd - un daemon que supervisa os cambios nun directorio local, os agrega e despois dun certo tempo rsync comeza a sincronizalos. Os detalles e a configuración descríbense na publicación "Sincronización rápida de mil millóns de ficheiros".

WebDav

Podes cargar ficheiros de varias maneiras: SSH, NFS, WebDav. WebDav parece ser unha opción moderna e sinxela.

Para WebDav usaremos Apache httpd. Por que Apache httpd en 2020 e non nginx?

Gustaríame usar ferramentas automatizadas para construír módulos Nginx + (por exemplo, Webdav).

Hai un proxecto para construír módulos Nginx + - Construtor de Nginx. Se usas nginx + wevdav para cargar ficheiros, necesitas un módulo nginx-dav-ext-módulo. Ao tentar construír e usar Nginx con nginx-dav-ext-módulo con axuda Construtor de Nginx teremos un erro Usado por http_dav_module en lugar de nginx-dav-ext-module. O mesmo erro pechouse no verán nginx: [emerg] directiva descoñecida dav_methods.

Fixen unha solicitude Pull Engade check git_url para embebido, refactorizado —con-{}_module и if module == "http_dav_module" anexa --con. Pero non foron aceptados.

Configuración 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 podes facer o resto da configuración de Apache httpd ti mesmo.

Nginx antes de Apache httpd

A diferenza de Apache, Nginx usa un modelo de procesamento de solicitudes baseado en eventos, que require só un proceso de servidor HTTP para calquera número de clientes. Podes usar nginx e reducir a carga no servidor.

Configuración de nginx-front.conf. Creo que podes facer o resto da configuración de nginx ti mesmo.

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;
    }
}

Cargando ficheiros a través de WebDav

Cargar rpm é moi sinxelo.

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

Fonte: www.habr.com

Engadir un comentario