Архитектура¶
Обзор¶
MedInsight — монолитное FastAPI-приложение с асинхронными задачами Celery, SQLite/PostgreSQL, Redis и статическим фронтендом (Vanilla JS).
flowchart TB
subgraph Client
Browser[Browser]
end
subgraph Docker
App[app :8000 FastAPI]
Worker[celery worker]
Beat[celery beat]
Redis[(redis:6379)]
end
subgraph Data
DB[(SQLite / PostgreSQL)]
Storage[storage/ age + DICOM]
end
subgraph External
ProxyAPI[ProxyAPI GPT]
SMTP[SMTP]
TG[Telegram]
end
Browser -->|HTTP/WS| App
App --> DB
App --> Redis
App --> Storage
Worker --> Redis
Worker --> DB
Worker --> Storage
Worker --> ProxyAPI
Beat --> Redis
App --> SMTP
App --> TG
Слои приложения¶
| Слой | Каталог | Ответственность |
|---|---|---|
| Routes | app/routes/ |
HTTP API, валидация |
| Services | app/services/ |
Бизнес-логика |
| Models | app/models.py |
SQLAlchemy ORM |
| Tasks | app/tasks/ |
Celery (парсинг, DICOM, бэкап) |
| Static | app/static/ |
HTML/JS/CSS |
| Auth | app/auth.py |
JWT, регистрация |
| Access | app/services/access.py |
RBAC |
Мультитенантность¶
Каждая клиника — Tenant с уникальным subdomain. Все запросы фильтруются по tenant_id из JWT.
RBAC¶
7 ролей: admin, head_of_department, doctor, nurse, researcher, viewer, superadmin.
Проверки в app/services/access.py:
can_read_patient,can_write_patientcan_upload_document,can_delete_user- анонимизация для
researcher
Асинхронные задачи¶
| Задача | Файл | Назначение |
|---|---|---|
parse_document |
document_task.py |
PDF/DOCX → текст, диагнозы |
process_dicom |
dicom_task.py |
DICOM → серии, PNG |
run_prediction |
prediction_task.py |
GPT / fallback |
run_backup |
backup_task.py |
age-архив |
self_heal |
self_heal_task.py |
Redis/Celery health |
Шифрование¶
Файлы документов и DICOM шифруются age перед записью на диск (app/services/encryption.py).
WebSocket¶
/ws/notifications — push о готовности документов, прогнозов, DICOM.
Frontend¶
SPA-подобные страницы без фреймворка:
index.html+dashboard.jslogin.html,admin.htmldicom.html,dicom-viewer.html
CI/CD¶
GitHub Actions → SSH VPS → deploy.sh production.