Как стать автором
Обновить

Комментарии 15

Спасибо большое за статью!
А вы являетесь maintainer'ом strapi-yandex-cloud?


Кстати, раз вы пользуетесь Headless CMS, возможно, у вас JamStack? Как вы сервируете его на Yandex Cloud?

Возможно я вопрос неправильно понял — но репозитария strapi-yandex-cloud я не нашел :)
По поводу deploy Strapi на Яндекс собираюсь написать отдельную статью.

А, точно. Я вначале подумал, что это название шаблона для npx команды. Проглядел)

Конечно же в 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 и логин/пароль на худой конец.
Вот и хочется понять, как вы решили (решали ли) эти проблемы)

Когда Вы сделаете deploy — у Вас будет rout
www.carduelis.ru/admin
Соответственно там контент менеджер и будет работать :)
Также будет богатое REST Api + GraphQL (модуль ставится отдельно)

Поскольку это headless CMS — то Frontend необходимо делать с нуля самому.

Вообще не понимаю, почему все используют object storage, но ни как не научатся приколачивать ВСЕ значения для соединения в ENV переменные с дефолными значениями. В вашем случае вы даже используете провайдер aws-s3, но все равно намертво приколотили endpoint в Яндекс.


Сразу своим разработчикам бью по рукам за такое
( наболело )

>>намертво приколотили endpoint в Яндекс.
Конкретно данный код ни с чем кроме Яндекс не работает :)
Согласен, что немного поменяв настройки код будет работать и с AWS S3
Но я же сразу написал — что это руководство по настройке Яндекс бакет — так что особого противоречия не вижу :)
Да понимаю, просто все так хорошо вроде написано, полная настрока через env переменные, и тут бац, заколачиваем Яндекс адрес. Просто новички увидят ваш пример и будут делать «как на habr'e», а потом бородатые сисадмины будут на них ругаться)
С версии Strapi 3.6.3 загрузка файлов в Яндекс.Облако сломалась.
У вас получилось как-то починить?
У меня архивы заливаются 1 раз в сутки.
Последний архив сегодня в 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,
      },
    },
  },
});
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории