Как я настраивал S3 в Strapi? Больно, но не сильно

463821d6665bd75a3b4860deef66acab.png

Недавно я познакомился с сервисом Strapi и почти сразу получил задачу «Настроить отправку файлов в S3 из Strapi». Это мой первый опыт в работе со Strapi, но не первое подключение к S3.

В данной записи я хотел бы поделиться своим опытом и показать пару кастомных скриптов для работы с облачным хранилищу S3.

Коротко о Strapi

Strapi JS — это популярная открытая система управления контентом (CMS) на основе Node.js. Она предназначена для быстрого создания и управления бэкенд-серверами и API. Strapi обеспечивает гибкость в разработке благодаря своей модульной архитектуре и возможностям кастомизации.

Чуть короче обо мне

Я Backend разработчик, который до текущего момент работал в основном с PHP и в редких случаях с JS (в основном с вёрсткой). Есть опыт работы с различными API и немного понимаю в настройке серверов.

Это я к тому, что я в данной записи постараюсь всё расписать со стороны дилетанта в области Node.js, поэтому прошу строго не судить!

Начнём настройку подключения к S3

Для начала нам конечно нужно получить доступы к облачному хранилищу S3, а именно:

  • accessKeyId — это публичный ключ (аналог логина), предоставляемый провайдером облака. Он используется для идентификации пользователя или приложения, которое обращается к хранилищу.

  • secretAccessKey — это приватный ключ (аналог пароля), который используется совместно с accessKeyId для аутентификации запросов. Его нельзя разглашать, так как он предоставляет полный доступ к ресурсам.

  • region — определяет регион (географическое расположение) хранилища.

  • endpoint — указывает URL для доступа к S3-совместимому хранилищу.

  • bucket — Название S3-бакета, с которым вы работаете. Бакет — это контейнер для хранения объектов (файлов, данных).

Все эти доступы вам должен предоставить ваш провайдер.

Далее вам нужно установить npm модуль для работы с облачными хранилищами S3. Существует большое количество публичных модулей, я лично остановился на strapi/provider-upload-aws-s3.

Для установки модуля, переходим в проект и запускаем команду в консоли.

npm install @strapi/provider-upload-aws-s3

Вторым этапом необходимо изменить конфигурацию Strapi и добавить в неё параметры подключения к облачному хранилищу.

Для удобства, я рекомендую занести доступы в .env файл.

...
S3_ACCESS_KEY_ID="accessKeyId"
S3_SECRET_ACCESS_KEY="secretAccessKey"
S3_ENDPOINT_URL="endpoint"
S3_REGION='region'
S3_BUCKET_NAME='test_bucket'
...

Теперь переходим в /config/plugins.js и прописываем в него следующий код.

module.exports = ({ env }) => ({
  upload: {
    config: {
      provider: '@strapi/provider-upload-aws-s3',
      providerOptions: {
        credentials: {
          accessKeyId: env('S3_ACCESS_KEY_ID'),
          secretAccessKey: env('S3_SECRET_ACCESS_KEY'),
        },
        region: env('S3_REGION'),
        endpoint: env('S3_ENDPOINT_URL'),
        params: {
          Bucket: env('S3_BUCKET_NAME'),
        },
      },
    },
  }
});

Теперь необходимо перезагрузить проект и проверить подключение через раздел »Медиа-библиотека», отправив пару файлов.

Решения для типичных ошибок

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

Не отображаются превью картинки в «Медиа-библиотеке»

Если перейдя в «Медиа-библиотеку» изображения помечаются как «не найденные», а по факту файлы загрузились, то вам необходимо внести правки в config/middlewares.js для добавления источника.

module.exports = ({ env }) => (
  [
    "strapi::logger",
    "strapi::errors",
    "strapi::cors",
    "strapi::poweredBy",
    "strapi::query",
    "strapi::body",
    "strapi::session",
    "strapi::favicon",
    "strapi::public",
    {
      name: 'strapi::security',
      config: {
        contentSecurityPolicy: {
          useDefaults: true,
          directives: {
            'connect-src': ["'self'", 'https:'],
            'img-src': [
              "'self'",
              'data:',
              'blob:',
              'market-assets.strapi.io',
              'https://'+env('S3_BUCKET_NAME')+'.obs.'+env('S3_REGION')+'.hc.sbercloud.ru',
            ],
            'media-src': [
              "'self'",
              'data:',
              'blob:',
              'market-assets.strapi.io',
              'https://'+env('S3_BUCKET_NAME')+'.obs.'+env('S3_REGION')+'.hc.sbercloud.ru',
            ],
            upgradeInsecureRequests: null,
          },
        },
      },
    }
  ]
);

Формирование домена в вашем случае может отличаться от моего. Данную информацию вы можете посмотреть получив полный путь к любому файлу, добавленному в ваше облачное хранилище.

Тестирования соединения с S3

К сожалению, модуль strapi/provider-upload-aws-s3 поддерживаетподключение к S3, только из системы Strapi и не позволяет писать кастомные скрипты.

Но часто бывает такое, когда нужно проверить работу подключения к S3, установить соединение или отправить файл.

Для тестирования работы подключения к S3 можно использовать дополнительный модуль aws-sdk. С помощью данного модуля вы можете проверить подключение и корректность отправки файлов.

Для установки пропишите команду:

npm install aws-sdk

Проверка подключения к S3

Немного кастыльный метод, но к счастью рабочий — проверка подключения через кастомный скрипт.

Для этого, в корне проекта создайте файл test-s3-connection.js и занесите в него следующий код:

// Подключение переменных окружения из .env
require('dotenv').config();

const AWS = require('aws-sdk');

// Настройка клиента S3
const s3 = new AWS.S3({
  accessKeyId: process.env.S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  endpoint: process.env.S3_ENDPOINT_URL,
  s3ForcePathStyle: true, // Использовать путь стиля для S3-совместимых хранилищ
  signatureVersion: 'v4',
});

// Функция для проверки подключения
s3.listBuckets((err, data) => {
  if (err) {
    console.error('Ошибка подключения к S3:', err.message);
    console.error('Подробности:', err);
  } else {
    console.log('Подключение к S3 успешно.');
    console.log('Список bucket-ов:', data.Buckets);
  }
});

Для запуска скрипта, пропишите следующий код в консоли:

node test-s3-connection.js

Если подключение будет успешным, то вы увидите список bucket-ов.

Проверка загрузки файлов

Для проверки загрузки файлов можно использовать кастомный скрипт, который я назвал test-s3-upload.js:

// Подключение переменных окружения из .env
require('dotenv').config();

const AWS = require('aws-sdk');
const fs = require('fs');

// Настройки S3
const s3 = new AWS.S3({
  accessKeyId: process.env.S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  endpoint: process.env.S3_ENDPOINT_URL,
  s3ForcePathStyle: true, // Использовать путь стиля для S3-совместимых хранилищ
  signatureVersion: 'v4',
});

// Имя bucket
const bucketName = 'bucket-name'; // Замените на имя вашего bucket

// Тестовый файл для загрузки
const fileName = 'test-file.txt';

// Создание тестового файла
fs.writeFileSync(fileName, 'Hello, S3! This is a test file.');

// Параметры загрузки
const uploadParams = {
  Bucket: bucketName,
  Key: fileName,
  Body: fs.createReadStream(fileName),
  ContentType: 'text/plain',
};

// Загрузка файла
s3.upload(uploadParams, (err, data) => {
  if (err) {
    console.error('Ошибка загрузки:', err);
  } else {
    console.log('Файл успешно загружен:', data.Location);
  }

  // Удаление локального тестового файла
  fs.unlinkSync(fileName);
});

Для запуска скрипта, пропишите следующий код в консоли:

node test-s3-upload.js

Таким образом вы можете отследить ошибки, если такие имеются, а также можете использовать данные скрипты для автоматического тестирования.

Вот так я настраивал подключение к S3 в Strapi!

Спасибо за внимание!

Habrahabr.ru прочитано 827 раз