← К списку документов
Главная / Документация / Установка Комендант MDM On-Premise

Установка Комендант MDM On-Premise

Системные требования, pre-install checklist, пошаговая установка, бэкапы и обновления. Для IT-администраторов заказчика.

Документ для IT-администратора заказчика. Устанавливает полностью автономную инсталляцию Комендант MDM на собственную инфраструктуру без обращения к облаку komendant-mdm.ru.

Содержание

  1. Системные требования
  2. Pre-install checklist
  3. Установка
  4. Первый вход и онбординг
  5. Бэкапы и offsite
  6. Обновление и откат
  7. Типовые ошибки установки

1. Системные требования

Минимум (до 100 устройств)

Компонент Значение
ОС Ubuntu 24.04 LTS server (amd64)
vCPU 4
RAM 8 GB
Диск (система + БД) 100 GB SSD
Диск (MinIO/offsite) 200 GB отдельным разделом
Сеть 1 Gbit, фикс. IP

Рекомендовано (100–500 устройств)

Компонент Значение
vCPU 8
RAM 16 GB
Диск 250 GB NVMe + 500 GB MinIO
Резерв master+hot-standby PostgreSQL

Софт-стек (разворачивается ./install.sh)

  • PostgreSQL 17 (основная БД, RLS FORCE)
  • Redis 7.4 (сессии, rate-limit, очереди)
  • EMQX 5.10 (MQTT для DPC-агентов, TLS на 8883)
  • coturn 4.6 (TURN/STUN для Remote Assist)
  • MinIO (S3-совместимое хранилище для APK, логов, бэкапов)
  • nginx 1.24 + certbot (reverse proxy + letsencrypt)
  • Komendant API (Go 1.26, systemd unit komendant-api)
  • Komendant Admin UI (Next.js, systemd unit komendant-admin)
  • Prometheus + Grafana + Loki + Alertmanager (observability под /ops)

Доступы в интернет (исходящие)

Назначение Адрес Порт
letsencrypt acme-v02.api.letsencrypt.org 443
NTP pool.ntp.org 123/udp
Offsite-бэкап S3 ваш endpoint 443
Репозитории обновлений updates.komendant-mdm.ru 443
Проверка лицензии (offline)

Входящие: 443 (admin UI, API), 8883 (MQTT-TLS), 3478/5349 TCP+UDP (TURN). Порт 80 только для ACME-challenge, редирект на 443.


2. Pre-install checklist

Всё ниже должно быть готово до запуска install.sh.

2.1. Домен и DNS

Нужно 3 поддомена под один корневой (пример для mdm.example.ru):

Запись Назначение
mdm.example.ru A admin UI + landing
api.mdm.example.ru A backend API
mqtt.mdm.example.ru A MQTT broker (TLS)

Опционально: turn.mdm.example.ru (Remote Assist), ops.mdm.example.ru (observability).

Все А-записи указывают на IP сервера. TTL 300 на время установки.

2.2. Firewall

ufw allow 22/tcp       # SSH
ufw allow 80/tcp       # ACME
ufw allow 443/tcp      # HTTPS
ufw allow 8883/tcp     # MQTT-TLS
ufw allow 3478/tcp     # TURN
ufw allow 3478/udp     # TURN
ufw allow 5349/tcp     # TURN-TLS
ufw allow 49152:65535/udp  # TURN media relay
ufw enable

2.3. Почтовый SMTP-релей

Комендант отправляет письма (приглашения, алёрты, SLA, отчёты). Нужен SMTP-сервер (ваш корпоративный или внешний — Яндекс 360, VK WorkMail, Mailion, СберКорус).

Подготовьте: host, port (465/587), user, password, from-address.

2.4. S3-offsite хранилище (обязательно)

Для бэкапов БД и master-ключа лицензии. Любой S3-совместимый: - Yandex Object Storage - VK Cloud Solutions S3 - Selectel Cloud Storage - Ваш собственный MinIO в другом ЦОДе

Нужны: endpoint, bucket name, access key, secret key.

Без offsite-хранения бэкапов инсталляция считается некорректной и классифицируется как incident risk — пожар в ЦОДе → потеря всех данных.

2.5. Лицензия

Купленный лицензионный ключ-файл license.json (Ed25519-подписанный). Выдаётся после подписания договора. Содержит: tenant_id, max_devices, expiry, feature flags.

2.6. Сертификаты (опционально для ФСТЭК-compliance)

Если требуется соответствие ФСТЭК (заказчики госсектора): - сертификат ФСТЭК на сервер (УЗ-1 или УЗ-2) - TLS-сертификаты через ГОСТ-удостоверяющий центр (КриптоПро)

Для SMB и частного сектора letsencrypt достаточно.

2.7. Проверка готовности

# проверка DNS
dig +short mdm.example.ru
dig +short api.mdm.example.ru
dig +short mqtt.mdm.example.ru

# проверка портов изнутри
ss -tln | grep -E ':(443|8883|3478)'

# проверка SMTP
swaks --to test@example.ru --server smtp.example.ru:587 --auth --auth-user user --auth-password pass

# проверка S3
aws --endpoint-url https://s3.example.ru s3 ls s3://komendant-backups/

3. Установка

3.1. Получение дистрибутива

Скачайте подписанный архив с updates.komendant-mdm.ru (URL высылается после оплаты):

mkdir -p /opt/komendant
cd /opt/komendant
wget https://updates.komendant-mdm.ru/releases/komendant-onprem-<VERSION>.tar.gz
wget https://updates.komendant-mdm.ru/releases/komendant-onprem-<VERSION>.tar.gz.sig
wget https://updates.komendant-mdm.ru/releases/komendant-pubkey.pem

3.2. Проверка подписи

openssl dgst -sha256 -verify komendant-pubkey.pem \
  -signature komendant-onprem-<VERSION>.tar.gz.sig \
  komendant-onprem-<VERSION>.tar.gz
# должно вывести: Verified OK

Если Verification Failureне распаковывать, обращаться в поддержку.

3.3. Распаковка

tar xzf komendant-onprem-<VERSION>.tar.gz --strip-components=1
chmod +x install.sh bin/*

Структура:

/opt/komendant/
  install.sh         # установщик
  bin/               # бинарники (api, admin, cli)
  config/            # шаблоны .env
  migrations/        # SQL миграции
  ansible/           # плейбуки
  images/            # air-gapped docker images (EMQX, Redis, MinIO)

3.4. Заполнение .env

cp config/.env.example infra/.env
chmod 600 infra/.env
nano infra/.env

Минимально заполнить:

# Домены
KOMENDANT_DOMAIN=mdm.example.ru
KOMENDANT_API_DOMAIN=api.mdm.example.ru
KOMENDANT_MQTT_DOMAIN=mqtt.mdm.example.ru

# PostgreSQL
POSTGRES_PASSWORD=<сгенерируйте openssl rand -base64 32>
KOMENDANT_APP_DB_PASSWORD=<отдельный пароль для komendant_app role>

# Redis
REDIS_PASSWORD=<...>

# MQTT admin
EMQX_DASHBOARD_PASSWORD=<...>

# MinIO
MINIO_ROOT_USER=komendant
MINIO_ROOT_PASSWORD=<...>

# SMTP
SMTP_HOST=smtp.example.ru
SMTP_PORT=587
SMTP_USER=mdm@example.ru
SMTP_PASSWORD=<...>
SMTP_FROM="Комендант MDM <mdm@example.ru>"

# S3 offsite backups
BACKUP_S3_ENDPOINT=https://s3.example.ru
BACKUP_S3_BUCKET=komendant-backups
BACKUP_S3_ACCESS_KEY=<...>
BACKUP_S3_SECRET_KEY=<...>
BACKUP_PASSPHRASE=<сгенерируйте openssl rand -base64 48>

# Observability (basic-auth для /ops)
OPS_USER=ops
OPS_PASSWORD=<...>

# Лицензия
LICENSE_FILE=/opt/komendant/license.json

3.5. Активация лицензии

cp /path/to/license.json /opt/komendant/license.json
chmod 600 /opt/komendant/license.json
./bin/komendant-cli license verify

Должно вывести valid until <date>, max_devices=<N>.

3.6. Запуск install.sh

./install.sh 2>&1 | tee install.log

Скрипт выполняет: 1. apt update && apt install зависимостей (postgresql-17, redis, nginx, certbot, docker) 2. Инициализация БД: создание ролей komendant_owner (для миграций) и komendant_app (NOBYPASSRLS для приложения), применение всех миграций 3. Запуск EMQX, Redis, MinIO в docker-compose 4. Получение TLS-сертификатов через certbot 5. Генерация конфигов nginx, systemd-юнитов 6. Первый запуск komendant-api, komendant-admin 7. Health-check: curl https://api.mdm.example.ru/readyz

Время: 10–15 минут на типовой VPS.

3.7. Air-gapped режим

Если сервер не имеет выхода в интернет:

./install.sh --offline --bundle=./images/bundle.tar.gz

Все docker-образы и apt-пакеты предзагружены в images/. TLS-сертификаты в air-gapped — собственный CA или самоподписанный (передать путь в TLS_CERT_PATH=, TLS_KEY_PATH=).


4. Первый вход и онбординг

4.1. Создание супер-админа

./bin/komendant-cli admin create \
  --email admin@example.ru \
  --name "Иван Иванов" \
  --superadmin

Пароль выведется в консоль один раз, сохраните в секрет-менеджер. MFA обязателен — при первом входе предложит настроить TOTP.

4.2. Вход в admin UI

Открыть https://mdm.example.ru → email + пароль + TOTP-код → /settings/security → сохранить backup recovery codes (10 одноразовых).

4.3. Создание первого tenant

Супер-админ по умолчанию без привязки к tenant. Создаём рабочий tenant для компании:

/admin/tenants → New Tenant
  name: "ГК Триол"
  slug: triol
  plan: enterprise-onprem
  max_devices: 500

После создания — Invite admin → ввод email tenant-админа → на почту уходит приглашение с ссылкой на активацию.

4.4. Загрузка DPC APK

/downloads содержит стандартный DPC-клиент. Для брендирования:

/settings/branding
  logo: upload logo.png (1024x1024)
  primary_color: #XXXXXX
  app_name: "Корпоративный агент"
→ Build APK

Собранный APK появится в /downloads через 2–3 минуты. QR-код для enroll генерируется в /enroll/qr.

4.5. Enroll первого устройства

  1. Сброс Android-устройства до заводских (factory reset)
  2. На экране приветствия 6 раз тап по Welcome → сканер QR
  3. Сканировать QR с /enroll/qr → устройство ставит DPC
  4. DPC подключается к mqtt.mdm.example.ru:8883 → появляется в /devices

Подробный troubleshooting enroll — см. troubleshooting.md.


5. Бэкапы и offsite

5.1. Что бэкапится

Что Куда Частота Retention
PostgreSQL (pg_dump --format=custom) /var/backups/komendant/db/ каждый час 168 часов локально + 90 дней offsite
MinIO (APK, логи, artefacts) /var/backups/komendant/s3/ раз в сутки 30 дней
master-ключ лицензии offsite only (encrypted) при изменении постоянно
TLS-сертификаты /var/backups/komendant/tls/ при renew 90 дней
Конфиги (.env, nginx, systemd) /var/backups/komendant/conf/ при изменении 30 дней

5.2. Cron и systemd timer

Установлен komendant-backup.timer (systemd), OnCalendar=hourly. Лог в journalctl -u komendant-backup.service.

5.3. Offsite S3

После каждого успешного локального бэкапа backup.sh шифрует AES-256-GCM с BACKUP_PASSPHRASE и заливает в s3://<BACKUP_S3_BUCKET>/.

Проверить:

aws --endpoint-url $BACKUP_S3_ENDPOINT s3 ls s3://komendant-backups/db/ | tail -5

Если за последние 2 часа нет новых файлов — Alertmanager шлёт алёрт KomendantBackupStale.

5.4. Восстановление (DR)

Полный runbook — docs/runbooks/dr-restore.md. Короткая процедура:

# 1. Остановить api
systemctl stop komendant-api komendant-admin

# 2. Восстановить БД
aws --endpoint-url $BACKUP_S3_ENDPOINT s3 cp s3://komendant-backups/db/<latest>.dump.enc - \
  | openssl enc -d -aes-256-gcm -pass file:/root/.backup_passphrase \
  | pg_restore -d komendant --clean --if-exists

# 3. Восстановить master-ключ
aws --endpoint-url $BACKUP_S3_ENDPOINT s3 cp s3://komendant-backups/secrets/master.enc - \
  | openssl enc -d -aes-256-gcm -pass file:/root/.backup_passphrase \
  > /root/komendant-secret/license_master_private.pem

# 4. Старт
systemctl start komendant-api komendant-admin
curl https://api.mdm.example.ru/readyz

RTO: 30 минут. RPO: 1 час.


6. Обновление и откат

6.1. Обновление

cd /opt/komendant
./bin/komendant-cli update check        # видим что доступна 1.x.y
./bin/komendant-cli update download     # скачивает signed manifest + архив
./bin/komendant-cli update verify       # проверка подписи Ed25519
./bin/komendant-cli update apply        # применяет, делает pre-backup

Прерывание API — ~30 секунд (graceful restart).

6.2. Откат

./bin/komendant-cli update rollback

Откатывает бинарник и SQL-миграции до предыдущего снапшота. Rollback через 2+ версии не поддерживается — тогда через DR-restore из бэкапа.


7. Типовые ошибки установки

Симптом Причина Решение
install.sh падает на certbot DNS не прокачался дождитесь распространения А-записей, повторите certbot --nginx -d mdm.example.ru
install.sh падает на PostgreSQL permission denied кто-то уже установил pg с другим паролем pg_dropcluster 17 main && pg_createcluster 17 main и повтор
API не стартует, license expired часы сервера спешат/отстают timedatectl set-ntp true && sync
Admin UI 502 порт 3040 занят ss -tlnp | grep 3040 → найти конфликт, поменять KOMENDANT_ADMIN_PORT
MQTT не принимает TLS EMQX не получил сертификат docker exec emqx emqx ctl listeners → проверить, что 8883 ssl. Перегенерировать через ./bin/komendant-cli mqtt cert-refresh
readyz возвращает 503 с redis: connection refused Redis не стартанул systemctl status redis-server, journalctl -u redis-server -n 50

Остальные проблемы — см. troubleshooting.md.


Версия документа: 1.0 (2026-04-18). Для вопросов: support@komendant-mdm.ru.