Комментарии 15
Спасибо большое за статью!
А вы являетесь maintainer'ом strapi-yandex-cloud
?
Кстати, раз вы пользуетесь Headless CMS, возможно, у вас JamStack? Как вы сервируете его на Yandex Cloud?
Конечно же в Strapi есть готовый Rest API для записи файлов в Media Library.
А как используется это на практике из бакета Яндекс-Облака? Как выглядит URL?
Можно ли сделать так, чтобы бакет не был доступен публично, только определенному серверу?
Правильно ли я понимаю, что админка Strapi может быть открыта публично или же бакет используется исключительно как бекап, а вся работа подразумевает запуск локально?
Смотрите — Яндекс дает секретные ключи для записи в бакет, но при этом сами файлы конечно должны быть доступны публично.
Секретные ключи хранятся на NodeJs сервере Strapi и недоступны ни администратору ни пользователю. Соответственно запись в бакет (это то что там будет храниться) сможет сделать только Ваш сервер. На самом деле у бакета есть много разных настроек — там есть и CORS и политика доступа, туда по моему можно и домен прикрутить — но для Strapi это не надо.
Ссылка на файл из бакета выглядит так:
storage.yandexcloud.net/strapitest/RS_5735_147024480_a45998a319.jpg
Естественно при deploy файлы как лежали в бакете — так там и остаются.
Зачем нужно хранение на бакете?
Смотрите, допустим Вы делаете deploy на VPS с SSD дисками — оптимально будет выбрать VPS с 5 или 10GB SSD а все данные хранить в бакете — Вы получаете возможность хранить неограниченное количество фото/видео, не надо беспокоиться об архивации данных.
Если у Вас растет нагрузка — то Вы легко переходите на другой сервер — либо добавляете мощности текущему — поскольку на сервере нет данных — то это делается в мгновение ока.
Смысла закрывать как то бакет нет ни какого :)
Например, если подразумевается, что в бакете могут храниться некоторые приватные данные, показывать или нет которые решает уже сервер. У самого сервера полные права на бакет. Или же, делаем приватный бакет и публичный бакет (или пермишшены раздаем определенным директориям, если возможно).
А как выглядит процесс добавления новой записи и/или изображения в Strapi? И применение (деплой) изменений?
Нужно поднять локально Strapi и подключить к бакету, или же Strapi поднимается на том же бакете, но как тогда обстоят дела с авторизацией?
Спасибо!
Здесь рассматривался пример когда нужно публично раздавать изображение (или файл ) всем подряд.
Как выглядит сама strapi и процесс добавления файла Вы можете посмотреть сами выполнив простую команду на Вашем компьютере:
npx create-strapi-app сarduelis --quickstart
Вот 3 минуты видео как стартовать и как выглядит strapi
youtu.be/zd0_S_FPzKg
Спасибо большое за комментарий)
Я перепробовал разные системы, в том числе self-hosted как Strapi.
Например, сервис Contentful не вызывает вопросов с точки зрения выдачи прав доступа для менеджеров по контенту.
Представим интернет-магазин, не будут же менеджеры по контенту устанавливать Nodejs и писать команды в терминале)
Сотрудникам необходимо выдать URL и логин/пароль на худой конец.
Вот и хочется понять, как вы решили (решали ли) эти проблемы)
www.carduelis.ru/admin
Соответственно там контент менеджер и будет работать :)
Также будет богатое REST Api + GraphQL (модуль ставится отдельно)
Поскольку это headless CMS — то Frontend необходимо делать с нуля самому.
Вообще не понимаю, почему все используют object storage, но ни как не научатся приколачивать ВСЕ значения для соединения в ENV переменные с дефолными значениями. В вашем случае вы даже используете провайдер aws-s3, но все равно намертво приколотили endpoint в Яндекс.
Сразу своим разработчикам бью по рукам за такое
( наболело )
Конкретно данный код ни с чем кроме Яндекс не работает :)
Согласен, что немного поменяв настройки код будет работать и с AWS S3
Но я же сразу написал — что это руководство по настройке Яндекс бакет — так что особого противоречия не вижу :)
У вас получилось как-то починить?
Последний архив сегодня в 1:00
По рекомендации Strapi сделала плагин именно для Yandex Cloud: https://github.com/teinett/strapi-provider-upload-yandex-cloud.
Протестировано, работает с 3.6.5.
В чем была проблема: как вызываются переменные окружения в файле ./config/plugins.js.
Вариант env('ENV_VARIABLE') не срабатывал, а вот process.env.ENV_VARIABLE работает.
Итого код файла:
module.exports = ({ env }) => ({
upload: {
provider: 'yandex-cloud',
providerOptions: {
endpoint: 'https://storage.yandexcloud.net',
accessKeyId: process.env.YANDEX_CLOUD_ACCESS_KEY_ID,
secretAccessKey: process.env.YANDEX_CLOUD_ACCESS_SECRET,
region: process.env.YANDEX_CLOUD_REGION,
params: {
Bucket: process.env.YANDEX_CLOUD_BUCKET,
},
},
},
});
Strapi сохранение файлов на Яндекс Object Storage