SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor

Traccar, OwnTracks o Dawarich: quale scegliere?

Confronta Traccar, OwnTracks, Dawarich e Home Assistant per lo storico o il tempo reale. Scopri quale scegliere e perché proteggere l'endpoint di ingest.

Quale applicazione di localizzazione self-hosted è adatta al tuo caso

Il tracciamento della posizione self-hosted si basa su una distinzione: vuoi conservare uno storico per te oppure seguire una posizione in tempo reale insieme ad altre persone? Dawarich risponde alla prima esigenza. È un'alternativa self-hosted a Google Maps Timeline e importa lo storico che già possiedi. Traccar risponde alla seconda. È stato progettato per hardware GPS e flotte e tratta il telefono come un tracker aggiuntivo. OwnTracks si colloca al di sotto di entrambe le soluzioni come applicazione per il telefono e formato dei messaggi. Se lo utilizzi, Home Assistant conosce già la posizione del telefono, ma per impostazione predefinita elimina il percorso dopo dieci giorni.

Scegli in base a ciò che vuoi consultare il prossimo mese:

  • Una mappa di tutti i luoghi visitati lo scorso marzo, con luoghi e percorsi: Dawarich.
  • Una mappa in tempo reale di più dispositivi, con geofence e regole per gli eventi: Traccar.
  • Un telefono che invia la propria posizione a un sistema che già utilizzi: OwnTracks in modalità HTTP.
  • Automazioni casa/fuori casa, senza interesse per lo storico: Home Assistant da solo.

Nulla funziona finché il telefono non può raggiungere un endpoint HTTPS sotto il tuo controllo, quindi la configurazione lato server ha una sezione dedicata più avanti. Se stai ancora valutando quali altri servizi installare sul server, l'elenco più ampio di ciò che vale la pena eseguire in self-hosting quest'anno mostra dove si colloca un tracker rispetto a tutto il resto.

Traccar: hardware GPS, flotte e posizione in tempo reale

Traccar è un server di tracking. Supporta i protocolli usati dai tracker GPS dedicati, ciascuno sulla propria porta, numerati da 5001 a 5266 nell’elenco dei protocolli attuale. Le istruzioni Docker di Traccar pubblicano inoltre l’intero intervallo da 5000 a 5300 per TCP e UDP. Il sistema offre anche una mappa in tempo reale, geofence, regole per gli eventi e report. L’interfaccia web è in ascolto sulla porta 8082 per impostazione predefinita.

Per i telefoni sono disponibili le app Traccar Client per Android e iOS. L’app invia i dati tramite il protocollo OsmAnd, in ascolto sulla porta 5055 per impostazione predefinita. Sono le relative impostazioni a determinare la durata della batteria e il numero di registrazioni. Distance richiede un aggiornamento ogni N metri durante il movimento. Interval abilita l’invio basato sul tempo quando la distanza è 0. Angle attiva un aggiornamento quando cambia la direzione, espressa in gradi. Stationary Heartbeat definisce il comportamento quando il dispositivo non è in movimento. La documentazione di Traccar specifica che il risultato esatto non è garantito per nessuna di queste impostazioni, perché la decisione spetta al telefono.

Traccar viene distribuito con un database H2 integrato, quindi l’installer funziona senza configurazione aggiuntiva. Il progetto non consiglia H2 per l’uso in produzione. La documentazione descrive MySQL, MariaDB e PostgreSQL come alternative e consiglia TimescaleDB, un database per serie temporali basato su PostgreSQL, per le installazioni di grandi dimensioni. Sposta il database prima di accumulare lo storico, perché la conversione successiva di un file H2 richiede un intervento manuale e non esiste uno strumento supportato.

Dove Traccar è meno adatto: è una console per controllare ciò che accade in questo momento. I report riguardano flotte, viaggi, soste e riepiloghi. Un anno trascorso nei tuoi weekend viene quindi rappresentato come il risultato di una query, non come una cronologia.

OwnTracks: un'app per il telefono e un endpoint, niente altro

OwnTracks è la configurazione classica più semplice. L'app pubblica un piccolo payload JSON ogni volta che rileva uno spostamento del dispositivo. Può pubblicarlo tramite MQTT (message queuing telemetry transport) oppure tramite HTTP semplice. In modalità HTTP, l'endpoint è un URL del formato http[s]://[user[:password]@]host[:port]/path, autenticato con HTTP Basic; il progetto raccomanda vivamente lo schema https://. Con OwnTracks Recorder, il percorso è /pub.

La modalità di monitoraggio è più importante delle impostazioni del server. Quiet pubblica soltanto quando lo richiedi. Manual aggiunge il monitoraggio delle regioni e una richiesta di localizzazione a basso consumo. Significant è la normale modalità automatica. Su iOS, Move pubblica non appena il dispositivo ha percorso locatorDisplacement metri oppure sono trascorsi locatorInterval secondi, a seconda di quale evento si verifica per primo; i valori predefiniti sono 100 metri e 300 secondi. Su Android, per impostazione predefinita Move richiede una posizione ogni 10 secondi. La documentazione di OwnTracks indica che la modalità Move consuma batteria quanto un'app di navigazione e suggerisce di usarla durante un viaggio o mentre il dispositivo è in carica, non come impostazione quotidiana.

OwnTracks Recorder memorizza i dati ricevuti e pubblica una piccola mappa. Molte persone non lo installano mai, perché il payload è identico sia che l'app punti a Recorder, a Dawarich o a Home Assistant. Questo è il motivo per cui conviene iniziare da qui: l'app è un produttore stabile e semplice, e in seguito puoi cambiare consumer senza modificare il dispositivo.

Dawarich: una timeline di Google Maps self-hosted

Dawarich è distribuito con licenza AGPL-3.0 e viene eseguito tramite un file Docker Compose. Un'installazione funzionante comprende quattro container: l'applicazione Rails, un worker Sidekiq per i processi in background, PostgreSQL e Redis. L'applicazione espone la porta 3000. Le sorgenti di importazione includono Google Maps Timeline, OwnTracks, Strava, Immich, file GPX e GeoJSON e i dati EXIF delle foto. Questo elenco di sorgenti rende Dawarich una timeline anziché una mappa in tempo reale, perché può acquisire una cronologia precedente alla disponibilità del server.

L'acquisizione avviene tramite un endpoint HTTP che include una chiave API dell'account. OwnTracks invia i dati a /api/v1/owntracks/points?api_key=... e Overland li invia a /api/v1/overland/batches?api_key=.... GPSLogger riutilizza l'endpoint di OwnTracks.

Verifica dove viene trasmessa la chiave. Si trova nella stringa di query e il formato di log predefinito di nginx registra la riga di richiesta completa. Di conseguenza, la chiave viene salvata in /var/log/nginx/access.log in testo in chiaro per ogni singolo punto. Tratta quel log come un secret, ruota la chiave se invii i log a un sistema centralizzato e non incollare mai un URL funzionante in una discussione di supporto.

Per il file Compose, i volumi e la policy di riavvio, consulta la gestione dei container per eseguire Compose su un VPS. Questa pagina si ferma alla scelta.

Home Assistant: efficace per la presenza, inadatto alla cronologia

Se esegui già Home Assistant, disponi già del tracciamento dei dispositivi. L'app companion invia la posizione e l'integrazione OwnTracks fornisce un URL webhook e una chiave di crittografia da inserire nell'app. Con MQTT configurato, l'integrazione resta in ascolto dei messaggi MQTT invece di usare HTTP.

Il limite è la conservazione dei dati. Il recorder di Home Assistant mantiene i dati per impostazione predefinita per purge_keep_days: 10 e l'eliminazione automatica viene eseguita ogni notte alle 04:12 ora locale, per impedire che il database cresca senza limiti. Questa impostazione è corretta per un database di domotica, ma non per un archivio delle posizioni. Home Assistant risponde alla domanda «c'è qualcuno in casa?». Non risponde alla domanda «dove mi trovavo il 14 marzo?» a meno che tu non invii lo stesso flusso a un sistema che lo conserva.

Monitoraggio continuo o condivisione occasionale?

Il monitoraggio continuo significa che l’app pubblica dati per tutto il giorno, indipendentemente dal fatto che ci si stia muovendo o meno, e che l’archivio creato sia lo scopo principale. La condivisione occasionale significa che le persone si seguono durante un viaggio e che l’archivio è un effetto collaterale non richiesto. Lo stesso software supporta entrambi gli scenari, con impostazioni diverse.

Per il monitoraggio continuo, è preferibile usare report basati sullo spostamento anziché un timer breve, mantenere il database su uno storage di cui vengono effettivamente eseguiti i backup e definire la retention il primo giorno, non quando il disco è pieno. Per la condivisione occasionale, aumenta la frequenza dei report solo mentre è necessaria e poi riporta il telefono a una modalità a basso consumo. OwnTracks offre questo controllo nell’app, mentre Traccar Client consente di ottenere lo stesso risultato tramite i campi relativi a distanza e intervallo.

Se ti serve un link di condivisione valido per due ore durante un singolo viaggio, controlla le note di rilascio del server scelto prima di procedere. Questa è la funzionalità che varia maggiormente tra le versioni ed è il punto più debole di tutte le opzioni descritte qui.

Serve davvero un broker MQTT?

Inizia senza broker. La modalità HTTP richiede un URL, una password e TLS (Transport Layer Security), e tutti i server indicati sopra la supportano. Un broker è utile quando più componenti devono ricevere lo stesso flusso nello stesso momento, ad esempio quando Home Assistant reagisce a una zona mentre un registratore salva lo storico, oppure quando i membri della famiglia devono vedersi a vicenda.

MQTT è un protocollo di pubblicazione e sottoscrizione, mentre Mosquitto è il broker normalmente utilizzato. Rimane in ascolto sulla porta 1883 in testo non cifrato e sulla porta 8883 per TLS; devi usare soltanto 8883. Il controllo degli accessi viene applicato per topic, quindi a un account puoi consentire di pubblicare su owntracks/alice/phone senza permettergli di leggere altro. Questo è il motivo principale per usare MQTT in un contesto familiare: il broker stabilisce chi può vedere chi, a un livello inferiore rispetto all'applicazione, quindi un bug dell'applicazione non può ampliare l'accesso.

Il costo consiste nell'aggiungere un servizio con il proprio certificato, il proprio elenco di utenti e una propria modalità di errore. Quando un broker smette di accettare connessioni, il comportamento è identico a quello di un telefono senza segnale, e nessuno dei due fornisce ulteriori informazioni.

Quante righe di posizione produrrà un telefono?

I valori riportati di seguito sono calcoli aritmetici, non misurazioni. Presuppongono un intervallo di reporting fisso, una riga per ogni report e nessun altro dato.

ChartPosition rows per phone at a fixed reporting interval (arithmetic)
The data behind this chart
[
  {
    "label": "Every 30 seconds",
    "points_30d": "86,400",
    "points_365d": "1,051,200"
  },
  {
    "label": "Every 60 seconds",
    "points_30d": "43,200",
    "points_365d": "525,600"
  },
  {
    "label": "Every 5 minutes",
    "points_30d": "8,640",
    "points_365d": "105,120"
  },
  {
    "label": "Every 15 minutes",
    "points_30d": "2,880",
    "points_365d": "35,040"
  }
]

Un telefono che invia un report ogni minuto scrive 43,200 righe al mese e 525,600 righe all'anno. Portando l'intervallo a quindici minuti, il costo annuale scende a 35,040 righe. Le applicazioni reali sono meno regolari, perché inviano report sia quando rilevano uno spostamento sia in base al tempo e smettono di inviarli quando il telefono è fermo. Considerate quindi il primo valore come un limite massimo, non come una previsione.

Mezzo milione di righe all'anno è un volume ridotto per PostgreSQL. Il primo costo rilevante riguarda la visualizzazione: una mappa a cui viene chiesto di elaborare un anno di punti alla massima risoluzione rallenta il browser molto prima che il database ne risenta. Per questo queste applicazioni aggregano la cronologia in viaggi e luoghi. Misurate il numero reale sul vostro server invece di fidarvi di un valore riportato in un post di un blog:

SELECT pg_size_pretty(pg_total_relation_size('tc_positions'));

Questa è la tabella positions di Traccar in PostgreSQL. Dopo un mese di utilizzo normale, eseguite l'equivalente per il server che sceglierete, quindi moltiplicate il risultato per dodici. Nessuno di questi server elimina autonomamente i punti meno recenti. Conservano tutti i dati inviati finché non li rimuovete. Definite quindi una regola di conservazione quando la tabella è ancora piccola e verificate che il backup includa il database, non soltanto la configurazione, perché una cronologia delle posizioni non può essere ricostruita da altre informazioni.

Il consumo della batteria dipende dalle impostazioni del telefono, non dal server

Questa è una parte che il self-hosting non modifica. È il sistema operativo a decidere quando attivare il GPS, per quanto tempo un'app in background può essere eseguita e se continuerà a funzionare durante la notte. La gestione energetica di Android sospende in modo aggressivo le attività in background, mentre iOS invia variazioni significative della posizione invece di un flusso continuo. Il server non può intervenire su nessuno di questi aspetti. Di conseguenza, un intervallo di rilevamento più breve impostato nell'app è soltanto una richiesta, che il telefono gestisce secondo le proprie impostazioni.

Le impostazioni che puoi controllare si trovano sul telefono: concedi all'app il permesso di accedere alla posizione sempre, escludi l'app di tracciamento dall'ottimizzazione della batteria e adatta la modalità di rilevamento alla giornata. Lasciare la modalità di movimento attiva per tutta la settimana può scaricare completamente la batteria entro le quattro del pomeriggio.

Sul server, il sintomo è un gruppo di righe con timestamp precedenti. Traccar Client e OwnTracks memorizzano temporaneamente i punti quando sono offline e li inviano quando la connessione torna disponibile. Per questo l'orario di scrittura e quello della posizione rilevata sono diversi. Se la mappa traccia una linea retta attraverso una città, si tratta di un intervallo senza rilevamenti, non di una strada.

Lato server: TLS e un percorso di ingest autenticato

Il telefono deve poter risolvere un hostname e deve considerare attendibile il certificato. Un certificato autofirmato è il motivo più comune per cui una nuova installazione non riceve nulla: l'applicazione non completa l'handshake TLS e interrompe il tentativo. Il log del server resta vuoto perché la richiesta non è mai stata completata. Un log vuoto sembra indicare un problema del telefono, ma non è così.

Esistono due approcci corretti. Terminare TLS in nginx con un certificato reale, ovvero un certificato Let's Encrypt davanti a nginx, e lasciare aperta soltanto la porta 443. Oppure non esporre alcuna porta in ingresso e usare un Cloudflare Tunnel, in modo che sull'IP pubblico non resti nulla in ascolto. Questa soluzione è adatta a Dawarich e OwnTracks, perché il loro ingest usa il normale protocollo HTTP.

La soluzione con tunnel ha un limite. Il protocollo OsmAnd di Traccar usa HTTP, quindi un client sul telefono può passare attraverso un reverse proxy o un tunnel senza problemi. I protocolli binari usati dall'hardware GPS dedicato sono invece TCP puro sulle rispettive porte. Queste porte devono essere realmente aperte: nel firewall del VPS e nel firewall di rete separato del provider, che nella maggior parte degli host si trova in un pannello di controllo distinto.

Quando il servizio risponde, verifica il percorso con una richiesta invece di fare ipotesi basate sull'applicazione:

curl -si -u alice:secret -H 'Content-Type: application/json' \
  -d '{"_type":"location","lat":51.5,"lon":-0.12,"tst":1788480000}' \
  https://track.example.com/pub | head -1

Un endpoint funzionante risponde con uno stato 2xx. Un 401 indica che le credenziali sono errate, mentre il trasporto funziona. Un errore di curl prima di qualsiasi riga di stato indica un problema di DNS o TLS. Correggi il certificato prima di intervenire sull'applicazione.

Un endpoint di ingest senza autenticazione espone la tua posizione

Un URL di ingest senza autenticazione comunica la tua posizione a chiunque lo trovi, e prima o poi qualcuno lo trova.

  • Chiunque disponga dell'URL può scrivere punti nella cronologia. I punti falsi sono difficili da individuare e richiedono tempo per essere rimossi.
  • Un URL non è un secret. Si trova nelle impostazioni dell'app del telefono, nel log degli accessi del reverse proxy, nella cronologia del browser se lo hai mai testato in una scheda e in qualsiasi screenshot allegato a una richiesta di supporto.
  • Un endpoint che risponde a richieste GET non autenticate comunica la posizione più recente a un crawler che abbia indovinato il percorso.
  • Il nome host è pubblico in ogni caso. Un certificato appena emesso compare nei log di certificate transparency entro pochi minuti, quindi anche un indirizzo che non hai mai pubblicato può essere individuato.

Usa HTTP Basic su TLS per OwnTracks, la chiave API per Dawarich e il modello di account di Traccar con un identificatore univoco del dispositivo. Proteggi l'interfaccia di amministrazione con la stessa autenticazione usata per il percorso di ingest, perché è nell'interfaccia che l'intera cronologia è leggibile. Dopo la prima settimana, controlla chi ha continuato a inviare richieste:

sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

In questo elenco dovrebbero prevalere gli indirizzi IP mobili del tuo telefono. Qualsiasi altro indirizzo con un numero elevato di richieste merita un controllo; inoltre, applicare un rate limit alla posizione di ingest in nginx non ha costi.

Un tracker può anche smettere di funzionare senza segnalarlo. Il container si arresta, il telefono continua ad accumulare dati in buffer e te ne accorgi settimane dopo, quando manca un viaggio. Configura un health check del container o un'unità systemd OnFailure= che invii notifiche al tuo server ntfy, così l'assenza di notifiche raggiunge lo stesso telefono che invia i dati.

Chi altro può vedere la traccia e come viene applicato il controllo

Traccar applica il controllo degli accessi tramite utenti e autorizzazioni sui dispositivi: ogni account vede i dispositivi che un amministratore gli ha assegnato e l’API utilizza una sessione o un token. OwnTracks tramite MQTT applica il controllo nel broker con ACL sui topic. È la soluzione più robusta tra queste, perché un account che non può sottoscrivere un topic non può leggerlo, indipendentemente dal comportamento dell’applicazione. OwnTracks tramite HTTP non dispone di un livello equivalente. Tutto ciò che si trova dietro l’endpoint costituisce quindi l’intero meccanismo di controllo degli accessi. Dawarich è progettato perché una persona consulti la propria cronologia. Quando più persone devono seguire la posizione reciproca in tempo reale, Traccar o un broker sono soluzioni più adatte.

Il monitoraggio dei familiari è una questione di consenso oltre che tecnica. Tutti coloro il cui telefono pubblica dati devono sapere che lo fa e come interrompere la pubblicazione. Un tracker che una persona non può disattivare non è una funzionalità adatta a una famiglia.

Cosa non risolve il self-hosting

  • Il sistema operativo del telefono decide quando attivare il GPS. Il consumo della batteria e le interruzioni nella traccia dipendono quindi soprattutto dal telefono, non dal server.
  • Google ha modificato il modo in cui vengono esportati i dati di Timeline. Prima di pianificare una migrazione, consulta la documentazione aggiornata di importazione di Dawarich, perché il file che Google fornisce oggi non è quello che veniva importato due anni fa.
  • Il tuo endpoint vede l'indirizzo IP mobile a ogni richiesta, così come ogni rete intermedia. Il self-hosting modifica chi conserva questo registro, ma non lo elimina.
  • La cronologia delle posizioni è insostituibile. Esegui il backup del database, ripristinalo una volta per verificare che il backup funzioni e conserva la copia in forma crittografata, perché è il file più sensibile presente sul server.

FAQ

Quale applicazione self-hosted sostituisce Google Maps Timeline?

Dawarich. È progettata come alternativa self-hosted a Google Timeline, importa un'esportazione di Google Maps Timeline insieme a dati provenienti da OwnTracks, Strava, Immich, GPX e GeoJSON e dai metadati EXIF delle foto, quindi presenta la cronologia come luoghi e viaggi anziché come una mappa in tempo reale. Traccar può memorizzare gli stessi punti, ma la sua interfaccia è una console per flotte e i suoi report riguardano le flotte. Prima di pianificare la migrazione, consulta la documentazione di importazione di Dawarich per verificare il formato di esportazione richiesto, perché il formato di esportazione di Google è cambiato.

Posso usare OwnTracks senza un broker MQTT?

Sì. Imposta l'applicazione in modalità HTTP e assegnale un URL nel formato http[s]://[user[:password]@]host[:port]/path, che per OwnTracks Recorder corrisponde a /pub. Invia lo stesso payload JSON, autenticato con HTTP Basic, e OwnTracks raccomanda fortemente lo schema https://. Aggiungi un broker in un secondo momento, quando due servizi devono usare contemporaneamente lo stesso flusso oppure quando vuoi applicare il controllo degli accessi per topic, lasciando al broker la decisione su quali client possono vedere gli altri.

Quanto spazio di archiviazione richiede un anno di cronologia delle posizioni?

Pianifica in base al numero di righe, non ai gigabyte. Un report al minuto produce 525,600 righe all'anno per telefono, mentre un report ogni quindici minuti ne produce 35,040. Entrambi i volumi sono ridotti per PostgreSQL. Il limite pratico è il browser, che deve disegnare un anno di punti su una sola mappa; per questo queste applicazioni aggregano i dati. Dopo un mese misura la dimensione della tua tabella con pg_total_relation_size e moltiplica il risultato per dodici.

Perché la cronologia delle mie posizioni contiene dei vuoti?

Il sistema operativo del telefono decide quando attivare il GPS e quando arrestare un'applicazione in background, quindi la maggior parte dei vuoti inizia in questa fase. Concedi all'applicazione l'autorizzazione a usare la posizione in background sempre, escludila dall'ottimizzazione della batteria e controlla la modalità di rilevamento. In OwnTracks su iOS, la modalità Move pubblica una posizione ogni locatorDisplacement metri o locatorInterval secondi, con valori predefiniti di 100 metri e 300 secondi; su Android richiede una posizione ogni 10 secondi per impostazione predefinita. In entrambi i casi il consumo della batteria è paragonabile a quello di un'applicazione di navigazione. Se le righe arrivano in ritardo e in blocco con timestamp precedenti, significa che il buffer offline sta inviando i dati accumulati: le posizioni sono state rilevate, ma l'upload è stato ritardato.

Un URL segreto è sufficiente per proteggere un endpoint di rilevamento delle posizioni?

No. Un endpoint di ingestione senza autenticazione consente a chiunque scopra l'URL di inserire punti falsi nella cronologia, e un URL non è un segreto: si trova nelle impostazioni dell'applicazione, nel log degli accessi del reverse proxy, nella cronologia del browser e in ogni screenshot che condividi. Anche il nome host è individuabile autonomamente, perché un nuovo certificato compare nei log di certificate transparency poco dopo l'emissione. Usa HTTP Basic su TLS o una API key, applica il rate limiting al percorso di ingestione e mantieni l'interfaccia amministrativa protetta dalla stessa autenticazione.

#self-hosting#privacy#traccar#owntracks#dawarich#gps