Compare commits

...

5 Commits

23 changed files with 586 additions and 179 deletions

View File

@ -0,0 +1,3 @@
common
server-httpd
server-mail

View File

@ -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"

38
notes/scripts/README.md Normal file
View File

@ -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.

View File

@ -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 dhô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 dun 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 dun 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"
}

100
notes/scripts/fetch_scripts.sh Executable file
View File

@ -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."

View File

@ -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

View File

@ -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 !"

View File

@ -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

View File

@ -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 *.py; 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

View File

@ -6,26 +6,27 @@
# **📌 Résumé des Scripts**
| **Script** | **Action** | **Exemple d'utilisation** |
|----------------------|-----------------------------------------------|--------------------------|
| `install_mailserver.sh` | Installer Postfix/Dovecot + ajouter un domaine | `bash install_mailserver.sh domain.top` |
| `add_domain.sh` | Ajouter un domaine | `bash add_domain.sh domain2.top` |
| `add_user.sh` | Ajouter un utilisateur | `bash add_user.sh user@domain.top "password"` |
| `add_alias.sh` | Ajouter un alias | `bash add_alias.sh contact@domain2.top user@domain.top` |
| `add_forward.sh` | Ajouter une redirection | `bash add_forward.sh contact@domain.top user@domain2.top` |
| `list_domains.sh` | Lister les domaines | `bash list_domains.sh` |
| `list_users.sh` | Lister les utilisateurs | `bash list_users.sh` |
| `list_aliases.sh` | Lister les alias/redirections | `bash list_aliases.sh` |
| `del_user.sh` | Supprimer un utilisateur | `bash del_user.sh user@domain.top` |
| `del_alias.sh` | Supprimer un alias | `bash del_alias.sh contact@domain2.top` |
| `del_domain.sh` | Supprimer un domaine | `bash del_domain.sh domain2.top` |
| `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` |
| `list_users.sh` | Lister les utilisateurs | `./list_users.sh` |
| `list_aliases.sh` | Lister les alias/redirections | `./list_aliases.sh` |
| `del_user.sh` | Supprimer un utilisateur | `./del_user.sh user@domain.top` |
| `del_alias.sh` | Supprimer un alias | `./del_alias.sh contact@domain2.top` |
| `del_domain.sh` | Supprimer un domaine | `./del_domain.sh domain2.top` |
---
## 📥 Récupération des scripts
Pour télécharger uniquement les scripts `.sh` et `.py` du dossier `server-mail/scripts`, utilisez la commande suivante :
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
@ -33,7 +34,6 @@ chmod +x *.sh
```
✅ Tous les fichiers listés dans scripts.txt seront téléchargés automatiquement dans le dossier courant.
📌 **Astuce** : Assurez-vous dexécuter cette commande dans le dossier où vous souhaitez stocker les fichiers.
Tous les fichiers listés dans scripts.txt seront téléchargés automatiquement dans le dossier courant.
Assurez-vous dexécuter cette commande dans le dossier où vous souhaitez stocker les fichiers.

View File

@ -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 !"

View File

@ -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 dhô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 dun 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 dun 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 !"