Ein einfacher RPM-Repository mit Inotify und WebDAV

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

Das Lösungskonzept sollte die folgenden Anforderungen zur Erstellung eines reinen RPM-Repositories erfüllen:

  • Kostenlos

  • Verfügbarkeit des Pakets im Repository innerhalb von Sekunden nach dem Upload in das Artefakt-Repository.

  • Einfach zu installieren und zu warten

  • Die Möglichkeit, hohe Verfügbarkeit zu gewährleisten (High Availability)

    Warum nicht SonaType Nexus oder Pulp:

  • Die Speicherung von 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 überkomplizierte Lösung.

  • Artefakte in SonaType Nexus werden als Blob gespeichert. Bei einem plötzlichen Stromausfall können Sie den Blob nicht wiederherstellen, wenn Sie kein Backup haben. Wir hatten diesen 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 Datei 'privilege_5.pcl' 1. Versuch [java.io](http://java.io/).IOException: Schlechte Adresse. Den Blob konnten wir nicht wiederherstellen.

Quellcode

→ Der Quellcode befindet sich hier

Das Hauptskript sieht so 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 von

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.

Nutzung

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

In der Datei wird 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

Die Möglichkeit, hohe Verfügbarkeit zu gewährleisten (High Availability)

Um eine hohe Verfügbarkeit (high availability) aus der bestehenden Lösung zu schaffen, denke ich, dass man 2 Server verwenden kann, Keepalived für HA und Lsyncd zur Synchronisation der Artefakte. Lsyncd — ein Daemon, der Änderungen im lokalen Verzeichnis überwacht, sie aggregiert und nach einer bestimmten Zeit rsync für ihre Synchronisation startet. Details und Einstellungen sind im Post "Schnelle Synchronisation einer Milliarde Dateien".

WebDav

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

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

Es ist wünschenswert, automatisierte Werkzeuge zum Zusammenstellen von Nginx + Modulen (z. B. Webdav) zu nutzen.

Es gibt ein Projekt zur Zusammenstellung von Nginx + Modulen — Nginx-Builder. Wenn Nginx + Webdav zum Hochladen von Dateien verwendet werden, wird das Modul benötigt nginx-dav-ext-module. Bei dem Versuch, Nginx mit nginx-dav-ext-module mit Hilfe von Nginx-Builder bekommen wir einen Fehler Used by http_dav_module instead of nginx-dav-ext-module. Ein ähnlicher Fehler wurde im Sommer geschlossen. nginx: [emerg] unknown directive dav_methods.

Ich habe einen Pull-Request gemacht Füge die Überprüfung git_url für eingebettete, refaktorisierte —with-{}_module hinzu, und wenn das Modul == "http_dav_module" ist, füge —with hinzu. Aber sie wurden nicht akzeptiert.

Konfigurationsdatei 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

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

Nginx vor Apache httpd

Im Gegensatz zu Apache verwendet Nginx ein ereignisgesteuertes Modell zur Verarbeitung von Anfragen, was bedeutet, dass für jede Anzahl von Client-Anfragen nur ein HTTP-Server-Prozess erforderlich ist. Sie können Nginx verwenden und die Serverlast reduzieren.

Nginx-Konfiguration nginx-front.conf. Die restliche Nginx-Konfiguration werden Sie wahrscheinlich selbst vornehmen.

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

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster