Eenvoudige rpm-repository met Inotify en webdav

In dit bericht bespreken we het opslaan van rpm-artifacten met een eenvoudig script met inotify + createrepo. Het uploaden van artifacten gebeurt via webdav met behulp van apache httpd. Waarom apache httpd later in dit bericht aan bod zal komen.

Het oplossing moet voldoen aan de volgende eisen voor het opzetten van alleen een RPM-opslagplaats:

  • Gratis

  • De beschikbaarheid van het pakket in de repository binnen enkele seconden na upload naar de opslageenheid.

  • Eenvoudig in te stellen en te onderhouden

  • De mogelijkheid om hoge beschikbaarheid (high availability) te realiseren

    Waarom niet SonaType Nexus of Pulp:

  • Opslag in SonaType Nexus of Pulp meerdere soorten artifacten leidt ertoe dat SonaType Nexus of Pulp deze een enkelpunt van falen worden.

  • Hoge beschikbaarheid (high availability) in SonaType Nexus is betaald.

  • Pulp lijkt me een overcompliceerde oplossing.

  • Artifacten in SonaType Nexus worden opgeslagen in blob. Bij een onverwachte stroomuitval kun je de blob niet herstellen als je geen backup hebt. We hadden zo'n fout: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fout tijdens data lezen voor bestand 'privilege_5.pcl' 1e poging [java.io](http://java.io/).IOException: Slechte adres. Blob werd niet hersteld.

Broncode

→ De broncode bevindt zich here

Het hoofdscript ziet er zo uit:

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

Installatie

Inotify-createrepo werkt alleen op CentOS 7 of hoger. Op CentOS 6 is het niet gelukt om het aan de praat te krijgen.

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

Configuratie

Standaard monitort inotify-createrepo de map /var/www/repos/rpm-repo/.

Je kunt deze map wijzigen in het bestand /etc/inotify-createrepo.conf.

Gebruik van

Bij het toevoegen van elk bestand in de map /var/www/repos/rpm-repo/ inotifywait zal een bestand aanmaken /tmp/need_create. De functie run_createrepo draait in een oneindige lus en monitort het bestand /tmp/need_create. Als het bestand bestaat, wordt createrepo --update.

Er verschijnt een vermelding in het bestand:

/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

De mogelijkheid om hoge beschikbaarheid (high availability) te realiseren

Om hoge beschikbaarheid (high availability) van de bestaande oplossing te maken, denk ik dat je 2 servers kunt gebruiken, Keepalived voor HA en Lsyncd voor het synchroniseren van artifacten. Lsyncd is een daemon die veranderingen in de lokale map volgt, deze aggregeert, en na verloop van tijd start het rsync om deze te synchroniseren. Details en configuratie zijn beschreven in het bericht "Snelle synchronisatie van een miljard bestanden".

WebDav

Bestanden kunnen op verschillende manieren worden geüpload: SSH, NFS, WebDav. WebDav lijkt een moderne en eenvoudige optie.

Voor WebDav gebruiken we Apache httpd. Waarom Apache httpd in 2020 en niet nginx?

Ik wil geautomatiseerde tools gebruiken voor het bouwen van Nginx + modules (bijvoorbeeld Webdav).

Er is een project voor het bouwen van Nginx + modules — Nginx-builder. Als je nginx + wevdav gebruikt om bestanden te uploaden, heb je de module nodig nginx-dav-ext-module. Bij de poging om Nginx met nginx-dav-ext-module met behulp van Nginx-builder ontdekken we een fout Used by http_dav_module instead of nginx-dav-ext-module. Een soortgelijke fout werd deze zomer gesloten nginx: [emerg] unknown directive dav_methods.

Ik heb een Pull request gemaakt Add check git_url for embedded, refactored —with-{}_module en if module == "http_dav_module" append —with. Maar ze hebben het niet aangenomen.

Configuratie 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

De overige configuratie van Apache httpd denk ik dat je zelf zult doen.

Nginx voor Apache httpd

In tegenstelling tot Apache gebruikt Nginx een gebeurtenisgerichte model voor het verwerken van verzoeken, waardoor ƩƩn HTTP-serverproces nodig is voor elk aantal clients. Je kunt nginx gebruiken om de belasting op de server te verlagen.

Configuratie nginx-front.conf. De overige configuratie van nginx denk ik dat je zelf zult doen.

upstream nginx_front {
    server localhost:80;
}

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

Bestanden uploaden via WebDav

Het uploaden van rpm is heel eenvoudig.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://uw-virtuele-host/rpm/

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster