💻 Serveur & shell

Héberger n8n chez Datacampus : reverse proxy, backup, sécurité

Installer, exposer et sécuriser n8n sur un VPS Datacampus : Docker Compose, PostgreSQL, reverse proxy Apache/Nginx, auth, backups et clé de chiffrement.

avancé ⏱ 12 min Mise à jour : 2026-04-24

n8n est un moteur d'orchestration d'automatisations visuelles, alternative open source à Zapier ou Make. Chaque automatisation est un workflow composé de nodes qui s'enchaînent : déclencheur (webhook, cron, événement), transformations, appels HTTP, logique conditionnelle, sortie vers un autre service. Plus de 400 intégrations natives, du CRM au LLM en passant par les bases de données.

Pourquoi l'héberger chez Datacampus

  • Souveraineté. Vos workflows manipulent souvent des données sensibles (CRM, facturation, API internes). Chez nous, tout reste en France, sur des serveurs que nous opérons directement.
  • Pas de plafond d'exécutions. n8n Cloud facture au nombre d'exécutions de workflows. En self-hosted, la seule limite est celle de votre VPS.
  • Coût fixe. Vous payez la machine, pas chaque run. Idéal quand un workflow tourne des milliers de fois par jour.
  • Intégration à l'écosystème Datacampus. Nextcloud, Mailcow, Matomo, Keycloak, bases vectorielles, serveurs MCP : tout ce qu'on héberge peut devenir un node dans n8n, sans passer par Internet.
VPS n8n infogéré
Datacampus propose une instance n8n prête à l'emploi au catalogue Applications infogérées : mise en service sous 24 h, HTTPS, backups, mises à jour et supervision. Pour les équipes qui veulent utiliser n8n sans opérer l'infra. Détails sur la page Applications infogérées de datacampus.fr.

La suite de ce guide concerne le cas self-hosted : un VPS chez nous, où vous gardez la main sur l'installation.

Installation via Docker Compose

C'est la méthode recommandée par l'éditeur. Isolation propre, mise à jour triviale, persistance via volumes. On utilise PostgreSQL (pas SQLite) dès qu'on vise la production : concurrence d'écriture, robustesse, backups standard.

services:
  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: 'motDePasseFort'
      POSTGRES_DB: n8n
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    depends_on:
      - postgres
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: 'motDePasseFort'
      N8N_HOST: n8n.votredomaine.fr
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://n8n.votredomaine.fr/
      GENERIC_TIMEZONE: Europe/Paris
      N8N_ENCRYPTION_KEY: 'cléAléatoireLongue64Caractères'
    ports:
      - "127.0.0.1:5678:5678"
    volumes:
      - ./n8n_data:/home/node/.n8n

Quelques points à retenir :

  • Le port 5678 est publié uniquement sur la loopback. Le reverse proxy système s'occupera de l'exposition.
  • Le volume /home/node/.n8n/ stocke la config locale et, le cas échéant, la base SQLite par défaut. On le persiste quand même, certains fichiers internes y vivent.
  • WEBHOOK_URL doit pointer sur l'URL publique finale, sinon les webhooks renvoient les mauvaises adresses aux services tiers.

Reverse proxy : Apache ou Nginx

n8n utilise WebSocket pour la communication temps réel entre l'éditeur et le moteur. Le reverse proxy doit donc gérer l'upgrade Connection: upgrade, sinon l'interface se fige.

Apache

<VirtualHost *:443>
    ServerName n8n.votredomaine.fr

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/n8n.votredomaine.fr/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/n8n.votredomaine.fr/privkey.pem

    ProxyPreserveHost On
    ProxyPass        / http://127.0.0.1:5678/
    ProxyPassReverse / http://127.0.0.1:5678/

    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*) ws://127.0.0.1:5678/$1 [P,L]
</VirtualHost>

Modules requis : proxy, proxy_http, proxy_wstunnel, rewrite, ssl.

Nginx

server {
    listen 443 ssl http2;
    server_name n8n.votredomaine.fr;

    ssl_certificate     /etc/letsencrypt/live/n8n.votredomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.votredomaine.fr/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1: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_read_timeout 3600s;
    }
}

TLS via Let's Encrypt : soit l'intégration Plesk (voir doc dédiée), soit certbot en manuel avec renouvellement automatique dans cron.

Sécuriser l'interface

L'éditeur n8n permet d'écrire et d'exécuter du code arbitraire (nodes Function, HTTP Request). Exposer l'interface sans authentification, c'est ouvrir un shell au premier visiteur. Plusieurs niveaux de protection, à empiler.

Auth basique intégrée

N8N_BASIC_AUTH_ACTIVE: "true"
N8N_BASIC_AUTH_USER: "admin"
N8N_BASIC_AUTH_PASSWORD: "motDePasseLongEtUnique"

Acceptable pour un usage personnel ou une petite équipe. Pour du multi-utilisateurs sérieux, passez à n8n avec User Management (inclus dans les versions récentes) ou SSO.

SSO via Keycloak

n8n supporte SAML et OAuth2. Keycloak, que nous hébergeons aussi, fait très bien le travail : un seul annuaire pour n8n, Nextcloud, GitLab et le reste. Intéressant dès qu'on dépasse trois utilisateurs.

Whitelist IP pour la partie admin

Limitez l'accès à l'éditeur depuis les IPs de votre équipe (VPN, bureau) via le reverse proxy ou un .htaccess :

<Location />
    Require ip 82.65.12.34
    Require ip 10.8.0.0/24
</Location>

Webhooks publics

Un workflow déclenché par webhook expose une URL publique du type https://n8n.votredomaine.fr/webhook/xxxx. Si vous avez whitelisté l'admin par IP, il faut exclure le chemin /webhook/ et /webhook-test/ de cette restriction, sinon vos services tiers ne pourront plus appeler n8n.

<Location /webhook/>
    Require all granted
</Location>
<Location /webhook-test/>
    Require all granted
</Location>

Pensez à authentifier les webhooks côté workflow (signature HMAC, token d'en-tête, IP source) pour ne pas accepter n'importe quelle requête.

Bases vectorielles, LLM et MCP

n8n dispose de nodes natifs pour Qdrant, pgvector, Ollama, OpenAI, Anthropic, Mistral, plus un node HTTP générique qui parle à n'importe quel endpoint. Chez Datacampus, vous pouvez câbler n8n à :

  • Un serveur GPU AMD (Ryzen AI Max+ 395, 128 Go mémoire unifiée) pour faire tourner du Llama 3 70B, Mixtral ou Qwen en local via Ollama ou vLLM.
  • Une base Qdrant ou pgvector hébergée à côté, sur le même réseau privé, pour du RAG.
  • Des serveurs MCP sur mesure que nous construisons et opérons pour exposer vos systèmes internes à un agent IA.

L'écosystème AI de n8n est l'une des raisons pour lesquelles beaucoup de nos clients le choisissent plutôt qu'un équivalent historique.

Backup

Trois choses à sauvegarder. Oublier la troisième est la plus douloureuse.

Base PostgreSQL

# Dump quotidien, rotation 30 jours
docker compose exec -T postgres pg_dump -U n8n n8n | \
    gzip > /backup/n8n-$(date +%F).sql.gz
find /backup -name 'n8n-*.sql.gz' -mtime +30 -delete

Export des workflows en JSON

docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/export/
docker compose exec n8n n8n export:credentials --all --output=/home/node/.n8n/export/

Lisible, diff-able, versionnable dans Git. Très pratique pour auditer les changements entre deux dates.

Clé de chiffrement

Les credentials stockés en base sont chiffrés avec N8N_ENCRYPTION_KEY. Cette clé est générée automatiquement au premier démarrage si vous ne la fixez pas. Fixez-la explicitement dans votre Compose, et sauvegardez-la séparément.

⚠️
Perdre N8N_ENCRYPTION_KEY, c'est perdre tous vos credentials
Sans la clé, aucune restauration de base ne permet de relire les tokens, mots de passe et clés API stockés. Copiez-la dans un password manager ou un coffre hors du serveur. Ne la committez jamais dans Git.

Monitoring

n8n expose un endpoint /healthz qui renvoie 200 OK quand tout va bien. À utiliser dans votre supervision (Prometheus blackbox, Uptime Kuma, status page) pour détecter un crash ou un hang.

curl -sf https://n8n.votredomaine.fr/healthz || echo "KO"

Côté PostgreSQL, surveillez la taille des tables execution_entity et execution_data : elles gonflent vite si vous ne purgez pas l'historique. Variables utiles : EXECUTIONS_DATA_PRUNE=true, EXECUTIONS_DATA_MAX_AGE=168 (en heures).

Mise à jour

Pour un patch mineur, c'est trois lignes :

docker compose pull
docker compose up -d
docker image prune -f

Pour une montée de version majeure, ouvrez le changelog GitHub avant d'appuyer sur le bouton. Certaines versions modifient des nodes, déprécient des options ou changent le format d'un champ. Faites un dump Postgres juste avant, comme ça vous pouvez revenir en arrière si un workflow critique casse.

💡
Versionnez vos workflows dans Git
Exportez régulièrement vos workflows en JSON et poussez-les dans un dépôt privé (GitLab Datacampus par exemple). Corruption, mauvaise manip, update ratée : on revient à la version de la veille en git checkout. C'est l'une des pratiques qui distinguent une équipe qui dort bien des autres.

Cas d'usage fréquents chez nos clients

  • Synchronisation CRM / outil compta. Nouveau deal gagné dans Pipedrive, facture créée dans Dolibarr, notification Teams à l'équipe.
  • Génération de rapports PDF. Requête SQL, mise en forme, envoi par email chaque lundi à 7 h.
  • Orchestration d'appels LLM. Réception d'un email, classification via Claude ou un modèle local Ollama, routage vers le bon service.
  • Notifications. Alertes Slack ou Teams sur événements métier, erreurs applicatives, seuils dépassés.
  • ETL léger. Extraction d'une API SaaS, transformation, injection dans une base interne ou un data warehouse.

n8n n'a pas vocation à remplacer un vrai outil d'intégration d'entreprise pour des volumes énormes, mais pour tout ce qui ressemble à « je voudrais qu'un truc déclenche un autre truc », il est imbattable en rapport puissance/effort.

Pour aller plus loin

Besoin d'aide ?

Cette documentation ne couvre pas votre cas ? Notre support humain est là.