Simple rpm repository using Inotify and webdav

In this post, we’ll look at rpm artifact storage using a simple script with inotify + createrepo. Artifacts are uploaded via webdav using apache httpd. Why apache httpd will be written near the end of the post.


So, the solution should meet the following requirements for organizing only RPM storage:


  • Free


  • Availability of the package in the repository a few seconds after loading into the artifact storage.


  • Easy to install and maintain


  • Ability to make high availability


    Why not SonaType Nexus or Pulp :


  • Storing many types of artifacts in SonaType Nexus or Pulp causes SonaType Nexus or Pulp to become a single point of failure.


  • High availability at SonaType Nexus is paid.


  • Pulp seems like an overdeveloped solution to me.


  • 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


Unlike Apache, Nginx uses an event-driven request processing model, so any number of clients requires only one HTTP server process. You can use nginx and reduce server load.


Config nginx-front.conf. The rest of the nginx configuration, I think you will do it yourself.


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

Upload files via WebDav


Downloading rpm is very simple.


curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://--/rpm/

All Articles