Semplice repository rpm utilizzando Inotify e webdav

In questo post esamineremo lo storage degli artefatti rpm utilizzando un semplice script con inotify e createrepo. Il caricamento degli artefatti avviene tramite webdav utilizzando apache httpd. Perché apache httpd sarà trattato più avanti nel post.

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

  • Gratuito

  • Disponibilità del pacchetto nel repository pochi secondi dopo il caricamento nello storage degli artefatti.

  • Semplice da installare e mantenere

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

    Perché no SonaType Nexus o Pulp:

  • Lo storage in SonaType Nexus o Pulp tipi diversi di artefatti porta a SonaType Nexus o Pulp essere un unico punto di fallo.

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

  • Pulp mi sembra una soluzione troppo complessa.

  • Gli artefatti in SonaType Nexus sono memorizzati in blob. In caso di spegnimento improvviso, non potrai ripristinare il blob se non hai un backup. Abbiamo avuto un errore di questo tipo: 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: Bad address. Il blob non è stato mai 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 versioni successive. Non è stato possibile 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 una directory /var/www/repos/rpm-repo/.

È possibile modificare questa directory nel file /etc/inotify-createrepo.conf.

L'utilizzo di

Quando viene aggiunto un file nella directory /var/www/repos/rpm-repo/ inotifywait creerà 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 avviato createrepo --update.

Nel file comparirà una registrazione:

/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 garantire alta disponibilità (high availability)

Per creare alta disponibilità da una soluzione esistente, penso sia possibile utilizzare 2 server, Keepalived per HA e Lsyncd per la sincronizzazione degli artefatti. Lsyncd è un demone che monitora le modifiche in una directory locale, le aggrega e, dopo un certo periodo, avvia rsync per sincronizzarle. I dettagli e la configurazione sono descritti nel post "Sincronizzazione rapida di miliardi di file".

WebDav

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

Per WebDav utilizzeremo Apache httpd. Perché Apache httpd nel 2020 e non nginx?

Desidero utilizzare strumenti automatizzati per la costruzione di Nginx + moduli (ad esempio, Webdav).

C'è un progetto per la costruzione di Nginx + moduli — Nginx-builder. Se si utilizza nginx + webdav per il caricamento di file, è necessario il modulo nginx-dav-ext-module. Quando tentiamo di assemblare e utilizzare Nginx con nginx-dav-ext-module con l'aiuto di Nginx-builder si ottiene un errore Used by http_dav_module instead of nginx-dav-ext-module. Lo stesso errore è stato risolto l'estate scorsa nginx: [emerg] unknown directive dav_methods.

Ho fatto un Pull request Add check git_url for embedded, refactored —with-{}_module e if module == "http_dav_module" append —with. Ma non è stato accettato.

Config 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 tu possa gestire da solo le altre configurazioni di Apache httpd.

Nginx prima di Apache httpd

A differenza di Apache, Nginx utilizza un modello di elaborazione degli eventi per le richieste, il che significa che per qualsiasi numero di client è necessario solo un processo HTTP server. Puoi utilizzare nginx e ridurre il carico sul server.

Configurazione nginx-front.conf. Penso che gestirai il resto della configurazione nginx da solo.

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 file tramite WebDav

Il caricamento degli 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