ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ rpm Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Inotify ΠΈ webdav

Π’ этом постС рассмотрим Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ rpm Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого скрипта с inotify + createrepo. Π—Π°Π»ΠΈΠ²ΠΊΠ° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· webdav ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ apache httpd. ΠŸΠΎΡ‡Π΅ΠΌΡƒ apache httpd Π±ΡƒΠ΄Π΅Ρ‚ написано Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ поста.

Π˜Ρ‚Π°ΠΊ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ cΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ трСбованиям для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ RPM Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°:

  • БСсплатноС

  • Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· нСсколько сСкунд послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ².

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ Π² установкС ΠΈ обслуТивании

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ (high availability)

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ SonaType Nexus ΠΈΠ»ΠΈ Pulp:

  • Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² SonaType Nexus ΠΈΠ»ΠΈ Pulp ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ SonaType Nexus ΠΈΠ»ΠΈ Pulp становятся Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‚ΠΊΠ°Π·Π°.

  • Высокая Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ (high availability) Π² SonaType Nexus являСтся ΠΏΠ»Π°Ρ‚Π½ΠΎΠΉ.

  • Pulp ΠΌΠ½Π΅ каТСтя пСрСуслоТСнным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

  • АртСфакты Π² 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

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ (high availability)

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ (high availability) ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ рСщСния, Π΄ΡƒΠΌΠ°ΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 2 сСрвСра, Keepalived для HA ΠΈ Lsyncd для синхронизации Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ². Lsyncd β€” Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдит Π·Π° измСнСниями Π² локальной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ…, ΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΡˆΠ΅ΡΡ‚Π²ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ стартуСт rsync для ΠΈΡ… синхронизации. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΈ настройка описана Π² постС "Cкоростная синхронизация ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° Ρ„Π°ΠΉΠ»ΠΎΠ²".

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 ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Used by http_dav_module instead of nginx-dav-ext-module. Вакая ΠΆΠ΅ ошибка Π±Ρ‹Π»Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° Π»Π΅Ρ‚ΠΎΠΌ nginx: [emerg] unknown directive dav_methods.

Π― Π΄Π΅Π»Π°Π» Pull request Add check git_url for embedded, refactored —with-{}_module ΠΈ if module == "http_dav_module" append —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>

ΠžΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ настройку 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

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° rpm ΠΎΡ‡Π΅Π½ΡŒ простая.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ваш-Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ-хост/rpm/

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com