Inotify ve webdav kullanan basit rpm deposu

Bu yazıda, basit bir inotify + createrepo betiği kullanarak bir rpm yapı deposuna bakacağız. Eserler, webdav aracılığıyla apache httpd kullanılarak yüklenir. Neden apache httpd yazının sonuna doğru yazılacak.

Bu nedenle, çözüm yalnızca RPM depolamayı düzenlemek için aşağıdaki gereksinimleri karşılamalıdır:

  • Bedava

  • Yapı deposuna yüklendikten birkaç saniye sonra paketin depoda bulunması.

  • Kurulumu ve bakımı kolay

  • Yüksek kullanılabilirlik sağlama yeteneği

    Neden olmasın SonaType Nexus veya Küspe:

  • Depolama alanı SonaType Nexus veya Küspe birçok eser türü şu gerçeğine yol açar: SonaType Nexus veya Küspe tek bir başarısızlık noktası haline gelir.

  • yüksek kullanılabilirlik SonaType Nexus ödenir.

  • Küspe Bana aşırı tasarlanmış bir çözüm gibi görünüyor.

  • eserler SonaType Nexus blob içinde saklanır. Ani bir elektrik kesintisi durumunda, yedeğiniz yoksa blob'u geri yükleyemezsiniz. Bu hatayı aldık: 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 asla kurtarılamadı.

Kaynak kodu

→ Kaynak kodu bulunur burada

Ana komut dosyası şöyle görünür:

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

Montaj

inotify-createrepo yalnızca CentOS 7 veya üzeri sürümlerde çalışır. CentOS 6'da çalışmasını sağlayamadı.

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

Yapılandırma

Varsayılan olarak inotify-createrepo bir dizini izler /var/www/repos/rpm-repo/.

Bu dizini dosyada değiştirebilirsiniz. /etc/inotify-createrepo.conf.

kullanımı

Bir dizine herhangi bir dosya eklerken /var/www/repos/rpm-repo/ inotifywait bir dosya oluşturacak /tmp/need_create. run_createrepo işlevi sonsuz bir döngüde çalışır ve dosyayı izler /tmp/need_create. Dosya varsa, çalıştırın createrepo --update.

Dosyada bir giriş görünecektir:

/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

Yüksek kullanılabilirlik sağlama yeteneği

Mevcut bir çözümden yüksek kullanılabilirlik elde etmek için, HA için Keepalived ve yapı senkronizasyonu için Lsyncd olmak üzere 2 sunucu kullanabileceğinizi düşünüyorum. Lsyncd - yerel dizindeki değişiklikleri izleyen, bunları toplayan ve belirli bir süre sonra rsync bunları eşitlemeye başlayan bir arka plan programı. Ayrıntılar ve ayarlar gönderide açıklanmıştır "Bir milyar dosyanın hızlı senkronizasyonu".

WebDav

Dosya yüklemenin birkaç yolu vardır: SSH, NFS, WebDav. WebDav, modern ve basit bir seçenek gibi görünüyor.

WebDav için Apache httpd kullanacağız. Neden 2020'de Apache httpd ve nginx değil?

Nginx + modülleri oluşturmak için otomatik araçlar kullanmak istiyorum (örneğin, Webdav).

Nginx + modülleri oluşturmak için bir proje var - nginx oluşturucu. Dosyaları yüklemek için nginx + wevdav kullanıyorsanız, bir modüle ihtiyacınız vardır. nginx-dav-ext-modülü. Nginx ile oluşturmaya ve kullanmaya çalışırken nginx-dav-ext-modülü vasıtasıyla nginx oluşturucu bir hata alacağız nginx-dav-ext-module yerine http_dav_module tarafından kullanılır. Aynı böcek yaz aylarında kapatıldı nginx: [acil] bilinmeyen yönerge dav_methods.

çekme isteği yaptım Katıştırılmış, yeniden düzenlenmiş --with-{}_module için git_url kontrolünü ekleyin и if module == "http_dav_module" --ile ekleyin. Ama kabul edilmediler.

yapılandırma 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>

Apache httpd yapılandırmasının geri kalanını kendiniz yapacağınızı düşünüyorum.

Apache httpd'nin önünde Nginx

Apache'den farklı olarak Nginx, olay tabanlı bir istek işleme modeli kullanır; bu, herhangi bir sayıda istemci için yalnızca bir HTTP sunucu işleminin gerekli olduğu anlamına gelir. Nginx kullanabilir ve sunucu yükünü azaltabilirsiniz.

nginx-front.conf yapılandırması. Nginx yapılandırmasının geri kalanını kendiniz yapacağınızı düşünüyorum.

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

Dosyaları WebDav aracılığıyla indirme

Rpm indirmek çok kolaydır.

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

Kaynak: habr.com

Yorum ekle