Debian Mirror mit ftpsync

Da ich gerne meine ISO- und blueray-Images von Debian GNU/Linux selbst erstelle, werden bei Benutzung von „jigdo-lite“ alle notwendigen Pakete für das Image von einem Mirror-Server heruntergeladen. Das kann bei einem 25GB blueray-Image sehr lange dauern und viel Datenvolumen erzeugen.

Deshalb betreibe ich einen lokalen Debian Mirror, damit ich die Pakete ganz schnell im lokalen Netzwerk, bestenfalls sogar auf derselben Maschine, abrufen kann. Früher nutzte ich reprepro, um die Debian Pakete für verschiedene Releases lokal bereitzustellen. Aber reprepro hat einige Unterschiede gegenüber ftpsync. Ein Unterschied ist, dass bei reprepro eigene Codenamen und Suites verwendet werden können. ftpsync dagegen nutzt die offizielle Debian Verzeichnisstruktur (debian / debian-archive / debian-security).

ftpsync wird von Debian empfohlen, um einen vollständigen Mirror zu erstellen. So erhält man neben verschiedenen Architekturen auch alle bisher veröffentlichten Codenamen (sid, testing, bullseye, jessie, stretch, etc.).


System Einrichtung

Zuerst habe ich mir das Paket ftpsync installiert

sudo apt-get update && sudo apt-get install ftpsync

Den Mirror, sowie das Handling des ‚Mirrorns‘, möchte ich in unter einem separaten Nutzer durchführen lassen. Deshalb habe ich mir ein neues Nutzerkonto angelegt

sudo useradd -m -r -d /home/mirror -s /bin/bash -C 'Mirror User Account' -U mirror

Der Mirror verbraucht enormen Speicherplatz. Also wird erstmal etwas Speicherplatz zugewiesen und eingerichtet

sudo lvcreate -L 5T -n mirror /dev/raid
sudo mkfs -t btrfs -L mirror /dev/raid/mirror
sudo mkdir /media/raid/mirror
sudo mount /dev/raid/mirror /media/raid/mirror
sudo chown mirror:mirror /media/raid/mirror

Die Daten sollen also unter /media/raid/mirror abgelegt werden und es wurden 5 TB Speicherplatz zugewiesen.


ftpsync Einrichtung

Es ist noch notwendig, ftpsync für den Nutzer „mirror“ einzurichten. Es wird zum Nutzer „mirror“ gewechselt und die Verzeichnisse „.config„, „.config/ftpsync“ und „bin“ erstellt. Dann werden Symlinks angelegt. Der neue Symlink-Name identifiziert das zu ladende Projekt, oder Environment. Das Ziel für die Symlinks ist immer das ftpsync Script unter /usr/bin/ftpsync .

su - mirror
mkdir -p ${HOME}/.config/ftpsync ${HOME}/bin
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-archive
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-cd
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-security

Dann werden noch Konfigurationsdateien benötigt.

cat >${HOME}/.config/ftpsync/ftpsync.debian.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian"
# MAILTO="$LOGNAME"
# HUB=false

RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian"
# RSYNC_USER=
# RSYNC_PASSWORD=

# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb

# ARCH_INCLUDE=
# ARCH_EXCLUDE=

LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true

### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-archive.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-archive"
# MAILTO="$LOGNAME"
# HUB=false

RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-archive"
# RSYNC_USER=
# RSYNC_PASSWORD=

# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb

# ARCH_INCLUDE=
# ARCH_EXCLUDE=

LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true

### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-cd.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-cd"
# MAILTO="$LOGNAME"
# HUB=false

RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-cd"
# RSYNC_USER=
# RSYNC_PASSWORD=

# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb

# ARCH_INCLUDE=
# ARCH_EXCLUDE=

LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true

### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-security.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-security"
# MAILTO="$LOGNAME"
# HUB=false

RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-security"
# RSYNC_USER=
# RSYNC_PASSWORD=

# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb

# ARCH_INCLUDE=
# ARCH_EXCLUDE=

LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true

### EOF

Webserver Einrichtung

Auf die lokalen Repositories und Pakete soll auch zugegriffen werden. Dies soll teilweise auch über das Netzwerk funktionieren. Es wird deshalb NGINX eingesetzt, damit die Daten per HTTP/S erreichbar sind.

sudo apt-get update && sudo apt-get install nginx-light

Jetzt muss noch die NGINX-Konfiguration angelegt und der Dienst neu gestartet werden.

sudo cat >/etc/nginx/sites-available/apt.conf <<### EOF
server {
        listen 0.0.0.0:80;
        listen [::]:80;
        server_name deb.debian.org _;
        root /media/raid/mirror/htdocs;
        index index.html index.htm index.nginx-debian.html;
        location / {
                try_files $uri $uri/ =404;
        }
}

### EOF

sudo ln -s /etc/nginx/sites-available/apt.conf /etc/nginx/sites-enabled/apt.conf
sudo systemctl restart nginx

Die Daten werden jetzt aus dem Internet heruntergeladen und lokal gespeichert. Bei der ersten Einrichtung sollte dies manuell durchgeführt werden. Später kann die Replizierung der Daten auch mit cronjobs automatisiert werden.

su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-archive" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-cd" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-security" - mirror

Wenn die oben stehenden Befehle ausgeführt wurden, können auch die Logfiles beobachtet werden.

tail -F /media/raid/mirror/logs/*

Der Download der Dateien kann, je nach Bandbreite der Anbindung, Stunden, Tage, oder gar Wochen andauern. Schließlich werden auch enorm viele Daten übertragen. Die Projektordner sehen (Stand 9. Mai 2024) folgendermaßen aus

du -h --max-depth=1 /media/raid/mirror/htdocs/
1986 G./debian
1943 G./debian-archive
226 G./debian-cd
251 G./debian-security
4407 G.

Schlussendlich wurden alle Debian Pakete heruntergeladen und ein Cronjob erstellt, damit die notwendigen Kommandos jeden Tag früh morgens ausgeführt werden. Damit bleibt der Mirror in Sync und die Systeme, die auf diesen Mirror zugreifen, erhalten immer aktuelle Pakete.

Damit die Systeme aber auch auf diesen Mirror zugreifen können, muss ein DNS Eintrag, oder ein Eintrag in der lokalen /etc/hosts Datei angelegt werden.