ServiceManager with JSON file persistence replaces static env var config. CRUD API endpoints (POST/PUT/DELETE /api/services) with WebSocket broadcast. Dashboard: add/edit/delete services via modal form. Co-Authored-By: Claude <noreply@anthropic.com>
2.9 KiB
SleepGuard Architecture
Обзор
Wake-on-demand система из двух компонентов:
- Proxy (n150, 192.168.50.199) — reverse proxy + state machine + dashboard
- Agent (PC, 192.168.1.50) — мониторинг нагрузки + lock manager
State Machine
REQUEST_RECEIVED
OFFLINE ─────────────────────► WAKING
▲ │
│ SHUTDOWN_COMPLETE │ HEALTH_CHECK_PASSED
│ ▼
SHUTTING_DOWN ◄──── IDLE_CHECK ◄── ONLINE
AGENT_IDLE IDLE_TIMEOUT ▲
│ │
│ AGENT_BUSY / REQUEST
└────────┘
OFFLINE→ запрос → wake через UpSnap →WAKINGWAKING→ health check passed →ONLINEONLINE→ idle timeout →IDLE_CHECKIDLE_CHECK→ agent busy →ONLINE, agent idle →SHUTTING_DOWNSHUTTING_DOWN→ agent offline →OFFLINE
Shutdown Policy (Agent)
Три уровня проверки (все должны быть пройдены):
- Locks — если есть активные локи, выключение блокируется
- Processes — hashcat, ffmpeg, whisper, python3, ollama
- Metrics — CPU >15%, GPU >10%, RAM >50%, Disk I/O active
Проксирование
Proxy матчит сервисы по Host заголовку. Если PC online — http-proxy проксирует запрос. Если offline — показывает "Waking up" страницу с автополлом.
Service Management
Сервисы хранятся в ${DATA_DIR}/services.json (по умолчанию ./data/services.json). При первом запуске берутся из env var SERVICES, затем управляются через CRUD API:
GET /api/services— списокPOST /api/services— созданиеPUT /api/services/:host— обновление (host неизменяем)DELETE /api/services/:host— удаление
ServiceManager (packages/proxy/src/services/serviceManager.ts) — in-memory + атомарная запись (tmp + rename). Изменения уведомляют dashboard через WebSocket (service_list_changed).
В Docker volume монтируется: ./data/proxy:/app/data.
Деплой
Два приложения в Dokploy из одного git repo:
sleepguard-proxy: Dockerfilepackages/proxy/Dockerfile, build context.sleepguard-agent: Dockerfilepackages/agent/Dockerfile, build context.
Agent деплоится на PC как remote server в Dokploy с NVIDIA GPU passthrough.
Env переменные
См. .env.example в корне репозитория.