Come installare n8n self-hosted con Docker Compose (guida passo passo)
Questa guida contiene link di affiliazione: se acquisti tramite essi potrei ricevere una commissione, senza costi aggiuntivi per te. Dettagli.
La versione self-hosted di n8n (Community Edition) è gratuita e ti lascia il pieno controllo dei dati. In questa guida installiamo n8n su un server Linux con Docker Compose, il metodo che la documentazione ufficiale di n8n indica come raccomandato, con HTTPS automatico tramite Traefik e Let’s Encrypt.
Prima di cominciare, una premessa onesta: la stessa documentazione di n8n avverte che il self-hosting richiede competenze tecniche (server, container, sicurezza) e che errori di configurazione possono causare perdita di dati, problemi di sicurezza e interruzioni. Se in azienda nessuno ha queste competenze, valuta n8n Cloud (link affiliato – placeholder), oppure fatti affiancare per la prima installazione.
Cosa ti serve
- Un server Linux raggiungibile da Internet (un VPS presso un provider europeo va benissimo per iniziare) con accesso SSH e un utente con permessi
sudo. - Un dominio di cui gestisci il DNS, per esempio
tuaazienda.it. Useremo il sottodominion8n.tuaazienda.it. - Le porte 80 e 443 aperte verso il server (servono a Traefik per ottenere il certificato e servire HTTPS).
- Circa un’ora di tempo.
Per le dimensioni del server, controlla i requisiti aggiornati nella documentazione ufficiale: dipendono molto dal numero e dal tipo di workflow (i flussi con file pesanti o AI richiedono più memoria).
Passo 1 – Installa Docker e Docker Compose
Segui le istruzioni ufficiali di Docker per la tua distribuzione Linux (Docker Engine e plugin Compose). Al termine verifica che entrambi rispondano:
docker --version
docker compose version
Facoltativo: per usare Docker senza sudo, aggiungi il tuo utente al gruppo docker:
sudo usermod -aG docker ${USER}
exec sg docker newgrp
Passo 2 – Configura il DNS
Nel pannello DNS del tuo dominio crea un record A che punti il sottodominio all’indirizzo IP del server:
| Tipo | Nome | Destinazione |
|---|---|---|
| A | n8n | IP_DEL_TUO_SERVER |
La propagazione può richiedere da pochi minuti ad alcune ore. Puoi verificarla con dig n8n.tuaazienda.it o nslookup: deve restituire l’IP del server. Non andare avanti finché il DNS non risponde correttamente, altrimenti la richiesta del certificato HTTPS fallirà.
Passo 3 – Crea la cartella del progetto e il file .env
mkdir n8n-compose
cd n8n-compose
Crea un file .env con i tuoi dati:
DOMAIN_NAME=tuaazienda.it
SUBDOMAIN=n8n
GENERIC_TIMEZONE=Europe/Rome
SSL_EMAIL=it@tuaazienda.it
Note importanti:
DOMAIN_NAMEeSUBDOMAINinsieme determinano l’indirizzo finale: quihttps://n8n.tuaazienda.it.GENERIC_TIMEZONEè il fuso orario usato dai nodi di pianificazione (Schedule Trigger). Se non lo imposti, il valore predefinito è New York: per un’azienda italiana significa trigger sfasati di 6 ore. UsaEurope/Rome.SSL_EMAILè l’indirizzo usato per la registrazione del certificato Let’s Encrypt.
Passo 4 – Crea la cartella dei file locali
mkdir local-files
Questa cartella è condivisa tra il server e n8n: dentro i workflow la troverai al percorso /files (utile con il nodo di lettura/scrittura file su disco). Crearla a mano garantisce proprietario e permessi corretti.
Passo 5 – Crea il file compose.yaml
Crea compose.yaml nella stessa cartella con questo contenuto, tratto dalla documentazione ufficiale di n8n:
services:
traefik:
image: "traefik"
restart: always
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: n8nio/n8n
restart: always
ports:
- "127.0.0.1:5678:5678"
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.entrypoints=web,websecure
- traefik.http.routers.n8n.tls.certresolver=mytlschallenge
- traefik.http.middlewares.n8n.headers.SSLRedirect=true
- traefik.http.middlewares.n8n.headers.STSSeconds=315360000
- traefik.http.middlewares.n8n.headers.browserXSSFilter=true
- traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
- traefik.http.middlewares.n8n.headers.forceSTSHeader=true
- traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
- traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.n8n.headers.STSPreload=true
- traefik.http.routers.n8n.middlewares=n8n@docker
environment:
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- N8N_WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
- N8N_RESTRICT_FILE_ACCESS_TO=/files
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
volumes:
n8n_data:
traefik_data:
Cosa fa questo file, in parole semplici:
- Traefik è un proxy che riceve il traffico sulle porte 80 e 443, ottiene automaticamente il certificato HTTPS da Let’s Encrypt e reindirizza tutto l’HTTP su HTTPS.
- n8n ascolta sulla porta 5678 solo in locale (
127.0.0.1), quindi non è raggiungibile direttamente da Internet ma solo attraverso Traefik. - Il volume
n8n_datacontiene il database SQLite di n8n e la chiave di cifratura delle credenziali: è la cosa più preziosa da salvare nei backup. N8N_WEBHOOK_URLdice a n8n quale indirizzo pubblico usare per i webhook. Secondo la documentazione è disponibile dalla versione 2.30.0; nelle versioni precedenti la variabile si chiamaWEBHOOK_URL.
Passo 6 – Avvia n8n
sudo docker compose up -d
Al primo avvio Docker scarica le immagini e Traefik richiede il certificato. Dopo un minuto circa apri https://n8n.tuaazienda.it. Per controllare i log in caso di problemi:
sudo docker compose logs -f n8n
sudo docker compose logs -f traefik
Per fermare i container: sudo docker compose stop.
Se la pagina non si apre, le cause più comuni sono: DNS non ancora propagato, porte 80/443 bloccate dal firewall del server o del provider, errore di battitura nel file .env.
Passo 7 – Crea l’account proprietario e metti in sicurezza
Alla prima apertura n8n ti chiede di creare l’account proprietario (owner). Fallo subito: finché non lo crei, chiunque raggiunga l’indirizzo potrebbe farlo al posto tuo.
Poi:
- Usa una password lunga e unica e attiva l’autenticazione a due fattori sul tuo utente, se disponibile nella tua versione.
- Invita i colleghi con utenti personali, non condividere l’account owner.
- Limita l’accesso SSH al server (chiavi invece di password, firewall che apre solo 22, 80 e 443).
- Se n8n è usato solo internamente, valuta di esporlo solo tramite VPN, lasciando pubblici esclusivamente i webhook necessari.
Passo 8 – Backup
Il minimo indispensabile è salvare regolarmente il volume n8n_data (database e chiave di cifratura) e la cartella n8n-compose con .env e compose.yaml. Senza la chiave di cifratura, le credenziali salvate nel database non sono più utilizzabili.
Buone pratiche:
- backup automatici e conservati fuori dal server (altro provider o storage a oggetti);
- prova di ripristino almeno una volta, su un server di test: un backup mai ripristinato è solo una speranza;
- esporta anche i workflow più importanti in JSON e conservali in un repository.
Quando il carico cresce, la documentazione ufficiale descrive come usare PostgreSQL al posto di SQLite.
Passo 9 – Aggiornamenti
n8n rilascia una nuova versione minore quasi ogni settimana, distinguendo tra stable (per la produzione) e beta. Per aggiornare con Docker Compose:
cd n8n-compose
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d
Prima di ogni aggiornamento fai un backup e leggi le note di rilascio, soprattutto per i cambi di versione principale. Per la produzione puoi fissare una versione specifica dell’immagine (es. n8nio/n8n:2.44.7) invece di usare l’ultima disponibile, e aggiornare in modo controllato.
Checklist finale
- DNS del sottodominio punta al server
-
.envconGENERIC_TIMEZONE=Europe/Rome - n8n raggiungibile solo in HTTPS
- Account owner creato con password forte
- Backup automatici del volume
n8n_datafuori dal server, ripristino testato - Procedura di aggiornamento documentata
E adesso?
Con n8n installato puoi costruire il primo workflow: parti da cos’è n8n e come funziona oppure passa subito a creare un agente AI con n8n.
Domande frequenti
Posso installare n8n su un PC dell’ufficio invece che su un VPS? Per test sì, ma per la produzione serve una macchina sempre accesa e raggiungibile: i webhook esterni devono poter arrivare in qualsiasi momento.
La Community Edition ha limiti di esecuzioni? La licenza non impone limiti di esecuzioni; il limite pratico è la capacità del tuo server. Alcune funzioni (SSO, ambienti multipli, versioning con Git) richiedono i piani a pagamento.