Настройка Object Storage

S3 (AWS SDK v3)

Пример настройки при использовании Yandex Object Storage

    "s3":{
        "access_key":"YCAJEZZ2WQyqGTL**********",
        "secret_key":"YCPC1C9iW_LJLc7bMvgY9LiCl4O6vC**********",
        "bucket":"s3-v3-pruffme",
        "endpoint":"https://storage.yandexcloud.net",
        "public_prefix":"https://storage.yandexcloud.net/s3-v3-pruffme/",
        "region":"ru-central1",
        "extensions": [
            "png",
            "jpeg",
            "jpg",
            "pdf",
            "docx",
            "doc",
            "xlsx",
            "xls",
            "pptx",
            "ppt",
            "mp4",
            "mp3"
        ]
    },

Описание параметров

Параметр Описание Тип данных
access_key Идентификатор доступа пользователя. Используется вместе с секретным ключом для аутентификации запросов к хранилищу Строка
secret_key Секретный ключ пользователя. Выступает в паре с идентификатором доступа для создания подписанных запросов Строка
bucket Название контейнера, который используется для хранения данных Строка
endpoint URL-адрес сервиса хранилища Строка
public_prefix Находится в начале ссылки на файл, когда генерируется URL. Обычно это путь к bucket Строка
region Регион, в котором расположено хранилище Строка
extensions Список расширений файлов, которые поддерживаются для хранения. Это позволяет ограничить типы файлов, которые могут быть загружены Строка

S3 (AWS SDK v2)

Пример настройки при использовании MinIO и второй версии AWS SDK

    "s3":{
        "version": 2,
        "access_key": "tQemfrt5ne**********",
        "secret_key": "8zeNaP0z3m5fAKs8vcrWOorjN2pGax**********",
        "bucket": "pruffme",
        "endpoint": "https://editboard.mycorp.com:9000",
        "region": "ru-1",
        "public_prefix": "https://editboard.mycorp.com:9000/pruffme/",
        "s3ForcePathStyle": true,
        "apiVersion": "latest"
    },

Описание параметров

Параметр Описание Тип данных
version Указывает версию AWS SDK Число
access_key Идентификатор доступа пользователя. Используется вместе с секретным ключом для аутентификации запросов к хранилищу Строка
secret_key Секретный ключ пользователя. Выступает в паре с идентификатором доступа для создания подписанных запросов Строка
bucket Название контейнера, который используется для хранения данных Строка
endpoint URL-адрес сервиса хранилища Строка
public_prefix Находится в начале ссылки на файл, когда генерируется URL. Обычно это путь к bucket Строка
region Регион, в котором расположено хранилище Строка
s3ForcePathStyle Параметр, указывающий на необходимость использования старого стиля формирования путей к объектам в S3 Логический
apiVersion Версия API, которую следует использовать при работе с S3 Строка

LocalFolder

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

    "s3":{
        "type":"localfolder",
        "storage_dir":"/storage",
        "public_prefix":"https://editboard.mycorp.com/storage/",
        "skiphttp": true,
        "extensions":[
            "png","jpeg","jpg",
            "pdf",
            "docx","doc","xlsx","xls",
            "pptx","ppt",
            "mp4","mp3"
        ]
    },

Особенности использования

Изменение в конфигурации nginx

Добавить в раздел server для порта 443\

location /storage {
    alias /storage;
    try_files $uri $uri/ /index.html;
}

Изменения команды запуска Docker:

docker run -it \
    --rm \
    -p 443:443 \
    -e TZ=Europe/Moscow \
    -v /editboard-conf:/conf \
    -v /editboard-logs/nginx:/var/log/nginx \
    -v /editboard-logs/app:/root/.pm2/logs \
    -v /mnt/editboard-storage:/storage \
    --name editboard docker-registry.pruffme.com/editboard:latest

Описание параметров

Параметр Описание Тип данных
type Параметр, который указывает на режим использования объектного хранилища в режиме локальной папки. Специфичен и используется только для LocalFolder Строка
storage_dir Путь к папке в которую сохраняются файлы. Специфичен и используется только для LocalFolder Строка
public_prefix Находится в начале ссылки на файл, когда генерируется URL. Обычно это путь к bucket Строка
skiphttp Изменяет механику проверки работоспособности хранилища Логический
extensions Список расширений файлов, которые поддерживаются для хранения. Это позволяет ограничить типы файлов, которые могут быть загружены Строка

Новые параметры для версии 1.8.0 и выше

    "s3":{
        "acl": "public-read",
        ...
    },
Параметр Описание Тип данных
acl Access Control List Bucket. public-read - устанавливает разрешение на чтение для всех пользователей Строка

Возможные ошибки при настройке

Ошибка чтения из Object Storage

Описание ситуации

  • Пользователь может загружать изображения и файлы на доску, но они не открываются.
  • Ссылки сформированы корректно.
  • Файлы не открываются по прямой ссылке.

Решение: в настройках бакета установить для анонимного доступа префикс / с правами на чтение

Невалидная ссылка на файлы и изображения

Описание ситуации

  • Пользователь может загружать изображения и файлы на доску, но они не открываются.
  • В MinIO в бакете на анонимный доступ есть префикс / на ro и выше.

Решение: проверить пути в MongoDB. Для загруженных файлов пути можно увидеть в коллекции user_media; для шаблонов dashboard_templates

Подробнее о том, как формируется ссылка

Как происходит склейка URL изображения\файла, которое использует приложение
public_prefix + ${MODULE_PARTNER_NAME} + ids_path + file_name

Например:

public_prefix + ${MODULE_PARTNER_NAME} + ids_path + file_name

https://board.test.com/s3/editboard/test/846d0a0c1655d714fd2c6172a1cdd366/ea92bf3bcfb9a57f0d14faa04603207b/4abdef04c1cae7005d8f997e01ad2154.png

Пути до файлов шаблонов прописываются во время установки, поэтому если имя бакета было изменено, то нужно:

  • изменить их в базе через запрос;
  • удалить базу и запустить приложение в режиме установки. После этого сделать стандартный запуск.

Не загружаются файлы (версия 1.8.11)

Пример конфигурации nginx.conf при обновлении на 1.8.11 с предыдущих версий приложения.

Основные изменения, которые необходимо внести в nginx.conf приложения:

 server {
    ...
        location / {
            ...
            add_header 'Access-Control-Allow-Headers' 'Range,Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With,X-File-Name,source-origin,presentation,dashboard,position,parent,unconvertable,sid,hash,participant,owner,webinar,action,media,token,type';
            ...