Depo e thjeshtë rpm duke përdorur Inotify dhe webdav

Në këtë postim, ne do të shikojmë një depo artifakti rpm duke përdorur një skript të thjeshtë inotify + createrepo. Artifaktet ngarkohen përmes webdav duke përdorur apache httpd. Pse apache httpd do të shkruhet në fund të postimit.

Pra, zgjidhja duhet të plotësojë kërkesat e mëposhtme për organizimin e ruajtjes vetëm të RPM:

  • Falas

  • Disponueshmëria e paketës në depo disa sekonda pas ngarkimit në depon e objekteve.

  • Lehtë për t'u instaluar dhe mirëmbajtur

  • Aftësia për të bërë disponueshmëri të lartë

    Pse jo SonaType Nexus ose Tul:

  • Magazinimi në SonaType Nexus ose Tul shumë lloje të artefakteve çon në faktin se SonaType Nexus ose Tul bëhet një pikë e vetme dështimi.

  • Disponueshmëri e lartë në SonaType Nexus paguhet.

  • Tul Më duket si një zgjidhje e mbi-inxhinieruar për mua.

  • Artefakte në SonaType Nexus të ruajtura në blob. Në rast të një ndërprerjeje të papritur të energjisë, nuk do të jeni në gjendje të rivendosni blobin nëse nuk keni një rezervë. Ne patëm këtë gabim: 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 nuk u gjet kurrë.

Kodi i burimit

→ Kodi burimor gjendet këtu

Skenari kryesor duket si ky:

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

Instalim

inotify-createrepo punon vetëm në CentOS 7 ose më të lartë. Nuk mund ta bëja të funksiononte në CentOS 6.

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

Konfigurimi

Si parazgjedhje inotify-createrepo monitoron një direktori /var/www/repos/rpm-repo/.

Ju mund ta ndryshoni këtë direktori në skedar /etc/inotify-createrepo.conf.

Përdorim

Kur shtoni ndonjë skedar në një direktori /var/www/repos/rpm-repo/ inotifywait do të krijojë një skedar /tmp/need_create. Funksioni run_createrepo funksionon në një lak të pafund dhe monitoron skedarin /tmp/need_create. Nëse skedari ekziston, atëherë ekzekutojeni createrepo --update.

Një hyrje do të shfaqet në skedar:

/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

Aftësia për të bërë disponueshmëri të lartë

Për të bërë disponueshmëri të lartë nga një zgjidhje ekzistuese, mendoj se mund të përdorni 2 serverë, Keepalived për HA dhe Lsyncd për sinkronizimin e objekteve. Lsyncd - një demon që monitoron ndryshimet në drejtorinë lokale, i grumbullon ato dhe pas një kohe të caktuar, rsync fillon t'i sinkronizojë ato. Detajet dhe cilësimet përshkruhen në postim "Sinkronizimi i shpejtë i një miliard skedarësh".

webdav

Ka disa mënyra për të ngarkuar skedarë: SSH, NFS, WebDav. WebDav duket të jetë një opsion modern dhe i thjeshtë.

Për WebDav, ne do të përdorim Apache httpd. Pse Apache httpd në 2020 dhe jo nginx?

Do të doja të përdorja mjete të automatizuara për ndërtimin e moduleve Nginx + (për shembull, Webdav).

Ekziston një projekt për ndërtimin e moduleve Nginx + - nginx-ndërtues. Nëse përdorni nginx + wevdav për të ngarkuar skedarë, atëherë ju duhet një modul nginx-dav-ext-moduli. Kur përpiqeni të ndërtoni dhe përdorni Nginx me nginx-dav-ext-moduli me anë të nginx-ndërtues do të marrim një gabim Përdoret nga http_dav_module në vend të nginx-dav-ext-module. I njëjti problem u mbyll gjatë verës nginx: [emerg] direktiva e panjohur dav_methods.

Bëra një kërkesë për tërheqje Shto kontrollin git_url për të integruar, të rifaktoruar --with-{}_module и nëse moduli == "http_dav_module" shtoj --with. Por ata nuk u pranuan.

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

Unë mendoj se ju do ta bëni vetë pjesën tjetër të konfigurimit httpd të Apache.

Nginx përballë Apache httpd

Ndryshe nga Apache, Nginx përdor një model të përpunimit të kërkesave të bazuara në ngjarje, që do të thotë se kërkohet vetëm një proces i serverit HTTP për çdo numër klientësh. Ju mund të përdorni nginx dhe të zvogëloni ngarkesën e serverit.

Konfigurimi nginx-front.conf. Unë mendoj se pjesën tjetër të konfigurimit të nginx do ta bëni vetë.

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;
    }
}

Shkarkimi i skedarëve përmes WebDav

Shkarkimi i rpm është shumë i lehtë.

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

Burimi: www.habr.com

Shto një koment