OwnTracks auf Uberspace

Auf dem alten Server hatte ich eine OwnTracks-Instanz in Docker-Containern laufen, schlicht und einfach weil direkt Container dafür bereitgestellt werden. Da bei Uberspace keine Container angeboten werden und ich keine root-Rechte habe bleibt mir nichts anderes übrig als die Komponenten im Userspace einzurichten.

OwnTracks besteht aus drei Komponenten, dem Recorder, dem Frontend und (optional) einem MQTT-Broker.

mosquitto

Im OwnTracks Booklet wird mosquitto beschrieben. Und im Uberspace Lab gibt es eine Anleitung für mosquitto, es liegt also nahe das dafür zu nutzen.

Da ich die Verbindung zwischen Client und Server verschlüsselt nutzen möchte habe ich zuerst die Subdomain angelegt um eine SSL-Zertifikat zu bekommen.

mkdir -p /var/www/virtual/$USER/owntracks.example.com
uberspace web domain add owntracks.example.com

Jetzt noch den DNS-Eintrag anlegen, die Domain einmal aufrufen und schon ist das Zertifikat erzeugt.

Ich spare es mir jetzt die Anleitung von Uberspace nochmal abzutippen, nur noch ein paar Ergänzungen von mir:

Der Port den man in der Firewall zugewiesen bekommt ist nicht wählbar, man muss nehmen was man bekommt. Den Port muss man dann halt auch beim Client eintragen, das ist alles.

ot-recorder

Den ot-recorder zum Laufen zu bringen war am aufwendigsten. Hier blieb nur selbst kompilieren. Dafür habe ich mir eine Build-Umgebung in einem Docker-Container gebaut. Den kann ich zwar nicht auf dem Server ausführen, aber halt irgendwo anders. Die Umgebung gibt es hier in diesem Github-Repository.

Uberspace 7 basiert auf dem CentOS der gleichen Version, also habe ich das als Basis genommen, die Build-Utilities sowie die benötigten Libraries inklusive ihrer Entwicklungs-Header-Files installiert. Ein paar Einstellungen müssen leider zu compile time gemacht werden, da gibt es hinterher keine Variablen mehr mit denen man sie setzen kann. Daher kann ich auch keine fertig kompilierten Binaries anbieten, da wären dann Pfade zu meinem Homeverzeichnis hart reincodiert.

Am Ende bekomme ich zwei Binaries (ot-recorder und ocat). Die muss ich zusammen mit einer Library, die bei Uberspace nicht installiert ist, auf den Server kopieren.

Die Binaries habe ich nach ~/bin kopiert. Die PATH Variable habe ich entsprechend erweitert.

$ echo 'PATH=$HOME/.local/bin:$HOME/bin:$PATH' >> ~/.bash_profile

Die Library libconfig.so.9 habe ich nach ~/bin/lib kopiert. Damit sie gefunden wird muss die Variable LD_LIBRARY_PATH entsprechend erweitert werden:

$ echo 'LD_LIBRARY_PATH="$HOME/bin/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc

Damit liefen beide Binaries. Weiter ging es mit der Konfiguration nach der Anleitung:

$ vi ~/etc/default/ot-recorder
OTR_HOST="owntracks.example.com"
OTR_USER="recorder"
OTR_PASS="q7S38BMsB!u*phmERp%T"
OTR_PORT=43258
OTR_STORAGEDIR="/home/username/lib/ot-recorder"
OTR_HTTPPREFIX="https://owntracks.example.com/my-recorder/"
OTR_VIEWSDIR="/home/username/etc/ot-recorder/views"
OTR_CAFILE="/etc/ssl/certs/ca-bundle.crt"
$ mkdir -p $HOME/lib/ot-recorder

Dann noch den Ordner “views” aus dem Container kopieren. Jetzt muss nur er nur noch als Dienst beim supervisord eingetragen werden.

$ vi ~/etc/services.d/ot-recorder.ini
[program:ot-recorder]
command=ot-recorder 'owntracks/#'
autostart=yes
autorestart=unexpected
environment=LD_LIBRARY_PATH="/home/username/bin/lib:/lib64"
stdout_logfile=/home/username/logs/ot-recorder.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
stderr_logfile=/home/username/logs/ot-recorder_error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=3
startsecs=30
$ supervisorctl reread
$ supervisorctl update
$ supervisorctl status

Jetzt sollte der Recorder laufen. Bei Problem am Besten den Dienst stoppen und ot-recorder manuell starten, das mit dem stdout_logfile hat bei mir nur so mäßig funktioniert, wenn er im Vordergrund lief gab es mehr und hilfreichere Meldungen.

Den OTR_HTTPPORT kann man hier frei wählen, da gilt first come, first serve. Er muss nur frei sein. Man muss nur darauf achten dass man ihn auf 0.0.0.0 bindet (ist die Standardeinstellung), sonst funktioniert der Uberspace Reverse Proxy nicht.

Frontend

Das Frontend war so ziemlich das einfachste. Bei Uberspace war bereits alles nötige installiert um die manuelle Installation durchzuführen.

$ wget https://github.com/owntracks/frontend/archive/refs/tags/v2.12.0.zip # aktuelles Release holen
$ tar xfz v2.12.0.zip
$ cd frontend-2.12.0/
$ yarn install
$ yarn build
$ cp dist/* /var/www/virtual/$USER/owntracks.example.com/

Uberspace nutzt nginx Backends um einen Reverse-Proxy umzusetzen mit dem sich die Pfade /api/ und /ws/ direkt auf den ot-recorder umleiten lassen.

$ uberspace web backend set --http --port 8083 owntracks.example.com/api/
$ uberspace web backend set --http --port 8083 owntracks.example.com/ws/

Und das war es schon. Damit nicht Hinz und Kunz verfolgen können wo ich mich so herumtreibe habe ich den Ordner noch mit einer .htaccess-Datei und Basic Auth geschützt. Das greift dann aber nur beim Frontend selbst, die Verbindungen via backend gehen daran vorbei. Hier habe ich noch keine befriedigende Lösung gefunden. Zumindest kann man mittels OTR_HTTPPREFIX einen nicht allzu leicht zu erratenden URL-Pfad wählen. Ist dann zwar nur security by obscurity, aber besser als nichts.

Views

Im Nachhinein habe ich dann noch die Views im Recorder aktiviert. Views sind eine recht einfache Möglichkeit eine mehr oder weniger öffentliche Darstellung der gesammelten Positionsdaten für einen festen Zeitraum zu erstellen.

Hier eine View-Definition unserer Norwegenreise im Oktober 2022 in der Datei ~/etc/ot-recorder/views/norwegen2022.json:

{
"label": "Norwegen Oktober 2022",
"user": "gerald",
"device": "handy",
"page": "leafletmap.html",
"from": "2022-10-12",
"to": "2022-10-30"
}

Der Dateiname der .json-Datei ist dann Teil der URL, unter https://owntracks.example.com/view/norwegen2022 ist dann eine interaktive Karte erreichbar die in etwa so ausschaut:

Der Besucher hat dann nur Zugriff auf die Daten in dem definierten Zeitraum und für das definierte Gerät. Sehr feine Sache.

Dazu musste ich noch die folgenden Sachen einrichten:

  • Die Ordner docroot/static und docroot/utils aus dem Release-Archiv vom Recorder nach ~/lib/ot-recorder/htdocs entpacken
  • backend-Definitionen dafür erstellen
uberspace web backend set --http --port 8083 owntracks.example.com/utils
uberspace web backend set --http --port 8083 owntracks.example.com/static
uberspace web backend set --http --port 8083 owntracks.example.com/view

Das war es dann schon. .json-Dateien anlegen und fertig.

Veröffentlicht von

Gerald Schneider

Diplom-Informatiker (DH) in Rostock. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung.

Ein Gedanke zu „OwnTracks auf Uberspace“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert