Création d'un dépÎt RPM simple en utilisant Inotify et WebDAV

Dans ce post, nous examinerons le stockage des artefacts RPM à l'aide d'un simple script avec inotify + createrepo. Le téléchargement des artefacts se fait via WebDAV en utilisant Apache HTTPD. Pourquoi Apache HTTPD sera mentionné plus loin dans le post.

Ainsi, la solution doit répondre aux exigences suivantes pour organiser uniquement un dépÎt RPM :

  • Gratuit

  • DisponibilitĂ© du paquet dans le dĂ©pĂŽt quelques secondes aprĂšs son tĂ©lĂ©chargement dans le stockage des artefacts.

  • Facile Ă  installer et Ă  entretenir

  • PossibilitĂ© de garantir une haute disponibilitĂ©

    Pourquoi pas SonaType Nexus ou Pulp:

  • Le stockage de SonaType Nexus ou Pulp de nombreux types d'artefacts conduit Ă  ce que SonaType Nexus ou Pulp deviennent un point de dĂ©faillance unique.

  • La haute disponibilitĂ© est SonaType Nexus payante.

  • Pulp me semble ĂȘtre une solution trop complexe.

  • Les artefacts dans SonaType Nexus sont stockĂ©s dans un blob. En cas de coupure Ă©lectrique soudaine, vous ne pourrez pas rĂ©cupĂ©rer le blob si vous n'avez pas de sauvegarde. Nous avons rencontrĂ© une telle erreur : ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Erreur lors de la lecture des donnĂ©es pour le fichier 'privilege_5.pcl' 1Ăšre tentative [java.io](http://java.io/).IOException : Mauvaise adresse. Le blob n'a pas pu ĂȘtre rĂ©cupĂ©rĂ©.

Code source

→ Le code source se trouve ici

Le script principal est ainsi conçu :

#!/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 fonctionne uniquement sur CentOS 7 ou version supĂ©rieure. Il n'a pas pu ĂȘtre fait fonctionner sur CentOS 6.

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

Configuration

Par défaut, inotify-createrepo surveille le répertoire /var/www/repos/rpm-repo/.

Ce rĂ©pertoire peut ĂȘtre modifiĂ© dans le fichier /etc/inotify-createrepo.conf.

Utilisation

Lorsqu'un fichier est ajouté dans le répertoire /var/www/repos/rpm-repo/ inotifywait créera un fichier /tmp/need_create. La fonction run_createrepo s'exécute dans une boucle infinie et surveille le fichier /tmp/need_create. Si le fichier existe, alors createrepo --update.

Une entrée apparaßtra dans le fichier :

/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

Possibilité de garantir une haute disponibilité

Pour assurer une haute disponibilitĂ© Ă  partir de la solution existante, je pense que l'on peut utiliser 2 serveurs, Keepalived pour HA et Lsyncd pour la synchronisation des artefacts. Lsyncd — est un dĂ©mon qui surveille les changements dans un rĂ©pertoire local, les agrĂšge, et aprĂšs un certain temps, dĂ©clenche rsync pour leur synchronisation. Les dĂ©tails et la configuration sont dĂ©crits dans le post "Synchronisation rapide d'un milliard de fichiers".

WebDav

Les fichiers peuvent ĂȘtre tĂ©lĂ©chargĂ©s de plusieurs maniĂšres : SSH, NFS, WebDav. WebDav semble ĂȘtre une option moderne et simple.

Pour WebDav, nous allons utiliser Apache HTTPD. Pourquoi Apache HTTPD en 2020 et pas Nginx ?

Il est souhaitable d'utiliser des outils automatisés pour assembler Nginx + modules (par exemple, Webdav).

Il y a un projet pour assembler Nginx + modules — Nginx-builder. Si vous utilisez nginx + webdav pour tĂ©lĂ©charger des fichiers, vous aurez besoin du module nginx-dav-ext-module. Lors de la tentative d'assembler et d'utiliser Nginx avec nginx-dav-ext-module avec l'aide de Nginx-builder nous obtiendrons une erreur UtilisĂ© par http_dav_module au lieu de nginx-dav-ext-module. Une erreur similaire a Ă©tĂ© corrigĂ©e cet Ă©tĂ© nginx: [emerg] directive inconnue dav_methods.

J'ai fait une demande de tirage Ajouter une vĂ©rification de git_url pour intĂ©grĂ©, refactorisĂ© —with-{}_module et si le module == "http_dav_module" ajouter —with. Mais ils ne l'ont pas acceptĂ©.

Configuration de 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

Je pense que vous ferez vous-mĂȘme le reste de la configuration d'Apache httpd.

Nginx avant Apache httpd

Contrairement Ă  Apache, Nginx utilise un modĂšle basĂ© sur les Ă©vĂ©nements pour traiter les requĂȘtes, ce qui nĂ©cessite un seul processus de serveur HTTP pour n'importe quel nombre de clients. Vous pouvez utiliser nginx et rĂ©duire la charge sur le serveur.

Configuration de nginx-front.conf. Je pense que vous ferez vous-mĂȘme le reste de la configuration de nginx.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name votre-hĂŽte-virtuel;
    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;
    }
}

Téléchargement de fichiers via WebDav

Le téléchargement de rpm est trÚs simple.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://votre-hĂŽte-virtuel/rpm/

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster