Files
sleep-guard/docs/architecture.md
Vadim Sobinin 420d75a3b7 feat(proxy): add service CRUD with persistent storage
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>
2026-02-10 16:05:44 +03:00

2.9 KiB
Raw Blame History

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 → WAKING
  • WAKING → health check passed → ONLINE
  • ONLINE → idle timeout → IDLE_CHECK
  • IDLE_CHECK → agent busy → ONLINE, agent idle → SHUTTING_DOWN
  • SHUTTING_DOWN → agent offline → OFFLINE

Shutdown Policy (Agent)

Три уровня проверки (все должны быть пройдены):

  1. Locks — если есть активные локи, выключение блокируется
  2. Processes — hashcat, ffmpeg, whisper, python3, ollama
  3. 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: Dockerfile packages/proxy/Dockerfile, build context .
  • sleepguard-agent: Dockerfile packages/agent/Dockerfile, build context .

Agent деплоится на PC как remote server в Dokploy с NVIDIA GPU passthrough.

Env переменные

См. .env.example в корне репозитория.