Jednostavni rpm repozitorij koristeći Inotify i webdav

U ovom postu ćemo razmotriti pohranu rpm artefakata pomoću jednostavnog skriptnog rješenja s inotify + createrepo. Učitavanje artefakata vrši se putem webdava koristeći apache httpd. Zašto će apache httpd biti objašnjen bliže kraju posta.

Dakle, rješenje treba zadovoljiti sljedeće zahtjeve za organizaciju isključivo RPM skladišta:

  • Besplatno

  • Dostupnost paketa u repozitoriju nekoliko sekundi nakon učitavanja u skladište artefakata.

  • Jednostavno za instalaciju i održavanje

  • Mogućnost ostvarivanja visoke dostupnosti (high availability)

    Zašto ne SonaType Nexus ili Pulp:

  • Pohrana u SonaType Nexus ili Pulp mnogim vrstama artefakata dovodi do toga da SonaType Nexus ili Pulp postaju jedinstvena točka kvara.

  • Visoka dostupnost (high availability) u SonaType Nexus je plaćena.

  • Pulp Čini mi se prekompliciranim rješenjem.

  • Artefakti u SonaType Nexus se čuvaju u blobu. U slučaju iznenadnog gubitka struje nećete moći obnoviti blob, osim ako nemate backup. Imali smo takvu 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}} Greška tijekom čitanja podataka za datoteku 'privilege_5.pcl' 1. pokušaj [java.io](http://java.io/).IOException: Loša adresa. Blob nikada nije obnovljen.

Izvorni kod

→ Izvorni kod nalazi se 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. Na CentOS 6 nije uspjelo da ga natjeram da radi.

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

Konfiguriranje

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

Ovu direktorij možete promijeniti u datoteci /etc/inotify-createrepo.conf.

Korištenje

Pri dodavanju bilo koje datoteke u direktorij /var/www/repos/rpm-repo/ inotifywait će kreirati datoteku /tmp/need_create. Funkcija run_createrepo pokreće se u beskonačnoj petlji i prati datoteku /tmp/need_create. Ako datoteka postoji, pokreće se createrepo --update.

U datoteci će se pojaviti zapis:

/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 ostvarivanja visoke dostupnosti (high availability)

Da biste ostvarili visoku dostupnost (high availability) iz postojećeg rješenja, mislim da bi mogla 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 pokreće rsync za njihovu sinkronizaciju. Detalji i postavke opisani su u postu "Brza sinkronizacija milijarde datoteka".

WebDav

Datoteke se mogu učitavati na nekoliko načina: SSH, NFS, WebDav. WebDav se čini modernom i jednostavnom opcijom.

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

Želim koristiti automatizirane alate za sastavljanje Nginx + module (na primjer, Webdav).

Imate projekt za izradu Nginx + moduli — Nginx-builder. Ako koristite nginx + wevdav za prijenos datoteka, potreban je modul nginx-dav-ext-module. Pri pokušaju izrade i korištenja Nginxa s nginx-dav-ext-module uz pomoć Nginx-builder dobit ćemo pogrešku Koristi se od http_dav_module umjesto nginx-dav-ext-module. Slična pogreška otklonjena je ljeti nginx: [emerg] nepoznata direktiva dav_methods.

Napravio sam Pull request Dodaj provjeru git_url za umetnute, refaktoriraj —with-{}_module i ako je modul == "http_dav_module" dodaj —with. Ali nisu ga prihvatili.

Konfiguracija 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

Ostalu konfiguraciju Apache httpd mislim da ćete napraviti sami.

Nginx ispred Apache httpd

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

Konfiguracija nginx-front.conf. Ostalu konfiguraciju nginx mislim da ćete napraviti sami.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name vaš-virtualni-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;
    }
}

Prijenos datoteka putem WebDav-a

Prijenos rpm-a je vrlo jednostavan.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://vaš-virtualni-host/rpm/

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster