Comparativa de apps de ubicación autoalojadas
Compare Traccar, OwnTracks, Dawarich y Home Assistant según su uso: historial, mapa en directo o presencia. Proteja el endpoint de ingesta.
Qué aplicación de seguimiento de ubicación autoalojada se adapta a su caso
El seguimiento de ubicación autoalojado se divide según una pregunta: ¿quiere conservar un historial para usted o consultar una posición en tiempo real junto con otras personas? Dawarich responde a la primera necesidad. Es una alternativa autoalojada a Google Maps Timeline e importa el historial que ya tiene. Traccar responde a la segunda. Se diseñó para hardware GPS y flotas, y trata el teléfono como un tracker más. OwnTracks se sitúa por debajo de ambas opciones como aplicación para el teléfono y formato de mensajes. Home Assistant ya conoce la ubicación del teléfono si lo ejecuta, pero elimina el recorrido después de diez días de forma predeterminada.
Elija según lo que quiera consultar el próximo mes:
- Un mapa de todos los lugares a los que fue el pasado marzo, con lugares y trayectos: Dawarich.
- Un mapa en tiempo real de varios dispositivos, con geofences y reglas de eventos: Traccar.
- Un teléfono que envíe su posición a algo que ya ejecuta: OwnTracks en modo HTTP.
- Automatizaciones de presencia y ausencia, sin interés por el historial: Home Assistant por sí solo.
Para informar mediante HTTP, el teléfono debe poder acceder a un endpoint HTTPS que controle, por lo que el lado del servidor tiene su propia sección más abajo. Si todavía está decidiendo qué más debe alojar en el equipo, la lista más amplia de lo que merece la pena autoalojar este año muestra dónde encaja un tracker junto al resto.
Traccar: hardware GPS, flotas y posición en tiempo real
Traccar es un servidor de seguimiento. Utiliza los protocolos de los rastreadores GPS dedicados, cada uno en su propio puerto, numerados del 5001 al 5267 en la lista actual de protocolos. Las instrucciones de Docker de Traccar publican todo el rango de 5000 a 5300 para TCP y UDP. Las mismas instrucciones advierten que cada puerto publicado inicia su propio proceso docker-proxy, lo que consume mucha memoria. Por eso, publicar sólo los puertos que usan los dispositivos o desactivar el proxy de espacio de usuario de Docker para que use NAT de iptables es la opción más ligera. Además, proporciona un mapa en tiempo real, geocercas, reglas de eventos e informes. La interfaz web escucha en el puerto 8082 de forma predeterminada.
Para teléfonos existe la aplicación Traccar Client para Android e iOS. Envía datos mediante el protocolo OsmAnd, que escucha en el puerto 5055 de forma predeterminada. Su configuración determina la duración de la batería y la cantidad de registros. Distance solicita una actualización cada N metros mientras el dispositivo está en movimiento. Interval establece informes basados en el tiempo cuando la distancia es 0, lo que sólo funciona en Android, o cuando la precisión está configurada como máxima. Angle activa una actualización cuando cambia el rumbo, expresado en grados, si la precisión está configurada como máxima. Stationary Heartbeat define lo que ocurre cuando el dispositivo no está en movimiento. La documentación de Traccar indica que no se garantiza el resultado exacto de ninguna de estas opciones, porque el teléfono es quien decide.
Traccar incluye una base de datos H2 integrada para que el instalador funcione sin configuración adicional, pero el proyecto no recomienda H2 para producción. Su documentación contempla MySQL, MariaDB y PostgreSQL como reemplazos, y recomienda TimescaleDB, una base de datos de series temporales basada en PostgreSQL, para despliegues grandes. Migre la base de datos antes de acumular historial, porque conservarlo más adelante requiere migrar los datos existentes a la base de datos de reemplazo.
Dónde encaja mal Traccar: es una consola para observar lo que ocurre ahora. Los informes son informes de flotas, trayectos, paradas y resúmenes. Por eso, un año de sus propios fines de semana se muestra como el resultado de una consulta y no como una línea temporal.
OwnTracks: aplicación móvil, Recorder y Frontend
OwnTracks ofrece una configuración clásica y mínima. La aplicación publica una pequeña carga JSON cada vez que determina que el dispositivo se ha movido. Puede publicar mediante MQTT (message queuing telemetry transport) o mediante HTTP sin más. En modo HTTP, el endpoint es una URL con el formato http[s]://[user[:password]@]host[:port]/path y se autentica mediante HTTP Basic. El proyecto recomienda encarecidamente el esquema https://. Con OwnTracks Recorder, la ruta es /pub.
El modo de monitorización es más importante que cualquier ajuste del servidor. Quiet sólo publica cuando se lo solicita. Manual añade la monitorización de regiones y una solicitud de ubicación de bajo consumo. Significant es el modo automático normal. En iOS, Move publica en cuanto el dispositivo ha recorrido locatorDisplacement metros o han transcurrido locatorInterval segundos, lo que ocurra primero, con valores predeterminados de 100 metros y 300 segundos. En Android, Move solicita una ubicación cada 10 segundos de forma predeterminada. OwnTracks documenta que el modo Move consume batería al nivel de una aplicación de navegación y recomienda usarlo durante un viaje o mientras el dispositivo se está cargando, no como ajuste diario.
OwnTracks Recorder almacena los datos recibidos y sirve un mapa pequeño. OwnTracks Frontend es una aplicación web independiente que añade una interfaz más completa, con un mapa de calor, filtrado por intervalo de fechas e historial representado mediante puntos o líneas. Muchas personas no instalan Recorder, porque la carga es idéntica tanto si la aplicación apunta a Recorder como a Dawarich o a Home Assistant. Por eso conviene empezar aquí: la aplicación es un productor estable y sencillo, y más adelante puede cambiar el consumidor.
Dawarich: una alternativa autohospedada a Google Maps Timeline
Dawarich usa AGPL-3.0 y se ejecuta mediante un archivo de Docker Compose. La instalación predeterminada actual consta de tres contenedores: la aplicación Rails, que ejecuta los trabajos en segundo plano de Sidekiq en su interior, PostgreSQL y Redis. La aplicación sirve el puerto 3000. Las fuentes de importación incluyen Google Maps Timeline, OwnTracks, Strava, Immich, archivos GPX y GeoJSON, y los datos EXIF de las fotografías. Esta lista de importación es lo que convierte el sistema en una línea temporal y no en un mapa en tiempo real, porque puede incorporar un historial anterior al servidor.
La ingesta usa un endpoint HTTP que incluye una API key de la página de la cuenta. OwnTracks envía datos a /api/v1/owntracks/points?api_key=... y Overland los envía a /api/v1/overland/batches?api_key=.... GPSLogger reutiliza el endpoint de OwnTracks.
Preste atención al recorrido de esa key. Se incluye en la cadena de consulta, y el formato de registro predeterminado de nginx escribe la línea de solicitud completa. Por tanto, la key queda almacenada en /var/log/nginx/access.log en texto claro con cada punto. Trate ese registro como un secreto, rote la key si envía registros a un sistema central y no pegue nunca una URL operativa en un hilo de soporte.
Para el propio archivo de Compose, los volúmenes y la política de reinicio, consulte la mecánica de contenedores para ejecutar Compose en un VPS. Esta página termina en la decisión.
Home Assistant: adecuado para presencia, incorrecto para el historial
Si ya ejecuta Home Assistant, ya dispone del seguimiento de dispositivos. La aplicación complementaria informa de la posición, y la integración OwnTracks proporciona una URL de webhook y una clave de cifrado que debe introducir en la aplicación. Con MQTT configurado, esa integración escucha mensajes MQTT en lugar de HTTP.
El límite es la retención. El recorder de Home Assistant tiene un valor predeterminado de purge_keep_days: 10, y la purga automática se ejecuta cada noche a las 04:12, hora local, para impedir que la base de datos crezca sin límite. Ese valor predeterminado es adecuado para una base de datos de automatización doméstica, pero no para un archivo de ubicaciones. Home Assistant responde a «¿hay alguien en casa?». Para responder a «¿dónde estaba el 14 de marzo?», conserve ese historial antes de que se elimine: aumente purge_keep_days, desactive auto_purge o envíe el mismo flujo a otro sistema que lo conserve. Conservar más historial aumenta el tamaño de la base de datos del recorder; si desactiva auto_purge, la documentación recomienda programar sus propias llamadas periódicas a recorder.purge.
¿Seguimiento continuo o compartición ocasional?
El seguimiento continuo significa que la aplicación publica durante todo el día, tanto si se desplaza como si no, y que el archivo que crea es el objetivo principal. La compartición ocasional significa que varias personas se siguen durante un viaje y que el archivo es un efecto secundario que nadie solicitó. El mismo software sirve para ambos casos, con configuraciones diferentes.
Para el seguimiento continuo, dé prioridad a los informes basados en desplazamiento en lugar de usar un temporizador corto, mantenga la base de datos en un almacenamiento del que realmente haga copias de seguridad y decida la retención el primer día, no cuando el disco se llene. Para la compartición ocasional, aumente la frecuencia de los informes sólo mientras sea necesario y devuelva después el teléfono a un modo de bajo consumo. OwnTracks ofrece este control en la aplicación, y Traccar Client hace lo mismo mediante sus campos de distancia e intervalo.
Si quiere un enlace de compartición válido durante dos horas para un solo viaje, consulte las notas de la versión del servidor que elija antes de comprometerse. Traccar proporciona enlaces temporales para compartir dispositivos, y Dawarich proporciona enlaces para compartir la ubicación en tiempo real, con una frase de contraseña opcional, una fecha de caducidad y revocación inmediata.
¿Necesita realmente un broker MQTT?
Empiece sin uno. El modo HTTP requiere una URL, una contraseña y TLS (seguridad de la capa de transporte), y todos los servidores mencionados aceptan este modo. Un broker está justificado cuando más de un componente necesita el mismo flujo al mismo tiempo. Por ejemplo, Home Assistant puede reaccionar ante una zona mientras un grabador conserva el historial, o los miembros de la familia pueden verse entre sí.
MQTT es un protocolo de publicación y suscripción, y Mosquitto es el broker habitual. Su listener predeterminado usa el puerto 1883 sin cifrado. Configure un listener TLS en 8883 y exponga sólo ese listener. El control de acceso se aplica por tema, por lo que puede permitir que una cuenta publique en owntracks/alice/phone y no pueda leer nada más. Ese es el argumento principal para usar MQTT en una configuración familiar: el broker aplica quién puede ver a quién por debajo de la aplicación, de modo que un error de la aplicación no puede ampliar ese acceso.
El coste es añadir otro servicio, con su propio certificado, su propia lista de usuarios y su propio modo de fallo. Cuando un broker deja de aceptar conexiones, el resultado es igual que el de un teléfono sin señal, y ninguno de los dos le indica la causa.
¿Cuántas filas de posiciones generará un teléfono?
Las cifras siguientes son cálculos, no mediciones. Suponen un intervalo de informe fijo, una fila por informe y ningún otro dato.
Los datos de este gráfico
[
{
"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 teléfono que informa una vez por minuto escribe 43,200 filas al mes y 525,600 filas al año. Si se amplía el intervalo a quince minutos, el año cuesta 35,040 filas. Las aplicaciones reales son menos uniformes, porque informan tanto cuando hay desplazamiento como según el tiempo transcurrido y dejan de informar cuando el teléfono está inmóvil. Por eso, interprete estas cifras como ejemplos con intervalo fijo, no como una previsión.
Medio millón de filas al año es poco para PostgreSQL. El primer coste importante aparece al dibujarlas: un mapa que intenta representar un año de puntos con resolución completa bloquea el navegador mucho antes de que la base de datos lo note. Por eso estas aplicaciones agregan el historial en trayectos y lugares. Mida el número real en su propio equipo en lugar de confiar en una cifra de una entrada de blog:
SELECT pg_size_pretty(pg_total_relation_size('tc_positions'));Esa es la tabla de posiciones de Traccar en PostgreSQL. Ejecute el equivalente para el servidor que elija después de un mes de uso normal y multiplique el resultado por doce. Home Assistant elimina automáticamente el historial antiguo de forma predeterminada. Defina una política de retención mientras la tabla aún sea pequeña y asegúrese de que la copia de seguridad incluya la base de datos, no sólo la configuración, porque el historial de ubicaciones no se puede reconstruir a partir de ningún otro elemento.
El consumo de batería depende del teléfono, no del servidor
Esta parte no cambia al usar self-hosting. El sistema operativo decide cuándo se activa el GPS, cuánto tiempo puede ejecutarse una aplicación en segundo plano y si sigue funcionando durante la noche. Android suspende de forma agresiva las tareas en segundo plano, e iOS envía cambios de ubicación importantes en lugar de un flujo continuo. El servidor no puede intervenir en nada de esto. Por tanto, un intervalo de informe más corto en la aplicación es sólo una solicitud, y el teléfono la gestiona según sus propios criterios.
Lo que puede controlar está en el teléfono: conceda permiso de ubicación en segundo plano para todo el tiempo, excluya la aplicación de seguimiento de la optimización de batería y adapte el modo de informe a la actividad del día. Mantener el modo de movimiento toda la semana es una forma segura de que el teléfono se quede sin batería a las cuatro de la tarde.
En el servidor, el síntoma es una ráfaga de filas con marcas de tiempo antiguas. OwnTracks y Traccar Client, cuando tienen activado el almacenamiento en búfer sin conexión, conservan los puntos mientras no hay conexión y los envían cuando la red vuelve. Por eso, la hora de escritura y la hora de obtención de la posición son valores distintos. Si el mapa dibuja una línea recta a través de una ciudad, se trata de un intervalo sin posiciones registradas, no de una carretera.
El servidor: TLS y una ruta de ingesta autenticada
El teléfono necesita un nombre de host que pueda resolver y un certificado de confianza. Un certificado autofirmado es la causa más habitual de que una instalación nueva no reciba nada: la aplicación no completa el handshake TLS y abandona, mientras el registro del servidor permanece vacío porque la petición nunca se completó. Un registro vacío parece un problema del teléfono, pero no lo es.
Hay dos opciones claras. Terminar TLS en nginx con un certificado válido, es decir, un certificado de Let's Encrypt delante de nginx, y abrir los puertos 80 y 443. El puerto 80 debe seguir siendo accesible porque el plugin nginx de certbot demuestra el dominio mediante el desafío HTTP-01, que Let's Encrypt sólo ejecuta en el puerto 80; por tanto, rediríjalo a HTTPS en lugar de cerrarlo. Sólo el uso del desafío DNS-01 o TLS-ALPN-01 permite funcionar únicamente con 443. La otra opción es no exponer ningún puerto entrante mediante un Cloudflare Tunnel para que no haya ningún proceso escuchando en la IP pública, lo que resulta adecuado para Dawarich y OwnTracks porque su ingesta usa HTTP normal.
Hay un límite en la opción del túnel. El protocolo OsmAnd de Traccar usa HTTP, por lo que un cliente de teléfono atraviesa un reverse proxy o un túnel sin problemas. Los protocolos binarios que utiliza el hardware GPS dedicado son TCP o UDP sin formato en sus propios puertos. Estos necesitan un puerto realmente abierto, tanto en el firewall del VPS como en el firewall de red independiente del proveedor, que en la mayoría de los hosts se administra desde otro panel.
Cuando responda, compruebe la ruta con una petición en lugar de deducirla a partir de la aplicación:
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 operativo responde con un estado 2xx. Un 401 significa que el servidor rechazó las credenciales o nunca las recibió, y que el transporte funciona correctamente. Si curl devuelve un error antes de cualquier línea de estado, revise el mensaje de error: un problema de DNS, una conexión rechazada, un tiempo de espera y un fallo de TLS son problemas distintos. Corrija el problema indicado antes de modificar la aplicación.
Un endpoint de ingesta abierto revela tu ubicación
Una URL de ingesta sin autenticación entrega tu ubicación a cualquiera que la encuentre, y sí hay quien encuentra estas URL.
- Cualquiera que tenga la URL puede escribir puntos en tu historial. Los puntos falsos son difíciles de detectar y tediosos de eliminar.
- Una URL no es un secreto. Está en la configuración de la aplicación del teléfono, en el registro de acceso del proxy inverso, en el historial del navegador si alguna vez la probaste en una pestaña y en cualquier captura de pantalla que adjuntes al pedir ayuda.
- Una API de lectura sin protección, como
/api/0/lastde OwnTracks Recorder, entrega tu última ubicación a cualquiera que consulte la API. - El nombre de host es público hagas lo que hagas. Un certificado recién emitido aparece en los registros de transparencia de certificados en cuestión de minutos, por lo que una dirección que nunca publicaste sigue siendo detectable.
Usa HTTP Basic sobre TLS para OwnTracks, la clave de API para Dawarich y el modelo de cuentas de Traccar con un identificador de dispositivo único. Coloca la interfaz de administración detrás de la misma autenticación que la ruta de ingesta, porque en la interfaz se puede leer todo el historial. Después, revisa quién ha estado intentando acceder durante la primera semana:
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20Las direcciones IP móviles de tu teléfono deberían dominar esa lista. Conviene revisar cualquier otra dirección con un recuento alto, y aplicar un límite de tasa en la ubicación de ingesta de nginx no cuesta nada.
Un tracker también puede fallar sin avisar. El contenedor se detiene, el teléfono sigue almacenando datos en búfer y te enteras semanas después, cuando falta un trayecto. Configura una comprobación de estado del contenedor o un OnFailure= de systemd que apunte a tu propio servidor ntfy, para que el silencio te llegue al mismo teléfono que está enviando los datos.
Quién más puede ver el rastro y cómo se aplica ese control
Traccar aplica el control de acceso mediante usuarios y permisos de dispositivos: una cuenta ve los dispositivos que un administrador le ha asignado, y la API usa una sesión o un token. OwnTracks mediante MQTT lo aplica en el broker con ACL de topics. Es la opción más sólida porque una cuenta que no puede suscribirse a un topic no puede leerlo, independientemente de lo que haga cualquier aplicación. OwnTracks mediante HTTP no tiene una capa equivalente, por lo que todo lo que haya detrás del endpoint constituye el control de acceso. Dawarich también admite compartir la ubicación en tiempo real con la familia, y cada miembro controla su propio uso compartido.
El seguimiento familiar también plantea una cuestión de consentimiento, además de una cuestión técnica. Todas las personas cuyo teléfono publique datos deben saber que los publica y cómo detenerlo. Un tracker que una persona no puede desactivar no es una función familiar.
Qué no resuelve el autoalojamiento
- El sistema operativo del teléfono decide cuándo se activa el GPS, por lo que el consumo de batería y los intervalos sin datos en el recorrido se deben principalmente al teléfono, no al servidor.
- Google ha cambiado la forma de exportar los datos de Timeline. Consulte la documentación actual de importación de Dawarich antes de planificar una migración, porque el archivo que Google entrega hoy no es el mismo que se importaba hace dos años.
- Su endpoint ve la dirección IP móvil en cada solicitud, y también la ve cada red intermedia. El autoalojamiento cambia quién conserva ese registro. No elimina el registro.
- Un historial de ubicaciones es irremplazable. Haga una copia de seguridad de la base de datos, restáurela una vez para comprobar que la copia funciona y mantenga la copia cifrada, porque es el archivo más sensible del servidor.
FAQ
¿Qué aplicación autoalojada sustituye a Google Maps Timeline?
Dawarich. Está diseñada como una alternativa autoalojable a Google Timeline. Importa una exportación de Google Maps Timeline, además de datos de OwnTracks, Strava, Immich, GPX y GeoJSON, y metadatos EXIF de fotos. Presenta el historial como lugares y viajes, no como un mapa en tiempo real. Traccar puede almacenar los mismos puntos, pero su interfaz es una consola de flota y sus informes están orientados a flotas. Consulte la documentación de importación de Dawarich para conocer el formato de exportación que espera antes de planificar la migración, porque el formato de exportación de Google ha cambiado.
¿Puedo usar OwnTracks sin un broker MQTT?
Sí. Configure la aplicación en modo HTTP y asígnele una URL con el formato http[s]://[user[:password]@]host[:port]/path, que corresponde a /pub para OwnTracks Recorder. Envía el mismo payload JSON, autenticado mediante HTTP Basic, y OwnTracks recomienda encarecidamente el esquema https://. Añada un broker más adelante, cuando dos servicios necesiten el mismo flujo al mismo tiempo o cuando quiera controlar el acceso por tópico para que el broker decida quién puede ver a quién.
¿Cuánto almacenamiento necesita un año de historial de ubicaciones?
Planifíquelo en filas, no en gigabytes. Un informe por minuto genera 525,600 filas al año por teléfono, y uno cada quince minutos genera 35,040. Cualquiera de las dos cantidades es pequeña para PostgreSQL. El límite práctico aparece cuando el navegador intenta dibujar un año de puntos en un solo mapa. Por eso estas aplicaciones agregan los datos. Mida su propia tabla después de un mes con pg_total_relation_size y multiplique el resultado por doce.
¿Por qué hay intervalos sin datos en mi historial de ubicaciones?
El sistema operativo del teléfono decide cuándo activar el GPS y cuándo detener una aplicación en segundo plano. Por eso la mayoría de los intervalos sin datos se originan ahí. Conceda a la aplicación permiso de ubicación en segundo plano durante todo el tiempo, exclúyala de la optimización de batería y compruebe el modo de informes. En OwnTracks para iOS, el modo Move publica cada locatorDisplacement metros o locatorInterval segundos. Los valores predeterminados son 100 metros y 300 segundos. En Android, solicita una posición cada 10 segundos de forma predeterminada. En ambos casos, el consumo de batería es similar al de una aplicación de navegación. Si las filas llegan tarde en una ráfaga y contienen marcas de tiempo antiguas, significa que se está vaciando el búfer sin conexión. Las posiciones se obtuvieron correctamente y sólo se retrasó la carga.
¿Basta una URL secreta para proteger un endpoint de ubicaciones?
No. Un endpoint de ingestión sin autenticación permite que cualquiera que conozca la URL escriba puntos falsos en su historial. Además, una URL no es un secreto: aparece en la configuración de la aplicación, en el registro de acceso del reverse proxy, en el historial del navegador y en cualquier captura de pantalla que comparta. El nombre de host se puede descubrir por sí solo, porque un certificado nuevo aparece en los registros de transparencia de certificados poco después de su emisión. Use HTTP Basic sobre TLS o una API key, aplique límites de tasa a la ruta de ingestión y mantenga la interfaz de administración protegida por la misma autenticación.