Como selfhostear Owntracks Recorder?

{{own-tracks}} esta dividido en dos partes, por un lado el recorder o server y por otro lado la aplicación en el celu. La aplicación se encarga de registrar la ubicación y de informarla al recorder para que este la procese y la guarde.

La aplicación esta publicada en los stores, tanto para Android como para iOS.

El recorder por otro lado, podemos usarlo de varias formas, owntracks nos da una instancia PUBLICA con la que podemos probar que nuestra aplicación este funcionando o para ver como funciona, como bien dije esta instancia es pública, por ende todas las ubicaciones que mandemos ahí van a estar visibles para todos.

Otra forma es hostear nuestra propia instancia del recorder en nuestra propia infraestructura, puede ser nuestro {{homelab}} o una VPS privada. Esta sería la forma mas segura de usar la aplicación y el trackeo. Los datos van a quedar dentro de nuestra infraestructura y vamos a tener acceso solo nosotros.

Owntracks acepta dos formas de comunicación, una es utilizando el protocolo {{MQTT}} y otra es utilizando HTTP. En mi caso, como nunca tuve un fanatismo especial sobre MQTT, ademas de que lleva un poco mas de complejidad, elegí utilizar HTTP.

Acá dejo los pasos para correr el recorder en {{Docker}}, con Docker Compose y {{Caddy}} como proxy inverso.

Estructura de carpetas

La estructura de carpetas es muy simple. En mi caso utilizo la carpeta data/store para guardar todo lo relacionado a los datos / configuraciones de la aplicación.

owntracks/  
	├── data
		└── store  
	└── docker-compose.yml

Docker network

En mi caso todos mis servicios están dentro de una red llamada proxy_net en caso de querer seguir la misma idea, lo primero que tenemos que hacer es crear la red.

docker network create proxy_net

Esta red nos va a permitir que {{caddy}} tenga acceso a los servicios y que no tenga que andar publicando ningún puerto de cada servicio al host. A la red le podemos poner el nombre que queramos, en caso de elegir otro tenemos que actualizar el docker-compose.yml.

Crear archivo docker-compose.yml

El docker-compose.yml es fácil de entender. Lo importante es configurar la variable OTR_PORT en 0, de esta forma le estamos diciendo al recorder que no utilice MQTT. Así también como las variables OTR_HTTPHOST y OTR_HTTPORT que configuran el servidor para que reciba conexiones HTTP.

version: '3'
services:
  otrecorder:
    container_name: otrecorder
    image: owntracks/recorder
    volumes:
      - ./data/store:/store
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Argentina/Buenos_Aires
      - OTR_PORT=0 # disable MQTT server
      - OTR_HTTPHOST=0.0.0.0
      - OTR_HTTPPORT=8083
    
networks:
  default:
    name: proxy_net
    external: true

Una vez que guardamos el archivo, podemos ejecutar docker-compose up -d y levantar el servicio.

En caso de no querer utilizar Caddy o ningún proxy, deberíamos publicar el puerto al host y acceder mediante 0.0.0.0:8083 o localhost:8083 para publicar el puerto tenemos que agregar la siguiente configuración al servicio:

ports:
	- "8083:8083"

Editar archivo Caddyfile

Con el servicio ya corriendo, podemos agregar la configuración restante a {{Caddy}} para poder utilizar nuestro propio dominio. En mi caso utilizo la siguiente url para acceder https://follow.example.com para esto debemos actualizar el archivo Caddyfile con lo siguiente:

follow.example.com {
  encode gzip
  reverse_proxy otrecorder:8083
  basicauth * {
	  # create new password hashes with `caddy hash-password --plaintext yourpasswordhere`
      joe "$2cIxZvIRkcvSeRgrehAHITzlJFBclTXD6OqprgoV7K6DGrCuTpiPuQqXnFrsx"
  }
}

Lo importante acá es definir basicauth para acceder al dominio, esto es necesario por que Owntracks no tiene sistema de autenticación. Esto quiere decir que cualquier que conozca la url podría acceder y ver los datos que publicamos en el server.

Por otro lado, tal vez esta de mas decirlo, pero es importante que tengamos certificados en nuestra configuración de {{Caddy}} para poder utilizar https y agregarle una capa mas de seguridad.

Para verificar si todo esta funcionando bien, podemos entrar a la url que configuramos desde un navegador, nos va a pedir usuario y contraseña, los que definimos en la configuración.

Una vez que entramos vamos a ver una tabla con los distintos usuarios que están utilizando el recorder, es probable que no veamos nada si es la primera vez que lo configuramos. Hasta que la aplicación no publique ningún payload no vamos a ver nada.

Configurar app

El último paso sería configurar la app. Lo primero que tenemos que hacer es instalarla en nuestro celu, esta disponible tanto para iOS como para Android. Dependiendo el sistema operativo, la aplicación va a reportar mas datos al recorder, y también se van a poder hacer otras cosas como por ejemplo en iOS podemos usar iBeacons como triggers.

En Android, para configurar vamos a ir a Preferences -> Connection -> Mode y elegir HTTP. Luego vamos a ir a Identification y completar los datos que nos pide.

owntracks-app-configuration

owntracks-app-configuration (23.24KB)

El Device ID es el identificador que queremos usar para nuestro dispositivo. Por otro lado el Tracker ID es similar, serían dos iniciales que también queremos usar para identificarnos. Este se envía en el payload JSON que recibe el server.

Una vez que esta configurado, podemos ir al mapa y enviar un payload de prueba desde el botón de Report. Si vamos al Menú -> Status vamos a ver el estado del payload y en caso de que haya un error lo vamos a poder debugear.