مخزن rpm ساده با استفاده از Inotify و webdav

در این پست، ما به مخزن آرتیفکت rpm با استفاده از یک اسکریپت ساده inotify + createrepo نگاه می کنیم. مصنوعات از طریق webdav با استفاده از apache httpd آپلود می شوند. چرا apache httpd در انتهای پست نوشته خواهد شد.

بنابراین، راه حل باید الزامات زیر را برای سازماندهی تنها ذخیره سازی RPM برآورده کند:

  • رایگان

  • در دسترس بودن بسته در مخزن چند ثانیه پس از آپلود در مخزن مصنوع.

  • نگه داری و نصب آسان

  • توانایی ایجاد در دسترس بودن بالا

    چرا که نه SonaType Nexus یا خمیر کاغذ:

  • ذخیره سازی در SonaType Nexus یا خمیر کاغذ بسیاری از انواع مصنوعات منجر به این واقعیت می شود که SonaType Nexus یا خمیر کاغذ تبدیل به یک نقطه شکست.

  • در دسترس بودن بالا در SonaType Nexus پرداخت شده.

  • خمیر کاغذ به نظر من یک راه حل بیش از حد مهندسی شده است.

  • مصنوعات در SonaType Nexus ذخیره شده در لکه در صورت قطع ناگهانی برق، اگر نسخه پشتیبان نداشته باشید، نمی توانید حباب را بازیابی کنید. ما این خطا را داشتیم: 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 شروع به همگام سازی آنها می کند. جزئیات و تنظیمات در پست توضیح داده شده است "همگام سازی سریع یک میلیارد فایل".

وب داو

چندین راه برای آپلود فایل ها وجود دارد: SSH، NFS، WebDav. WebDav به نظر یک گزینه مدرن و ساده است.

برای WebDav از آپاچی httpd استفاده خواهیم کرد. چرا آپاچی در سال 2020 httpd کرد و نه 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 استفاده می کند. همین باگ در تابستان بسته شد nginx: [emerg] دستورالعمل ناشناخته dav_methods.

من یک درخواست کشش دادم افزودن چک git_url برای جاسازی‌شده، بازسازی‌شده --with-{}_module и if module == "http_dav_module" ضمیمه --with. اما قبول نشدند.

پیکربندی 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 آپاچی را خودتان انجام دهید.

Nginx در مقابل آپاچی 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

اضافه کردن نظر