Compare commits
5 Commits
71fc606145
...
54a0c21787
Author | SHA1 | Date |
---|---|---|
|
54a0c21787 | |
|
240acff0d4 | |
|
93855e11e6 | |
|
e9cc0b8221 | |
|
35dc05df26 |
notes
scripts
server-mail/scripts
|
@ -0,0 +1,3 @@
|
|||
common
|
||||
server-httpd
|
||||
server-mail
|
|
@ -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"
|
|
@ -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.
|
|
@ -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"
|
||||
}
|
|
@ -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."
|
|
@ -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
|
|
@ -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 !"
|
|
@ -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
|
|
@ -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
|
|
@ -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 d’exé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 d’exécuter cette commande dans le dossier où vous souhaitez stocker les fichiers.
|
|
@ -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 !"
|
|
@ -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 !"
|
Loading…
Reference in New Issue