English summary: README.en.md
RoutineOps — self-hosted MDM/RMM для парка Windows-, macOS- и Linux-устройств: агенты держат
постоянный gRPC/mTLS-канал с вашим сервером и работают через интернет без VPN.
Версия — файл VERSION.
Любой пользователь, заинтересовавшийся подобным продуктом, задаст вопрос по безопасности, потому что это основа и первое, о чём необходимо беспокоиться. В отличие от подобных конкурирующих продуктов, которые предоставляют «pay to secure», RoutineOps таким не является. Первое правило, которого мы придерживались при разработке: «безопасность не продаётся».
Подробно с самим функционированием и моделью безопасности вы можете ознакомиться в следующих файлах: ARCHITECTURE.md и SECURITY.md.
От себя кратко могу назвать наш стек по безопасности: mTLS (TLS 1.3) с пиннингом приватного CA на всём канале агентов и идентичностью по сертификату (device_id = CN, тело сообщений серверу не доверяется); RBAC; admin-сессии на JWT и lockout'ом по IP и по аккаунту; одноразовые enroll-токены; Ed25519-подпись самообновления агентов с проверкой sha256 и anti-rollback; журнал аудита всех действий администраторов; secure-by-default — обязательный сильный JWT_SECRET, security-заголовки (HSTS/CSP), rate-limit и cap на размер запроса. В моём понимании это максимум для self-hosted продукта. Но для полного понимания настоятельно советую обратиться к файлам, указанным выше.
- Агенты для Windows, macOS и Linux — Windows ставится универсальным MSI, macOS —
.pkg, Linux — systemd-юнитом через сгенерированный installer-скрипт (инвентарь ПО берётся у dpkg/rpm/pacman/apk). - Запрос админ прав — пользователь может на своем устройстве прямо из трея отправить заявку на админ права.
- Инвентаризация — hostname, ОС, CPU/RAM/диск, IP, серийный номер, версия агента, список установленного ПО, события процессов.
- Скрипты — разовый запуск на устройство или группу; политики по расписанию (cron), при подключении агента и по событию; библиотека скриптов и просмотр результатов.
- Группы устройств — членство, цвет группы, фильтр списка устройств по группе, привязка скрипт- и софт-политик, запуск скрипта на всю группу.
- Политики ПО — правила allowed/forbidden по устройству, группе или платформе.
- Комплаенс политик — по каждой софт- и скрипт-политике видно, на сколько устройств она распространяется и сколько из них Pass / Fail.
- Блокировка устройства — полноэкранный overlay с паролем (Windows и macOS), разблокировка работает и офлайн.
- События и алерты —
agent_unreachable(устройство пропало с радаров), запрещённое ПО, несанкционированная установка/изменение настроек; группировка по типу со счётчиком неподтверждённых; уведомления в Telegram. - Журнал аудита — все действия администраторов, retention настраивается (
AUDIT_RETENTION_DAYS, по умолчанию 365 дней). - RBAC — роли
it_admin(полный доступ) иviewer(только чтение); приглашения пользователей по email. - Self-update агентов — подписанные ed25519-релизы, проверка sha256 и подписи манифеста, защита от отката версии.
- mTLS — агент аутентифицируется клиентским сертификатом, сервер выпускает его при enrollment.
-
Сервер. Linux (Ubuntu 22.04+ / Debian 12+), Docker + Compose v2, открытые порты 80/443 (веб, enrollment, загрузки) и 50051 (gRPC агентов). До 50 устройств хватит 1 vCPU / 2 GB RAM / 20 GB SSD. Достаточно статического IP, домен не обязателен. Подробнее:
docs/install.md. -
Установка. Скопируйте шаблон конфигурации, заполните его и запустите — так все параметры уходят в установку сразу и наверняка:
cp install.env.example install.env nano install.env # PUBLIC_ADDR (внешний IP/домен) + ADMIN_EMAIL / ADMIN_PASSWORD ./install.shСкрипт сгенерирует TLS-сертификаты,
.env.prodс секретами, ключ подписи релизов, поднимет compose-стек (миграции накатываются автоматически) и соберёт+опубликует агентов для Windows/Linux/macOS.PUBLIC_ADDR— адрес, по которому к серверу ходят агенты и браузеры извне (внешний IP или домен): за NAT/VPN укажите его явно, иначе enroll по внешнему адресу упадёт на TLS (адрес обязан быть в SAN сертификата; внутренний IP хоста добавляется в SAN автоматически). Запускайте безsudo, от пользователя в группеdocker— иначе root-owned.gitи.env.prodсломают следующий./update.sh(docs/install.md). Подробнее:docs/self-hosted-deploy.md. -
Первый вход:
https://<IP-или-домен>с кредамиADMIN_EMAIL/ADMIN_PASSWORD. Пароль обязан пройти политику сложности (минимум 8 символов, 3 из 4 классов) — со слабым паролем админ не будет создан (в логе сервера —seed admin failed). -
Агенты уже опубликованы шагом 2 и доступны с сервера (
/downloads/...). Обновление в дальнейшем: запустить./update.sh— он подтянет новый релиз (git pull), пересоберёт сервер и переопубликует агентов, а парк подтянет новую версию сам (по умолчанию раз в 6 часов). Подробнее:docs/self-update.md.Кнопки «Скачать MSI/PKG» в UI отдают
releases/RoutineOps-agent.{msi,pkg}(по/downloads/). Эти установщики обновляют иinstall.sh, иupdate.sh— оба копируют их изbuild/msi/RoutineOps-agent.msiиbuild/pkg/RoutineOps-agent.pkg(внутри build-контейнера, чтобы права были читаемы сервером). Значит чтобы выложить новый установщик, достаточно положить свежесобранный файл вbuild/msi/RoutineOps-agent.msi/build/pkg/RoutineOps-agent.pkg(MSI собирается на Windows —build/msi/build-msi.ps1, PKG на macOS) и закоммитить/подтянуть его в репо на сервере: следующий./update.sh(или./install.sh) сам скопирует его вreleases/. Отдельный ручнойsudo cp … releases/нужен только на сервере со старыми скриптами (до июля 2026, когдаupdate.shустановщики не обновлял). -
Подключение устройства: в веб-интерфейсе «Устройства» → «Добавить устройство» — получите одноразовый токен (TTL 24 часа) и готовую команду установки. Windows — универсальный MSI:
msiexec /i RoutineOps-agent.msi /qn ENROLL_URL=... ENROLL_TOKEN=... CA_URL=... CA_SHA256=... SERVER_ADDR=...(все пять свойств обязательны: CA не вшит в MSI, агент качает его поCA_URLи пинит поCA_SHA256). macOS —.pkgс сервера (sudo installer -pkg RoutineOps-agent.pkg -target /, пакет не подписан — двойной клик заблокирует Gatekeeper). Linux/macOS — сгенерированный инсталлерsudo bash install-mdm.sh. Подробнее:docs/install.mdиdocs/enrollment.md.
ARCHITECTURE.md— компоненты системы, каналы связи, границы доверия.docs/install.md— полная установка: требования, сертификаты, порты, публикация агентов.docs/self-hosted-deploy.md—install.sh/update.sh, бэкапы, миграции, откат.docs/enrollment.md— подключение устройств: одноразовые токены, выпуск сертификатов.docs/agent-cli.md— команды, флаги и env-переменные бинарника агента.docs/config-as-code.md— группы, скрипты и политики в YAML:routineops export/apply, конфигурация парка в git.docs/self-update.md— самообновление агентов: подписанные релизы, публикация версии, anti-rollback.docs/operations.md— эксплуатация: бэкапы и восстановление, типовые операции.docs/field-troubleshooting.md— диагностика агента на устройстве (agent diag), типовые причины «агент не выходит на связь».docs/tamper-protection.md— защита агента от удаления пользователем (Windows: SafeBoot + реестр; macOS: флагschg; на Linux — нет), процедура штатного снятия.docs/jwt-secret-rotation.md— ротацияJWT_SECRET(корень доверия admin-сессий).SECURITY.md— модель доверия и обязанности оператора при self-hosted развёртывании.
Что обязательно бэкапить: дамп PostgreSQL, каталог certs/ (особенно ca.key),
release_ed25519.pem (потеря = парк больше не получит обновлений), .env.prod.
Детали — в docs/self-hosted-deploy.md.
| Компонент | Технология |
|---|---|
| Агент | Go |
| Сервер | Go (монолит) |
| Связь агент ↔ сервер | gRPC + Protocol Buffers + mTLS |
| База данных | PostgreSQL 16 |
| Очередь доставки задач агентам | Redis + Asynq |
| Веб-интерфейс | React + TypeScript (Vite), раздаётся nginx-контейнером (web в compose) |
# Поднять Postgres + Redis
docker compose up -d
# Запустить тесты
TEST_POSTGRES_DSN="postgres://mdm:mdm@localhost:55432/mdm?sslmode=disable" go test ./...
# Запустить тесты с детектором гонок
TEST_POSTGRES_DSN="postgres://mdm:mdm@localhost:55432/mdm?sslmode=disable" go test -race ./...Postgres слушает на хост-порту 55432 (внутри контейнера — 5432), пароль mdm.
Enterprise-редакция добавляет к возможностям выше:
| Возможность | Статус |
|---|---|
| FileVault-эскроу ключей восстановления (macOS) | ✅ |
| Принудительная FileVault-блокировка устройства | ✅ |
| Удаление ПО с устройства из интерфейса | в разработке |
| Мультитенантность (отдельные тенанты со своими политиками) | в разработке |
| SSO/OIDC, MFA, SCIM, экспорт в SIEM | в разработке |
| Удалённое подключение к рабочему столу | в планах |
В этой сборке enterprise-функции отсутствуют физически (например,
lock_mode=filevault вернёт 409). Полный список и планы — в docs/ROADMAP.md.
По вопросам Enterprise-лицензии, багам и предложениям — пишите на charmander020104@gmail.com или в Telegram @flood_j, либо открывайте Issue в этом репозитории.