RoutineOps
Своя система управления парком устройств (MDM/RMM) на одном сервере: агенты для Windows, macOS и Linux, инвентаризация, удаленный запуск скриптов и политики - без облачной панели вендора. Развернули на Fatmetal Cloud Server, завели сам сервер как управляемое устройство и удаленно выполнили на нем скрипт.
Вердикт
- небольшой парк рабочих станций и серверов (Windows/macOS/Linux) под одной панелью без облака
- нужны инвентарь, удаленный запуск скриптов и политики по расписанию/событию
- ценят легкость: весь стек в простое держится в пределах ~41 MiB RAM
- нужен зрелый проверенный вендор с поддержкой: проект молодой, соло-автор, 7 звезд на GitHub
- нужен полноценный Apple MDM (DEP/ABM, конфиг-профили) или патч-менеджмент из коробки
- нужна валидная публичная TLS на веб-консоли без ручной возни
Что это и какую задачу решает
RoutineOps - self-hosted платформа класса MDM/RMM: одна панель, из которой видно весь парк устройств и можно им управлять. На каждое устройство ставится агент (Windows - MSI, macOS - pkg, Linux - systemd-служба), он держит постоянный канал с сервером по gRPC поверх mTLS и без VPN. Через панель собирается инвентарь, гоняются скрипты, применяются политики и правила комплаенса.
Проще говоря, это замена облачным Intune, VMware Workspace ONE и SaaS-RMM вроде Tactical RMM - но сервер и все данные о машинах остаются у вас. Из коробки: инвентаризация (ОС, CPU/RAM/диск, IP, серийник, список установленного ПО, события процессов), библиотека скриптов с разовым запуском и политиками по расписанию, группы устройств, софт-политики allowed/forbidden, блокировка устройства (работает офлайн), RBAC (роли it_admin/viewer), аудит с настраиваемым retention, алерты в Telegram и самообновление агентов с проверкой подписи ed25519.
Чем отличается от платных аналогов
Сравнение с облачными MDM/RMM по тому, что влияет на выбор.
| Параметр | RoutineOps | Облачный MDM/RMM (Intune, Workspace ONE, SaaS-RMM) |
|---|---|---|
| Модель цены | бесплатно, open-source | подписка за устройство/пользователя в месяц |
| Где данные о машинах | на вашем сервере | в облаке вендора |
| Кросс-ОС | Windows / macOS / Linux | обычно Windows/Apple, Linux частично |
| Канал агента | gRPC/mTLS напрямую, без VPN | через облако вендора |
| Зрелость | молодой проект (7 звезд, соло-автор) | зрелые продукты с поддержкой |
| Патч-менеджмент, Apple DEP/ABM | нет из коробки | есть |
Тех-стек и архитектура
Сервер и веб-консоль написаны на Go, веб отдается через nginx. Состояние - в PostgreSQL 16, очереди и эфемерные данные - в Redis 7. Весь стек - четыре контейнера, поднимается одним docker compose.
Связь агента с сервером - строго mTLS на порту :50051 (gRPC). Канал энроллмента отдельный: server-auth TLS через nginx на :443 плюс одноразовый токен - на момент энроллмента mTLS-идентичности у устройства еще нет, ее агент и получает. Публичный ключ для проверки подписи обновлений агент тоже получает при энроллменте по доверенному каналу с пином CA, а не вшивается в сборку. Агенты собираются под три платформы: Windows (MSI), macOS (pkg), Linux (systemd-служба под root).
Минимальная конфигурация
Реальные требования против официального минимума.
| Официальный минимум (до 50 устройств) | 1 vCPU / 2 GB / 20 GB |
| RAM всего стека в простое | ~41 MiB (4 контейнера) |
| Образы на диске | ~620 MB суммарно |
| Рекомендуем тариф | CPU2-RAM4-DISK50 |
Важно: сам рантайм ест копейки, но install.sh собирает сервер и веб из исходников и компилирует агенты сразу под три ОС. На эту сборку нужен запас CPU и диска, поэтому берем младший тариф за 500 руб/мес, а не самый минимальный - иначе первая сборка растянется.
Развертывание на Fatmetal
Базовый путь - Cloud Server + Ubuntu 24.04 + Docker из маркетплейса.
Создать VM
Fatmetal Cloud Server, Ubuntu 24.04, приложение Docker из маркетплейса. Docker доустанавливается облачным cloud-init еще пару минут после старта.
Забрать репозиторий и запустить установщик
git clone https://github.com/Floodww/RoutineOps.git cd RoutineOps ./install.shУстановщик генерит свой Root CA и серверный сертификат, кладет
.env.prod, создает ключ подписи релизов ed25519, поднимает docker compose, прогоняет миграции и собирает агенты под Windows/Linux/macOS.Открыть консоль
Веб-консоль поднимается на
https://<IP-или-домен>. Логин администратора установщик печатает в конце (email + пароль). Проверка живости:curl -k https://localhost/api/v1/auth/login.Завести устройство
В разделе Устройства - Добавить устройство: панель выдает одноразовый enrollment-токен. На машине запускаете агента командой
agent enrollс этим токеном - он получает mTLS-сертификат и регистрируется как служба.
Что измерили после запуска
Цифры со свежей установки на живом стенде, без нагрузки.
| RAM всего стека в простое | ~41 MiB |
| - сервер | 3.36 MiB |
| - веб | 4.25 MiB |
| - postgres | 30.1 MiB |
| - redis | 3.36 MiB |
| Образы: server / web | 47.9 MB / 93.9 MB |
| Образы: postgres / redis | 420 MB / 57.8 MB |
| Контейнеров | 4 |
| Версия | 2.4.5 |
Мы не просто открыли пустую панель. Завели сам стенд как Linux-устройство (агент по mTLS) - он сразу отдал инвентарь: Ubuntu 24.04.4 LTS, CPU Intel Xeon Platinum 8270, RAM 3.8 ГБ, диск 47 ГБ, серийник, 755 установленных пакетов. Потом создали скрипт и удаленно запустили его на устройстве - вернулся реальный вывод (uptime и df -h), задача перешла в статус Выполнена.
Проверено на версии 2.4.5, июль 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Self-signed на консоли. Установщик генерит свой Root CA и серверный сертификат - браузер на веб-консоль ругается, валидного публичного TLS по умолчанию нет. Для внутреннего MDM это штатно: свой PKI - основа mTLS-доверия агентов. Но не спешите бездумно фронтить консоль через Let's Encrypt: сломаете канал агентов, который завязан на этот же CA.
Служба стучится в localhost. Если энроллить агента прямо на сервере с -server localhost:50051, служба зашьет localhost. Для реального удаленного устройства передавайте настоящий адрес сервера - установщик про это предупреждает WARN-ом.
Причина. При энроллменте с -ca-url агент требует пин -ca-sha256 - защита от MITM, чтобы CA-бандл не подменили по дороге.
Решение. Передайте хеш CA флагом -ca-sha256 <hex> либо разложите CA локальным файлом через -ca /path/ca.crt и уберите -ca-url.
Безопасность и обновления
Канал агент-сервер - mTLS, у каждого устройства свой клиентский сертификат. Доступ в панель - RBAC (роли it_admin/viewer), сессия в HttpOnly-cookie с JWT. Агенты самообновляются с проверкой подписи ed25519, ключ приходит при энроллменте по доверенному каналу. Аудит пишется с настраиваемым retention, алерты можно слать в Telegram.
Обновление - подтянуть свежий код и перезапустить установщик (он пересоберет образы и агенты):
git pull && ./install.sh
Бэкап состояния - дамп PostgreSQL:
docker exec routineops-postgres-1 pg_dump -U postgres routineops > backup.sql
Чек-лист перед продом: сменить дефолтный пароль администратора; сохранить .env.prod и материал CA в секрет-хранилище; настроить бэкап postgres по расписанию; ограничить доступ к порту :50051 сетью устройств; решить вопрос с публичным TLS консоли, не ломая CA агентов; учесть незрелость проекта в модели рисков.
Связь с другими стеками
- Обратный прокси - Caddy или Nginx Proxy Manager перед консолью, но аккуратно: канал агентов на
:50051оставляем на родном mTLS, прокси только на веб. - Бэкапы - pg_dump плюс выгрузка в S3-совместимое хранилище.
- Мониторинг - Grafana и Prometheus поверх метрик хоста и контейнеров.
- Алерты - Telegram-бот уже встроен, отдельный стек не нужен.
Когда это НЕ ваш выбор
Нужен зрелый вендор с поддержкой и SLA
Проект молодой: 7 звезд на GitHub, один автор, версия 2.4.5. Для парка, где цена простоя высокая, а безопасность критична, это осознанный риск - агент MDM работает на устройстве с правами root.
Нужен полноценный Apple MDM или патч-менеджмент
DEP/ABM, конфиг-профили Apple, автоматическая установка обновлений ОС из коробки - этого нет. RoutineOps закрывает инвентарь, скрипты и политики, а не весь спектр enterprise-MDM.
Парк - только мобильные Android
Для управления флотом Android-смартфонов есть профильные Android-MDM. RoutineOps ориентирован на рабочие станции и серверы Windows/macOS/Linux.
Частые вопросы
Можно поставить без Docker?
Штатный путь - ./install.sh на docker compose. Отдельной инструкции без Docker нет.
Хватит ли 2 GB RAM?
Рантайм всего стека - около 41 MiB, так что для работы хватит с запасом. Но первая сборка из исходников и компиляция агентов под три ОС требуют ресурсов - берите младший тариф с 4 GB, чтобы сборка не растянулась.
Можно в продакшен?
С оговорками. Технически стек рабочий, мы завели устройство и выполнили на нем скрипт. Перед продом закройте чек-лист из раздела про безопасность и трезво оцените незрелость проекта.
Как обновлять?
git pull && ./install.sh - установщик пересоберет образы и агенты. Сами агенты умеют самообновляться с проверкой подписи.
Как делать бэкап?
Дамп PostgreSQL (pg_dump) плюс сохранить .env.prod и материал CA - без них не восстановить доверие агентов.
Нужна ли авторизация?
Да, вход в панель по email/паролю, роли it_admin и viewer (RBAC), сессия в защищенной cookie.
Какие ограничения лицензии?
Apache-2.0 - можно свободно использовать, в том числе коммерчески, с сохранением уведомлений о лицензии.
Итог
RoutineOps - легкий self-hosted MDM/RMM, который реально работает: весь стек держится в пределах ~41 MiB RAM на четырех контейнерах, агент по mTLS собирает инвентарь и выполняет удаленные скрипты, а данные о парке остаются на вашем сервере. Главная оговорка - незрелость: 7 звезд, соло-автор, версия 2.4.5. Хороший кандидат, чтобы поднять свой мини-RMM за вечер и попробовать на некритичном парке, но не замена зрелому вендору для ответственной инфраструктуры.
Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.