Zum Inhalt springen

Fittrackee Installation - Meine Schritte

Ich wandere und laufe gerne und möchte meine Routen mit anderen teilen und sie für mich aufzeichnen. Ich möchte meine Daten selbständig verwalten. Ich nutze teilweise die bekannten Online-Fitness-Tracker. Dabei gefällt es mir, dass ich meine Aktivitäten mit anderen teilen kann. Es gefällt mir nicht, dass die Daten nicht in meiner Hand liegen. Außerdem kann ich bei den meisten Anbietern zwar festlegen, wer was sehen darf. Damit bin ich aber nicht ganz glücklich, weil ich selbst keinen Zugang zum Quellcode der Systeme habe.

Eine Open Source Anwendung, die

  • von mir selbst installiert werden kann
  • die die Möglichkeit der gemeinsamen Nutzung bietet und
  • idealerweise das ActivityPub-Protokoll unterstützt unterstützt, schien mir schon lange die ideale Lösung zu sein.

So war ich froh, als ich Fittrackee gefunden habe. Die lokale Installation funktionierte reibungslos. Wer nur seine Daten in einer schön aufbereiteten Form tracken möchte, dem reicht es unter Umständen, seine GPX-Dateien in der lokalen Installation zu verwalten. Die Unterstützung des ActivityPub-Protokolls ist zwar noch nicht realisiert, aber in Planung.

Ich habe nach einem Hosting-Anbieter gesucht, bei dem ich alle Tools installieren kann, die ich zum Betrieb von Fittrackee benötige. Diesen habe ich mit Uberspace gefunden.

Hier möchte ich meine Schritte bei der Testinstallation teilen.

Konto bei Uberspace einrichten

Account anlegen

Als erstes habe ich ein Konto bei Uberspace angelegt. Der Hoster bietet die Möglichkeit, einen Monat lang alles zu testen, bevor man für das Angebot zahlen muss. So kann man sich selbst davon überzeugen, dass alles klappt und ob man mit dem Angebot und Support von Uberspace zufrieden ist. Beim Einrichten ist es lediglich erforderlich eine E-Mail-Adresse anzugeben.

Zugang einrichten

Um sich am Uberspace-Server per Secure Shell SSH anzumelden ist es erforderlich, ein Passwort festzulegen. Dies geschieht am einfachsten nach der Anmeldung im Kundenbereich über den Tabulator Zugänge im Bereich SSH-Zugang zum Uberspace.

Zugang

Ich habe zum Testen ein einfaches Passwort verwendet.

Via SSH anmelden

Die Anmeldung am Uberspace Server erfolgt über die Kommandozeile. Alle notwendigen Daten findet man im Uberspace Kundenbereich - konkret im Tabulator Datenblatt.

Der dem Benutzer ub zugeteilte Uberpace liegt auf dem Server lupus.uberspace.de.

Web

Zugang zu dem mir zugewiesenen Bereich habe ich über ub.uber.space.

SSH

Konkret sieht das auf der Komandozeile wie folgt aus:

Terminal window
$ ssh ub@ub.uber.space
(ub@ub.uber.space) Password:
Last failed login: Tue Oct 10 12:21:20 CEST 2023 from 45.150.13.187 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Oct 10 12:19:42 2023 from 45.150.13.187
Welcome to Uberspace 7!
Current version: 7.15.9
Manual: https://manual.uberspace.de
Lab - guides and inspirations for apps: https://lab.uberspace.de
Watch out for changes at: https://manual.uberspace.de/changelog
Follow us on Twitter or Mastodon for updates:
- https://twitter.com/ubernauten
- https://uberspace.social/@ubernauten
Is something unclear or does not work as expected?
=> check the server status: https://is.uberspace.online
=> reach out to our team by mail: hallo@uberspace.de
=> Contact support on Twitter: https://twitter.com/hallouberspace
=> Contact support on Mastodon: https://uberspace.social/@hallo
[ub@lupus ~]$

Dabei ist [ub@lupus ~]$ die Kommandozeile des Servers bei Uberspace.

Orientieren

Ich möchte mir zu Beginn gerne einen Überblick verschaffen. Als erstes sehe ich mir das Stammverzeichnis für den Webspace im Ordner html an.

[ub@lupus ~]$ ls
bin etc html logs Maildir tmp users
[ub@lupus ~]$ cd html
[ub@lupus html]$ ls
nocontent.html

Das Verzeichnis html enthält eine Datei namens nocontent.html. Ich prüfe den Code der Datei mit cat nocontent.html:

Terminal window
[ub@lupus html]$ cat nocontent.html
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<h2>Dieser Uberspace hat noch keinen Inhalt.</h2>
<h2>This Uberspace does not have any content yet.</h2>
<h3>
Sollte er dir gehören, kannst du, wie
<a
href="https://manual.uberspace.de/web-documentroot.html"
target="_blank"
>im Manual</a
>
beschrieben, Inhalte in /var/www/virtual/ub/html
hochladen.
</h3>
<h3>
In case it is yours, take a look at
<a
href="https://manual.uberspace.de/web-documentroot.html"
target="_blank"
>the manual</a
>
to learn how to upload your content to /var/www/virtual/ub/html.
</h3>
</body>
</html>
[ub@lupus html]$

Wenn ich https://[MeinBenutzer].uber.space/ in der Adressleiste meines Browsers eintippe und die Seite aufrufe, wird genau diese HTML-Datei ausgegeben.

Orientieren

Fittrackee

Der Entwickler von Fittrackee hat in der Dokumentation die Installation beschrieben.

Verzeichnisse für Fittrackee anlegen

Damit alles übersichtlich bleibt lege ich im Verzeichnis /home/ub/

  • ein Verzeichnis fittrackee an, in dem ich alle Daten zu Fittracke gesammelt abspeichere sowie
  • ein separates Verzeichnis für die Uploads der GPX Dateien fittrackee\upldad.

Am Ende wechsele ich in das Verzeichnis /home/ub/fittrackee.

Terminal window
[ub@lupus ~]$ mkdir /home/ub/fittrackee
[ub@lupus ~]$ mkdir /home/ub/fittrackee/upload
[ub@lupus ~]$ cd /home/ub/fittrackee/
[ub@lupus fittrackee]$

Fittrackee installieren und virtuelle Umgebung für Python einrichten

Fittrackee ist eine Python-Anwendung und es ist sinnvoll diese in einer virtuelle Umgebung zu installieren. Mindestvoraussetzung ist Python in Version 3.8.

Informationen dazu, wie Python in Uberspace vorinstalliert ist, bietet das Manual.

Einen Überblick über die verschieden Versionen von Python findet man unter python.org.

Nachfolgend zeige ich meine Schritte bei der Installation auf.

Terminal window
[ub@lupus fittrackee]$ python3.9 -m venv fittrackee_venv
[ub@lupus fittrackee]$ ls
fittrackee_venv upload
[ub@lupus fittrackee]$ source fittrackee_venv/bin/activate
(fittrackee_venv) [ub@lupus fittrackee]$

In der virtuelle Umgebung, installiere ich die Anwendung Fittrackee via dem Befehl install fittrackee.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ pip3.9 install fittrackee
Collecting fittrackee
...
[notice] A new release of pip is available: 23.0.1 -> 23.2.1
[notice] To update, run: pip install --upgrade pip

Ich aktualisiere den Paketinstaller für Python pip via pip3.9 install --upgrade pip.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ pip3.9 install --upgrade pip
Requirement already satisfied: pip in ./fittrackee_venv/lib/python3.9/site-packages (23.0.1)
Collecting pip
Downloading pip-23.2.1-py3-none-any.whl (2.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 16.4 MB/s eta 0:00:00
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 23.0.1
Uninstalling pip-23.0.1:
Successfully uninstalled pip-23.0.1
Successfully installed pip-23.2.1
(fittrackee_venv) [ub@lupus fittrackee]$

Im Anschluß installiere ich explizit die Version 1.26.6 von urllib3, weil ich aus Erfahrung weiß, dass mir andernfalls später beim Einrichten der Datenbank eine Fehlermeldung bezüglich der Version angezeigt wird. Ich führe also pip3.9 install urllib3==1.26.6 aus.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ pip3.9 install urllib3==1.26.6
Collecting urllib3==1.26.6
Downloading urllib3-1.26.6-py2.py3-none-any.whl (138 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 138.5/138.5 kB 7.3 MB/s eta 0:00:00
Installing collected packages: urllib3
Attempting uninstall: urllib3
Found existing installation: urllib3 2.0.6
Uninstalling urllib3-2.0.6:
Successfully uninstalled urllib3-2.0.6
Successfully installed urllib3-1.26.6
(fittrackee_venv) [ub@lupus fittrackee]$

Anderfalls, also ohne den vorherigen Schritt, würde das Einrichten der Datenbank später mit der folgenden Fehlermeldung abgebrochen.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ ftcli db upgrade
Traceback (most recent call last):
File "/home/ub/fittrackee/fittrackee_venv/bin/ftcli", line 5, in <module>
from fittrackee.cli import cli
File "/home/ub/fittrackee/fittrackee_venv/lib64/python3.9/site-packages/fittrackee/__init__.py", line 25, in <module>
from fittrackee.emails.email import EmailService
File "/home/ub/fittrackee/fittrackee_venv/lib64/python3.9/site-packages/fittrackee/emails/email.py", line 11, in <module>
from urllib3.util import parse_url
File "/home/ub/fittrackee/fittrackee_venv/lib64/python3.9/site-packages/urllib3/__init__.py", line 41, in <module>
raise ImportError(
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips 26 Jan 2017'. See: https://github.com/urllib3/urllib3/issues/2168
(fittrackee_venv) [ub@lupus fittrackee]$ pip install --upgrade pip
Requirement already satisfied: pip in ./fittrackee_venv/lib/python3.9/site-packages (23.2.1)

Mit deactivate verlasse ich die virtuelle Umgebung um mit der Konfiguration der Datenbank fortzufahren.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ deactivate
[ub@lupus fittrackee]$

Datenbank

Fittrackee nutzt eine PostgreSQL-Datenbank. Mindestvoraussetzung ist PostgreSQL in Version 11. Informationen zu PostgreSQL bei Uberspace findet man in der Dokumentation.

Welche PostgreSQL Version auf dem Uberspace-Server aktiv ist, kann man via uberspace tools version show postgresql in Erfahrung bringen.

Terminal window
[ub@lupus fittrackee]$ uberspace tools version show postgresql
Using 'Postgresql' version: '15'

Initialisierung

Umgebungsvariablen

Via Editor füge die folgenden Zeile zur Datei ~/.bash_profile hinzu.

# PostgreSQL Environment
export PGPASSFILE=$HOME/.pgpass

Ich verwende als Editor Nano. Wer lieber mit dem Editor Vi arbeitet kann dies bei Uberspace ebenfalls tun.

Ich öffne die Datei ~/.bash_profile via nano ~/.bash_profile und editiere diese.

Terminal window
[ub@lupus ~]$ nano ~/.bash_profile

Im Anschluß prüfe ich via cat, ob alles korrekt gespeichert wurde und die neu eingefügte Zeile am Ende der Datei vorhanden ist.

.bash_profile
[ub@lupus ~]$ cat ~/.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$HOME/.local/bin:$HOME/bin:$PATH
export PATH
# PostgreSQL Environment
export PGPASSFILE=$HOME/.pgpass

Dann rufe ich die Datei .bash_profile via source ~/.bash_profile auf, so dass meine neue Umgebungsvariable geladen wird:

Terminal window
[ub@lupus ~]$ source ~/.bash_profile
[ub@lupus ~]$

Am Ende überzeuge ich mich davon, dass die Variable $PGPASSFILE korrekt gesetzt ist.

Terminal window
[ub@lupus ~]$ echo $PGPASSFILE
/home/ub/.pgpass

Das Datenbank Cluser

Ich habe das Datenbank Cluster angelegt, wie in der Dokumentation beschrieben.

Als erstes habe ich via openssl rand eine Zufallszahl generiert und diese in der temporären Datei ~/pgpass.temp gespeichert und anschließend in eine versteckten Datei ~/.pgpass kopiert.

Terminal window
[ub@lupus ~]$ openssl rand -hex 32 > ~/pgpass.temp
[ub@lupus ~]$ cp ~/pgpass.temp ~/.pgpass
[ub@lupus ~]$

Die Datei enthält bisher lediglich die Zufallszahl.

Terminal window
[ub@lupus ~]$ cat ~/.pgpass
6example0fa5b0c8b34be04b582fb44f63c3198b1daa84b92b0fc49bda1955b

~/.pgpass soll laut PostgreSQL Doku Zeilen in folgendem Format enthalten:

Terminal window
hostname:port:database:username:password

An meine Umgebung angepasst editiere ich die Datei so, wie im nächsten Codeblock zu sehen ist. Das Zeichen * ist ein Wildcard, ein Platzhalter für beliebig viele Zeichen. ub ist der Benutzer und die Zufallszahl ist das Passwort.

Terminal window
[ub@lupus ~]$ nano ~/.pgpass
[ub@lupus ~]$ cat ~/.pgpass
*:*:*:ub:6example0fa5b0c8b34be04b582fb44f63c3198b1daa84b92b0fc49bda1955b

Damit alles funktioniert, müssen die Berechtigungen für die Datei ~/.pgpass konfiguriert werden.

Terminal window
[ub@lupus ~]$ chmod 0600 ~/.pgpass

Im Anschluss rufe ich initdb --pwfile ~/pgpass.temp --auth=scram-sha-256 -E UTF8 -D ~/opt/postgresql/data/ auf.

Terminal window
[ub@lupus ~]$ initdb --pwfile ~/pgpass.temp --auth=scram-sha-256 -E UTF8 -D ~/opt/postgresql/data/
Die Dateien, die zu diesem Datenbanksystem gehören, werden dem Benutzer
»ub« gehören. Diesem Benutzer muss auch der Serverprozess gehören.
Der Datenbankcluster wird mit der Locale »de_DE.UTF-8« initialisiert werden.
Die Standardtextsuchekonfiguration wird auf »german« gesetzt.
Datenseitenprüfsummen sind ausgeschaltet.
erzeuge Verzeichnis /home/ub/opt/postgresql/data ... ok
erzeuge Unterverzeichnisse ... ok
wähle Implementierung von dynamischem Shared Memory ... posix
wähle Vorgabewert für max_connections ... 100
wähle Vorgabewert für shared_buffers ... 128MB
wähle Vorgabewert für Zeitzone ... Europe/Berlin
erzeuge Konfigurationsdateien ... ok
führe Bootstrap-Skript aus ... ok
führe Post-Bootstrap-Initialisierung durch ... ok
synchronisiere Daten auf Festplatte ... ok
Erfolg. Sie können den Datenbankserver jetzt mit
/usr/pgsql-15/bin/pg_ctl -D /home/ub/opt/postgresql/data/ -l logdatei start
starten.

Schließlich lösche ich die temporäre Datei ~/pgpass.temp.

Terminal window
[ub@lupus ~]$ rm ~/pgpass.temp
[ub@lupus ~]$

Konfiguration

Unix Socket

Jetzt schaue ich mir die Datei ~/.bashrc an.

.bashrc
[ub@lupus ~]$ cat ~/.bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions

Hier füge ich die benutzerspezifischen Aliasnamen und Funktionen unterhalb von User specific aliases and functions ein. Konkret sind das die Zeilen export PGHOST=localhost und export PGPORT=5432.

.bashrc
[ub@lupus ~]$ nano ~/.bashrc
[ub@lupus ~]$ cat ~/.bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
export PGHOST=localhost
export PGPORT=5432
[ub@lupus ~]$

Nun rufe ich die Datei via source auf, damit meine neuen Variablen gesetzt werden.

Terminal window
[ub@lupus ~]$ source ~/.bashrc
[ub@lupus ~]$
PostgreSQL Konfiguration

Als nächstes öffne ich die Datei ~/opt/postgresql/data/postgresql.conf zum Editieren.

Terminal window
[ub@lupus ~]$ nano ~/opt/postgresql/data/postgresql.conf

Die Datei ist sehr umfangreich. In der Datei suche ich nach dem folgenden Text: #unix_socket_directories = '/var/run/postgresql, /tmp' # comma-separated list of directories

Ich lösche diese Zeile und füge anstelle davon die Zeile unix_socket_directories = '/home/[MeinBenutzername]/tmp' ein. In meinem Fall ist dies konkret:

Terminal window
...
unix_socket_directories = '/home/ub/tmp'
...
Daemon

Jetzt richte ich alles Notwendige für den PostgreSQL-Dienst ein. Die Datei ~/etc/services.d/postgresql.ini existiert noch nicht.

Terminal window
[ub@lupus ~]$ cat ~/etc/services.d/postgresql.ini
cat: /home/ub/etc/services.d/postgresql.ini: Datei oder Verzeichnis nicht gefunden

Ich erstelle die Datei ~/etc/services.d/postgresql.ini und füge den erforderlichen Text für den Dienst PostgreSQL ein.

Terminal window
[ub@lupus ~]$ nano ~/etc/services.d/postgresql.ini
[ub@lupus ~]$ cat ~/etc/services.d/postgresql.ini
[program:postgresql]
command=postgres -D %(ENV_HOME)s/opt/postgresql/data/
autostart=yes
autorestart=yes
startsecs=15
[ub@lupus ~]$

Jetzt teste ich, ob der PostgreSQL Dienst problemlos funktioniert, indem ich ihn stoppe und starte und mir die Ausgaben in der Kommandozeile ansehe. Manchmal muss ich etwas Geduld haben, weil es etwas dauert, bis der Dienst den Status von STARTING auf RUNNING wechselt.

Terminal window
[ub@lupus ~]$ supervisorctl status
[ub@lupus ~]$ supervisorctl reread
postgresql: available
[ub@lupus ~]$ supervisorctl update
postgresql: added process group
[ub@lupus ~]$ supervisorctl status
postgresql STARTING
[ub@lupus ~]$ supervisorctl status
postgresql STARTING
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 21503, uptime 0:00:23
[ub@lupus ~]$

Wie ich Dienste bei Uberspace verwalte ist im Manuel beschrieben.

Terminal window
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 21503, uptime 0:00:23
[ub@lupus ~]$ supervisorctl stop postgresql
postgresql: stopped
[ub@lupus ~]$ supervisorctl status
postgresql STOPPED Sep 20 04:27 PM
[ub@lupus ~]$ supervisorctl start postgresql
postgresql: started
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 23200, uptime 0:00:20
[ub@lupus ~]$

Falls etwas schief läuft, suche ich Hinweise in der Protokolldatei ~/opt/postgresql/data/log/.

Datenbank, Datenbankbenutzer und Schema erstellen

Wenn alles problemlos läuft, kann ich den für Fittrackee

  • erforderlichen Datenbank-Benutzer,
  • die Datenbank und
  • das Schema anlegen.

Wie in der Uberspace-Dokumentation empfohlen, erstelle ich den Datenbank-Benutzer.

Terminal window
[ub@lupus ~]$
[ub@lupus ~]$ createuser fittrackee -P
Enter password for new role:
Enter it again:

Wie ebenfalls in der Uberspace-Dokumentation empfohlen, erstelle ich die Datenbank.

Terminal window
[ub@lupus ~]$ createdb --encoding=UTF8 --owner=fittrackee --template=template0 fittrackee

Via psql erstelle ich das in der Fittrackee-Dokumentation geforderte Schema.

Terminal window
[ub@lupus ~]$ psql fittrackee
psql (15.4)
Type "help" for help.
fittrackee=# CREATE SCHEMA fittrackee AUTHORIZATION fittrackee;
CREATE SCHEMA
fittrackee=# exit
[ub@lupus ~]$

Alles Wichtige für die Datenbank ist nun eingestellt.

Redis

Informationen über Redis bei Uberspace findet man im Manuel und über Redis im Allgemeinen habe ich in der Redis Doku nachgesehen.

Laut Manuel läuft Redis bei Uberspace standardmäßig nicht auf einem Port, sondern bietet einen Unix-Socket unter /home/$USER/.redis/sock. Entweder muss man die Konfiguration der Fittrackee-Anwendung anpassen oder die Redis-Konfiguration von Port 0 auf Port 6379 ändern. Ich habe mich für die letztere Option entschieden.

Konfiguration

Beim Anpassen der Konfiguration habe ich den Port nicht auf 0 gesetzt, wie im Manuel beschrieben, sondern auf 6379. So ist es nicht erforderlich, etwas in der Anwendung Fittrackee selbst zu ändern.

Terminal window
[ub@lupus ~]$ mkdir ~/.redis/
[ub@lupus ~]$ nano ~/.redis/conf
[ub@lupus ~]$ cat ~/.redis/conf
unixsocket /home/ub/.redis/sock
daemonize no
port 6379
save ""
[ub@lupus ~]$

Daemon

Um den Redis Dienst zu starten, lege ich die Datei ~/etc/services.d/redis.ini an. Die nächsten Schritte sind analog der Beschreibungen im Manuel.

Terminal window
[ub@lupus ~]$ cat ~/etc/services.d/redis.ini
cat: /home/ub/etc/services.d/redis.ini: Datei oder Verzeichnis nicht gefunden
[ub@lupus ~]$ nano ~/etc/services.d/redis.ini
[ub@lupus ~]$ cat ~/etc/services.d/redis.ini
[program:redis]
command=redis-server %(ENV_HOME)s/.redis/conf
directory=%(ENV_HOME)s/.redis
autostart=yes
autorestart=yes
[ub@lupus ~]$
Terminal window
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 23200, uptime 0:41:38
[ub@lupus ~]$ supervisorctl reread
redis: available
[ub@lupus ~]$ supervisorctl update
redis: added process group
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 23200, uptime 0:41:57
redis RUNNING pid 19237, uptime 0:00:06
[ub@lupus ~]$
Stoppen und starten
Terminal window
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 31985, uptime 1 day, 15:12:57
redis RUNNING pid 5306, uptime 1 day, 15:03:18
[ub@lupus ~]$ supervisorctl stop redis
redis: stopped
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 31985, uptime 1 day, 15:13:06
redis STOPPED Sep 22 10:40 AM
[ub@lupus ~]$ supervisorctl start redis
redis: started
[ub@lupus ~]$ supervisorctl status
postgresql RUNNING pid 31985, uptime 1 day, 15:13:47
redis RUNNING pid 4129, uptime 0:00:35
[ub@lupus ~]$

Zugriff testen

Im Uberspace Manuel ist der Aufruf redis-cli -s ~/.redis/soc zum Testen vorgeschlagen. Dies funktioniert bei der hier vorgeschlagen Installationsvariante nicht, weil wir den Port geändert haben.

Terminal window
[ub@lupus ~]$ redis-cli -s ~/.redis/soc
Could not connect to Redis at /home/ub/.redis/soc: No such file or directory
not connected> exit

Deshalb versuche ich es anders. Ich öffne die redis-cli.

Terminal window
[ub@lupus ~]$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> Set mykey "Test"
OK
127.0.0.1:6379> Get mykey
"Test"
127.0.0.1:6379> exit

Das sieht für mich gut aus.

Optional: E-Mail

Damit E-Mails von Fittrackee aus versendet werden können benötigt man ein E-Mail Konto, welches man später in der Datei .env spezifiziert. Hierzu kann ein beliebiges Konto verwendet werden. Wer mag kann das Konto bei Uberspace direkt anlegen.

Im Uberspace Manuel findet man Informationen zu den E-Mail Konten.

E-Mail

Umgebungsvariablen für Fittrackee

Ich lege eine Datei an, in der ich alle für Fittrackee erforderlichen Umgebungsvariablen einfüge. Weitere Informationen zu den Umgebungsvariablen findet man in der Dokumentation von Fittrackee.

Standarddatei zur Konfiguration der Umgebunsvariablen

Als Basis verwende ich die Beispieldatei von Github.

Terminal window
# Custom variables initialisation
# (can overwrite variables present in Makefile.config)
# Application
# export FLASK_APP=fittrackee
export FLASK_SKIP_DOTENV=1
# export HOST=
# export PORT=
# export APP_SETTINGS=fittrackee.config.ProductionConfig
export APP_SECRET_KEY='please change me'
# export APP_WORKERS=
export APP_LOG=fittrackee.log
export UPLOAD_FOLDER=
# PostgreSQL
# export DATABASE_URL=postgresql://fittrackeeuser:fittrackeepwd@${HOST}:5432/fittrackee
# export DATABASE_DISABLE_POOLING=
# Redis (required for API rate limits and email sending)
# export REDIS_URL=
# API rate limits
# export API_RATE_LIMITS="300 per 5 minutes"
# Emails
export UI_URL=
export EMAIL_URL=
export SENDER_EMAIL=
# export WORKERS_PROCESSES=
# Workouts
# export TILE_SERVER_URL=
# export STATICMAP_SUBDOMAINS=
# export MAP_ATTRIBUTION=
# export DEFAULT_STATICMAP=False
# Weather
# available weather API providers: visualcrossing
# export WEATHER_API_PROVIDER=
# export WEATHER_API_KEY=

Beispiel für die Anpassung der Umgebungsvariablen

Ich lege die Datei an, in der ich meine angepassten Umgebungsvariablen konfiguriere.

Terminal window
[ub@lupus ~]$ nano /home/ub/fittrackee/.env

Meine Datei sieht wie folgt aus.

Terminal window
export FLASK_APP=fittrackee
export FLASK_SKIP_DOTENV=1
export HOST=0.0.0.0
export PORT=5000
export APP_SETTINGS=fittrackee.config.ProductionConfig
export APP_SECRET_KEY='please change me now'
export APP_WORKERS=1
export APP_LOG=fittrackee.log
export UPLOAD_FOLDER=/home/ub/fittrackee/upload
# PostgreSQL
export DATABASE_URL=postgresql://fittrackee:fittrackee@smtp:localhost:5432/fittrackee
# Redis
export REDIS_URL=redis://
# API rate limits
export API_RATE_LIMITS="300 per 5 minutes"
# Emails and URLs
export UI_URL=ub.uber.space
export EMAIL_URL=smtp://fittrackee@ub.uber.space:fittrackeeemailpasswort@ub.uberspace.de:587/?tls=True
export SENDER_EMAIL=fittrackee@ub.uber.space
export WORKERS_PROCESSES=2
# Workouts
export TILE_SERVER_URL=https://tile.openstreetmap.org/{z}/{x}/{y}.png
export MAP_ATTRIBUTION="OpenStreetMap contributors"
# Weather
export WEATHER_API_PROVIDER=visualcrossing
export WEATHER_API_KEY=MEINKEYNICHTDEINKEY

Was habe ich geändert? Das meiste ist im Abdruck der Datei ersichtlich. Zu beachten sind insbesondere die Zeilen export HOST=0.0.0.0 und export DATABASE_URL=postgresql://fittrackee:fittrackee@localhost:5432/fittrackee.

Fittrackee einrichten und aktvieren

Ich wähle die Installation via PyPI (The Python Package Index).

Virtuelle Umgebung aktivieren

Zu Beginn aktiviere ich via source fittrackee_venv/bin/activate die virtuelle Umgebung für Python.

Terminal window
[ub@lupus fittrackee]$ cd /home/ub/fittrackee/
[ub@lupus fittrackee]$ ls
fittrackee_venv upload
[ub@lupus fittrackee]$ source fittrackee_venv/bin/activate
(fittrackee_venv) [ub@lupus fittrackee]$

Umgebungsvariablen für Fittrackee laden

Im Anschluss lade ich die zuvor in der Datei /home/ub/fittrackee/.env konfigurierten Umgebungsvariablen. Da der Name der Datei .env mit einem Punkt beginnt, wird diese im Betriebssystem standardmäßig versteckt. Mithilfe des Parameters a beim Befehl ls, werden mir die versteckten Dateien angezeigt. So stelle ich sicher, dass die Datei vorhanden ist.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ ls -a
. .. .env fittrackee_venv upload
(fittrackee_venv) [ub@lupus fittrackee]$

Dann rufe ich die Datei .env via source auf, um alle Umgebungsvariablen ins System zu laden.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ source .env

Datenbankschema initialisieren

(fittrackee_venv) [ub@lupus fittrackee]$ ftcli db upgrade
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 9741fc7834da, create User table
INFO [alembic.runtime.migration] Running upgrade 9741fc7834da -> b7cfe0c17708, create Activity & Sport tables
INFO [alembic.runtime.migration] Running upgrade b7cfe0c17708 -> caf0e0dc621a, create Record table
INFO [alembic.runtime.migration] Running upgrade caf0e0dc621a -> dd73d23a7a3d, create Activities Segments table
INFO [alembic.runtime.migration] Running upgrade dd73d23a7a3d -> 92adde6ac0d0, add 'bounds' column to 'Activity' table
INFO [alembic.runtime.migration] Running upgrade 92adde6ac0d0 -> 5a42db64e872, add static map url to 'Activity' table
INFO [alembic.runtime.migration] Running upgrade 5a42db64e872 -> 9f8c9c37da44, add static map id to 'Activity' table
INFO [alembic.runtime.migration] Running upgrade 9f8c9c37da44 -> e82e5e9447de, add 'timezone' to 'User' table
INFO [alembic.runtime.migration] Running upgrade e82e5e9447de -> 71093ac9ca44, add weather infos in 'Activity' table
INFO [alembic.runtime.migration] Running upgrade 71093ac9ca44 -> 096dd0b43beb, Add 'notes' column to 'Activity' table
INFO [alembic.runtime.migration] Running upgrade 096dd0b43beb -> 27425324c9e3, add 'weekm' in 'User' table
INFO [alembic.runtime.migration] Running upgrade 27425324c9e3 -> f69f1e413bde, add 'language' to 'User' table
INFO [alembic.runtime.migration] Running upgrade f69f1e413bde -> 1345afe3b11d, replace 'is_default' with 'is_active' in 'Sports' table
INFO [alembic.runtime.migration] Running upgrade 1345afe3b11d -> 8a0aad4c838c, add application config in database
INFO [alembic.runtime.migration] Running upgrade 8a0aad4c838c -> 3243cd25eca7, add uuid to activities
INFO [alembic.runtime.migration] Running upgrade 3243cd25eca7 -> 4e8597c50064, rename 'activity' with 'workout'
INFO [alembic.runtime.migration] Running upgrade 4e8597c50064 -> cee0830497f8, Add new sports
INFO [alembic.runtime.migration] Running upgrade cee0830497f8 -> 9842464bb885, add stopped speed threshold to sports
INFO [alembic.runtime.migration] Running upgrade 9842464bb885 -> 080acc8ee956, add sport preferences
INFO [alembic.runtime.migration] Running upgrade 080acc8ee956 -> 07188ca7620a, add imperial units preferences
INFO [alembic.runtime.migration] Running upgrade 07188ca7620a -> ed409fd9db9d, add snowshoes sport
INFO [alembic.runtime.migration] Running upgrade ed409fd9db9d -> e30007d681cb, add missing indexes on Workout table
INFO [alembic.runtime.migration] Running upgrade e30007d681cb -> 5e3a3a31c432, update User and AppConfig tables
INFO [alembic.runtime.migration] Running upgrade 5e3a3a31c432 -> cd0e6cf83207, add ascent record
INFO [alembic.runtime.migration] Running upgrade cd0e6cf83207 -> 84d840ce853b, add OAuth 2.0 and blacklisted tokens
INFO [alembic.runtime.migration] Running upgrade 84d840ce853b -> 5b936821326d, add virtual cycling as sport type
INFO [alembic.runtime.migration] Running upgrade 5b936821326d -> bf13b8f5589d, Add date_format for date display to user preferences in DB
INFO [alembic.runtime.migration] Running upgrade bf13b8f5589d -> a8cc0adfe1d3, add Mountaineering
INFO [alembic.runtime.migration] Running upgrade a8cc0adfe1d3 -> 0f375c44e659, update elevation precision
INFO [alembic.runtime.migration] Running upgrade 0f375c44e659 -> 374a670efe23, add privacy policy
INFO [alembic.runtime.migration] Running upgrade 374a670efe23 -> db58d195c5bf, add user preference to start elevation plots at zero
INFO [alembic.runtime.migration] Running upgrade db58d195c5bf -> eff1c16c43eb, Add user preference for gpx speed calculation
INFO [alembic.runtime.migration] Running upgrade eff1c16c43eb -> d22670a89a54, add paragliding sport
INFO [alembic.runtime.migration] Running upgrade d22670a89a54 -> 24eb097614e4, add open water swimming
(fittrackee_venv) [ub@lupus fittrackee]$

Der Befehl netstat -tupen zeigt jetzt folgende Liste:

(fittrackee_venv) [ub@lupus fittrackee]$ netstat -tulpen
Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State Benutzer Inode PID/Program name
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1215 269297806 11983/postgres
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1215 269390811 26038/redis-server
tcp6 0 0 ::1:5432 :::* LISTEN 1215 269297805 11983/postgres
tcp6 0 0 :::25 :::* LISTEN 0 268899212 -
tcp6 0 0 :::443 :::* LISTEN 0 268899211 -
tcp6 0 0 :::993 :::* LISTEN 0 268899209 -
tcp6 0 0 :::995 :::* LISTEN 0 268899210 -
tcp6 0 0 :::3306 :::* LISTEN 0 268899206 -
tcp6 0 0 :::6379 :::* LISTEN 1215 269390812 26038/redis-server
tcp6 0 0 :::587 :::* LISTEN 0 268899213 -
tcp6 0 0 :::110 :::* LISTEN 0 268899207 -
tcp6 0 0 :::143 :::* LISTEN 0 268899208 -
tcp6 0 0 :::80 :::* LISTEN 0 268899214 -
tcp6 0 0 :::22 :::* LISTEN 0 268899205 -

Fittrackee und Worker starten

Wir könnten Fittrackee nun via fittrackee starten. Der Vollständigkeithalber beschreibe ich dies in diesem Kapitel. Da wir Fittrackee aber später per Dienst aktivieren, überspringe ich diesen Schritte bei der echten Installation.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ fittrackee
[2023-10-10 18:22:17 +0200] [7535] [INFO] Starting gunicorn 21.2.0
[2023-10-10 18:22:17 +0200] [7535] [INFO] Listening at: http://0.0.0.0:5000 (7535)
[2023-10-10 18:22:17 +0200] [7535] [INFO] Using worker: sync
[2023-10-10 18:22:17 +0200] [7544] [INFO] Booting worker with pid: 7544

Der Befehl netstat -tulpen kann in einer weiteren Kommandozeile geöffnet werden. Der Befehl zeigt jetzt folgende Liste. Die zweite Zeile ist hinzugekommen.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ netstat -tulpen
Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State Benutzer Inode PID/Program name
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1215 269297806 11983/postgres
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 1215 269688055 7535/python3.9
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1215 269390811 26038/redis-server
tcp6 0 0 ::1:5432 :::* LISTEN 1215 269297805 11983/postgres
tcp6 0 0 :::25 :::* LISTEN 0 268899212 -
tcp6 0 0 :::443 :::* LISTEN 0 268899211 -
tcp6 0 0 :::993 :::* LISTEN 0 268899209 -
tcp6 0 0 :::995 :::* LISTEN 0 268899210 -
tcp6 0 0 :::3306 :::* LISTEN 0 268899206 -
tcp6 0 0 :::6379 :::* LISTEN 1215 269390812 26038/redis-server
tcp6 0 0 :::587 :::* LISTEN 0 268899213 -
tcp6 0 0 :::110 :::* LISTEN 0 268899207 -
tcp6 0 0 :::143 :::* LISTEN 0 268899208 -
tcp6 0 0 :::80 :::* LISTEN 0 268899214 -
tcp6 0 0 :::22 :::* LISTEN 0 268899205 -
[ub@lupus fittrackee]$

Worker für E-Mail Versendung via Flask starten:

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ flask worker --processes 2
(fittrackee_venv) [ub@lupus fittrackee]$

Port 5000 zur Dokment-Root umleiten

Da man von außen nicht auf alle Ports des Uberspace Servers zugreifen kann und wir außerdem einen Aufruf ohne Portangabe im Internet zur Verfügung stellen möchte, konfigurieren wir Web Backends. Weitere Informationen kann man im Manuel abrufen.

Wie sieht die Ausgabe der Web Backend Liste standardmäßig aus? Dies zeigt der Befehl uberspace web backend list:

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ uberspace web backend list
/ apache (default)

Zur Dokument-Root / kann man die Ausgabe des Ports 5000 via uberspace web backend set / --http --port 5000 umleiten.

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ uberspace web backend set / --http --port 5000
Set backend for / to port 5000; please make sure something is listening!
You can always check the status of your backend using "uberspace web backend list".

Die aktualisierte Liste sieht nun wie folgt aus, wenn Fittrackee bereits gestartet ist:

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ uberspace web backend list
/ http:5000 => OK, listening: PID 7544, /home/ub/fittrackee/fittrackee_venv/bin/python3.9 /home/ub/fittrackee/fittrackee_venv/bin/fittrackee

Falls der Service noch nicht gestartet ist, weil du wie ich vorgeschlagen habe, nun gleich erst den Dienst einrichtest, gibt es den Hinweis / http:5000 => NOT OK, no service.

Daemon/Systemd

Application: fittrackee.service

Terminal window
[ub@lupus ~]$ nano ~/etc/services.d/fittrackee.ini
[ub@lupus ~]$ cat ~/etc/services.d/fittrackee.ini
[program:fittrackee]
command=bash -c 'source %(ENV_HOME)s/fittrackee/.env && %(ENV_HOME)s/fittrackee/fittrackee_venv/bin/gunicorn -b 0.0.0.0:5000 "fittrackee:create_app()" --error-logfile %(ENV_HOME)s/fittrackee/gunicorn.log'
autostart=yes
autorestart=yes
startsecs=30

task queue workers: fittrackee_workers.service

Terminal window
[ub@lupus ~]$ nano ~/etc/services.d/fittrackee_workers.ini
[ub@lupus ~]$ cat ~/etc/services.d/fittrackee_workers.ini
[program:fittrackee_worker]
command=bash -c 'source %(ENV_HOME)s/fittrackee/.env && %(ENV_HOME)s/fittrackee/fittrackee_venv/bin/flask worker --processes 2'
autostart=yes
autorestart=yes
startsecs=30

Start Services

Terminal window
[ub@lupus ~]$ supervisorctl status
[ub@lupus ~]$ supervisorctl reread
fittrackee: available
fittrackee_worker: available
[ub@lupus ~]$ supervisorctl update
[ub@lupus ~]$

Nun sind die Dienste aktive und die Anwendung kann über das Internet aufgerufen werden,

Anwendung im Web öffnen

Unter der Adresse https://ub.uber.space/ kann man die Anwendung nun im Internet-Browser öffnen, wobei ub für den spezifischen Benutzer steht.

E-Mail

Benutzer registrieren

Nun ist es möglich einen Benutzer anzulegen.

E-Mail

Nach dem Abschicken des Registrierformulares, sollte eine Info erscheinen. Falls ein Fehler auftritt, ist es sehr wahrscheinlich, dass mit der E-Mail konfiguration etwas nicht stimmt.

E-Mail

Einem Benutzer den Status Admin zuordnen

Terminal window
(fittrackee_venv) [ub@lupus fittrackee]$ ftcli users update astrid --set-admin true
User 'astrid' updated.
(fittrackee_venv) [ub@lupus fittrackee]$

Optional

Web Backends für externe Domain einrichten

Möchtest du, dass deine Fittrackee-Anwendung unter deiner Domain wie example.org oder einer Subdomain wie subdomain.example.org erreichbar ist? Es soll nicht nur eine einfache Weiterleitung sein, sondern eine DNS-Adressierung. In dem Fall kommen Uberspace Web Backends ins Spiel! Weitere Informationen zu Web Backends bei Uberspace findet man im Manuel.

Ich füge im ersten Schritt die Domain ub.dimna.de zur Uberspace Konfiguration hinzu.

Terminal window
[ub@lupus ~]$ uberspace web domain add ub.dimna.de
The webservers configuration has been adapted.
Now you can use the following records for your DNS:
A -> 123.456.789.176
AAAA -> xxxx:1a50:xx:0:80ce:69ff:fe92:c1d3
[ub@lupus ~]$

Die Werte, die mir hinter A und AAAA ausgegeben werden, muss ich im zweiten Schritt bei dem Anbieter konfigurieren, bei dem ich die ub.dimna.de registriert habe.

Im dritten Schritt richte ich das Web Backend für die Domain ub.dimna.de ein.

Terminal window
[ub@lupus ~]$ uberspace web backend set ub.dimna.de --http --port 5000
Set backend for ub.dimna.de/ to port 5000; please make sure something is listening!
You can always check the status of your backend using "uberspace web backend list".
[ub@lupus ~]$

Fittrackee ist noch nicht auf Port 5000 aktiviert. Dies muss ich nachholen.

Terminal window
[ub@lupus ~]$ uberspace web backend list
ub.dimna.de/ http:5000 => NOT OK, no service
/ apache (default)

Probleme

So sollte es aussehen

[ub@lupus ~]$ netstat -tulpen
Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State Benutzer Inode PID/Program name
tcp 0 0 0.0.0.0:9191 0.0.0.0:* LISTEN 1213 3962665678 27760/python3.9
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 1213 3962660307 25867/python3.9
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1213 3962650056 24910/redis-server
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1213 3962618249 24676/postgres
tcp6 0 0 :::3306 :::* LISTEN 0 3927957775 -
tcp6 0 0 :::6379 :::* LISTEN 1213 3962650057 24910/redis-server
tcp6 0 0 :::587 :::* LISTEN 0 3927957781 -
tcp6 0 0 :::110 :::* LISTEN 0 3927957780 -
tcp6 0 0 :::143 :::* LISTEN 0 3927957777 -
tcp6 0 0 :::80 :::* LISTEN 0 3927957782 -
tcp6 0 0 :::22 :::* LISTEN 0 3927957774 -
tcp6 0 0 ::1:5432 :::* LISTEN 1213 3962618248 24676/postgres
tcp6 0 0 :::25 :::* LISTEN 0 3927957776 -
tcp6 0 0 :::443 :::* LISTEN 0 3927957773 -
tcp6 0 0 :::993 :::* LISTEN 0 3927957778 -
tcp6 0 0 :::995 :::* LISTEN 0 3927957779 -

Prozess killen

Einen Prozess den du (also dein Linuxuser) gestartet hat kannst du auch wieder killen. Wenn nicht klar ist, welcher das ist helfen Tools wie ps, top, htop oder in diesem Fall auch netstat weiter:

[ub@lupus ~]$ netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 1211 3907722271 3801/python3.9
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1211 3890130994 30917/postgres
tcp6 0 0 :::3306 :::* LISTEN 0 3871556965 -
tcp6 0 0 :::587 :::* LISTEN 0 3871556959 -
tcp6 0 0 :::110 :::* LISTEN 0 3871556966 -
tcp6 0 0 :::143 :::* LISTEN 0 3871556967 -
tcp6 0 0 :::80 :::* LISTEN 0 3871556964 -
tcp6 0 0 :::22 :::* LISTEN 0 3871556960 -
tcp6 0 0 ::1:5432 :::* LISTEN 1211 3890130993 30917/postgres
tcp6 0 0 :::25 :::* LISTEN 0 3871556961 -
tcp6 0 0 :::443 :::* LISTEN 0 3871556963 -
tcp6 0 0 :::993 :::* LISTEN 0 3871556962 -
tcp6 0 0 :::995 :::* LISTEN 0 3871556958 -
[ub@lupus ~]$

Wie man hier sieht, ist der Port 5000 durch einen Python-Prozess mit der Prozess-ID (PID) 3801 blockiert. Man kann den Prozess auch mit dieser numerischen ID beenden. Das wäre dann:

Terminal window
$ kill 3801

Standardmäßig sendet kill allerdings nicht das Signal KILL sondern TERM. Letzteres kann man sich als höfliche Anfrage an den Prozess vorstellen, sich doch bitte zu beenden. Wenn es wirklich eines KILL bedarf, weil der Prozess auf TERM nicht mehr reagiert, geht das auch:

Terminal window
$ kill -s KILL 3801

oder kürzer mit der numerischen Entsprechung von KILL:

Terminal window
$ kill -s 9 3801

Fazit

Das Ziel dieses Beitrags ist es, meine Schritte bei der Installation von Fittrackee bei Uberspace aufzuzeichnen. Ich stelle den Text online, um meine Erfahrungen zu teilen.

Impressum

Astrid Günther
Sonnenhang 23
56729 Kehrig
Germany
E-Mail: info At astrid-guenther.de

Ich freu mich über Anfragen zu den von mir hier beschreibenen Themen und beantworte diese zeitnah!

Datenschutz

Ich erhebe oder speichere keine personenbezogenen Daten über diese Website. Um den Aufruf dieser Seite zu ermöglichen, speichert der Internet-Provider einige Daten in Server-Log-Files, die ein Browser automatisch weiterleitet: Browsertyp und Browserversion, verwendetes Betriebssystem, Referrer URL, Hostname des zugreifenden Rechners, Uhrzeit der Serveranfrage, IP-Adresse. Die Grundlage für die Datenverarbeitung ist Art. 6 Abs. 1 DSGVO, der die Verarbeitung von Daten zur Erfüllung eines Vertrags oder vorvertraglicher Maßnahmen erlaubt.