Traccar, OwnTracks o Dawarich: quale scegliere
Confronta Traccar, OwnTracks, Dawarich e Home Assistant: storico personale, posizione in tempo reale o automazioni. Proteggi l'endpoint ingest dalla rete pubblica.
Quale applicazione di tracciamento della posizione self-hosted è adatta al tuo caso
Il tracciamento della posizione self-hosted si basa su una distinzione: vuoi conservare uno storico personale oppure osservare una posizione in tempo reale insieme ad altre persone? Dawarich risponde alla prima esigenza. È un'alternativa self-hosted alla Cronologia di Google Maps e importa lo storico già disponibile. Traccar risponde alla seconda. È stato progettato per l'hardware GPS e per le flotte, e tratta il telefono come un tracker aggiuntivo. OwnTracks è il componente sottostante per entrambi, come applicazione per il telefono e formato dei messaggi. Home Assistant conosce già la posizione del telefono se lo esegui, ma per impostazione predefinita elimina lo storico dopo dieci giorni.
Scegli in base a ciò che vuoi consultare il mese prossimo:
- Una mappa di tutti i luoghi visitati lo scorso marzo, con luoghi e viaggi: 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 già in esecuzione: OwnTracks in modalità HTTP.
- Automazioni casa/assente, senza interesse per lo storico: Home Assistant da solo.
Nessuna soluzione funziona finché il telefono non riesce a raggiungere un endpoint HTTPS sotto il tuo controllo, quindi la configurazione lato server ha una sezione dedicata più avanti. Se stai ancora valutando cos'altro installare sul server, l'elenco più ampio di ciò che vale la pena eseguire in self-hosting quest'anno mostra come si colloca un tracker rispetto agli altri servizi.
Traccar: hardware GPS, flotte e posizione in tempo reale
Traccar è un server di tracking. Supporta i protocolli usati dai tracker GPS dedicati, ciascuno in ascolto sulla propria porta TCP e UDP nell'intervallo da 5000 a 5150, e aggiunge una mappa in tempo reale, geofence, regole per gli eventi e report. L'interfaccia web è in ascolto sulla porta 8082 per impostazione predefinita.
Per gli smartphone è disponibile l'app Traccar Client per Android e iOS. Invia i dati tramite il protocollo OsmAnd, in ascolto sulla porta 5055 per impostazione predefinita. Le relative impostazioni determinano il consumo della batteria e il numero di righe nei dati. 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 in nessuno di questi casi, perché è lo smartphone a decidere.
Traccar include un database H2 integrato, quindi l'installer funziona senza configurazione aggiuntiva. Il progetto non raccomanda H2 per la produzione. Per i server più piccoli indica MySQL o MariaDB; per quelli più grandi indica PostgreSQL, eventualmente con TimescaleDB. Spostate il database prima di accumulare lo storico, perché la conversione successiva di un file H2 è un'operazione manuale e non esiste uno strumento supportato.
Traccar è poco adatto quando serve: è una console per osservare gli oggetti in tempo reale. I report riguardano flotte, viaggi, soste e riepiloghi. Un anno dei vostri spostamenti personali del fine settimana viene quindi presentato come il risultato di una query, non come una cronologia.
OwnTracks: un’app per telefono e un endpoint, niente altro
OwnTracks è la configurazione classica più semplice. L’app pubblica un piccolo payload JSON ogni volta che rileva che il dispositivo si è spostato. Può pubblicarlo tramite MQTT (message queuing telemetry transport) oppure tramite HTTP semplice. In modalità HTTP, l’endpoint è un URL nella forma http[s]://[user[:password]@]host[:port]/path, autenticato con HTTP Basic. Il progetto raccomanda fortemente lo schema https://. Con OwnTracks Recorder, il percorso è /pub.
La modalità di monitoraggio è più importante di qualsiasi impostazione del server. Quiet pubblica solo quando lo richiedi. Manual aggiunge il monitoraggio delle regioni e una richiesta di localizzazione a basso consumo. Significant è la normale modalità automatica. Move pubblica non appena il dispositivo ha percorso locatorDisplacement metri oppure sono trascorsi locatorInterval secondi, a seconda di quale evento si verifica per primo, con valori predefiniti di 100 metri e 300 secondi. La documentazione di OwnTracks indica che la modalità Move consuma batteria quanto un’app di navigazione e la consiglia durante un viaggio o mentre il dispositivo è in carica, non come impostazione quotidiana.
OwnTracks Recorder archivia i dati ricevuti e mette a disposizione una piccola mappa. Molte persone non lo installano mai, perché il payload è identico sia quando l’app punta a Recorder, sia quando punta a Dawarich o a Home Assistant. Per questo conviene iniziare da qui: l’app è un produttore stabile e prevedibile, e in seguito puoi cambiare consumer.
Dawarich: una timeline di Google Maps in self-hosting
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 fonti per l'importazione includono Google Maps Timeline, OwnTracks, Strava, Immich, file GPX e GeoJSON, oltre ai dati EXIF delle foto. Questo elenco di fonti lo rende una timeline, non una mappa in tempo reale, perché consente di importare anche la cronologia precedente al 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 logging predefinito di nginx registra l'intera riga della richiesta. Di conseguenza, la chiave viene scritta in /var/log/nginx/access.log in testo non cifrato 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 allo storico
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 riceve i messaggi MQTT invece di usare HTTP.
Il limite è la conservazione dei dati. Il recorder di Home Assistant usa per impostazione predefinita purge_keep_days: 10 e il purge automatico viene eseguito ogni notte alle 04:12 ora locale, per impedire una crescita illimitata del database. Questa impostazione è corretta per un database di automazione domestica, 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?» se non invii lo stesso flusso a un sistema che lo conserva.
Tracciamento continuo o condivisione occasionale?
Il tracciamento continuo significa che l’app pubblica dati per tutto il giorno, 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 che nessuno aveva richiesto. Lo stesso software supporta entrambi gli scenari, con impostazioni diverse.
Per il tracciamento continuo, preferite gli aggiornamenti basati sulla distanza rispetto a un timer breve, mantenete il database su uno storage di cui eseguite effettivamente il backup e definite la conservazione il primo giorno, non quando il disco si riempie. Per la condivisione occasionale, aumentate la frequenza degli aggiornamenti solo quando serve e riportate il telefono in modalità a basso consumo al termine. OwnTracks offre questo controllo nell’app, mentre Traccar Client permette di ottenere lo stesso risultato tramite i campi relativi a distanza e intervallo.
Se vi serve un link di condivisione valido per due ore per un singolo viaggio, controllate le note di rilascio del server scelto prima di impegnarvi. Questa è la funzionalità che cambia maggiormente tra le versioni ed è l’area più debole di tutte le opzioni qui esaminate.
Ti serve davvero un broker MQTT?
Inizia senza. La modalità HTTP richiede un URL, una password e TLS (sicurezza del livello di trasporto), e tutti i server indicati sopra la supportano. Un broker è utile quando più componenti devono accedere allo 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 più usato. Resta in ascolto sulla porta 1883 in chiaro e sulla porta 8883 per TLS; devi usare soltanto 8883. Il controllo degli accessi viene applicato per topic, quindi puoi autorizzare un account a pubblicare su owntracks/alice/phone senza consentirgli di leggere altro. Questo è il motivo principale per usare MQTT in un contesto familiare: il broker applica le regole su chi può vedere chi, a un livello sottostante rispetto all'applicazione, quindi un bug dell'applicazione non può estendere questi accessi.
Il costo è un servizio aggiuntivo, 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 informazioni utili.
Quante righe di posizione produrrà un telefono?
Le cifre riportate di seguito sono calcoli aritmetici, non misurazioni. Presuppongono un intervallo di rilevamento fisso, una riga per ogni rilevamento e nessun altro dato.
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 una posizione ogni minuto scrive 43,200 righe al mese e 525,600 righe all'anno. Impostando l'intervallo su quindici minuti, il totale annuo scende a 35,040 righe. Le applicazioni reali sono meno lineari, perché inviano dati anche quando rilevano uno spostamento e smettono di farlo quando il telefono è fermo. Considerate quindi la prima riga come un limite massimo, non come una previsione.
Mezzo milione di righe all'anno è un volume ridotto per PostgreSQL. Il primo limite si incontra nella visualizzazione: una mappa che deve rappresentare un anno di punti alla massima risoluzione rallenta il browser molto prima che il database rilevi un problema. Per questo queste applicazioni aggregano la cronologia in tragitti e luoghi. Misurate il numero effettivo sul vostro server invece di affidarvi a una cifra riportata in un articolo:
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 il comando equivalente per il server che avete scelto, quindi moltiplicate il risultato per dodici. Nessuno di questi server elimina automaticamente 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: una cronologia delle posizioni non può essere ricostruita da altre fonti.
Il consumo della batteria dipende dal 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 possa essere eseguita e se possa restare attiva durante la notte. La gestione energetica di Android sospende in modo aggressivo le attività in background, mentre iOS fornisce variazioni significative della posizione invece di un flusso continuo. Il server non può intervenire su nessuno di questi aspetti. Nell'app, quindi, un intervallo di rilevamento più breve è solo una richiesta, che il telefono gestisce secondo le proprie regole.
Le impostazioni che puoi controllare si trovano sul telefono: concedi all'app il permesso di accedere alla posizione sempre, escludi l'app di tracking dall'ottimizzazione della batteria e adatta la modalità di rilevamento alla giornata. Lasciare la modalità di movimento attiva per tutta la settimana è il modo più rapido per ritrovarti con il telefono scarico alle quattro del pomeriggio.
Sul server, il sintomo è un gruppo di righe con timestamp precedenti. Sia Traccar Client sia OwnTracks memorizzano i punti quando sono offline e li inviano quando la rete torna disponibile. Di conseguenza, l'orario di scrittura e quello della posizione rilevata sono valori diversi. Quando la mappa traccia una linea retta attraverso una città, si tratta di un intervallo senza rilevamenti, non di una strada.
Lato server: TLS e 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, mentre il log del server resta vuoto perché la richiesta non è mai stata completata. Un log vuoto può sembrare un problema del telefono, ma non lo è.
Esistono due approcci corretti. Terminare TLS in nginx con un certificato valido, cioè un certificato Let's Encrypt davanti a nginx, e aprire soltanto la porta 443. Oppure non esporre alcuna porta in ingresso, usando un Cloudflare Tunnel, così non resta nulla in ascolto sull'IP pubblico, soluzione adatta a Dawarich e OwnTracks perché il loro ingest usa HTTP standard.
Esiste un limite per la soluzione con tunnel. Il protocollo OsmAnd di Traccar usa HTTP, quindi il client del telefono attraversa senza problemi un reverse proxy o un tunnel. I protocolli binari usati dall'hardware GPS dedicato sono invece TCP puro su porte proprie. Queste porte devono essere realmente aperte, sia nel firewall del VPS sia nel firewall di rete separato del provider, che nella maggior parte degli host si gestisce da un pannello di controllo diverso.
Quando il servizio risponde, verifica il percorso con una richiesta invece di dedurre il problema dall'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 -1Un endpoint funzionante risponde con uno stato 2xx. Un 401 indica che le credenziali sono errate e che 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 esposto compromette la riservatezza della 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 rilevare e richiedono tempo per essere rimossi.
- Un URL non è un secret. Si trova nelle impostazioni dell'app sul 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 restituisce la posizione più recente a un crawler che abbia individuato il percorso.
- Il nome host è pubblico in ogni caso. Un certificato appena emesso compare nei log di certificate transparency entro pochi minuti. Di conseguenza, anche un indirizzo che non hai mai pubblicato può essere individuato.
Per OwnTracks usa HTTP Basic su TLS, per Dawarich usa l'API key e per Traccar usa il modello di account con un identificatore univoco del dispositivo. Proteggi l'interfaccia di amministrazione con la stessa autenticazione usata per il percorso di ingest, perché l'interfaccia consente di leggere l'intera cronologia. Dopo la prima settimana, controlla chi ha effettuato richieste:
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20L'elenco dovrebbe essere dominato dagli indirizzi IP mobili del tuo telefono. Qualsiasi altra origine con un numero elevato di richieste merita un controllo. Inoltre, applicare un rate limit alla posizione di ingest in nginx non comporta costi.
Anche un tracker può smettere di funzionare senza segnalarlo. Il container si arresta, il telefono continua a memorizzare i dati in buffer e te ne accorgi dopo settimane, quando manca un viaggio. Configura un health check del container o un'unità systemd OnFailure= che invii notifiche al tuo server ntfy, in modo che l'assenza di dati ti venga segnalata sullo stesso telefono che li sta raccogliendo.
Chi altro può vedere la cronologia 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 usa una sessione o un token. OwnTracks tramite MQTT applica il controllo nel broker con ACL sui topic. È la soluzione più solida tra quelle descritte, perché un account che non può sottoscrivere un topic non può leggerne i dati, indipendentemente da ciò che fa l'applicazione. OwnTracks tramite HTTP non dispone di un livello equivalente. Di conseguenza, tutto ciò che si trova dietro l'endpoint costituisce l'intero meccanismo di controllo degli accessi. Dawarich è progettato per consentire a una persona di consultare la propria cronologia. Quando più persone devono monitorarsi a vicenda in tempo reale, Traccar o un broker sono soluzioni più adatte.
Il monitoraggio dei familiari è una questione di consenso oltre che tecnica. Chiunque utilizzi un telefono che pubblica dati deve 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 la modalità di esportazione dei dati di Timeline. Prima di pianificare una migrazione, consulta la documentazione aggiornata di importazione di Dawarich, perché il file fornito oggi da Google non è quello che veniva importato due anni fa.
- Il tuo endpoint vede l'indirizzo IP del dispositivo mobile a ogni richiesta, così come ogni rete intermedia. Il self-hosting cambia chi conserva questo dato. Non elimina il dato.
- La cronologia delle posizioni non è sostituibile. Esegui il backup del database, ripristinalo una volta per verificare che il backup funzioni e conserva la copia cifrata, perché è il file più sensibile del server.
FAQ
Quale applicazione self-hosted sostituisce Google Maps Timeline?
Dawarich. È un'alternativa a Google Timeline che puoi eseguire sul tuo server. Importa un'esportazione di Google Maps Timeline insieme ai dati di OwnTracks, Strava, Immich, GPX e GeoJSON e ai dati EXIF delle foto. Presenta la cronologia come luoghi e viaggi, non 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, ovvero /pub per OwnTracks Recorder. Invia lo stesso payload JSON, autenticato con HTTP Basic, e OwnTracks raccomanda espressamente lo schema https://. Puoi aggiungere un broker in seguito, quando due servizi devono usare contemporaneamente lo stesso flusso oppure quando vuoi un controllo degli accessi per topic, in modo che sia il broker a decidere quali client possono vedere ciascun flusso.
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 produce 35,040 righe. Entrambi i volumi sono ridotti per PostgreSQL. Il limite pratico è la visualizzazione nel browser di un anno di punti su un'unica mappa; per questo queste applicazioni aggregano i dati. Dopo un mese, misura la tua tabella con pg_total_relation_size e moltiplica il risultato per dodici.
Perché nella cronologia delle posizioni ci sono delle lacune?
Il sistema operativo del telefono decide quando riattivare il GPS e quando arrestare un'applicazione in background, quindi la maggior parte delle lacune nasce in questa fase. Concedi all'applicazione l'autorizzazione alla posizione in background per tutto il tempo, escludila dall'ottimizzazione della batteria e controlla la modalità di rilevamento. In OwnTracks, la modalità Move pubblica la posizione ogni locatorDisplacement metri o locatorInterval secondi, con valori predefiniti di 100 metri e 300 secondi, e consuma batteria quanto un'applicazione di navigazione. Se le righe arrivano in ritardo e a raffiche, con timestamp precedenti, significa che il buffer offline sta inviando i dati accumulati. Le posizioni sono state quindi rilevate correttamente, ma il loro caricamento è stato ritardato.
Un URL segreto è sufficiente per proteggere un endpoint di localizzazione?
No. Un endpoint di ingestione senza autenticazione consente a chiunque scopra l'URL di inserire punti falsi nella cronologia. Inoltre, un URL non è un segreto: viene memorizzato 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 può essere scoperto autonomamente, perché un nuovo certificato compare nei log di trasparenza dei certificati poco dopo l'emissione. Usa HTTP Basic su TLS o una chiave API, applica il rate limiting al percorso di ingestione e mantieni l'interfaccia di amministrazione protetta dalla stessa autenticazione.