Skip to content

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.

bash
docker compose exec agent wg-flow-agent plugin install miran
# или
wg-flow-agent plugin install miran

Дальше — локальный UI → Connections → miran или YAML.

Что попадает в инвентарь ​

Объект Miranresource_typeЗаметки
Выделенный серверserverfunc=dedic. provider_resource_id = server:{id}. Имя — домен услуги. Публичный IPv4 → metadata.primary_ipv4, серые адреса → metadata.private_ips. Дата-центр → регион
VDSinstancefunc=vds. instance:{id}. Имя ВМ из панели, если оно отличается от домена, пишется в metadata.server_name
Доменdomainfunc=domain. provider_resource_id — само имя (example.net). 0000-00-00 в дате окончания не пишется
Виртуальный хостингhostingfunc=vhost. hosting:{id}
Колокацияserverfunc=colocation. colocation:{id}, чтобы не пересечься с выделенным сервером. metadata.product = colocation
IP-адресnetworkfunc=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 ​

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

Проверка ​

bash
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 — это нормально; слияние в кабинете