Önálló Laboratórium Terv: MotoRun Backend Migráció Önálló Laboratórium Terv: MotoRun Backend Migráció

Önálló Laboratórium Terv: MotoRun Backend Migráció

Önálló Laboratórium Féléves Terv

Téma: Versenyadminisztrációs rendszer migrációja BaaS környezetből Cloud-Native Spring alapokra
Hallgató: Nagy Benedek (Szoftverfejlesztés/IIT specializáció)
Konzulens: Imre Gábor
Félév: 2025/26 Tavasz


1. Bevezető és a projekt háttere

A MotoRun egy saját fejlesztésű, élesben használt Android alkalmazás (Kotlin, Jetpack Compose), amely a Silkolene motoRun motoros tájékozódási verseny-sorozat adminisztrációját támogatja. A rendszer évente kb. 4 versenynapon kerül bevetésre, ahol a pontőrök az ellenőrzőpontokon rögzítik a versenyzők áthaladását, és az adatokat valós időben szinkronizálják a szervezőkkel. A versenyek rendszerint olyan terepen zajlanak, ahol a mobilnet-lefedettség szórványos vagy teljesen hiányzik, ezért az alkalmazás strict offline-first elven működik.

A backend jelenleg Firebase Authentication és Firestore - ez a BaaS megoldás induláskor jól szolgált, de az alkalmazás kinőtte:

  • A Firestore árazási modellje miatt kliensoldalon rate limitinget kellett bevezetnem, ami perces szinkronizációs késéseket okoz.
  • Üzleti logika kizárólag a klienseken fut, mert a Firestore önmagában csak adattárolásra képes.
  • Nincs szerveroldali source of truth - ha több szervezői eszköz párhuzamosan módosít, a konfliktusfeloldás esetleges.
  • Samsung eszközökön a NET_CAPABILITY_VALIDATED megbízhatatlan, ami az offline/online állapot detektálásánál okoz gondot.

2. A félév célkitűzései

A célom a teljes Firebase backend leváltása saját fejlesztésű, cloud-native Spring Boot monolith architektúrára. A meglévő Android kliens offline-first logikáját (Room) érintetlenül hagyom - kizárólag a remote sync réteget cserélem le.

A fókusz egyértelműen a backend, de a feladat magában foglalja a kliensoldalon a Firebase SDK-k kivezetését és a Retrofit + WebSocket integráció megvalósítását is.

A fejlesztésnek július 2-ra (az idei 1. versenynap) production-ready állapotba kell kerülnie. A fejlesztés alatt a production környezet továbbra is Firebase-en marad; az átállás egy clean cutover lesz, amikor a teljes rendszer tesztelten működőképes.

Kitekintés: A rendszert úgy tervezem, hogy a BSc szakdolgozat keretében továbbfejleszthető legyen (web admin felület, analitika, multi-datacenter replikáció) architektúra-módosítás nélkül.

3. Tervezett Architektúra

A rendszer egy Spring Boot alkalmazásból, egy PostgreSQL adatbázisból és a meglévő Android kliensből áll. Az alkalmazás Spring Modulith alapon tagolt: auth és entry modul, közös konfiguráció és infrastruktúra réteg.

Auth modul - A Firebase Auth leváltása. JWT alapú autentikáció (access + refresh token), RBAC (CHECKPOINT, ORGANIZER, ADMIN szerepkörök), felhasználókezelés (CRUD). Jelszavak BCrypt hashsel tárolva. Spring Security filter chain érvényesíti a JWT validációt és a CORS szabályokat.

Entry modul - A Firestore leváltása. Entry CRUD REST API-val, szerveroldali validáció, optimistic locking alapú konfliktusfeloldás, és STOMP over WebSocket valós idejű broadcast. Az adatokat PostgreSQL tárolja, a séma verziókezelést Liquibase végzi. Az auditáláshoz Hibernate Envers infrastruktúra kerül beépítésre (a rollback UI a szakdolgozat scope-ja).

Android kliens - A Room alapú offline-first működés változatlan marad. A Firebase SDK-kat Retrofit (REST) és egy STOMP kliens váltja le. A hálózat-elérhetőséget a Spring Boot Actuator health endpoint validálja, kiváltva az OS-szintű detektálást.

Infrastruktúra - Docker Compose, GitHub Actions CI/CD, Spring Boot 4.0.3, Java 25, Gradle Kotlin DSL, Micrometer metrikák -> Prometheus -> Grafana.

4. Főbb technikai kihívások

Offline-first sync és konfliktuskezelés - A pontőrök eszközei órákig offline lehetnek. Visszacsatlakozáskor a felhalmozott bejegyzéseket bulk push/pull-al szinkronizálom. A szerver optimistic locking (version mező) alapján autoritatívan dönt a konfliktusokról. Ez a jelenlegi kliensoldali konfliktusfeloldást váltja le.

Valós idejű adatszórás - A polling alapú Firestore sync-et STOMP WebSocket broadcast váltja fel. A szervező a verseny közben késleltetés nélkül látja az összes ellenőrzőpont adatát, a pontőrök pedig a saját és szomszédos checkpointjaikat. Ha a WebSocket integráció (Krossbow library) váratlan problémákat okozna, fallback-ként polling-alapú REST sync is használható.

Adatbázis séma verziókezelés - A Firestore dokumentum-modelltől relációs sémára váltok. A Liquibase changelog-first megközelítés biztosítja a migrációk reprodukálhatóságát és rollback képességét.

Hálózat-detektálás - A Samsung-specifikus NET_CAPABILITY_VALIDATED bug miatt az OS-szintű hálózatfigyelés nem elég megbízható. Bejelentkezés előtt a health check endpoint aktív pollinggal validálja a szerver elérhetőségét; bejelentkezés után a STOMP WebSocket connection state veszi át ezt a szerepet.


5. Ütemterv (10 hét)

Az ütemtervet úgy terveztem, hogy a 10. hét végére (április 26.) a teljes rendszer funkcionálisan kész legyen. Az ezt követő ~10 hét a július 2-ai versenynapig hardening, tesztelés és prezentáció-előkészítés. Az első hetekre terhelem a backend fejlesztést, mert ott nincs Android-függőség és egységekben is jól tesztelhető.

  • 1. hét (Febr. 16 – 22.) - Projekt scaffolding, követelmények és architektúra véglegesítése. Spring Boot alkalmazás skeleton generálása Spring Initializr-rel (auth + entry modul csomagstruktúrával). Docker Compose környezet (PostgreSQL + alkalmazás + Prometheus + Grafana), Liquibase alapsémák (users, entries, refresh_sessions).

  • 2. hét (Febr. 23 – Márc. 1.) - CI/CD és megfigyelhetőség. GitHub Actions workflow (build, teszt, Docker image push, autodeploy). Micrometer metrikák bekötése, Prometheus scrape konfiguráció, Grafana dashboard alap (JVM, HTTP, DB connection pool). Spring Boot Actuator health endpoint konfigurálása.

  • 3. hét (Márc. 2 – 8.) - Auth modul teljes implementáció: felhasználó CRUD, BCrypt jelszókezelés, JWT access/refresh token generálás és validálás, refresh token rotation, RBAC. Spring Security filter chain és CORS konfiguráció.

  • 4. hét (Márc. 9 – 15.) - Entry modul REST API: Entry CRUD végpontok, DTO mapping, szerveroldali validációk (kilométeróra delta ellenőrzés, soft delete), year-scoped resource path-ok (/api/v1/entries/{year}).

  • 5. hét (Márc. 16 – 22.) - Szinkronizációs réteg: bulk push/pull endpointok, optimistic locking alapú konfliktusfeloldás, determinisztikus conflict response-ok. Hibernate Envers audit infrastruktúra beépítése.

  • 6. hét (Márc. 23 – 29.) - STOMP over WebSocket integráció az entry modulban. Topic-ok kialakítása (/topic/entries/{year}/{date}, /topic/entries/{year}/{date}/{checkpointId}), broadcast minden sikeres write után, subscription szintű RBAC.

  • 7. hét (Márc. 30 – Ápr. 5.) - Android kliens: Firebase Auth kivezetése. Retrofit hálózati réteg beépítése, JWT token management (OkHttp Interceptor, automatikus refresh), login flow átírása.

  • 8. hét (Ápr. 6 – 12.) - Android kliens: Firestore SDK kivezetése. A Room adatbázis és az új REST sync réteg összekötése, offline entry queue kezelése, bulk sync logika implementálása.

  • 9. hét (Ápr. 13 – 19.) - Android kliens: STOMP kliens (Krossbow) integrálása a valós idejű frissítésekhez. Health check alapú hálózatfigyelés implementálása (pre-auth polling, post-auth WebSocket state).

  • 10. hét (Ápr. 20 – 26.) - End-to-end integrációs tesztelés: teljes flow (offline rögzítés → visszacsatlakozás → sync → konfliktusfeloldás → broadcast) több szimulált eszközzel. Dokumentáció: Önálló Lab beszámoló. Utolsó hibajavítások.

Az április 26. utáni heteket az ütemtervben nem jelölöm külön - ez a tartalék a július 2-ai versenynapig a stabilitási tesztelésre, az éles környezet beüzemelésére és a prezentáció előkészítésére szolgál.


Vissza a bloghoz