В документе описаны возможности резервного копирования Диска. Резервное копирование выполняется через BMWCLIENT.
Документ нужен администраторам организации.
См. также: Резервное копирование почты, календарей, профилей пользователей и адресных книг
BMWCLIENT — это клиент для выполнения запросов к gRPC API. Основные функции клиента: резервное копирование и восстановление почтового ящика, облака, календарей, профилей пользователей и адресных книг.
Обычно продукт Средства резервного копирования включается при первичной установке. Чтобы проверить состояние продукта:
-
Откройте веб-интерфейс установщика
http://server-address:8888. -
Нажмите на кнопку
в правом верхнем углу, выберите пункт Продукты. -
Продукт Средства резервного копирования должен быть включен:
Если продукт выключен, то выполните следующие действия:
- Включите продукт Средства резервного копирования.
- Нажмите на кнопку Сохранить.
- Перейдите на главную страницу установщика.
- В случае установки Почты на 1 ВМ, можно сгенерировать контейнеры автоматически и запустить автоматическую установку. Если у вас кластерная Почта, то добавьте контейнеры вручную.
- Если зеленая кнопка Далее в правом верхнем углу отображается и активна, то донастройте параметры системы. Логика: «Следуем за кнопкой Далее то тех пор, пока она активна».
- Когда зеленая кнопка Далее перестанет отображаться в верхнем углу страницы, можно запускать установку.
Чтобы выполнять запросы к bmwclient, нужно добавить перечень IP и подсетей в веб-интерфейсе установщика:
-
Откройте веб-интерфейс установщика
http://server-address:8888. -
Перейдите на вкладку Настройки → Настройки компонентов → Ограничение доступа к доменам.

-
Затем кликните по домену
bmw.server-adressи нажмите кнопку редактировать
. -
Включите опцию Ограничить доступ к домену.
-
Добавьте IP и подсети, под которыми разрешено обращаться к bmwclient'у. Чтобы разрешить всем IP и подсетям обращаться к bmwclient'у, добавьте IP-адрес
0.0.0.0/0. По умолчанию доступ к доменуbmw.server-adressзапрещен всем IP/подсетям.
-
Кликните по кнопке Сохранить.
-
Перейдите к списку машин и включите опцию «Не показывать завершенные».
-
Запустите следующие шаги:

Запросы к bmwclient'у можно будет выполнять, исходя из настроек IP и подсетей.
-
Перейдите на страницу
biz.<сompany_domain>и авторизуйтесь в панели администратора. -
Перейдите по URL-адресу
https://biz.<mail_domain>/oper/ -
В меню слева выберите пункт Токены, на странице нажмите Добавить.
-
В окне добавления токена укажите дату истечения действия токена (согласно вашим внутренним политикам компании), а также комментарий.
-
Нажмите Добавить. Отобразится окно со сгенерированным токеном.
-
Перейдите на страницу
biz.<сompany_domain>и авторизуйтесь в панели администратора. -
Перейдите по URL-адресу
https://biz.<mail_domain>/oper/ -
В меню слева выберите пункт Клиент и скачайте клиент, кликнув по bmwclient.

Работа с bmwclient'ом происходит в командной строке (терминале). По умолчанию клиент скачивается в папку «Загрузки»/«Downloads».
Чтобы начать работу с bmwclient'ом под ОС Windows, не требуется дополнительных настроек и действий, достаточно шагов, выполненных выше.
Чтобы начать работать с bmwclient под ОС Linux, в терминале, в директории с bmwclient'ом, нужно запустить следующую команду:
chmod +x bmwclient
Чтобы начать работать с bmwclient под OS X, нужно выполнить следующие действия:
-
В терминале, в директории с bmwclient'ом, нужно запустить последовательно команды:
chmod +x bmwclient./bmwclient -help -
Кликните «Отменить» во всплывающем уведомлении:
-
Откройте «Системные настройки» и перейдите в раздел «Конфиденциальность и безопасность» на вашем компьютере.
-
Кликните по кнопке Все равно разрешить для приложения bmwclient:
-
В терминале снова запустите команду
./bmwclient -help. -
Кликните «Открыть» во всплывающем уведомлении:
В этом разделе описаны нюансы, характерные только для резервного копирования облачного Диска.
Для резервного копирования Диска доступны две версии методов: cloudBackup / cloudRestore и cloudBackup2 / cloudRestore2
- Несколько сервисов bmw — используйте методы
cloudBackup2иcloudRestore2. - Один сервис bmw — подходят обе версии методов.
```shellfailed getting tree node: rpc error: code = Internal desc = can't open temp file```Чтобы избежать ошибок, используйте `cloudRestore2` или удалите лишние контейнеры по инструкции [Как удалить контейнер в веб-интерфейсе установщика](https://workspace.vk.ru/docs/on-premises/mail/faq-general/index.html#how-to-delete-cont).
Методы cloudBackup и cloudBackup2 имеют одинаковый синтаксис и набор параметров. То же самое верно для cloudRestore и cloudRestore2.
Для переключения между версиями замените имя метода в команде:
- -method cloudBackup → -method cloudBackup2
- -method cloudRestore → -method cloudRestore2
Все остальные параметры команды остаются без изменений. Формат выходных данных также идентичен.
Для каждого запроса необходимо обязательно передавать следующий список полей:
- -server — доменное имя для запросов в BMWCLIENT, например bmw.on-premise.ru.
- -tls — использует ли сервер шифрование (https). Флаг принимает два значения: true или false. По умолчанию считается, что шифрование используется.
- -method — метод, который необходимо вызвать в gRPC API.
- -token — токен для авторизации запросов к gRPC API, полученный на шаге 3.
Опционально можно задавать следующие параметры:
- -maxMessageSizeMB — максимальный размер сообщения передаваемый по gRPC. Значение по умолчанию: 128 МБ.
- -skipVersionCheck — сравнивать ли версии клиента и сервера. Значение по умолчанию: false.
- -timeout — принимает значение в секундах, нужно использовать на случай медленного соединения или, если запросы не выполняются с ошибкой timeout.
Выполните следующую команду:
./bmwclient -server bmw.%domain% -tls=false -method cloudUsers -token %token% -startts %start_timestamp%
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru \-method cloudUsers -token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa \-skipVersionCheck=true -startts 1695204000
-startts — дата и время изменения файлов у пользователей. Передается в формате UNIX timestamp.
Результат:
[INFO]: 2023/09/20 14:46:01 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudUsers[INFO]: 2023/12/07 14:03:16 test_login_qdqm0ext@domain1.on-premise.ru[INFO]: 2023/12/07 14:03:16 test_login_kjymg1yn@domain2.on-premise.ru[INFO]: 2023/12/07 14:03:16 test_login_asyqg1ge@domain2.on-premise.ru[INFO]: 2023/12/07 14:03:16 test_login_z0ohfzsc@domain2.on-premise.ru[INFO]: 2023/12/07 14:03:16 test_login_aetdr5x9@domain3.on-premise.ru[INFO]: 2023/12/07 14:03:16 test_login_2ixphpmh@domain4.on-premise.ru
Выполните следующую команду:
./bmwclient -server bmw.%domain% -method cloudBackup \-token %token% -email %email%
-email — email адрес почтового ящика, для которого выполняется запрос структуры.
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \-domain wm2.on-premise.ru -token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa \-email n.gruzdev@wm2.on-premise.ru
Результат:
[INFO]: 2023/09/27 14:13:56 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudBackup[INFO]: tree:{info:{type:4 bizprj:2199023255553 ownerid:1000011 quota:2147483648} vfs:{name:"/" mode:2 list:{name:"Календарь" nodeid:"\x03\x00\x00\x00C\xc53d^b\xc4H\xad\xacН" mode:4098 list:{name:"1 (4).txt" mtime:1683124497 nodeid:"L\x00\x00\x00C\xc53d^b\xc4H\xad\xacН" mode:4097 size:9 hash:"Test info\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}}} acls:{treeid:"623432346630303030303030"}} path:"/recovered_data" lock:3
Чтобы создать полную резервную копию файлов в облаке для конкретного пользователя и сохранить результат в директорию, нужно выполнить следующую команду:
./bmwclient -server bmw.%domain% -method cloudBackup -token %token% \-email %email% -savePath backups -zip -save
- -email — email-адрес почтового ящика, для которого снимается резервная копия.
- -savePath — путь на диске, куда необходимо сохранить резервную копию Диска.
- -save — сохранить результат резервного копирования на диск в директорию, без сжатия.
- -zip — сжать в zip-архив результаты резервного копирования и сохранить на диск.
Флаги -save и -zip взаимоисключающие, их нельзя использовать вместе в одном запросе.
Пример запроса с параметром -save:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \-save -savePath ./backups
В примере, в параметре -savePath, указан путь относительно папки, в которой находится bmwclient.
Результат:
[INFO]: 2023/09/20 18:25:42 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudBackup
Результат резервного копирования в папке backups/n.gruzdev@wm2.on-premise.ru-1702027656. Где 1702027656 — это дата бэкапа в формате UNIX timestamp.

Пример запроса с параметрами -zip:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \-zip -savePath ./backups
Результат:
[INFO]: 2023/09/20 18:25:42 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudBackup
Единственное отличие от бэкапа с параметром -save — содержимое папки сжимается в архив.
В папке с бэкапом всегда сохраняются файлы:
tree.json— здесь отражена структура файлов в облаке. Структура файлов представляется в виде плоского дерева.tree.info.json— метаданные дерева.publics.json— здесь находятся данные об общих папках.- Файлы находящиеся в облаке.
При этом одинаковые файлы сохраняются один раз, а в файле tree.json содержится ссылка на этот файл.
Пример файла tree.info.json:
{"type": 4,"bizprj": 123,"ownerid": 456,"quota": 5368709120}
"type"— Тип дерева. Возможные значения:- 0 — дерево обычного пользователя.
- 1 — общедоступное дерево обычного пользователя.
- 4 — дерево бизнес-пользователя.
- 5 — общедоступное дерево бизнес-пользователя.
"bizprj"— идентификатор бизнес-проекта которому принадлежит дерево, используется для деревьев с типом 4 и 5."ownerid"— ID владельца дерева."quota"— максимальный размер хранилища пользователя.
Пример файла publics.json:
{"email": "n.gruzdev@wm2.on-premise.ru","ctime": 1724651727,"extra": "{\"v\":2}","publics": [{"id": "esEn/x1p2X3uLt","extid": "/Календарь","ctime": 1724651727,"flags": 6,"extra": "{}"}]}
"extid"— путь до общей папки в дереве пользователя."ctime"внутри поля"publics"— дата создания общей папки."flags"и"extra"— служебные флаги и поля.
tree.json содержит объекты двух типов:
- Папки. В поле
childsнаходятся ссылки на вложенные в нее папки и файлы. - Файлы. В поле
nodeidнаходится идентификатор папки, к которой принадлежит файл.
Пример файла tree.json:
[{"name": "Календарь","nodeid": "3e2cc7f1f79e6c270855cbf917a254e7","mode": 4098,"childs": ["492cc7f1f79e6c270855cbf917a254e7","472cc7f1f79e6c270855cbf917a254e7","4a2cc7f1f79e6c270855cbf917a254e7"]},{"name": "1A46632B-.jpeg","mtime": 1708612045,"nodeid": "472cc7f1f79e6c270855cbf917a254e7","mode": 4097,"size": 138053,"hash": "1ad3a8149519d8a8f93390c932324c45234d1257"},{"name": "1B606A7D-.jpeg","mtime": 1708612045,"nodeid": "4a2cc7f1f79e6c270855cbf917a254e7","mode": 4097,"size": 138053,"hash": "1ad3a8149519d8a8f93390c932324c45234d1257"},{"name": "1.txt","mtime": 1708612057,"nodeid": "492cc7f1f79e6c270855cbf917a254e7","mode": 4097,"size": 9,"hash": "7d5e985e0b5fee68b1b688f52632cdbabad9d7aa"}]
"name"— название файла/папки;"mtime"— дата последнего обновления;"mode"и"nodeid"— метаданные;"size"— размер файла в битах;"hash"— хэш от содержимого файла.
Все файлы в этом примере находятся внутри папки Календарь. Также можно заметить, что у файлов 1A46632B-.jpeg и 1B606A7D-.jpeg одинаковое значение в поле hash — значит это одинаковые файлы.
В интерфейсе Диска это выглядит так:
Чтобы сопоставить файл из папки с бэкапом с файлом в tree.json:
-
Скопируйте значение в поле
hash. -
Сконвертируйте это значение из Base64 в Hex. Например, с помощью: https://base64.guru/converter/decode/hex.
-
Полученное значение — это файл в папке.

Выполните следующую команду:
./bmwclient -server bmw.%domain% -method cloudRestore \-token %token% -email %email% -readPath %backups_dir%
- -email — email-адрес почтового ящика, для которого выполняется восстановление.
- -readPath — путь до папки или zip-архива, в которой находится копия Диска.
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudRestore \-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \-readPath ./backups/n.gruzdev@wm2.on-premise.ru-1695212742
Результат:
[INFO]: 2023/09/21 10:19:09 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudRestore
Результат, если указан путь до zip-архива:
[INFO]: 2023/09/21 10:19:09 backend address is: bmw.domain1.on-premise.ru:443,method is: cloudRestore[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/tree.json[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/ce6b1c9881e86da69491a7fb1ea4ee8389be2bca[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/8ac8a3b6100a4b087630df8ec086bd6e96581d86[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/f1bd71e8454f37762b84f1ad78edecff59bf1414[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/dbb9c3ce2f14e98016cba2e2f37725bc8b97a639[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/b4ea03212c7a351c3a23cf6c72df30dec9e7182c[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/6d132b4b6f452af4a81f88dec65848ba66a11cbc[INFO]: 2023/12/08 17:09:50 deleted temp directory ./tmp/
```shell[FATAL]: 2023/12/08 17:09:37 target directory ./tmp/n.gruzdev@wm2.on-premise.ru-1702027656 is not empty```
Технический писатель: Груздев Никита