Semplice repository rpm utilizzando Inotify e webdav

In questo post esamineremo lo storage degli artefatti RPM utilizzando un semplice script con inotify + createrepo. Il caricamento degli artefatti avviene tramite WebDAV utilizzando Apache HTTPD. Perché Apache HTTPD sarà menzionato più avanti nel post.

Quindi, la soluzione deve soddisfare i seguenti requisiti per l'organizzazione di uno storage RPM:

  • Gratuito

  • Disponibilità del pacchetto nel repository entro pochi secondi dal caricamento nello storage degli artefatti.

  • Semplice da installare e mantenere

  • Possibilità di implementare alta disponibilità (high availability)

    Perché non SonaType Nexus o Pulp:

  • Lo storage di SonaType Nexus o Pulp diversi tipi di artefatti porta a SonaType Nexus o Pulp diventare un unico punto di fallimento.

  • L'alta disponibilità (high availability) in SonaType Nexus è a pagamento.

  • Pulp Mi sembra una soluzione eccessivamente complessa.

  • Gli artefatti in SonaType Nexus vengono memorizzati in blob. In caso di interruzione improvvisa dell'elettricità, non potrai ripristinare il blob se non hai un backup. Abbiamo avuto un errore del genere: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Errore durante la lettura dei dati per il file 'privilege_5.pcl' 1ª tentativo [java.io](http://java.io/).IOException: Indirizzo errato. Il blob non è stato recuperato.

Codice sorgente

→ Il codice sorgente si trova qui

Lo script principale appare così:

#!/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 &

Installazione

Inotify-createrepo funziona solo su CentOS 7 o superiore. Non è riuscito a farlo funzionare su CentOS 6.

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

Configurazione

Per impostazione predefinita inotify-createrepo monitora la directory /var/www/repos/rpm-repo/.

Questa directory può essere modificata nel file /etc/inotify-createrepo.conf.

Utilizzo

Quando viene aggiunto un file alla directory /var/www/repos/rpm-repo/ inotifywait genererà un file /tmp/need_create. La funzione run_createrepo viene eseguita in un ciclo infinito e monitora il file /tmp/need_create. Se il file esiste, viene eseguito createrepo --update.

Nel file apparirà una voce:

/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

Possibilità di implementare alta disponibilità (high availability)

Per creare alta disponibilità (high availability) da una soluzione esistente, penso si possano usare 2 server, Keepalived per HA e Lsyncd per la sincronizzazione degli artefatti. Lsyncd — un demone che monitora le modifiche nella directory locale, le aggrega e dopo un certo periodo di tempo avvia rsync per la loro sincronizzazione. Dettagli e configurazione sono descritti nel post "Sincronizzazione veloce di un miliardo di file".

WebDAV

I file possono essere caricati in diversi modi: SSH, NFS, WebDAV. WebDAV sembra un'opzione moderna e semplice.

Per WebDAV useremo Apache HTTPD. Perché Apache HTTPD nel 2020, invece di Nginx?

Si vuole utilizzare strumenti automatizzati per costruire Nginx + moduli (ad esempio, WebDAV).

C'è un progetto per assemblare Nginx + moduli — Nginx-builder. Se si utilizza nginx + wevdav per il caricamento di file, è necessario il modulo nginx-dav-ext-module. Quando proviamo ad assemblare e utilizzare Nginx con nginx-dav-ext-module con l'aiuto Nginx-builder riceveremo un errore Usato da http_dav_module invece di nginx-dav-ext-module. Lo stesso errore è stato risolto in estate nginx: [emerg] direttiva sconosciuta dav_methods.

Ho fatto una Pull request Aggiunta verifica git_url per incorporato, rifattorizzato —with-{}_module e se il modulo == "http_dav_module" aggiungi —with. Ma non è stata accettata.

Configurazione 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

Penso che il resto della configurazione di Apache httpd lo farete voi.

Nginx prima di Apache httpd

A differenza di Apache, Nginx utilizza un modello basato su eventi per gestire le richieste, quindi è necessario solo un processo HTTP-server per qualsiasi numero di clienti. Puoi utilizzare nginx e ridurre il carico sul server.

Configurazione nginx-front.conf. Penso che il resto della configurazione di nginx lo farete voi.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name il_tuo_host_virtuale;
    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;
    }
}

Caricamento di file tramite WebDav

Il caricamento di rpm è molto semplice.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://il_tuo_host_virtuale/rpm/

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster