Automatiser complètement les mises à jour de votre serveur Ubuntu avec Topgrade

Les mises à jour système sont essentielles pour la sécurité et les performances, mais elles peuvent être fastidieuses à gérer manuellement. Dans cet article, nous allons découvrir Topgrade, un outil puissant qui unifie toutes vos mises à jour, puis créer un système d’automatisation complet avec redémarrage intelligent.

Qu’est-ce que Topgrade ?

Topgrade est un outil en ligne de commande qui révolutionne la gestion des mises à jour sur Linux. Contrairement aux gestionnaires de paquets traditionnels qui ne s’occupent que des paquets système, Topgrade adopte une approche holistique en mettant à jour :

  • 📦 Paquets système (apt, snap, flatpak…)
  • 🐍 Gestionnaires de langages (pip, npm, cargo, gem…)
  • 🛠️ Outils de développement (VS Code extensions, vim plugins…)
  • 🐳 Containers (Docker images)
  • 💻 Applications tierces (GitHub releases, AppImages…)

L’avantage ? Une seule commande pour tout mettre à jour !

Installation de Topgrade sur Ubuntu

Méthode 1 : Installation via Cargo (recommandée)

# Installer Rust et Cargo si pas déjà fait
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

# Installer Topgrade
cargo install topgrade

Méthode 2 : Téléchargement direct depuis GitHub

# Télécharger la dernière version
wget https://github.com/topgrade-rs/topgrade/releases/latest/download/topgrade-v10.3.1-x86_64-unknown-linux-gnu.tar.gz

# Extraire et installer
tar xzf topgrade-*.tar.gz
sudo mv topgrade /usr/local/bin/
chmod +x /usr/local/bin/topgrade

Méthode 3 : Via les paquets Ubuntu (si disponible)

# Vérifier la disponibilité
apt search topgrade

# Installer si disponible
sudo apt install topgrade

Vérification de l’installation

topgrade --version

Configuration initiale de Topgrade

Première exécution

Lancez Topgrade une première fois pour voir ce qu’il détecte :

topgrade --dry-run

Cette commande affiche toutes les mises à jour possibles sans les appliquer.

Configuration personnalisée

Créez un fichier de configuration pour adapter Topgrade à vos besoins :

mkdir -p ~/.config/topgrade
nano ~/.config/topgrade/topgrade.toml

Configuration de base recommandée :

[misc]
assume_yes = true
no_retry = true
disable = ["system"]  # Optionnel : désactiver certains modules

[linux]
apt_arguments = "--yes --force-yes"



Le défi de l’automatisation

Maintenant que Topgrade est installé, le défi est de l’automatiser complètement pour un serveur. Les obstacles principaux sont :

  1. Demandes de mot de passe pour sudo
  2. Confirmations interactives
  3. Gestion des redémarrages nécessaires après certaines mises à jour
  4. Monitoring et logging des opérations

Solution complète : Script d’automatisation intelligent

Étape 1 : Éliminer les demandes de mot de passe

Configurez sudo pour permettre les commandes de mise à jour sans mot de passe :

sudo visudo

Ajoutez cette ligne (remplacez votre_utilisateur par votre nom d’utilisateur) :

votre_utilisateur ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/bin/snap, /sbin/reboot, /sbin/shutdown, /usr/bin/systemctl

Étape 2 : Configuration de Topgrade pour l’automatisation

Modifiez la configuration pour éviter toute interaction :

nano ~/.config/topgrade/topgrade.toml
[[misc]
assume_yes = true
no_retry = true
disable = ["system"]  # Optionnel : désactiver certains modules

[linux]
apt_arguments = "--yes --force-yes"rtains modules

Étape 3 : Le script d’automatisation complet

Ce script gère tout automatiquement : mises à jour, détection du besoin de redémarrage, et redémarrage intelligent.

#!/bin/bash

# Script de mise à jour automatique avec topgrade et redémarrage
# Auteur: Assistant
# Date: $(date +%Y-%m-%d)

# Configuration
LOG_FILE="/var/log/topgrade-auto.log"
LOCK_FILE="/tmp/topgrade-auto.lock"
MAX_LOG_SIZE=10485760  # 10MB

# Fonction de logging
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Fonction de nettoyage
cleanup() {
    log "Nettoyage et suppression du fichier de verrouillage"
    rm -f "$LOCK_FILE"
    exit $1
}

# Gestion des signaux
trap 'cleanup 1' INT TERM

# Vérification si le script est déjà en cours d'exécution
if [ -f "$LOCK_FILE" ]; then
    log "ERREUR: Le script est déjà en cours d'exécution (fichier de verrouillage présent)"
    exit 1
fi

# Création du fichier de verrouillage
echo $$ > "$LOCK_FILE"

log "=== DÉBUT DE LA MISE À JOUR AUTOMATIQUE ==="

# Rotation du log si nécessaire
if [ -f "$LOG_FILE" ] && [ $(stat -f%z "$LOG_FILE" 2>/dev/null || stat -c%s "$LOG_FILE" 2>/dev/null) -gt $MAX_LOG_SIZE ]; then
    log "Rotation du fichier de log"
    mv "$LOG_FILE" "${LOG_FILE}.old"
    touch "$LOG_FILE"
fi

# Vérification que topgrade est installé
if ! command -v topgrade &> /dev/null; then
    log "ERREUR: topgrade n'est pas installé"
    cleanup 1
fi

# Vérification de la connectivité réseau
log "Vérification de la connectivité réseau..."
if ! ping -c 1 8.8.8.8 &> /dev/null; then
    log "ERREUR: Pas de connectivité réseau"
    cleanup 1
fi
log "Connectivité réseau OK"

# Sauvegarde des informations système avant mise à jour
log "Sauvegarde des informations système..."
dpkg -l > "/tmp/packages_before_$(date +%Y%m%d_%H%M%S).txt" 2>/dev/null || true

# Exécution de topgrade
log "Début de l'exécution de topgrade..."
if topgrade --yes --no-retry 2>&1 | tee -a "$LOG_FILE"; then
    TOPGRADE_EXIT_CODE=0
    log "topgrade s'est exécuté avec succès"
else
    TOPGRADE_EXIT_CODE=$?
    log "AVERTISSEMENT: topgrade s'est terminé avec le code de sortie: $TOPGRADE_EXIT_CODE"
fi

# Sauvegarde des informations système après mise à jour
log "Sauvegarde des informations post-mise à jour..."
dpkg -l > "/tmp/packages_after_$(date +%Y%m%d_%H%M%S).txt" 2>/dev/null || true

# Nettoyage du système
log "Nettoyage du système..."
sudo apt autoremove -y &>> "$LOG_FILE" || true
sudo apt autoclean -y &>> "$LOG_FILE" || true

# Vérification si un redémarrage est nécessaire
REBOOT_REQUIRED=false

# Vérification du fichier Ubuntu standard
if [ -f /var/run/reboot-required ]; then
    log "Redémarrage requis détecté (/var/run/reboot-required)"
    REBOOT_REQUIRED=true
fi

# Vérification des services en attente de redémarrage
if command -v needrestart &> /dev/null; then
    log "Vérification avec needrestart..."
    if needrestart -b &> /dev/null; then
        REBOOT_REQUIRED=true
        log "needrestart recommande un redémarrage"
    fi
fi

# Vérification des processus utilisant des bibliothèques supprimées
if [ -n "$(sudo lsof +c 15 | grep '(deleted)' | grep -v '/tmp\|/var/tmp\|/dev/zero')" ]; then
    log "Des processus utilisent des bibliothèques supprimées - redémarrage recommandé"
    REBOOT_REQUIRED=true
fi

# Programmation du redémarrage
if [ "$REBOOT_REQUIRED" = true ]; then
    log "Redémarrage du système programmé dans 2 minutes..."
    log "=== FIN DE LA MISE À JOUR AUTOMATIQUE - REDÉMARRAGE IMMINENT ==="
    
    # Nettoyage avant redémarrage
    cleanup 0
    
    # Redémarrage avec délai - essayer plusieurs méthodes
    log "Tentative de programmation du redémarrage..."
    
    # Méthode 1: shutdown classique
    if sudo shutdown -r +2 "Redémarrage automatique après mise à jour système" 2>&1 | tee -a "$LOG_FILE"; then
        log "Redémarrage programmé avec shutdown"
    else
        log "Échec avec shutdown, essai avec systemctl..."
        # Méthode 2: systemctl
        if sudo systemctl reboot 2>&1 | tee -a "$LOG_FILE"; then
            log "Redémarrage initié avec systemctl"
        else
            log "Échec avec systemctl, essai avec reboot..."
            # Méthode 3: commande reboot directe
            sudo reboot 2>&1 | tee -a "$LOG_FILE" || log "ERREUR: Impossible de redémarrer le système"
        fi
    fi
else
    log "Aucun redémarrage nécessaire détecté"
    log "=== FIN DE LA MISE À JOUR AUTOMATIQUE ==="
    cleanup 0
fi

Fonctionnalités du script :

  • 🔒 Sécurisé : Utilise un verrou pour éviter les exécutions multiples
  • 📝 Logging complet : Enregistre toutes les opérations avec horodatage
  • 🔍 Vérifications préalables : Connectivité réseau, présence de topgrade
  • 💾 Sauvegarde : Liste des paquets avant/après mise à jour
  • 🧠 Détection intelligente : Détermine automatiquement si un redémarrage est nécessaire
  • 🔄 Redémarrage automatique : Uniquement si requis
  • 🧹 Nettoyage : Supprime les paquets inutiles après mise à jour

Étape 4 : Installation et configuration

# Rendre le script exécutable
chmod +x topgrade-auto.sh
sudo cp topgrade-auto.sh /usr/local/bin/
sudo chown root:root /usr/local/bin/topgrade-auto.sh

# Créer le fichier de log
sudo touch /var/log/topgrade-auto.log
sudo chown $USER:$USER /var/log/topgrade-auto.log

Étape 5 : Automatisation avec Cron

Programmez l’exécution automatique :

crontab -e

Exemples de planification :

# Tous les dimanches à 3h du matin
0 3 * * 0 /usr/local/bin/topgrade-auto.sh

# Tous les jours à 2h du matin (plus fréquent)
0 2 * * * /usr/local/bin/topgrade-auto.sh

# Une fois par semaine le mercredi à 4h
0 4 * * 3 /usr/local/bin/topgrade-auto.sh

Monitoring et maintenance

Surveillance des logs

# Voir les dernières opérations
tail -50 /var/log/topgrade-auto.log

# Surveillance en temps réel
tail -f /var/log/topgrade-auto.log

# Rechercher des erreurs
grep -i error /var/log/topgrade-auto.log

Vérification du bon fonctionnement

# Test manuel du script
sudo /usr/local/bin/topgrade-auto.sh

# Vérifier les tâches cron
crontab -l

# Voir l'historique des exécutions cron
grep topgrade /var/log/syslog

Avantages de cette solution

Complètement autonome

  • Aucune intervention manuelle requise
  • Redémarrage automatique uniquement si nécessaire
  • Gestion des erreurs et récupération automatique

Sécurisé et fiable

  • Vérifications multiples avant chaque opération
  • Logging complet pour audit et débogage
  • Prévention des exécutions concurrentes

Intelligent

  • Détection fine du besoin de redémarrage
  • Sauvegarde automatique des états système
  • Nettoyage automatique après mise à jour

Flexible

  • Configuration personnalisable
  • Planification adaptable selon vos besoins
  • Compatible avec tous types de serveurs Ubuntu

Cas d’usage pratiques

Cette solution est particulièrement utile pour :

  • 🖥️ Serveurs domestiques (Raspberry Pi, NAS…)
  • ☁️ Serveurs cloud (VPS, instances AWS/Azure…)
  • 🏢 Serveurs d’entreprise en environnement de développement
  • 🤖 Stations de travail automatisées

Conclusion

Avec Topgrade et ce script d’automatisation, vous obtenez un système de mise à jour complètement autonome et intelligent. Votre serveur Ubuntu restera toujours à jour, sécurisé, et redémarrera automatiquement uniquement quand c’est nécessaire.

Plus besoin de vous connecter régulièrement pour faire les mises à jour ! Le système se maintient tout seul, vous n’avez plus qu’à consulter les logs de temps en temps pour vérifier que tout se passe bien.

Un gain de temps considérable et une tranquillité d’esprit totale ! 🚀


Cet article vous a été utile ? N’hésitez pas à le partager et à laisser un commentaire avec vos retours d’expérience !