Настройка BackBlaze S3 с BunnyCDN

Мне потребовалось вечность, чтобы разобраться, как сделать всё это, поэтому я решил создать это руководство, чтобы облегчить задачу другим. Такой способ обслуживания изображений должен ускорить загрузку вашего сайта. Моя настройка Discourse объединяет DigitalOcean Droplet, BackBlaze B2 S3, BunnyCDN и бесплатную версию Cloudflare.

Я выбрал эти сервисы после небольшого исследования надёжности, цен и бенчмарков. Они казались мне наилучшими вариантами. Cloudflare помогает с безопасностью, но, насколько я понимаю, немного замедляет работу сайта, поэтому вам стоит изучить этот вопрос. У Backblaze есть партнёрства как с Cloudflare, так и с Bunny, которые позволяют передавать данные бесплатно.

Хотя Cloudflare называют CDN, он работает не как обычные CDN, и, вероятно, его одного будет недостаточно для настройки S3 с Discourse. Возможно, вам понадобится другой провайдер CDN; BunnyCDN отлично работает у меня. Если кто-то успешно сделал это только с Cloudflare, дайте мне знать, как :stuck_out_tongue:

Как настроить загрузку на S3:
Сначала зарегистрируйтесь в Backblaze, создайте бакеты и внесите данные в настройки Discourse:

Затем зарегистрируйтесь в BunnyCDN и следуйте этому руководству:

bunny.net - The Global Edge Platform that truly Hops (реферальная ссылка, я получаю 20 долларов кредита на счёт)

После создания зоны pull в BunnyCDN вам нужно получить правильный URL для вставки в настройки администратора Discourse для параметра «s3 cdn url». Перейдите в панель управления bunnycdn → pull zones → manage pull zones → нажмите на вашу зону → скопируйте URL рядом с «host name».

URL должен выглядеть примерно так: example.b-cdn.net, но обязательно добавьте впереди https://, как здесь: https://example.b-cdn.net.

Сохраните изменения в разделе настроек администратора Discourse.

Нажмите Ctrl+F5 дважды в браузере на вашем сайте Discourse.

Проведите тест, загрузив изображение в текстовый редактор Discourse. Проверьте элемент тестового изображения или просмотрите исходный код изображения, чтобы убедиться, что всё работает. URL должен отличаться от вашего обычного домена, например: example.b-cdn.net / имя_файла.

Теперь при каждой загрузке изображения оно будет сохраняться в вашем бакете Backblaze и не занимать место на вашем DigitalOcean Droplet :stuck_out_tongue

Резервное копирование загрузок на S3
Если вы хотите настроить резервное копирование Discourse в ваш бакет Backblaze, сделайте следующее:

В руководстве, которое я опубликовал выше в этой теме, обратите внимание на объяснение необходимости двух отдельных бакетов. Один бакет публичный — это бакет загрузок для пользователей, загружающих изображения на ваш форум. Второй бакет приватный — это бакет для резервных копий. Важно создавать автоматические резервные копии Discourse на случай сбоев, чтобы вы могли загрузить резервную копию и исправить проблему.

В панели управления BunnyCDN создайте вторую зону pull. Первая зона pull была для загрузок, новая зона будет для резервных копий.

Панель управления bunnycdn → pull zones → add pull zone

Следуйте тому же руководству, на которое я ссылался ранее: «Как ускорить доставку файлов Backblaze B2 с помощью BunnyCDN», но на этот час свяжите новую зону pull с бакетом резервных копий вместо бакета загрузок.

Я рекомендую использовать тариф «high volume tier 5$/TB» на странице создания зоны pull BunnyCDN; думаю, для резервных копий не нужен более дорогой и быстрый тариф «standard tier 10$/TB», который я использовал для бакета загрузок.

Настройте параметры резервного копирования в разделе настроек администратора Discourse. Параметр «backup location» должен быть установлен в S3, а «s3 endpoint» должен указывать на ваш Backblaze, например:

s3.us-west-002.backblazeb2.com

Нажмите Ctrl+F5 дважды на вашем сайте, чтобы очистить кэш.

Запустите резервное копирование и дождитесь его завершения. Затем подождите 5 минут и проверьте папку резервных копий в Backblaze — там должен появиться новый файл.

Миграция старых изображений:
Этот шаг необязателен, но рекомендуется, особенно если у вас мало свободного места на сервере. Итак, вы настроили всё для новых загрузок изображений, но старые изображения также можно перенести в ваши бакеты. Чтобы этот процесс работал, выполните следующие действия:

Настройка CDN Cloudflare
Этот шаг необязателен, поскольку у Backblaze есть партнёрство, делающее передачу данных в Bunny бесплатной. Однако для дополнительной безопасности и других функций вы можете направить данные сначала через Cloudflare, а затем настроить Bunny для извлечения данных оттуда, где Cloudflare их размещает.

https://help.backblaze.com/hc/en-us/articles/217666928-Using-Backblaze-B2-with-the-Cloudflare-CDN

8 лайков

Просто хотел сказать, что я сделал то же самое, что и Билл, и могу подтвердить, что это работает! Единственный нюанс в том, что это работает для новых файлов, но не для старых. Круто в методе Билла то, что даже не требовалась пересборка. Однако я надеюсь, что кто-нибудь разберётся, как заставить старые файлы работать с S3.

Кстати, резервное копирование тоже не работает. По крайней мере, у меня не работает, хотя я сделал всё в точности так же, как Билл.

5 лайков

Вы можете перенести старые файлы, используя задачу Rake.

1 лайк

Если вы имеете в виду эту команду, я уже пробовал её, но старые файлы не загрузились:

sudo -E -u discourse bundle exec rake s3:upload_assets

Я также перекомпилировал свои посты, но безрезультатно.

Задача заключается в следующем:

cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_to_s3
cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_from_s3

У вас это работает, @AntiMetaman?
Если да, я добавлю это в руководство.

Я постараюсь разобраться, как правильно настроить резервное копирование, и также обновлю руководство этой информацией. Я точно знаю, что мне нужно создать вторую зону вытягивания (pull zone).

У меня резервное копирование с Backblaze работает отлично… С какой проблемой вы столкнулись?

1 лайк

Мои резервные копии тоже работают нормально с этим методом. У вас, должно быть, что-то настроено неверно. Я прямо сейчас обновлю руководство о том, как я настраиваю резервное копирование. @AntiMetaman

Извините, я не совсем понял. Как так вышло, что у меня всё работает отлично, а вы утверждаете, что у меня что-то настроено неправильно?

Он говорит со мной @itsbhanusharma. Мои резервные копии не работают. Моя конфигурация такая же, как у Билла. Однако я не использовал отдельную зону pull для бакета резервных копий, возможно, поэтому. У меня в переменных окружения указано только имя бакета резервных копий.

Позже попробую предложение Бхану по миграции ресурсов S3.

Я создал две зоны вытягивания (pull zones), по одной для каждого бакета (загрузка и резервное копирование). Я запустил резервное копирование из панели администратора, но оно не удалось. Единственное, что знает Discourse, — это имя бакета для резервных копий.

DISCOURSE_S3_CDN_URL: https://duelistsunite.b-cdn.net
DISCOURSE_S3_BUCKET: s3omega
DISCOURSE_S3_BACKUP_BUCKET: s3omegabackup
DISCOURSE_BACKUP_LOCATION: s3

Не уверен, что я упускаю. Существует ли S3_CDN_BACKUP_URL? Учитывая, что URL для резервных копий отличается.

@itsbhanusharma Также я попробовал ваш метод, но migrate_from_S3 не определен.

Кроме того, я не был уверен, имели ли вы в виду migrate_to_s3, поэтому попробовал и его, но он тоже оказался не определен.

Извините за путаницу, я имел в виду rake uploads:migrate_to_s3

1 лайк

Похоже, что rake-задача прерывается, потому что в URL добавляется amazonaws.com, хотя это неверно. В этом и заключается проблема. Если вы используете S3, который не принадлежит Amazon, то rake-задача не сработает, так как изменение URL зашито в код.

1 лайк

Можете подтвердить или опровергнуть, что вы добавили настройки в раздел env файла app.yml, или вы добавили их на страницу администрирования > Настройки?

У меня тоже работают резервные копии через S3. Таким образом, как старые, так и новые загрузки работают с S3. Я использую Cloudflare для SSL и защиты от DDoS-атак, BunnyCDN для зон загрузки и получения резервных копий, а также BackBlaze для хранения в S3. Теперь у меня всё отлично!

Обратите внимание, что лучше определять переменные окружения в файле app.yml, как показано здесь: Configure an S3 compatible object storage provider for uploads

Затем выполните пересборку, чтобы конфигурация S3 была определена глобально, а не только в панели администратора. Таким образом, при миграции старых файлов в S3 вы сможете сделать это проще с помощью трёх команд:

./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

3 лайка

Не уверен, что я упускаю. Существует ли S3_CDN_BACKUP_URL? Учитывая, что URL для резервной копии отличается.\n\nВы решили этот вопрос? Мне тоже неясно, куда вставлять URL для зоны pull, указывающей на бакет резервных копий.\n\nРедактирование: Правильно ли я понимаю, что CDN нужен только для бакета с загрузками? Руководство по этой теме предполагает, что для бакета резервных копий следует создать вторую зону pull CDN. Если это неверно, возможно, руководство следует обновить @Bill

Похоже, требуется только имя резервного бакета. По имени можно получить URL резервной копии S3, так как он будет таким же, как и для загрузки, за исключением различия в имени. Именно поэтому вам не нужно определять отдельный URL резервной копии S3. Это, разумеется, при условии, что оба бакета находятся в одном и том же сервисе S3.

Но если резервное ведро частное, как CDN получит к нему доступ? Я новичок в CDN и, возможно, что-то упускаю, но подозреваю, что Discourse вообще не использует CDN для создания резервных копий.

Да, так и есть. Я зашел в свой резервный бакет и увидел там загруженную резервную копию. Она приватная, но Discourse имеет к ней доступ. Если у вас есть ссылка, вы можете настроить права доступа. Также можно ограничить доступ к бакету только для вашего сайта или любого источника по HTTPS.

Можете ли вы подтвердить, что резервное копирование прошло через CDN, а не напрямую из вашей установки Discourse в BackBlaze B2?