Automazione PMIGuideConsulenzaAutore

Come installare n8n self-hosted con Docker Compose (guida passo passo)

Di Federico Francolini · Aggiornato il 27 ottobre 2026

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

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:

TipoNomeDestinazione
An8nIP_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:

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:

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:

  1. Usa una password lunga e unica e attiva l’autenticazione a due fattori sul tuo utente, se disponibile nella tua versione.
  2. Invita i colleghi con utenti personali, non condividere l’account owner.
  3. Limita l’accesso SSH al server (chiavi invece di password, firewall che apre solo 22, 80 e 443).
  4. 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:

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

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.

Ti serve aiuto? Se vuoi automatizzare un processo della tua azienda ma non hai tempo o competenze interne, posso aiutarti a valutarlo e impostarlo. Richiedi una consulenza →