Aplikacja dla fanów fotografii motoryzacyjnej (i nie tylko), która pozwala na udostepnianie lokalizacji (spotów) do robienia zdjęć.
DEMO: https://spotspotter.azurewebsites.net/login
Do stworzenia aplikacji serwerowej wykorzystany został framework NestJS
.
Aplikacja frontendowa używa natomiast biblioteki React
. Próba zabawy z frameworkiem NextJS
zakończyły się niestety niepowodzeniem.
W przypadku obu elementów jako główny język używany jest Typescript.
Aplikacja deployowana jest na chmurę Microsoft Azure przy pomocy Github Actions.
├── azure/ # zrzuty ekranu z konfiguracji Azure
├── preview/ # zrzuty ekranu z aplikacji
├── client/ # kod zawierający część kliencką aplikacji
│ ├── public/ # pliki statyczne (np. favicon, index.html)
│ ├── package.json # zależności części klienckiej
│ ├── src/ # folder z plikami źródłowymi części klienckiej
│ │ ├── api/ # pliki dotyczące naszego połączenia z API serwerowym
│ │ ├── azure/ # pliki konfiguracyjne Azure
│ │ ├── containers/ # kontenery aplikacji trzymające stan
│ │ ├── components/ # komponenty
│ │ ├── layouts/ # layouty aplikacji pozwalające na łatwe dodawanie nowych stron
│ │ ├── pages/ # ekrany/podstrony aplikacji
│ │ ├── styles/ # globalne style aplikacji
│ │ ├── types/ # typy wykorzystane w aplikacji
│ │ └── App.tsx # punkt startowy aplikacji
│ │
│ └── # dodatkowe pliki konfiguracyjne React, Typescript
│
├── src/ # kod zawierający część serwerową aplikacji
│ ├── location/ # moduł dotyczący lokalizacji
│ └── main.ts # moduł główny aplikacji serwerowej
│
├── README.md # krótka dokumentacja projektu
├── package.json # zależności części serwerowej
└── .github/workflows # pliki dot. pipeline'u
Strona, na której możemy zobaczyć logo aplikacji oraz zalogować się do niej za pomocą konta Microsoft (Azure AD).
Logo aplikacji dostarczone jest za pomocą Azure Blob Storage
.
Na stronie głównej możemy zobaczyć dwa główne elementy aplikacji - mapa będąca tłem oraz interfejsem do zarządzania lokalizacjami oraz modal z listą zapisanych wcześniej lokalizacji. Na tym ekranie dostajemy podstawowe informacje o lokalizacji, takie jak nazwa i adres.
TBA: Dodatkowo możemy zobaczyć liczbę zdjęć, które zostały dodane do danej lokalizacji.
Strona pojedynczej lokalizacji przedstawia dokładny adres wraz z opisem danego miejsca, oprócz tego możemy zobaczyć lokalizację na mapie.
TBA: Możemy też zobaczyć zdjęcia dodane do danej lokalizacji.
Klikając w jakieś miejsce na mapie otwieramy stronę tworzenia nowej lokalizacji. Możemy tam podać nazwę, opis oraz adres. Dokłade koordynaty są przesyłane przez samą mapę.
TBA: Dodatkowo możemy dodać zdjęcia do danej lokalizacji.
Na rzecz projektu utworzyłem specjalną grupę zasobów o nazwie spotspotter-resources
. W niej umieszczone zostały wykorzystane komponenty:
Na wykorzystane komponenty w projekcie składa się:
- App Service (w tym deployment sloty na staging i production)
- Azure Cosmos DB
- Storage account (Blob Storage)
- Monitoring:
- Application Insights
- Metryki
- Alerty
Jedyny komponent, który został umieszczony w ramach innej grupy zasobów oraz w ramach innej subskrypcji to Active Directory. Spowodowane jest to ograniczeniami nałożonymi przez organizację, w której znajduje się AGH'owe konto Azure:
- Active Directory
Po nierównej walce przeprowadzonej z frameworkiem NextJS, powróciłem do czystego Reacta. Oczywiście do hostowania aplikacji wykorzystałem usługę App Service
. W tym celu utworzyłem dwa deployment sloty - staging
oraz production
. Deploy aplikacji odbywa się automatycznie za pomocą GitHub Actions. Pliki yml dotyczące pipeline'u znajdują się w folderze .github/workflows
.
Wszystkie zmiany w kodzie aplikacji są wdrażane na slot staging
, a dopiero po jego przetestowaniu mogą po manualnym deployu trafić na production
.
Node'owa aplikacja stworzona za pomocą frameworka NestJS serwuje statyczne pliki zbudowane przez Reacta.
W bazie danych NoSQL Azure Cosmos DB przechowywane są dane o lokalizacjach. Składa się ona z jednego kontenera o nazwie locations
. W nim znajdziemy wszystkie dokumenty dotyczące lokalizacji zapisane w bazie.
Do przechowywania zdjęć wykorzystałem usługę Blob Storage
. Na ten moment utworzyłem kontener o nazwie public
.
W nim znajdują się podstawowe zdjęcia używane w aplikacji. W późniejszej fazie rozwoju prawdopodobnie dodam więcej kontenerów.
Do autoryzacji w aplikacji wykorzystałem usługę Active Directory
, ze specjalną konfiguracją przeznaczoną dla aplikacji typu SPA (np. React/Next.js).
W ramach monitoringu wykorzystałem kilka funkcjonalności oferowanych przez Azure:
Application Insights jest usługą, która zbiera informacje o działaniu aplikacji. W tym przypadku zbiera ona informacje o wyjątkach, które mogą wystąpić w aplikacji. Funkcjonalność ta jest aktualnie podpięta do aplikacji i przedstawia nam dane.
W ramach metryk wykorzystałem usługę Metrics
, która zbiera informacje o wydajności aplikacji.
W ramach alertów wykorzystałem usługę Alerts
, która pozwala na automatyczne wysyłanie maili w przypadku wystąpienia błędu w aplikacji. Stworzyłem dwie reguły:
- failed-server-requests - wysyła maila w przypadku wystąpienia większej liczby (> 5) nieudanych żądań do aplikacji,
- response-time-alert - wysyła alert w przypadku wystąpienia większej liczby żądań, które zajęły więcej niż 3 sekundy.