Архитектура
Общая схема
Пользовательский браузер
│ HTTPS / WebSocket
▼
Внешний reverse proxy (TLS, /roy)
│
▼
Монолитный сервер СОПКА.Рой
│ │
▼ ▼
PostgreSQL 16 Redis 8.8
(постоянные данные) (runtime, locks, cache, presence)
▲ ▲
└──── HTTPS / Socket.IO ──── Windows-агенты
Сервер приложения
Монолитный сервер СОПКА.Рой обслуживает HTML-интерфейс, JSON API, регистрацию и heartbeat агентов, приём событий, управление политиками, файловый поиск, оперативные WebSocket-сеансы, прямой экран и удалённые команды.
PostgreSQL
В базе хранятся пользователи, рабочие области, членство и роли, клиенты, политики, события, инциденты, история, команды и сущности поиска файлов. Для эксплуатации предусмотрены отдельные роли мигратора и приложения.
Redis
Redis используется для кэша авторизации агентов, presence, rate limiting, временных сообщений, блокировок синхронизации, runtime прямого экрана и межпроцессной очереди Socket.IO. Критические постоянные данные остаются в PostgreSQL.
Агент Windows
Системная служба отвечает за защищённую идентичность, heartbeat, политики, очередь и фоновые мониторы. Пользовательский процесс работает в интерактивной сессии и предоставляет функции, которым нужен рабочий стол пользователя.
Будущий агент Linux
Linux-агент планируется как отдельная реализация и не является режимом Windows-агента. Он будет использовать тот же API регистрации, heartbeat и подписанную схему политик. Первый целевой вариант графической подсистемы - X11; Wayland планируется отдельным этапом. Политики содержат список целевых платформ. Полный набор политик workspace синхронизируется на каждый клиент, но Windows- и Linux-агенты выполняют только правила, совместимые со своей ОС; в интерфейсе клиента отдельно отображается применимость политики.
Обновление агентов
Подсистема обновления состоит из серверной очереди agent_update_targets, API выдачи одноразового grant, подписанного ZIP-релиза и клиентского CopkaRoyUpdater.exe. Клиент сообщает версию в heartbeat, сервер сравнивает её с текущим релизом и при необходимости выдаёт предложение обновления.
Updater распаковывает пакет во временный каталог, проверяет манифест и файлы, копирует релиз в версионный слот и переключает launcher на новую версию. Если новая служба не запускается, выполняется откат на предыдущий слот.
Изоляция арендаторов
Основные сущности содержат workspace_id. Сервер определяет рабочую область по аутентифицированному пользователю или токену агента и не должен доверять workspace/client ID из клиентского payload без повторной проверки.
Время и идентификаторы
События передаются в UTC. Отображение выполняется в IANA-часовом поясе пользователя. Клиент имеет UUID и токен; политики имеют bundle version/UUID и могут подписываться Ed25519.