Vue normale

À partir d’avant-hierFlux principal

proxmox-offline-mirror : créer un miroir local pour Debian et Ubuntu

Par :fred
13 décembre 2024 à 15:40

Un mémo sur comment utiliser la commande proxmox-offline-mirror pour créer un miroir local pour les distributions Debian et Ubuntu.

Pour la création d’un miroir local Pour Proxmox, voir cet article : https://memo-linux.com/proxmox-offline-mirror-creer-un-miroir-local-pour-proxmox/

Créer un miroir local Debian

Pour la création d’un miroir local pour la distribution Debian, rien de compliqué car c’est intégré à la commande proxmox-offline-mirror :

proxmox-offline-mirror setup
  • Select Action: dd new mirror entry
  • Guided Setup ([yes]): yes
  • Select distro to mirror : 4
  • Select release : 0 (pour Bookworm)
  • Select repository variant :
    • 0) Main repository
    • 1) Security
    • 2) Updates
    • 3) Backports
    • 4) Debug Information
    • Dans mon cas, j’ai éxécuté la commande proxmox-offline-mirror setup 3 fois pour avoir les 3 miroirs : Main repository, Security et Updates.

  • Enter repository components : main contrib (les dépots non-free c’est à vous de choisir)
  • Configure filters for Debian mirror bookworm / main : – (pas de filtres dans mon cas)
  • Enter mirror ID :
    • debian_bookworm_main
    • debian_bookworm_security
    • debian_bookworm_updates
  • Enter (absolute) base path where mirrored repositories will be stored : /srv/mirrors/debian/ (à adapter)
  • 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
  • Pour finir, Select Action : Quit
  • Pour automatiser la création et la mise à jour du miroir Debian, voici le script :
nano /usr/local/bin/sync-debian.sh
#!/bin/bash
export ALL_PROXY="http://proxyx.local:PORT"

mirror_dir="/srv/mirrors/debian"
symlink_dir="/srv/mirrors/debian/latest"

proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_bookworm_main'
proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_bookworm_updates'
proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'debian_bookworm_security'

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
  • Rendre le scripte éxécutable :
  • chmod +x /usr/local/bin/sync-debian.sh
  • Exécuter une première fois le script afin de créer le miroir ocal :
  • sync-debian.sh
  • Ensuite, ajouter une tache cron pour l’éxécuter péridioquement :
  • crontab -e
    0 2 * * * /usr/local/bin/sync-debian.sh

    Créer un miroir local Ubuntu

    A la date de publication de l’article, la commande proxmox-offline-mirror setup n’est pas opérationnelle pour créer un miroir local pour la distribution Ubuntu.

    Ici, je choisis la distribution Ubuntu 24.04 LTS Noble.

    • Préparation du miroir Ubuntu Noble :
      • Création des répertoires pour le miroir :
      mkdir -p /srv/mirrors/ubuntu/noble/{ubuntu_noble_main,ubuntu_noble_updates,ubuntu_noble_security,latest}
      mkdir -p /srv/mirrors/ubuntu/noble/.pool
    • Téléchargement de la clé ubuntu :
    gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys F6ECB3762474EDA9D21B7022871920D1991BC93C
    gpg --export F6ECB3762474EDA9D21B7022871920D1991BC93C | tee /usr/share/keyrings/ubuntu-archive-keyring.gpg > /dev/null
  • Ajout du miroir dans le fichier de configuration /etc/proxmox-offline-mirror.cfg à la suite des autres miroirs :
  • nano /etc/proxmox-offline-mirror.cfg
    mirror: ubuntu_noble_main
            architectures amd64
            architectures all
            base-dir /srv/mirrors/ubuntu/noble
            ignore-errors false
            key-path /usr/share/keyrings/ubuntu-archive-keyring.gpg
            repository deb https://fr.archive.ubuntu.com/ubuntu noble main restricted universe multiverse
            sync true
            verify true
    
    mirror: ubuntu_noble_updates
            architectures amd64
            architectures all
            base-dir /srv/mirrors/ubuntu/noble
            ignore-errors false
            key-path /usr/share/keyrings/ubuntu-archive-keyring.gpg
            repository deb https://fr.archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse
            sync true
            verify true
    
    mirror: ubuntu_noble_security
            architectures amd64
            architectures all
            base-dir /srv/mirrors/ubuntu/noble
            ignore-errors false
            key-path /usr/share/keyrings/ubuntu-archive-keyring.gpg
            repository deb https://fr.archive.ubuntu.com/ubuntu noble-security main restricted universe multiverse
            sync true
            verify true
    
  • Création du script d’automatisation de création et de mise à jour du miroir :
  • nano /usr/local/bin/sync-ubuntu.sh
    #!/bin/bash
    
    export ALL_PROXY="http://proxy.local:PORT"
    
    mirror_dir="/srv/mirrors/ubuntu/noble"
    symlink_dir="/srv/mirrors/ubuntu/noble/latest"
    
    proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'ubuntu_noble_main'
    proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'ubuntu_noble_updates'
    proxmox-offline-mirror mirror snapshot create --config '/etc/proxmox-offline-mirror.cfg' 'ubuntu_noble_security'
    
    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
    
  • Rendre le script exécutable :
  • chmod +x /usr/local/bin/sync-ubuntu.sh
  • Exécuter le script pour créer le miroir local :
  • sync-ubuntu.sh
  • Changer les dépots dans le sources.list sous Ubuntu server 24.04 :
    Pour information, sous Ubuntu server 24.04 LTS les dépôts ne se renseignent plus dans le fichier : /etc/apt/sources.list.
    cat /etc/apt/sources.list
    # Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sources
    • Modifier les URLs des dépôts :(dans mon cas le nom de domaine de mon serveur web est mirrors.local) :
    nano /etc/apt/sources.list.d/ubuntu.sources
    Types: deb
    URIs: http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_main
    Suites: noble
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    
    Types: deb
    URIs: http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_security
    Suites: noble-security
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    
    Types: deb
    URIs: http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_updates
    Suites: noble-updates
    Components: main universe restricted multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    
  • Test d’update :
  • apt update
    Hit:1 http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_main noble InRelease
    Hit:2 http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_security noble-security InRelease
    Hit:3 http://mirrors.local/ubuntu/noble/latest/ubuntu_noble_updates noble-updates InRelease
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    89 packages can be upgraded. Run 'apt list --upgradable' to see them
    
  • Pour finir, ajouter une tache cron pour l’éxécuter péridioquement :
  • crontab -e
    0 3 * * * /usr/local/bin/sync-ubuntu.sh

    proxmox-offline-mirror : créer un miroir local pour Proxmox

    Par :fred
    10 décembre 2024 à 12:21

    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

    • 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
  • 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 :

    • Créer le dossier :
    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

    • 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
    
  • Test de l’update :
  • apt update

    Nettoyage des snapshots Proxmox et Ceph

    • Créer le script :
    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

    ❌
    ❌