Preprost repozitorij rpm z uporabo Inotify in webdav

V tej objavi si bomo ogledali shranjevanje artefaktov rpm z uporabo preprostega skripta z inotify + createrepo. Nalaganje artefaktov poteka prek webdav z uporabo apache httpd. Zakaj apache httpd bo napisano proti koncu objave.

Rešitev mora torej izpolnjevati naslednje zahteve za organiziranje samo pomnilnika RPM:

  • Brezplačno

  • Razpoložljivost paketa v repozitoriju nekaj sekund po nalaganju v repozitorij artefaktov.

  • Enostaven za namestitev in vzdrževanje

  • Sposobnost visoke razpoložljivosti

    Zakaj ne SonaType Nexus ali Celuloza:

  • Shranjevanje v SonaType Nexus ali Celuloza veliko vrst artefaktov vodi v dejstvo, da SonaType Nexus ali Celuloza postanejo ena sama točka neuspeha.

  • Visoka razpoložljivost v SonaType Nexus je plačan.

  • Celuloza Zdi se mi preveč zapletena rešitev.

  • Artefakti v SonaType Nexus so shranjeni v blobu. Če pride do nenadnega izpada električne energije, ne boste mogli obnoviti bloba, če nimate varnostne kopije. Imeli smo to napako: 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 ni bil nikoli obnovljen.

Izvorna koda

→ Izvorna koda se nahaja tukaj

Glavni skript izgleda takole:

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

Namestitev

Inotify-createrepo deluje samo na CentOS 7 ali novejšem. Ni ga bilo mogoče doseči, da bi deloval na CentOS 6.

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

Konfiguracija

Inotify-createrepo privzeto nadzoruje imenik /var/www/repos/rpm-repo/.

Ta imenik lahko spremenite v datoteki /etc/inotify-createrepo.conf.

Uporaba

Pri dodajanju katere koli datoteke v imenik /var/www/repos/rpm-repo/ inotifywait bo ustvaril datoteko /tmp/need_create. Funkcija run_createrepo teče v neskončni zanki in spremlja datoteko /tmp/need_create. Če datoteka obstaja, se zažene createrepo --update.

V datoteki se prikaže vnos:

/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

Sposobnost visoke razpoložljivosti

Če želite iz obstoječe rešitve narediti visoko razpoložljivost, mislim, da lahko uporabite 2 strežnika, Keepalived za HA in Lsyncd za sinhronizacijo artefaktov. Lsyncd - demon, ki spremlja spremembe v lokalnem imeniku, jih združuje in po določenem času jih rsync začne sinhronizirati. Podrobnosti in nastavitev so opisane v objavi "Hitra sinhronizacija milijarde datotek".

WebDAV

Datoteke lahko naložite na več načinov: SSH, NFS, WebDav. WebDav se zdi sodobna in preprosta možnost.

Za WebDav bomo uporabili Apache httpd. Zakaj Apache httpd leta 2020 in ne nginx?

Rad bi uporabil avtomatizirana orodja za izdelavo modulov Nginx + (na primer Webdav).

Obstaja projekt za izdelavo modulov Nginx + - Graditelj Nginx. Če za nalaganje datotek uporabljate nginx + wevdav, potrebujete modul nginx-dav-ext-modul. Ko poskušate zgraditi in uporabljati Nginx z nginx-dav-ext-modul s pomočjo Graditelj Nginx dobili bomo napako Uporablja ga http_dav_module namesto nginx-dav-ext-module. Isti hrošč je bil zaprt poleti nginx: [emerg] neznana direktiva dav_methods.

Naredil sem zahtevo za vlečenje Dodajte preverjanje git_url za vdelan, refaktoriran —with-{}_module и if module == "http_dav_module" pripni --with. A niso bili sprejeti.

Konfiguracija 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>

Mislim, da lahko preostale nastavitve Apache httpd naredite sami.

Nginx pred Apache httpd

Za razliko od Apache, Nginx uporablja model obdelave zahtev na podlagi dogodkov, ki zahteva samo en proces strežnika HTTP za poljubno število odjemalcev. Uporabite lahko nginx in zmanjšate obremenitev strežnika.

Konfiguracija nginx-front.conf. Mislim, da lahko preostanek nastavitev nginx naredite 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;
    }
}

Nalaganje datotek prek WebDav

Nalaganje vrtljajev je zelo preprosto.

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

Vir: www.habr.com

Dodaj komentar