From efec489c96d2c6c4fe6ab7b5dc0e6d55cbea95ab Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Sat, 15 Nov 2025 20:11:24 +0000 Subject: [PATCH] update diagrams for v5 --- DIAGRAMS.md | 291 +++++++++++++++++++++------------------------------- 1 file changed, 119 insertions(+), 172 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 089f29a5..4dc88b32 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -88,209 +88,156 @@ C4Context Messaging is middleware. EnterpriseMessageBus is for any messaging handled between different projects. ```mermaid C4Container - UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="3") + UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") title Container diagram for Kyoo System Person(user, "User") - System_Boundary(internal, "Kyoo") { - Container(frontend, "front/") - Container(backend, "back/") - ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") - Container(transcoder, "transcoder/") - Container(scanner, "scanner/") - Container(autosync, "autosync/") - } - System_Boundary(external, "") { - System_Ext(content, "ContentDatabase", "") - } - System_Boundary(external2, "") { - System_Ext(tracker, "ActivityTracker", "") - } - System_Boundary(external3, "") { - System_Ext(media, "MediaLibrary", "") - } + Container(apigateway, "API Gateway") + Container(auth, "auth") + Container(transcoder, "transcoder") + Container(scanner, "scanner") + Container(frontend, "front") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "") + Container(api, "api") + System_Ext(tracker, "ActivityTracker", "") - Rel(user, frontend, "") - Rel(user, backend, "") - Rel(frontend, backend, "") - Rel(backend, emb, "") - Rel(backend, transcoder, "") - Rel_Back(autosync, emb, "") - Rel(autosync, tracker, "") - Rel_Back(scanner, emb, "") - Rel(scanner, backend, "") + + Rel(user, apigateway, "") + Rel(apigateway, frontend, "") + Rel(apigateway, scanner, "") + Rel(apigateway, transcoder, "") + Rel(apigateway, api, "") + Rel(apigateway, auth, "") + Rel(frontend, api, "") + Rel(api, tracker, "") + Rel(scanner, api, "") Rel(scanner, media, "") Rel(scanner, content, "") Rel(transcoder, media, "") ``` - - ## Component -### Autosync -```mermaid -C4Component - UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") - - title Component Diagram for Autosync - - Container_Boundary(autosync, "autosync") { - Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") - } - Container_Boundary(emb, "emb") { - ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") - ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") - - } - Container_Boundary(tracker, "ActivityTracker") { - Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl") - } - Container_Boundary(backend, "back") { - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") - } +#### Auth +Kyoo leverages the [API Gateway](https://learn.microsoft.com/en-us/azure/architecture/microservices/design/gateway) approach to microservices and [offloads](https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-offloading) authentication at the gateway. Auth microservice is implicitly used by each other microservice for both end user authentication and microservice to microservice communications. - Rel(emb_e1, emb_q1, "bound") - Rel_Back(autosync_c1, emb_q1, "consumes") - Rel(backend_c2, emb_e1, "produces") - Rel(autosync_c1, tracker_c1, "updates") -``` +*Auth microservice will not be directly represented in the other component diagrams. Instead in their relationsihp, they will specify "auth via middleware". -### Back ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="5", $c4BoundaryInRow="2") - title Component Diagram for Back + title Auth Component Diagram - Person(user, "User") - - Container_Boundary(frontend, "front") { - Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") + Container_Boundary(auth, "auth") { + Component(auth_c1, "kyoo_auth", "Go", "") + ComponentDb(auth_db1, "kelbi", "Postgres", "") } - Container_Boundary(backend, "back") { - ComponentDb(backend_db2, "search", "Meilisearch", "search resource") - Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") - ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") - Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") - } - - Container_Boundary(emb, "emb") { - ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") - ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") - ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") - ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") - } - - Container_Boundary(scanner, "scanner") { - Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") - Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") - } - - Container_Boundary(autosync, "autosync") { - Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") - } - - Container_Boundary(transcoder, "transcoder") { - Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") - } - - Rel(user, backend_c2, "") - Rel(backend_c1, backend_db1, "") - Rel(backend_c2, backend_db1, "") - Rel(backend_c2, backend_db2, "") - Rel(backend_c2, transcoder_c1, "") - Rel(backend_c2, backend_c3, "") - Rel(backend_c2, emb_q2, "produces") - Rel(backend_c2, emb_e1, "produces") - Rel(backend_c2, emb_e2, "produces") - Rel(emb_e1, emb_q1, "bound") - Rel_Back(autosync_c1, emb_q1, "consumes") - Rel_Back(scanner_c1, emb_q2, "consumes") - Rel(scanner_c1, backend_c2, "") - Rel(scanner_c2, backend_c2, "") - Rel(frontend_c1, backend_c2, "") + Rel(auth_c1, auth_db1, "") ``` -### Front -```mermaid -C4Component - UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") - - title Component Diagram for Front - - Person(user, "User") - Container_Boundary(frontend, "front") { - Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") - } - Container_Boundary(backend, "back") { - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") - } - - Rel(frontend_c1, backend_c2, "ssr") - Rel(user, frontend_c1, "") -``` - -### Scanner -```mermaid -C4Component - UpdateLayoutConfig($c4ShapeInRow="5", $c4BoundaryInRow="3") - - title Component Diagram for Scanner - - Container_Boundary(media, "MediaLibrary") { - Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") - } - - Container_Boundary(content, "ContentDatabase") { - Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") - } - - Container_Boundary(scanner, "scanner") { - Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") - ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") - Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") - } - - Container_Boundary(backend, "back") { - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") - } - - Container_Boundary(emb, "emb") { - ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") - } - - Rel(scanner_c1, scanner_q1, "produces") - Rel(scanner_c1, media_c1, "watches") - Rel(scanner_c1, backend_c2, "Fetch existing scans") - Rel(scanner_c2, content_c1, "Fetch media data") - Rel(scanner_c2, backend_c2, "Pushes media data") - Rel_Back(scanner_c2, scanner_q1, "consumes") - Rel_Back(scanner_c1, emb_q2, "consumes") - Rel(backend_c2, emb_q2, "produces") -``` - -### Transcoder +#### Api ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") - title Component Diagram for Transcoder + title Api Component Diagram + + Person(user, "User") + Container_Boundary(api, "api") { + ComponentDb(api_db1, "kyoo", "Postgres", "") + Component(api_c1, "kyoo_api", "TypeScript", "") + Component(api_c2, "ApiMetadata", "Volume", "Persistent. Distributed Metadata") + } + Container_Boundary(scanner, "scanner") { + Component(scanner_c1, "kyoo_scanner", "Python", "") + } + Container_Boundary(front, "front") { + Component(front_c1, "kyoo_front", "TypeScript", "") + } + + System_Boundary(external, "") { + System_Ext(tracker, "ActivityTracker", "") + } + + Rel(user, api_c1, "auth via middleware") + Rel(api_c1, api_db1, "") + Rel(api_c1, api_c2, "") + Rel(api_c1, tracker, "") + Rel(scanner_c1, api_c1, "auth via middleware") + Rel(front_c1, api_c1, "") +``` + +#### Front +```mermaid +C4Component + UpdateLayoutConfig($c4ShapeInRow="5", $c4BoundaryInRow="2") + + title Front Component Diagram + + Person(user, "User") + Container_Boundary(front, "front") { + Component(front_c1, "kyoo_front", "TypeScript", "") + } + + Container_Boundary(api, "api") { + Component(api_c1, "kyoo_api", "TypeScript", "") + } + Rel(user, front_c1, "") + Rel(front_c1, api_c1, "") +``` + + +#### Transcoder +```mermaid +C4Component + UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1") + + title Transcoder Component Diagram + + Person(user, "User") Container_Boundary(transcoder, "transcoder") { + ComponentDb(transcoder_db1, "gocoder", "Postgres", "") + Component(transcoder_c1, "kyoo_transcoder", "Go", "") Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata") - Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache") } - Container_Boundary(media, "MediaLibrary") { - Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") - } - Container_Boundary(backend, "back") { - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + + System_Boundary(external, "") { + System_Ext(media, "MediaLibrary", "") } - Rel(transcoder_c1, media_c1, "mounts") + Rel(user, transcoder_c1, "auth via middleware") + Rel(transcoder_c1, media, "mounted to filesystem
reads") + Rel(transcoder_c1, transcoder_db1, "") Rel(transcoder_c1, transcoder_c2, "") Rel(transcoder_c1, transcoder_c3, "") - Rel(backend_c2, transcoder_c1, "") +``` + + +#### Scanner +```mermaid +C4Component + UpdateLayoutConfig($c4ShapeInRow="5", $c4BoundaryInRow="2") + + title Scanner Component Diagram + + Container_Boundary(api, "api") { + Component(api_c1, "kyoo_api", "TypeScript", "") + } + + Container_Boundary(scanner, "scanner") { + Component(scanner_c1, "kyoo_scanner", "Python", "") + ComponentDb(scanner_db1, "scanner", "Postgres", "") + } + System_Boundary(external, "") { + System_Ext(content, "ContentDatabase", "") + System_Ext(media, "MediaLibrary", "") + } + + Rel(scanner_c1, api_c1, "http(s)
auth via middleware") + Rel(scanner_c1, scanner_db1, "") + Rel(scanner_c1, content, "http(s)
gathers media info & images") + Rel(scanner_c1, media, "mounted to filesystem
watches") ``` \ No newline at end of file