Inotify və webdav istifadə edərək sadə rpm deposu

Bu yazıda sadə inotify + createrepo skriptindən istifadə edərək rpm artefakt anbarına baxacağıq. Artefaktlar apache httpd istifadə edərək webdav vasitəsilə yüklənir. Niyə apache httpd yazının sonuna yaxın yazılacaq.

Beləliklə, həll yalnız RPM yaddaşının təşkili üçün aşağıdakı tələblərə cavab verməlidir:

  • pulsuz

  • Artefakt anbarına yükləndikdən bir neçə saniyə sonra paketin repozitoriyada mövcudluğu.

  • Quraşdırmaq və saxlamaq asandır

  • Yüksək əlçatanlıq imkanı

    Niyə də yox SonaType Nexus və ya Lət:

  • Saxlama yeri SonaType Nexus və ya Lət bir çox əsər növlərinin olmasına gətirib çıxarır SonaType Nexus və ya Lət tək uğursuzluq nöqtəsinə çevrilir.

  • Yüksək əlçatanlıq SonaType Nexus ödənilir.

  • Lət Mənə həddən artıq dizayn edilmiş bir həll kimi görünür.

  • Əsərlər SonaType Nexus blobda saxlanılır. Qəfil elektrik kəsilməsi halında, ehtiyat nüsxəniz yoxdursa, blob bərpa edə bilməyəcəksiniz. Bizdə bu xəta var: 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 heç vaxt bərpa olunmadı.

Mənbə kodu

→ Mənbə kodu yerləşir burada

Əsas skript belə 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 &

Quraşdırma

inotify-createrepo yalnız CentOS 7 və ya daha yüksək versiyalarda işləyir. Onu CentOS 6-da işə salmaq mümkün olmadı.

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

Konfiqurasiya

Varsayılan olaraq inotify-createrepo kataloqa nəzarət edir /var/www/repos/rpm-repo/.

Bu qovluğu faylda dəyişə bilərsiniz /etc/inotify-createrepo.conf.

Istifadə

Kataloqa hər hansı bir fayl əlavə edərkən /var/www/repos/rpm-repo/ inotifywait fayl yaradacaq /tmp/need_create. run_createrepo funksiyası sonsuz döngədə işləyir və fayla nəzarət edir /tmp/need_create. Fayl varsa, işə salın createrepo --update.

Faylda bir giriş görünəcək:

/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üksək əlçatanlıq imkanı

Mövcud həlldən yüksək əlçatanlıq əldə etmək üçün məncə, HA üçün Keepalived və artefakt sinxronizasiyası üçün Lsyncd olmaqla 2 serverdən istifadə edə bilərsiniz. Lsyncd - yerli qovluqdakı dəyişiklikləri izləyən, onları birləşdirən və müəyyən müddətdən sonra rsync onları sinxronlaşdırmağa başlayan demon. Təfərrüatlar və parametrlər postda təsvir edilmişdir "Bir milyard faylın sürətli sinxronizasiyası".

VebDav

Faylları yükləməyin bir neçə yolu var: SSH, NFS, WebDav. WebDav müasir və sadə seçim kimi görünür.

WebDav üçün biz Apache httpd istifadə edəcəyik. Niyə nginx deyil, 2020-ci ildə Apache httpd?

Nginx + modullarının qurulması üçün avtomatlaşdırılmış vasitələrdən istifadə etmək istərdim (məsələn, Webdav).

Nginx + modullarının qurulması üçün bir layihə var - nginx qurucusu. Faylları yükləmək üçün nginx + wevdav istifadə edirsinizsə, onda sizə modul lazımdır nginx-dav-ext-modulu. Nginx qurmağa və istifadə etməyə çalışarkən nginx-dav-ext-modulu vasitəsilə nginx qurucusu xəta alacağıq Nginx-dav-ext-module əvəzinə http_dav_module tərəfindən istifadə olunur. Eyni səhv yayda bağlandı nginx: [emerg] naməlum direktiv dav_methods.

Mən çəkmə tələbi etdim Daxili, yenidən işlənmiş --with-{}_module üçün yoxlama git_url əlavə edin и modulu == "http_dav_module" əlavə edin --ile. Amma qəbul olunmadılar.

konfiqurasiya 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>

Düşünürəm ki, siz Apache httpd konfiqurasiyasının qalan hissəsini özünüz edəcəksiniz.

Nginx Apache qarşısında httpd

Apache-dən fərqli olaraq, Nginx hadisəyə əsaslanan sorğu emalı modelindən istifadə edir, yəni istənilən sayda müştəri üçün yalnız bir HTTP server prosesi tələb olunur. Siz nginx-dən istifadə edə və server yükünü azalda bilərsiniz.

nginx-front.conf konfiqurasiyası. Düşünürəm ki, nginx konfiqurasiyasının qalan hissəsini özünüz edəcəksiniz.

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 vasitəsilə faylların yüklənməsi

rpm yükləmək çox asandır.

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

Mənbə: www.habr.com

Добавить комментарий