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.
- Appuyez sur
#!/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).