Едноставно складиште за вртежи во минута користејќи Inotify и webdav

Во овој пост, ќе го разгледаме складиштето за артефакти за вртежи во минута користејќи едноставна скрипта inotify + createrepo. Артефактите се поставуваат преку webdav користејќи apache httpd. Зошто apache httpd ќе биде напишано кон крајот на постот.

Значи, решението мора да ги исполнува следниве барања за организирање само складирање RPM:

  • Бесплатно

  • Достапност на пакетот во складиштето неколку секунди по поставувањето во складиштето за артефакти.

  • Лесно се инсталира и одржува

  • Способност да се направи висока достапност

    Зошто да не SonaType Nexus или Евтини:

  • Складирање во SonaType Nexus или Евтини многу видови артефакти води до фактот дека SonaType Nexus или Евтини стане единствена точка на неуспех.

  • Висока достапност во SonaType Nexus се плаќа.

  • Евтини Мене ми изгледа како претерано инженерско решение.

  • Артефакти во SonaType Nexus складирани во 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. Блоб никогаш не беше обновен.

Извор

→ Се наоѓа изворниот код тука

Главното сценарио изгледа вака:

#!/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, ќе користиме Apache httpd. Зошто Apache httpd во 2020 година, а не nginx?

Би сакал да користам автоматизирани алатки за градење Nginx + модули (на пример, Webdav).

Постои проект за изградба на Nginx + модули - nginx-градител. Ако користите nginx + wevdav за прикачување датотеки, тогаш ви треба модул nginx-dav-ext-модул. Кога се обидувате да изградите и користите Nginx со nginx-dav-ext-модул со помош на nginx-градител ќе добиеме грешка Се користи од http_dav_module наместо nginx-dav-ext-module. Истата бубачка беше затворена летото nginx: [emerg] непозната директива dav_methods.

Направив барање за повлекување Додајте проверка git_url за вградени, рефакторирани --with-{}_module и ако модул == "http_dav_module" се додаде --со. Но, тие не беа прифатени.

конфигурација 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 ќе го направите сами.

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

Преземањето вртежи во минута е многу лесно.

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

Извор: www.habr.com

Додадете коментар