ที่เก็บ rpm อย่างง่ายโดยใช้ Inotify และ webdav

ในโพสต์นี้ เราจะดูที่เก็บอาร์ติแฟกต์ rpm โดยใช้สคริปต์ inotify + createrepo แบบธรรมดา อัปโหลดสิ่งประดิษฐ์ผ่าน webdav โดยใช้ apache httpd ทำไม apache httpd จะถูกเขียนต่อท้ายโพสต์

ดังนั้น โซลูชันต้องเป็นไปตามข้อกำหนดต่อไปนี้สำหรับการจัดระเบียบพื้นที่จัดเก็บ RPM เท่านั้น:

  • ฟรี

  • ความพร้อมใช้งานของแพ็กเกจในที่เก็บไม่กี่วินาทีหลังจากอัปโหลดไปยังที่เก็บอาร์ติแฟกต์

  • ติดตั้งและบำรุงรักษาง่าย

  • ความสามารถในการทำให้พร้อมใช้งานสูง

    ทำไมจะไม่ล่ะ โซนาไทป์เน็กซัส หรือ จาว:

  • การจัดเก็บใน โซนาไทป์เน็กซัส หรือ จาว สิ่งประดิษฐ์หลายประเภทนำไปสู่ความจริงที่ว่า โซนาไทป์เน็กซัส หรือ จาว กลายเป็นความล้มเหลวเพียงจุดเดียว

  • ความพร้อมใช้งานสูงใน โซนาไทป์เน็กซัส จ่าย

  • จาว ดูเหมือนจะเป็นโซลูชันที่ได้รับการออกแบบทางวิศวกรรมมากเกินไปสำหรับฉัน

  • สิ่งประดิษฐ์ใน โซนาไทป์เน็กซัส เก็บไว้ในหยด ในกรณีที่ไฟดับกะทันหัน คุณจะไม่สามารถกู้คืน 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. หยดไม่เคยหาย

รหัสที่มา

→ ซอร์สโค้ดตั้งอยู่ ที่นี่

สคริปต์หลักมีลักษณะดังนี้:

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

ความสามารถในการทำให้พร้อมใช้งานสูง

เพื่อให้มีความพร้อมใช้งานสูงจากโซลูชันที่มีอยู่ ฉันคิดว่าคุณสามารถใช้เซิร์ฟเวอร์ 2 เครื่อง คือ Keepalived สำหรับ HA และ Lsyncd สำหรับการซิงโครไนซ์อาร์ติแฟกต์ ซิงค์ - daemon ที่ตรวจสอบการเปลี่ยนแปลงในไดเร็กทอรีโลคัล รวบรวม และหลังจากเวลาหนึ่ง rsync จะเริ่มซิงโครไนซ์การเปลี่ยนแปลงเหล่านั้น รายละเอียดและการตั้งค่าอธิบายไว้ในโพสต์ "การซิงโครไนซ์อย่างรวดเร็วของไฟล์หลายพันล้านไฟล์".

WebDav

มีหลายวิธีในการอัปโหลดไฟล์: SSH, NFS, WebDav WebDav ดูเหมือนจะเป็นตัวเลือกที่ทันสมัยและเรียบง่าย

สำหรับ WebDav เราจะใช้ Apache httpd ทำไม Apache httpd ในปี 2020 ไม่ใช่ nginx

ฉันต้องการใช้เครื่องมืออัตโนมัติสำหรับสร้างโมดูล Nginx + (เช่น Webdav)

มีโครงการสำหรับสร้างโมดูล Nginx + - เครื่องมือสร้าง nginx. หากคุณใช้ nginx + wevdav เพื่ออัปโหลดไฟล์ คุณต้องมีโมดูล nginx-dav-ext-โมดูล. เมื่อพยายามสร้างและใช้ Nginx ด้วย nginx-dav-ext-โมดูล โดย เครื่องมือสร้าง nginx เราจะได้รับข้อผิดพลาด ใช้โดย http_dav_module แทน nginx-dav-ext-module. ข้อผิดพลาดเดียวกันถูกปิดในฤดูร้อน nginx: [ฉุกเฉิน] คำสั่งที่ไม่รู้จัก dav_methods.

ฉันทำคำขอดึง เพิ่มการตรวจสอบ git_url สำหรับการฝัง refactored --with-{}_module и ถ้าโมดูล == "http_dav_module" ผนวก --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

ซึ่งแตกต่างจาก Apache ตรง Nginx ใช้โมเดลการประมวลผลคำขอตามเหตุการณ์ ซึ่งหมายความว่าไคลเอนต์จำนวนเท่าใดก็ได้ที่ต้องการเพียงกระบวนการเซิร์ฟเวอร์ HTTP เดียวเท่านั้น คุณสามารถใช้ nginx และลดภาระของเซิร์ฟเวอร์

การกำหนดค่า nginx-front.conf ฉันคิดว่าคุณจะทำการกำหนดค่า 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;
    }
}

การดาวน์โหลดไฟล์ผ่าน WebDav

การดาวน์โหลด rpm ทำได้ง่ายมาก

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

ที่มา: will.com

เพิ่มความคิดเห็น