Jednoduché úložiště rpm pomocí Inotify a webdav

V tomto příspěvku se podíváme na úložiště artefaktů rpm pomocí jednoduchého skriptu inotify + createrepo. Artefakty se nahrávají přes webdav pomocí apache httpd. Proč apache httpd bude napsáno na konci příspěvku.

Řešení tedy musí splňovat následující požadavky pro organizaci pouze úložiště RPM:

  • Volný

  • Dostupnost balíčku v úložišti několik sekund po nahrání do úložiště artefaktů.

  • Snadná instalace a údržba

  • Schopnost zajistit vysokou dostupnost

    Proč ne SonaType Nexus nebo Dřeň:

  • Skladování v SonaType Nexus nebo Dřeň mnoho druhů artefaktů vede k tomu, že SonaType Nexus nebo Dřeň stát jediným bodem selhání.

  • Vysoká dostupnost v SonaType Nexus je placený.

  • Dřeň Zdá se mi to jako přehnané řešení.

  • Artefakty v SonaType Nexus uloženy v blobu. V případě náhlého výpadku proudu nebudete moci objekt blob obnovit, pokud nemáte zálohu. Měli jsme tuto 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 nebyl nikdy obnoven.

Zdrojový kód

→ Zdrojový kód je umístěn zde

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 nebo vyšším. Nepodařilo se jej zprovoznit na CentOS 6.

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ář v souboru můžete změnit /etc/inotify-createrepo.conf.

Použití

Při přidávání libovolného souboru do adresáře /var/www/repos/rpm-repo/ inotifywait vytvoří soubor /tmp/need_create. Funkce run_createrepo běží v nekonečné smyčce a monitoruje soubor /tmp/need_create. Pokud soubor existuje, spusťte jej 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

Schopnost zajistit vysokou dostupnost

Abyste dosáhli vysoké dostupnosti stávajícího řešení, myslím, že můžete použít 2 servery, Keepalived pro HA a Lsyncd pro synchronizaci artefaktů. Lsyncd - démon, který sleduje změny v lokálním adresáři, agreguje je a po určité době je rsync začne synchronizovat. Podrobnosti a nastavení jsou popsány v příspěvku "Rychlá synchronizace miliardy souborů".

WebDav

Existuje několik způsobů, jak nahrát soubory: SSH, NFS, WebDav. WebDav se zdá být moderní a jednoduchá možnost.

Pro WebDav použijeme Apache httpd. Proč Apache httpd v roce 2020 a ne nginx?

Chtěl bych používat automatizované nástroje pro vytváření modulů Nginx + (například Webdav).

Existuje projekt pro budování modulů Nginx + - nginx-builder. Pokud k nahrávání souborů používáte nginx + wevdav, pak potřebujete modul nginx-dav-ext-module. Při pokusu o sestavení a použití Nginx s nginx-dav-ext-module prostřednictvím nginx-builder dostaneme chybu Používá http_dav_module místo nginx-dav-ext-module. Stejná chyba byla uzavřena v létě nginx: [emerg] neznámá směrnice dav_methods.

Vznesl jsem žádost o stažení Přidejte kontrolní git_url pro vložený, refaktorovaný --with-{}_module и if module == "http_dav_module" append --with. Nebyli ale přijati.

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 zbytek konfigurace Apache httpd uděláte sami.

Nginx před Apache httpd

Na rozdíl od Apache používá Nginx model zpracování požadavků založený na událostech, což znamená, že pro libovolný počet klientů je vyžadován pouze jeden proces HTTP serveru. Můžete použít nginx a snížit zatížení serveru.

Konfigurace nginx-front.conf. Myslím, že zbytek konfigurace nginx udělá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;
    }
}

Stahování souborů přes WebDav

Stahování otáček za minutu je velmi snadné.

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

Zdroj: www.habr.com

Přidat komentář