notes-techniques/notes/scripts/server-httpd/add_domain.sh

110 lines
3.5 KiB
Bash

#!/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