Installazione di n8n con Docker e PostgreSQL
n8n è una piattaforma di automazione dei flussi di lavoro che puoi eseguire sul tuo server. Un'istanza auto-ospitata (self-hosted) mantiene i tuoi flussi di lavoro, le credenziali e i dati di esecuzione sotto il tuo controllo e non ha limiti sul numero di flussi di lavoro o esecuzioni, oltre a ciò che il server può gestire.
Questa guida configura n8n su un server dedicato con PostgreSQL, HTTPS e backup. Utilizza tre container gestiti da Docker Compose:
- n8n, la piattaforma di automazione stessa;
- PostgreSQL, il database per flussi di lavoro, credenziali e cronologia di esecuzione;
- Caddy, un proxy inverso che ottiene e rinnova automaticamente un certificato HTTPS.
Per impostazione predefinita, n8n memorizza i suoi dati in SQLite. Questa guida utilizza invece PostgreSQL: può essere sottoposto a backup mentre n8n è in esecuzione ed è il database che n8n raccomanda per il self-hosting.
I passaggi sono stati testati su Ubuntu 24.04 LTS con n8n 2.46.7, PostgreSQL 17, Docker 29 e Docker Compose v5.
Prima di iniziare
Avrai bisogno di:
- un server con Ubuntu 24.04 LTS con accesso root tramite SSH;
- un dominio o sottodominio per n8n, ad esempio
n8n.example.com; - un record A per quel nome che punta all'indirizzo IPv4 del server.
Se il dominio ha anche un record AAAA, il server deve essere raggiungibile tramite IPv6 a quell'indirizzo. In caso contrario, Let's Encrypt potrebbe provare prima l'IPv6 e fallire nell'emissione del certificato.
Verifica che il record si risolva sul tuo server prima di continuare:
dig +short n8n.example.com
Il comando dovrebbe restituire l'indirizzo IP del server. L'emissione del certificato in Caddy dipende da questo, quindi attendi fino a quando il DNS non si è propagato.
Tutti i comandi seguenti vengono eseguiti come root. Se lavori come utente normale con diritti sudo, aggiungi sudo prima di ogni comando.
Installare Docker
Installa Docker Engine e il plugin Compose dal repository ufficiale di Docker. Il pacchetto docker.io dal repository di Ubuntu è più vecchio e non include Compose v2.
apt update && apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc
Aggiungi il repository:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
Installa i pacchetti:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verifica che entrambi gli strumenti siano disponibili:
docker --version docker compose version
Creare la directory del progetto e i segreti
Tutti i file di n8n risiederanno in /opt/n8n:
mkdir -p /opt/n8n && cd /opt/n8n
Crea il file .env con il tuo dominio, il fuso orario e i segreti generati. Sostituisci n8n.example.com e il fuso orario con i tuoi valori:
cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env
GENERIC_TIMEZONE imposta il fuso orario utilizzato dal nodo Schedule Trigger e da altri nodi basati sul tempo. Senza di esso, n8n utilizza America/New_York.
N8N_ENCRYPTION_KEY è la chiave che n8n utilizza per crittografare le credenziali che salvi al suo interno: token API, password, segreti OAuth. Se questa chiave viene persa, le credenziali in un database ripristinato non possono essere decrittografate e ognuna di esse dovrà essere inserita di nuovo.
Copia il file .env in un luogo sicuro al di fuori del server immediatamente, ad esempio in un gestore di password. Un backup del database senza N8N_ENCRYPTION_KEY ripristina i tuoi flussi di lavoro, ma non le tue credenziali.
Creare il file Docker Compose
Crea /opt/n8n/compose.yaml:
services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped depends_on: postgres: condition: service_healthy environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_DATABASE: ${POSTGRES_DB} DB_POSTGRESDB_USER: ${POSTGRES_USER} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:
Alcuni dettagli in questo file sono importanti per la sicurezza e la stabilità.
PostgreSQL non ha una sezione ports. Il database è raggiungibile solo dagli altri container nel progetto, mai da internet.
La porta di n8n è pubblicata come 127.0.0.1:5678. Gli utenti raggiungono n8n solo tramite Caddy su HTTPS, mentre tu puoi comunque controllare n8n localmente sul server.
Non accorciare la riga della porta di n8n in 5678:5678. Docker aggiunge le proprie regole del firewall per le porte pubblicate e queste bypassano UFW. Senza il prefisso 127.0.0.1, n8n diventa raggiungibile tramite HTTP semplice da qualsiasi luogo, anche se UFW blocca la porta 5678.
La condizione depends_on con un healthcheck fa sì che n8n attenda fino a quando PostgreSQL è pronto ad accettare connessioni. Senza di essa, n8n può avviarsi per primo in un cold boot e fallire la connessione al database.
N8N_PROXY_HOPS indica a n8n che è in esecuzione dietro un proxy inverso, quindi legge l'indirizzo reale del client dalle intestazioni del proxy. N8N_WEBHOOK_URL imposta l'indirizzo pubblico che n8n mostra per gli URL dei webhook. Nelle versioni di n8n precedenti alla 2.30, questa variabile si chiama WEBHOOK_URL.
Configurare HTTPS con Caddy
Crea /opt/n8n/Caddyfile con il tuo dominio:
n8n.example.com { reverse_proxy n8n:5678 }
Questa è l'intera configurazione. Al primo avvio, Caddy richiede un certificato Let's Encrypt per il dominio, reindirizza HTTP a HTTPS e rinnova il certificato prima che scada. Le porte 80 e 443 devono essere aperte affinché ciò funzioni.
Configurare il firewall
Consenti prima SSH, poi HTTP e HTTPS, e abilita UFW:
ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status
Se UFW era già abilitato con le tue regole, esegui ufw status prima di apportare modifiche e mantieni le regole di cui hai bisogno. Consentire OpenSSH prima di abilitare UFW impedisce che la tua sessione SSH corrente venga interrotta.
Avviare n8n
Avvia i container in background:
cd /opt/n8n docker compose up -d
Il primo avvio scarica le immagini e richiede uno o due minuti. Verifica che tutti e tre i container siano in esecuzione e che PostgreSQL sia integro (healthy):
docker compose ps
Guarda il log di n8n:
docker compose logs n8n --tail 50
Il log dovrebbe terminare con una riga come:
Editor is now accessible via: https://n8n.example.com
Verifica che n8n risponda localmente e tramite Caddy:
curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz
Entrambi i comandi dovrebbero restituire {"status":"ok"}.
Se il secondo comando fallisce, controlla il log di Caddy con docker compose logs caddy. La causa più comune è un record DNS che non punta ancora a questo server, o le porte 80 e 443 chiuse.
Creare l'account proprietario
Apri https://n8n.example.com nel tuo browser. Alla prima visita, n8n ti chiede di creare l'account proprietario. Questo account ha diritti completi sull'istanza e gestisce tutti gli altri utenti.

Inserisci la tua email, nome e cognome, e una password, quindi fai clic su Avanti (Next). La password deve essere lunga almeno 8 caratteri e contenere almeno un numero e una lettera maiuscola. Usane una forte: l'editor di n8n è aperto a internet e chiunque vi acceda può eseguire comandi sul server attraverso i tuoi flussi di lavoro.
Dopo il primo accesso, n8n mostra un breve sondaggio: Customize n8n to you. Le domande sono facoltative. Fai clic su Inizia (Get started) per chiuderlo, con o senza aver risposto.

Successivamente, n8n offre una chiave di licenza gratuita per diverse funzionalità della Community Edition: debug avanzato, ricerca e tagging delle esecuzioni e cartelle per i flussi di lavoro. La chiave viene inviata all'email che inserisci. Fai clic su Send me a free license key per ottenerla, o su Salta (Skip) se non hai bisogno di queste funzionalità.

Si apre la pagina di panoramica. L'installazione è completa e puoi creare il tuo primo flusso di lavoro.

Eseguire il backup di n8n
Un backup di n8n è composto da due parti: un dump di PostgreSQL con i tuoi flussi di lavoro, credenziali, utenti e cronologia di esecuzione, e il file .env con N8N_ENCRYPTION_KEY. Nessuna delle due parti è utile senza l'altra.
In questa configurazione, n8n mantiene tutto il suo stato in PostgreSQL. Il volume n8n_data non ha bisogno di essere sottoposto a backup: un ripristino completo funziona solo con il dump del database e il file .env.
Crea una directory di backup ed esegui il dump del database:
mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/
Il dump viene eseguito mentre n8n è in esecuzione, quindi non è necessario alcun tempo di inattività.
Un backup che rimane sullo stesso server non aiuterà se il disco del server si guasta. Copia /opt/n8n-backup su un archivio esterno a intervalli regolari. Puoi utilizzare INTROSERV Cloud Storage per questo, come descritto nella guida Collegamento di Introserv Cloud Storage al server .
Ripristinare da un backup
Per ripristinare n8n su un nuovo server, installa Docker come descritto sopra e copia la directory di backup in /opt/n8n-backup su quel server. Quindi, metti i file di configurazione al loro posto:
mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env
Se il nuovo server ha un indirizzo IP diverso, aggiorna prima il record A del dominio.
Avvia solo il database:
cd /opt/n8n docker compose up -d postgres
Attendi fino a quando docker compose ps mostra PostgreSQL come integro (healthy), quindi ripristina il dump:
docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump
Avvia il resto dello stack:
docker compose up -d
Accedi con lo stesso account proprietario e verifica che i tuoi flussi di lavoro e le tue credenziali siano al loro posto. Le credenziali salvate vengono decrittografate con N8N_ENCRYPTION_KEY dal file .env ripristinato, quindi funzionano senza dover essere inserite di nuovo.
Aggiornare n8n
n8n rilascia aggiornamenti frequentemente. Per aggiornare all'ultima versione, scarica le nuove immagini e ricrea i container:
cd /opt/n8n docker compose pull docker compose up -d docker image prune -f
L'ultimo comando rimuove le vecchie immagini che non sono più utilizzate.
Verifica la nuova versione:
docker compose exec n8n n8n --version
Esegui un backup prima di ogni aggiornamento. All'avvio, una nuova versione di n8n può migrare lo schema del database, quindi il modo affidabile per tornare alla versione precedente è ripristinare un dump effettuato prima dell'aggiornamento.
L'immagine di PostgreSQL è bloccata alla versione principale 17, quindi docker compose pull installa solo aggiornamenti minori di PostgreSQL. Il passaggio a una nuova versione principale richiede un dump e un ripristino e non viene eseguito automaticamente.
Prossimi passi
La tua istanza di n8n è pronta per il lavoro. Da qui puoi:
- invitare altri utenti all'istanza;
- configurare SMTP in modo che n8n possa inviare inviti ed email di reimpostazione della password;
- connettere i tuoi servizi e costruire i tuoi primi flussi di lavoro.
Se prevedi di eseguire flussi di lavoro di IA con modelli linguistici locali, consulta la guida Installazione di n8n AI Starter Kit con Ollama .