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
- Accedi alla console Hetzner Cloud
- Crea un nuovo progetto
- 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:
- Attivare l’autenticazione a 2 fattori
- Generare una password per le app
- 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:
- Accedi al servizio di registrazione del dominio o al fornitore DNS
- 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 cheN8N_PROXY_HOPS=1sia 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
Self-hosting di Windmill su Ubuntu: tutorial completo di configurazione Docker e risoluzione dei problemi PostgreSQL
Hetzner Cloud a fine 2026: piani e prezzi per il self-hosting di n8n, Windmill, Twenty e Ollama
Guida completa al self-hosting di n8n 2025: risolvere gli errori di dimensione dei dati di esecuzione e i problemi dei webhook con Traefik