diff --git a/notes/scripts/.directories.txt b/notes/scripts/.directories.txt
new file mode 100644
index 0000000..8d420c7
--- /dev/null
+++ b/notes/scripts/.directories.txt
@@ -0,0 +1,3 @@
+common
+server-httpd
+server-mail
diff --git a/notes/scripts/.generate_directories.sh b/notes/scripts/.generate_directories.sh
new file mode 100755
index 0000000..bbb0587
--- /dev/null
+++ b/notes/scripts/.generate_directories.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# Fichier de sortie
+OUTPUT_FILE=".directories.txt"
+
+# Exclure certains dossiers si nécessaire (ex: .git, .github, autres fichiers spécifiques)
+EXCLUDE_DIRS=(".git" ".github") # Ajuste selon tes besoins
+
+# Lister les dossiers à partir du répertoire actuel (ajuste si le script est exécuté ailleurs)
+find . -mindepth 1 -maxdepth 1 -type d | sed 's|./||' | sort > "$OUTPUT_FILE"
+
+# Exclure les dossiers non souhaités
+for dir in "${EXCLUDE_DIRS[@]}"; do
+  sed -i "/^$dir$/d" "$OUTPUT_FILE"
+done
+
+echo "✅ Fichier '$OUTPUT_FILE' généré avec succès !"
+cat "$OUTPUT_FILE"
diff --git a/notes/scripts/README.md b/notes/scripts/README.md
new file mode 100644
index 0000000..5011f40
--- /dev/null
+++ b/notes/scripts/README.md
@@ -0,0 +1,38 @@
+# 📥 Récupération des scripts depuis le dépôt Git
+
+Ce dépôt permet de télécharger uniquement les scripts nécessaires sans cloner l'intégralité du projet.
+
+## 🚀 Installation et utilisation
+
+### 1️⃣ Télécharger le script `fetch_scripts.sh`
+Pour récupérer le script principal, utilisez la commande suivante :
+
+```bash
+wget -O fetch_scripts.sh "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/fetch_scripts.sh"
+chmod +x fetch_scripts.sh
+```
+
+### 2️⃣ Exécuter le script
+Lancez le script pour récupérer les fichiers nécessaires :
+
+```bash
+./fetch_scripts.sh
+```
+
+Le script vous proposera une liste de dossiers disponibles. Sélectionnez ceux que vous souhaitez télécharger en entrant leurs numéros.
+
+### 3️⃣ Exemples d'utilisation
+#### 🔹 Exemple de sélection
+```
+📂 Sélectionnez les dossiers à télécharger (séparez par un espace) :
+[0] server-mail
+[1] server-httpd
+[2] common
+Entrez les numéros correspondants : 0 2
+```
+Cela téléchargera uniquement les fichiers des dossiers `server-mail` et `common`.
+
+
+---
+
+© 2025 - ProjetInterne by Cédrix.
diff --git a/notes/scripts/common/common_utils.sh b/notes/scripts/common/common_utils.sh
new file mode 100644
index 0000000..f1443a7
--- /dev/null
+++ b/notes/scripts/common/common_utils.sh
@@ -0,0 +1,150 @@
+#!/bin/bash
+
+# Vérifier si le script est exécuté en root
+check_root() {
+    if [[ $EUID -ne 0 ]]; then
+       echo "❌ Ce script doit être exécuté en tant que root."
+       exit 1
+    fi
+}
+
+update_system() {
+    echo "=== Mise à jour du système ==="
+    
+    # Mise à jour des paquets APT
+    if command -v apt &> /dev/null; then
+        echo "🔄 Mise à jour des paquets APT..."
+        sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt clean
+        if [ $? -ne 0 ]; then
+            echo "❌ Erreur lors de la mise à jour des paquets APT." >&2
+            exit 1
+        else
+            echo "✅ Mise à jour terminée."
+        fi
+    fi
+    
+    # Mise à jour des paquets Flatpak si Flatpak est installé
+    if command -v flatpak &> /dev/null; then
+        echo "🔄 Mise à jour des paquets Flatpak..."
+        flatpak update -y
+        if [ $? -ne 0 ]; then
+            echo "❌ Erreur lors de la mise à jour des paquets Flatpak." >&2
+            exit 1
+        else
+            echo "✅ Mise à jour terminée."
+        fi
+    fi
+    
+}
+
+
+# Récupérer le nom d’hôte complet (FQDN) et le domaine
+get_fqdn_and_domain() {
+    local fqdn domain
+
+    # Récupérer le FQDN en priorité avec hostname -f
+    fqdn=$(hostname -f 2>/dev/null) || fqdn=$(cat /etc/hostname 2>/dev/null)
+
+    # Vérifier si la récupération du FQDN a réussi
+    if [[ -z "$fqdn" ]]; then
+        echo "❌ Erreur : Impossible de déterminer le FQDN" >&2
+        return 1
+    fi
+
+    # Extraire le domaine
+    domain=${fqdn#*.}
+
+    echo "$fqdn" "$domain"
+}
+
+
+# Vérification de la résolution DNS
+check_dns() {
+    local server_name=$1
+    
+    # Récupération de l'adresse IP publique du serveur
+    SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')
+    
+    # Récupération de l'adresse IP associée au FQDN
+    FQDN_IP=$(dig +short A "$server_name" | tail -n1)
+
+    # Vérification si l'IP du FQDN est récupérable
+    if [[ -z "$FQDN_IP" ]]; then
+        echo "❌ Erreur : Impossible de récupérer l'adresse IP associée à $server_name via DIG."
+        echo "➡️  Vérifie la configuration DNS et l'existence du domaine."
+        exit 1
+    fi
+
+    # Comparaison des IPs
+    if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
+        echo "⚠️  Alerte DNS : L'adresse IP résolue ($FQDN_IP) ne correspond pas à l'IP publique actuelle ($SERVER_IP)."
+        echo "➡️  Vérifie la configuration DNS et la propagation des enregistrements."
+        exit 1
+    fi
+
+    echo "✅ Vérification réussie : $server_name pointe correctement vers $SERVER_IP."
+}
+
+
+setup_ssl() {
+    local fqdn=$1
+    local le_dir="/etc/letsencrypt/live/$fqdn"
+    
+    echo "=== Configuration du certificat SSL pour $fqdn ==="
+    
+    if [[ -f "$le_dir/fullchain.pem" ]]; then
+        echo "✅ Certificat SSL déjà existant."
+        openssl x509 -noout -text -in "$le_dir/fullchain.pem" | grep "Not After"
+        return 0
+    fi
+    
+    echo "🔄 Test de génération d’un nouveau certificat SSL via HTTP..."
+    
+    while true; do
+        certbot certonly --standalone --dry-run -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
+        if [[ $? -eq 0 ]]; then
+            echo "✅ Test réussi, génération réelle du certificat..."
+            certbot certonly --standalone -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
+            break
+        else
+            echo "⚠️ Échec du test via HTTP. Tentative via DNS..."
+            echo "🔄 Test de génération d’un nouveau certificat SSL via challenge DNS..."
+            echo "🛠️ Veuillez ajouter un enregistrement TXT pour _acme-challenge.$fqdn avec la valeur fournie par certbot."
+            
+            while true; do
+                certbot certonly --manual --preferred-challenges dns --dry-run -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
+                if [[ $? -eq 0 ]]; then
+                    echo "✅ Test DNS réussi. Veuillez maintenant ajouter le bon enregistrement TXT."
+                    echo "⏳ Appuyez sur une touche pour continuer après l'ajout de l'enregistrement TXT..."
+                    read -n 1 -s  # Attente de l'appui sur une touche
+
+                    # Génération réelle du certificat avec DNS challenge
+                    echo "✅ Génération réelle du certificat via challenge DNS..."
+                    certbot certonly --manual --preferred-challenges dns -d "$fqdn" --non-interactive --agree-tos --register-unsafely-without-email
+                    break 2  # Sort de la boucle interne ET de la boucle externe
+                else
+                    echo "❌ Échec de la génération du certificat SSL avec toutes les méthodes."
+                    read -p "Voulez-vous interrompre le processus ? (o/n) : " choix
+                    if [[ "$choix" == "o" ]]; then
+                        exit 1
+                    fi
+                fi
+            done
+        fi
+    done
+    
+    echo "✅ Certificat SSL généré avec succès."
+}
+
+
+
+
+# Fonction pour récupérer et retourner les adresses IP de la machine
+get_server_ips() {
+    local SERVER_IP SERVER_IPv6
+
+    SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')
+    SERVER_IPv6=$(curl -6 -s ifconfig.me || hostname -I | awk '{print $2}')
+
+    echo "$SERVER_IP" "$SERVER_IPv6"
+}
diff --git a/notes/scripts/fetch_scripts.sh b/notes/scripts/fetch_scripts.sh
new file mode 100755
index 0000000..4da8fe4
--- /dev/null
+++ b/notes/scripts/fetch_scripts.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+# Définition du dépôt et du fichier contenant la liste des dossiers
+REPO_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts"
+DIR_LIST_FILE=".directories.txt"
+MANDATORY_DIR="common"
+
+# Télécharger la liste des dossiers disponibles
+TMP_DIR=$(mktemp -d)
+DIR_LIST_PATH="$TMP_DIR/$DIR_LIST_FILE"
+
+wget -q -O "$DIR_LIST_PATH" "$REPO_URL/$DIR_LIST_FILE"
+
+# Vérifier que la liste a bien été téléchargée
+if [ ! -s "$DIR_LIST_PATH" ]; then
+  echo "❌ Erreur : Impossible de récupérer la liste des dossiers."
+  exit 1
+fi
+
+# Lire les dossiers disponibles dans un tableau
+mapfile -t AVAILABLE_DIRS < "$DIR_LIST_PATH"
+
+# Vérifier qu'il y a bien des dossiers disponibles
+if [ ${#AVAILABLE_DIRS[@]} -eq 0 ]; then
+  echo "❌ Aucun dossier disponible dans la liste."
+  exit 1
+fi
+
+# Construire la liste pour whiptail
+CHOICES=()
+for dir in "${AVAILABLE_DIRS[@]}"; do
+  if [ "$dir" == "$MANDATORY_DIR" ]; then
+    continue  # Ne pas inclure le dossier obligatoire dans le choix
+  fi
+  CHOICES+=("$dir" "" OFF)
+done
+
+# Affichage du menu de sélection avec whiptail
+SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
+"Sélectionnez les dossiers à télécharger (le dossier '$MANDATORY_DIR' est obligatoire) :" 20 60 10 \
+"${CHOICES[@]}" 3>&1 1>&2 2>&3)
+
+# Vérifier si l'utilisateur a annulé
+if [ $? -ne 0 ]; then
+  echo "❌ Annulation par l'utilisateur."
+  exit 1
+fi
+
+# Ajouter le dossier obligatoire
+SELECTED_DIRS="$MANDATORY_DIR $SELECTED_DIRS"
+
+# Télécharger ou mettre à jour les fichiers pour chaque dossier sélectionné
+for TARGET_DIR in $SELECTED_DIRS; do
+  LIST_FILE=".list_files.txt"
+  LIST_PATH="$TMP_DIR/$LIST_FILE"
+
+  echo "🔹 Récupération des scripts de '$TARGET_DIR'..."
+
+  # Télécharger la liste des fichiers
+  wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/$LIST_FILE"
+
+  if [ ! -s "$LIST_PATH" ]; then
+    echo "❌ Erreur : Impossible de récupérer la liste des fichiers pour $TARGET_DIR."
+    continue
+  fi
+
+  # Création du répertoire s'il n'existe pas
+  mkdir -p "$TARGET_DIR"
+
+  # Télécharger chaque fichier listé
+  while read -r file; do
+    FILE_NAME=$(basename "$file")
+    FILE_PATH="$TARGET_DIR/$FILE_NAME"
+
+    if [ -f "$FILE_PATH" ]; then
+      echo "  ↻ Mise à jour de $FILE_NAME..."
+    else
+      echo "  ↳ Téléchargement de $FILE_NAME..."
+    fi
+    wget -q -O "$FILE_PATH" "$file"
+  done < "$LIST_PATH"
+
+  # Supprimer les fichiers obsolètes
+  for existing_file in "$TARGET_DIR"/*; do
+    if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
+      echo "  🗑 Suppression de $(basename "$existing_file")..."
+      rm "$existing_file"
+    fi
+  done
+
+  # Rendre exécutables les scripts téléchargés
+  chmod +x "$TARGET_DIR"/*.sh
+
+  echo "✅ Scripts de '$TARGET_DIR' mis à jour avec succès."
+done
+
+# Nettoyage
+rm -rf "$TMP_DIR"
+
+echo "🚀 Tous les scripts sélectionnés ont été mis à jour et sont exécutables."
diff --git a/notes/scripts/server-httpd/add_domain.sh b/notes/scripts/server-httpd/add_domain.sh
new file mode 100644
index 0000000..6a7c2b4
--- /dev/null
+++ b/notes/scripts/server-httpd/add_domain.sh
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+# Vérifier si le script est exécuté en root
+if [[ $EUID -ne 0 ]]; then
+   echo "❌ Ce script doit être exécuté en tant que root."
+   exit 1
+fi
+
+# Vérifier si un domaine a été fourni
+if [[ -z "$1" ]]; then
+    echo "❌ Usage : $0 <domaine>"
+    exit 2
+fi
+
+DOMAIN="$1"
+REVERSED_DOMAIN=$(echo "$DOMAIN" | awk -F. '{for(i=NF; i>0; i--) printf "%s%s", $i, (i>1 ? "." : "")}')
+VHOST_CONF="/etc/apache2/sites-available/$REVERSED_DOMAIN.conf"
+LE_DIR="/etc/letsencrypt/live/$DOMAIN"
+BACKUP_DIR="/etc/apache2/backups"
+TEMPLATE_DIR="/etc/apache2/templates"
+TEMPLATE="$TEMPLATE_DIR/vhost-template.conf"
+CHALLENGE_DIR="/var/www/cedrix"
+PATH_URL_CEDRIXCHALLENGE="cedrix-challenge"
+TEST_FILE="test-challenge"
+TEST_URL="http://${DOMAIN}/.well-known/${PATH_URL_CEDRIXCHALLENGE}/${TEST_FILE}"
+RANDOM_CONTENT=$(openssl rand -hex 12)
+
+# Créer les dossiers nécessaires
+mkdir -p "$BACKUP_DIR" "$TEMPLATE_DIR" "$CHALLENGE_DIR"
+chown -R www-data:www-data "$CHALLENGE_DIR"
+
+mkdir -p "/var/www/$REVERSED_DOMAIN"
+chown -R www-data:www-data "/var/www/$REVERSED_DOMAIN"
+chmod -R 755 "/var/www/$REVERSED_DOMAIN"
+
+# Vérifier si le VirtualHost HTTP existe déjà
+if [[ ! -f "$VHOST_CONF" ]]; then
+    echo "=== Création du fichier VirtualHost HTTP pour $DOMAIN ==="
+    cat > "$VHOST_CONF" <<EOF
+<VirtualHost *:80>
+    ServerName $DOMAIN
+    DocumentRoot /var/www/$REVERSED_DOMAIN
+    ErrorLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-error.log
+    CustomLog \${APACHE_LOG_DIR}/$REVERSED_DOMAIN-access.log combined
+
+    # Cedrix challenge
+    Alias /.well-known/${PATH_URL_CEDRIXCHALLENGE}/ $CHALLENGE_DIR/
+    <Directory $CHALLENGE_DIR>
+        Options +Indexes
+        AllowOverride None
+        Require all granted
+    </Directory>
+
+</VirtualHost>
+EOF
+else
+    echo "✅ VirtualHost HTTP déjà configuré pour $DOMAIN."
+fi
+
+# Activer le VirtualHost et recharger Apache
+a2ensite "$REVERSED_DOMAIN"
+systemctl reload apache2
+
+# Vérification d'accès au dossier Let's Encrypt
+echo "$RANDOM_CONTENT" | sudo tee "$CHALLENGE_DIR/$TEST_FILE" > /dev/null
+chmod 644 "$CHALLENGE_DIR/$TEST_FILE"
+RESPONSE=$(curl -s "$TEST_URL")
+
+if [[ "$RESPONSE" == "$RANDOM_CONTENT" ]]; then
+    echo "✅ Le dossier est accessible depuis l'extérieur."
+else
+    echo "❌ Le dossier n'est pas accessible depuis l'extérieur."
+    echo "URL testée : $TEST_URL"
+    echo "Vérifiez votre configuration Apache/Nginx et les permissions."
+    #sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
+    exit 3
+fi
+
+# Suppression du fichier test
+#sudo rm -f "$CHALLENGE_DIR/$TEST_FILE"
+
+# Vérifier si le certificat SSL existe déjà
+if [[ -d "$LE_DIR" ]]; then
+    echo "✅ Certificat SSL déjà installé pour $DOMAIN."
+else
+    echo "=== Vérification avec un test dry-run de certbot ==="
+    if certbot certonly --dry-run --apache --redirect -d "$DOMAIN"; then
+        echo "✅ Test réussi, la configuration semble correcte."
+    else
+        echo "❌ Le test dry-run de certbot a échoué. Vérifiez votre configuration."
+        exit 4
+    fi
+
+    echo "=== Demande du certificat SSL avec Let's Encrypt ==="
+    certbot --apache --redirect -d "$DOMAIN" --non-interactive --agree-tos --register-unsafely-without-email
+    
+    if [[ ! -f "$LE_DIR/fullchain.pem" ]]; then
+        echo "❌ Erreur lors de la génération du certificat SSL."
+        exit 5
+    fi
+
+    echo "✅ Certificat SSL installé avec succès."
+fi
+
+# Recharger Apache pour prendre en compte les changements
+systemctl reload apache2
+
+echo "✅ Virtual Host et certificat SSL configurés pour $DOMAIN avec succès !"
+exit 0
diff --git a/notes/scripts/server-httpd/setup_httpd.sh b/notes/scripts/server-httpd/setup_httpd.sh
new file mode 100644
index 0000000..722add6
--- /dev/null
+++ b/notes/scripts/server-httpd/setup_httpd.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# Importer les fonctions communes
+source "$(dirname "$0")/../common/common_utils.sh"
+
+# Vérifier si le script est exécuté en root
+check_root
+
+# Mise à jour du système
+update_system
+
+# Installation d'Apache et des outils nécessaires
+echo "=== Installation d'Apache et des outils nécessaires ==="
+apt install -y apache2 curl dnsutils certbot python3-certbot-apache
+
+# Activer et démarrer Apache
+echo "=== Activation et démarrage d'Apache ==="
+systemctl enable apache2
+systemctl start apache2
+
+# Activer les modules nécessaires
+a2enmod rewrite ssl headers
+systemctl reload apache2
+
+# Récupérer le FQDN
+FQDN=$(get_fqdn_and_domain | awk '{print $1}')
+echo "🔍 Serveur détecté : $FQDN"
+
+# Vérification DNS
+check_dns "$FQDN"
+
+# Configuration SSL
+setup_ssl "$FQDN"
+
+# Configurer le VirtualHost
+echo "=== Configuration du Virtual Host et SSL pour $FQDN ==="
+./add_domain.sh "$FQDN"
+EXIT_CODE=$?
+
+if [[ $EXIT_CODE -ne 0 ]]; then
+    echo "❌ Échec de la configuration du serveur ($FQDN). Code erreur : $EXIT_CODE"
+    exit $EXIT_CODE
+fi
+
+echo "✅ Installation et configuration réussies !"
diff --git a/notes/server-mail/scripts/scripts.txt b/notes/scripts/server-mail/.list_files.txt
similarity index 57%
rename from notes/server-mail/scripts/scripts.txt
rename to notes/scripts/server-mail/.list_files.txt
index b417d91..1c14543 100644
--- a/notes/server-mail/scripts/scripts.txt
+++ b/notes/scripts/server-mail/.list_files.txt
@@ -1,13 +1,13 @@
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/add_alias.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/add_domain.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/add_forward.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/add_user.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/del_alias.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/del_domain.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/del_user.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/generate_password.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/generate_script_list.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/list_aliases.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/list_domains_.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/list_users.sh
-https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/setup_mail.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/add_alias.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/add_domain.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/add_forward.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/add_user.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/del_alias.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/del_domain.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/del_user.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/generate_password.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/list_aliases.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/list_domains_.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/list_users.sh
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/README.md
+https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/setup_mail.sh
diff --git a/notes/server-mail/scripts/.prep_scripts_list.sh b/notes/scripts/server-mail/.prep_scripts_list.sh
similarity index 84%
rename from notes/server-mail/scripts/.prep_scripts_list.sh
rename to notes/scripts/server-mail/.prep_scripts_list.sh
index e80b7a4..1b194e5 100755
--- a/notes/server-mail/scripts/.prep_scripts_list.sh
+++ b/notes/scripts/server-mail/.prep_scripts_list.sh
@@ -1,16 +1,16 @@
 #!/bin/bash
 
 # Nom du fichier de sortie
-OUTPUT_FILE="scripts.txt"
+OUTPUT_FILE=".list_files.txt"
 
 # Nettoyage du fichier s'il existe déjà
 > "$OUTPUT_FILE"
 
 # Récupérer le chemin absolu du dossier courant côté Git
-BASE_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts"
+BASE_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail"
 
 # Lister tous les fichiers .sh et .py et générer l'URL complète
-for file in *.sh; do
+for file in *; do
   [ -e "$file" ] || continue  # Vérifie si des fichiers existent pour éviter une erreur
   echo "$BASE_URL/$file" >> "$OUTPUT_FILE"
 done
diff --git a/notes/server-mail/README.md b/notes/scripts/server-mail/README.md
similarity index 91%
rename from notes/server-mail/README.md
rename to notes/scripts/server-mail/README.md
index 991030b..04d65e4 100644
--- a/notes/server-mail/README.md
+++ b/notes/scripts/server-mail/README.md
@@ -9,6 +9,7 @@
 | `install_mailserver.sh` | Installer Postfix/Dovecot + ajouter un domaine | `./install_mailserver.sh domain.top` |
 | `add_domain.sh`      | Ajouter un domaine                          | `./add_domain.sh domain2.top` |
 | `add_user.sh`        | Ajouter un utilisateur                      | `./add_user.sh user@domain.top` |
+| `generate_passowrd.sh`  | Generer un mot de passe pour un utilisateur | `./generate_password.sh user@domain.top` |
 | `add_alias.sh`       | Ajouter un alias                            | `./add_alias.sh contact@domain2.top user@domain.top` |
 | `add_forward.sh`     | Ajouter une redirection                     | `./add_forward.sh contact@domain.top user@domain2.top` |
 | `list_domains.sh`    | Lister les domaines                         | `./list_domains.sh` |
@@ -25,7 +26,7 @@
 Pour télécharger uniquement les scripts `.sh` du dossier `server-mail/scripts`, utilisez la commande suivante : 
 
 ```bash
-wget -O scripts.txt "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/server-mail/scripts/scripts.txt"
+wget -O scripts.txt "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/notes/scripts/server-mail/.list_files.txt"
 while read -r url; do
   wget -O "$(basename "$url")" "$url"
 done < scripts.txt
diff --git a/notes/server-mail/scripts/add_alias.sh b/notes/scripts/server-mail/add_alias.sh
similarity index 100%
rename from notes/server-mail/scripts/add_alias.sh
rename to notes/scripts/server-mail/add_alias.sh
diff --git a/notes/server-mail/scripts/add_domain.sh b/notes/scripts/server-mail/add_domain.sh
similarity index 100%
rename from notes/server-mail/scripts/add_domain.sh
rename to notes/scripts/server-mail/add_domain.sh
diff --git a/notes/server-mail/scripts/add_forward.sh b/notes/scripts/server-mail/add_forward.sh
similarity index 100%
rename from notes/server-mail/scripts/add_forward.sh
rename to notes/scripts/server-mail/add_forward.sh
diff --git a/notes/server-mail/scripts/add_user.sh b/notes/scripts/server-mail/add_user.sh
similarity index 100%
rename from notes/server-mail/scripts/add_user.sh
rename to notes/scripts/server-mail/add_user.sh
diff --git a/notes/server-mail/scripts/del_alias.sh b/notes/scripts/server-mail/del_alias.sh
similarity index 100%
rename from notes/server-mail/scripts/del_alias.sh
rename to notes/scripts/server-mail/del_alias.sh
diff --git a/notes/server-mail/scripts/del_domain.sh b/notes/scripts/server-mail/del_domain.sh
similarity index 100%
rename from notes/server-mail/scripts/del_domain.sh
rename to notes/scripts/server-mail/del_domain.sh
diff --git a/notes/server-mail/scripts/del_user.sh b/notes/scripts/server-mail/del_user.sh
similarity index 100%
rename from notes/server-mail/scripts/del_user.sh
rename to notes/scripts/server-mail/del_user.sh
diff --git a/notes/server-mail/scripts/generate_password.sh b/notes/scripts/server-mail/generate_password.sh
similarity index 100%
rename from notes/server-mail/scripts/generate_password.sh
rename to notes/scripts/server-mail/generate_password.sh
diff --git a/notes/server-mail/scripts/list_aliases.sh b/notes/scripts/server-mail/list_aliases.sh
similarity index 100%
rename from notes/server-mail/scripts/list_aliases.sh
rename to notes/scripts/server-mail/list_aliases.sh
diff --git a/notes/server-mail/scripts/list_domains_.sh b/notes/scripts/server-mail/list_domains_.sh
similarity index 100%
rename from notes/server-mail/scripts/list_domains_.sh
rename to notes/scripts/server-mail/list_domains_.sh
diff --git a/notes/server-mail/scripts/list_users.sh b/notes/scripts/server-mail/list_users.sh
similarity index 100%
rename from notes/server-mail/scripts/list_users.sh
rename to notes/scripts/server-mail/list_users.sh
diff --git a/notes/scripts/server-mail/setup_mail.sh b/notes/scripts/server-mail/setup_mail.sh
new file mode 100755
index 0000000..4272786
--- /dev/null
+++ b/notes/scripts/server-mail/setup_mail.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# Importer les fonctions communes
+source "$(dirname "$0")/../common/common_utils.sh"
+
+# Vérifier si le script est exécuté en root
+check_root
+
+# Mise à jour du système
+update_system
+
+# Installation de Postfix, Dovecot et outils nécessaires
+echo "=== Installation de Postfix, Dovecot et outils nécessaires ==="
+apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve certbot curl dnsutils
+
+# Récupérer le FQDN et le domaine
+read FQDN DOMAIN <<< $(get_fqdn_and_domain)
+echo "🔍 Serveur détecté : $FQDN"
+echo "🌐 Domaine géré pour les emails : $DOMAIN"
+
+# Vérification DNS
+check_dns "$FQDN"
+
+# Génération du certificat SSL
+setup_ssl "$FQDN"
+
+# Configuration de Postfix
+echo "=== Configuration de Postfix ==="
+cat > /etc/postfix/main.cf <<EOF
+smtpd_banner = \$myhostname ESMTP
+biff = no
+append_dot_mydomain = no
+readme_directory = no
+myhostname = $FQDN
+myorigin = /etc/mailname
+mydestination = localhost
+relayhost =
+mynetworks = 127.0.0.0/8
+mailbox_size_limit = 0
+recipient_delimiter = +
+inet_interfaces = all
+inet_protocols = ipv4
+
+# Sécurisation avec TLS
+smtpd_tls_cert_file=/etc/letsencrypt/live/$FQDN/fullchain.pem
+smtpd_tls_key_file=/etc/letsencrypt/live/$FQDN/privkey.pem
+smtpd_use_tls=yes
+smtpd_tls_auth_only = yes
+EOF
+
+# Configuration de Dovecot
+echo "=== Configuration de Dovecot ==="
+cat > /etc/dovecot/dovecot.conf <<EOF
+disable_plaintext_auth = no
+ssl = required
+ssl_cert = </etc/letsencrypt/live/$FQDN/fullchain.pem
+ssl_key = </etc/letsencrypt/live/$FQDN/privkey.pem
+mail_location = maildir:/var/mail/vhosts/%d/%n
+
+protocols = imap pop3 lmtp
+auth_mechanisms = plain login
+
+service imap-login {
+  inet_listener imap {
+    port = 143
+  }
+  inet_listener imaps {
+    port = 993
+    ssl = yes
+  }
+}
+service pop3-login {
+  inet_listener pop3 {
+    port = 110
+  }
+  inet_listener pop3s {
+    port = 995
+    ssl = yes
+  }
+}
+EOF
+
+# Redémarrer les services
+echo "=== Redémarrage des services ==="
+systemctl restart postfix dovecot
+systemctl enable postfix dovecot
+
+# Ajout d'un cron pour renouveler le certificat
+echo "0 3 * * * certbot renew --quiet && systemctl reload postfix dovecot" > /etc/cron.d/letsencrypt-renew
+
+echo "✅ Configuration terminée avec succès !"
diff --git a/notes/server-mail/scripts/setup_mail.sh b/notes/server-mail/scripts/setup_mail.sh
deleted file mode 100755
index e8cf298..0000000
--- a/notes/server-mail/scripts/setup_mail.sh
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/bin/bash
-
-
-
-
-# Vérifier si le script est exécuté en root
-if [[ $EUID -ne 0 ]]; then
-   echo "❌ Ce script doit être exécuté en tant que root." 
-   exit 1
-fi
-
-
-
-echo "=== Mise à jour du système ==="
-apt update && apt upgrade -y
-
-echo "=== Installation de Postfix, Dovecot et outils nécessaires ==="
-apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve certbot curl dnsutils
-
-# Récupérer le nom d’hôte complet (FQDN)
-FQDN=$(hostname -f)
-
-# Vérifier si le FQDN est vide
-if [[ -z "$FQDN" ]]; then
-    FQDN=$(cat /etc/hostname)
-fi
-
-# Extraire le domaine principal (ex: mail.acemail.fr -> acemail.fr)
-DOMAIN=$(echo "$FQDN" | sed -E 's/^[^.]+\.//')
-
-echo "🔍 Serveur détecté : $FQDN"
-echo "🌐 Domaine géré pour les emails : $DOMAIN"
-
-
-# Récupération des IP (IPv4 et IPv6)
-SERVER_IP=$(curl -4 -s ifconfig.me || hostname -I | awk '{print $1}')
-SERVER_IPv6=$(curl -6 -s ifconfig.me || hostname -I | awk '{print $2}')
-FQDN_IP=$(dig +short A "$FQDN" | tail -n1)
-FQDN_IPv6=$(dig +short AAAA "$FQDN" | tail -n1)
-
-echo "🌍 IP publique du serveur : $SERVER_IP (IPv4), $SERVER_IPv6 (IPv6)"
-echo "🔎 IP DNS du serveur : $FQDN_IP (IPv4), $FQDN_IPv6 (IPv6)"
-
-
-# Vérification du DNS
-if [[ -z "$FQDN_IP" ]]; then
-    echo "❌ Impossible de récupérer l'IP du serveur ($FQDN)."
-    echo "🔹 Vérifie la configuration DNS et assure-toi que le nom de serveur pointe bien vers ce serveur."
-    exit 1
-fi
-
-if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
-    echo "⚠️  Problème DNS : L'IP du serveur ($FQDN_IP) ne correspond pas à l'IP du serveur ($SERVER_IP)."
-    echo "🔹 Corrige l'entrée DNS ou attends sa propagation avant de continuer."
-    exit 1
-fi
-
-echo "✅ DNS correct : $FQDN pointe bien vers $SERVER_IP"
-
-
-# Variables
-MAIL_DIR="/var/mail/vhosts"
-LE_DIR="/etc/letsencrypt/live/$FQDN"
-BACKUP_DIR="/backup/mail"
-
-echo "=== Génération du certificat SSL avec Let's Encrypt ==="
-if [[ -f "$LE_DIR/fullchain.pem" ]]; then
-    echo "✅ Certificat SSL déjà existant."
-    openssl x509 -noout -text -in "$LE_DIR/fullchain.pem" | grep "Not After"
-else
-    echo "🔄 Génération d’un nouveau certificat SSL..."
-    certbot certonly --standalone -d "$FQDN" --non-interactive --agree-tos --register-unsafely-without-email
-    if [[ $? -ne 0 ]]; then
-        echo "❌ Erreur lors de la génération du certificat Let's Encrypt."
-        exit 1
-    fi
-fi
-
-
-# Création des fichiers de configuration
-mkdir -p "$BACKUP_DIR"
-
-echo "=== Configuration de Postfix ==="
-cat > /etc/postfix/main.cf <<EOF
-smtpd_banner = \$myhostname ESMTP
-biff = no
-append_dot_mydomain = no
-readme_directory = no
-myhostname = $FQDN
-myorigin = /etc/mailname
-mydestination = localhost
-relayhost =
-mynetworks = 127.0.0.0/8
-mailbox_size_limit = 0
-recipient_delimiter = +
-inet_interfaces = all
-inet_protocols = ipv4
-
-# Sécurisation avec TLS
-smtpd_tls_cert_file=$LE_DIR/fullchain.pem
-smtpd_tls_key_file=$LE_DIR/privkey.pem
-smtpd_use_tls=yes
-smtpd_tls_auth_only = yes
-EOF
-
-echo "=== Configuration de Dovecot ==="
-cat > /etc/dovecot/dovecot.conf <<EOF
-disable_plaintext_auth = no
-ssl = required
-ssl_cert = <$LE_DIR/fullchain.pem
-ssl_key = <$LE_DIR/privkey.pem
-mail_location = maildir:$MAIL_DIR/%d/%n
-
-protocols = imap pop3 lmtp
-auth_mechanisms = plain login
-
-service imap-login {
-  inet_listener imap {
-    port = 143
-  }
-  inet_listener imaps {
-    port = 993
-    ssl = yes
-  }
-}
-service pop3-login {
-  inet_listener pop3 {
-    port = 110
-  }
-  inet_listener pop3s {
-    port = 995
-    ssl = yes
-  }
-}
-EOF
-
-echo "=== Redémarrage des services ==="
-systemctl restart postfix dovecot
-systemctl enable postfix dovecot
-
-echo "=== Vérification des ports ouverts ==="
-ss -tulpen | grep -E "postfix|dovecot"
-
-echo "=== Ajout d’un cron pour renouveler le certificat ==="
-echo "0 3 * * * certbot renew --quiet && systemctl reload postfix dovecot" > /etc/cron.d/letsencrypt-renew
-
-echo "✅ Configuration terminée avec succès !"
\ No newline at end of file