tva
← Approfondimenti

Self-hosting di n8n su Hetzner Cloud: tutorial completo di configurazione Docker

L’automazione dei flussi di lavoro è diventata essenziale per le aziende moderne, ma le soluzioni SaaS possono diventare costose con la crescita dei team. Ti mostreremo come configurare la tua istanza n8n su Hetzner Cloud per circa 6 €/mese più il costo del dominio (a ottobre 2026), con flussi di lavoro illimitati e controllo completo sulla tua piattaforma di automazione.

Cosa realizzerai

Al termine di questo tutorial avrai:

  • ✅ Un’installazione n8n pienamente funzionante con HTTPS
  • ✅ Certificati SSL automatici tramite Let’s Encrypt
  • ✅ Integrazione email per gli account utente
  • ✅ Avvio automatico dopo il riavvio del server
  • ✅ Una base solida per l’uso professionale che puoi rendere più sicura per la produzione

Costo mensile: 5,99 € (server CX23, IVA esclusa, con un indirizzo IPv4 primario incluso, a ottobre 2026) + costo del dominio

Prerequisiti

  • Un nome di dominio che punti all’IP del server
  • Conoscenza di base della riga di comando
  • Un account Hetzner Cloud

Passaggio 1: configurazione del server

Crea un server Hetzner Cloud

  1. Accedi alla console Hetzner Cloud
  2. Crea un nuovo progetto
  3. Aggiungi un server con queste specifiche:
    • Immagine: Ubuntu 24.04 LTS
    • Tipo: CX23 (2 vCPU, 4 GB di RAM, 40 GB di disco); Hetzner ha ritirato il CX11 dai nuovi ordini a settembre 2024 e la disponibilità dei piani a costo ottimizzato varia in base alla località
    • Posizione: Scegli quella più vicina ai tuoi utenti
    • Chiave SSH: Aggiungi la tua chiave pubblica

Configurazione iniziale del server

Connettiti al server:

ssh root@YOUR_SERVER_IP

Aggiorna il sistema:

apt update && apt upgrade -y

Passaggio 2: installazione di Docker

Installa Docker e 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

Verifica l’installazione di Docker:

docker --version
docker compose version

Passaggio 3: configurazione del reverse proxy Traefik

Crea la struttura delle directory:

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

Crea il file di configurazione di Traefik:

nano /opt/traefik/data/traefik.yml

Aggiungi questa configurazione:

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

Crea il file acme.json per i certificati SSL:

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

Crea il file Docker Compose per Traefik:

nano /opt/traefik/docker-compose.yml

Aggiungi questa configurazione:

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

Passaggio 4: configurazione di un relay SMTP (facoltativo ma consigliato)

Crea la directory mailserver:

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

Crea il file Docker Compose:

nano /opt/mailserver/docker-compose.yml

Aggiungi questa configurazione:

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

Nota: n8n raggiunge il relay tramite la rete condivisa proxy, quindi il relay non pubblica alcuna porta. Le porte pubblicate da Docker aggirano le regole UFW: aggiungine una solo se un altro host deve inviare messaggi tramite il relay. MAILNAME imposta il nome host di posta del relay. Per Gmail dovrai:

  1. Attivare l’autenticazione a 2 fattori
  2. Generare una password per le app
  3. Usare la password per le app (non la tua password abituale)

Passaggio 5: configurazione di n8n

Crea la directory n8n. Il container n8n viene eseguito con l’utente node (UID 1000), quindi assicurati che tale utente possa scrivere nella cartella data montata tramite bind mount, ad esempio con mkdir -p /opt/n8n/data && chown -R 1000:1000 /opt/n8n/data:

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

Crea il file Docker Compose:

nano /opt/n8n/docker-compose.yml

Aggiungi questa configurazione:

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

Passaggio 6: creazione dei servizi systemd per l’avvio automatico

Servizio Traefik

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

Aggiungi questa configurazione:

[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

Servizio mailserver

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

Aggiungi questa configurazione:

[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

Servizio n8n

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

Aggiungi questa configurazione:

[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

Abilita e avvia i servizi

# 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

Passaggio 7: configurazione DNS

Fai puntare il dominio al server:

  1. Accedi al servizio di registrazione del dominio o al fornitore DNS
  2. Crea un record A:
    • Nome: n8n
    • Tipo: A
    • Valore: YOUR_SERVER_IP
    • TTL: 300 (o il minimo consentito)

Attendi la propagazione DNS (può richiedere fino a 24 ore, ma di solito è molto più rapida).

Passaggio 8: verifica dell’installazione

Verifica che i servizi siano in esecuzione:

docker ps

Dovresti vedere tre container in esecuzione: traefik, mailserver e n8n.

Apri la tua istanza n8n:

https://n8n.yourdomain.com

Dovresti vedere la pagina di configurazione di n8n tramite HTTPS, con il browser che indica un certificato valido.

Risoluzione dei problemi comuni

Il certificato SSL non funziona

Controlla i log di Traefik:

docker logs traefik

Cause comuni:

  • Il DNS non punta al server
  • Il firewall blocca le porte 80/443
  • Il dominio nella configurazione è errato

n8n non è accessibile

Controlla i log di n8n:

docker logs n8n-n8n-1

Soluzioni comuni:

  • Verifica che la configurazione del dominio coincida in tutti i file
  • Verifica che tutti i container siano nella stessa rete
  • Se i log mostrano ERR_ERL_UNEXPECTED_X_FORWARDED_FOR, verifica che N8N_PROXY_HOPS=1 sia impostato come nella configurazione precedente; n8n lo documenta per l’esecuzione dietro un reverse proxy

Le email non funzionano

Controlla i log del mailserver:

docker logs mailserver-mailserver-1

Verifica le credenziali e le impostazioni SMTP.

I servizi non si avviano dopo il riavvio

Verifica lo stato dei servizi:

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

Riavviali se necessario:

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

Manutenzione e aggiornamenti

Manutenzione periodica

Controlli settimanali:

# Check container status
docker ps

# Check disk space
df -h

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

Aggiornamenti mensili:

# 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

Backup dei dati

Crea uno script di backup. Il database SQLite predefinito viene copiato mentre n8n è in esecuzione, quindi arresta brevemente n8n o esegui il backup durante un periodo di scarsa attività per evitare una copia incoerente, e prova un ripristino prima di farvi affidamento:

nano /opt/backup-n8n.sh

Aggiungi questo contenuto:

#!/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

Rendilo eseguibile e aggiungilo a 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

Rafforzamento della sicurezza

Configura il firewall

# 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

Proteggi SSH

Modifica la configurazione SSH:

nano /etc/ssh/sshd_config

Apporta queste modifiche:

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

Riavvia SSH:

systemctl restart ssh

Configura 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

Dettaglio dei costi

Costi mensili:

  • Server Hetzner CX23: 5,99 € (IVA esclusa, con un indirizzo IPv4 primario incluso, a ottobre 2026)
  • Dominio (costo annuo variabile): ~€10-15/anno
  • Totale: ~7 €/mese

Confronto con n8n Cloud:

  • n8n Starter: 20 €/mese con fatturazione annuale (2.500 esecuzioni, a ottobre 2026)
  • n8n Pro: 50 €/mese con fatturazione annuale (10.000 esecuzioni)
  • Risparmio: circa 150–520 €/anno

Scalabilità della configurazione

Più istanze n8n

Puoi eseguire più istanze n8n isolate per team diversi:

Crea /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

Aumenta le risorse del server

Se ti serve più potenza, potenzia il tuo server Hetzner:

  • CX33: 4 vCPU, 8 GB di RAM (8,99 €/mese IVA esclusa, con un indirizzo IPv4 primario incluso, a ottobre 2026)
  • CX43: 8 vCPU, 16 GB di RAM (16,49 €/mese IVA esclusa, con un indirizzo IPv4 primario incluso)

Conclusione

Ora hai un’installazione n8n funzionante che costa una frazione delle soluzioni gestite da un fornitore e ti offre il controllo completo. La configurazione include HTTPS automatico, funzionalità email e una gestione affidabile dei servizi.

Vantaggi principali di questo approccio:

  • Convenienza: Risparmi centinaia di euro all’anno rispetto a n8n Cloud
  • Controllo completo: Nessuna quota di esecuzioni; i limiti dipendono dalle risorse del server e dalla Sustainable Use License di n8n
  • Privacy: I dati dei flussi di lavoro e delle esecuzioni restano sul tuo server, tranne quelli che i flussi inviano a servizi esterni
  • Personalizzazione: Modifica ed estendi la configurazione secondo le tue esigenze

Abbiamo utilizzato questa configurazione in produzione. Gli esempi per n8n e Traefik fissano le versioni delle immagini; per aggiornare, alza questi tag in ogni docker-compose.yml prima di eseguire i comandi di aggiornamento. Per gli usi critici per l’attività aziendale, prova il ripristino dei backup e aggiungi il monitoraggio.

Informazioni su tva

tva assicura una gestione completa dell’infrastruttura di sistemi di database, ambienti cloud e catene di approvvigionamento globali. Il nostro approccio metodico combina rigorosi protocolli di sicurezza con l’ottimizzazione delle prestazioni, mentre i servizi di consulenza strategica consentono di coordinare con precisione sia le capacità digitali sia le risorse fisiche, mantenendo i più elevati standard di eccellenza operativa e conformità in tutti gli incarichi.

Visita tva.sg per maggiori informazioni sui nostri servizi.

Approfondimenti correlati

Per approfondire