Software Architecture Document
Retinal CAD
Webová aplikace pro computer-assisted diagnostiku retinálních záznamů s využitím umělé inteligence
Verze 0.1
11. března 2026
1. Introduction
1.1 Purpose
Dokument obsahuje komplexní architektonický přehled systému Retinal CAD - webové aplikace pro počítačem podporovanou diagnostiku záznamů sítnice oka s využitím neuronových sítí. Dokument znázorňuje hlavní architektonické pohledy a reflektuje architektonická rozhodnutí, která byla v souvislosti s vývojem tohoto informačního systému učiněna v několika iteracích, s níchž poslední je zde prezentována.
Použita je šablona Rational Unified Process (RUP), konkrétně pro dokument o softwarové architektuře a obsahuje všechny potřebné pohledy, jak už use-case, logical, process, deployment nebo implementation. Nakonec je uvedena úvaha o výkonu a kvalitě.
1.2 Scope
Systém zahrnuje následující prvky:
- Webové rozhraní pro klinické lékaře a výzkumné pracovníky, které umožňuje nahrávat, prohlížet a analyzovat snímky očního pozadí.
- Počítačem podporovanou diagnostiku prostřednictvím klasifikace struktur sítnice pomocí neuronových sítí založených na umělé inteligenci.
- Správu pacientů a vedení diagnostických záznamů s řízením přístupu pro různé role.
- Administrativní rozhraní pro správu datových sad a datového skladu.
Systém se skládá ze tří nezávisle nasaditelných mikroslužeb. Frontendu SPA založeného na Reactu, backendu Python FastAPI a obrazové API služby Node.js. Všechny služby běží v Docker kontejnerech a jsou nasazeny na infrastruktuře AWS.
1.3 Definitions, Acronyms and Abbreviations
| Term | Definition |
| SAD | Software Architecture Document |
| SPA | Single Page Application - webová aplikace, která načte jednu HTML stránku a dynamicky přepisuje její obsah |
| PWA | Progressive Web App - webová aplikace, kterou lze nainstalovat na zařízení s možností práce v režimu offline |
| API | Application Programming Interface |
| REST | Representational State Transfer - architektonický styl pro distribuované hypermediální systémy |
| GraphQL | Dotazovací jazyk pro API a runtime pro provádění těchto dotazů |
| JWT | JSON Web Token - kompaktní způsob, který je bezpečný pro použití v URL adresách, k vyjádření nároků mezi stranami |
| OAuth2 | Otevřený standard pro delegování přístupu, používaný pro ověřování pomocí tokenů |
| ORM | Object-Relational Mapping - technika pro převod dat mezi relační databází a objektově orientovaným programovacím jazykem |
| UUID | Universally Unique Identifier - 128bitový identifikátor sloužící k identifikaci informací v počítačových systémech |
| CI/CD | Continuous Integration / Continuous Delivery - postup při vývoji softwaru |
| IaaS | Infrastructure as a Service - forma cloud computingu, která poskytuje přístup k výpočetním zdrojům na vyžádání |
| AWS | Amazon Web Services - a cloud computing platforma |
| ECR | Amazon Elastic Container Registry - spravovaná služba registru kontejnerů Docker |
| EC2 | Amazon Elastic Compute Cloud - webová služba poskytující škálovatelný výpočetní výkon |
| CAD | Počítačem podporovaná diagnostika |
| AI/ML | Umělá inteligence / Strojové učení |
| WSGI | Rozhraní brány webového serveru |
1.4 References
- FastAPI Documentation - https://fastapi.tiangolo.com/
- Strawberry GraphQL Documentation - https://strawberry.rocks/docs
- React Documentation - https://react.dev/
- SQLAlchemy 2.0 Documentation - https://docs.sqlalchemy.org/
- Alembic Documentation - https://alembic.sqlalchemy.org/
- Docker Documentation - https://docs.docker.com/
- AWS Lightsail Documentation - https://docs.aws.amazon.com/lightsail/
- AWS ECR Documentation - https://docs.aws.amazon.com/ecr/
- fastapi-users Documentation - https://fastapi-users.github.io/fastapi-users/
2. Architectural Representation
Dokument představuje architekturu systému Retinal CAD jako soubor pohledů v souladu s přístupem „4+1 View Model“ z Rational Unified Process (RUP):
- Use-case pohled - architektonicky významné případy užití, které definují chování systému.
- Logický pohled - klíčové návrhové balíčky, třídy a jejich uspořádání do vrstev.
- Procesní pohled - souběžné procesy, vlákna a jejich interakce.
- Pohled na nasazení - topologie fyzických uzlů a distribuce služeb v infrastruktuře AWS.
- Pohled na implementaci - organizace zdrojového kódu v rámci polyrepa GitLab.
- Pohled na data - model persistentních dat a schéma databáze.
Všechna architektonická rozhodnutí jsou modelována v notaci UML pomocí diagramů generovaných ze základního návrhového modelu. Systém je implementován jako architektura mikroslužeb se třemi nezávisle nasaditelnými službami komunikujícími přes HTTP.
3. Architectural Goals and Constraints
Klíčové požadavky a systémová omezení mající signifikantní vliv na architekturu:
3.1 Functional Constraints
- Systém musí podporovat tři odlišné uživatelské role – anonymního uživatele, ověřeného uživatele (lékaře/výzkumníka) a správce - z nichž každá má samostatnou sadu povolených operací.
- Klasifikace snímků sítnice pomocí modelu neuronové sítě musí být provedena automaticky po nahrání snímku; výsledky musí být uloženy společně se záznamem o snímku.
- Systém musí udržovat datový sklad kurátorovaných, označených snímků sítnice, který je oddělený od obecného úložiště snímků.
- Záznamy pacientů musí být přístupné bez ověření (anonymizovaný náhled), zatímco operace zápisu vyžadují ověření.
- Veškerý vzdálený přístup podléhá identifikaci uživatele prostřednictvím ověření pomocí tokenu JWT. Jako alternativní ověřovací mechanismus je podporován OAuth2 (např. Google).
3.2 Technical Constraints
- Frontend je implementován jako React SPA obsluhovaná serverem nginx. Musí být možné jej nainstalovat jako PWA pro lokální použití v režimu offline.
- Hlavní backendové API je implementováno v jazyce Python s využitím FastAPI (REST) a Strawberry (GraphQL). Koncové body REST i GraphQL musí být dostupné z jedné služby.
- Služba pro ukládání obrázků je implementována v Node.js s využitím Express. Obrázky jsou uloženy na disku a identifikovány pomocí UUID. Služba je zabezpečena ověřením pomocí API klíče předaného v hlavičkách požadavků.
- PostgreSQL je jedinou relační databází. Schéma databáze je spravováno prostřednictvím ORM SQLAlchemy a verzováno pomocí migrací Alembic.
- Všechny služby jsou kontejnerizovány pomocí Dockeru. Každá služba poskytuje soubor Dockerfile a compose.yml pro lokální vývoj a nasazení.
- Systém je nasazen na AWS: staging používá AWS Lightsail, produkce používá AWS EC2. Dockerové obrazy jsou uloženy v AWS ECR.
- CI/CD pipeline jsou implementovány pomocí GitLab CI/CD. Všechny tři služby jsou umístěny v samostatných GitLab repozitářích pod sdílenou skupinou (strategie polyrepo). Všechny testy jsou prováděny jako součást procesu sestavování Dockeru obrazu, jenž je následně pouze nacachován, díky čemuž jsou nezávislé na infrastruktuře.
3.3 Quality Constraints
- Dostupnost: Produkční prostředí musí být dostupné 24 hodin denně, 7 dní v týdnu. Iterace se řeší pomocí postupného nasazování (testování v testovacím prostředí před nasazením do produkce).
- Zabezpečení: Veškerá komunikace mezi službami při citlivých operacích musí být ověřena (SSL protokol). Pro uživatelské relace se používají tokeny JWT s časovým omezením platnosti.
- Přenositelnost: Služby jsou kontejnerizovány, což je činí přenositelnými napříč prostředími založenými na Linuxu. Jediným požadavkem na infrastrukturu je přítomnost Docker Engine.
- Rozšiřitelnost: Rozdělení na mikroslužby umožňuje jednotlivé služby nezávisle aktualizovat, škálovat nebo nahrazovat.
- Výkon: Inference AI na sítnicových snímcích musí být dokončena v rámci přijatelné latence pro klinické použití (cíl: méně než 10 sekund na snímek)
4. Use-Case View
Tento pohled představuje architektonicky významné případy užití. Popisuje soubor scénářů, které představují klíčové funkce, které mají hlavní architektonické pokrytí a představují co budoucí informační systém bude umět.
Systém definuje tři role uživatelů s následující hierarchií dědičnosti:
- Anonymní uživatel - neověřený návštěvník s přístupem pouze pro čtení k veřejným datům a analytickým nástrojům.
- Ověřený uživatel - zdědí všechny oprávnění anonymního uživatele a získá přístup pro zápis k osobním údajům a nástrojům umělé inteligence.
- Správce - zdědí všechna oprávnění ověřeného uživatele a získá plný přístup k správě systému.
4.1 Architecturally Significant Use Cases
4.2 Use Case Descriptions
4.2.1 UC1 - Registrace Uživatele
Actor: Anonymní uživatel.
Popis: Umožňuje neregistrovanému návštěvníkovi vytvořit nový účet zadáním přihlašovacích údajů (e-mail a heslo). Systém ověří zadané údaje, vytvoří uživatelský účet a odešle ověřovací e-mail. Po úspěšném ověření je uživateli přiřazena role „Ověřený uživatel“. Jako alternativní postup je podporována také registrace přes OAuth2 (např. prostřednictvím účtu Google).
Architektonický význam: Tento případ použití využívá subsystém ověřování (fastapi-users), mechanismus vydávání tokenů JWT, tabulku uživatelů PostgreSQL a integrační cestu OAuth2.
4.2.2 UC2 - Přihlášení Uživatele
Actor: Anonymní uživatel.
Popis: Umožňuje registrovanému uživateli ověřit se pomocí e-mailové adresy a hesla nebo prostřednictvím OAuth2. V případě úspěšného ověření je vrácen přístupový token JWT. Frontend bezpečně uloží JWT token a připojí jej k HTTP hlavičce následujících požadavkům na API.
Architektonický význam: Ukazuje mechanismus vydávání a ověřování JWT, postup výměny tokenů OAuth2 a strategii ověřování napříč službami.
4.2.3 UC9 - Nahrání snímků retiny
Actor: Přihlášený uživatel.
Popis: Umožňuje přihlášenému uživateli nahrát jeden nebo více snímků očního pozadí. Soubor se snímkem je z hlavního API předán službě Image API. Image API uloží soubor na disk pod názvem souboru tvořeným UUID a vrátí tento UUID. Hlavní API uloží metadata snímku (UUID, URL, identifikační číslo pacienta, strana oka, osoba, která soubor nahrála) do databáze PostgreSQL. Po úspěšném nahrání se automaticky spustí klasifikace pomocí umělé inteligence (viz UC8 – Klasifikace snímků retiny).
Relationship: Zahrnuje UC8 – Klasifikace snímků retiny
Architektonický význam: Toto je hlavní případ použití pro načítání dat. Testuje mezislužební HTTP komunikaci mezi hlavním API a API pro obrázky, ověřování pomocí API klíče v API pro obrázky a spouštění pipeline pro inferenci AI.
4.2.4 UC8 - Klasifikace snímků retiny
Actor: Systém (spustí se automaticky při nahrání).
Popis: Po úspěšném nahrání snímku zařadí hlavní API do fronty úkol umělé inteligence zaměřený na klasifikaci. Model neuronové sítě analyzuje snímek sítnice a vrátí výsledek klasifikace spolu s hodnocením spolehlivosti. Výsledek se uloží do záznamu v databázi PostgreSQL.
Architektonický význam: Tento případ použití testuje integraci procesního řetězce pro inferenci umělé inteligence, mechanismus asynchronního provádění úloh a ukládání strukturovaných výsledků umělé inteligence ve formátu JSON do databáze.
4.2.5 UC6 - Aplikace obrazových filtrů na snímek retiny
Actor: Anonymní uživatel.
Popis: Umožňuje každému uživateli aplikovat na zobrazený snímek sítnice filtry pro zpracování obrazu (zvýšení kontrastu, extrakce zeleného kanálu, CLAHE atd.). Zpracování probíhá prostřednictvím hlavního API a výsledek se zobrazí v prohlížeči, aniž by byl filtrovaný snímek trvale uložen.
Architektonický význam: Testuje cestu pro poskytování obrázků z rozhraní Image API a proces zpracování obrázků na straně frontendu.
5. Logical View
Pohled popisuje nejdůležitější balíčky a jejich uspořádání do vrstev, klíčové třídy a jejich odpovědnosti a hlavní realizace případů použití.
5.1 Architecture Overview - Package and Subsystem Layering
Systém je rozdělen do tří samostatných služeb, z nichž každá má vrstvenou strukturu. Celý systém je postaven na architektuře klient-server s jasným oddělením prezentační, bussiness a datové vrstvy.
5.2 Architecturally Significant Design Packages
5.2.1 Application Layer - React SPA (Frontend Service)
Aplikační vrstvu zajišťuje server nginx jako soubor statických souborů představujících jednostránkovou aplikaci React. Frontend komunikuje výhradně s hlavní službou API.
Auth Module: Zajišťuje procesy přihlášení, registrace a přesměrování OAuth2. Spravuje ukládání tokenů JWT (soubory cookie typu httpOnly + Secure) a vkládá token do odchozích požadavků API prostřednictvím interceptoru Axios.
Retinal Module: Obsahuje formulář pro nahrávání obrázků, prohlížeč obrázků s ovládacími prvky pro filtrování, překryvné zobrazení detekce struktury pomocí umělé inteligence a rozhraní pro správu nahrávání.
Admin Module: Poskytuje rozhraní pro správu všech uživatelů, všech snímků a všech diagnóz. Přístupné pouze uživatelům s rolí správce.
Data Module: Umožňuje přihlášeným uživatelům spravovat svůj vlastní profil (jméno, heslo, avatar) a prohlížet si vlastní nahrané obrázky a diagnózy. Zobrazuje také informace o pacientovi a související snímky sítnice. Poskytuje vizualizační komponenty pro agregovaná kvalitativní a kvantitativní data (využívá knihovnu pro tvorbu grafů, jako je Recharts nebo Chart.js).
5.2.2 Business Services Layer - FastAPI Backend (Main API Service)
Vrstva služeb obsahuje veškerou bussiness logiku systému. Poskytuje jak rozhraní REST API, tak rozhraní GraphQL API (prostřednictvím schématu Strawberry).
Auth Service: Implementováno pomocí fastapi-users. Poskytuje koncové body pro registraci uživatelů, přihlášení, odhlášení, obnovení tokenu JWT, ověření e-mailu a výměnu tokenů OAuth2. Vydává podepsané přístupové tokeny JWT a obnovuje tokeny.
User Service: Operace CRUD pro uživatelské účty. Správcům jsou dostupné prostřednictvím REST a GraphQL.
Retinal Image Service: Koordinuje nahrávání obrázků (přenáší ukládání souborů na rozhraní Image API), spouští klasifikaci pomocí umělé inteligence, spravuje metadata obrázků a zajišťuje označování dat v datovém skladu.
Data Service: Operace CRUD pro záznamy pacientů. Přístup pro čtení je veřejný (anonymní), přístup pro zápis vyžaduje ověření.
REST API Layer: Standardní HTTP REST koncové body pro všechny operace a akce typu CRUD. Využívá dependency injection FastAPI pro authentikaci a autorizaci.
GraphQL Layer: Schéma GraphQL umožňující typově bezpečné dotazy a mutace. Používá se především pro datově náročné operace čtení a složité vnořené dotazy (např. vyhledání pacienta s obrázky a diagnózami v jediném dotazu).
5.2.3 Data Layer - PostgreSQL
SQLAlchemy ORM: Všechny databázové modely jsou definovány jako mapované třídy v SQLAlchemy 2.0. ORM zajišťuje mapování mezi objekty v jazyce Python a databázovými tabulkami.
PostgreSQL: Jediné perzistentní relační datové úložiště. Uchovává údaje o uživatelích, pacientech, metadatech snímků sítnice (nikoli samotné binární soubory) a diagnózách.
Alembic (Migrations): Verzování schématu databáze je spravováno nástrojem Alembic. Každá změna schématu je zaznamenána v migračním skriptu, který lze aplikovat nebo vrátit zpět.
5.2.4 Image API Service - Express (Node.js)
Image Store: Podporuje nahrávání obrázků prostřednictvím HTTP multipart/form-data. Každému nahranému souboru přiřadí jako název souboru náhodně vygenerovaný UUID a uloží jej na místní disk. Vrátí UUID a URL, kterou lze použít k poskytnutí obrázku.
API Key Auth Middleware: Všechny koncové body jsou chráněny statickým klíčem API, který je nutné uvést v hlavičce požadavku X-API-Key. Tím se zabrání neoprávněnému přístupu k uloženým obrázkům.
Express Router + Multer: Routingová vrstva využívá Express.js. Zpracování nahrávání souborů zajišťuje middleware Multer.
5.3 Use-Case Relations
5.3.1 Realisation: Retinal Image Upload + AI Classification
Jedná se o architektonicky nejvýznamnější proces, který zahrnuje několik úrovní a služeb:
- Ověřený uživatel vybere snímek sítnice v modulu Retinal (frontend v Reactu).
- Frontend odešle požadavek POST na adresu /api/v1/images/upload na hlavní API (JWT v hlavičce Authorization).
- Závislost Main API Auth ověří token JWT a extrahuje identitu uživatele.
- Hlavní API předá binární obrazový soubor do Image API pomocí POST /upload (API klíč v hlavičce).
- Image API uloží soubor jako {uuid}.jpg na disk a vrátí uuid.
- Hlavní API vytvoří záznam RetinalImage v PostgreSQL s uuid, image_url, patient_id, eye_side a uploader_id.
- Hlavní API zařadí do fronty úkol AI klasifikace (asynchronní) s UUID obrázku.
- AI worker načte obrázek z Image API, provede inferenci a zapíše výsledek klasifikace (JSON) a skóre spolehlivosti zpět do záznamu v PostgreSQL.
- Frontend dotazuje nebo přijímá oznámení websocketu, že klasifikace je dokončena, a aktualizuje uživatelské rozhraní.
5.3.2 Realisation: Patient Data Visualisation
Tento postup znázorňuje strukturu dotazu v GraphQL:
- Uživatel přejde na stránku s vizualizací dat.
- Frontend sestaví dotaz GraphQL, který požaduje agregované statistiky (např. počet diagnóz seskupených podle kódu, počet snímků na pacienta).
- Hlavní vrstva API GraphQL (Strawberry) dotaz zpracuje pomocí agregačních dotazů SQLAlchemy v databázi PostgreSQL.
- Frontend vykreslí výsledek pomocí knihovny grafů.
6. Deployment View
Tato část popisuje fyzickou topologii uzlů, na nichž je systém nasazen. Systém je rozložen na více kontejnerových uzlech v infrastruktuře AWS, přičemž pro lokální vývoj, testování a produkci jsou k dispozici samostatná prostředí.
6.1 Physical Topology
6.2 Deployment Nodes
6.2.1 Developer Workstation
Během vývoje se všechny tři služby spouštějí lokálně pomocí Docker Compose. Soubory compose.yml v každém repozitáři definují službu, její proměnné prostředí a připojené svazky. Kontejner PostgreSQL běží také lokálně. Testy se provádějí jako součást docker build (testovací fáze ve vícestupňovém Dockerfile), což je činí nezávislými na hostitelském prostředí.
6.2.2 GitLab CI/CD Pipeline
Každé úložiště na GitLabu obsahuje definici pipeline v souboru .gitlab-ci.yml. Tyto pipeline mají následující společnou strukturu:
Sestavení a testování - Dojde k sestavení obrazu Dockeru (včetně spuštění testů ve fázi testování). Pokud sestavení nebo testy selžou, pipeline se zastaví a skončí s chybou.
Odeslání do ECR - Po úspěšném dokončení ve větvi develop je sestavený obraz Dockeru označen tagem a odeslán do příslušného úložiště AWS ECR.
Nasazení do stagingového prostředí - Stagingové prostředí (AWS Lightsail) stáhne nový obraz z ECR a restartuje kontejner. Spouští se pouze na větvi develop.
Nasazení do produkčního prostředí - Produkční prostředí (AWS EC2) stáhne nový obraz a restartuje kontejner. Spouští se přidáním nového tagu nad hlavní větví, případně ručně z hlavní větve.
6.2.3 AWS Lightsail (Staging Environment)
Testovací prostředí běží na instancích AWS Lightsail. Všechny tři kontejnery služeb (retina-webapp, retina-api, retina-image-provider) a kontejner PostgreSQL běží na stejné instanci Lightsail s využitím Docker Compose. Testovací prostředí kopíruje produkční konfiguraci a slouží k finálnímu ověření před vydáním.
6.2.4 AWS EC2 (Production Environment)
Produkční prostředí běží na instanci AWS EC2. Používá se stejný přístup založený na Docker Compose. Ve srovnání se službou Lightsail nabízí EC2 podrobnější nastavení typu instance, úložiště a síťových parametrů. Trvalá data (svazky PostgreSQL, obrazové soubory) jsou uložena na svazcích EBS připojených k instanci EC2.
6.2.5 AWS ECR (Container Registry)
Každá služba má ve sdíleném účtu AWS vlastní úložiště ECR. Pipeline CI/CD se v systému ECR autentizuje pomocí přihlašovacích údajů AWS uložených jako secret proměnné GitLab CI/CD. Obrazy jsou označeny jak verzí (např. v1.2.3), tak značkou „latest“ pro každé prostředí.
6.3 Network Configuration
V rámci každého nasazovacího prostředí (stagingového nebo produkčního) komunikují všechny služby prostřednictvím interní sítě Dockeru. Hlavní API komunikuje s Image API prostřednictvím DNS názvu služby Dockeru (např. http://retina-image-provider:3000). Externí přístup je zpřístupněn pouze prostřednictvím kontejneru frontendu nginx (porty 8080/8443). Image API není externě zpřístupněno - přistupuje k němu pouze hlavní API a proxy nginx pro poskytování snímků.
| Service | Internal Port | External Port | Protocol |
| Frontend (nginx) | 80/443 | Yes (8080/8443) | HTTP/HTTPS |
| Main API (WSGI FastAPI) | 8000 | Yes (8000) | HTTPS |
| Image API (Express) | 3000 | No (internal only) | HTTPS |
| PostgreSQL | 5432 | No (internal only) | TCP |
7. Implementation View
Tato část popisuje uspořádání zdrojového kódu ve třech repozitářích GitLabu. Jelikož jsou všechny tři služby spravovány jako samostatné polyrepos pod společnou skupinou GitLab, odpovídá tento model implementace přímo členění služeb v logickém pohledu.
7.1 Repository Structure
7.1.1 Frontend Repository (retina/retina-webapp)
Kód frontendu je uspořádán jako standardní projekt Vite + React:
src/components/- Opakovaně použitelné komponenty Reactu tvořené RadixUI prototypy (ImageViewer, PatientCard, DiagnosisForm atd.)
src/pages/- Komponenty stránek nejvyšší úrovně odpovídající trasám aplikace.
src/modules/- Moduly zaměřené na konkrétní funkce (auth, patient, retinal, admin, profile).
src/api/- Konfigurace a přednastavení volání API klienta založené na Axiosu pro volání REST.
src/graphql- Typované dokumentové GraphQL query a mutations volané graphql.js
src/store/- Globální správa stavu (např. Zustand nebo Redux Toolkit).
public/- Manifest PWA a registrace service workerů.
Dockerfile- Vícefázová kompilace (node:alpine pro fázi kompilace, nginx:alpine pro fázi produkce).
compose.yml- Nastavení lokálního vývoje a nasazení.
.gitlab-ci.yml- Pipelina GitLab CI/CD.
7.1.2 Main API Repository (retina/retina-api)
Základní kód backendu s vrstvenou strukturu balíčků v jazyce Python:
src/routers/- Obslužné rutiny FastAPI uspořádané podle domén (auth, users, patients, images, diagnoses, admin).
src/graphql/- Schéma, typy, dotazy a mutace Strawberry GraphQL.
src/services/- Vrstva bussiness logiky (jedna třída služby pro každou doménu).
app/models/- Třídy mapované pomocí ORM SQLAlchemy.
app/schemas/- Modely Pydantic pro validaci požadavků a odpovědí.
app/core/- Konfigurace, bezpečnostní nástroje, zpracování JWT, nastavení OAuth2.
alembic/- Migrační prostředí Alembic a skripty verzí.
tests/- Sada testů pytest (jednotkové a integrační testy).
Dockerfile- Vícefázová kompilace s provedením testů ve fázi kompilace.
7.1.3 Image API Repository (retina/retina-image-provider)
Základní kód služby servírující obrázky je projektem Node.js Express:
src/routes/- Definice routerů Express (upload, serve, delete).
src/middleware/- Middleware pro ověřování pomocí API klíčů.
src/utils/- Nástroje pro generování UUID a práci s cestami k souborům.
storage/- Adresář pro nahrané obrazové soubory (v produkčním prostředí připojený jako svazek Dockeru).
tests/- Sada testů Jest.
Dockerfile- Vícefázová kompilace Node.js
7. Layers
| Layer | Service | Technologies | Responsibility |
| Application | Frontend | React, Vite, nginx | Zobrazování uživatelského rozhraní, směrování, interakce s uživatelem, podpora PWA |
| Business Services | Main API | Python, FastAPI, Strawberry, fastapi-users | Obchodní logika, ověřování, koordinace umělé inteligence |
| Image Storage | Image API | Node.js, Express, Multer | Trvalé ukládání obrazových souborů, přístup na základě UUID, zabezpečení klíčů API |
| Data | Main API | SQLAlchemy, Alembic, PostgreSQL | Ukládání relačních dat, správa schémat |
| Infrastructure | All | Docker, GitLab CI/CD, AWS ECR/Lightsail/EC2 | Kontejnerizace, dodavatelské kanály, hosting |
8. Data View
Tento pohled popisuje model trvalých dat systému. Všechna klinická data (zdravotní záznamy pacientů, metadata snímků sítnice, diagnózy, uživatelské účty) jsou trvale uložena v databázi PostgreSQL. Převod z návrhového modelu SQLAlchemy do schématu databáze provádí automaticky ORM, přičemž Alembic spravuje postupné změny schématu.
8.1 Data Model Overview
8.2 Database Schema Management
Schéma databáze se generuje automaticky na základě definic modelů v SQLAlchemy. K detekci změn mezi modely ORM a aktuálním schématem databáze se používá nástroj Alembic Autogenerate, který vytváří skripty migrací s verzemi. Historie migrací je uložena v tabulce alembic_version. Migrace se ve všech prostředích aplikují automaticky při spuštění kontejneru.
8.3 Architectural Data Decisions
- Binární data obrázků jsou ukládána mimo relační databázi (na disku, spravována rozhraním Image API), aby se zabránilo přetížení instance PostgreSQL a umožnilo efektivní poskytování souborů prostřednictvím nginx.
- Výsledky klasifikace pomocí AI jsou ukládány ve formátu JSON, aby bylo možné přizpůsobit se měnícím se schématům výstupů modelů, aniž by při aktualizacích modelů bylo nutné provádět migrace databáze.
- Všude se používají primární klíče UUID, aby se zabránilo útokům pomocí sekvenčního číslování ID a umožnilo bezpečné externí zveřejnění identifikátorů entit v URL adresách API.
9. Quality, Size and Performance
Tato část popisuje kvalitativní, objemové a výkonostní požadavky systému, které určují jeho architekturu.
9.1 Sizing Estimates
| Metric | Expected Value | Architectural Impact |
| Souběžní uživatelé (testovací prostředí) | Až 20 | Stačí jedna instance EC2/Lightsail |
| Souběžní uživatelé (produkční prostředí) | Až 200 | Škálování Uvicorn workers, je nutné sdílení připojení k databázi |
| Snímky sítnice v systému | Až 100,000 obrázků / rok | Plánování diskového úložného prostoru, oddělené ukládání obrázků od databáze |
| Průměrná velikost souboru s obrazem sítnice | 1–5 MB (nekomprimovaný formát TIFF/JPEG) | Plánování diskových operací I/O pro rozhraní Image API, zohlednění CDN v produkčním prostředí |
| Řádky v PostgreSQL | ~100,000 / rok | Index na sloupcích id |
| Latence při inferenci umělé inteligence | Cíl < 10 sekund na snímek | Asynchronní provádění úloh, v produkčním prostředí je žádoucí využívání GPU pro inferenci |
| Doba odezvy API (P95) | Cíl: < 500 ms pro operace CRUD | Optimalizace dotazů do databáze, sdílení připojení |
9.2 Performance Architecture Decision
- Klasifikace pomocí AI se provádí asynchronně po nahrání obrázku, aby nedošlo k zablokování HTTP odpovědi. API okamžitě vrátí odpověď 202 Accepted - klient pak buď pravidelně dotazuje na výsledek klasifikace, nebo obdrží push notifikaci přes WebSocket.
- Image API ukládá soubory na lokální disk (svazek Dockeru), čímž se vyhýbá přenosům binárních dat do databáze a umožňuje serveru nginx poskytovat obrázky přímo přes X-Accel-Redirect pro maximální propustnost.
- Asynchronní režim SQLAlchemy (ovladač asyncpg) se používá k maximalizaci souběžnosti ve smyčce událostí FastAPI bez blokování pracovních vláken.
- Je nakonfigurován fond připojení PostgreSQL (výchozí: 10–20 připojení na Uvicorn workera), který zpracovává souběžné požadavky, aniž by vyčerpal databázová připojení.
- Statické frontendové soubory (balíčky JS, CSS) jsou poskytovány přímo nginxem s hlavičkami cache-control, aby se minimalizovaly opakované přenosy v síti.
9.3 Security
Authentication - Ověřování založené na JWT s nastavitelnou dobou platnosti tokenů (výchozí přístupový token: 1 hodina; obnovovací token: 30 dní). Jako alternativní způsob přihlášení je podporován protokol OAuth2 (Google).
Authorisation - Řízení přístupu na základě rolí (RBAC) je vynucováno na úrovni závislostí FastAPI. Každý koncový bod deklaruje požadovanou roli, systém pomocí dependency injection odmítá požadavky od uživatelů s nedostatečnými oprávněními s chybovým kódem HTTP 403.
Image API security - Rozhraní API pro obrázky není veřejně přístupné. Ověřování pomocí klíče API zabraňuje neoprávněnému zápisu. UUID v názvech obrázků brání útokům typu enumerace.
Password storage - Hesla se před uložením zašifrují pomocí algoritmu bcrypt, hesla v otevřeném textu se nikdy neukládají.
HTTPS - V produkčním prostředí je terminace TLS zpracovávána na úrovni reverzního proxy serveru nginx. Veškerá externí komunikace je šifrována. Certifikáty jsou uděleny certifikační autoritou Lets Encrypt.
9.4 Reliability and Availability
Target availability - 99,5% provozuschopnost na produkci (přibližně 44 hodin výpadku ročně).
Deployment strategy - Blue/green nasazení nebo postupné nasazení prostřednictvím restartu docker kontejneru minimalizují prostoje během aktualizací.
Data durability - Data a obrazové soubory PostgreSQL jsou v produkčním prostředí ukládány na svazcích EBS s automatickými snapshoty.
Health checks - Každá služba poskytuje koncový bod /health. Docker Compose a nástroj pro koordinaci nasazení je využívají k monitorování stavu kontejnerů a k automatickému restartu v případě selhání.
9.5 Maintainability
Polyrepo - Každá služba je umístěna ve vlastním repozitáři s vlastním CI/CD procesem, což umožňuje nezávislé cykly vydávání a omezuje dopad změn.
Database migrations - Migrační skripty Alembic jsou spravovány v rámci systému správy verzí a při nasazení se aplikují automaticky, čímž je zajištěna konzistence schématu napříč prostředími.
Type safety - FastAPI využívá pro všechna schémata požadavků a odpovědí modely Pydantic. Strawberry používá pro schéma GraphQL typové anotace v jazyce Python. Komponenty Reactu využívají TypeScript.
9.6 Portability
Containerisation - Všechny služby jsou kontejnerizovány pomocí Dockeru. Jediným požadavkem na infrastrukturu je Docker Engine. Služby lze spouštět na jakémkoli hostitelském počítači s operačním systémem Linux (místní notebook, AWS Lightsail, AWS EC2, lokální server).
Environment Configuration - Všechna nastavení specifická pro dané prostředí (URL databáze, klíče API, tajné kódy JWT, přihlašovací údaje AWS) se zadávají prostřednictvím proměnných prostředí v souladu s metodikou 12-factor app.
9.7 Testability
Test-in-Docker - Všechny testy (jednotkové, integrační) se provádějí jako součást sestavení v Dockeru. Kromě Docker Engine není zapotřebí žádná další testovací infrastruktura. Tím je zajištěno, že testy proběhnou ve stejném prostředí jako produkční provoz.
Test coverage - Backend FastAPI využívá pytest spolu s pytest-asyncio pro podporu asynchronního testování. Frontend React využívá Vitest nebo Jest, popřípadě Playwright. Image API využívá Jest.
Staging Environment - Vyhrazené testovací prostředí na AWS Lightsail kopíruje produkční konfiguraci a slouží ke komplexnímu testování před nasazením do produkčního prostředí.
9.8 Usability
PWA Support - React SPA lze nainstalovat jako progresivní webovou aplikaci na stolní počítače i mobilní zařízení, čímž poskytuje zážitek podobný nativní aplikaci a ukládání do mezipaměti v offline režimu.
Accessibility - Komponenty uživatelského rozhraní splňují pokyny WCAG 2.1 AA díky Radix UI komponentám, kde je to možné, a zajišťují tak přístupnost pro uživatele se zrakovým postižením.
Responsive design - Uživatelské rozhraní se přizpůsobuje různým velikostem obrazovky, aby bylo možné jej používat jak na klinických pracovních stanicích, tak na tabletech.