Jednostavno rpm spremište koristeći Inotify i webdav

U ovom postu ćemo pogledati rpm spremište artefakata koristeći jednostavnu inotify + createrepo skriptu. Artefakti se postavljaju putem webdava koristeći apache httpd. Zašto će apache httpd biti napisan na kraju posta.

Dakle, rješenje mora ispuniti sljedeće zahtjeve za organiziranje samo RPM skladištenja:

  • Besplatno

  • Dostupnost paketa u spremištu nekoliko sekundi nakon učitavanja u spremište artefakata.

  • Jednostavan za instalaciju i održavanje

  • Mogućnost visoke dostupnosti

    Zašto ne SonaType Nexus ili pulpa:

  • Skladištenje u SonaType Nexus ili pulpa mnoge vrste artefakata dovodi do toga da SonaType Nexus ili pulpa postati jedna tačka neuspjeha.

  • Visoka dostupnost u SonaType Nexus se plaća.

  • pulpa Meni se čini kao preterano projektovano rešenje.

  • Artefakti u SonaType Nexus pohranjeno u blob. U slučaju iznenadnog nestanka struje, nećete moći vratiti blob ako nemate rezervnu kopiju. Imali smo ovu grešku: 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 nikada nije pronađen.

Izvor

→ Izvorni kod se nalazi ovdje

Glavna skripta izgleda ovako:

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

postavljanje

inotify-createrepo radi samo na CentOS-u 7 ili novijim. Nisam mogao natjerati da radi 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

Po defaultu inotify-createrepo nadgleda direktorij /var/www/repos/rpm-repo/.

Možete promijeniti ovaj direktorij u datoteci /etc/inotify-createrepo.conf.

Koristite

Prilikom dodavanja bilo koje datoteke u direktorij /var/www/repos/rpm-repo/ inotifywait će kreirati fajl /tmp/need_create. Funkcija run_createrepo radi u beskonačnoj petlji i nadgleda datoteku /tmp/need_create. Ako datoteka postoji, pokrenite createrepo --update.

U datoteci će se pojaviti unos:

/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

Mogućnost visoke dostupnosti

Da biste napravili visoku dostupnost od postojećeg rješenja, mislim da možete koristiti 2 servera, Keepalived za HA i Lsyncd za sinkronizaciju artefakata. Lsyncd - demon koji prati promjene u lokalnom direktoriju, agregira ih i nakon određenog vremena, rsync ih počinje sinkronizirati. Detalji i postavke su opisani u postu"Brza sinhronizacija milijardu fajlova".

webdav

Postoji nekoliko načina za učitavanje datoteka: SSH, NFS, WebDav. Čini se da je WebDav moderna i jednostavna opcija.

Za WebDav ćemo koristiti Apache httpd. Zašto Apache httpd u 2020, a ne nginx?

Želio bih koristiti automatizirane alate za izgradnju Nginx + modula (na primjer, Webdav).

Postoji projekat za izgradnju Nginx + modula - nginx-builder. Ako koristite nginx + wevdav za učitavanje datoteka, onda vam je potreban modul nginx-dav-ext-module. Kada pokušavate da napravite i koristite Nginx sa nginx-dav-ext-module uz pomoć nginx-builder dobićemo grešku Koristi ga http_dav_module umjesto nginx-dav-ext-module. Ista greška je zatvorena tokom ljeta nginx: [emerg] nepoznata direktiva dav_methods.

Napravio sam zahtjev za povlačenjem Dodajte provjeru git_url za ugrađeni, refaktorirani --with-{}_module и if module == "http_dav_module" dodaj --with. Ali nisu prihvaćeni.

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>

Mislim da ćete sami uraditi ostatak Apache httpd konfiguracije.

Nginx ispred Apache httpd

Za razliku od Apachea, Nginx koristi model obrade zahtjeva zasnovan na događajima, što znači da je potreban samo jedan HTTP serverski proces za bilo koji broj klijenata. Možete koristiti nginx i smanjiti opterećenje servera.

nginx-front.conf konfiguracija. Mislim da ćete ostatak nginx konfiguracije uraditi 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;
    }
}

Preuzimanje datoteka putem WebDav-a

Preuzimanje rpm je vrlo jednostavno.

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

izvor: www.habr.com

Dodajte komentar