Einfaches RPM-Repository mit Inotify und webdav

In diesem Beitrag betrachten wir ein RPM-Artefakt-Repository mithilfe eines einfachen Inotify + Createrepo-Skripts. Artefakte werden über Webdav mit Apache httpd hochgeladen. Warum Apache httpd wird gegen Ende des Beitrags geschrieben.

Daher muss die Lösung die folgenden Anforderungen erfüllen, um nur RPM-Speicher zu organisieren:

  • Kostenlos

  • Verfügbarkeit des Pakets im Repository wenige Sekunden nach dem Hochladen in das Artefakt-Repository.

  • Einfach zu installieren und zu warten

  • Fähigkeit zur Hochverfügbarkeit

    Warum nicht SonaType Nexus oder Fruchtfleisch:

  • Lagerung in SonaType Nexus oder Fruchtfleisch Viele Arten von Artefakten führen dazu SonaType Nexus oder Fruchtfleisch zu einem Single Point of Failure werden.

  • Hohe Verfügbarkeit in SonaType Nexus ist bezahlt.

  • Fruchtfleisch Scheint mir eine überentwickelte Lösung zu sein.

  • Artefakte ein SonaType Nexus im Blob gespeichert. Im Falle eines plötzlichen Stromausfalls können Sie den Blob nicht wiederherstellen, wenn Sie nicht über ein Backup verfügen. 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}} Error during data read for file 'privilege_5.pcl' 1-th attempt [java.io](http://java.io/).IOException: Bad address. Blob wurde nie wiederhergestellt.

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 &

Einstellung

inotify-createrepo funktioniert nur unter CentOS 7 oder höher. Konnte es unter CentOS 6 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

Konfigurieren

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

Sie können dieses Verzeichnis in der Datei ändern /etc/inotify-createrepo.conf.

Verwenden

Beim Hinzufügen einer Datei zu einem Verzeichnis /var/www/repos/rpm-repo/ inotifywait erstellt eine Datei /tmp/need_create. Die Funktion run_createrepo läuft in einer Endlosschleife und überwacht die Datei /tmp/need_create. Wenn die Datei vorhanden ist, führen Sie sie aus createrepo --update.

In der Datei erscheint ein Eintrag:

/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

Fähigkeit zur Hochverfügbarkeit

Um aus einer vorhandenen Lösung eine hohe Verfügbarkeit zu machen, können Sie meiner Meinung nach zwei Server verwenden: Keepalived für HA und Lsyncd für die Artefaktsynchronisierung. Lsyncd – ein Daemon, der Änderungen im lokalen Verzeichnis überwacht, sie aggregiert und nach einer bestimmten Zeit mit der Synchronisierung durch rsync beginnt. Details und Einstellungen sind im Beitrag beschrieben „Schnelle Synchronisierung von einer Milliarde Dateien".

WebDav

Es gibt verschiedene Möglichkeiten, Dateien hochzuladen: 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?

Ich möchte automatisierte Tools zum Erstellen von Nginx+-Modulen verwenden (z. B. Webdav).

Es gibt ein Projekt zum Erstellen von Nginx + Modulen - Nginx-Builder. Wenn Sie Nginx + Wevdav zum Hochladen von Dateien verwenden, benötigen Sie ein Modul nginx-dav-ext-module. Beim Versuch, Nginx mit zu erstellen und zu verwenden nginx-dav-ext-module mittels Nginx-Builder wir erhalten eine Fehlermeldung Wird von http_dav_module anstelle von nginx-dav-ext-module verwendet. Der gleiche Fehler wurde im Sommer geschlossen nginx: [emerg] unbekannte Direktive dav_methods.

Ich habe eine Pull-Anfrage gestellt Fügen Sie check git_url für eingebettetes, umgestaltetes --with-{}_module hinzu и if module == "http_dav_module" append --with. Aber sie wurden nicht akzeptiert.

config webdav.conf

DavLockDB /var/www/html/DavLock
<VirtualHost localhost:80>
    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
    <Directory /var/www/repos/rpm-repo>
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

Ich denke, dass Sie den Rest der Apache-httpd-Konfiguration selbst durchführen werden.

Nginx vor Apache httpd

Im Gegensatz zu Apache verwendet Nginx ein ereignisbasiertes Anforderungsverarbeitungsmodell, was bedeutet, dass für beliebig viele Clients nur ein HTTP-Serverprozess erforderlich ist. Sie können Nginx verwenden und die Serverlast reduzieren.

nginx-front.conf-Konfiguration. Ich denke, Sie werden den Rest der Nginx-Konfiguration selbst vornehmen.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name ваш-виртуальных-хост;
    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;
    }
}

Herunterladen von Dateien über WebDav

Das Herunterladen von rpm ist sehr einfach.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ваш-виртуальный-хост/rpm/

Source: habr.com

Kommentar hinzufügen