Eenvoudige rpm-repository met behulp van Inotify en webdav

In dit bericht kijken we naar een rpm-artefact-repository met behulp van een eenvoudig inotify + createrepo-script. Artefacten worden geüpload via webdav met behulp van apache httpd. Waarom apache httpd tegen het einde van het bericht zal worden geschreven.

De oplossing moet dus aan de volgende vereisten voldoen om alleen RPM-opslag te organiseren:

  • Gratis

  • Beschikbaarheid van het pakket in de repository enkele seconden na het uploaden naar de artefactrepository.

  • Eenvoudig te installeren en te onderhouden

  • Mogelijkheid om hoge beschikbaarheid te maken

    Waarom niet SonaType Nexus of Pulp:

  • Opslag binnen SonaType Nexus of Pulp vele soorten artefacten leidt tot het feit dat SonaType Nexus of Pulp een single point of failure worden.

  • Hoge beschikbaarheid in SonaType Nexus is betaald.

  • Pulp Lijkt me een over-engineered oplossing.

  • Artefacten binnen SonaType Nexus opgeslagen in blob. Als de stroom plotseling uitvalt, kunt u de blob niet herstellen als u geen back-up hebt. We hadden deze fout: 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 is nooit teruggevonden.

Bron

→ De broncode is gevonden hier

Het hoofdscript ziet er als volgt 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. Kon het niet laten werken op CentOS 6.

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

Configuratie

Standaard bewaakt inotify-createrepo een map /var/www/repos/rpm-repo/.

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

Gebruiken

Bij het toevoegen van een bestand aan een map /var/www/repos/rpm-repo/ inotifywait zal een bestand aanmaken /tmp/need_create. De functie run_createrepo wordt uitgevoerd in een oneindige lus en bewaakt het bestand /tmp/need_create. Als het bestand bestaat, voer dan uit 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

Mogelijkheid om hoge beschikbaarheid te maken

Om hoge beschikbaarheid te halen uit een bestaande oplossing, denk ik dat je 2 servers kunt gebruiken, Keepalived voor HA en Lsyncd voor synchronisatie van artefacten. Lsync - een daemon die wijzigingen in de lokale map bewaakt, ze aggregeert en na een bepaalde tijd begint rsync ze te synchroniseren. Details en instellingen worden beschreven in de post "Snelle synchronisatie van een miljard bestanden".

WebDav

Er zijn verschillende manieren om bestanden te uploaden: SSH, NFS, WebDav. WebDav lijkt een moderne en eenvoudige optie te zijn.

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

Ik zou graag geautomatiseerde tools willen gebruiken voor het bouwen van Nginx + -modules (bijvoorbeeld Webdav).

Er is een project voor het bouwen van Nginx + -modules - nginx-bouwer. Als je nginx + wevdav gebruikt om bestanden te uploaden, dan heb je een module nodig nginx-dav-ext-module. Bij het bouwen en gebruiken van Nginx met nginx-dav-ext-module door middel van nginx-bouwer we krijgen een foutmelding Gebruikt door http_dav_module in plaats van nginx-dav-ext-module. Dezelfde bug werd in de zomer gesloten nginx: [emerg] onbekende richtlijn dav_methods.

Ik heb een pull-request gedaan Voeg check git_url toe voor embedded, refactored --with-{}_module и if module == "http_dav_module" toevoegen --with. Maar ze werden niet geaccepteerd.

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>

Ik denk dat je de rest van de Apache httpd-configuratie zelf zult doen.

Nginx voor Apache httpd

In tegenstelling tot Apache gebruikt Nginx een op gebeurtenissen gebaseerd aanvraagverwerkingsmodel, wat betekent dat slechts één HTTP-serverproces vereist is voor een willekeurig aantal clients. U kunt nginx gebruiken en de serverbelasting verminderen.

nginx-front.conf-configuratie. Ik denk dat je de rest van de nginx-configuratie zelf zult doen.

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

Bestanden downloaden via WebDav

Het downloaden van rpm is heel eenvoudig.

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

Bron: www.habr.com

Voeg een reactie