Repositori rpm senzill amb Inotify i webdav

En aquesta publicació, veurem un dipòsit d'artefactes rpm mitjançant un senzill script inotify + createrepo. Els artefactes es carreguen mitjançant webdav mitjançant apache httpd. Per què apache httpd s'escriurà al final de la publicació.

Per tant, la solució ha de complir els requisits següents per organitzar només l'emmagatzematge RPM:

  • Gratuït

  • Disponibilitat del paquet al repositori uns segons després de pujar-lo al repositori d'artefactes.

  • Fàcil d'instal·lar i mantenir

  • Capacitat de fer alta disponibilitat

    Perquè no SonaType Nexus o Polpa:

  • Emmagatzematge a SonaType Nexus o Polpa molts tipus d'artefactes condueixen al fet que SonaType Nexus o Polpa convertir-se en un únic punt de fracàs.

  • Alta disponibilitat a SonaType Nexus es paga.

  • Polpa Em sembla una solució exagerada d'enginyeria.

  • Artefactes a SonaType Nexus emmagatzemat en blob. En cas d'un tall sobtat d'energia, no podreu restaurar el blob si no teniu una còpia de seguretat. Hem tingut aquest error: 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 mai es va recuperar.

Codi font

→ Es troba el codi font aquí

L'script principal té aquest aspecte:

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

Instal · lació

inotify-createrepo només funciona amb CentOS 7 o superior. No s'ha pogut fer que funcioni a CentOS 6.

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

Configuració

Per defecte, inotify-createrepo supervisa un directori /var/www/repos/rpm-repo/.

Podeu canviar aquest directori al fitxer /etc/inotify-createrepo.conf.

Utilitzar

Quan s'afegeix qualsevol fitxer a un directori /var/www/repos/rpm-repo/ inotifywait crearà un fitxer /tmp/need_create. La funció run_createrepo s'executa en un bucle infinit i supervisa el fitxer /tmp/need_create. Si el fitxer existeix, executeu-lo createrepo --update.

Apareixerà una entrada al fitxer:

/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

Capacitat de fer alta disponibilitat

Per fer una alta disponibilitat d'una solució existent, crec que podeu utilitzar 2 servidors, Keepalived per a HA i Lsyncd per a la sincronització d'artefactes. Lsyncd - un dimoni que supervisa els canvis al directori local, els agrega i, després d'un temps determinat, rsync comença a sincronitzar-los. Els detalls i la configuració es descriuen a la publicació "Sincronització ràpida de mil milions de fitxers".

webdav

Hi ha diverses maneres de pujar fitxers: SSH, NFS, WebDav. WebDav sembla ser una opció moderna i senzilla.

Per a WebDav, utilitzarem Apache httpd. Per què Apache httpd el 2020 i no nginx?

M'agradaria utilitzar eines automatitzades per crear mòduls Nginx + (per exemple, Webdav).

Hi ha un projecte per construir mòduls Nginx + - nginx-builder. Si utilitzeu nginx + wevdav per carregar fitxers, necessiteu un mòdul nginx-dav-ext-mòdul. Quan intenteu construir i utilitzar Nginx amb nginx-dav-ext-mòdul mitjançant nginx-builder obtindrem un error Utilitzat per http_dav_module en lloc de nginx-dav-ext-module. El mateix error es va tancar a l'estiu nginx: [emerg] directiva desconeguda dav_methods.

Vaig fer una sol·licitud d'extracció Afegiu la comprovació git_url per a --with-{}_module incrustat i refactoritzat и if module == "http_dav_module" afegiu --amb. Però no van ser acceptats.

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>

Crec que fareu la resta de la configuració d'Apache httpd vosaltres mateixos.

Nginx davant d'Apache httpd

A diferència d'Apache, Nginx utilitza un model de processament de sol·licituds basat en esdeveniments, el que significa que només cal un procés de servidor HTTP per a qualsevol nombre de clients. Podeu utilitzar nginx i reduir la càrrega del servidor.

nginx-front.conf config. Crec que fareu la resta de la configuració de nginx vosaltres mateixos.

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;
    }
}

Descàrrega de fitxers mitjançant WebDav

Descarregar rpm és molt fàcil.

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

Font: www.habr.com

Afegeix comentari