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
fiif ! id « $UTILISATEUR » &>/dev/null; then
echo « ❌ Erreur : L’utilisateur $UTILISATEUR n’existe pas »
exit 1
fiUSER_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
fiCONNEXION_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″
fiif 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
fiif 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-releaseinstall -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.gpgecho \
« 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/nullapt 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 updateapt 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 -eecho « »
################################################################################
# 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 -eecho « »
################################################################################
# 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 +eadded_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 -eif [ $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/grubupdate-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_USERcat <<‘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’
EOFchown $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é »
fiif 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é »
fiif 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 falseecho « ✓ 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.logecho « === Nettoyage APT === » >> /var/log/cleanup.log
apt autoremove -y >> /var/log/cleanup.log 2>&1
apt autoclean -y >> /var/log/cleanup.log 2>&1echo « === 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 || trueecho « === Nettoyage Flatpak === » >> /var/log/cleanup.log
flatpak uninstall –unused -y >> /var/log/cleanup.log 2>&1 || trueecho « === 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 || trueecho « === 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 || trueecho « === Nettoyage cache miniatures === » >> /var/log/cleanup.log
find /home/$UTILISATEUR/.cache/thumbnails -type f -atime +30 -delete 2>/dev/null || trueecho « === Nettoyage logs anciens === » >> /var/log/cleanup.log
find /var/log -type f -name « *.log.* » -mtime +30 -delete 2>/dev/null || trueecho « Nettoyage terminé : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log
EOFchmod +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
EOFcat <<‘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
EOFsystemctl 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.logecho « === 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>&1echo « === Mise à jour Snap === » >> /var/log/update-system.log
snap refresh >> /var/log/update-system.log 2>&1 || trueecho « === Mise à jour Flatpak === » >> /var/log/update-system.log
flatpak update -y >> /var/log/update-system.log 2>&1 || trueecho « Fin mise à jour système : $(date) » >> /var/log/update-system.log
echo « ======================================== » >> /var/log/update-system.log
echo « » >> /var/log/update-system.log
EOFchmod +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
EOFcat <<‘EOF’ > /etc/systemd/system/update-system.timer
[Unit]
Description=Timer quotidien pour mise à jour automatique[Timer]
OnCalendar=daily
Persistent=true[Install]
WantedBy=timers.target
EOFsystemctl 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
EOFchown $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 || trueecho « + 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 »
fideclare -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
donechown $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é »
fiif systemctl is-active –quiet libvirtd; then
LIBVIRT_VERSION=$(virsh –version 2>/dev/null)
echo » ✓ libvirtd actif (version $LIBVIRT_VERSION) »
else
echo » ✗ libvirtd inactif »
fiif 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é »
fiset -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
doneecho « »
echo « Redémarrage en cours… »
sync
reboot