====== FitTrackee ======
[[https://samr1.github.io/FitTrackee/en/index.html|FitTrackee]] is an open-source fitness tracker selfhosted application that can also sync with Garmin and Strava. It is aimed at outdoor acvities.
===== Installation =====
Detailed instructions can be found [[https://samr1.github.io/FitTrackee/en/installation.html|here]]. There is no container for FitTrackee, so i will show you how to install on bare-metal.
useradd -d /data/daemons/fittrackee -m fittrackee
FitTrackee uses Python, so check out [[gentoo:pip|PIP on Gentoo]] page to enable virtual environments and PIP for the fittrackee user.
python -m venv venv_ft
source venv_ft/bin/activate
pip install fittrackee
Now, FitTrackee requires PostgreSQL, so you need to install and start it. For reference, and [[https://wiki.gentoo.org/wiki/PostgreSQL/QuickStart|this]] and [[https://wiki.gentoo.org/wiki/PostgreSQL|this]] are the Gentoo wiki pages on PostgreSQL. These two pages are very well written and will let you setup your postgres in a few moments.
From now on i assume PostgreSQL is installed and ready.
Now access your postgres as admin user and create the database:
psql -U postgres
type in the following SQL statements:
CREATE USER fittrackee WITH PASSWORD '';
CREATE SCHEMA fittrackee AUTHORIZATION fittrackee;
CREATE DATABASE fittrackee OWNER fittrackee;
export PORT=5123
export APP_SECRET_KEY=
export APP_LOG=/data/daemons/fittrackee/log.txt
export UPLOAD_FOLDER=/data/daemons/fittrackee/uploads
export DATABASE_URL=postgresql://fittrackee:xxxxxxx@127.0.0.1:5432/
export UI_URL=https://train.mydomain.com
export EMAIL_URL=smtp://xxxx:xxxx@smtp.mydomain.com:587/?tls=True
export SENDER_EMAIL=xxx@mydomain.com
export FLASK_APP=fittrackee
Ensure this **.env** file is sourced in your **~/.bashrc**.
As a reference:
(only last lines shown)
export PATH=$PATH:~/.local/bin
source venv_ft/bin/activate
source .env
Now, initialize the database:
ftcli db upgrade
To start FitTrackee see the autostart script below.
===== Reverse Proxy =====
I have deployed FitTrackee on a subdomain, because i already had one set up for it. Check [[selfhost:nginx|The Reverse Proxy concept]] for more details:
server {
server_name train.gardiol.org;
listen 443 ssl;
listen 8443 ssl;
access_log /var/log/nginx/train.gardiol.org_access_log main;
error_log /var/log/nginx/train.gardiol.org_error_log info;
location / {
proxy_pass http://127.0.0.1:5123;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
}
client_max_body_size 100M;
include org.gardiol/certbot.conf;
}
===== Autostart =====
Since i use OpenRC, simply drop the following script to /etc/init.d:
#!/sbin/openrc-run
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
description="Open Source Fit Tracker"
pidfile="/run/fittrackee.pid"
command_background=true
command="/deposito/daemons/fittrackee/fittrackee_start.sh"
command_args=""
command_user="fittrackee:fittrackee"
depend() {
need net
}
Make it executable and add to the proper runlevel:
chmod +x /etc/init.d/fittrackee
rc-update add fittrackee default
You will also need to create the script **/data/daemons/fittrackee_start.sh**:
#!/bin/bash
cd ~
export PATH=$PATH:~/.local/bin
source venv_ft/bin/activate
source .env
# Workers are not really needed on very small instances. Uncomment if you need them
# flask worker --processes 2&
fittrackee
and make it executable.
===== User management =====
If you do not require generating and managing many users, you can manually create them:
ftcli users create --password --lang en --email xxx@mydomain.com myuser
ftcli users update myuser --set-admin true
and then disable user registration from the admin panel in theweb GUI, set the number of active users to a fixed quantity instead of zero.
===== Log rotation =====
If you use **logrotate** (you should), create a new file under **/etc/logrotate.d/fittrackee**:
/data/daemons/fittrackee/log.txt {
missingok
notifempty
}
===== Sending emails =====
Work in progress.
===== Updates =====
Stop the service, then run, as **fitrackee** user:
pip install fittrackee -U
ftcli db upgrade
and make sure that you are in the venv.
Also note, if you installed the Garmin bridge, that you might want to run again that installation command as well.
===== Garmin Integration =====
A Garmin bridge for FitTrackee exist [[https://git.dryusdan.fr/Dryusdan/garmin-to-fittrackee|here]].
First of all, as the same **fittrackee** user, install the bridge:
pip install --upgrade --index-url https://git.dryusdan.fr/api/packages/Dryusdan/pypi/simple/ --extra-index-url https://pypi.python.org/simple garmin-to-fittrackee
Now, citing the documentation in the above link, y ou need to create an application in your Fittrackee instance so go to you're fittrackee account, then go to "apps", then "Add an application".
In the "Add a new OAuth2 application" section; chose your Application name (let's put **GarminConnect** as an example).
As "application URL" and "Redirect URL" set your FitTrackee URL, so for example **https://train.mydomain.com**.
Enable all the scopes.
After submit your application, an **application ID** and **secret** are displayed: note those down as you will NEVER see them again inside FitTrackee!
At this point, setup the link to Garmin, from your fittrackee user terminal:
.garmin2fittrackee setup config-tool
You will need to provide your garmin credentials for login.
And, last, connect to FitTrackee:
garmin2fittrackee setup fittrackee --client-id --client-secret --fittrackee-domain train.mydomain.com
You will be prompted an URL, **carefully** copy it and paste to your browser (it's a multi-line link, so be careful). After clicking on authorize in FitTrackee web page, **copy carefully** the browser URL (again, make sure you copy ALL of it) back to the terminal window.
At last, start the actual sync:
garmin2fittrackee sync
**NOTE:** ensure your FitTrackee has //no activities// already logged, or GarminConnect will only fetch starting from today. If you want to export __all__ garmin activities from the past, your FitTrackee user __must__ have no activities logged.
This will take a while. You will want to run this as a cron task every 6 hours or so, create the following script:
#!/bin/bash
cd ~
export PATH=$PATH:~/.local/bin
source venv_ft/bin/activate
source .env
garmin2fittrackee sync
and make it executable.
Then schedule it as many times per day as you like in your crontab:
0 0 * * * /data/daemons/fittrackee/sync_garmin.sh &> ~/cron.log
6 0 * * * /data/daemons/fittrackee/sync_garmin.sh &> ~/cron.log
12 0 * * * /data/daemons/fittrackee/sync_garmin.sh &> ~/cron.log
18 0 * * * /data/daemons/fittrackee/sync_garmin.sh &> ~/cron.log
crontab -e