Nyílt forráskódú GPX útvonaltervező és edzésnapló kerékpárosoknak és gyalogosoknak. Böngészőben fut, Docker Compose-zal telepíthető – tervezés, elemzés, könyvtár, valamint Strava és Garmin Connect szinkron egy helyen.
- Kattintással pontokat helyezhetsz el a térképen
- 4 tervezési mód: Aszfalt, Gravel, MTB, Túra (gyalogos)
- Útra illesztés BRouter segítségével – ha nem elérhető, egyenes vonalként jelenik meg
- Vegyes mód: szakaszonként eltérő tervezési mód egy útvonalon belül
- 7 térképstílus: Standard, Kerékpáros, Műholdas, Hybrid, Domborzat, Világos, Sötét
- Sötét és világos téma, automatikus rendszerfelismeréssel
- Waypoint közbeszúrás útvonalra kattintással
- Visszaút és oda-vissza tervezés
- Automatikus helynévadás Nominatim reverse geocoding alapján
- Drag and drop átrendezés
- Popup szerkesztő: pont neve, megjegyzés, törlés
- Az utolsó pont mindig célállomásként jelenik meg (sakk-tábla zászló)
- Marker húzás a térképen – cím automatikusan frissül
- GPX és FIT (Garmin / Wahoo / Bryton / Hammerhead) fájlok importálása
- Drag and drop bárhonnan a böngészőablakba
- Importált GPX-ből automatikusan kiszámított emelkedő és ereszkedő
- Sebesség, pulzus, kadencia és teljesítmény alapú útvonalszínezés
- Szintprofil, sebesség, pulzus, kadencia és teljesítmény diagramok
- Lejtőtérkép (vörös az emelkedő, zöld a süllyedés)
- Hover tooltip: pillanatnyi sebesség és magasság
- Sebesség, kadencia, teljesítmény zónák multi-sliderrel állíthatók (7 fogópont, 8 zóna)
- Pulzuszónák négy módszerrel: Karvonen, Max HR százalék, LTHR, vagy Egyedi BPM határok
- Max HR automatikus számítása Tanaka / Miller / klasszikus 220-kor képlettel, vagy egyedi érték
- Zónamodell: Friel (aszimmetrikus, Garmin / Strava / TrainingPeaks kompatibilis) vagy egyenlő sávok
- Egyenlő felosztás gomb minden zónaslideren a gyors reseteléshez
- Élő frissítés: drag közben a térkép és a jelmagyarázat azonnal újraszíneződik
- Két mód: egyszínű (minden diagramhoz külön szín választható) vagy zónaszín (a vonal szegmensenként a határértékek színeivel rajzolódik)
- 5 diagram konfigurálható: szintprofil, sebesség, pulzus, kadencia, teljesítmény
- Mentett útvonalak – tervezett útvonalak elmenthetők a szerverre, szerkeszthetők és visszatölthetők
- Edzések – elemzett GPX fájlok eredeti adatokkal menthetők, és FIT eredetű importálásnál az eredeti FIT bináris is megőrződik a könyvtárban
- Minták – beépített minta útvonalak (Balatoni kör 204 km, Tisza-tó kör 90 km)
- Kártyákon statisztikák: távolság, időtartam, emelkedő, FIT címke ha elérhető
- GPX és (ha van) FIT letöltés könyvtárból
- Forrás szerinti szűrés és jelölés a könyvtárban: Saját, Strava, Garmin, FIT – színes badge-ekkel
- Edzésenként állítható, hogy beleszámítson-e a statisztikákba
- Per-user Strava kapcsolat OAuth-tal: saját Strava app credentials (Client ID + Secret), csak olvasási jogosultság (
activity:read_all) – a Bringaterv semmit nem ír a Stravára - Aktivitások importálása a könyvtárba (a Strava streamekből GPX generálódik, HR / kadencia / teljesítmény adatokkal)
- Kötegelt import progress-barral, időszak- és darabszám-szűréssel
- Duplikátum-kezelés: „már importálva" / „korábban törölted" / „hasonló van" jelzés; törölt elem nem kerül újra-importra
- Importált edzés metaadatainak frissítése Stravából (kalória, Relative Effort, teljesítmény, HR, kadencia, helyszín, stb.)
- Beállítás: Beállítások → Strava kapcsolat
- Per-user kapcsolat email + jelszóval, kétlépcsős azonosítás (MFA) támogatással – a jelszót nem tároljuk, csak a belépési tokent (kb. 1 évig érvényes)
- Testsúly-szinkron az okosmérlegről (súly + testzsír%) → egy gombbal a kerékpáros profilba, ami a szél- és kalóriaszámítás bemenete
- Edzés-import: aktivitás-lista + GPX letöltés a könyvtárba (Garmin forrásszűrő és badge, cross-source duplikáció-jelzés a Strava/FIT elemekhez képest)
- Tervezett útvonal → Garmin course: a könyvtárból „Küldés Garminra" gombbal az útvonal Garmin Connect course-ként feltölthető navigációhoz; tartós „feltöltve" jelzés és közvetlen link a course-ra
- Önálló, moduláris felépítés (a feature külön be-/kikapcsolható, a
garminconnectcsomag nélkül a többi funkció zavartalanul fut) - Beállítás: Beállítások → Garmin Connect
- JWT autentikáció, per-user adatok és beállítások
- Admin panel felhasználókezelése: létrehozás, szerkesztés, jelszó-reset, kvóták, aktiválás / tiltás
- Útvonalak adminisztrálása: GPX vagy FIT letöltés, metaadatok inline szerkesztése, törlés, feltöltés admin részéről
- Per-user beállítások JSON fájlban:
/data/users/<uid>/settings.json(HR zónák, adatzónák, diagram színek, térképstílus, téma) - Minta útvonalak webes admin kezelése: feltöltés, szerkesztés, törlés a "Minta útvonalak" panelből; GPX előelemzés (távolság, emelkedő, Overpass útburkolat-szegmensek) feltöltéskor
- Bejelentkezés kikapcsolható (
LOGIN_ENABLED=falseszerveren belüli LAN használatra)
- Open-Meteo alapú szél- és időjárás-elemzés a tervezett útvonalra (7 napos órás bontású előrejelzés, kulcs nélküli ingyenes API)
- Szegmensenkénti hátszél / oldalszél / szembeszél dekompozíció + statisztika (százalék, km, átlagok)
- Térképszínezés szélirány szerint, kölcsönösen kizáró a szintprofil-térképszínezéssel
- Indulási idő picker (max +7 nap), átlagsebesség alapján szegmens-érkezési időre kéri le a szelet
- Szélhatás az időbecsléshez: kerékpáros profilból (tömeg, CdA, Crr) számolt teljesítmény + Newton-iteráció szegmensenként
- Beállítások: kerékpáros és kerékpár tömege, vezetési pozíció (CdA 0.32–0.65)
- Per-user mentés, használja a szélhatás-számítás
- Tervezésnél a sidebar waypoint listán megjelennek a szakaszonkénti távolságok
- Térképen minden 5 kilométernél kis jelölő a km-számmal
- Beállításokból kapcsolható útirány-nyilak (▲) a route mentén ~1.5 km-enként – hurkos pályánál segít látni a haladási irányt
- Teljes profil (beállítások + útvonalak + edzések) ZIP archívumba menthető a Beállítások panelből
- Visszaállítás két módban: Hozzáadás (új ID-kkel a meglévők mellé) vagy Teljes felülírás (eredeti ID-kkel, törli az aktuális adatokat)
- Admin felületről bármely felhasználó profilja menthető és visszaállítható
Böngésző
│
├── / (statikus frontend)
│ nginx konténer
│
└── /api/ (REST API proxy)
nginx → routes-api konténer (Flask)
│
routes-data volume (/data)
├── bringaterv.db ← SQLite (felhasználók, munkamenetek)
└── users/ ← per-user GPX könyvtárak
Két Docker konténer fut:
| Konténer | Kép | Feladat |
|---|---|---|
bringaterv |
ghcr.io/czdanika/bringaterv:latest |
nginx – statikus frontend |
routes-api |
ghcr.io/czdanika/bringaterv-api:latest |
Flask REST API – JWT auth, per-user GPX tárolás |
A routes-api konténer kívülről nem érhető el – csak az nginx-en keresztül, belső hálózaton kommunikál.
- Portainer → Stacks → Add Stack
- Stack neve:
bringaterv - Válaszd a Web editor fület
- Illeszd be az alábbi konfigurációt:
services:
bringaterv:
image: ghcr.io/czdanika/bringaterv:latest
ports:
- "8088:80"
environment:
LOGIN_ENABLED: true
depends_on:
- routes-api
networks:
- bringaterv-net
restart: unless-stopped
routes-api:
image: ghcr.io/czdanika/bringaterv-api:latest
environment:
SAMPLES_DIR: /samples
DB_PATH: /data/bringaterv.db
MULTI_DATA_DIR: /data/users
ADMIN_EMAIL: bringa # ← admin belépési email/felhasználónév
ADMIN_PASSWORD: terv # ← admin jelszó (változtasd meg!)
JWT_SECRET: valtozd_meg # ← kötelező megváltoztatni élesben!
volumes:
- routes-data:/data
networks:
- bringaterv-net
restart: unless-stopped
volumes:
routes-data:
networks:
bringaterv-net:
driver: bridge- Kattints a Deploy the stack gombra
Az alkalmazás elérhető: http://[szerver-ip]:8088
| Változó | Konténer | Leírás | Alapértelmezett |
|---|---|---|---|
LOGIN_ENABLED |
bringaterv | Bejelentkezés be/ki | true |
ADMIN_EMAIL |
routes-api | Admin felhasználónév / email | bringa |
ADMIN_PASSWORD |
routes-api | Admin jelszó | terv |
JWT_SECRET |
routes-api | JWT aláíró kulcs – élesben kötelező megváltoztatni! | change-me-please |
JWT_EXPIRY_DAYS |
routes-api | Token élettartama napban | 30 |
A bejelentkezési tokenek aláírására szolgál. Aki ismeri, érvényes tokent tud hamisítani bármely felhasználó (akár az admin) nevében, ezért éles üzemben kötelező sajátra cserélni.
- Formátum: hexadecimális string (csak
0–9ésa–f), így nincs benne speciális karakter, ami a docker-compose YAML-ben gondot okozna. - Hossz: legalább 32 byte = 64 hex karakter (256 bit). Az algoritmus HS256 (HMAC-SHA256), ehhez ez az ajánlott kulcsméret.
- Generálás:
openssl rand -hex 32Példa egy generált értékre (ne ezt használd – generálj sajátot):
JWT_SECRET=ed07db6c05dc7384047806ae33942d9a9dba203475784855a89b39cefeae84b5
A
JWT_SECRETmegváltoztatásakor minden korábban kiadott token érvénytelenné válik, így minden felhasználónak újra be kell jelentkeznie.
Ha új verzió jelent meg:
- Portainer → Stacks →
bringaterv - Kattints a Pull and redeploy gombra
Figyelem: A
routes-datavolume megmarad frissítéskor – a mentett útvonalak, edzések és felhasználói adatok nem vesznek el.
Ha az alkalmazásba be tudsz lépni, de az útvonalak / edzések mentése „Nem sikerült menteni" hibával meghiúsul:
a) Ellenőrizd, hogy az API elérhető-e:
Böngészőben nyisd meg: http://[szerver-ip]:8088/api/health
Helyes válasz: {"ok": true}
b) Nézd meg az API naplóját Portainerben:
Portainer → Containers → bringaterv_routes-api_1 → Logs
Keress PermissionError, OSError vagy 500 sort.
c) Teszteld az írási jogot:
Portainer → Containers → bringaterv_routes-api_1 → Console → Exec
touch /data/users/test.txt && echo "ÍRHATÓ" || echo "NEM ÍRHATÓ"Ha NEM ÍRHATÓ, a volume nem írható a konténer számára. Megoldás: Portainer → Volumes → töröld a bringaterv_routes-data volume-ot, majd deployold újra a stacket. (Csak akkor, ha még nincs benne fontos adat – friss telepítésnél ez biztonságos.)
d) Frissítsd az image-et:
Portainer → Stacks → bringaterv → Editor → alul: Pull and redeploy
Ha a Pull and redeploy nem érhető el, manuálisan:
docker pull ghcr.io/czdanika/bringaterv-api:latest
docker pull ghcr.io/czdanika/bringaterv:latestMajd Portainer → Stacks → bringaterv → Stop → Start.
Ha nincs Portainer, a NAS-on SSH-n keresztül:
# 1. Mappát létrehozni
mkdir -p /volume1/docker/bringaterv
cd /volume1/docker/bringaterv
# 2. docker-compose.yml letöltése a GitHub-ról
curl -o docker-compose.yml \
"https://raw.githubusercontent.com/czdanika/bringaterv/main/docker-compose-nas.yml"
# 3. Indítás (a volume és hálózat automatikusan létrejön)
docker compose pull
docker compose up -dcd /volume1/docker/bringaterv
docker compose pull
docker compose up -dBármilyen Linux gépen (Ubuntu, Debian, Raspberry Pi OS) működik, ahol fut a Docker.
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp dockermkdir -p ~/bringaterv
cd ~/bringaterv
curl -o docker-compose.yml \
"https://raw.githubusercontent.com/czdanika/bringaterv/main/docker-compose-nas.yml"
docker compose pull
docker compose up -dAz alkalmazás elérhető: http://[eszköz-ip]:8088
Raspberry Pi-n az IP-cím lekérdezése:
hostname -I
A letöltött docker-compose.yml tartalma — itt módosítható a jelszó és a port:
services:
bringaterv:
image: ghcr.io/czdanika/bringaterv:latest
ports:
- "8088:80" # bal oldal: külső port (ezt változtasd, ha kell)
environment:
LOGIN_ENABLED: true
depends_on:
- routes-api
networks:
- bringaterv-net
restart: unless-stopped
routes-api:
image: ghcr.io/czdanika/bringaterv-api:latest
environment:
SAMPLES_DIR: /samples
DB_PATH: /data/bringaterv.db
MULTI_DATA_DIR: /data/users
ADMIN_EMAIL: bringa # ← admin felhasználónév
ADMIN_PASSWORD: terv # ← ezt érdemes megváltoztatni!
JWT_SECRET: valtozd_meg # ← kötelező megváltoztatni élesben!
volumes:
- routes-data:/data
networks:
- bringaterv-net
restart: unless-stopped
volumes:
routes-data:
networks:
bringaterv-net:
driver: bridgeA restart: unless-stopped alapból be van kapcsolva a compose fájlban, így újraindítás után automatikusan elindul.
Ellenőrzés:
docker compose pscd ~/bringaterv
docker compose pull
docker compose up -dAdatok megmaradnak – a
routes-dataDocker volume frissítéskor nem törlődik.
git clone https://github.com/czdanika/bringaterv.git
cd bringaterv
docker compose up -d --buildAz alkalmazás elérhető: http://localhost:8088
MIT License – szabad felhasználás, módosítás és terjesztés.
Készítette: @czdanika · © Czibolya Dániel 2026


