SheepHost
n8nDockerCaddySelf-hosting

Déployer n8n en self-hosted avec Docker et Caddy (HTTPS automatique)

Stack minimale pour héberger n8n sur un VPS : Docker Compose, Caddy pour le HTTPS, PostgreSQL pour la persistance. Setup en moins d'1 heure.

· 10 min read

Pourquoi self-hoster ?

  • Coût : ~5€/mois pour un VPS 2 vCPU / 4 Go RAM (Hetzner CPX11, OVH, Scaleway)
  • Données chez vous : pas de limite de "tasks", pas d'audit externe des données
  • Flexibilité : plugins communautaires, code JavaScript natif

Prérequis

  • Un VPS Linux (Debian/Ubuntu)
  • Un nom de domaine pointé vers l'IP du VPS (enregistrement A)
  • Docker + Docker Compose installés

La stack : 3 services

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:latest
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_HOST: n8n.votredomaine.fr
      WEBHOOK_URL: https://n8n.votredomaine.fr/
      N8N_PROTOCOL: https
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - postgres
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
    restart: unless-stopped

volumes:
  postgres_data:
  n8n_data:
  caddy_data:

Le Caddyfile

n8n.votredomaine.fr {
  reverse_proxy n8n:5678
}

C'est tout : Caddy gère Let's Encrypt automatiquement.

Démarrage

docker compose up -d

Accès à https://n8n.votredomaine.fr. Le premier écran crée le compte owner.

Backups

Sauvegarde quotidienne de la base + du volume workflows :

# Dans un cron hebdomadaire
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backup-$(date +%F).sql.gz

Monitoring

Ajouter Uptime Kuma (autre container) pour surveiller /healthz et recevoir une alerte en cas de panne.


Un souci sur votre stack ? [Un échange de 30 minutes peut débloquer la situation](/#contact).