En enkel rpm-repository med hjÀlp av Inotify och webdav

I detta inlÀgg kommer vi att gÄ igenom lagring av rpm-artiklar med hjÀlp av ett enkelt skript med inotify + createrepo. uppladdning av artiklar sker via webdav med apache httpd. varför apache httpd kommer att diskuteras lÀngre fram i inlÀgget.

SÄ, lösningen mÄste uppfylla följande krav för att organisa ett Rent RPM-lager:

  • Gratis

  • TillgĂ€nglighet av paketet i repot inom nĂ„gra sekunder efter uppladdning till lagret av artiklar.

  • Enkel att installera och underhĂ„lla

  • Möjlighet till hög tillgĂ€nglighet (high availability)

    Varför inte SonaType Nexus eller Pulp:

  • Lagring av SonaType Nexus eller Pulp mĂ„nga typer av artiklar leder till att SonaType Nexus eller Pulp blir en enda punkt av fel.

  • Hög tillgĂ€nglighet (high availability) i SonaType Nexus Ă€r betald.

  • Pulp seems like an overcomplicated solution.

  • Artiklar i SonaType Nexus lagras i blob. Vid plötsligt strömavbrott kan du inte Ă„terstĂ€lla blob om du inte har en backup. Vi hade ett sĂ„dant fel: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fel vid datalĂ€sning för fil 'privilege_5.pcl' 1:a försök [java.io](http://java.io/).IOException: DĂ„lig adress. Blob blev inte Ă„terstĂ€llt.

KĂ€llkod

→ KĂ€llkoden finns hĂ€r ). Ett typiskt exempel pĂ„ anvĂ€ndning:

Huvudscripten ser ut sÄ hÀr:

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

Installation

Inotify-createrepo fungerar endast pÄ CentOS 7 eller högre. Det gick inte att fÄ det att fungera pÄ CentOS 6.

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

Konfiguration

Som standard övervakar inotify-createrepo katalogen /var/www/repos/rpm-repo/.

Denna katalog kan Àndras i filen /etc/inotify-createrepo.conf.

AnvÀndning

Vid tillÀgg av en fil i katalogen /var/www/repos/rpm-repo/ inotifywait kommer att skapa en fil /tmp/need_create. Funktionen run_createrepo körs i en oÀndlig loop och övervakar filen /tmp/need_create. Om filen finns startas createrepo --update.

I filen kommer en post att tillkomma:

/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

Möjlighet till hög tillgÀnglighet (high availability)

För att göra hög tillgĂ€nglighet (high availability) av den befintliga lösningen, tror jag att man kan anvĂ€nda 2 servrar, Keepalived för HA och Lsyncd för synkronisering av artiklar. Lsyncd — en demon som övervakar Ă€ndringar i den lokala katalogen, aggregerar dem och efter en viss tid startar rsync för att synkronisera dem. Detaljer och instĂ€llning beskrivs i inlĂ€gget "Snabb synkronisering av en miljard filer".

WebDav

Filer kan laddas upp pÄ flera sÀtt: SSH, NFS, WebDav. WebDav verkar vara ett modernt och enkelt alternativ.

För WebDav kommer vi att anvÀnda Apache httpd. Varför Apache httpd 2020 och inte nginx?

Man vill anvÀnda automatiserade verktyg för att bygga Nginx + moduler (t.ex. Webdav).

Det finns ett projekt för att bygga Nginx + moduler — Nginx-byggare. Om man anvĂ€nder nginx + wevdav för att ladda upp filer, sĂ„ behövs modulen nginx-dav-ext-module. Vid försök att bygga och anvĂ€nda Nginx med nginx-dav-ext-module med hjĂ€lp av Nginx-byggare fĂ„r vi ett felmeddelande Used by http_dav_module instead of nginx-dav-ext-module. Samma fel stĂ€ngdes i somras nginx: [emerg] unknown directive dav_methods.

Jag gjorde en Pull request Add check git_url for embedded, refactored —with-{}_module och if module == "http_dav_module" append —with. Men de godkĂ€nde dem inte.

Konfigurering av 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

Jag tror att du fixar resten av Apache httpd-konfigurationen sjÀlv.

Nginx före Apache httpd

Till skillnad frÄn Apache anvÀnder Nginx en hÀndelsebaserad modell för att behandla förfrÄgningar, vilket gör att det endast krÀvs en HTTP-serverprocess för ett oÀndligt antal kunder. Du kan anvÀnda nginx och minska belastningen pÄ servern.

Konfigurering av nginx-front.conf. Jag tror att du fixar resten av nginx-konfigurationen sjÀlv.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name ditt-virtuella-vÀrd;
    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;
    }
}

Ladda upp filer via WebDav

Att ladda upp rpm Àr vÀldigt enkelt.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ditt-virtuella-vÀrd/rpm/

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster