Подключаем Yandex Object Storage к Битрикс

Пока не так много разработчиков предлагают облачное хранилище. Как я понял, пока облачные хранилища не так популярны в России, но набирают обороты.

Посмотрел статьи в интернетах и не нашел примера подключения Яндекс Облака в Битриксе, но есть старые гайды 2014 годов с подключением Clodo. Что ж, напишу гайд по Яндекс Облаку, а именно Yandex Object Storage.

Плюсы и минусы облачного хранилища

Плюсы

  • Репликация на несколько зон доступности: хранилище в разных географически расположенных местах
  • Посекундная тарификация: используешь 3 мб, 3 гб или 30 гб - платишь только за занятое место, получается намного выгоднее чем держать VDS с запасом, который не используешь. Подробнее о тарификации.
  • Холодное и горячее хранение: если данные нужно только хранить и редко к ним обращаться, это еще дешевле чем стандартное хранение в Object Storage.
  • Бэкапы хранятся не там где вы их делаете: во-первых так хранить небезопасно, а во-вторых в случае отключения основного сервера можете поднять резервный сервер, а бэкапы как раз доступны!
  • Очень высокая степень надежности хранилища УЗ-1, подробнее тут.

Минусы

  • Вместо одного закрывающего документа у одного хостинг-провайдера нужно будет тратить еще минуту на второго: шучу, конечно оно того стоит и это пустяковый минус
  • Минусов не нашел

Подготовка Object Storage

Заходим на сервис, у вас сразу есть дефолтный каталог сервисов, проваливаемся туда нажав на него.

Жмякайте прям на слово default

У меня уже есть 1 бакет, об этом нас информирует верхняя плашечка. Создадим новый. В списке сервисом жмем на Obgect Storage.

Попадаем в пустой список, создаем новый бакет.

Видим страницу параметров для создания бакета.

Эти настройки делаем для хранения записей телефонных звонков или бэкапов. Но на стороне битрикса чуть-чуть настройки отличаются. В общем даем название бакету, например crm24-mp3-file-backup чтобы было понятно что у нас там хранится. В общем создали бакет.

Просто создать бакет недостаточно, еще нужно создать статический API ключ для Object Storage, это делается в вкладке "Сервисные аккаунты". Сейчас покажу где это.

Находится на странице Дашборд каталога.

Открыв будет пустой список аккаунтов. Создадим новый.

Имя можете дать новому аккаунту любое, но только латинскими цифрами и буквами. Называете исходя из задач, так как облако можно использовать по-разному, иметь одного пользователя на все задачи, на несколько или на одну. Я назвал задачу в рамках одной задачи, чтобы было понятно для чего был создан аккаунт.

Добавляете роль, например storage.admin. Создаем. Открываем созданный сервисный аккаунт. Видим кнопку Создать сервисный ключ.

Создаем статический API-ключ, даже пометка есть к чему он подойдет.

В описание ключа пишем подробности, для чего выдан этот ключ, например "Для выгрузки телефонных звонков/бэкапов в Object Storage".

Создаем. И тут важный момент. Ключ доступа нам показывают один раз. Сохраните его в свой KeePass или другую надежную систему хранения доступов, обязательно. Ключ не должен попасть в чужие руки и не должен быть в открытом доступе.

Ключ создали. Идем в Object Storage, где мы создали бакет. Нужно "прикрепить" этот сервисный аккаунт с доступом к бакету.

В списке бакетов жмем на три точки, видим пункт ACL бакета. Жмем.

Выбираем сервисный аккаунт. Выбрали. Справа с кнопкой добавить написано READ. Думаю нет смысла объяснять зачем это. Выбираем FULL_CONTROL.

Жмем напротив Добавить, а только потом Сохранить

Настройка Битрикс

Хранилище настроено. Теперь идём в битрикс чтобы подключить его. Заходим в панель управления Битрикс24 или Битрикс Управление сайтом.

В настройки
В списке находим Облачные хранилища

Добавляем облачное хранилище.

Выбираем провайдера Yandex Object Storage.

Используем ключ доступа и секретный ключ которые нам выдали при создании доступа к сервисному аккаунту.

Важно! Вам сразу сгенерировался контейнер в виде upload-блаблаблабла. Если вы создали бакет, указываем имя этого бакета, иначе при подключении вам создадут новый бакет с сгенерированным названием.

Вот эти названия!

Заполнили доступ, но еще НЕ сохраняем.

Есть важная настройка в вкладке Правила.

По дефолту при подключенном хранилище у нас попадут туда все файлы, но нам нужно чтобы туда писались записи звонков. Для этого указываем расширение mp3. Я добавил еще mp4 для примера в статье, где указал, что мы хотим отправлять в облачное хранилище файлы весом от 10 мб до 10 гб. В общем, прочитайте информационное сообщение, там расписано что да как. Можно создать отдельный бакет хоть для каждого модуля или один бакет для всех модулей. В списке правил работы с облаком можете хоть все модули указать.

Настроили? Сохраняем.

Теперь у нас есть список подключенных нами облачных хранилищ, которые работают по заданным нами правилам.

Чтобы протестировать, совершите один звонок с портала на свой личный телефон, поговорите сами с собой, например скажите себе "Я всё смогу, я сделаю это!". Обновите страницу со списком облачных хранилищ, должен поменяться счетчик файлов и их объем.

Файлы ушли в облако, поздравляю. Но это не всё. Бывает что файлы отправляются в облако, но в портале они вдруг стали недоступны.

Пример. Звонок выгрузился в облако, но стал недоступен для прослушивания.

Эта проблема скорее всего связана с тем, что у вас отсутствует правило для хранилища Yandex Object Storage в конфигурации nginx. При установке BitrixVM это правило туда записывается, но если вы ставили старую версию 7.4.3 и младше, то правила для хранилища Яндекс нет.

Решаем проблему.

Подключаемся по SSH к вашему серверу.

Если у вас BitrixVM, выходим из меню в которое мы попали.

Идем в конфиг nginx.

/etc/nginx/bx/conf/

Открываем файл конфига bitrix_general.conf

Находим секцию location ^~ /upload/bx_cloud_upload/

Видим там правила для разных хранилищ. Вставляем новое правило для Yandex Object Storage в этой секции, в начале или в конце, без разницы.

Пример добавленного правила

Само правило:

location ~ ^/upload/bx_cloud_upload/(http[s]?)\.([^/:\s]+)\.storage\.yandexcloud\.net/([^\s]+)$ {
internal;
resolver 8.8.8.8;
proxy_method GET;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Server $host;
#proxy_max_temp_file_size 0;
proxy_pass $1://$2.storage.yandexcloud.net/$3;
}

Сохраняем и перезапускаем nginx.

systemctl restart nginx

Снова проверяем работу CRM, звоним самому себе и пробуем послушать звонок выгруженный в облако. Должно всё работать. Если нужна помощь - пишите мне на почту, может помогу.

P.S. В версии BitrixVM 7.4.4 уже не нужно добавлять эти строки, они там уже должны быть.