Jednoduché rpm úložisko pomocou Inotify a webdav

V tomto príspevku preskúmame úložisko rpm artefaktov pomocou jednoduchého skriptu s inotify + createrepo. Nahrávanie artefaktov prebieha prostredníctvom webdav s využitím apache httpd. Prečo apache httpd bude uvedené bližšie na konci príspevku.

Takže riešenie by malo spĺňať nasledujúce požiadavky pre organizáciu len RPM úložiska:

  • Bezplatné

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

  • Jednoduché na inštaláciu a údržbu

  • Možnosť zabezpečiť vysokú dostupnosť (high availability)

    Prečo nie SonaType Nexus alebo Pulp:

  • Ukladanie v SonaType Nexus alebo Pulp mnohých typoch artefaktov vedie k tomu, že SonaType Nexus alebo Pulp sa stávajú jediným bodom zlyhania.

  • Vysoká dostupnosť (high availability) v SonaType Nexus je spoplatnená.

  • Pulp Zdá sa mi, že je to zložitým riešením.

  • Artefakty v SonaType Nexus sú uložené v blob. Pri náhlom vypnutí elektriny sa vám nepodarí obnoviť blob, ak nemáte zálohu. Mali sme takú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}} Chyba pri čítaní údajov pre súbor 'privilege_5.pcl' 1. pokus [java.io](http://java.io/).IOException: Zlá adresa. Blob sa nepodarilo obnoviť.

Zdrojový kód

→ Zdrojový kód sa nachádza 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 vyšších. Na CentOS 6 sa ho nepodarilo rozbehnúť.

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

Konfigurácia

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

Tento adresár je možné zmeniť v súbore /etc/inotify-createrepo.conf.

Použitie

Pri pridaní akéhokoľvek súboru do adresára /var/www/repos/rpm-repo/ inotifywait vytvorí súbor /tmp/need_create. Funkcia run_createrepo sa spúšťa v nekonečnej slučke a monitoruje súbor /tmp/need_create. Ak súbor existuje, spúšťa sa createrepo --update.

V súbore sa objaví zápis:

/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

Možnosť zabezpečiť vysokú dostupnosť (high availability)

Pre zabezpečenie vysokej dostupnosti (high availability) z existujúceho riešenia si myslím, že je možné 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 uplynutí určitého času spúšťa rsync na ich synchronizáciu. Podrobnosti a nastavenie sú popísané v príspevku "Rýchlostná synchronizácia miliardy súborov".

WebDav

Súbory je možné nahrávať viacerými spôsobmi: SSH, NFS, WebDav. WebDav sa javí ako moderná a jednoduchá možnosť.

Na WebDav budeme používať Apache httpd. Prečo Apache httpd v roku 2020, a nie nginx?

Chceme používať automatizované prostriedky na zostavenie Nginx + moduly (napríklad Webdav).

Máme projekt na zostavenie Nginx + moduly — Nginx-builder. Ak použijeme nginx + wevdav na nahrávanie súborov, potrebujeme modul nginx-dav-ext-module. Pri pokuse zostaviť a použiť Nginx s nginx-dav-ext-module s pomocou Nginx-builder dostaneme chybu Used by http_dav_module instead of nginx-dav-ext-module. Taká istá chyba bola uzavretá v lete nginx: [emerg] unknown directive dav_methods.

Robil som Pull request Add check git_url for embedded, refactored —with-{}_module a if module == "http_dav_module" append —with. Ale neboli prijaté.

Konfigurácia 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

Ostatnú konfiguráciu Apache httpd predpokladám, že urobíte sami.

Nginx pred Apache httpd

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

Konfigurácia nginx-front.conf. Ostatnú konfiguráciu nginx predpokladám, že urobíte sami.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name váš-virtuálny-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;
    }
}

Nahrávanie súborov cez WebDav

Nahrávanie rpm je veľmi jednoduché.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://váš-virtuálny-host/rpm/

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster