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