Kho lưu trữ rpm đơn giản sử dụng Inotify và webdav

Trong bài đăng này, chúng ta sẽ xem xét kho lưu trữ tạo tác rpm bằng cách sử dụng tập lệnh inotify + createrepo đơn giản. Các vật phẩm được tải lên qua webdav bằng apache httpd. Tại sao apache httpd sẽ được viết ở cuối bài.

Vì vậy, giải pháp phải đáp ứng các yêu cầu sau để chỉ tổ chức lưu trữ RPM:

  • Miễn phí

  • Tính khả dụng của gói trong kho lưu trữ vài giây sau khi tải lên kho lưu trữ hiện vật.

  • thật dễ dàng để cài đặt và bảo trì

  • Khả năng sẵn sàng cao

    Tại sao không SonaType Nexus hoặc Pulp:

  • Lưu trữ trong SonaType Nexus hoặc Pulp nhiều loại hiện vật dẫn đến thực tế là SonaType Nexus hoặc Pulp trở thành một điểm thất bại duy nhất.

  • Tính khả dụng cao trong SonaType Nexus được thanh toán.

  • Pulp Có vẻ như một giải pháp được thiết kế quá mức đối với tôi.

  • hiện vật trong SonaType Nexus được lưu trữ trong blob. Trong trường hợp mất điện đột ngột, bạn sẽ không thể khôi phục blob nếu không có bản sao lưu. Chúng tôi gặp lỗi này: 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 không bao giờ được phục hồi.

Mã nguồn

→ Mã nguồn được đặt đây

Kịch bản chính trông như thế này:

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

Cài đặt

inotify-createrepo chỉ hoạt động trên CentOS 7 trở lên. Không thể làm cho nó hoạt động trên CentOS 6.

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

Cấu hình

Theo mặc định, inotify-createrepo giám sát một thư mục /var/www/repos/rpm-repo/.

Bạn có thể thay đổi thư mục này trong tệp /etc/inotify-createrepo.conf.

Sử dụng

Khi thêm bất kỳ tệp nào vào một thư mục /var/www/repos/rpm-repo/ inotifywait sẽ tạo một tệp /tmp/need_create. Hàm run_createrepo chạy trong một vòng lặp vô hạn và theo dõi tệp /tmp/need_create. Nếu tệp tồn tại, sau đó chạy createrepo --update.

Một mục nhập sẽ xuất hiện trong tệp:

/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

Khả năng sẵn sàng cao

Để tạo tính sẵn sàng cao cho một giải pháp hiện có, tôi nghĩ bạn có thể sử dụng 2 máy chủ, Keepalived cho HA và Lsyncd để đồng bộ hóa tạo tác. Lsyncd - một trình nền theo dõi các thay đổi trong thư mục cục bộ, tổng hợp chúng và sau một thời gian nhất định, rsync bắt đầu đồng bộ hóa chúng. Chi tiết và cài đặt được mô tả trong bài đăng "Đồng bộ hóa nhanh một tỷ tệp".

WebDav

Có một số cách để tải tệp lên: SSH, NFS, WebDav. WebDav dường như là một lựa chọn hiện đại và đơn giản.

Đối với WebDav, chúng tôi sẽ sử dụng Apache httpd. Tại sao Apache httpd vào năm 2020 mà không phải nginx?

Tôi muốn sử dụng các công cụ tự động để xây dựng các mô-đun Nginx + (ví dụ: Webdav).

Có một dự án xây dựng các mô-đun Nginx + - trình xây dựng nginx. Nếu bạn sử dụng nginx + wevdav để tải tệp lên, thì bạn cần một mô-đun nginx-dav-ext-mô-đun. Khi cố gắng xây dựng và sử dụng Nginx với nginx-dav-ext-mô-đun bằng các phương tiện trình xây dựng nginx chúng tôi sẽ nhận được một lỗi Được sử dụng bởi http_dav_module thay vì nginx-dav-ext-module. Lỗi tương tự đã bị đóng vào mùa hè nginx: [xuất hiện] chỉ thị không xác định dav_methods.

Tôi đã thực hiện một yêu cầu kéo Thêm kiểm tra git_url để nhúng, tái cấu trúc --with-{}_module и nếu mô-đun == "http_dav_module" nối thêm --with. Nhưng họ đã không được chấp nhận.

cấu hình 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>

Tôi nghĩ bạn sẽ tự mình thực hiện phần còn lại của cấu hình Apache httpd.

Nginx trước Apache httpd

Không giống như Apache, Nginx sử dụng mô hình xử lý yêu cầu dựa trên sự kiện, có nghĩa là chỉ cần một quy trình máy chủ HTTP cho bất kỳ số lượng máy khách nào. Bạn có thể sử dụng nginx và giảm tải máy chủ.

cấu hình nginx-front.conf. Tôi nghĩ bạn sẽ tự mình thực hiện phần còn lại của cấu hình 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;
    }
}

Tải xuống tệp qua WebDav

Tải xuống rpm rất dễ dàng.

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

Nguồn: www.habr.com

Thêm một lời nhận xét