Miran
Статус: доступен · пакет wg-flow-plugin-miran 0.1.0 · провайдер miran · категория cloud.
Плагин читает клиентский кабинет Миран через API BILLmanager: https://bill.miran.ru/billmgr. В инвентарь попадают выделенные серверы, VDS, домены, виртуальный хостинг, колокация и услуги IP. Логин и пароль остаются в YAML агента.
Один source — один логин кабинета. Плагин только читает API и не заказывает услуги. Сначала открывается сессия (func=auth), дальше в запросах передаётся только её номер. Пароль уходит в теле POST, не в URL. Сессия привязана к IP агента и живёт около часа с последнего запроса; следующий обход входит заново.
Если в панели нет функции продукта (неизвестная функция), этот список пустой и source не падает. Любая другая ошибка списка роняет весь source, частичный снимок не отправляется. Удалённые услуги (item_status = 4) не эмитятся: инвентарь пометит их неактивными.
Тикеты, платежи, лицензии, DNS-записи и статистика энергопотребления стоек в 0.1.0 не собираются.
Документация провайдера: описание API, авторизация.
Установка
Агент должен быть подключён к API.
docker compose exec agent wg-flow-agent plugin install miran
# или
wg-flow-agent plugin install miranДальше — локальный UI → Connections → miran или YAML.
Что попадает в инвентарь
| Объект Miran | resource_type | Заметки |
|---|---|---|
| Выделенный сервер | server | func=dedic. provider_resource_id = server:{id}. Имя — домен услуги. Публичный IPv4 → metadata.primary_ipv4, серые адреса → metadata.private_ips. Дата-центр → регион |
| VDS | instance | func=vds. instance:{id}. Имя ВМ из панели, если оно отличается от домена, пишется в metadata.server_name |
| Домен | domain | func=domain. provider_resource_id — само имя (example.net). 0000-00-00 в дате окончания не пишется |
| Виртуальный хостинг | hosting | func=vhost. hosting:{id} |
| Колокация | server | func=colocation. colocation:{id}, чтобы не пересечься с выделенным сервером. metadata.product = colocation |
| IP-адрес | network | func=ip. ip:{id}. metadata.product = additional_ip. Отдельного типа ip в инвентаре нет |
Статусы услуги BILLmanager: 1 заказана → pending, 2 активна → active, 3 остановлена → stopped, 5 в обработке → pending. Прочие коды → unknown.
Цена из поля cost попадает в metadata.plan_price и metadata.billing_amount. Если в строке нет кода валюты, плагин пишет RUB. Тариф — metadata.plan_name, шаблон ОС — metadata.image, окончание — metadata.expire_date. Имя клиента и пароль панели в metadata не копируются.
Куски сбора можно выключить отдельно. Выключенный кусок не попадает в следующий успешный sync, и инвентарь помечает эти строки неактивными.
Несколько кабинетов — несколько sources. provider_account — ваша метка.
YAML
plugins:
miran:
enabled: true
sources:
- id: cabinet
provider_account: "miran-main"
sync_interval_seconds: 300
api_url: "https://bill.miran.ru/billmgr"
username: "client"
password: "…"
collect_dedicated: true
collect_vds: true
collect_domains: true
collect_hosting: true
collect_colocation: true
collect_ips: trueПоля source
| Поле | Обязательно | Описание |
|---|---|---|
id | да | Ключ в логах (miran/cabinet) |
provider_account | да | Метка кабинета в инвентаре |
api_url | нет | По умолчанию https://bill.miran.ru/billmgr |
username, password | да | Логин кабинета bill.miran.ru |
collect_* | нет | По умолчанию true |
sync_interval_seconds | нет | Минимум 300 |
Проверка
wg-flow-agent status
wg-flow-agent dry-runВ JSON provider: miran. Health открывает сессию и вызывает func=dashboard.info. Пароль в инвентарь не пишется.
Частые ошибки
| Симптом | Что проверить |
|---|---|
| Неверный логин или пароль | Пара логина кабинета. Пароль со спецсимволами передаётся отдельным полем, не строкой user:password |
| Сессия отклонена | Агент ходит с IP, с которого кабинет пускает API. Ограничение по IP в панели режет и сессию |
| Пустой список серверов | Услуги есть в этом логине; нужный collect_* включён. Удалённые услуги (4) не показываются |
| Нет доменов или хостинга | В панели нет такой функции — это не ошибка source |
Access denied на списке | У логина нет права на эту функцию. Source не отправляет частичный снимок |
| Дубли с другим плагином | Разный provider — это нормально; слияние в кабинете |