Документ для IT-администратора заказчика. Устанавливает полностью автономную инсталляцию Комендант MDM на собственную инфраструктуру без обращения к облаку komendant-mdm.ru.
Содержание
- Системные требования
- Pre-install checklist
- Установка
- Первый вход и онбординг
- Бэкапы и offsite
- Обновление и откат
- Типовые ошибки установки
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 первого устройства
- Сброс Android-устройства до заводских (factory reset)
- На экране приветствия 6 раз тап по
Welcome→ сканер QR - Сканировать QR с
/enroll/qr→ устройство ставит DPC - 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.