W dzisiejszym artykule chciałbym podzielić się doświadczeniami z tworzenia nowoczesnej aplikacji internetowej dla lokalnego wyzwania rowerowego Komornicka 100. Aplikacja ta łączy w sobie najnowsze technologie webowe, integrację z popularnymi serwisami sportowymi oraz zaawansowane mechanizmy weryfikacji tras. Jeśli zastanawiasz się, jak wykorzystać nowoczesne narzędzia programistyczne do stworzenia aplikacji sportowej, ten artykuł jest właśnie dla Ciebie.
Komornicka 100 to lokalne wyzwanie rowerowe organizowane przez klub sportowy Komorniki MTB Team. Uczestnicy mają za zadanie pokonać specjalnie wytyczone trasy rowerowe. Założeniem projektu było stworzenie aplikacji, która:
Przy projektowaniu aplikacji postawiliśmy na nowoczesne podejście wykorzystujące mikrousługi oraz techniki wdrażania CI/CD. Cała aplikacja została podzielona na kilka kluczowych komponentów:
Do stworzenia interfejsu użytkownika wykorzystaliśmy framework Next.js, który jest obecnie jednym z najpopularniejszych narzędzi do tworzenia aplikacji React. Next.js oferuje:
W aplikacji Komornicka 100 szczególnie cenne okazało się wsparcie dla PWA. Dzięki temu użytkownicy mogą “zainstalować” aplikację na swoich telefonach i korzystać z niej nawet przy ograniczonym dostępie do internetu - co jest szczególnie ważne podczas jazdy rowerem w terenie.
Sercem naszej aplikacji jest API zbudowane przy użyciu frameworka FastAPI. To stosunkowo nowe narzędzie do tworzenia API w Pythonie, które zdobyło ogromną popularność dzięki:
FastAPI świetnie sprawdza się w aplikacjach, które wymagają przetwarzania dużej ilości danych. W naszym przypadku, musieliśmy analizować dane GPS z aktywności uczestników i porównywać je z wzorcowymi trasami, co wymagało wydajnego przetwarzania.
@router.get("/activities/leaderboard")
async def get_leaderboard(db: Session = Depends(get_db)):
"""Pobierz ranking uczestników według liczby zaliczonych aktywności"""
return get_leaderboard_data(db)
Całość aplikacji zabezpieczona jest przez serwer Nginx, który działa jako:
Implementacja Nginx jako API Gateway zapewnia dodatkową warstwę bezpieczeństwa, umożliwiając:
Bezpieczeństwo było jednym z priorytetów podczas tworzenia aplikacji. Poza standardowym zabezpieczeniem przez Nginx, wdrożyliśmy dodatkowe mechanizmy ochrony:
Nasza bramka API (API Gateway) została wyposażona w zaawansowane mechanizmy ochrony, takie jak:
Aby chronić system przed automatycznymi botami, wdrożyliśmy niewidoczne dla użytkownika mechanizmy ochrony formularzy:
Dzięki tym mechanizmom możemy identyfikować i blokować automatyczne próby rejestracji bez wprowadzania irytujących dla użytkowników zabezpieczeń typu CAPTCHA.
Wdrożyliśmy komplet nowoczesnych nagłówków bezpieczeństwa HTTP:
Dzięki tym zabezpieczeniom aplikacja uzyskała najwyższe oceny w testach bezpieczeństwa.
Dla poprawy wydajności i odciążenia głównego serwera, zaimplementowaliśmy własny system CDN (Content Delivery Network) oparty na lekkim serwerze HTTP:
Wszystkie statyczne zasoby aplikacji, takie jak:
zostały wydzielone na osobny serwer zoptymalizowany pod kątem szybkiego serwowania plików statycznych.
W zależności od typu pliku, system automatycznie stosuje różne zasady cachowania:
Takie podejście znacząco przyspiesza ładowanie aplikacji dla powracających użytkowników i zmniejsza obciążenie głównego serwera.
System CDN został skonfigurowany z obsługą wszystkich potrzebnych typów plików, w tym:
To zapewnia prawidłowe wyświetlanie i pobieranie wszystkich typów zasobów przez użytkowników.
Aby zapewnić dobrą komunikację z uczestnikami, stworzyliśmy:
Szczególnie wartym uwagi elementem jest system webhooków, który umożliwia organizatorom otrzymywanie natychmiastowych powiadomień o kluczowych zdarzeniach w aplikacji. System obsługuje szereg różnych typów zdarzeń:
Wszystkie webhoki wysyłają dane w ustandaryzowanym formacie JSON, zawierającym szczegółowe informacje o zdarzeniu, co pozwala organizatorom na łatwą integrację z własnymi systemami. Dzięki temu organizatorzy mogą na przykład:
Mechanizm webhooków może być również wykorzystany do automatyzacji procesów organizacyjnych lub nawet integracji z fizycznymi systemami (np. wyświetlanie aktualnych liderów na tablicach LED podczas imprez sportowych).
Największym wyzwaniem technicznym było stworzenie systemu, który automatycznie weryfikowałby, czy uczestnik faktycznie przejechał wyznaczoną trasę. W tym celu opracowaliśmy zaawansowany algorytm, który:
Szczególnie ciekawym elementem jest system wykrywania prób oszustwa. W świecie zawodów sportowych zawsze znajdą się osoby próbujące zdobyć przewagę w nieuczciwy sposób. Nasz system analizuje:
To zaawansowane podejście analityczne pozwala na utrzymanie uczciwej rywalizacji, jednocześnie dopuszczając naturalne odchylenia podczas normalnej jazdy.
Integracja z platformą Strava była jednym z najważniejszych elementów aplikacji. Strava to popularna platforma dla sportowców, która umożliwia rejestrowanie i analizowanie aktywności fizycznych, szczególnie popularnych wśród rowerzystów.
Integracja obejmowała:
Szczególnie istotne było zapewnienie płynnego procesu autoryzacji na urządzeniach mobilnych, gdzie zaimplementowaliśmy specjalne mechanizmy obsługi przekierowań.
Ważnym aspektem projektu było przygotowanie aplikacji jako Progressive Web App (PWA). Ta technologia pozwala na:
Dla uczestników wyzwania rowerowego możliwość korzystania z aplikacji nawet przy słabym zasięgu sieci komórkowej jest nieoceniona, szczególnie na terenach leśnych czy oddalonych od miast.
Jednym z kluczowych aspektów rozwoju aplikacji była jej wydajność. Wykorzystaliśmy narzędzie Lighthouse zintegrowane z przeglądarką Chrome, aby stale monitorować i optymalizować wydajność aplikacji.
Nasze wyniki Lighthouse są imponujące:
Osiągnięcie tak wysokich wyników wymagało systematycznej pracy nad wieloma aspektami aplikacji:
Kluczowe metryki wydajnościowe, które udało nam się zoptymalizować:
Lighthouse wskazał kilka potencjalnych obszarów do dalszej optymalizacji:
Z wynikiem 96/100 nasza aplikacja spełnia większość wymogów dostępności. Główne obszary, które zapewniliśmy:
Perfekcyjny wynik 100/100 w obu tych kategoriach oznacza, że aplikacja jest zgodna z najlepszymi praktykami programistycznymi i zoptymalizowana pod kątem wyszukiwarek.
Do osiągnięcia tych wyników przyczyniło się:
Aplikacja została zaprojektowana z myślą o użytkownikach polskojęzycznych, ale zaimplementowaliśmy również pełne wsparcie dla języka angielskiego. Wszystkie treści, emaile i powiadomienia są dostępne w obu językach, co czyni aplikację bardziej dostępną dla międzynarodowych uczestników.
Podczas tworzenia aplikacji napotkaliśmy kilka istotnych wyzwań:
Jednym z najbardziej frustrujących problemów dla użytkowników było “zamrożenie” procesu autoryzacji Strava na urządzeniach mobilnych. Problem polegał na tym, że po przyznaniu uprawnień w aplikacji Strava, użytkownik nie był prawidłowo przekierowywany z powrotem do naszej aplikacji.
Rozwiązaliśmy ten problem poprzez:
Innym wyzwaniem była wydajna obsługa i porównywanie dużych plików GPX, które mogą zawierać tysiące punktów. Nasze rozwiązanie obejmowało:
Aplikacja została wdrożona z wykorzystaniem kontenerów Docker, co zapewnia:
Cała infrastruktura jest definiowana jako kod (Infrastructure as Code), co umożliwia szybkie odtworzenie środowiska w przypadku awarii lub potrzeby migracji.
Tworzenie aplikacji Komornicka 100 było fascynującym projektem, który pozwolił nam wykorzystać najnowsze technologie webowe w praktycznym zastosowaniu. Najważniejsze wnioski:
W kolejnych wersjach aplikacji planujemy:
Projekt Komornicka 100 pokazuje, jak nowoczesne technologie webowe mogą być wykorzystane do tworzenia funkcjonalnych aplikacji sportowych. Połączenie frontendu opartego na Next.js, backendu w FastAPI oraz zabezpieczeń Nginx pozwoliło na stworzenie wydajnej, bezpiecznej i przyjaznej dla użytkowników aplikacji.
Jeśli jesteś organizatorem zawodów sportowych lub myślisz o stworzeniu podobnej aplikacji, zachęcamy do rozważenia podobnego stosu technologicznego. Nowoczesne frameworki znacząco przyspieszają rozwój i pozwalają skupić się na funkcjonalnościach, a nie na rozwiązywaniu problemów technicznych.
A jeżeli jesteś entuzjastą kolarstwa z okolic Poznania - zapraszamy do udziału w wyzwaniu Komornicka 100!
Oficjalny start wydarzenia: 1 czerwca 2025 r.
Autor: Paweł Rosół