En simpel rpm-repository ved hjælp af Inotify og webdav

I dette indlæg vil vi se på lageret af rpm-artifakter ved hjælp af et simpelt script med inotify + createrepo. Uploaden af artifakter sker via webdav ved brug af apache httpd. Hvorfor apache httpd vil blive nævnt nær slutningen af indlægget.

Så løsningen skal opfylde følgende krav for at organisere et rent RPM-lager:

  • Gratis

  • Tilgængeligheden af pakken i depotet inden for få sekunder efter upload til lageret af artifakter.

  • Nem at installere og vedligeholde

  • Mulighed for at skabe høj tilgængelighed (high availability)

    Hvorfor ikke SonaType Nexus eller Pulp:

  • Lageret i SonaType Nexus eller Pulp mange typer artifakter fører til, at SonaType Nexus eller Pulp bliver et enkelt punkt af svigt.

  • Høj tilgængelighed (high availability) i SonaType Nexus er betalt.

  • Pulp jeg synes det ser ud til at være en overkompliceret løsning.

  • Artifakter i SonaType Nexus opbevares i blob. Ved pludselig strømafbrydelse vil du ikke kunne gendanne blob, medmindre du har en backup. Vi havde en sådan fejl: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fejl under data læsning for fil 'privilege_5.pcl' 1. forsøg [java.io](http://java.io/).IOException: Bad address. Blob blev aldrig gendannet.

Kildekode

→ Kildekoden ligger her

Det primære script ser sådan ud:

#!/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 fungerer kun på CentOS 7 eller derover. På CentOS 6 kunne jeg ikke få det til at fungere.

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

Konfiguration

Som standard overvåger inotify-createrepo mappen /var/www/repos/rpm-repo/.

Denne mappe kan ændres i filen /etc/inotify-createrepo.conf.

Brugen af

Når en hvilken som helst fil tilføjes til mappen /var/www/repos/rpm-repo/ inotifywait vil oprette en fil /tmp/need_create. Funktionen run_createrepo kører i en uendelig løkke og overvåger filen /tmp/need_create. Hvis filen findes, vil der blive startet createrepo --update.

I filen vil der blive tilføjet en post:

/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

Mulighed for at skabe høj tilgængelighed (high availability)

For at skabe høj tilgængelighed (high availability) fra den eksisterende løsning, synes jeg, at det ville være muligt at bruge 2 servere, Keepalived til HA og Lsyncd til synkronisering af artifakter. Lsyncd — en demon, der overvåger ændringer i den lokale mappe, aggregerer dem, og efter et vist tidsrum starter rsync for deres synkronisering. Detaljer og opsætning er beskrevet i indlægget "Hurtig synkronisering af en milliard filer".

WebDav

Filer kan uploades på flere måder: SSH, NFS, WebDav. WebDav virker som en moderne og enkel løsning.

Til WebDav vil vi bruge Apache httpd. Hvorfor Apache httpd i 2020 og ikke nginx?

Det er ønskeligt at bruge automatiserede værktøjer til at bygge Nginx + moduler (f.eks. Webdav).

Der er et projekt til at bygge Nginx + moduler — Nginx-builder. Hvis man bruger nginx + wevdav til at uploade filer, så er modulet nødvendigt nginx-dav-ext-module. Ved forsøg på at samle og bruge Nginx med nginx-dav-ext-module ved hjælp af Nginx-builder får vi en fejl Brugt af http_dav_module i stedet for nginx-dav-ext-module. Den samme fejl blev løst om sommeren nginx: [emerg] ukendt direktiv dav_methods.

Jeg lavede en Pull request Tilføj check git_url for embedded, refactored —with-{}_module og hvis module == "http_dav_module" så tilføj —with. Men de accepterede ikke dem.

Konfigurationsfil 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

Den øvrige konfiguration af Apache httpd tror jeg, du vil klare selv.

Nginx før Apache httpd

I modsætning til Apache bruger Nginx en begivenhedsmæssig model til behandlingen af anmodninger, hvilket betyder, at der kun kræves én HTTP-serverproces til ethvert antal klienter. Du kan bruge nginx og mindske belastningen på serveren.

Konfiguration nginx-front.conf. Den øvrige konfiguration af nginx tror jeg, du vil klare selv.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name din-virtuelle-vært;
    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;
    }
}

Upload af filer gennem WebDav

Upload af rpm er meget enkel.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://din-virtuelle-vært/rpm/

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster