Přeskočit obsah

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:

DISPATCHER_GOOGLE_MAPS_API_KEY=AIza...
PAS_GOOGLE_MAPS_API_KEY=AIza...

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