Απλό αποθετήριο rpm χρησιμοποιώντας Inotify και webdav

Σε αυτήν την ανάρτηση, θα δούμε ένα αποθετήριο τεχνουργημάτων rpm χρησιμοποιώντας ένα απλό σενάριο inotify + createrepo. Τα τεχνουργήματα μεταφορτώνονται μέσω webdav χρησιμοποιώντας apache httpd. Γιατί το apache httpd θα γραφτεί προς το τέλος της ανάρτησης.

Επομένως, η λύση πρέπει να πληροί τις ακόλουθες απαιτήσεις για την οργάνωση μόνο αποθήκευσης RPM:

  • δωρεάν

  • Διαθεσιμότητα του πακέτου στο αποθετήριο λίγα δευτερόλεπτα μετά τη μεταφόρτωση στο αποθετήριο τεχνουργημάτων.

  • Εύκολο στην εγκατάσταση και συντήρηση

  • Δυνατότητα δημιουργίας υψηλής διαθεσιμότητας

    Γιατί όχι SonaType Nexus ή Πολτός:

  • Αποθήκευση σε SonaType Nexus ή Πολτός πολλά είδη τεχνουργημάτων οδηγεί στο γεγονός ότι SonaType Nexus ή Πολτός γίνει ένα μόνο σημείο αποτυχίας.

  • Υψηλή διαθεσιμότητα σε SonaType Nexus πληρώθηκε.

  • Πολτός Μου φαίνεται υπερβολικά σχεδιασμένη λύση.

  • Τεχνουργήματα σε SonaType Nexus αποθηκευμένο σε blob. Σε περίπτωση ξαφνικής διακοπής ρεύματος, δεν θα μπορείτε να επαναφέρετε το blob εάν δεν έχετε αντίγραφο ασφαλείας. Είχαμε αυτό το σφάλμα: 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 δεν ανακτήθηκε ποτέ.

Κωδικός πηγής

→ Ο πηγαίος κώδικας βρίσκεται εδώ

Το βασικό σενάριο μοιάζει με αυτό:

#!/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 &

Εγκατάσταση

Το inotify-createrepo λειτουργεί μόνο σε CentOS 7 ή νεότερη έκδοση. Δεν ήταν δυνατή η λειτουργία του στο CentOS 6.

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

Διαμόρφωση

Από προεπιλογή, το inotify-createrepo παρακολουθεί έναν κατάλογο /var/www/repos/rpm-repo/.

Μπορείτε να αλλάξετε αυτόν τον κατάλογο στο αρχείο /etc/inotify-createrepo.conf.

Χρήση

Όταν προσθέτετε οποιοδήποτε αρχείο σε έναν κατάλογο /var/www/repos/rpm-repo/ Το inotifywait θα δημιουργήσει ένα αρχείο /tmp/need_create. Η συνάρτηση run_createrepo εκτελείται σε έναν άπειρο βρόχο και παρακολουθεί το αρχείο /tmp/need_create. Εάν το αρχείο υπάρχει, τότε εκτελέστε createrepo --update.

Μια καταχώρηση θα εμφανιστεί στο αρχείο:

/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

Δυνατότητα δημιουργίας υψηλής διαθεσιμότητας

Για να κάνετε υψηλή διαθεσιμότητα από μια υπάρχουσα λύση, νομίζω ότι μπορείτε να χρησιμοποιήσετε 2 διακομιστές, τον Keepalived για HA και τον Lsyncd για συγχρονισμό τεχνουργημάτων. Lsyncd - ένας δαίμονας που παρακολουθεί τις αλλαγές στον τοπικό κατάλογο, τις συγκεντρώνει και μετά από ένα ορισμένο χρονικό διάστημα, το rsync ξεκινά να τις συγχρονίζει. Λεπτομέρειες και ρυθμίσεις περιγράφονται στην ανάρτηση "Γρήγορος συγχρονισμός ενός δισεκατομμυρίου αρχείων".

WebDav

Υπάρχουν διάφοροι τρόποι για να ανεβάσετε αρχεία: SSH, NFS, WebDav. Το WebDav φαίνεται να είναι μια σύγχρονη και απλή επιλογή.

Για το WebDav, θα χρησιμοποιήσουμε το Apache httpd. Γιατί το Apache httpd το 2020 και όχι το nginx;

Θα ήθελα να χρησιμοποιήσω αυτοματοποιημένα εργαλεία για τη δημιουργία μονάδων Nginx + (για παράδειγμα, Webdav).

Υπάρχει ένα έργο για την κατασκευή ενοτήτων Nginx + - nginx-builder. Εάν χρησιμοποιείτε nginx + wevdav για να ανεβάσετε αρχεία, τότε χρειάζεστε μια ενότητα nginx-dav-ext-module. Όταν προσπαθείτε να δημιουργήσετε και να χρησιμοποιήσετε το Nginx με nginx-dav-ext-module μέσω nginx-builder θα λάβουμε σφάλμα Χρησιμοποιείται από το http_dav_module αντί για το nginx-dav-ext-module. Το ίδιο bug έκλεισε το καλοκαίρι nginx: [emerg] άγνωστη οδηγία dav_methods.

Έκανα ένα αίτημα έλξης Προσθήκη ελέγχου git_url για ενσωματωμένο, ανακατασκευασμένο --with-{}_module и if module == "http_dav_module" προσάρτηση --με. Όμως δεν έγιναν δεκτοί.

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>

Νομίζω ότι θα κάνετε μόνοι σας την υπόλοιπη διαμόρφωση httpd του Apache.

Το Nginx μπροστά από τον Apache httpd

Σε αντίθεση με τον Apache, το Nginx χρησιμοποιεί ένα μοντέλο επεξεργασίας αιτημάτων που βασίζεται σε συμβάντα, πράγμα που σημαίνει ότι απαιτείται μόνο μία διεργασία διακομιστή HTTP για οποιονδήποτε αριθμό πελατών. Μπορείτε να χρησιμοποιήσετε το nginx και να μειώσετε το φόρτο του διακομιστή.

διαμόρφωση nginx-front.conf. Νομίζω ότι θα κάνετε μόνοι σας την υπόλοιπη διαμόρφωση του nginx.

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;
    }
}

Λήψη αρχείων μέσω WebDav

Η λήψη των rpm είναι πολύ εύκολη.

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο