Repositório rpm simples usando Inotify e webdav

Neste post, vamos discutir o armazenamento de artefatos rpm usando um simples script com inotify + createrepo. O upload dos artefatos é feito através de webdav usando o apache httpd. Por que o apache httpd será discutido mais adiante no post.

Portanto, a solução deve atender aos seguintes requisitos para a organização de apenas um repositório RPM:

  • Gratuito

  • Disponibilidade do pacote no repositório alguns segundos após o upload no armazenamento de artefatos.

  • Fácil de instalar e manter

  • Capacidade de alta disponibilidade (high availability)

    Por que não SonaType Nexus ou Pulp:

  • Armazenamento de SonaType Nexus ou Pulp muitos tipos de artefatos leva ao fato de que SonaType Nexus ou Pulp se tornam um único ponto de falha.

  • Alta disponibilidade (high availability) em SonaType Nexus é pago.

  • Pulp me parece uma solução excessivamente complicada.

  • Os artefatos em SonaType Nexus são armazenados em blob. Em caso de uma queda repentina de energia, você não conseguirá recuperar o blob, a menos que tenha um backup. Nós tivemos esse erro: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Erro durante a leitura de dados para o arquivo 'privilege_5.pcl' 1ª tentativa [java.io](http://java.io/).IOException: Endereço incorreto. O blob não foi recuperado.

Código fonte

→ O código fonte está disponível aqui

O script principal é assim:

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

Instalação

Inotify-createrepo funciona apenas no CentOS 7 ou superior. No CentOS 6 não consegui fazê-lo funcionar.

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

Configuração

Por padrão, inotify-createrepo monitora o diretório /var/www/repos/rpm-repo/.

Este diretório pode ser alterado no arquivo /etc/inotify-createrepo.conf.

Uso

Ao adicionar qualquer arquivo ao diretório /var/www/repos/rpm-repo/ inotifywait criará um arquivo /tmp/need_create. A função run_createrepo é executada em um loop infinito e monitora o arquivo /tmp/need_create. Se o arquivo existir, inicia-se createrepo --update.

O arquivo terá a seguinte entrada:

/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

Capacidade de alta disponibilidade (high availability)

Para criar alta disponibilidade (high availability) a partir da solução existente, acho que podemos usar 2 servidores, Keepalived para HA e Lsyncd para sincronização de artefatos. Lsyncd é um daemon que monitora alterações em um diretório local, agrega-as e, após um determinado tempo, inicia o rsync para sincronizá-las. Detalhes e configuração estão descritos no post "Sincronização rápida de um bilhão de arquivos".

WebDav

Os arquivos podem ser carregados de várias maneiras: SSH, NFS, WebDav. O WebDav parece uma opção moderna e simples.

Para o WebDav, usaremos o Apache httpd. Por que Apache httpd em 2020, e não nginx?

Deseja usar ferramentas automatizadas para compilar Nginx + módulos (por exemplo, Webdav).

Há um projeto para compilar Nginx + módulos — Nginx-builder. Se usar nginx + wevdav para carregar arquivos, será necessário o módulo nginx-dav-ext-module. Ao tentar compilar e usar o Nginx com nginx-dav-ext-module com Nginx-builder teremos um erro Used by http_dav_module instead of nginx-dav-ext-module. O mesmo erro foi fechado no verão nginx: [emerg] unknown directive dav_methods.

Eu fiz um Pull request Adicione uma verificação git_url para embutido, reformulado —with-{}_module e se module == "http_dav_module" adicione —with. Mas não foi aceito.

Configuração webdav.conf

DavLockDB /var/www/html/DavLock

    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
    
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted

A configuração restante do Apache httpd acho que você fará sozinho.

Nginx antes do Apache httpd

Ao contrário do Apache, o Nginx usa um modelo de processamento de solicitações baseado em eventos, o que permite que um único processo do servidor HTTP lide com qualquer número de clientes. Você pode usar o nginx e reduzir a carga no servidor.

Configuração nginx-front.conf. Acho que você fará a configuração restante do nginx sozinho.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name seu-host-virtual;
    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;
    }
}

Carregamento de arquivos via WebDav

O carregamento rpm é muito simples.

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

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster