Jak stworzyć mirror systemu EuroLinux?

EuroLinux mirroring

Mirror (lustro) to duplikat oryginalnego zasobu, jego identyczna wersja. Mirrory są niezwykle ważne dla zapewnienia wyższej dostępności w przypadku dużego obciążenia, potrzeby tworzenia kopii we własnych zasobach informatycznych czy też ograniczenia ryzyka braku dostępu do oryginału danych. W tym artykule pokażemy, jak wykonać publiczny mirror systemu EuroLinux.

Listę publicznych serwerów lustrzanych systemu EuroLinux można znaleźć na stronie mirrors.cdn.euro-linux.com.

Tworzenie mirrora

Do wykonania mirrora potrzebny jest serwer z dyskiem o rozmiarze co najmniej 400 GB i systemem Enterprise Linux 8. Szczegółowy sposób konfiguracji takiego serwera nie jest zawarty w tym poradniku.

Uwaga: na potrzeby poradnika zakładamy, że serwer-mirror będzie miał swój wolumen dla mirrora zamontowany w katalogu /mnt/mirror-volume/

Na publicznym serwerze instalujemy nginx i certbot:

sudo dnf install -y certbot nginx

Następnie do pliku /etc/nginx/nginx.conf kopiujemy następującą treść:

user       nginx;  ## Default: nobody
worker_processes  5;  ## Default: 1
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

worker_rlimit_nofile 8192;

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  include    mime.types;

  server {
      # Load configuration files for the default server block.
      include /etc/nginx/default.d/*.conf;

      location / {
          alias /mnt/mirror-volume/;
          autoindex on;
      }

      error_page 404 /404.html;
          location = /40x.html {
      }

      error_page 500 502 503 504 /50x.html;
          location = /50x.html {
      }
  }

  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts
 include /etc/nginx/conf.d/*.conf; 
}

Do pliku /etc/nginx/conf.d/mirror.conf kopiujemy poniższą treść:

server {
    listen 443;
    root /mnt/mirror-volume ;
    ssl on;

    ssl_certificate /etc/letsencrypt/live/mirror/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mirror/privkey.pem;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}

oraz do pliku /etc/nginx/conf.d/redirect_to_https.conf następującą treść:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

Zatrzymujemy firewalld i generujemy certyfikat certbotem:

sudo systemctl stop firewalld
sudo certbot certonly --noninteractive --agree-tos --standalone --email <TWÓJ EMAIL> -d <TWOJA NAZWA DOMENY>
sudo ln -sfn /etc/letsencrypt/live/<TWOJA NAZWA DOMENY> /etc/letsencrypt/live/mirror

Włączamy nginx i firewalld:

sudo systemctl enable nginx --now
sudo systemctl enable firewalld --now
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Do /usr/local/bin/mirror.sh dodajemy poniższą treść:

#!/bin/bash

# preparations
mkdir -p /mnt/mirror-volume/dist/eurolinux/server/{6,7}/x86_64/fbi
mkdir -p /mnt/mirror-volume/dist/eurolinux/server/8/{x86_64,aarch64,i386,i686}/{AppStream,BaseOS,PowerTools,HighAvailability,ResilientStorage}
mkdir -p /mnt/mirror-volume/dist/eurolinux/server/9/{x86_64,aarch64,i386,i686}/{AppStream,BaseOS,CRB,HighAvailability,ResilientStorage}

# general
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/TIME /mnt/mirror-volume/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/isos/ /mnt/mirror-volume/isos/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/security/ /mnt/mirror-volume/security/

# EL6
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/6/x86_64/fbi/ /mnt/mirror-volume/dist/eurolinux/server/6/x86_64/fbi/

# EL7
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/7/x86_64/fbi/ /mnt/mirror-volume/dist/eurolinux/server/7/x86_64/fbi/

# EL8
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/x86_64/AppStream/os/ /mnt/mirror-volume/dist/eurolinux/server/8/x86_64/AppStream/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/x86_64/BaseOS/os/ /mnt/mirror-volume/dist/eurolinux/server/8/x86_64/BaseOS/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/x86_64/PowerTools/os/ /mnt/mirror-volume/dist/eurolinux/server/8/x86_64/PowerTools/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/x86_64/HighAvailability/os/ /mnt/mirror-volume/dist/eurolinux/server/8/x86_64/HighAvailability/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/x86_64/ResilientStorage/os/ /mnt/mirror-volume/dist/eurolinux/server/8/x86_64/ResilientStorage/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/aarch64/AppStream/os/ /mnt/mirror-volume/dist/eurolinux/server/8/aarch64/AppStream/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/aarch64/BaseOS/os/ /mnt/mirror-volume/dist/eurolinux/server/8/aarch64/BaseOS/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/aarch64/PowerTools/os/ /mnt/mirror-volume/dist/eurolinux/server/8/aarch64/PowerTools/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/aarch64/HighAvailability/os/ /mnt/mirror-volume/dist/eurolinux/server/8/aarch64/HighAvailability/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/8/aarch64/ResilientStorage/os/ /mnt/mirror-volume/dist/eurolinux/server/8/aarch64/ResilientStorage/os/

# EL9
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/BaseOS/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/BaseOS/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/AppStream/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/AppStream/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/CRB/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/CRB/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/Desktop/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/Desktop/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/HighAvailability/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/HighAvailability/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/x86_64/ResilientStorage/os/ /mnt/mirror-volume/dist/eurolinux/server/9/x86_64/ResilientStorage/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/aarch64/BaseOS/os/ /mnt/mirror-volume/dist/eurolinux/server/9/aarch64/BaseOS/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/aarch64/AppStream/os/ /mnt/mirror-volume/dist/eurolinux/server/9/aarch64/AppStream/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/aarch64/CRB/os/ /mnt/mirror-volume/dist/eurolinux/server/9/aarch64/CRB/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/aarch64/HighAvailability/os/ /mnt/mirror-volume/dist/eurolinux/server/9/aarch64/HighAvailability/os/
rsync -avSH -f 'R .~tmp~' --delete-delay --delay-updates rsync://fbi2.cdn.euro-linux.com/repo/dist/eurolinux/server/9/aarch64/ResilientStorage/os/ /mnt/mirror-volume/dist/eurolinux/server/9/aarch64/ResilientStorage/os/

Finalnie dodajemy następujące wpisy do crontaba:

0 */3 * * * /bin/bash /usr/local/bin/mirror.sh
@monthly certbot certonly --nginx --noninteractive --agree-tos --email <TWÓJ EMAIL> -d <TWOJA NAZWA DOMENY>

Pull Request

Kopiujemy repozytorium mirrorów za pomocą operacji fork i tworzymy pull request, który doda plik YAML opisujący tworzony mirror do katalogu mirrors.d. Jako przykład możemy użyć istniejących plików. Mirror nie musi dostarczać wszystkich protokołów, które dostarcza główny mirror EuroLinux, ale wymagany jest HTTP lub HTTPS.

Plik YAML powinien wyglądać tak jak poniższy szablon:

---
name: <NAZWA MIRRORA>
address:
  http: <ADRES HTTP MIRRORA>
  https: <ADRES HTTPS MIRRORA>
geolocation:
  country: <KRAJ MIRRORA>
update_frequency: 3h
sponsor: <TWOJA NAZWA>
sponsor_url: <TWÓJ URL>
email: <TWÓJ EMAIL>
...

Podsumowanie

Jak widać, wykonanie mirrora systemu EuroLinux jest stosunkowo proste. Należy jednak wziąć pod uwagę aspekty wykraczające poza ten poradnik. Mowa między innymi o wykupieniu i uruchomieniu serwera na danym hostingu oraz jego uprzedniej konfiguracji przed rozpoczęciem procesu mirrorowania.