Ein einfacher RPM-Repository unter Verwendung von Inotify und WebDAV

In diesem Beitrag betrachten wir die Speicherung von RPM-Artefakten mit einem einfachen Skript unter Verwendung von inotify + createrepo. Das Hochladen der Artefakte erfolgt über WebDAV mit Apache httpd. Warum Apache httpd verwendet wird, wird näher am Ende des Beitrags erläutert.

Daher muss die Lösung folgende Anforderungen für die Organisation eines reinen RPM-Speichers erfüllen:

  • Kostenlos

  • Verfügbarkeit des Pakets im Repository innerhalb von Sekunden nach dem Hochladen in den Artefaktespeicher.

  • Einfach zu installieren und zu warten

  • Möglichkeit zur Schaffung hoher Verfügbarkeit (High Availability)

    Warum nicht SonaType Nexus oder Pulp:

  • Die Speicherung in SonaType Nexus oder Pulp vielen Arten von Artefakten führt dazu, dass SonaType Nexus oder Pulp eine einzige Fehlerstelle entsteht.

  • Hohe Verfügbarkeit (High Availability) in SonaType Nexus ist kostenpflichtig.

  • Pulp Ich halte es für eine übermäßig komplizierte Lösung.

  • Artefakte in SonaType Nexus werden in einem Blob gespeichert. Bei plötzlichem Stromausfall können Sie das Blob nicht wiederherstellen, wenn Sie kein Backup haben. Wir hatten einen solchen Fehler: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fehler beim Datenlesen für die Datei 'privilege_5.pcl' 1. Versuch [java.io](http://java.io/).IOException: Schlechte Adresse. Das Blob konnte nicht wiederhergestellt werden.

Quellcode

→ Der Quellcode befindet sich hier

Das Hauptskript sieht folgendermaßen aus:

#!/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 funktioniert nur auf CentOS 7 oder höher. Auf CentOS 6 konnte ich es nicht zum Laufen bringen.

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

Konfiguration

Standardmäßig überwacht inotify-createrepo das Verzeichnis /var/www/repos/rpm-repo/.

Dieses Verzeichnis kann in der Datei geändert werden. /etc/inotify-createrepo.conf.

Verwendung

Beim Hinzufügen einer Datei in das Verzeichnis /var/www/repos/rpm-repo/ wird inotifywait eine Datei erstellen /tmp/need_create. Die Funktion run_createrepo läuft in einer Endlosschleife und überwacht die Datei /tmp/need_create. Wenn die Datei existiert, wird createrepo --update.

in der Datei ein Eintrag erscheinen:

/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öglichkeit zur Schaffung hoher Verfügbarkeit (High Availability)

Um hohe Verfügbarkeit (High Availability) aus der bestehenden Lösung zu schaffen, denke ich, dass man zwei Server, Keepalived für HA und Lsyncd für die Synchronisierung der Artefakte verwenden kann. Lsyncd ist ein Daemon, der Änderungen im lokalen Verzeichnis überwacht, sie aggregiert und nach einer bestimmten Zeit rsync für die Synchronisierung startet. Details und Konfiguration sind im Beitrag "Schnelle Synchronisierung von einer Milliarde Dateien".

WebDav

Dateien können auf mehreren Wegen hochgeladen werden: SSH, NFS, WebDav. WebDav scheint eine moderne und einfache Option zu sein.

Für WebDav verwenden wir Apache httpd. Warum Apache httpd im Jahr 2020 und nicht nginx?

Es werden automatisierte Mittel zur Erstellung von Nginx + Modulen (z. B. Webdav) gewünscht.

Es gibt ein Projekt zur Erstellung von Nginx + Modulen — Nginx-builder. Wenn Nginx + Webdav zum Hochladen von Dateien verwendet wird, wird das Modul benötigt nginx-dav-ext-module. Bei dem Versuch, Nginx mit nginx-dav-ext-module mit Hilfe von Nginx-builder erhalten wir einen Fehler Verwendet von http_dav_module anstelle von nginx-dav-ext-module. Ein ähnlicher Fehler wurde im Sommer geschlossen nginx: [emerg] unbekannte Direktive dav_methods.

Ich habe einen Pull-Request gemacht Fügen Sie eine Überprüfung von git_url für eingebettete, refaktorisierte —with-{}_module hinzu und wenn modul == "http_dav_module" anhängen —with. Aber sie wurden nicht angenommen.

Webdav.conf Konfiguration

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

Die restliche Apache httpd Konfiguration denke ich, werden Sie selbst erledigen.

Nginx vor Apache httpd

Im Gegensatz zu Apache verwendet Nginx ein ereignisbasiertes Modell zur Bearbeitung von Anfragen, wodurch nur ein HTTP-Server-Prozess für beliebig viele Clients erforderlich ist. Sie können Nginx verwenden und die Last auf dem Server reduzieren.

Konfiguration nginx-front.conf. Die restliche Nginx-Konfiguration denke ich, werden Sie selbst erledigen.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name Ihr-virtueller-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;
    }
}

Dateien über WebDav hochladen

Das Hochladen von RPM ist sehr einfach.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://Ihr-virtueller-Host/rpm/

Quelle: habr.com

60GB SSD 8Gb DDR4