This is a fork of zwiftrunalyze from pnposch. I fixed some bugs.
The original program was not working for me.
Download FIT files from Zwift or MyWhoosh and upload to runanalyze. Simple as that.
Zwift and MyWhoosh are popular virtual reality worlds for cyclists and runners.
Runalyze is a privacy-friendly training log with extensive functionality (and its free!)
Install requirements with:
pip install -r requirements.txt
to include the few other (standard) packages needed.
or include the few other (standard) packages needed:
pip install -r requirements.txt
-
add data directory to your folder
mkdir data
-
Rename
zrconfig.py.example
tozrconfig.py
and proceed to config (no worries only three infos needed)
Add your zwift username, zwift password and obtain a token for runanalyze (https://runalyze.com/settings/personal-api) and entere it too in the header of main.py and you are good to go.
FIT files are downloaded into /data and pushed to runanalyze, once downloaded there are not requested a second time. Furthermore Zwift info is saved in a JSON file.
Use Docker Image with local mounts of data/ and zrconfig.py/
docker-compose up -d --build
To recreate the image
docker-compose up -d --build --force-recreate
Then start zwift import with
docker exec zwiftrunalyze_app_1 python3 main.py
or MyWhoosh import with
docker exec zwiftrunalyze_app_1 python3 mywhoosh.py
which can be added to the host system's crontab
crontab -e
e.g. run every evening at 22:30h:
30 22 * * * docker exec zwiftrunalyze_app_1 python3 main.py
Simple:
python3 main.py
or
python3 mywhoosh.py
Make the file executable:
chmod +x main.py
and
./main.py
.
Optional argument: Download only after date:
python3 main.py YYYY.MM.DD
will skip any zwift acitivies ended before YYYY-MM-DD s
Um einen Python REST-Service mit Docker Compose zu hosten, kannst du die folgenden Schritte ausführen. Wir verwenden ein einfaches Beispiel mit Flask, um den Prozess zu demonstrieren.
Erstelle ein Verzeichnis für dein Projekt und lege die folgenden Dateien an:
my_flask_app/
├── app.py
├── requirements.txt
└── docker-compose.yml
app.py
:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/items', methods=['GET'])
def get_items():
return jsonify({"items": ["item1", "item2", "item3"]})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5005)
requirements.txt
:
Flask==2.0.3
docker-compose.yml
:
version: '3.8'
services:
web:
build: .
ports:
- "5005:5005"
Erstelle eine Datei mit dem Namen Dockerfile
im gleichen Verzeichnis:
Dockerfile
:
# Basis-Image
FROM python:3.9-slim
# Arbeitsverzeichnis setzen
WORKDIR /app
# Anforderungen installieren
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Anwendung kopieren
COPY app.py app.py
# Anwendung starten
CMD ["python", "app.py"]
Navigiere in dein Projektverzeichnis my_flask_app
und führe den folgenden Befehl aus:
docker-compose up --build
--build
: Baut die Images neu, falls Änderungen vorgenommen wurden.
Sobald der Container läuft, kannst du den REST-Service testen, indem du im Browser oder mit einem Tool wie curl
oder Postman auf die URL zugreifst:
curl http://localhost:5005/items
Um die Anwendung zu stoppen, kannst du im Terminal Ctrl + C
drücken oder den folgenden Befehl ausführen:
docker-compose down
Mit diesen Schritten hast du einen Python REST-Service mit Docker Compose erfolgreich gehostet. Du kannst die Anwendung weiter anpassen, zusätzliche Dienste hinzufügen oder die Konfiguration nach Bedarf erweitern. Wenn du Fragen hast oder Unterstützung benötigst, lass es mich wissen!