Ospitare Umami su un VPS gestito significa tenere le statistiche dei vostri siti su una macchina tutta vostra, che i nostri team tengono aggiornata e supervisionano giorno e notte. Umami è un software libero con licenza MIT che misura il traffico senza cookie. Questa guida segue la sua documentazione ufficiale: l'installazione con Docker Compose e PostgreSQL, HTTPS, il primo accesso, lo script di tracciamento, ciò che il progetto dice dei dati personali, le impostazioni utili, i backup e gli aggiornamenti.
Di Simon Vasconcelos Lee
Pubblicato il 15 novembre 2026Lettura: 12 minuti
APP_SECRET e TWO_FACTOR_ENCRYPTION_KEY in modo casuale, servite Umami in HTTPS su un sottodominio dedicato, poi cambiate subito la password dell'account admin.<head> delle vostre pagine: il tracker non usa cookie.pg_dump, conservate il file .env in un luogo sicuro, e aggiornate con docker compose pull.Umami è una piattaforma open source di analisi web e di prodotto. La sua documentazione descrive uno strumento che riunisce traffico, campagne, comportamento dei visitatori, conversioni, fidelizzazione e ricavi, dalla prima visita ai risultati che contano per la vostra attività. È scritto in TypeScript su Next.js, e la sua immagine Docker gira con un account non privilegiato.
Un'istanza segue più siti: ognuno riceve il proprio ID e il proprio script di tracciamento, e i vostri colleghi si orientano grazie agli account e ai team.
Umami è pubblicato con la licenza MIT, a nome di Umami Software, Inc. Concede gratuitamente il diritto di usare, copiare, modificare, unire, pubblicare, distribuire, concedere in sublicenza e vendere copie del software. Potete quindi farlo girare per la vostra azienda e per i siti dei vostri clienti, senza alcuna licenza da acquistare.
La sua unica condizione: l'avviso di copyright e l'avviso di autorizzazione accompagnano tutte le copie o le parti sostanziali del software. Come ogni licenza MIT, fornisce il software «così com'è», senza garanzia.
La documentazione presenta Umami come un sistema di analisi senza cookie, senza tracciamento tra siti e senza raccolta automatica di dati personali. In self-hosting, tiene le vostre statistiche sul vostro server: decidete voi dove si trovano e per quanto tempo restano.
| Domanda | Che cosa dice il progetto | Fonte |
|---|---|---|
| Cookie | Il tracker web non usa cookie; se il vostro sito abbia bisogno di un avviso sui cookie dipende dagli altri servizi che usate e dai requisiti che si applicano | FAQ |
| Dati raccolti | Pagine viste, URL di provenienza, browser, sistemi operativi, tipi di dispositivo e posizione approssimativa | FAQ |
| Indirizzo IP | La tabella delle sessioni non ha una colonna per l'indirizzo IP; un ID di sessione è un hash del sito, dell'indirizzo, del browser e di un sale che cambia ogni mese per impostazione predefinita | Schema e codice, versione 3.4.1 |
| Conservazione | In self-hosting, i dati restano finché non li eliminate | FAQ |
| GDPR | Umami è progettato pensando alla privacy, e la conformità dipende da come lo configurate e lo usate | FAQ |
| Dati che inviate | Un ID visitatore o le proprietà di un evento che scegliete di inviare sono sotto la vostra responsabilità | Introduzione |
Tre impostazioni dello script di tracciamento vanno oltre, se lo desiderate: data-exclude-search toglie i parametri di ricerca dagli URL registrati, data-exclude-hash toglie l'hash, e data-do-not-track disattiva il tracciamento per i browser che espongono la preferenza Do Not Track. La documentazione precisa che quest'ultima impostazione non è, da sola, una soluzione completa di gestione del consenso.
Se identificate i visitatori connessi con data-distinct-id o umami.identify(), la documentazione raccomanda un ID utente interno o un hash anziché un indirizzo e-mail: il valore si legge nell'HTML della pagina.
Il repository fornisce un docker-compose.yml che avvia Umami e il suo database PostgreSQL. Dalla versione 3, PostgreSQL è l'unico database supportato, almeno nella versione 12.14, e la documentazione raccomanda di impostarlo sul fuso orario UTC. Su un server in cui Docker è installato, create una cartella e cominciate dai segreti, generati in modo casuale con openssl, come suggerisce la documentazione:
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
TWO_FACTOR_ENCRYPTION_KEY=$(openssl rand -hex 32)
EOF
chmod 600 .env
Collocate poi accanto questo compose.yaml. Segue il file del progetto alla versione 3.4.1, con due modifiche: i segreti arrivano dal file .env, e la porta è pubblicata solo su 127.0.0.1.
services:
umami:
image: ghcr.io/umami-software/umami:latest
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:${POSTGRES_PASSWORD}@db:5432/umami
APP_SECRET: ${APP_SECRET}
TWO_FACTOR_ENCRYPTION_KEY: ${TWO_FACTOR_ENCRYPTION_KEY}
depends_on:
db:
condition: service_healthy
init: true
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
docker compose up -d
curl -s http://127.0.0.1:3000/api/heartbeat
DATABASE_URL: l'unica variabile obbligatoria, la stringa di connessione al database. La password esadecimale si inserisce così com'è; una password con caratteri speciali richiederebbe la codifica percentuale.APP_SECRET: una stringa casuale che protegge i token di autenticazione, unica per ogni installazione. Nel codice della versione 3.4.1, entra anche nel calcolo degli ID di sessione: mantenetela stabile.TWO_FACTOR_ENCRYPTION_KEY: 64 caratteri esadecimali che cifrano i segreti dell'autenticazione a due fattori. Senza di essa, nessuno può attivare l'autenticazione a due fattori.admin. La sonda /api/heartbeat risponde {"ok":true} quando Umami è pronto.latest segue l'ultima versione pubblicata. Il registro del progetto pubblica anche tag di versione, come 3.4.1, per fissare quella che fate girare.La documentazione di installazione non indica alcun valore di memoria o di CPU. La taglia dipende dal traffico dei siti seguiti e dal volume di dati che conservate. Su un VPS gestito, descrivetici il vostro uso e vi raccomandiamo la taglia adatta.
Umami ascolta in HTTP sulla porta 3000, e la documentazione suggerisce di servirlo dietro il vostro server web, tramite un reverse proxy. Dategli un sottodominio dedicato, come stats.example.com, che punta al server con record A e AAAA. Servire Umami in un percorso passa da BASE_PATH, una variabile letta alla compilazione dell'applicazione: con l'immagine pubblicata, il sottodominio è la strada diretta.
Il proxy deve anche trasmettere l'indirizzo del visitatore. Umami lo legge dalle intestazioni che riceve, tra cui X-Real-IP e X-Forwarded-For: lo usa per distinguere i visitatori e per localizzarne il paese. Se il vostro proxy usa un'altra intestazione, CLIENT_IP_HEADER la indica.
Caddy ottiene il certificato Let's Encrypt e attiva HTTPS da solo. La sua direttiva reverse_proxy imposta X-Forwarded-For per impostazione predefinita: bastano queste tre righe.
stats.example.com {
reverse_proxy 127.0.0.1:3000
}
Questo blocco segue l'esempio Nginx della documentazione di Umami, in ascolto sulla porta 80 per lasciare a Certbot l'attivazione di HTTPS:
server {
listen 80;
listen [::]:80;
server_name stats.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Certbot installa poi il certificato e si occupa di rinnovarlo:
sudo certbot --nginx
Quando crea il proprio database, Umami apre un account amministratore: nome utente admin, password umami. La documentazione chiede di cambiare questa password al primo accesso.
admin e umami.Conservate TWO_FACTOR_ENCRYPTION_KEY insieme ai vostri backup: la documentazione avverte che perdere o cambiare questa chiave rende illeggibili i segreti registrati, e ogni utente deve allora configurare di nuovo l'autenticazione a due fattori.
<head> delle vostre pagine, poi visitate il vostro sito: i dati compaiono subito nella dashboard.<script defer src="https://stats.example.com/script.js" data-website-id="your-website-id"></script>
next/script anziché con un semplice tag <script>.data-domains limita il tracciamento ai vostri domini di produzione, il che tiene i vostri ambienti di prova fuori dalle statistiche.localStorage.setItem('umami.disabled', 1).Alcuni ad blocker bloccano tutto ciò che somiglia a uno strumento di analisi. In self-hosting, Umami è già servito dal vostro dominio, e due variabili vanno oltre: TRACKER_SCRIPT_NAME dà allo script un nome diverso da script.js, e COLLECT_API_ENDPOINT rinomina il punto di raccolta, al posto di /api/send. Lo script chiama poi da solo il nuovo punto; sulle vostre pagine cambia solo la sorgente del codice di tracciamento.
TRACKER_SCRIPT_NAME: "stats.js"
COLLECT_API_ENDPOINT: "/api/collect"
Queste variabili d'ambiente vanno nel servizio umami di compose.yaml, poi docker compose up -d ricrea il container perché vengano prese in considerazione:
| Variabile | Che cosa fa | Valore |
|---|---|---|
DISABLE_TELEMETRY | Disattiva la telemetria anonima che Umami invia al progetto per migliorare l'applicazione | 1 |
PRIVATE_MODE | Disattiva tutte le chiamate di rete esterne, comprese le icone dei siti, servite da DuckDuckGo per impostazione predefinita | 1 |
DISABLE_UPDATES | Disattiva la verifica delle nuove versioni | 1 |
IGNORE_IP | Esclude dalla raccolta indirizzi IP e reti CIDR, come quelli dei vostri uffici | Un elenco separato da virgole |
SALT_ROTATION | Fissa la frequenza con cui cambia il sale degli ID di sessione | month per impostazione predefinita |
REDIS_URL | Aggiunge una cache Redis, che la documentazione raccomanda per i siti molto visitati o per più istanze | Il vostro indirizzo Redis |
MCP_ENABLED | Apre il punto /mcp: il vostro assistente IA legge le vostre statistiche in sola lettura, con una chiave API creata in Settings, API keys | 1 |
Tutto ciò che Umami conserva vive nel suo database PostgreSQL: account, siti, team e statistiche. Esportatelo ogni giorno e subito prima di ogni aggiornamento: in self-hosting, questi dati si conservano senza limiti di tempo. Accanto al database, il file .env contiene i segreti che lo rendono utilizzabile:
| Elemento | Che cosa conserva | Da salvare |
|---|---|---|
| Il database PostgreSQL | Account, siti, team, report e tutte le statistiche | Obbligatorio, con pg_dump |
.env | La password del database, APP_SECRET e la chiave dell'autenticazione a due fattori | Obbligatorio, cifrato |
compose.yaml | La configurazione della vostra istanza | Raccomandato |
pg_dump produce un'esportazione coerente mentre il database è in uso. Il formato personalizzato, -Fc, è compresso e si ripristina con pg_restore:
docker compose exec -T db pg_dump -U umami -d umami -Fc > umami-$(date +%F).dump
Pianificate questo comando sul server almeno una volta al giorno, fate pulizia tra le esportazioni, che si accumulano, e inviatene una copia altrove. Conservate sul disco del server, queste esportazioni rientrano anche nei suoi backup notturni.
docker compose stop umami.docker compose stop umami
docker compose exec -T db pg_restore -U umami -d umami --clean --if-exists < umami-YYYY-MM-DD.dump
docker compose start umami
Ripetete questo esercizio di tanto in tanto, su una copia: è così che verificate che un backup funzioni.
La documentazione fornisce due comandi, dalla cartella del compose.yaml. Il database resta nel suo volume:
docker compose pull
docker compose up --force-recreate -d
Al riavvio, il container applica da solo le migrazioni dello schema. La versione 3.4.0, del 17 settembre 2026, ne conteneva due, per le annotazioni e le chiavi API; la versione 3.4.1, del 23 ottobre 2026, non ne contiene. Dopo un aggiornamento importante, come il passaggio alla versione 3, la documentazione suggerisce di lanciare ANALYZE in PostgreSQL perché le dashboard ritrovino la loro velocità:
docker compose exec db psql -U umami -d umami -c "ANALYZE;"
postgres:15-alpine del file. Il passaggio a una nuova versione principale di PostgreSQL richiede un'esportazione e un ripristino, oppure pg_upgrade.Il self-hosting richiede di occuparsi del server oltre che dell'applicazione. Su un VPS gestito, i nostri team prendono in carico il server e seguono la vostra istanza in modo proattivo; Umami resta il vostro software, con le sue impostazioni e i suoi dati.
| Argomento | I nostri team | Voi |
|---|---|---|
| Il server | Aggiornamenti del sistema e della sicurezza, interventi sul server compresi | Il momento più adatto alla vostra attività |
| La supervisione | Server seguito 24 ore su 24, 7 giorni su 7, con intervento senza attendere la vostra chiamata | La lettura dei log della vostra istanza |
| Umami | Monitoraggio proattivo: errori, rallentamenti e spazio su disco individuati, correzione raccomandata | La sua installazione, i suoi aggiornamenti e le sue impostazioni, che applicate voi o il vostro assistente IA |
| I siti e le statistiche | Il server che li ospita, sorvegliato e salvato | Gli account, i siti seguiti, lo script di tracciamento e la durata di conservazione dei dati |
| I backup | Ogni notte, cifrati e conservati fuori dalla macchina; ripristino compreso | Le esportazioni proprie di Umami e la richiesta di ripristino, quando ne avete bisogno |
| La migrazione | Il vostro server attuale migrato, in omaggio | Il momento del passaggio |
Se preferite che i nostri team intervengano nell'applicazione stessa, questa prestazione si fattura a ore o a forfait, con un preventivo comunicato prima dell'intervento.
Con un VPS gestito Simafri, i nostri team tengono aggiornato il server della vostra istanza Umami, lo sorvegliano giorno e notte e intervengono senza attendere la vostra chiamata; seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi o il vostro assistente IA. I backup sono cifrati ogni notte e conservati fuori dalla macchina, il loro ripristino è compreso e la migrazione del vostro server attuale è in omaggio.
Sì. Umami ha licenza MIT: potete usarlo, modificarlo e ridistribuirlo in azienda senza alcuna licenza da acquistare, a condizione di conservarne l'avviso di copyright. Resta il costo del server che lo fa girare.
No. La FAQ del progetto indica che il tracker web di Umami non usa cookie. Se il vostro sito abbia bisogno di un avviso sui cookie dipende dagli altri servizi che vi usate e dai requisiti che si applicano.
Non dalla versione 3: Umami supporta PostgreSQL, almeno nella versione 12.14. Un'istanza in versione 2 su MySQL sposta prima i propri dati su PostgreSQL con la guida alla migrazione del progetto, poi passa alla versione 3.
Partite dal docker-compose.yml del progetto, che avvia Umami e PostgreSQL, con segreti casuali in un file .env e la porta pubblicata su 127.0.0.1. Lanciate docker compose up -d, poi collocate davanti un reverse proxy in HTTPS, su un sottodominio.
All'installazione, Umami crea un account admin con la password umami. Cambiatela al primo accesso, in Settings poi Profile, e attivate l'autenticazione a due fattori nella scheda Security, una volta impostata TWO_FACTOR_ENCRYPTION_KEY.
Su un'istanza self-hosted, TRACKER_SCRIPT_NAME dà allo script un nome diverso da script.js, e COLLECT_API_ENDPOINT rinomina il punto di raccolta /api/send. Cambiate poi la sorgente del codice di tracciamento sulle vostre pagine.
Esportate ogni giorno il database PostgreSQL con pg_dump, dal container del database, e conservate a parte il file .env, che contiene APP_SECRET e la chiave dell'autenticazione a due fattori. Ripristinate con pg_restore, e provate regolarmente il ripristino.
Un VPS gestito copre il server: sistema, sicurezza, supervisione e backup. I nostri team seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi. Un intervento nell'applicazione si fattura a ore o a forfait.
Simafri
Parliamo del vostro progetto
Diteci in due parole ciò che vi serve: vi rispondiamo rapidamente.
Grazie! La tua richiesta è stata inviata. Ti risponderemo a breve.
Preferite l'email? Scriveteci a support@simafri.com.