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