Intermedio 11 minn8n

n8n con Docker: installare e auto-ospitare gratuitamente

n8n con Docker è il modo più rapido per ottenere un'istanza di automazione auto-ospitata che sopravvive ai riavvii e agli aggiornamenti. Questa guida si ferma volutamente alle fondamenta: un file Docker Compose, un volume per i dati, una chiave di crittografia sotto il tuo controllo, una procedura di backup e aggiornamento, poi un'esposizione HTTPS prudente. I nodi IA e il collegamento a Ollama sono trattati in una guida separata; qui l'obiettivo è un'installazione pulita che non dovrai rifare.

Di Samir K.·Agg. 2026-10-14·Testato su Windows, macOS e Linux

#Perché installare n8n con Docker anziché con npm

n8n è un'applicazione Node.js. Puoi avviarla con npm o npx e la documentazione lo propone per una prova rapida. Per un'istanza in esecuzione continua, l'immagine Docker ufficiale è la strada raccomandata dal progetto: include la versione corretta di Node.js, isola n8n dal resto della macchina e rende l'aggiornamento semplice quanto cambiare immagine. È anche il formato in cui la documentazione di hosting di n8n descrive tutti i suoi esempi di server.

Il secondo vantaggio è la riproducibilità. Un file docker-compose.yml descrive l'intera configurazione: immagine, porta, variabili d'ambiente, volume dei dati. Potete sottoporlo a controllo versione, copiarlo su un'altra macchina o rileggerlo tra sei mesi per sapere esattamente cosa è in esecuzione. Con un'installazione npm, queste informazioni sono distribuite tra il sistema, il profilo utente e il gestore dei servizi.

Cosa copre questa guida
Installazione locale o su un piccolo server, persistenza dei dati, chiave di crittografia, backup, aggiornamento, accesso HTTPS.
Cosa non copre
I nodi IA di n8n, la connessione a Ollama, il server MCP e la scalabilità in modalità coda. I primi due punti hanno una guida dedicata, collegata alla fine dell'articolo.
Cosa non affermiamo
Nessuna durata di installazione, nessun consumo misurato, nessun numero di versione fissato. Questi valori cambiano da una release all'altra e vanno consultati nelle fonti ufficiali al momento dell'installazione.

#Licenza e limiti della versione community

Il kit Agenti Locali

Agenti che agiscono sulla tua macchina: Cline agentico, MCP, n8n + Ollama, automazioni locali.

  • Spazio online a vita
  • PDF + file
  • Rimborso in 30 g

n8n non è distribuito con una licenza open source secondo il significato attribuito dall'OSI. Il codice è pubblicato con la Sustainable Use License, un modello che l'editore definisce «fair-code». In linea generale, puoi utilizzare, modificare e ospitare liberamente n8n per le tue esigenze interne, personali o aziendali. Ciò che è limitato è la rivendita: offrire n8n come servizio ospitato a terzi o integrarlo in un prodotto commerciale richiede un accordo con l'editore. Il testo completo e le relative FAQ sono disponibili su docs.n8n.io/sustainable-use-license/; leggili se il tuo utilizzo va oltre l'automazione interna.

La versione che installi con Docker è l'edizione community. Include l'editor completo, centinaia di nodi di integrazione, i webhook, i trigger pianificati, i nodi IA e la gestione degli utenti. Alcune funzionalità sono riservate alle offerte a pagamento self-hosted: l'accesso singolo (SSO), gli ambienti con sincronizzazione Git, i secret esterni, l'invio dei log a uno strumento esterno e parte delle funzionalità di collaborazione. L'editore offre inoltre una chiave gratuita detta «community registrata», ottenibile indicando un indirizzo e-mail nelle impostazioni, che sblocca alcune funzionalità aggiuntive. L'elenco preciso cambia nel tempo: fa fede la pagina docs.n8n.io/hosting/community-edition-features/.

i
Gratuito, ma non open source
Per un uso personale o interno, la distinzione non cambia nulla nella pratica. Conta se intendete rivendere un servizio costruito su n8n o se la vostra azienda richiede una licenza approvata dall'OSI: in tal caso, leggete la licenza prima di installare, non dopo.

#Prerequisiti

Docker e Docker Compose
Docker Engine con il plugin Compose su Linux, oppure Docker Desktop su Windows e macOS. Verifica con docker compose version: il comando deve rispondere con un numero di versione, usando due parole (docker compose), non con il trattino del vecchio strumento.
Una macchina sempre accesa
n8n esegue i tuoi workflow all'ora prevista o alla ricezione di un webhook. Un PC che si spegne la sera non vedrà le attivazioni notturne. Sono adatti un mini-PC, un NAS compatibile con Docker o un piccolo VPS; per alcuni workflow semplici, il fabbisogno di memoria resta modesto.
Una porta libera
n8n ascolta sulla porta 5678 all'interno del container. La pubblichiamo sullo stesso numero sul lato host; cambialo se è già occupato da un altro servizio.
Solo per il passaggio HTTPS
Un nome di dominio che punti alla macchina e le porte 80 e 443 raggiungibili da Internet. In caso contrario, resta sull'accesso locale oppure usa una VPN: la sezione HTTPS illustra entrambe le opzioni.
Terminale
docker --version
docker compose version

#Installare n8n con Docker Compose passo dopo passo

La documentazione di n8n propone innanzitutto un comando docker run su una riga, utile per una prova. Noi passiamo direttamente a Compose: il file è appena più lungo e diventa il riferimento della vostra installazione. Tutti i valori qui sotto sono quelli documentati da n8n; solo i valori del fuso orario e della porta sono scelte di questa guida.

  1. 01
    Crea la cartella del progetto
    Una cartella dedicata contiene il file Compose, il file .env e, in seguito, i vostri backup. I dati di n8n andranno in un volume Docker denominato, non in questa cartella.
  2. 02
    Generare la chiave di crittografia
    Prima del primo avvio, generate una chiave casuale e inseritela nel file .env. La sezione seguente spiega perché quest'ordine è importante.
  3. 03
    Scrivere il docker-compose.yml
    Copiate il file qui sotto. Pubblica n8n sulla porta 5678 della macchina, limitandolo all'indirizzo locale 127.0.0.1, e monta il volume n8n_data nella cartella /home/node/.n8n del container, dove n8n memorizza il database SQLite, la configurazione e i file.
  4. 04
    Avviare
    docker compose up -d télécharge l'image et lance le conteneur en arrière-plan. La première exécution prend le temps du téléchargement de l'image; les suivantes sont immédiates.
  5. 05
    Creare l'account proprietario
    Aprite http://localhost:5678 in un browser. n8n chiede di creare il primo account, che diventa il proprietario dell'istanza. Dalla versione 1.0, è questo account a proteggere l'accesso; la precedente autenticazione di base tramite variabili d'ambiente non esiste più.
Terminale
mkdir -p ~/n8n && cd ~/n8n

# Clé de chiffrement : 64 caractères hexadécimaux
echo "N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)" > .env
chmod 600 .env
cat .env
docker-compose.yml
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=Europe/Paris
      - TZ=Europe/Paris
      - N8N_RUNNERS_ENABLED=true
      - N8N_DIAGNOSTICS_ENABLED=false
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=336
    volumes:
      - n8n_data:/home/node/.n8n
      - ./local-files:/files

volumes:
  n8n_data:
Terminale
docker compose up -d
docker compose logs -f n8n   # Ctrl+C pour quitter les journaux

Qualche spiegazione sulle variabili. GENERIC_TIMEZONE imposta il fuso orario utilizzato dal nodo Schedule Trigger e dalle espressioni di data; TZ allinea l'orologio di sistema nel container. N8N_RUNNERS_ENABLED attiva i task runner, il meccanismo che esegue il codice dei nodi Code in un processo separato; la documentazione lo raccomanda e le versioni recenti mostrano un avviso se è assente. N8N_DIAGNOSTICS_ENABLED=false interrompe l'invio dei dati di telemetria all'editore. Le due variabili EXECUTIONS_DATA_* chiedono a n8n di eliminare la cronologia delle esecuzioni oltre le 336 ore, cioè quattordici giorni, per evitare che il database cresca all'infinito.

Il montaggio ./local-files:/files è facoltativo. Fornisce a n8n una cartella condivisa con la macchina host, utile per i nodi che leggono o scrivono file. Elimina la riga se non ti serve.

→
Accesso da un'altra macchina della rete locale
Il file pubblica la porta su 127.0.0.1: solo la macchina che ospita n8n può accedervi. Per aprire l'accesso alla tua rete locale, sostituisci con "5678:5678" e aggiungi N8N_SECURE_COOKIE=false alle variabili; altrimenti n8n rifiuta la connessione HTTP da un indirizzo diverso da localhost, mostrando un messaggio esplicito sul cookie sicuro. Questa variabile non deve mai rimanere impostata su un'istanza esposta a Internet: utilizza la sezione HTTPS.

#La chiave di crittografia: la variabile che non devi perdere

n8n cifra tutte le credenziali che registri nell'interfaccia, ovvero i token API, le password e le chiavi OAuth delle tue integrazioni. La chiave di crittografia utilizzata è N8N_ENCRYPTION_KEY. Se non la definisci, n8n ne genera una al primo avvio e la scrive nel file config della cartella /home/node/.n8n, quindi nel volume. Funziona, ma in questo caso la chiave vive solo in quel volume: se lo perdi o ricrei l'istanza senza di esso, ogni credenziale diventa illeggibile e deve essere reinserita.

Ecco perché questa guida imposta la chiave nel file .env prima del primo avvio. Rimane sotto il tuo controllo, viene salvata insieme al file Compose e consente di ripristinare il database su un'altra macchina senza perdere le credenziali. Ne derivano due regole.

Non cambiate mai la chiave in un secondo momento
Una chiave diversa da quella usata per crittografare rende inutilizzabili tutti gli identificatori esistenti. Se dovete sostituirla, esportate prima gli identificatori decrittografati con il comando export:credentials, quindi reimportateli dopo la modifica.
Salva separatamente il file .env
Conserva una copia della chiave nel tuo gestore di password. Un backup del volume senza la chiave non serve a nulla per le credenziali, anche se i workflow restano leggibili.
!
Chiave impostata dopo un primo avvio senza di essa
Se hai già avviato n8n senza N8N_ENCRYPTION_KEY, il container contiene una chiave generata automaticamente. Impostare successivamente un valore diverso in .env provoca un errore all'avvio oppure rende illeggibili le credenziali. In questo caso, recupera la chiave esistente con docker exec n8n cat /home/node/.n8n/config e riportala in .env, invece di generarne una nuova.

#Persistenza e backup dei dati

Tutto ciò che n8n deve conservare risiede in /home/node/.n8n: il database SQLite che contiene workflow, credenziali crittografate e cronologia delle esecuzioni, il file config, i nodi community installati e i file binari in modalità di archiviazione su disco. Il volume denominato n8n_data sopravvive a docker compose down e alla rimozione del container. Non sopravvive a docker compose down -v né a docker volume rm: entrambi questi comandi cancellano i dati.

Per un backup, due approcci si completano a vicenda. Il primo archivia l'intero volume: si arresta n8n per il tempo necessario a copiare i file, così da evitare di acquisire un database SQLite durante una scrittura. Il secondo utilizza lo strumento da riga di comando di n8n per esportare workflow e credenziali in JSON, leggibili e reimportabili singolarmente.

Backup del volume completo
cd ~/n8n
mkdir -p backups
docker compose stop n8n
docker run --rm \
  -v n8n_data:/data:ro \
  -v "$PWD/backups":/backup \
  alpine tar czf "/backup/n8n_data-$(date +%F).tgz" -C /data .
docker compose start n8n
ls -lh backups/
Esportazione JSON tramite la CLI di n8n
# Un fichier par workflow, puis un par identifiant, dans le volume
docker exec n8n n8n export:workflow --backup --output=/home/node/.n8n/exports/workflows/
docker exec n8n n8n export:credentials --backup --output=/home/node/.n8n/exports/credentials/

# Récupérer les exports sur la machine hôte
docker cp n8n:/home/node/.n8n/exports ./backups/exports-$(date +%F)

L'opzione --backup dei comandi di esportazione raggruppa le opzioni che producono un file per elemento, in un formato leggibile. Gli identificatori esportati restano crittografati con la vostra chiave, salvo aggiungere --decrypted; in tal caso, trattate il file come un segreto. Per il ripristino, i comandi import:workflow e import:credentials accettano la stessa cartella con l'opzione --separate. Il riferimento completo della CLI si trova su docs.n8n.io/hosting/cli-commands/.

Per un ripristino completo su un'altra macchina: ricrea la cartella con lo stesso docker-compose.yml e lo stesso .env, crea il volume vuoto con docker compose up -d, poi docker compose stop, decomprimi l'archivio nel volume con il comando inverso del backup e riavvia. La stessa chiave di crittografia è necessaria per recuperare le credenziali.

i
SQLite o PostgreSQL?
SQLite è il database predefinito ed è sufficiente per un'istanza personale o per un piccolo team. La documentazione di n8n raccomanda PostgreSQL per la produzione, soprattutto quando vengono eseguiti più workflow in parallelo o si prevede di usare la modalità coda. Il passaggio avviene tramite le variabili DB_TYPE=postgresdb e DB_POSTGRESDB_*, aggiungendo un servizio postgres al file Compose. La migrazione da SQLite a PostgreSQL passa dall'esportazione e dall'import CLI descritti sopra.

#Aggiornare n8n senza danneggiare l'istanza

n8n pubblica versioni frequenti. Il tag latest dell'immagine punta all'ultima versione stabile, il tag next alla versione di test; i tag numerati permettono di fissare una versione precisa. Con Compose, l'aggiornamento richiede tre comandi: scaricare la nuova immagine, arrestare il vecchio container e crearne uno nuovo con la stessa configurazione. I dati restano nel volume e non vengono toccati. Le migrazioni dello schema del database, quando necessarie, vengono eseguite automaticamente all'avvio.

Terminale
cd ~/n8n

# 1. Sauvegarde avant toute mise à jour (voir section précédente)

# 2. Mise à jour
docker compose pull
docker compose down
docker compose up -d

# 3. Contrôle
docker compose logs --tail=50 n8n
docker exec n8n n8n --version

Tre precauzioni evitano la maggior parte delle brutte sorprese. Prima di tutto, fate un backup: una migrazione del database non può essere annullata. Leggete le note di rilascio su github.com/n8n-io/n8n/releases e la pagina di aggiornamento della documentazione, docs.n8n.io/hosting/installation/updating/: le versioni principali rimuovono variabili d'ambiente o cambiano i comportamenti predefiniti, e la documentazione mantiene una pagina dedicata alle modifiche incompatibili. Infine, se l'istanza è importante per voi, preferite un tag numerato a latest: scegliete voi quando aggiornare invece di subirlo al prossimo pull.

docker-compose.yml (versione fissata, esempio della struttura)
services:
  n8n:
    # Remplacez par un numéro lu sur la page des releases
    image: docker.n8n.io/n8nio/n8n:1.XX.Y
→
Torna indietro
Se una versione crea problemi, rimetti l’etichetta precedente nel file Compose e rilancia docker compose up -d. Funziona finché la nuova versione non ha migrato lo schema del database; in caso contrario, ripristina il backup eseguito prima dell’aggiornamento. Questo è il motivo del passaggio 1.

#Esporre n8n in HTTPS, con prudenza

Finché utilizzi n8n dalla macchina che lo ospita o dalla tua rete locale, l'installazione precedente è sufficiente. La necessità di un'esposizione emerge con i webhook: un servizio di terze parti che deve chiamare la tua istanza, oppure un accesso dall'esterno. Esistono due strade e spesso la prima è quella giusta.

Una VPN invece dell'esposizione
Tailscale, WireGuard o la VPN del tuo router consentono di accedere a n8n da qualsiasi luogo senza aprire porte su Internet. Per un uso personale senza webhook pubblico, è la soluzione più sicura e semplice. L'istanza resta in HTTP sulla rete privata e N8N_SECURE_COOKIE=false diventa necessario se vi accedi tramite l'indirizzo VPN.
Un reverse proxy con certificato
Per ricevere webhook pubblici servono un nome di dominio, un reverse proxy che termini il TLS e un certificato. L'esempio ufficiale di n8n usa Traefik; noi mostriamo Caddy, la cui configurazione occupa appena tre righe e che ottiene da solo i certificati Let's Encrypt.

Nella configurazione seguente, n8n non pubblica più alcuna porta: è raggiungibile solo Caddy, sulle porte 80 e 443, che inoltra le richieste al container n8n attraverso la rete interna di Compose. Le variabili N8N_HOST, N8N_PROTOCOL e WEBHOOK_URL indicano a n8n l'indirizzo pubblico attraverso cui viene servito; senza di esse, gli URL dei webhook mostrati nell'editor punterebbero a localhost e i reindirizzamenti OAuth fallirebbero.

docker-compose.yml (con Caddy)
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    environment:
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_HOST=n8n.votre-domaine.fr
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.votre-domaine.fr/
      - GENERIC_TIMEZONE=Europe/Paris
      - TZ=Europe/Paris
      - N8N_RUNNERS_ENABLED=true
      - N8N_DIAGNOSTICS_ENABLED=false
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=336
    volumes:
      - n8n_data:/home/node/.n8n

  caddy:
    image: caddy:2
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config

volumes:
  n8n_data:
  caddy_data:
  caddy_config:
Caddyfile
n8n.votre-domaine.fr {
    reverse_proxy n8n:5678
}

Prima di eseguire docker compose up -d, il record DNS di n8n.votre-domaine.fr deve puntare all'indirizzo pubblico della macchina e le porte 80 e 443 devono essere inoltrate a essa. Caddy richiede quindi un certificato a Let's Encrypt e lo rinnova senza intervento. I volumi caddy_data e caddy_config conservano i certificati e lo stato tra un riavvio e l'altro.

!
Cosa comporta un'esposizione pubblica
Un'istanza n8n raggiungibile da Internet è un bersaglio: contiene le tue credenziali di integrazione e può eseguire codice. Usa una password lunga e univoca per l'account proprietario, attiva l'autenticazione a due fattori nelle impostazioni, applica rapidamente gli aggiornamenti e non lasciare alcun accesso HTTP residuo. Se non ti servono webhook pubblici, la VPN resta preferibile. I principi descritti in dettaglio nella nostra guida sulla messa in sicurezza di un server Ollama si applicano allo stesso modo a n8n.

#Risoluzione dei problemi: i blocchi più frequenti

Messaggio sul cookie sicuro all'apertura
Accedi a n8n tramite HTTP da un indirizzo che non è localhost. Puoi passare a HTTPS oppure aggiungere N8N_SECURE_COOKIE=false, esclusivamente su una rete privata.
Errore di autorizzazione su /home/node/.n8n
Il container viene eseguito con l'utente node, non con root. Succede quando si sostituisce il volume denominato con una cartella dell'host i cui permessi non corrispondono. Mantieni il volume denominato oppure allinea il proprietario della cartella all'ID utente 1000, quello di node nell'immagine.
I workflow pianificati vengono eseguiti all'ora sbagliata
GENERIC_TIMEZONE è assente o scritto in modo errato. Il valore atteso è un nome di fuso orario IANA come Europe/Paris. Ogni workflow può anche impostare il proprio fuso orario nelle impostazioni.
I webhook mostrano un indirizzo localhost
WEBHOOK_URL non è definita oppure non corrisponde all'indirizzo tramite il quale il servizio di terze parti vi raggiunge. Il valore deve terminare con una barra obliqua e includere il protocollo.
Il database cresce senza fine
La pulizia delle esecuzioni è disattivata o impostata su un periodo troppo lungo. Verificate EXECUTIONS_DATA_PRUNE e EXECUTIONS_DATA_MAX_AGE e ricordatevi anche dell'opzione che conserva i dati delle esecuzioni riuscite, disattivabile workflow per workflow.
Dopo un aggiornamento, n8n rifiuta di avviarsi
Leggi il log con docker compose logs n8n: il messaggio indica generalmente una variabile rimossa o una migrazione non riuscita. Confrontalo con le note di rilascio, poi ripristina il backup se necessario.
n8n non vede Ollama sulla stessa macchina
Da un container, localhost indica il container stesso, non l'host. L'indirizzo da utilizzare dipende dal sistema e dal modo in cui viene avviato Ollama; è questo l'argomento della guida su n8n e di Ollama citato qui sotto.
Comandi utili
docker compose ps                     # état du conteneur
docker compose logs --tail=100 n8n   # dernières lignes du journal
docker exec n8n n8n --version         # version installée
docker volume inspect n8n_n8n_data    # emplacement réel du volume (préfixe = nom du dossier)
docker compose restart n8n            # redémarrage simple

Per le domande che non trovano risposta nella documentazione, il forum community.n8n.io è attivo e l'editore risponde. Indicate la versione esatta, la modalità di installazione e le righe del log: sono le prime tre cose che vengono richieste.


#Per approfondire

L'istanza è configurata, sottoposta a backup e aggiornata. Il passo logico successivo è collegarla a un modello locale e poi integrarla in uno stack più ampio. Fonti ufficiali consultate per questa guida: la sezione sull'hosting della documentazione di n8n (docs.n8n.io/hosting/), la pagina sull'installazione Docker (docs.n8n.io/hosting/installation/docker/), la pagina sugli aggiornamenti, la pagina sulla licenza e quella sulle funzionalità dell'edizione community. Queste pagine cambiano con le versioni: in caso di divergenza con questa guida, fanno fede loro.

n8n + Ollama: automatizzare con un'IA 100 % locale
La guida successiva: nodi IA, connessione a Ollama dal container, primi workflow di traduzione e riepilogo. https://quelllm.fr/guide/n8n-ollama-automatisation-workflow
Ollama con Docker
Se volete anche eseguire Ollama in un container, accanto a n8n, con accesso alla GPU. https://quelllm.fr/guide/ollama-docker-installation-guide
Mettere un LLM in produzione con Docker Compose
Lo stack completo Ollama, Open WebUI, Qdrant, n8n e Traefik in un unico file Compose, per andare oltre l'istanza isolata. https://quelllm.fr/guide/deployer-llm-docker-compose-production
Mettere in sicurezza il proprio server Ollama
Autenticazione, firewall, reverse proxy: le regole di esposizione valgono per qualsiasi servizio auto-ospitato, compreso n8n. https://quelllm.fr/guide/securiser-serveur-ollama
Questa guida ti è stata utile?

Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.