Simple rpm repository gamit ang Inotify at webdav

Sa post na ito, titingnan natin ang isang rpm artifact repository gamit ang isang simpleng inotify + createrepo script. Ang mga artifact ay ina-upload sa pamamagitan ng webdav gamit ang apache httpd. Bakit isusulat ang apache httpd sa dulo ng post.

Kaya, dapat matugunan ng solusyon ang mga sumusunod na kinakailangan para sa pag-aayos lamang ng imbakan ng RPM:

  • libre

  • Availability ng package sa repository ng ilang segundo pagkatapos mag-upload sa artifact repository.

  • Madaling i-install at mapanatili

  • Kakayahang gumawa ng mataas na kakayahang magamit

    Bakit hindi SonaType Nexus o Sapal:

  • Imbakan sa SonaType Nexus o Sapal maraming uri ng artifact ang humahantong sa katotohanan na SonaType Nexus o Sapal maging isang punto ng kabiguan.

  • Mataas na availability sa SonaType Nexus ay binabayaran.

  • Sapal Tila isang over-engineered na solusyon sa akin.

  • Mga artifact sa SonaType Nexus nakaimbak sa blob. Sa kaganapan ng biglaang pagkawala ng kuryente, hindi mo maibabalik ang blob kung wala kang backup. Nagkaroon kami ng error na ito: 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. Hindi na nakuhang muli ang blob.

Source code

β†’ Ang source code ay matatagpuan dito

Ang pangunahing script ay ganito ang hitsura:

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

Instalasyon

ang inotify-createrepo ay gumagana lamang sa CentOS 7 o mas mataas. Hindi ito magawang gumana sa CentOS 6.

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

Configuration

Bilang default, sinusubaybayan ng inotify-createrepo ang isang direktoryo /var/www/repos/rpm-repo/.

Maaari mong baguhin ang direktoryo na ito sa file /etc/inotify-createrepo.conf.

Gamitin

Kapag nagdaragdag ng anumang file sa isang direktoryo /var/www/repos/rpm-repo/ lilikha ng file ang inotifywait /tmp/need_create. Ang run_createrepo function ay tumatakbo sa isang walang katapusang loop at sinusubaybayan ang file /tmp/need_create. Kung ang file ay umiiral, pagkatapos ay tumakbo createrepo --update.

May lalabas na entry sa file:

/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

Kakayahang gumawa ng mataas na kakayahang magamit

Upang magkaroon ng mataas na kakayahang magamit mula sa isang umiiral na solusyon, sa tingin ko maaari kang gumamit ng 2 server, Keepalived para sa HA at Lsyncd para sa pag-synchronize ng artifact. Lsyncd - isang daemon na sinusubaybayan ang mga pagbabago sa lokal na direktoryo, pinagsasama-sama ang mga ito, at pagkatapos ng isang tiyak na oras, ang rsync ay magsisimulang i-synchronize ang mga ito. Ang mga detalye at setting ay inilarawan sa post na "Mabilis na pag-synchronize ng isang bilyong file".

WebDav

Mayroong ilang mga paraan upang mag-upload ng mga file: SSH, NFS, WebDav. Ang WebDav ay tila isang moderno at simpleng opsyon.

Para sa WebDav, gagamitin namin ang Apache httpd. Bakit Apache httpd sa 2020 at hindi nginx?

Gusto kong gumamit ng mga automated na tool para sa pagbuo ng Nginx + modules (halimbawa, Webdav).

Mayroong isang proyekto para sa pagbuo ng Nginx + modules - nginx-builder. Kung gumagamit ka ng nginx + wevdav upang mag-upload ng mga file, kailangan mo ng isang module nginx-dav-ext-module. Kapag sinusubukang bumuo at gumamit ng Nginx sa nginx-dav-ext-module sa tulong nginx-builder magkakaroon tayo ng error Ginamit ng http_dav_module sa halip na nginx-dav-ext-module. Ang parehong bug ay sarado noong tag-araw nginx: [emerg] hindi kilalang direktiba dav_methods.

Nag-pull request ako Magdagdag ng check git_url para sa naka-embed, refactored --with-{}_module ΠΈ kung ang module == "http_dav_module" idagdag --with. Ngunit hindi sila tinanggap.

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

Sa tingin ko ikaw mismo ang gagawa ng natitirang configuration ng Apache httpd.

Nginx sa harap ng Apache httpd

Hindi tulad ng Apache, ang Nginx ay gumagamit ng modelo ng pagpoproseso ng kahilingan na batay sa kaganapan, na nangangahulugang isang proseso ng HTTP server lamang ang kinakailangan para sa anumang bilang ng mga kliyente. Maaari mong gamitin ang nginx at bawasan ang pag-load ng server.

nginx-front.conf config. Sa tingin ko ikaw mismo ang gagawa ng natitirang configuration ng 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;
    }
}

Nagda-download ng mga file sa pamamagitan ng WebDav

Ang pag-download ng rpm ay napakadali.

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

Pinagmulan: www.habr.com

Magdagdag ng komento