CITYA - Architektura¶
Přehled architektury dispečerského systému CITYA pro taxi služby a dopravu na zavolání.
Přehled systému¶
CITYA je komplexní platforma pro správu taxi služeb, která zahrnuje:
- Dispatcher - webová aplikace pro dispečery
- Passenger App - mobilní aplikace pro cestující
- Driver App - mobilní aplikace pro řidiče
- Backend API - centrální API server
graph TB
subgraph "Frontend aplikace"
D[Dispatcher<br/>Vue.js/Quasar]
PA[Passenger App<br/>Flutter]
DA[Driver App<br/>Flutter]
end
subgraph "Backend"
API[API Server<br/>.NET 8]
WS[SignalR Hub<br/>WebSocket]
end
subgraph "Databáze"
PG[(PostgreSQL 13<br/>+ PostGIS)]
RD[(Redis 7<br/>Cache)]
end
subgraph "Externí služby"
GM[Google Maps API]
CEDA[CEDA Geocoding]
GCS[Google Cloud Storage]
SMS[SMS Gateway<br/>Vonage/GoSMS]
STRIPE[Stripe<br/>Platby]
end
D --> API
D --> WS
PA --> API
PA --> WS
DA --> API
DA --> WS
API --> PG
API --> RD
API --> GM
API --> CEDA
API --> GCS
API --> SMS
API --> STRIPE
WS --> RD
Technologický stack¶
Backend¶
| Komponenta | Technologie | Verze |
|---|---|---|
| Runtime | .NET | 8.0 |
| Framework | ASP.NET Core | 8.0 |
| ORM | Entity Framework Core | 8.0 |
| Real-time | SignalR | 8.0 |
| Autentizace | JWT Bearer | - |
| Hashování hesel | BCrypt | $2a$ prefix |
Frontend - Dispatcher¶
| Komponenta | Technologie | Verze |
|---|---|---|
| Framework | Vue.js | 3.x |
| UI Framework | Quasar | 2.x |
| Jazyk | TypeScript | 5.x |
| Build tool | Vite | 6.x |
| State management | Pinia | 2.x |
| HTTP klient | Axios | - |
Mobilní aplikace¶
| Komponenta | Technologie |
|---|---|
| Framework | Flutter |
| Jazyk | Dart |
| Platformy | iOS, Android |
Infrastruktura¶
| Komponenta | Technologie | Verze |
|---|---|---|
| Databáze | PostgreSQL | 13 |
| GIS rozšíření | PostGIS | 3.x |
| Cache | Redis | 7.x |
| Reverse Proxy | Traefik | 3.x |
| Kontejnerizace | Docker | 24+ |
| Orchestrace | Docker Compose | 2.x |
Datový model¶
Hlavní entity¶
erDiagram
User ||--o{ GeoAreaUser : "přiřazen k"
GeoArea ||--o{ GeoAreaUser : "má uživatele"
GeoArea ||--o{ Ride : "obsahuje"
User ||--o{ Ride : "vytváří"
Driver ||--o{ Ride : "realizuje"
Vehicle ||--o{ Ride : "použito pro"
Shift ||--o{ Ride : "obsahuje"
Driver ||--o{ Shift : "pracuje"
User {
uuid Id PK
string Email
string PasswordHash
string FirstName
string LastName
string PhoneNumber
enum Role
int Status
datetime CreatedAt
}
GeoArea {
uuid Id PK
string Name
string Code
geometry Boundary
json Settings
}
Ride {
uuid Id PK
uuid AreaId FK
uuid DriverId FK
uuid VehicleId FK
point DepartureCoords
point ArrivalCoords
enum Status
datetime RequestedAt
datetime StartedAt
datetime FinishedAt
}
Driver {
uuid Id PK
string FirstName
string LastName
string PhoneNumber
string LicenseNumber
enum Status
}
Vehicle {
uuid Id PK
string LicensePlate
string Model
string Color
int Capacity
}
Shift {
uuid Id PK
uuid DriverId FK
uuid AreaId FK
datetime StartTime
datetime EndTime
enum Status
}
Klíčové tabulky¶
| Tabulka | Popis |
|---|---|
User | Uživatelé systému (dispečeři, admini) |
GeoArea | Geografické oblasti provozu |
GeoAreaUser | Vazba uživatelů na oblasti |
Ride | Jednotlivé jízdy |
RideBooking | Rezervace jízd |
Driver | Řidiči |
Vehicle | Vozidla |
Shift | Směny řidičů |
Company | Dopravní společnosti |
Geografická data¶
CITYA využívá PostGIS pro práci s geografickými daty:
- Oblasti (GeoArea) - polygony definující provozní zóny
- Souřadnice jízd - body odjezdu a příjezdu
- Pozice řidičů - real-time tracking
-- Příklad: Najít jízdy v oblasti
SELECT r.*
FROM "Ride" r
JOIN "GeoArea" a ON ST_Contains(a."Boundary", r."DepartureCoords")
WHERE a."Code" = PRAGUE;
API Architektura¶
Struktura endpointů¶
/api/v2/
├── auth/
│ ├── login POST - Přihlášení
│ └── refresh POST - Obnovení tokenu
├── areas/
│ ├── GET - Seznam oblastí
│ └── {id}/ - Detail oblasti
├── areas-secrets/
│ └── GET - API klíče pro oblast
├── rides/
│ ├── GET - Seznam jízd
│ ├── POST - Vytvoření jízdy
│ └── {id}/
│ ├── GET - Detail jízdy
│ ├── PUT - Aktualizace
│ └── cancel POST - Zrušení
├── drivers/
│ ├── GET - Seznam řidičů
│ └── {id}/status PUT - Změna stavu
├── shifts/
│ ├── GET - Seznam směn
│ └── POST - Vytvoření směny
└── reports/
└── GET - Reporty a statistiky
Autentizace¶
sequenceDiagram
participant C as Client
participant A as API
participant DB as Database
C->>A: POST /auth/login {email, password}
A->>DB: Najít uživatele
DB-->>A: User data
A->>A: Ověřit BCrypt hash
A->>A: Generovat JWT
A-->>C: {token, refreshToken, user}
Note over C,A: Následné requesty
C->>A: GET /api/rides<br/>Authorization: Bearer {token}
A->>A: Validovat JWT
A->>DB: Query data
DB-->>A: Rides
A-->>C: {rides: [...]}
CORS konfigurace¶
Pro správné fungování frontendu je nutná CORS konfigurace:
# Traefik middleware
headers:
accesscontrolallowmethods: GET,POST,PUT,DELETE,PATCH,OPTIONS
accesscontrolallowheaders: Content-Type,Authorization,X-Requested-With,Area,area,App,app
accesscontrolalloworiginlist: https://dispatcher.citya.io
accesscontrolallowcredentials: true
Real-time komunikace¶
SignalR Huby¶
CITYA používá SignalR pro real-time aktualizace:
graph LR
subgraph "Klienti"
D1[Dispatcher 1]
D2[Dispatcher 2]
DA[Driver App]
end
subgraph "SignalR Hub"
RH[RidesHub]
DH[DriversHub]
end
subgraph "Redis"
RB[Redis Backplane]
end
D1 <--> RH
D2 <--> RH
DA <--> DH
RH <--> RB
DH <--> RB
Události¶
| Hub | Událost | Popis |
|---|---|---|
| RidesHub | RideCreated | Nová jízda vytvořena |
| RidesHub | RideUpdated | Stav jízdy změněn |
| RidesHub | RideCanceled | Jízda zrušena |
| DriversHub | DriverLocationUpdated | Pozice řidiče |
| DriversHub | DriverStatusChanged | Stav řidiče (online/offline) |
Externí služby¶
Google Maps API¶
Použití: - Zobrazení map v dispatcheru - Výpočet tras - Geocoding adres
Konfigurace:
CEDA Geocoding¶
Alternativní geocoding provider pro ČR: - Přesnější adresy v ČR - Konfigurovatelné per oblast
Google Cloud Storage¶
Buckety: | Bucket | Účel | |--------|------| | {tenant}-cdn | CDN pro statické soubory | | citya-revgeo-storage | Cache reverse geocoding | | {tenant}-area-features | GeoJSON features oblastí |
SMS Gateway¶
Podporovaní poskytovatelé: - Vonage - mezinárodní SMS - GoSMS - české SMS
Deployment¶
Prostředí¶
| Prostředí | URL | Účel |
|---|---|---|
| Development | localhost | Lokální vývoj |
| Stage | *.stage.citya.io | Testování |
| Production | *.citya.io | Produkce |
Docker Compose architektura¶
┌─────────────────────────────────────────────────────┐
│ Traefik │
│ (Reverse Proxy + SSL) │
├─────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Dispatcher │ │ Backend │ │
│ │ (nginx) │ │ (.NET) │ │
│ │ :80 │ │ :8080 │ │
│ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ │
│ │ PostgreSQL │ │ Redis │ │
│ │ + PostGIS │ │ │ │
│ │ :5432 │ │ :6379 │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘
Health checks¶
Každá služba implementuje health check endpoint:
| Služba | Endpoint | Metoda |
|---|---|---|
| Backend | /health | curl |
| Dispatcher | / | wget |
| PostgreSQL | pg_isready | CLI |
| Redis | redis-cli ping | CLI |
Bezpečnost¶
Autentizace a autorizace¶
- JWT tokeny s omezenou platností
- Role-based access control (Admin, Dispatcher, Driver)
- Area-based access - uživatelé vidí pouze přiřazené oblasti
Šifrování¶
- HTTPS pro veškerou komunikaci
- BCrypt pro hashování hesel
- TLS 1.3 pro databázová spojení
Secrets management¶
# Produkce - GCP Secret Manager
gcloud secrets versions access latest --secret=citya-production-main-secrets
# Lokální vývoj - .env soubory
.env.backend # API klíče a connection strings
Monitoring a logging¶
Logy¶
- Strukturované logování (JSON format)
- Log levels: Debug, Info, Warning, Error
- Correlation ID pro sledování requestů
Metriky¶
Doporučené metriky pro monitoring:
| Metrika | Popis |
|---|---|
rides_total | Celkový počet jízd |
rides_active | Aktivní jízdy |
drivers_online | Online řidiči |
api_request_duration | Latence API |
websocket_connections | Aktivní WS spojení |
Škálování¶
Horizontální škálování¶
- Backend - stateless, škálovatelný za load balancerem
- Redis - používán jako backplane pro SignalR
- PostgreSQL - read repliky pro reporting
Doporučení¶
| Komponenta | Škálování |
|---|---|
| Backend | 2-4 instance |
| Redis | Single instance + replika |
| PostgreSQL | Primary + Read replica |
| Dispatcher | CDN + single instance |
Další zdroje¶
- Lokální nasazení - Kompletní návod pro lokální deployment
- API dokumentace - Swagger/OpenAPI (připravuje se)
- Datový slovník - Detailní popis tabulek (připravuje se)