← Retour
#!/bin/bash
# ===========================================
# Script de déploiement Nginx automatisé
# Usage: ./deploy-nginx.sh <config_file> [--dry-run]
# ===========================================
set -e
# Configuration
NGINX_HOST="192.168.1.104"
NGINX_USER="gouroubleu"
NGINX_SITES_AVAILABLE="/etc/nginx/sites-available"
NGINX_SITES_ENABLED="/etc/nginx/sites-enabled"
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Vérification des arguments
if [ -z "$1" ]; then
echo "Usage: $0 <config_file.conf> [--dry-run]"
echo ""
echo "Options:"
echo " --dry-run Affiche ce qui serait fait sans l'exécuter"
echo ""
echo "Exemple:"
echo " $0 /tmp/myapp.33800.nowhere84.com.conf"
exit 1
fi
CONFIG_FILE="$1"
DRY_RUN=false
if [ "$2" == "--dry-run" ]; then
DRY_RUN=true
log_warn "Mode dry-run activé"
fi
# Vérification du fichier
if [ ! -f "$CONFIG_FILE" ]; then
log_error "Fichier non trouvé: $CONFIG_FILE"
exit 1
fi
CONFIG_NAME=$(basename "$CONFIG_FILE")
log_info "Déploiement de: $CONFIG_NAME"
# Test de connexion SSH
log_info "Test connexion SSH vers $NGINX_HOST..."
if ! ssh -o ConnectTimeout=5 -o BatchMode=yes "$NGINX_USER@$NGINX_HOST" "echo 'SSH OK'" > /dev/null 2>&1; then
log_error "Impossible de se connecter à $NGINX_HOST"
exit 1
fi
log_info "Connexion SSH OK"
# Vérification si le fichier existe déjà
REMOTE_FILE="$NGINX_SITES_AVAILABLE/$CONFIG_NAME"
if ssh "$NGINX_USER@$NGINX_HOST" "[ -f '$REMOTE_FILE' ]" 2>/dev/null; then
log_warn "Le fichier $CONFIG_NAME existe déjà sur le serveur"
# Créer un backup
if [ "$DRY_RUN" = false ]; then
BACKUP_NAME="${CONFIG_NAME}.backup.$(date +%Y%m%d%H%M%S)"
log_info "Création backup: $BACKUP_NAME"
ssh "$NGINX_USER@$NGINX_HOST" "cp '$REMOTE_FILE' '$NGINX_SITES_AVAILABLE/$BACKUP_NAME'"
else
log_info "[DRY-RUN] Créerait un backup du fichier existant"
fi
fi
# Copie du fichier
if [ "$DRY_RUN" = false ]; then
log_info "Copie vers $NGINX_HOST:$REMOTE_FILE"
scp "$CONFIG_FILE" "$NGINX_USER@$NGINX_HOST:$REMOTE_FILE"
else
log_info "[DRY-RUN] Copierait $CONFIG_FILE vers $REMOTE_FILE"
fi
# Création du symlink si pas déjà présent
SYMLINK="$NGINX_SITES_ENABLED/$CONFIG_NAME"
if ! ssh "$NGINX_USER@$NGINX_HOST" "[ -L '$SYMLINK' ]" 2>/dev/null; then
if [ "$DRY_RUN" = false ]; then
log_info "Création symlink vers sites-enabled"
ssh "$NGINX_USER@$NGINX_HOST" "ln -sf '$REMOTE_FILE' '$SYMLINK'"
else
log_info "[DRY-RUN] Créerait symlink $SYMLINK -> $REMOTE_FILE"
fi
else
log_info "Symlink déjà présent"
fi
# Test de la configuration Nginx
log_info "Test de la configuration Nginx..."
if [ "$DRY_RUN" = false ]; then
if ssh "$NGINX_USER@$NGINX_HOST" "sudo /usr/sbin/nginx -t" 2>&1; then
log_info "Configuration Nginx valide"
else
log_error "Configuration Nginx invalide!"
log_error "Restauration du backup..."
if [ -n "$BACKUP_NAME" ]; then
ssh "$NGINX_USER@$NGINX_HOST" "cp '$NGINX_SITES_AVAILABLE/$BACKUP_NAME' '$REMOTE_FILE'"
fi
exit 1
fi
else
log_info "[DRY-RUN] Testerait la configuration Nginx"
fi
# Reload Nginx
if [ "$DRY_RUN" = false ]; then
log_info "Rechargement de Nginx..."
ssh "$NGINX_USER@$NGINX_HOST" "sudo /usr/bin/systemctl reload nginx"
log_info "Nginx rechargé avec succès"
else
log_info "[DRY-RUN] Rechargerait Nginx"
fi
# Extraction des server_name pour les tests
log_info "Extraction des domaines configurés..."
DOMAINS=$(grep -oP 'server_name \K[^;]+' "$CONFIG_FILE" | tr ' ' '\n' | sort -u)
echo ""
log_info "=== Déploiement terminé ==="
echo ""
echo "Domaines configurés:"
for domain in $DOMAINS; do
echo " - https://$domain"
done
echo ""
# Test des URLs (optionnel)
if [ "$DRY_RUN" = false ]; then
log_info "Test des URLs..."
for domain in $DOMAINS; do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "https://$domain" 2>/dev/null || echo "ERR")
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "302" ]; then
echo -e " ${GREEN}✅${NC} https://$domain -> $HTTP_CODE"
else
echo -e " ${RED}❌${NC} https://$domain -> $HTTP_CODE"
fi
done
fi
echo ""
log_info "Done!"