Un mémo sur comment créer un serveur miroir local pour Proxmox avec proxmox-offline-mirror sous Debian.
Cet article fait suite à https://memo-linux.com/creer-un-serveur-miroir-local-sous-debian.
Installer proxmox-offline-mirror sur Debian via apt
- Ajouter le dépôt suivant :
echo "deb http://download.proxmox.com/debian/pbs-client bookworm main" > /etc/apt/sources.list.d/pbs-client.list
Ajouter la clé du dépôt :
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
Mettre à jour les dépôts :
apt update
Installer proxmox-offline-mirror :
apt install proxmox-offline-mirror
Configurer proxmox-offline-mirror pour le dépôt Proxmox
Ajouter un nouveau dépôt
Ici le dépôt ajouté sera celui de Ceph.
proxmox-offline-mirror setup
Choisir : Add new mirror entry
Guided Setup ([yes]): yes
Select distro to mirror : Proxmox Ceph
Select release : Bookworm
Select Ceph release : Reef (18.x)
Select repository variant : No-Subscription repository
Enter mirror ID : ceph_reef_bookworm
Enter (absolute) base path where mirrored repositories will be stored : /srv/mirrors/proxmox/ (dans mon cas)
Should already mirrored files be re-verified when updating the mirror? : yes
Should newly written files be written using FSYNC to ensure crash-consistency? :yes
Config entry ‘ceph_reef_bookworm’ added
Pour finir :Quit
Une fois le dépôt ajouté, créer le snapshot du miroir :
proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'ceph_reef_bookworm'
Configurer le serveur web
Pour rappel, dans mon cas le serveur web est déjà installé. J’ajoute simplement une directive location dans mon fichiers de conf.
Ce qui donne :
nano /etc/nginx/sites-available/mirrors
server {
listen 80;
server_name mirrors.local;
root /srv/mirrors;
index index.html;
location /debian/ {
alias /srv/mirrors/debian/;
autoindex on;
}
location /ubuntu/ {
alias /srv/mirrors/ubuntu/;
autoindex on;
}
location /proxmox/ {
alias /srv/mirrors/proxmox/;
autoindex on;
}
}
systemctl reload nginx
Créer un chemin statique pour les dépôts Proxmox et Ceph
De base, la commande proxmox-offline-mirror créé pour chaque dépôt un snapshot daté du jour.
Un problèmes majeur :
- Sur chaque noeud Proxmox faudra changer le dépôt comme suit :
deb http://mirrors.local/proxmox/pve_bookworm_no_subscription/2024-12-10T10:20:21Z bookworm pve-no-subscription
Pour obtenir qu’un seul référentiel pour le dépôt :
mkdir -p /srv/mirrors/proxmox/latest
Créer le script suivant :
nano /usr/local/bin/sync-proxmox.sh
#!/bin/bash
export ALL_PROXY="http://proxy.local:PORT"
mirror_dir="/srv/mirrors/proxmox"
symlink_dir="/srv/mirrors/proxmox/latest"
proxmox-offline-mirror mirror snapshot create-all
if [ $? -eq 0 ]; then
for dir in "${mirror_dir}"/*; do
if [ -d "$dir" ]; then
dir_name=$(basename "$dir")
if [[ "$dir_name" != "latest" && "$dir_name" != "lost+found" ]]; then
latest_subdir=$(ls -td "$dir"/*/ | head -n 1)
if [ -n "$latest_subdir" ]; then
latest_subdir_name=$(basename "$latest_subdir")
if [ -e "${symlink_dir}/${dir_name}" ]; then
rm -f "${symlink_dir}/${dir_name}"
fi
ln -s "$latest_subdir" "${symlink_dir}/${dir_name}"
fi
fi
fi
done
echo "Done on ${symlink_dir}."
else
echo "Error."
fi
Créer une tache cron pour synchroniser le miroir de Proxmox
crontab -e
0 4 * * * /usr/local/bin/sync-proxmox.sh
Changer les dépôts sur les noeuds Proxmox
- Editer vos fichiers sources.list et changer les url par celle de votre miroir local :
deb http://mirrors.local/debian bookworm main contrib
deb http://mirrors.local/debian bookworm-updates main contrib
deb http://mirrors.local/debian bookworm-security main contrib
deb http://mirrors.local/proxmox/latest/pve_bookworm_no_subscription bookworm pve-no-subscription
deb http://mirrors.local/proxmox/latest/ceph_reef_bookworm no-subscription
Test de l’update :
apt update
Nettoyage des snapshots Proxmox et Ceph
nano /url/local/bin/clean_proxmox_snapshots.sh
#!/bin/bash
# Variables
MIRRORS=(
"/srv/mirrors/proxmox/pve_bookworm_no_subscription"
"/srv/mirrors/proxmox/ceph_reef_bookworm"
)
MAX_AGE=7 # Durée limite (en jours)
# Nettoyage pour chaque miroir
for MIRROR_PATH in "${MIRRORS[@]}"; do
echo "Traitement du miroir : $MIRROR_PATH"
# Nettoyage des snapshots anciens
SNAPSHOTS=$(proxmox-offline-mirror mirror snapshot list --mirror "$MIRROR_PATH" --format json | \
jq -r ".[] | select(.age > $MAX_AGE) | .name")
if [[ -z "$SNAPSHOTS" ]]; then
echo "Aucun snapshot à supprimer pour le miroir : $MIRROR_PATH"
else
echo "Suppression des snapshots suivants pour $MIRROR_PATH :"
echo "$SNAPSHOTS"
for SNAPSHOT in $SNAPSHOTS; do
proxmox-offline-mirror mirror snapshot remove --mirror "$MIRROR_PATH" --snapshot "$SNAPSHOT"
echo "Snapshot supprimé : $SNAPSHOT"
done
# Garbage collection
echo "Exécution de garbage collection (GC) pour le miroir : $MIRROR_PATH"
proxmox-offline-mirror mirror gc --mirror "$MIRROR_PATH"
echo "Garbage collection terminée pour $MIRROR_PATH."
fi
echo "-------------------------------------------"
done
echo "Nettoyage terminé pour tous les miroirs."
Rendre le script exécutable :
chmod +x /url/local/bin/clean_proxmox_snapshots.sh
Créer une tâche cron :
crontabe -e
0 0 * * * /usr/local/bin/clean_proxmox_snapshots.sh
Ressources