Debmirror

De Wiki doc

Debmirror permet de réaliser un miroir des dépôts Debian en utilisant le protocole Rsync à l'image de Ftpsync. La différence majeure qui le distingue de celui-ci est sa capacité à sélectionner les branches à synchroniser. Il n'est donc pas destiné à faire un miroir complet du dépôt distant (même s'il le permet tout à fait). L'outil est plus adapté à la mise à disposition des paquets nécessaires au fonctionnement des machines de votre réseau local. Il leur permettra d'avoir accès aux paquets dont elles ont besoin sans avoir à interroger de serveur sur Internet. De par sa capacité à discriminer les branches à copier, il est plus économe en espace disque ainsi qu'en bande passante lors des opérations de synchronisation. À titre d'exemple, voici la place occupée par le résultat de ce document au 29/12/2020 :

root@debmirror:~# du -hs /var/www/dépôts/*
152G	/var/www/dépôts/debian
11G	/var/www/dépôts/debian-security

Installation et préparation

Comme à notre habitude lors de la mise en place de ce type d'outil, nous mettrons à disposition les paquets téléchargés via Apache2 et automatiserons la synchronisation avec Cron.

Préparation de l'environnement

Installation des dépendances

apt install --no-install-recommends apache2 debmirror debian-keyring cron

Création d'un utilisateur dédié à la synchronisation

useradd --system --home-dir /var/www/dépôts/ --user-group debmirror

Création des répertoires d'accueil

mkdir -p /var/www/dépôts/{debian,debian-security} /var/log/debmirror/

Configuration d'Apache

Création de l'hôte virtuel

vim /etc/apache2/sites-available/debmirror.conf
<VirtualHost *:80>

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/dépôts/

	<Directory /> 
	      Options FollowSymLinks 
	      AllowOverride none 
	      Order allow,deny 
	      Allow from all
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error-debmirror.log
	CustomLog ${APACHE_LOG_DIR}/access-debmirror.log combined

</VirtualHost>

Désactivation de l'hôte virtuel par défaut

a2dissite 000-default.conf

Activation du nouveau et rechargement du service

a2ensite debmirror.conf
systemctl reload apache2.service

Configuration de debmirror

L'outil a besoin d'un fichier de configuration par dépôt à synchroniser. Nous en créerons donc deux : un pour le dépôt debian, l'autre pour debian-security, le tout en amd64. Je ne synchroniserai que les branches main, contrib, non-free et main/debian-installer pour le premier dépôt ainsi que buster/updates pour le deuxième.

vim /usr/local/bin/debmirror_debian
#!/bin/bash

# Définition des variables pour Debian
hote="ftp.fr.debian.org"
racine="debian/"
methode="rsync"		# au choix ftp|http|https|rsync

distributions="buster,buster-updates,sid"
sections="main,contrib,non-free,main/debian-installer"
				 
cible="/var/www/dépôts/debian/"
architecture="amd64"	# « i386,amd64 »

jour_semaine=$(date +%u)

echo "--- Début de la synchronisation le $(date +%x) à $(date +%T) ---" > /var/log/debmirror/debmirror."${jour_semaine}".log

# Commande pour synchroniser le miroir avec Debian
/usr/bin/debmirror --nosource --passive --method="${methode}" \
--root="${racine}" --dist="${distributions}" --host="${hote}" \
--section="${sections}" --arch="${architecture}" "${cible}" \
--getcontents --keyring /usr/share/keyrings/debian-archive-keyring.gpg \
--i18n --postcleanup --progress --rsync-extra=doc,tools --diff=none  >> /var/log/debmirror/debmirror."${jour_semaine}".log

# Commande pour obtenir le sous répertoire "installer-amd64" (facultatif). Je n'ai pas trouvé une autre façon de faire...
rsync -a "${hote}"::debian/dists/buster/main/installer-amd64 "${cible}"/dists/buster/main/

echo "--- Fin de la synchronisation à $(date +%T) ---" >> /var/log/debmirror/debmirror."${jour_semaine}".log
vim /usr/local/bin/debmirror_debian-security
#!/bin/bash

# Définition des variables pour Debian
hote="ftp.fr.debian.org"
racine="debian-security"
methode="rsync"

distributions="buster/updates"
sections="main,contrib,non-free"

cible="/var/www/dépôts/debian-security/"
architecture="amd64"

jour_semaine=$(date +%u)

echo "--- Début de la synchronisation le $(date +%x) à $(date +%T) ---" > /var/log/debmirror/debmirror-security."${jour_semaine}".log

# Commande pour synchroniser le mirroir avec Debian
/usr/bin/debmirror --nosource --passive --method="${methode}" \
--root="${racine}" --dist="${distributions}" --host="${hote}" \
--section="${sections}" --arch="${architecture}" "${cible}" \
--getcontents --keyring /usr/share/keyrings/debian-archive-keyring.gpg \
--i18n --postcleanup --progress --diff=none  >> /var/log/debmirror/debmirror-security."${jour_semaine}".log

echo "--- Fin de la synchronisation à $(date +%T) ---" >> /var/log/debmirror/debmirror-security."${jour_semaine}".log

Attribution des droits

chmod ug+x /usr/local/bin/debmirror_debian /usr/local/bin/debmirror_debian-security
chown -R debmirror:debmirror /var/www/dépôts /var/log/debmirror /usr/local/bin/debmirror_debian*

Synchronisation du miroir

Il convient désormais de lancer une synchronisation. Prennez en compte que cette étape va prendre un certain temps au vu de la quantité de données à rappatrier. Sachez également que le serveur ftp.fr.debian.org limite les téléchargements aux environs de 10Mo/s.

Dépôt debian

su - debmirror -c '/usr/local/bin/debmirror_debian'

Dépôt debian-security

su - debmirror -c '/usr/local/bin/debmirror_debian-security'

Automatisation

Afin de maintenir un miroir à jour, la mise en place d'une synchronisation automatique et périodique s'impose. Les dépôts Debian se répliques quatres fois par jours. Nous en ferrons de même.

Création de la crontab

crontab -e -u debmirror
00 4,10,16,22 * * * /usr/local/bin/debmirror_debian 2>&1
10 4,10,16,22 * * * /usr/local/bin/debmirror_debian-security 2>&1

Sources