Backend + frontend для управления GPU-очередью и JupyterHub.
- FastAPI backend c JWT auth и ролями
user/admin - PostgreSQL через
docker-compose - Полноценные модели:
User,LaunchProfile,QueueItem,Session,Node,Alert,AuditLog - Async workers для симуляции кластера и lifecycle сессий
- Mock adapters для Slurm/JupyterHub/Metrics (готово к замене на реальные)
- Агрегированные API для user/admin dashboard
- WebSocket realtime stream:
queue.updated,session.updated,node.updated - Seed данные: 1 admin, 5 users, 3 GPU-ноды, очередь, сессии, алерты
- FastAPI
- SQLAlchemy (async)
- Pydantic
- PostgreSQL (dev через Docker)
- Uvicorn
- asyncio workers
app/
main.py
config.py
api/
deps.py
routes/
auth.py
user.py
admin.py
core/
security.py
realtime.py
models/
user.py
session.py
queue.py
node.py
alert.py
schemas/
user.py
session.py
queue.py
dashboard.py
services/
queue_service.py
session_service.py
dashboard_service.py
scheduler_service.py
repositories/
user_repo.py
queue_repo.py
session_repo.py
node_repo.py
integrations/
slurm/base.py
slurm/mock.py
jupyterhub/base.py
jupyterhub/mock.py
metrics/base.py
metrics/mock.py
workers/
queue_worker.py
session_worker.py
db/
base.py
session.py
seed/
seed_data.py
- Убедитесь, что Docker daemon запущен.
- Запустите:
docker compose up --build- Backend доступен на
http://localhost:8000. Порты публикуются только на127.0.0.1(dev-safe), внешние подключения отсекаются.
Health check:
curl http://localhost:8000/health- admin:
- username:
admin - password:
admin123
- username:
- user:
- username:
demo - password:
user12345
- username:
Если у вас уже была старая volume БД, seed-пароли могли сохраниться от прошлой версии. Для чистого пересида:
docker compose down -v
docker compose up --buildПолучить JWT:
curl -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'Регистрация пользователя:
curl -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"newuser","full_name":"New User","email":"newuser@gpuflow.local","team":"NLP","password":"StrongPass123"}'Требования к паролю: 8..128 символов, обязательно буквы и цифры.
GET /api/v1/dashboard/userPOST /api/v1/sessions/launchPOST /api/v1/queue/{id}/cancelPOST /api/v1/sessions/{id}/relaunchGET /api/v1/sessions/{id}/access
GET /api/v1/dashboard/adminPOST /api/v1/admin/queue/{id}/promoteDELETE /api/v1/admin/queue/{id}POST /api/v1/admin/sessions/{id}/terminatePOST /api/v1/admin/sessions/{id}/warnPATCH /api/v1/admin/users/{id}/limitsPOST /api/v1/admin/users/{id}/blockPOST /api/v1/admin/users/{id}/unblock
WS /api/v1/stream- браузерный клиент передает JWT через websocket subprotocol
bearer.<token> - для non-browser клиентов поддерживается
Authorization: Bearer <JWT> - heartbeat обязателен (
{"type":"ping"}), сервер отвечает{"type":"pong"} - попытки подключения без токена отклоняются (
403/1008) — это ожидаемо
- браузерный клиент передает JWT через websocket subprotocol
Все настройки задаются через .env и docker-compose.yml.
Ключевые параметры:
DATABASE_URLJWT_SECRETLOGIN_MAX_ATTEMPTSLOGIN_LOCKOUT_SECONDSLOGIN_GUARD_STATE_TTL_SECONDSLOGIN_GUARD_MAX_STATESALLOW_USER_REGISTRATIONSTRICT_PRODUCTION_CHECKSSLURM_MODE=mockJUPYTERHUB_MODE=mockMETRICS_MODE=mockQUEUE_TICK_SECONDSSESSION_TICK_SECONDSWORKERS_ENABLEDWORKERS_USE_DB_LOCKSESSION_IDLE_TIMEOUT_SECONDSSESSION_MAX_RUNTIME_SECONDSADMIN_WARN_RATE_LIMIT_COUNTADMIN_WARN_RATE_LIMIT_WINDOW_SECONDSQUEUE_START_TIMEOUT_SECONDSWS_HEARTBEAT_TIMEOUT_SECONDSWS_AUTH_RECHECK_SECONDSCORS_ALLOW_ORIGINSSEED_SYNC_EXISTING_USERS
-
Реализовать production adapters вместо:
app/integrations/slurm/mock.pyapp/integrations/jupyterhub/mock.pyapp/integrations/metrics/mock.py
-
Выставить production env:
APP_ENV=prodJWT_SECRET=<strong-random-secret>SEED_ON_STARTUP=falseALLOW_USER_REGISTRATION=false(или оставить true осознанно)SLURM_MODE,JUPYTERHUB_MODE,METRICS_MODEнеmock
-
Подставить реальные URL/токены в
.env. -
Не требуется переписывать API, модели или сервисный слой.
Запуск фронтенда:
cd frontend
cp .env.example .env
npm install
npm run dev- Регрессионные backend-тесты:
docker compose exec -e WORKERS_ENABLED=false -e SEED_ON_STARTUP=false api python -m unittest -v tests.test_regressions- Live readiness тесты (auth, dashboard, queue, admin actions, websocket, проверка отсутствия mock-данных на фронте):
docker compose exec api python -m unittest -v tests.test_prod_readiness