Component Structure
%%{init: {"theme": "neutral", "themeVariables": {"fontFamily": "Times New Roman, serif"}}}%%
flowchart TB
KC("Keycloak
аутентификация (OIDC)")
BP"backend-platform
прикладная логика
и контроль доступа"
DB("PostgreSQL
профили, доступ, контент")
REDIS("Redis
сессии и кэш решений")
MINIO("MinIO
файлы материалов")
MQ
subgraph INFRA"Инфраструктурный слой"
WK"Обработчики задач
(Celery)"
K8S"Kubernetes
лабораторные среды"
end
KC <--> BP
BP <--> DB
BP <--> REDIS
BP <--> MINIO
BP -->|"публикация задач"| MQ
MQ --> WK
WK --> K8S
Access Model
%%{init: {"theme": "neutral", "themeVariables": {"fontFamily": "Times New Roman, serif"}}}%% flowchart TB UПользователь --> AGГруппа доступа AG --> RРоли AG --> B"Наборы прав(bundles)" AG --> C"Отдельные полномочия(capabilities)" R --> EFFЭффективные полномочия B --> EFF C --> EFF EFF --> ABAC"ABAC: проверкавладения и назначения ресурса" ABAC --> DEC"Решение о доступе(разрешить / 403)"
Er Access
%%{init: {"theme": "neutral", "themeVariables": {"fontFamily": "Times New Roman, serif"}}}%% erDiagram organizations ||--o{ users : "" organizations ||--o{ access_groups : "" access_groups ||--o{ access_group_memberships : "" users ||--o{ access_group_memberships : "" access_groups ||--o{ access_group_role_assignments : "" access_groups ||--o{ access_group_bundle_assignments : "" access_groups ||--o{ access_group_capability_grants : "" organizations { int id PK string name } users { int id PK string role string access_assignment_mode string keycloak_sub } access_groups { int id PK string key int organization_id FK } access_group_memberships { int access_group_id FK int user_id FK } access_group_role_assignments { int access_group_id FK string role } access_group_bundle_assignments { int access_group_id FK string bundle_key } access_group_capability_grants { int access_group_id FK string capability_key }