Mon script post-install pour Ubuntu 24.04

Fonctionnalités du script

Système de base:

  • ✅ LVM /home (UUID, backup, montage auto)
  • ✅ DNS Google (8.8.8.8, 8.8.4.4)
  • ✅ GRUB dual-boot (10s timeout)
  • ✅ Vim éditeur par défaut

Stockage et partages:

  • ✅ 14 partages NAS (fstab + automount)
  • ✅ Credentials sécurisés (chmod 600)
  • ✅ Signets Nautilus avec emojis
  • ✅ Redirection XDG intelligente

Environnement développement:

  • ✅ Docker Engine (dépôt officiel)
  • ✅ Docker Compose V2
  • ✅ KVM/libvirt/virt-manager
  • ✅ Ansible
  • ✅ scanmem, default-jdk

Applications:

  • ✅ Google Chrome (dépôt auto)
  • ✅ Steam (dépôt officiel)
  • ✅ VirtualBox + Guest Additions ISO
  • ✅ Discord, VLC (Flatpak)
  • ✅ Suite bureautique complète

Optimisations:

  • ✅ Historique Bash 500K lignes
  • ✅ Sudo sans mot de passe
  • ✅ Veille désactivée
  • ✅ UFW désactivé
  • ✅ Journal systemd limité (500M)

Automatisations:

  • ✅ Nettoyage hebdomadaire (dimanche 3h)
  • ✅ MAJ quotidiennes (APT + Snap + Flatpak)
  • ✅ Docker cleanup (sans volumes)
  • ✅ Logs détaillés

Interface:

  • ✅ GSConnect (KDE Connect Android)
  • ✅ Nautilus optimisé
  • ✅ Extensions GNOME détectées
  • ✅ Signets personnalisés

Commande d’exécution :

sudo bash post-install.sh 2>&1 | tee post-install.log

#!/bin/bash
################################################################################
# Script de post-installation Ubuntu 24.04 LTS
#
# Description : Configure automatiquement un système Ubuntu fraîchement installé
# avec montage /home sur LVM (via UUID), montage NAS via fstab,
# optimisations système, et automatisations
#
# Auteur : Romain J.
# Version : 5.9
# Date : 2025
#
# Utilisation : sudo bash post-install.sh 2>&1 | tee post-install.log
################################################################################

set -e # Arrêter le script en cas d’erreur critique

################################################################################
# VARIABLES DE CONFIGURATION
################################################################################

UTILISATEUR= »starmate »
BASHRC_USER= »/home/$UTILISATEUR/.bashrc »

# Configuration NAS
NAS_IP= »IP_DU_NAS » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PASSWORD= »VOTRE_MOT_DE_PASSE_ICI » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PARTAGES=(animation documents downloads films Imprimante jeux livres musique perso photographie sauvegarde seriestv surveillance Technique)
NAS_CREDENTIALS= »/root/.smbcredentials »

# Montage /home sur LVM
LVM_HOME_DEVICE= »/dev/home-vg/home_lv »

################################################################################
# VÉRIFICATIONS PRÉALABLES
################################################################################

echo « ========================================== »
echo  » POST-INSTALLATION UBUNTU 24.04 LTS »
echo « ========================================== »
echo «  »
echo « Vérifications préalables… »

if [ « $EUID » -ne 0 ]; then
echo « ❌ Erreur : Ce script doit être exécuté en root (sudo) »
exit 1
fi

if ! id « $UTILISATEUR » &>/dev/null; then
echo « ❌ Erreur : L’utilisateur $UTILISATEUR n’existe pas »
exit 1
fi

USER_UID=$(id -u « $UTILISATEUR »)
USER_GID=$(id -g « $UTILISATEUR »)
echo « ✓ Utilisateur détecté : $UTILISATEUR (UID: $USER_UID, GID: $USER_GID) »

if [ « $NAS_PASSWORD » = « VOTRE_MOT_DE_PASSE_ICI » ]; then
echo « ❌ Erreur : Veuillez modifier le mot de passe NAS dans le script avant de l’exécuter »
exit 1
fi

CONNEXION_NET=$(nmcli -t -f NAME,DEVICE connection show –active | grep -E ‘enp|eth’ | cut -d: -f1 | head -n1)
if [ -z « $CONNEXION_NET » ]; then
echo « ❌ Erreur : Aucune connexion réseau filaire active détectée »
exit 1
fi
echo « ✓ Connexion réseau active : $CONNEXION_NET »
echo «  »

################################################################################
# 1. CONFIGURATION DU MONTAGE DE /HOME SUR LVM VIA UUID (EN PREMIER !)
################################################################################

echo « [1/23] Configuration du montage de /home sur LVM (via UUID)… »
echo « ——————————————————- »

# Récupération de l’UUID du volume LVM
HOME_UUID=$(blkid -s UUID -o value « $LVM_HOME_DEVICE » 2>/dev/null || true)

if [ -z « $HOME_UUID » ]; then
echo « ⚠ Impossible de récupérer l’UUID de $LVM_HOME_DEVICE »
echo  » Utilisation du nom de device (moins fiable) : $LVM_HOME_DEVICE »
LVM_ENTRY= »$LVM_HOME_DEVICE /home ext4 defaults 0 2″
else
echo « ✓ UUID trouvé pour /home : $HOME_UUID »
LVM_ENTRY= »UUID=$HOME_UUID /home ext4 defaults 0 2″
fi

if grep -q « /home[[:space:]] » /etc/fstab | grep -q -v « ^# » && ! grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ⚠ Une entrée /home existe déjà dans fstab, mais pas avec le bon UUID/device LVM »
echo  » Sauvegarde et remplacement… »
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
sed -i « \|^[^#].*/home[[:space:]]|d » /etc/fstab # Supprime l’ancienne entrée /home
fi

if grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ✓ L’entrée LVM (UUID) pour /home est déjà présente dans /etc/fstab »
else
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/fstab créée »

echo «  » >> /etc/fstab
echo « # Partition /home sur LVM (via UUID) » >> /etc/fstab
echo « $LVM_ENTRY » >> /etc/fstab
echo « ✓ Entrée LVM pour /home ajoutée à /etc/fstab »

echo  » Tentative de montage immédiat de /home… »
if mount -a 2>/dev/null; then
echo « ✓ /home (LVM) monté avec succès ! Vos données sont maintenant accessibles. »
else
echo « ⚠ Montage immédiat échoué. Redémarrage nécessaire pour activer le vrai /home (LVM). »
fi
fi
echo «  »

################################################################################
# 2. MISE À JOUR, REPO DOCKER, PAQUETS ET GOOGLE CHROME
################################################################################

echo « [2/23] Mise à jour système, repo Docker, paquets et Google Chrome… »
echo « ——————————————————- »

apt update
apt upgrade -y

# Repo Docker officiel
apt install -y ca-certificates curl gnupg lsb-release

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg –dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
« deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable » | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update

# Ajout du dépôt officiel Steam pour installation complète
echo  » Ajout du dépôt officiel Steam… »
curl -s http://repo.steampowered.com/steam/archive/stable/steam.gpg | gpg –dearmor -o /usr/share/keyrings/steam.gpg
echo « deb [arch=amd64 signed-by=/usr/share/keyrings/steam.gpg] http://repo.steampowered.com/steam/ stable steam » | tee /etc/apt/sources.list.d/steam.list > /dev/null
apt update

apt install -y steam
echo « ✓ Steam installé depuis le dépôt officiel (prêt à lancer) »

# Installation des paquets
apt install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
torbrowser-launcher filezilla transmission \
software-properties-common wget gnupg \
virtualbox virtualbox-guest-additions-iso \
gnome-software gnome-software-plugin-flatpak \
audacity calibre cdrdao dia musescore3 gimp gnome-tweaks \
gparted hplip imagemagick inkscape keepassxc manpages-fr \
nautilus-image-converter net-tools okular p7zip-full p7zip-rar rar \
pdfsam printer-driver-cups-pdf sharutils synaptic thunderbird \
timidity tintii ubuntu-restricted-extras unace unrar uudeview \
vlc whois xsane gnome-shell-extensions cifs-utils vim htop \
glances iotop unattended-upgrades flatpak rsync gdebi libfuse2 \
ansible qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager \
gnome-shell-extension-gsconnect default-jdk scanmem git python3 python3-venv python3-pip

# Installation de Google Chrome
echo  » Téléchargement et installation de Google Chrome… »
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O /tmp/google-chrome.deb
apt install -y /tmp/google-chrome.deb
rm -f /tmp/google-chrome.deb
echo « ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »

echo « ✓ Tous les paquets installés avec succès »
echo «  »

################################################################################
# 3. CONFIGURATION DOCKER, KVM ET GROUPES UTILISATEUR
################################################################################

echo « [3/23] Configuration Docker, KVM et groupes utilisateur… »
echo « ——————————————————- »

usermod -aG docker $UTILISATEUR
usermod -aG libvirt $UTILISATEUR
usermod -aG kvm $UTILISATEUR
echo « ✓ Utilisateur $UTILISATEUR ajouté aux groupes : docker, libvirt, kvm »

systemctl enable docker
systemctl start docker
echo « ✓ Service Docker activé et démarré »

systemctl enable libvirtd
systemctl start libvirtd
echo « ✓ Service libvirtd activé et démarré »

set +e
virsh net-autostart default && echo « ✓ Réseau libvirt ‘default’ en autostart » || echo  » ⚠ Réseau ‘default’ déjà en autostart ou indisponible »
virsh net-start default && echo « ✓ Réseau libvirt ‘default’ démarré » || echo  » ⚠ Réseau ‘default’ déjà démarré ou indisponible »
set -e

echo «  »

################################################################################
# 4. CONFIGURATION DNS
################################################################################

echo « [4/23] Configuration des serveurs DNS… »
echo « ——————————————————- »

nmcli connection modify « $CONNEXION_NET » ipv4.dns « 8.8.8.8 8.8.4.4 »
nmcli connection modify « $CONNEXION_NET » ipv4.ignore-auto-dns yes
echo « ✓ DNS configurés : 8.8.8.8, 8.8.4.4 »

set +e
nmcli connection down « $CONNEXION_NET » && echo  » Connexion arrêtée » || echo  » ⚠ Impossible d’arrêter (déjà down ?) »
nmcli connection up « $CONNEXION_NET » && echo « ✓ Connexion redémarrée » || echo  » ⚠ Échec redémarrage (réseau temporairement indisponible ?) »
set -e

echo «  »

################################################################################
# 5. MONTAGE NAS VIA FSTAB
################################################################################

echo « [5/23] Configuration des montages NAS via /etc/fstab… »
echo « ——————————————————- »

# Création du fichier credentials
cat <<EOF > « $NAS_CREDENTIALS »
username=$UTILISATEUR
password=$NAS_PASSWORD
EOF
chmod 600 « $NAS_CREDENTIALS »
echo « ✓ Fichier credentials créé et sécurisé »

# Désactivation temporaire de set -e pour la boucle NAS (évite les crashes sur echo ou mkdir)
set +e

added_count=0
for dossier in « ${NAS_PARTAGES[@]} »; do
MOUNT_LINE= »//${NAS_IP}/${dossier} /mnt/nas/${dossier} cifs credentials=${NAS_CREDENTIALS},iocharset=utf8,vers=3.1.1,uid=${USER_UID},gid=${USER_GID},_netdev,nofail,x-systemd.automount,x-systemd.mount-timeout=5 0 0″

if ! grep -q « ^//${NAS_IP}/${dossier}[[:space:]] » /etc/fstab; then
#mkdir -p « /mnt/nas/${dossier} »
echo « $MOUNT_LINE » >> /etc/fstab
echo  » ✓ Ligne ajoutée pour $dossier »
added_count=$((added_count + 1)) # CORRECTION ICI
else
echo  » ⚠ Ligne déjà présente pour $dossier »
fi
done

# Réactivation de set -e
set -e

if [ $added_count -gt 0 ]; then
echo « ✓ $added_count lignes NAS ajoutées à /etc/fstab »
echo  » Tentative de montage immédiat… »
mount -a 2>/dev/null && echo « ✓ Montages NAS effectués immédiatement » || echo « ⚠ Certains montages ont échoué (réseau/NAS indisponible ? → automount actif) »
else
echo « ✓ Toutes les lignes NAS déjà présentes dans /etc/fstab »
fi
echo «  »

################################################################################
# 6. CONFIGURATION GRUB POUR DUAL-BOOT
################################################################################

echo « [6/23] Configuration GRUB pour dual-boot… »
echo « ——————————————————- »

cp /etc/default/grub /etc/default/grub.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/default/grub créée »

sed -i ‘s/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT_STYLE=menu’ >> /etc/default/grub
sed -i ‘s/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT=10’ >> /etc/default/grub
sed -i ‘s/^GRUB_DISABLE_OS_PROBER=.*/GRUB_DISABLE_OS_PROBER=false/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_DISABLE_OS_PROBER=false’ >> /etc/default/grub

update-grub
echo « ✓ GRUB configuré pour dual-boot (timeout: 10s) »
echo «  »

################################################################################
# 7. CONFIGURATION DE L’ÉDITEUR PAR DÉFAUT
################################################################################

echo « [7/23] Configuration de l’éditeur par défaut… »
echo « ——————————————————- »

update-alternatives –set editor /usr/bin/vim.basic
echo « ✓ Éditeur par défaut : Vim »
echo «  »

################################################################################
# 8. OPTIMISATION DE L’HISTORIQUE BASH
################################################################################

echo « [8/23] Optimisation de l’historique Bash… »
echo « ——————————————————- »

cp $BASHRC_USER ${BASHRC_USER}.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de .bashrc créée »

sed -i ‘/^HISTSIZE=/d’ $BASHRC_USER
sed -i ‘/^HISTFILESIZE=/d’ $BASHRC_USER
sed -i ‘/^shopt -s histappend/d’ $BASHRC_USER
sed -i ‘/^HISTTIMEFORMAT=/d’ $BASHRC_USER
sed -i ‘/^HISTCONTROL=/d’ $BASHRC_USER
sed -i ‘/^HISTIGNORE=/d’ $BASHRC_USER
sed -i ‘/^PROMPT_COMMAND=/d’ $BASHRC_USER
sed -i ‘/^alias update=/d’ $BASHRC_USER
sed -i ‘/^# ==== HISTORIQUE BASH OPTIMISÉ ====/d’ $BASHRC_USER

cat <<‘EOF’ >> $BASHRC_USER

# ==== HISTORIQUE BASH OPTIMISÉ ====
HISTSIZE=500000
HISTFILESIZE=1000000
shopt -s histappend
export HISTTIMEFORMAT= »%F %T  »
export HISTCONTROL=ignoreboth:erasedups
export HISTIGNORE= »ls:ll:la:pwd:cd:cd -:exit:clear »
PROMPT_COMMAND= »history -a; history -c; history -r »

# Alias mise à jour complète
alias update=’sudo apt update && sudo apt upgrade -y && sudo snap refresh 2>/dev/null || true && flatpak update -y 2>/dev/null || true’
EOF

chown $UTILISATEUR:$UTILISATEUR $BASHRC_USER
echo « ✓ Historique Bash optimisé »
echo «  »

################################################################################
# 9. CONFIGURATION SUDO SANS MOT DE PASSE
################################################################################

echo « [9/23] Configuration sudo sans mot de passe… »
echo « ——————————————————- »

echo « $UTILISATEUR ALL=(ALL) NOPASSWD:ALL » > /etc/sudoers.d/90-$UTILISATEUR
chmod 440 /etc/sudoers.d/90-$UTILISATEUR
echo « ✓ Sudo sans mot de passe activé pour $UTILISATEUR (assumé pour PC perso) »
echo «  »

################################################################################
# 10. INSTALLATION FLATPAK ET APPLICATIONS
################################################################################

echo « [10/23] Installation Flatpak et applications… »
echo « ——————————————————- »

flatpak remote-add –if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub com.discordapp.Discord org.videolan.VLC
echo « ✓ Flatpak configuré avec Discord et VLC »
echo «  »

################################################################################
# 11. CONFIGURATION DES MISES À JOUR AUTOMATIQUES
################################################################################

echo « [11/23] Configuration des mises à jour automatiques… »
echo « ——————————————————- »

dpkg-reconfigure -plow unattended-upgrades
echo « ✓ Mises à jour automatiques de sécurité activées »
echo «  »

################################################################################
# 12. NETTOYAGE DES PAQUETS OBSOLÈTES
################################################################################

echo « [12/23] Nettoyage des paquets obsolètes… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Paquets obsolètes supprimés »
echo «  »

################################################################################
# 13. LIMITATION DU JOURNAL SYSTEMD
################################################################################

echo « [13/23] Limitation du journal systemd… »
echo « ——————————————————- »

grep -qxF ‘SystemMaxUse=500M’ /etc/systemd/journald.conf || echo ‘SystemMaxUse=500M’ >> /etc/systemd/journald.conf
systemctl restart systemd-journald
echo « ✓ Journal systemd limité à 500 Mo »
echo «  »

################################################################################
# 14. CONFIGURATION NAUTILUS ET GNOME (avec activation GSConnect)
################################################################################

echo « [14/23] Configuration Nautilus et GNOME… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-hidden-files true
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences default-folder-viewer ‘list-view’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.default-applications.terminal exec ‘gnome-terminal’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.thumbnailers disable-all false
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-image-thumbnails ‘always’

echo « ✓ Nautilus configuré (fichiers cachés, vue liste, miniatures) »

EXTENSIONS_DISPONIBLES=$(sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions list 2>/dev/null || echo «  »)

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « dash-to-dock@micxgx.gmail.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable dash-to-dock@micxgx.gmail.com
echo  » ✓ dash-to-dock activé »
else
echo  » ✗ dash-to-dock non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « gsconnect@andyholmes.github.io »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable gsconnect@andyholmes.github.io
echo  » ✓ GSConnect activé (prêt pour KDE Connect sur Android) »
else
echo  » ✗ GSConnect non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « clipboard-indicator@tudmotu.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable clipboard-indicator@tudmotu.com
echo  » ✓ clipboard-indicator activé »
else
echo  » ✗ clipboard-indicator non installé »
fi
else
echo « ⚠ gsettings non disponible, configuration GNOME ignorée »
fi
echo «  »

################################################################################
# 15. DÉSactivation DE LA VEILLE AUTOMATIQUE
################################################################################

echo « [15/23] Désactivation de la veille automatique et extinction écran… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.session idle-delay 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power idle-dim false

echo « ✓ Veille automatique, extinction écran et assombrissement désactivés »
else
echo « ⚠ gsettings non disponible, désactivation de la veille ignorée »
fi
echo «  »

################################################################################
# 16. DÉSactivation DU FIREWALL UFW
################################################################################

echo « [16/23] Désactivation du firewall UFW… »
echo « ——————————————————- »

ufw disable
echo « ✓ UFW désactivé (comme demandé) »
echo «  »

################################################################################
# 17. CRÉATION DU SCRIPT DE NETTOYAGE AUTOMATIQUE
################################################################################

echo « [17/23] Création du script de nettoyage automatique… »
echo « ——————————————————- »

cat <<EOF > /usr/local/bin/cleanup.sh
#!/bin/bash
echo « Début nettoyage système : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log

echo « === Nettoyage APT === » >> /var/log/cleanup.log
apt autoremove -y >> /var/log/cleanup.log 2>&1
apt autoclean -y >> /var/log/cleanup.log 2>&1

echo « === Nettoyage Snap === » >> /var/log/cleanup.log
snap set system refresh.retain=2
snap list –all | awk ‘/disabled/{print \$1″ –revision « \$3}’ | xargs -r snap remove >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Flatpak === » >> /var/log/cleanup.log
flatpak uninstall –unused -y >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Docker === » >> /var/log/cleanup.log
docker system prune -f >> /var/log/cleanup.log 2>&1 || true # Sans –volumes pour préserver les données Docker
docker builder prune -f –keep-storage 10GB >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage fichiers temporaires === » >> /var/log/cleanup.log
find /tmp -type f -atime +7 -delete 2>/dev/null || true
find /var/tmp -type f -atime +7 -delete 2>/dev/null || true

echo « === Nettoyage cache miniatures === » >> /var/log/cleanup.log
find /home/$UTILISATEUR/.cache/thumbnails -type f -atime +30 -delete 2>/dev/null || true

echo « === Nettoyage logs anciens === » >> /var/log/cleanup.log
find /var/log -type f -name « *.log.* » -mtime +30 -delete 2>/dev/null || true

echo « Nettoyage terminé : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log
EOF

chmod +x /usr/local/bin/cleanup.sh

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.service
[Unit]
Description=Nettoyage automatique du système

[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.timer
[Unit]
Description=Timer hebdomadaire pour nettoyage automatique

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now cleanup-system.timer
echo « ✓ Nettoyage automatique planifié (dimanche 3h, incl. Docker) »
echo «  »

################################################################################
# 18. CRÉATION DU SCRIPT DE MISE À JOUR AUTOMATIQUE
################################################################################

echo « [18/23] Création du script de mise à jour automatique… »
echo « ——————————————————- »

cat <<‘EOF’ > /usr/local/bin/update-system.sh
#!/bin/bash
echo « ======================================== » >> /var/log/update-system.log
echo « Début mise à jour système : $(date) » >> /var/log/update-system.log

echo « === Mise à jour APT === » >> /var/log/update-system.log
apt update >> /var/log/update-system.log 2>&1
apt upgrade -y >> /var/log/update-system.log 2>&1

echo « === Mise à jour Snap === » >> /var/log/update-system.log
snap refresh >> /var/log/update-system.log 2>&1 || true

echo « === Mise à jour Flatpak === » >> /var/log/update-system.log
flatpak update -y >> /var/log/update-system.log 2>&1 || true

echo « Fin mise à jour système : $(date) » >> /var/log/update-system.log
echo « ======================================== » >> /var/log/update-system.log
echo «  » >> /var/log/update-system.log
EOF

chmod +x /usr/local/bin/update-system.sh

cat <<‘EOF’ > /etc/systemd/system/update-system.service
[Unit]
Description=Mise à jour automatique APT + Snap + Flatpak

[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-system.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/update-system.timer
[Unit]
Description=Timer quotidien pour mise à jour automatique

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now update-system.timer
echo « ✓ Mises à jour automatiques planifiées (quotidien) »
echo «  »

################################################################################
# 19. REDIRECTION DES DOSSIERS STANDARDS VERS LE NAS + SIGNETS PERSONNALISÉS
################################################################################

echo « [19/23] Redirection des dossiers standards vers le NAS et signets personnalisés… »
echo « ——————————————————- »

USER_DIRS_FILE= »/home/$UTILISATEUR/.config/user-dirs.dirs »
USER_DIRS_CONF= »/home/$UTILISATEUR/.config/user-dirs.conf » # ← AJOUT CRITIQUE

# Sauvegarde du fichier actuel
if [ -f « $USER_DIRS_FILE » ]; then
cp « $USER_DIRS_FILE » « ${USER_DIRS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo « + Sauvegarde de user-dirs.dirs créée »
fi

# Suppression définitive des dossiers locaux concernés (Documents, Musique, Images)
# Cela empêche xdg-user-dirs-update de les recréer au login
echo « + Suppression définitive des dossiers locaux redirigés… »
sudo -u $UTILISATEUR rmdir « $HOME/Documents » « $HOME/Musique » « $HOME/Images » 2>/dev/null || true

# Réécriture du fichier user-dirs.dirs
cat <<EOF > « $USER_DIRS_FILE »
XDG_DESKTOP_DIR= »\$HOME/Bureau »
XDG_DOWNLOAD_DIR= »\$HOME/Téléchargements »
XDG_TEMPLATES_DIR= »\$HOME/Modèles »
XDG_PUBLICSHARE_DIR= »\$HOME/Public »
XDG_DOCUMENTS_DIR= »/mnt/nas/documents »
XDG_MUSIC_DIR= »/mnt/nas/musique »
XDG_PICTURES_DIR= »/mnt/nas/photographie »
XDG_VIDEOS_DIR= »\$HOME/ » # Désactivé visuellement (pas de sous-dossier = pas affiché dans Nautilus)
EOF

# CRITIQUE : Désactiver xdg-user-dirs-update pour empêcher l’écrasement
cat <<EOF > « $USER_DIRS_CONF »
enabled=False
EOF

chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_FILE »
chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_CONF »
chmod 644 « $USER_DIRS_CONF »

# Redémarrage Nautilus pour prise en compte immédiate
sudo -u $UTILISATEUR nautilus -q 2>/dev/null || true

echo « + Dossiers redirigés : »
echo  » – Documents → /mnt/nas/documents »
echo  » – Musique → /mnt/nas/musique »
echo  » – Images → /mnt/nas/photographie »
echo  » – Téléchargements reste local (comme souhaité) »
echo  » – Vidéos retiré du menu »
echo «  »

# Configuration des signets Nautilus
BOOKMARKS_FILE= »/home/$UTILISATEUR/.config/gtk-3.0/bookmarks »
mkdir -p « $(dirname « $BOOKMARKS_FILE ») »
touch « $BOOKMARKS_FILE »

# Sauvegarde APRÈS création du fichier (s’il contient des données)
if [ -s « $BOOKMARKS_FILE » ]; then
cp « $BOOKMARKS_FILE » « ${BOOKMARKS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo  » ✓ Sauvegarde de bookmarks créée »
fi

declare -A NOM_SIGNET
NOM_SIGNET[animation]= »🎬 Animation »
NOM_SIGNET[documents]= »📄 Documents »
NOM_SIGNET[downloads]= »⬇️ Téléchargements »
NOM_SIGNET[films]= »🎥 Films »
NOM_SIGNET[Imprimante]= »🖨️ Imprimante »
NOM_SIGNET[jeux]= »🎮 Jeux »
NOM_SIGNET[livres]= »📚 Livres »
NOM_SIGNET[musique]= »🎵 Musique »
NOM_SIGNET[perso]= »👤 Perso »
NOM_SIGNET[photographie]= »📸 Photographie »
NOM_SIGNET[sauvegarde]= »💾 Sauvegarde »
NOM_SIGNET[seriestv]= »📺 Séries TV »
NOM_SIGNET[surveillance]= »📹 Surveillance »
NOM_SIGNET[Technique]= »🔧 Technique »

for dossier in « ${NAS_PARTAGES[@]} »; do
CHEMIN= »file:///mnt/nas/$dossier »
NOM= »${NOM_SIGNET[$dossier]:-$dossier} »
if ! grep -q « ^${CHEMIN} » « $BOOKMARKS_FILE » 2>/dev/null; then
echo « $CHEMIN $NOM » >> « $BOOKMARKS_FILE »
echo  » ✓ Signet ajouté : $NOM »
else
echo  » ⚠ Signet déjà présent : $NOM »
fi
done

chown $UTILISATEUR:$UTILISATEUR « $BOOKMARKS_FILE »
chmod 644 « $BOOKMARKS_FILE »
echo « ✓ ${#NAS_PARTAGES[@]} signets NAS ajoutés dans Nautilus »
echo «  »

################################################################################
# 20. VÉRIFICATIONS FINALES DES SERVICES
################################################################################

echo « [20/23] Vérification des services Docker et KVM… »
echo « ——————————————————- »

set +e

if systemctl is-active –quiet docker; then
DOCKER_VERSION=$(docker –version 2>/dev/null | awk ‘{print $3}’ | tr -d ‘,’)
COMPOSE_VERSION=$(docker compose version 2>/dev/null | awk ‘{print $4}’)
echo  » ✓ Docker actif : version $DOCKER_VERSION | Compose : $COMPOSE_VERSION »
else
echo  » ✗ Docker inactif ou non installé »
fi

if systemctl is-active –quiet libvirtd; then
LIBVIRT_VERSION=$(virsh –version 2>/dev/null)
echo  » ✓ libvirtd actif (version $LIBVIRT_VERSION) »
else
echo  » ✗ libvirtd inactif »
fi

if command -v ansible &> /dev/null; then
ANSIBLE_VERSION=$(ansible –version 2>/dev/null | head -n1 | awk ‘{print $2}’)
echo  » ✓ Ansible installé (version $ANSIBLE_VERSION) »
else
echo  » ✗ Ansible non installé »
fi

set -e
echo «  »

################################################################################
# 21. NETTOYAGE FINAL
################################################################################

echo « [21/23] Nettoyage final… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Nettoyage final effectué »
echo «  »

################################################################################
# 22. RÉSUMÉ FINAL
################################################################################

echo « [22/23] RÉSUMÉ FINAL »
echo « ========================================== »
echo  » POST-INSTALLATION TERMINÉE AVEC SUCCÈS ! »
echo « ========================================== »
echo «  »
echo « 📋 RÉSUMÉ DES ACTIONS : »
echo  » ✓ /home configuré sur LVM (via UUID) »
echo  » ✓ virtualbox-guest-additions-iso installé (Guest Additions prêtes pour VMs) »
echo  » ✓ GSConnect installé et activé (KDE Connect Android prêt) »
echo  » ✓ UFW désactivé »
echo  » ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »
echo  » ✓ Docker officiel + Compose V2 + KVM configurés »
echo  » ✓ Steam installé depuis le dépôt officiel »
echo  » ✓ Veille automatique et extinction écran désactivées »
echo  » ✓ Système mis à jour et paquets installés »
echo  » ✓ DNS Google configurés »
echo  » ✓ ${#NAS_PARTAGES[@]} partages NAS montés via fstab + signets Nautilus »
echo  » ✓ GRUB dual-boot, Bash optimisé, sudo NOPASSWD »
echo  » ✓ Flatpak, nettoyage (incl. Docker) et MAJ automatiques »
echo  » ✓ Nautilus/GNOME configuré »
echo «  »
echo « 🔧 COMMANDES UTILES APRÈS REBOOT : »
echo  » • Dans une VM VirtualBox → Périphériques > Insérer l’image des Additions Invité… »
echo  » • GSConnect : icône téléphone dans la barre supérieure »
echo  » • Installer KDE Connect sur Android et appairer »
echo  » • google-chrome, docker compose up, virt-manager… »
echo  » ✓ Dossiers Documents/Musique/Images redirigés vers NAS »
echo «  »
echo « Le système va redémarrer dans 30 secondes pour appliquer toutes les modifications. »
echo « Appuyez sur Ctrl+C pour annuler. »
echo «  »

################################################################################
# 23. REDÉMARRAGE AUTOMATIQUE
################################################################################

echo « [23/23] Redémarrage du système… »
echo « ——————————————————- »

for i in {30..1}; do
printf « Redémarrage dans %2d secondes… (Ctrl+C pour annuler) \r » « $i »
sleep 1
done

echo «  »
echo « Redémarrage en cours… »
sync
reboot

Derniers Articles