Недавно я познакомился с сервисом 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'),
},
},
},
}
});
Теперь необходимо перезагрузить проект и проверить подключение через раздел «Медиа-библиотека«, отправив пару файлов.
Решения для типичных ошибок
Туториал конечно простой, но для достижения цели мне пришлось изрядно покапаться и в процессе я написал несколько полезных скриптов, которые могут вам пригодиться.
К сожалению, модуль 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!
Спасибо за внимание!