Jednoduché úložisko rpm pomocou Inotify a webdav

V tomto príspevku sa pozrieme na archív artefaktov rpm pomocou jednoduchého skriptu inotify + createrepo. Artefakty sa nahrávajú cez webdav pomocou apache httpd. Prečo apache httpd bude napísané na konci príspevku.

Riešenie teda musí spĺňať nasledujúce požiadavky na organizáciu iba úložiska RPM:

  • zadarmo

  • Dostupnosť balíka v úložisku niekoľko sekúnd po nahraní do úložiska artefaktov.

  • Jednoduchá inštalácia a údržba

  • Schopnosť zabezpečiť vysokú dostupnosť

    Prečo nie SonaType Nexus alebo Dreň:

  • Skladovanie v SonaType Nexus alebo Dreň veľa druhov artefaktov vedie k tomu, že SonaType Nexus alebo Dreň stať jediným bodom zlyhania.

  • Vysoká dostupnosť v SonaType Nexus je platený.

  • Dreň Zdá sa mi to ako prepracované riešenie.

  • Artefakty v SonaType Nexus uložené v blobe. V prípade náhleho výpadku prúdu nebudete môcť objekt blob obnoviť, ak nemáte zálohu. Mali sme túto chybu: 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 nebol nikdy nájdený.

Zdrojový kód

→ Nachádza sa zdrojový kód tu

Hlavný skript vyzerá takto:

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

Inštalácia

inotify-createrepo funguje iba na CentOS 7 alebo novšom. Nepodarilo sa ho spustiť na CentOS 6.

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

Konfigurácia

Štandardne inotify-createrepo monitoruje adresár /var/www/repos/rpm-repo/.

Tento adresár v súbore môžete zmeniť /etc/inotify-createrepo.conf.

Použitie

Pri pridávaní akéhokoľvek súboru do adresára /var/www/repos/rpm-repo/ inotifywait vytvorí súbor /tmp/need_create. Funkcia run_createrepo beží v nekonečnej slučke a monitoruje súbor /tmp/need_create. Ak súbor existuje, spustite ho createrepo --update.

V súbore sa objaví záznam:

/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

Schopnosť zabezpečiť vysokú dostupnosť

Ak chcete dosiahnuť vysokú dostupnosť z existujúceho riešenia, myslím, že môžete použiť 2 servery, Keepalived pre HA a Lsyncd na synchronizáciu artefaktov. Lsyncd - démon, ktorý sleduje zmeny v lokálnom adresári, agreguje ich a po určitom čase ich rsync začne synchronizovať. Podrobnosti a nastavenia sú popísané v príspevku "Rýchla synchronizácia miliardy súborov".

WebDav

Existuje niekoľko spôsobov, ako nahrať súbory: SSH, NFS, WebDav. WebDav sa javí ako moderná a jednoduchá možnosť.

Pre WebDav použijeme Apache httpd. Prečo Apache httpd v roku 2020 a nie nginx?

Chcel by som použiť automatizované nástroje na vytváranie modulov Nginx + (napríklad Webdav).

Existuje projekt na vybudovanie modulov Nginx + - nginx-builder. Ak na nahrávanie súborov používate nginx + wevdav, potrebujete modul nginx-dav-ext-module. Pri pokuse o zostavenie a používanie Nginx s nginx-dav-ext-module prostredníctvom nginx-builder dostaneme chybu Používa ho http_dav_module namiesto nginx-dav-ext-module. Rovnaká chyba bola uzavretá v lete nginx: [emerg] neznáma direktíva dav_methods.

Požiadal som o stiahnutie Pridajte kontrolu git_url pre vložený, refaktorovaný --with-{}_module и if module == "http_dav_module" append --with. Ale neboli prijaté.

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>

Myslím, že zvyšok konfigurácie Apache httpd urobíte sami.

Nginx pred Apache httpd

Na rozdiel od Apache používa Nginx model spracovania požiadaviek založený na udalostiach, čo znamená, že pre ľubovoľný počet klientov je potrebný iba jeden proces servera HTTP. Môžete použiť nginx a znížiť zaťaženie servera.

konfigurácia nginx-front.conf. Myslím, že zvyšok konfigurácie nginx urobíte sami.

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

Sťahovanie súborov cez WebDav

Sťahovanie otáčok za minútu je veľmi jednoduché.

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

Zdroj: hab.com

Pridať komentár