Un simplu depozit rpm folosind Inotify și webdav

În acest articol, vom analiza stocarea artefactelor RPM folosind un script simplu cu inotify + createrepo. Încărcarea artefactelor se realizează prin webdav utilizând apache httpd. Motivele pentru care apache httpd vor fi menționate mai aproape de sfârșitul articolului.

Așadar, soluția trebuie să răspundă următoarelor cerințe pentru organizarea unui depozit doar de RPM:

  • Gratuit

  • Disponibilitatea pachetului în depozit la câteva secunde după încărcarea în stocul artefactelor.

  • Ușor de instalat și întreținut

  • Capacitatea de a asigura disponibilitate ridicată (high availability)

    De ce nu SonaType Nexus sau Pulp:

  • Stocarea în SonaType Nexus sau Pulp multe tipuri de artefacte duce la faptul că SonaType Nexus sau Pulp devin un singur punct de eșec.

  • Disponibilitatea ridicată (high availability) în SonaType Nexus este plătită.

  • Pulp mi se pare o soluție prea complicată.

  • Artefactele în SonaType Nexus sunt stocate în blob. În caz de întrerupere bruscă a electricității, nu veți putea recupera blob-ul dacă nu aveți un backup. Am avut o eroare de acest fel: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Eroare în timpul citirii datelor pentru fișierul 'privilege_5.pcl' 1-a încercare [java.io](http://java.io/).IOException: adresă greșită. Blob-ul nu a fost recuperat.

Codul sursă

→ Codul sursă se află aici

Scriptul principal arată astfel:

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

Instalare

Inotify-createrepo funcționează doar pe CentOS 7 sau mai recent. Pe CentOS 6 nu am reușit să-l fac să funcționeze.

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

Configurare

În mod implicit, inotify-createrepo monitorizează directorul /var/www/repos/rpm-repo/.

Această directorie poate fi modificată în fișierul /etc/inotify-createrepo.conf.

Utilizare

Atunci când se adaugă orice fișier în director /var/www/repos/rpm-repo/ inotifywait va crea un fișier /tmp/need_create. Funcția run_createrepo se execută într-un ciclu infinit și monitorizează fișierul /tmp/need_create. Dacă fișierul există, se va porni createrepo --update.

În fișier va apărea o înregistrare:

/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

Capacitatea de a asigura disponibilitate ridicată (high availability)

Pentru a asigura disponibilitate ridicată (high availability) din soluția existentă, cred că se pot folosi 2 servere, Keepalived pentru HA și Lsyncd pentru sincronizarea artefactelor. Lsyncd — un daemon care monitorizează modificările din directorul local, le agregă, și după un anumit timp, pornește rsync pentru a le sincroniza. Detalii și configurarea sunt descrise în articolul "Sincronizare rapidă a unui miliard de fișiere".

WebDav

Fișierele pot fi încărcate în mai multe moduri: SSH, NFS, WebDav. WebDav pare o opțiune modernă și simplă.

Pentru WebDav vom folosi Apache httpd. De ce Apache httpd în 2020 și nu nginx?

Dorești să folosești instrumente automatizate pentru a construi Nginx + module (de exemplu, Webdav).

Există un proiect pentru construirea Nginx + module — Nginx-builder. Dacă folosești nginx + webdav pentru a încărca fișiere, ai nevoie de modulul nginx-dav-ext-module. La încercarea de a construi și utiliza Nginx cu nginx-dav-ext-module cu ajutorul Nginx-builder vom primi o eroare Folosit de http_dav_module în loc de nginx-dav-ext-module. Aceeași eroare a fost raportată vara trecută nginx: [emerg] directivă necunoscută dav_methods.

Am făcut o cerere de Pull Adaugă verificarea git_url pentru încorporat, refactorizat —with-{}_module și dacă modulul == "http_dav_module" atașează —with. Dar nu au fost acceptate.

Configurația 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

Cred că restul configurării Apache httpd îl vei face singur.

Nginx înainte de Apache httpd

Spre deosebire de Apache, Nginx folosește un model de evenimente pentru gestionarea cererilor, ceea ce înseamnă că pentru un număr nelimitat de clienți este necesar un singur proces al serverului HTTP. Poți folosi nginx și să reduci încărcarea serverului.

Configurația nginx-front.conf. Cred că restul configurării nginx îl vei face singur.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name numele-tău-virtual;
    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;
    }
}

Încărcarea fișierelor prin WebDav

Încărcarea rpm este foarte simplă.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://numele-tău-virtual/rpm/

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster