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
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
apt update
apt install proxmox-offline-mirror
Configurer proxmox-offline-mirror pour le dépôt Proxmox
- Exécuter la commande :
proxmox-offline-mirror setup
- Pour ajouter un nouveau miroir, choisir 0 :
- Pour être guidé, répondre « yes » :
- Choisir le dépôt Proxmox ve :
- Choisir la version Bookworm :
- Choisir la variante « No-Subscription repository » :
- Pour la question suivante « Should missing Debian mirrors for the selected product be auto-added » ayant déjà mon propre miroir local Debian, je répond non :
- Pour l’ID laisser pve_bookworm_no_subscription :
- Entrer le chemin complet du répertoire pour le dépôt, dans mon cas /srv/mirrors/proxmox/ :
- Revérifier ou pas les dépôts une fois mis à jour, dans mon cas je répond : yes
- En cas de plantage, utiliser ou pas FSYNC, je répond : yes
- Retour au menu, choisir 3 pour quitter :
- Une fois que la configuration est terminée, éxécuter la commande :
proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'pve_bookworm_no_subscription'
- Si l’accès au dépôt se fait via un proxy, exporter la variable d’environnement PROXY_ALL avant l’éxécution de la synchro:
export PROXY_ALL="http://proxy.domaine.tld:PORT/"
Ajouter un nouveau dépôt
Ici le dépôt ajouté sera celui de Ceph.
- Exécuter la commande :
proxmox-offline-mirror setup
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 :
- Créer le dossier :
mkdir -p /srv/mirrors/proxmox/latest
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
- Créer une tache cron :
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
apt update
Nettoyage des snapshots Proxmox et Ceph
- pré-requis : installer le paquet jq :
apt install jq
- Créer le script :
nano /url/local/bin/clean_proxmox_snapshots.sh
#!/bin/bash # Variables MIRRORS=( "pve_bookworm_no_subscription" "ceph_reef_bookworm" "debian_bookworm_main" "debian_bookworm_security" "debian_bookworm_updates" ) MAX_AGE=7 # Durée limite (en jours) # Fonction pour convertir une date ISO 8601 en timestamp Unix iso_to_timestamp() { date -d "$1" +%s } # Nettoyage pour chaque miroir for MIRROR_NAME in "${MIRRORS[@]}"; do echo "Traitement du miroir : $MIRROR_NAME" # Liste des snapshots du miroir SNAPSHOTS=$(proxmox-offline-mirror mirror snapshot list "$MIRROR_NAME" --output-format json | \ jq -r ".\"$MIRROR_NAME\"[]") if [[ -z "$SNAPSHOTS" ]]; then echo "Aucun snapshot à supprimer pour le miroir : $MIRROR_NAME" else echo "Suppression des snapshots suivants pour $MIRROR_NAME :" for SNAPSHOT in $SNAPSHOTS; do SNAPSHOT_TIMESTAMP=$(iso_to_timestamp "$SNAPSHOT") CURRENT_TIMESTAMP=$(date +%s) AGE_DAYS=$(( (CURRENT_TIMESTAMP - SNAPSHOT_TIMESTAMP) / 86400 )) if (( AGE_DAYS > MAX_AGE )); then proxmox-offline-mirror mirror snapshot remove "$MIRROR_NAME" "$SNAPSHOT" echo "Snapshot supprimé : $SNAPSHOT" fi done # Garbage collection echo "Exécution de garbage collection (GC) pour le miroir : $MIRROR_NAME" proxmox-offline-mirror mirror gc "$MIRROR_NAME" echo "Garbage collection terminée pour $MIRROR_NAME." fi echo "-------------------------------------------" done echo "Nettoyage terminé pour tous les miroirs."
chmod +x /usr/local/bin/clean_proxmox_snapshots.sh
crontab -e
0 0 * * * /usr/local/bin/clean_proxmox_snapshots.sh