Déploiement automatisé de n8n sur Ubuntu via script Bash (Docker + Nginx)

Déploiement automatisé de n8n sur Ubuntu via script Bash (Docker + Nginx)

🧪 Instructions d’utilisation

Créer le fichier du script :

 nano install_n8n.sh

Coller le script complet (fourni ci-dessous), puis :

  • Appuyez sur CTRL + O pour enregistrer,
    • Appuyez sur ENTRÉE,
    • Puis CTRL + X pour quitter l’éditeur.
#!/bin/bash

# ==============================================
# Script interactif d'installation de n8n sur Ubuntu
# Docker officiel + Nginx + Certbot + gestion UFW
# Par Gemini-Connect
# ==============================================

echo "🌟 Bienvenue dans le script d'installation de n8n !"

# === Demande du nom de domaine et email
read -rp "👉 Entrez le nom de domaine complet pour accéder à n8n (ex : n8n.mondomaine.fr) : " DOMAINE
read -rp "📧 Entrez votre adresse email pour Certbot (Let's Encrypt) : " EMAIL

echo "🔄 Mise à jour des paquets disponibles..."
sudo apt update -y

# === Demander si l'utilisateur souhaite faire un upgrade du système
read -rp "🔧 Souhaitez-vous mettre à jour tous les paquets du système (apt upgrade) ? (o/n) : " REP_UPGRADE
if [[ "$REP_UPGRADE" == "o" || "$REP_UPGRADE" == "O" ]]; then
  sudo apt upgrade -y
else
  echo "⏭️ Mise à jour du système ignorée à votre demande."
fi

# === Installation des paquets nécessaires
echo "📦 Vérification des paquets requis pour Docker..."
sudo apt install -y ca-certificates curl gnupg lsb-release

# === Installation de Docker s'il n'est pas présent
if ! command -v docker &> /dev/null; then
  echo "🐳 Installation de Docker à partir du dépôt officiel..."
  sudo install -m 0755 -d /etc/apt/keyrings
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
  sudo chmod a+r /etc/apt/keyrings/docker.asc

  echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  sudo apt update -y
  sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
else
  echo "✅ Docker est déjà installé."
fi

# === Création du volume Docker
if ! docker volume inspect n8n_data &>/dev/null; then
  echo "💾 Création du volume Docker 'n8n_data'..."
  docker volume create n8n_data
else
  echo "✅ Le volume Docker 'n8n_data' existe déjà."
fi

# === Lancement du conteneur n8n
if ! docker ps -a --format '{{.Names}}' | grep -q "^n8n$"; then
  echo "🚀 Lancement du conteneur Docker n8n..."
  docker run -d --restart unless-stopped -it \
    --name n8n \
    -p 5678:5678 \
    -e N8N_HOST="$DOMAINE" \
    -e VUE_APP_URL_BASE_API="https://$DOMAINE/" \
    -e WEBHOOK_TUNNEL_URL="https://$DOMAINE/" \
    -e N8N_PUSH_BACKEND="websocket" \
    -v n8n_data:/root/.n8n \
    n8nio/n8n
else
  echo "✅ Le conteneur 'n8n' existe déjà. Redémarrage..."
  docker restart n8n
fi

# === Installation de Nginx
if ! command -v nginx &> /dev/null; then
  echo "🌐 Installation de Nginx..."
  sudo apt install nginx -y
else
  echo "✅ Nginx est déjà installé."
fi

# === Création intelligente du fichier Nginx
NGINX_CONF="/etc/nginx/sites-available/n8n"
TEMP_CONF="/tmp/n8n_nginx_temp.conf"

echo "🛠️ Préparation de la configuration Nginx pour $DOMAINE..."

# Génération du contenu attendu dans un fichier temporaire
cat <<EOF > "$TEMP_CONF"
server {
    listen 80;
    server_name $DOMAINE;

    location / {
        proxy_pass http://localhost:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_set_header X-Frame-Options SAMEORIGIN;
        proxy_set_header X-Content-Type-Options nosniff;
        proxy_set_header X-XSS-Protection "1; mode=block";
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
    }
}
EOF

# Comparaison avec la config existante
if [ -f "$NGINX_CONF" ]; then
  echo "🔍 Une configuration Nginx existe déjà."

  if ! cmp -s "$NGINX_CONF" "$TEMP_CONF"; then
    BACKUP_PATH="/etc/nginx/sites-available/n8n.backup.$(date +%Y%m%d-%H%M%S)"
    echo "⚠️ Configuration différente détectée. Sauvegarde vers : $BACKUP_PATH"
    sudo cp "$NGINX_CONF" "$BACKUP_PATH"
    sudo cp "$TEMP_CONF" "$NGINX_CONF"
  else
    echo "✅ La configuration Nginx est déjà correcte."
  fi
else
  echo "📝 Création de la configuration Nginx..."
  sudo cp "$TEMP_CONF" "$NGINX_CONF"
fi

# Lien symbolique si absent
if [ ! -L /etc/nginx/sites-enabled/n8n ]; then
  sudo ln -s "$NGINX_CONF" /etc/nginx/sites-enabled/
fi

rm "$TEMP_CONF"

# Redémarrage de Nginx
sudo nginx -t && sudo systemctl restart nginx

# === Installation de Certbot
if ! command -v certbot &> /dev/null; then
  echo "🔐 Installation de Certbot et du plugin Nginx..."
  sudo apt install -y certbot python3-certbot-nginx
else
  echo "✅ Certbot est déjà installé."
fi

# === Certificat SSL
if [ ! -d "/etc/letsencrypt/live/$DOMAINE" ]; then
  echo "📜 Obtention du certificat SSL pour $DOMAINE..."
  sudo certbot --nginx -d "$DOMAINE" --non-interactive --agree-tos -m "$EMAIL"
else
  echo "✅ Certificat SSL Let’s Encrypt déjà présent."
fi

# === Ports via UFW
read -rp "🔓 Souhaitez-vous ouvrir les ports 80, 443 et 5678 via UFW (pare-feu) ? (o/n) : " REP_PORTS
if [[ "$REP_PORTS" == "o" || "$REP_PORTS" == "O" ]]; then
  echo "🔓 Ouverture des ports..."
  sudo ufw allow 80
  sudo ufw allow 443
  sudo ufw allow 5678
else
  echo "⛔ Ouverture des ports annulée par l'utilisateur."
fi

# === Fin
echo "🔁 Redémarrage de n8n pour finaliser..."
docker restart n8n

echo "🎉 Installation terminée avec succès !"
echo "🌍 Accédez à n8n ici : https://$DOMAINE"

Rendre le script exécutable :

chmod +x install_n8n.sh

Lancer le script avec sudo :

sudo ./install_n8n.sh

⚠️ Important : Le script demande des informations à l’utilisateur (read) — en l’exécutant avec sudo, ces prompts resteront visibles uniquement si vous l’exécutez directement en tant que sudo ./script.sh (et non avec sudo bash script.sh, qui masque parfois les entrées).

Partager :

Nous contacter :

Phone: 09 78 25 06 68
Email: