Jednostavno rpm spremište koje koristi Inotify i webdav

U ovom ćemo postu pogledati pohranu artefakata rpm pomoću jednostavne skripte s inotify + createrepo. Učitavanje artefakata provodi se putem webdava koristeći apache httpd. Zašto apache httpd bit će napisano pred kraj posta.

Dakle, rješenje mora ispunjavati sljedeće zahtjeve za organiziranje samo RPM pohrane:

  • Besplatno

  • Dostupnost paketa u repozitoriju nekoliko sekundi nakon učitavanja u repozitorij artefakata.

  • Jednostavan za postavljanje i održavanje

  • Sposobnost visoke dostupnosti

    Zašto ne SonaType Nexus ili Pulpa:

  • Skladištenje u SonaType Nexus ili Pulpa mnoge vrste artefakata dovodi do činjenice da SonaType Nexus ili Pulpa postati jedinstvena točka neuspjeha.

  • Visoka dostupnost u SonaType Nexus je plaćeno.

  • Pulpa Čini mi se kao prekomplicirano rješenje.

  • Artefakti u SonaType Nexus pohranjeni su u blob. Ako dođe do iznenadnog nestanka struje, nećete moći vratiti blob ako nemate sigurnosnu 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 obnovljen.

Izvorni kod

→ Nalazi se izvorni kod 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 &

Instalacija

Inotify-createrepo radi samo na CentOS 7 ili novijem. Nije ga moguće natjerati da radi na CentOS-u 6.

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

Konfiguracija

Prema zadanim postavkama, inotify-createrepo nadzire direktorij /var/www/repos/rpm-repo/.

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

Koristiti

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

Unos će se pojaviti u datoteci:

/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

Sposobnost visoke dostupnosti

Da biste napravili visoku dostupnost postojećeg rješenja, mislim da možete koristiti 2 poslužitelja, Keepalived za HA i Lsyncd za sinkronizaciju artefakata. Lsyncd - demon koji prati promjene u lokalnom imeniku, agregira ih, a nakon određenog vremena rsync ih počinje sinkronizirati. Detalji i postavljanje opisani su u postu "Brza sinkronizacija milijarde datoteka".

WebDAV

Datoteke možete učitati na nekoliko načina: SSH, NFS, WebDav. Čini se da je WebDav moderna i jednostavna opcija.

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

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

Postoji projekt za izgradnju Nginx + modula - Nginx-sagraditelj. Ako koristite nginx + wevdav za učitavanje datoteka, potreban vam je modul nginx-dav-ext-modul. Kada pokušavate izgraditi i koristiti Nginx sa nginx-dav-ext-modul uz pomoć Nginx-sagraditelj dobit ćemo grešku Koristi ga http_dav_module umjesto nginx-dav-ext-module. Isti bug je zatvoren u ljeto nginx: [emerg] nepoznata direktiva dav_methods.

Napravio sam Pull zahtjev Dodajte provjeru git_url za ugrađeni, refaktorirani —with-{}_module и if module == "http_dav_module" dodati --with. Ali nisu bili prihvaćeni.

Konfiguracija 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 ostatak Apache httpd podešavanja možete napraviti sami.

Nginx prije Apache httpd

Za razliku od Apachea, Nginx koristi model obrade zahtjeva temeljen na događajima, koji zahtijeva samo jedan proces HTTP poslužitelja za bilo koji broj klijenata. Možete koristiti nginx i smanjiti opterećenje poslužitelja.

Konfiguracija nginx-front.conf. Mislim da ostatak postavki nginxa možete napraviti 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;
    }
}

Prijenos datoteka putem WebDav-a

Učitavanje okretaja u minuti je vrlo jednostavno.

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

Izvor: www.habr.com

Dodajte komentar