User Tools

This is an old revision of the document!


FitTrackee

FitTrackee is an open-source fitness tracker selfhosted application that can also sync with Garmin and Strava. It is aimed at outdoor activities.

Installation

Detailed instructions can be found here. Since version 0.8 there is also a container image and a docker compose example file. Initially i had installed on bare metal, but since that time i prefer to move to the containerized installation because i do not want to manage myself a PostgreSQL installation on my server for various reasons.

For historical reasons, i will keep the original non containerized installation instructions too for reference, but keep in mind they might be outdated.

As usual, create the dedicated user:

useradd -d /data/daemons/fittrackee -m fittrackee
mkdir /data/fittrackee /data/fittrackee/upload /data/fittrackee/database /var/log/fittrackee
chown fittrackee:fittrackee /data/fittrackee /data/fittrackee/upload /data/fittrackee/database /var/log/fittrackee

uploads will be stored under /data/fittrackee/upload and similarly the database. Logs will be located under /var/log/fittrackee remember to logrotate it.

Using containers

Download the example docker-compose.yml from here and adapt it to your needs:

docker-compose.yaml
services:
  fittrackee-db:
    container_name: fittrackee-db
    image: postgres:17-alpine
    env_file:
      - .env
    volumes:
      - ${DATABASE_DIR:-./data/db}:/var/lib/postgresql/data
    networks:
      - fittrackee-network

  fittrackee:
    container_name: fittrackee
    env_file:
      - .env
    image: fittrackee/fittrackee:v0.9.11
    volumes:
      - ${UPLOAD_DIR:-./data/uploads}:/usr/src/app/uploads
      - ${LOG_DIR:-./data/logs}:/usr/src/app/logs
    post_start:
      - command: chown -R fittrackee:fittrackee /usr/src/app/uploads
        user: root
    ports:
      - "${APP_PORT:-5000}:5000"
    command: 'sh docker-entrypoint.sh'
    depends_on:
      fittrackee-db:
    networks:
      - fittrackee-network

networks:
  fittrackee-network: {}

Populate the env file (/data/daemons/fittrackee/.env):

.env
# Docker volumes
export UPLOAD_DIR=/data/fittrackee/uploads
export LOG_DIR=/var/log/fittrackee
export DATABASE_DIR=/data/fittrackee/database

# Application
export FLASK_APP=fittrackee
export FLASK_SKIP_DOTENV=1
export APP_PORT=5123
export APP_SECRET_KEY=<< custom key >>
export APP_LOG=/usr/src/app/logs/fittrackee.log
export UPLOAD_FOLDER=/usr/src/app/uploads
export UI_URL=https://train.mydomain.com

# PostgreSQL
export POSTGRES_USER=fittrackee
export POSTGRES_PASSWORD=<< some password >>
export POSTGRES_DB=fittrackee
export DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@fittrackee-db:5432/${POSTGRES_DB}

Now start the stuff:

podman compose up

you might have to stop and start again, since the first start of the database takes some time and the main app might crash. Just wait for the database to be up and running, then restart.

Without using containers

FitTrackee uses Python, so check out 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

Populate the following /data/daemons/fittrackee/.env file:

.env
export PORT=5123
export APP_SECRET_KEY=<my secret>
export APP_LOG=/va/log/fittrackee/log.txt
export UPLOAD_FOLDER=/data/fittrackee/upload
export DATABASE_URL=postgresql://fittrackee:xxxxxxx@127.0.0.1:5432/
export UI_URL=https://train.mydomain.com
export FLASK_APP=fittrackee

Ensure this .env file is sourced in your ~/.bashrc, this is needed for non-container users, and also required for the Garmin bridge, even if using containers.

As a reference:

.bashrc
(only last lines shown)
export PATH=$PATH:~/.local/bin
source venv_ft/bin/activate
source .env

Now, FitTrackee requires PostgreSQL, so you need to install and start it. For reference, and this and 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 '<PASSWORD>';
CREATE SCHEMA fittrackee AUTHORIZATION fittrackee;
CREATE DATABASE fittrackee OWNER fittrackee;

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 The Reverse Proxy concept for more details:

fittrackee.conf
server {
        server_name train.mydomain.com;
        listen 443 ssl;
        listen 8443 ssl;

        access_log /var/log/nginx/train.mydomain.com_access_log main;
        error_log /var/log/nginx/train.mydomain.com_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 com.mydomain/certbot.conf;
}

Autostart with containers

To start it, and set it up on boot, as usual follow my indications Using Containers on Gentoo, so link the user-containers init script:

ln -s /etc/init.d/user-containers /etc/init.d/user-containers.fittrackee

and create the following config file:

/etc/conf.d/user-containers.fittrackee
USER=fittrackee
DESCRIPTION="The sport and train solution"

Add the service to the default runlevel and start it now:

rc-update add user-containers.fittrackee default
rc-service user-containers.fittrackee start

Autostart without containers

Since i use OpenRC, simply drop the following script to /etc/init.d:

/etc/init.d/fittrackee
#!/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:

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

You can create users from the web UI, but users will be disabled. I suggest you go ahead and create one user, then use the CLI to set it as admin, you can then login and manage users with that login.

To run the CLI (container installation):

podman compose exec fittrackee ftcli users update <username> --set-role admin

To run the CLI (without container installation):

ftcli users update <username> --set-role admin

To create users:

ftcli users create --password <password> --lang en --email xxx@mydomain.com myuser

To set an user as admin:

ftcli users update myuser --set-admin true

You can also disable user registration from the admin panel in the web 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:

fittrackee
/var/log/fittrackee/* {
    missingok
    notifempty
}

Sending emails

Work in progress.

Updates for non-container install

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 here.

There is no containerized version, so you need to install on bare metal.

setup for container-based Fittrackee installation

Garmin integration uses Python, so check out PIP on Gentoo page to enable virtual environments and PIP for the fittrackee user.

Only if you have done a Fittrackee containerized installation, do the following:

python -m venv venv_ft
source venv_ft/bin/activate

and enable it in fittrackee' user .bashrc, as a reference:

.bashrc
(only last lines shown)
export PATH=$PATH:~/.local/bin
source venv_ft/bin/activate
source .env

bridge installation

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, you 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

Link to Garmin:

 garmin2fittrackee sync

You will need to provide your garmin credentials for login.

And, last, connect to FitTrackee:

garmin2fittrackee setup fittrackee --client-id <the client ID above> --client-secret <the secret above> --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:

sync_garmin.sh
#!/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

This website uses technical cookies only. No information is shared with anybody or used in any way but provide the website in your browser.

More information