tva
← Analyses

Auto-hébergement de n8n sur Hetzner Cloud : tutoriel complet de configuration Docker

L’automatisation des flux de travail est devenue essentielle pour les entreprises modernes, mais les solutions SaaS peuvent devenir coûteuses à mesure que les équipes grandissent. Nous vous montrons comment configurer votre propre instance n8n sur Hetzner Cloud pour environ 6 €/mois plus le coût du nom de domaine (en octobre 2026), ce qui vous donne un nombre illimité de flux de travail et un contrôle total sur votre plateforme d’automatisation.

Ce que vous allez construire

À la fin de ce tutoriel, vous disposerez de :

  • Une installation n8n entièrement fonctionnelle avec HTTPS
  • Des certificats SSL automatiques via Let's Encrypt
  • Une intégration de la messagerie pour les comptes utilisateurs
  • Un démarrage automatique après les redémarrages du serveur
  • Une base solide pour un usage professionnel, que vous pouvez sécuriser davantage pour la production

Coût mensuel : 5,99 € (serveur CX23, hors TVA, avec une adresse IPv4 principale incluse, en octobre 2026) + coût du nom de domaine

Prérequis

  • Nom de domaine pointant vers l’IP de votre serveur
  • Connaissances de base en ligne de commande
  • Compte Hetzner Cloud

Étape 1 : configuration du serveur

Créer un serveur Hetzner Cloud

  1. Connectez-vous à la console Hetzner Cloud
  2. Créez un nouveau projet
  3. Ajoutez un serveur avec ces spécifications :
    • Image : Ubuntu 24.04 LTS
    • Type : CX23 (2 vCPU, 4 Go de RAM, 40 Go de disque) ; Hetzner a retiré le CX11 des nouvelles commandes en septembre 2024 et la disponibilité des offres à coût optimisé varie selon la localisation
    • Localisation : choisissez la plus proche de vos utilisateurs
    • Clé SSH : ajoutez votre clé publique

Configuration initiale du serveur

Connectez-vous à votre serveur :

ssh root@YOUR_SERVER_IP

Mettez à jour le système :

apt update && apt upgrade -y

Étape 2 : installer Docker

Installez Docker et Docker Compose :

# Install dependencies
apt install apt-transport-https ca-certificates curl software-properties-common gnupg -y

# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Create Docker network for our services
docker network create proxy

Vérifiez l’installation de Docker :

docker --version
docker compose version

Étape 3 : configurer le proxy inverse Traefik

Créez la structure de répertoires :

mkdir -p /opt/traefik/data
cd /opt/traefik

Créez le fichier de configuration Traefik :

nano /opt/traefik/data/traefik.yml

Ajoutez cette configuration :

api:
  dashboard: false

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]  # Change this!
      storage: acme.json
      httpChallenge:
        entryPoint: http

Créez le fichier acme.json pour les certificats SSL :

touch /opt/traefik/data/acme.json
chmod 600 /opt/traefik/data/acme.json

Créez le fichier Docker Compose de Traefik :

nano /opt/traefik/docker-compose.yml

Ajoutez cette configuration :

version: '3'

services:
  traefik:
    image: traefik:v3.4
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/etc/traefik/traefik.yml
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"

networks:
  proxy:
    external: true

Étape 4 : configurer le relais SMTP (facultatif mais recommandé)

Créez le répertoire du serveur de messagerie :

mkdir -p /opt/mailserver
cd /opt/mailserver

Créez le fichier Docker Compose :

nano /opt/mailserver/docker-compose.yml

Ajoutez cette configuration :

version: '3'

services:
  mailserver:
    image: bytemark/smtp
    restart: always
    networks:
      - proxy
    environment:
      - RELAY_HOST=smtp.gmail.com  # Change to your SMTP provider
      - RELAY_PORT=587
      - [email protected]  # Change this
      - RELAY_PASSWORD=your-app-password     # Change this
      - MAILNAME=mail.yourdomain.com         # Change this

networks:
  proxy:
    external: true

Remarque : n8n accède au relais via le réseau partagé proxy. Le relais ne publie donc aucun port. Les ports publiés par Docker contournent les règles UFW ; n’en ajoutez un que si un autre hôte doit envoyer des messages via le relais. MAILNAME définit le nom d’hôte de messagerie du relais. Pour Gmail, vous devrez :

  1. Activer l’authentification à deux facteurs
  2. Générer un mot de passe d’application
  3. Utiliser le mot de passe d’application (pas votre mot de passe habituel)

Étape 5 : configurer n8n

Créez le répertoire n8n. Le conteneur n8n s’exécute avec l’utilisateur node (UID 1000). Assurez-vous donc que cet utilisateur peut écrire dans le dossier data monté par bind mount, par exemple avec mkdir -p /opt/n8n/data && chown -R 1000:1000 /opt/n8n/data :

mkdir -p /opt/n8n
cd /opt/n8n

Créez le fichier Docker Compose :

nano /opt/n8n/docker-compose.yml

Ajoutez cette configuration :

version: '3'

services:
  n8n:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com          # Change this!
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com  # Change this!
      
      # Email configuration
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - [email protected]  # Change this!
      
      # Important fixes for proxy setup
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"  # Change this!
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Étape 6 : créer les services Systemd pour le démarrage automatique

Service Traefik

nano /etc/systemd/system/traefik-docker.service

Ajoutez cette configuration :

[Unit]
Description=Traefik Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/traefik
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Service du serveur de messagerie

nano /etc/systemd/system/mailserver-docker.service

Ajoutez cette configuration :

[Unit]
Description=Mailserver Docker Compose
Requires=docker.service
After=docker.service
Before=n8n-docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mailserver
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Service n8n

nano /etc/systemd/system/n8n-docker.service

Ajoutez cette configuration :

[Unit]
Description=n8n Docker Compose
Requires=docker.service
After=docker.service traefik-docker.service mailserver-docker.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n
ExecStartPre=/bin/bash -c 'until docker container inspect traefik > /dev/null 2>&1; do sleep 2; done'
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=30
TimeoutStartSec=180

[Install]
WantedBy=multi-user.target

Activer et démarrer les services

# Reload systemd daemon
systemctl daemon-reload

# Enable services to start on boot
systemctl enable traefik-docker.service
systemctl enable mailserver-docker.service
systemctl enable n8n-docker.service

# Start services
systemctl start traefik-docker.service
sleep 10
systemctl start mailserver-docker.service
sleep 10
systemctl start n8n-docker.service

Étape 7 : configuration DNS

Dirigez votre domaine vers votre serveur :

  1. Accédez à l’interface de votre bureau d’enregistrement de noms de domaine ou de votre fournisseur DNS
  2. Créez un enregistrement A :
    • Nom : n8n
    • Type : A
    • Valeur : YOUR_SERVER_IP
    • TTL : 300 (ou le minimum autorisé)

Attendez la propagation DNS (elle peut prendre jusqu’à 24 heures, mais elle est généralement bien plus rapide).

Étape 8 : tester votre installation

Vérifiez si les services fonctionnent :

docker ps

Vous devriez voir trois conteneurs en cours d’exécution : traefik, mailserver et n8n.

Visitez votre instance n8n :

https://n8n.yourdomain.com

Vous devriez voir la page de configuration n8n en HTTPS, avec un certificat indiqué comme valide par votre navigateur.

Résolution des problèmes courants

Le certificat SSL ne fonctionne pas

Vérifiez les journaux Traefik :

docker logs traefik

Causes courantes :

  • Le DNS ne pointe pas vers le serveur
  • Le pare-feu bloque les ports 80/443
  • Mauvais domaine dans la configuration

n8n non accessible

Vérifiez les journaux n8n :

docker logs n8n-n8n-1

Corrections courantes :

  • Vérifiez que la configuration du domaine correspond dans tous les fichiers
  • Vérifiez que tous les conteneurs sont dans le même réseau
  • Si les journaux affichent ERR_ERL_UNEXPECTED_X_FORWARDED_FOR, vérifiez que N8N_PROXY_HOPS=1 est défini comme dans la configuration ci-dessus ; n8n le documente pour un fonctionnement derrière un proxy inverse

La messagerie ne fonctionne pas

Vérifiez les journaux du serveur de messagerie :

docker logs mailserver-mailserver-1

Vérifiez les identifiants et paramètres SMTP.

Les services ne démarrent pas après un redémarrage

Vérifiez le statut des services :

systemctl status traefik-docker.service
systemctl status n8n-docker.service

Redémarrez si nécessaire :

systemctl restart traefik-docker.service
systemctl restart n8n-docker.service

Maintenance et mises à jour

Maintenance régulière

Vérifications hebdomadaires :

# Check container status
docker ps

# Check disk space
df -h

# Check logs for errors
docker logs n8n-n8n-1 | grep -i error

Mises à jour mensuelles :

# Update container images
cd /opt/n8n && docker compose pull && docker compose up -d
cd /opt/traefik && docker compose pull && docker compose up -d
cd /opt/mailserver && docker compose pull && docker compose up -d

# Clean up old images
docker system prune -f

Sauvegarder vos données

Créez un script de sauvegarde. La base SQLite utilisée par défaut est copiée pendant que n8n fonctionne. Arrêtez donc brièvement n8n ou lancez la sauvegarde pendant une période de faible activité pour éviter une copie incohérente, et testez une restauration avant de vous y fier :

nano /opt/backup-n8n.sh

Ajoutez ce contenu :

#!/bin/bash
mkdir -p /opt/backups
tar -czf /opt/backups/n8n-backup-$(date +%Y%m%d).tar.gz /opt/n8n/data
find /opt/backups -name "n8n-backup-*.tar.gz" -mtime +30 -delete

Rendez-le exécutable et planifiez son exécution avec cron :

chmod +x /opt/backup-n8n.sh

# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /opt/backup-n8n.sh

Renforcement de la sécurité

Configurer le pare-feu

# Install UFW
apt install ufw

# Set defaults
ufw default deny incoming
ufw default allow outgoing

# Allow SSH
ufw allow 22

# Allow HTTP/HTTPS
ufw allow 80
ufw allow 443

# Enable firewall
ufw enable

Sécuriser SSH

Modifiez la configuration SSH :

nano /etc/ssh/sshd_config

Effectuez ces changements :

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

Redémarrez SSH :

systemctl restart ssh

Configurer Fail2Ban

apt install fail2ban

# Copy default configuration
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Enable and start
systemctl enable fail2ban
systemctl start fail2ban

Détail des coûts

Coûts mensuels :

  • Serveur Hetzner CX23 : 5,99 € (hors TVA, avec une adresse IPv4 principale incluse, en octobre 2026)
  • Domaine (annuel, variable) : ~10-15 €/an
  • Total : ~7 €/mois

Comparaison avec n8n Cloud :

  • n8n Starter : 20 €/mois avec facturation annuelle (2 500 exécutions, en octobre 2026)
  • n8n Pro : 50 €/mois avec facturation annuelle (10 000 exécutions)
  • Économies : environ 150–520 €/an

Faire évoluer votre configuration

Plusieurs instances n8n

Vous pouvez exécuter plusieurs instances n8n isolées pour différentes équipes :

Créez /opt/n8n-team2/docker-compose.yml :

version: '3'
services:
  n8n-team2:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=team2.yourdomain.com
      # ... rest of configuration
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n-team2.rule=Host(`team2.yourdomain.com`)"
      - "traefik.http.routers.n8n-team2.entrypoints=https"
      - "traefik.http.routers.n8n-team2.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n-team2.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Augmenter les ressources du serveur

Si vous avez besoin de plus de puissance, mettez à niveau votre serveur Hetzner :

  • CX33 : 4 vCPU, 8 Go de RAM (8,99 €/mois hors TVA, avec une adresse IPv4 principale incluse, en octobre 2026)
  • CX43 : 8 vCPU, 16 Go de RAM (16,49 €/mois hors TVA, avec une adresse IPv4 principale incluse)

Conclusion

Vous disposez maintenant d’une installation n8n fonctionnelle qui coûte une fraction des solutions hébergées tout en vous donnant un contrôle total. La configuration inclut le HTTPS automatique, la messagerie et une gestion robuste des services.

Principaux avantages de cette approche :

  • Rentable : économisez des centaines d’euros par an par rapport à n8n Cloud
  • Contrôle total : aucun quota d’exécutions ; les limites dépendent des ressources de votre serveur et de la Sustainable Use License de n8n
  • Confidentialité : les données des flux de travail et de leurs exécutions restent sur votre serveur, à l’exception de celles que vos flux envoient à des services externes
  • Personnalisable : modifiez et étendez selon vos besoins

Nous avons utilisé cette configuration en production. Les exemples pour n8n et Traefik fixent les versions des images ; pour une mise à jour, augmentez ces tags dans chaque docker-compose.yml avant d’exécuter les commandes de mise à jour. Pour les usages critiques pour l’entreprise, testez la restauration de vos sauvegardes et ajoutez une supervision.

À propos de tva

tva assure la gestion complète de l’infrastructure des systèmes de bases de données, des environnements cloud et des chaînes d’approvisionnement mondiales. Notre approche méthodique combine des protocoles de sécurité rigoureux avec l’optimisation des performances, tandis que nos services de conseil stratégique permettent une coordination précise des capacités numériques et des actifs physiques – tout en maintenant les normes les plus élevées d’excellence opérationnelle et de conformité dans tous nos engagements.

Visitez tva.sg pour plus d’informations sur nos services.

Analyses connexes

Pour aller plus loin