Skip to content

czdanika/bringaterv

Repository files navigation

Bringaterv

Bringaterv

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.

Elemzés – egymás alatti diagramok

Tervezés – útvonaltervező


Funkciók

Térképes tervezés

  • 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

Útvonalpontok kezelése

  • 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 elemzés

  • 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

Testreszabható zónák

  • 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

Diagram színek

  • 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

Útvonalkönyvtár

  • 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

Strava integráció

  • 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

Garmin Connect integráció

  • 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 garminconnect csomag nélkül a többi funkció zavartalanul fut)
  • Beállítás: Beállítások → Garmin Connect

Multi-user és admin panel

  • 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=false szerveren belüli LAN használatra)

Szélelemzés

  • 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

Kerékpáros profil

  • 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

Waypoint szakaszhosszok és km-jelölők

  • 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

Backup és visszaállítás

  • 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ó

Architektúra

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 telepítés (ajánlott)

1. Stack létrehozása

  1. Portainer → StacksAdd Stack
  2. Stack neve: bringaterv
  3. Válaszd a Web editor fület
  4. 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
  1. Kattints a Deploy the stack gombra

Az alkalmazás elérhető: http://[szerver-ip]:8088

2. Környezeti változók

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 JWT_SECRET beállítása

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 és a–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 32

Példa egy generált értékre (ne ezt használd – generálj sajátot):

JWT_SECRET=ed07db6c05dc7384047806ae33942d9a9dba203475784855a89b39cefeae84b5

A JWT_SECRET megváltoztatásakor minden korábban kiadott token érvénytelenné válik, így minden felhasználónak újra be kell jelentkeznie.

3. Frissítés új verzióra

Ha új verzió jelent meg:

  1. Portainer → Stacksbringaterv
  2. Kattints a Pull and redeploy gombra

Figyelem: A routes-data volume megmarad frissítéskor – a mentett útvonalak, edzések és felhasználói adatok nem vesznek el.

4. Hibaelhárítás – mentés nem működik

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:latest

Majd Portainer → Stacks → bringaterv → Stop → Start.


NAS / parancssoros telepítés

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 -d

Frissítés

cd /volume1/docker/bringaterv
docker compose pull
docker compose up -d

Linux / Raspberry Pi telepítés

Bármilyen Linux gépen (Ubuntu, Debian, Raspberry Pi OS) működik, ahol fut a Docker.

1. Docker telepítése (ha még nincs)

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

2. Bringaterv telepítése

mkdir -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 -d

Az alkalmazás elérhető: http://[eszköz-ip]:8088

Raspberry Pi-n az IP-cím lekérdezése: hostname -I

3. Környezeti változók (opcionális)

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: bridge

4. Automatikus indítás (rendszerindításkor)

A 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 ps

5. Frissítés

cd ~/bringaterv
docker compose pull
docker compose up -d

Adatok megmaradnak – a routes-data Docker volume frissítéskor nem törlődik.


Helyi fejlesztés

git clone https://github.com/czdanika/bringaterv.git
cd bringaterv
docker compose up -d --build

Az alkalmazás elérhető: http://localhost:8088


Licenc

MIT License – szabad felhasználás, módosítás és terjesztés.


Készítette: @czdanika · © Czibolya Dániel 2026

About

Browser-based cycling route planner. Plan routes with road snapping (BRouter), import GPX files with speed & heart rate heatmaps, export back to GPX. No backend, no login.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors