SysEye — это система агентов диагностики и управления командами. Платформа получает задачи от основной системы, отправляет их агентам, хранит историю запусков, логи, аналитику и показывает всё это в веб-интерфейсе.
Система решает задачу удалённой инфраструктурной диагностики:
- какие машины доступны и активны;
- какие проверки на них запускались;
- какие результаты и ошибки были получены;
- что изменилось между двумя запусками;
- как быстро и стабильно работают агенты.
В текущей версии проекта используются следующие сущности:
Пользователь— учётная запись для входа в UI, управления агентами, командами, сценариями и экспортом;Агент— зарегистрированная машина с heartbeat, connection token, API key, статусом и карточкой в dashboard;Команда— заранее сохранённая диагностическая или служебная команда с платформой, шаблоном и плейсхолдерами;Плейсхолдер команды— параметр команды, который задаётся при запуске;Сценарий— последовательность команд;Шаг сценария— команда внутри сценария с порядком выполнения;Группа агентов— frontend-сущность для массового запуска одной команды или сценария на несколько машин;Задача/Task Execution— конкретный запуск команды на агенте со статусом, временем, кодом завершения и итогом;Execution Log— поток stdout/stderr и итоговые логи выполнения;Agent Log— последние события и технические логи агента;API key— credential агента для backend и realtime-подключения;Аналитика по агентам— агрегаты по выполнению задач конкретных агентов;Аналитика по командам— агрегаты по использованию и успешности команд;Метрики агента— количество запусков, среднее время, ошибки за день, activity;Рейтинг агентов— стабильность и скорость работы агентов;Экспорт— выгрузка логов и аналитики вJSON,CSV,PDF.
В репозитории собраны основные части платформы:
front— веб-интерфейс на Next.js;bd— backend на ASP.NET Core / .NET 8;cli-agent— Python CLI-агент для подключения машины;email-fallback— вспомогательный сервис для email-потоков;- Telegram-бот — отдельный сервис для авторизации и уведомлений;
docker-compose.yml— основной сценарий запуска всего решения из корня репозитория.
- регистрация агента через connection token;
- heartbeat и отслеживание online/offline;
- переподключение агента;
- запуск команд и сценариев;
- запуск сценария через отдельный task endpoint;
- групповой запуск на несколько агентов;
- ограничение количества параллельных задач на одном агенте;
- история запусков, stdout/stderr и execution logs.
- сохранённые команды для Linux и Windows;
- системные и пользовательские команды;
- placeholders для параметризованных команд;
- сценарии как последовательность шагов;
- запуск на одном агенте и по группе агентов;
- прогресс сценария по количеству завершённых шагов;
- сравнение результатов базовых проверок между успешными запусками.
- количество запусков;
- среднее время выполнения;
- число ошибок за день;
- аналитика по агентам;
- аналитика по командам;
- метрики по конкретному агенту;
- рейтинг агентов по стабильности и скорости;
- экспорт результатов в
JSON,CSV,PDF.
- JWT и cookie-сессии;
- подтверждение email;
- сброс пароля по email;
- восстановление пароля через код из письма;
- API key для агента;
- токен подключения агента;
- базовая авторизация для UI и API.
- realtime-обновления через SignalR;
- логи выполнения задач;
- live-обновление execution logs на фронте;
- экспорт логов и аналитики;
- интеграция с OpenTelemetry и Loki;
- фоновые задачи через Hangfire.
- Telegram-бот для авторизации в системе;
- уведомления в Telegram об успешном или неуспешном выполнении задач;
- внутренний webhook-маршрут для доставки task notifications в бот.
Telegram-бот можно запускать отдельно от основного docker-compose как независимый сервис интеграции с SysEye API.
Система ориентирована на инфраструктурные проверки и диагностику:
- hostname;
- IP-адреса;
- сетевые интерфейсы;
- версия ОС;
- список доступных сервисов или портов;
- выполнение заранее заданных диагностических команд;
- сбор базовой сетевой информации;
- сравнение результатов между двумя запусками.
Дополнительно реализованы:
- пропуск прерванных циклических команд в сравнении;
- история изменений по машине;
- краткие автоматические сводки по результатам проверки;
- прогресс выполнения сценариев по шагам.
Высокоуровневый поток выглядит так:
- пользователь работает через веб-интерфейс;
- frontend отправляет запросы в backend;
- backend управляет агентами, задачами, логами и аналитикой;
- агент подключается к backend по token/API key;
- агент получает команды, исполняет их и возвращает результат;
- backend сохраняет историю и рассылает realtime-события;
- email и фоновые задачи обрабатываются через отдельные сервисы и Hangfire.
Для агента используется смешанная схема взаимодействия:
- realtime/socket для live-событий;
- HTTP internal API как регистрация, heartbeat и fallback;
- API key как credential агента;
- connection token как способ первичного подключения машины.
C# / .NET 8ASP.NET CoreEntity Framework CoreSignalRPostgreSQLRedisHangfireOpenTelemetryGrafana LokiSMTP (MailKit)
Next.jsReact- server-rendered и SPA-подход для dashboard-части
Python- CLI / daemon-подход
- работа через HTTP + realtime
DockerDocker Compose
Подробный запуск backend уже описан в run.md.
Backend проекта находится в каталоге bd.
Основной рекомендуемый запуск всего проекта:
cd /home/user/Desktop/syseye
docker compose up -d --buildОстановка:
docker compose downПроверка контейнеров:
docker compose psПосле запуска основные адреса такие:
- frontend:
http://localhost:3001 - backend:
http://localhost:5000 - swagger:
http://localhost:5000/swagger/index.html
Важно:
- для сайта наружу должен открываться
frontend, а неbackend; - если домен смотрит на
5000, браузер попадёт в ASP.NET API и будет получать404.
Backend покрывает следующие основные группы API:
Auth— login, logout, register, refresh;User— профиль и переименование пользователя;Agent— создание, просмотр, обновление, удаление, heartbeat;Command— CRUD команд и CRUD плейсхолдеров;Scenario— CRUD сценариев и CRUD шагов сценария;Task— запуск команды, запуск сценария, история задач по агенту и по пользователю;Logs— execution logs, regex logs, последние логи агента;Analytics— агрегаты по агентам и командам, agent metrics, agent ratings;ApiKey— выпуск, отзыв и просмотр ключа агента;EmailConfirm— подтверждение почты;PasswordReset— смена пароля из профиля и восстановление по email;Export— экспорт логов, выполнений и аналитики вJSON,CSV,PDF;Heartbeat— health endpoint.
syseye/
├── README.md
├── docker-compose.yml
├── bd/
│ ├── README.md
│ ├── configuration.md
│ ├── run.md
│ ├── telegram-bot-webhook.md
│ ├── hackaton/
│ │ ├── .env
│ │ └── secrets/
│ └── src/
│ ├── Application/
│ ├── Domain/
│ ├── Infrastructure/
│ └── Hackaton/
├── front/
├── cli-agent/
└── email-fallback/
Дополнительно:
- backend-документация: README.md
- backend-конфигурация: configuration.md
- backend-запуск: run.md
- Telegram webhook integration: telegram-bot-webhook.md
Конфигурация загружается из:
.envDocker Secrets(/run/secrets/*)
appsettings.jsonuser secrets
Конфигурация валидируется через IOptions.
Подробно: configuration.md
Секреты читаются из /run/secrets/*.
Используются для:
| Секрет | Описание |
|---|---|
db_password |
Пароль PostgreSQL |
jwt_secret |
Секрет JWT |
redis_password |
Пароль Redis |
email |
Email отправителя |
email_password |
Пароль почты |
| Поле | Тип | Описание |
|---|---|---|
LogLevel |
string |
Уровень логирования |
ConsoleEnabled |
bool |
Включить вывод в консоль |
FileEnabled |
bool |
Включить запись в файл |
LogPath |
string |
Путь к лог-файлам |
| Поле | Тип | Описание |
|---|---|---|
AccessCookieName |
string |
Cookie для access токена |
RefreshCookieName |
string |
Cookie для refresh токена |
ResetPasswordCookieName |
string |
Cookie для сброса пароля |
UserIdCookieName |
string |
Cookie с ID пользователя |
SessionCookieName |
string |
Cookie сессии |
Issuer |
string |
Издатель токена |
Audience |
string |
Аудитория |
AccessTokenExpirationMinutes |
int |
Время жизни access токена |
RefreshTokenExpirationDays |
int |
Время жизни refresh токена |
| Поле | Тип | Описание |
|---|---|---|
SwaggerEnabled |
bool |
Включить Swagger UI |
| Поле | Тип | Описание |
|---|---|---|
DatabaseConnectionTemplate |
string |
Шаблон строки подключения PostgreSQL |
RedisConnectionTemplate |
string |
Шаблон строки подключения Redis |
RedisInstanceName |
string |
Префикс ключей Redis |
Важно:
пароли подставляются в {0} из secrets.
| Поле | Тип | Описание |
|---|---|---|
MaxRetryCount |
int |
Максимальное число повторов |
EnableRetryOnFailure |
bool |
Включить retry |
UseExponentialBackoff |
bool |
Использовать exponential backoff |
FixedDelayMs |
int |
Фиксированная задержка (мс) |
| Поле | Тип | Описание |
|---|---|---|
ApiKeyHeader |
string |
HTTP заголовок API ключа |
AgentIdHeader |
string |
HTTP заголовок ID агента |
UseApiKeyAccess |
bool |
Включить авторизацию по API ключу |
| Поле | Тип | Описание |
|---|---|---|
Host |
string |
SMTP сервер |
Name |
string |
Имя отправителя |
Port |
int |
Порт |
MaxRetryAttempts |
int |
Количество попыток отправки |
UsePortAndSsl |
bool |
Использовать SSL |
TimeoutSeconds |
int |
Таймаут запроса |
RetryDelaySeconds |
int |
Задержка между попытками |
| Поле | Тип | Описание |
|---|---|---|
BaseUrl |
string |
URL Loki |
TimeoutSeconds |
int |
Таймаут запросов |
| Поле | Тип | Описание |
|---|---|---|
Endpoint |
string |
Endpoint OTel Collector |
| Поле | Тип | Описание |
|---|---|---|
ResourcesPath |
string |
Путь к шаблонам email |
EmailTemplateWithCodeFileName |
string |
Имя HTML шаблона |
| Поле | Тип | Описание |
|---|---|---|
EmailTokenExpirationMinutes |
int |
Время жизни кода подтверждения |
EmailTokenLength |
int |
Длина кода подтверждения |
PasswordTokenExpirationMinutes |
int |
Время жизни кода сброса пароля |
PasswordTokenLength |
int |
Длина кода сброса пароля |
| Поле | Тип | Описание |
|---|---|---|
AllowedOrigins |
string |
Список разрешённых CORS origin |
Формат: строка через запятую.
Бэкенд-сервис для системы агентов диагностики и управления командами.
C# / .NET 8ASP.NET CoreEntity Framework CoreSignalR— realtime взаимодействие:- frontend ↔ backend
- backend ↔ agents
PostgreSQL— основная база данныхRedis— кратковременные сущностиHangfire— очередь фоновых задачOpenTelemetry— сбор логов и метрикGrafana Loki— хранение логовSMTP (MailKit)— отправка почты
Схема работы:
- API ставит задачу в очередь
- Hangfire обрабатывает её
- письмо отправляется в фоне через SMTP
Используется JWT:
Access TokenRefresh TokenCookiesдля хранения
Дополнительно:
- подтверждение email
- сброс пароля через email
- агенты отправляют логи в backend по вебсокету / SignalR;
- backend экспортирует их в OpenTelemetry Collector по gRPC;
- collector обрабатывает и отправляет данные в Loki.
Frontend расположен в front и отвечает за:
- регистрацию и вход;
- dashboard агентов;
- страницы агента и группы;
- историю выполнения и логи;
- сценарии и команды;
- аналитику и экспорт;
- настройки профиля и подтверждение email.
Агент расположен в cli-agent.
Что он делает:
- подключается по connection token;
- создаёт или восстанавливает agent record;
- шлёт heartbeat;
- получает и выполняет задачи;
- отправляет stdout/stderr и финальный статус;
- может запускаться как background-процесс или сервис.
Подробности: README.md
В решении предусмотрен Telegram bot для авторизации пользователей через SysEye site API и доставки уведомлений о задачах в Telegram.
Что делает бот:
- логинит Telegram-пользователя в сайт через
POST /api/auth/login; - хранит site cookies и связанный
site_user_id; - показывает профиль через
/me; - показывает агентов через
/agents; - принимает внутренние task webhooks от SysEye;
- может дополнительно опрашивать историю задач и досылать пропущенные уведомления после рестарта.
/startили/help— показать помощь/login— начать flow входа/me— показать текущий профиль/agents— показать агентов аккаунта/logout— очистить site session/notifications_on— включить уведомления/notifications_off— выключить уведомления/cancel— отменить текущий input flow
Бот читает .env из корня своего проекта.
Обязательные переменные:
BOT_TOKENSITE_BASE_URLSITE_LOGIN_PATHSITE_LOGOUT_PATHSITE_USER_INFO_PATH
Необязательные переменные:
BOT_NAME=Shkets Auth BotSITE_REFRESH_PATH=/api/auth/refreshSITE_AGENTS_PATH=/api/agentSITE_TIMEOUT_SECONDS=5SESSION_STORAGE_PATH=data/sessions.jsonNOTIFICATION_STORAGE_PATH=data/notification_settings.jsonTASK_STATE_STORAGE_PATH=data/task_notification_state.jsonINTERNAL_NOTIFICATIONS_ENABLED=trueINTERNAL_NOTIFICATIONS_HOST=0.0.0.0INTERNAL_NOTIFICATIONS_PORT=8081INTERNAL_NOTIFICATIONS_PATH=/internal/notificationsINTERNAL_NOTIFICATIONS_SECRET=replace_meINTERNAL_NOTIFICATIONS_SECRET_HEADER=X-Webhook-SecretHISTORY_POLLING_ENABLED=trueHISTORY_POLLING_INTERVAL_SECONDS=10HISTORY_POLLING_TAKE=20
Минимальный локальный пример:
BOT_TOKEN=123456:replace_me
BOT_NAME=Shkets Auth Bot
SITE_BASE_URL=http://127.0.0.1:5000
SITE_LOGIN_PATH=/api/auth/login
SITE_LOGOUT_PATH=/api/auth/logout
SITE_USER_INFO_PATH=/api/user/info
SITE_AGENTS_PATH=/api/agent
INTERNAL_NOTIFICATIONS_ENABLED=true
INTERNAL_NOTIFICATIONS_SECRET=replace_meЗапуск:
python run_bot.pyЕсли нужен полный путь до Python:
C:\Users\user\AppData\Local\Programs\Python\Python314\python.exe run_bot.pyБот хранит локальное состояние в JSON-файлах:
data/sessions.json— site cookies, Telegram binding, linkedsite_user_id, last fetched profiledata/notification_settings.json— состояние уведомленийdata/task_notification_state.json— последнее доставленное состояние задачи для history polling
Пароли не сохраняются.
Когда INTERNAL_NOTIFICATIONS_ENABLED=true, бот поднимает внутренний HTTP receiver на настроенных host, port и path.
Ожидаемый запрос:
POST /internal/notificationsContent-Type: application/json- secret header, по умолчанию
X-Webhook-Secret - JSON body с верхнеуровневым
userId
Бот сопоставляет webhook userId со связанным site_user_id и отправляет уведомления только тем Telegram-пользователям, которые уже авторизованы и включили /notifications_on.
Если webhook временно потерян, history poller может подобрать изменения из site API позже.
- auth flow использует JSON login:
{"login":"...","password":"..."} - после login бот запрашивает
SITE_USER_INFO_PATHи сохраняет site user id - для локальной разработки сначала должен быть поднят сам SysEye
Дополнительно: telegram-bot-webhook.md
- backend: README.md
- backend configuration: configuration.md
- backend run guide: run.md
- cli-agent: README.md
- если нужны актуальные локальные изменения, поднимай проект из корня репозитория, а не из
bd/hackaton; bd/hackaton/docker-compose.ymlи корневойdocker-compose.ymlне эквивалентны;- сайт должен открываться через
frontend, а не черезbackend; - конфигурация backend валидируется на старте;
- для production нужны корректные секреты, SMTP и
AllowedOrigins.