Jednoduchý rpm repozitář pomocí Inotify a webdav

V tomto příspěvku se budeme věnovat úložišti RPM artefaktů pomocí jednoduchého skriptu s inotify + createrepo. Nahrávání artefaktů se provádí prostřednictvím WebDAV s použitím Apache HTTPD. Proč bude Apache HTTPD popsáno blíže ke konci příspěvku.

Takže řešení by mělo splňovat následující požadavky pro organizaci pouze RPM úložiště:

  • Zdarma

  • Dostupnost balíčku v repozitáři během několika sekund po nahrání do úložiště artefaktů.

  • Jednoduché na instalaci a údržbu

  • Možnost vytvořit vysokou dostupnost (high availability)

    Proč ne SonaType Nexus nebo Pulp:

  • Úložiště v SonaType Nexus nebo Pulp mnohých typech artefaktů vede k tomu, že SonaType Nexus nebo Pulp se stávají jediným bodem selhání.

  • Vysoká dostupnost (high availability) v SonaType Nexus je placená.

  • Pulp připadá mi jako příliš složité řešení.

  • Artefakty v SonaType Nexus jsou uloženy v blobu. Při náhlém výpadku elektrického proudu nebudete schopni obnovit blob, pokud nemáte zálohu. Měli jsme takovou 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 při čtení dat pro soubor 'privilege_5.pcl' 1. pokus [java.io](http://java.io/).IOException: Špatná adresa. Blob nebyl obnoven.

Zdrojový kód

→ Zdrojový kód se nachází tady

Hlavní skript vypadá 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 &

Instalace

Inotify-createrepo funguje pouze na CentOS 7 a vyšších. Na CentOS 6 se ho nepodařilo rozchodit.

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

Konfigurace

Ve výchozím nastavení inotify-createrepo monitoruje adresář /var/www/repos/rpm-repo/.

Tento adresář lze změnit v souboru /etc/inotify-createrepo.conf.

Použití

Při přidání jakéhokoli souboru do adresáře /var/www/repos/rpm-repo/ inotifywait vytvoří soubor /tmp/need_create. Funkce run_createrepo se spouští v nekonečné smyčce a monitoruje soubor /tmp/need_create. Pokud soubor existuje, spustí se createrepo --update.

V souboru se objeví 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

Možnost vytvořit vysokou dostupnost (high availability)

Abychom zajistili vysokou dostupnost (high availability) z existujícího řešení, myslím, že lze použít 2 servery, Keepalived pro HA a Lsyncd pro synchronizaci artefaktů. Lsyncd — démon, který sleduje změny v místním adresáři, agreguje je, a po určitém čase spouští rsync pro jejich synchronizaci. Podrobnosti a nastavení jsou popsány v příspěvku "Rychlá synchronizace milionů souborů".

WebDav

Soubory lze nahrávat několika způsoby: SSH, NFS, WebDav. WebDav se jeví jako moderní a jednoduchá varianta.

Pro WebDav budeme používat Apache HTTPD. Proč Apache HTTPD v roce 2020, a ne Nginx?

Chci využít automatizované nástroje pro sestavení Nginx + moduly (například Webdav).

Existuje projekt na sestavení Nginx + moduly — Nginx-builder. Pokud použijete nginx + wevdav pro nahrávání souborů, potřebujete modul nginx-dav-ext-module. Při pokusu o sestavení a použití Nginx s nginx-dav-ext-module pomocí Nginx-builder obdržíme chybu Používá se http_dav_module místo nginx-dav-ext-module. Stejná chyba byla vyřešena v létě nginx: [emerg] neznámá direktiva dav_methods.

Udělal jsem Pull request Přidat kontrolu git_url pro vestavěné, refaktorizováno —with-{}_module a pokud modul == "http_dav_module" připojit —with. Ale nebyli přijati.

Konfigurační soubor 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í nastavení Apache httpd si myslím, že uděláte sami.

Nginx před Apache httpd

Na rozdíl od Apache, Nginx používá událostní model zpracování požadavků, díky čemuž je pro libovolný počet klientů potřeba pouze jeden proces HTTP serveru. Můžete použít nginx a snížit zátěž serveru.

Konfigurace nginx-front.conf. Ostatní nastavení nginx si myslím, že uděláte sami.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name váš-virtuální-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ávání souborů přes WebDav

Nahrávání rpm je velmi jednoduché.

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

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster