Stop using Amazon s3 for uploads

Резервная копия содержит множество директорий и поддиректорий. Я полагаю, вам нужно рекурсивно скопировать файлы из обеих бакетов в соответствующие расположения на локальном сервере. Например, все содержимое директорий 1X и 2X из обоих бакетов должно быть скопировано в директории 1X и 2X на локальном сервере. Я не уверен на сто процентов, но, думаю, именно так.

Можете ли вы подтвердить, что все файлы были скопированы корректно?

Да, я полностью понимаю и убедился, что их относительные пути остались точно такими же.

Например, если ранее файл существовал по адресу:
//bucket1/uploads/original/2x/f/filename.jpg
а другой — по адресу:
//bucket2/uploads/original/1x/a/filename.png

то теперь они также существуют по следующим путям:
/var/discourse/shared/web_only/uploads/default/original/2x/filename.jpg и ../original/1x/a/filename.png

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

После того как я скопировал (не переместил) всё содержимое бакета в указанное выше расположение на локальном сервере (сохранив относительные пути) и выполнил команду
discourse remap:oldurl-or-path new-url-or-path,

на сайте визуально ничего не изменилось. Однако затем я выполнил команду
rake posts:rebake,

и даже иконки изображений исчезли: при наведении курсора мыши на пустое место плейсхолдера изображения URL/путь не отображался.

Надеюсь, я предоставил достаточно подробностей.

В таком случае, я думаю, что нижеприведённые команды решат вашу проблему.

    ./launcher enter app
    discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
    discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
    rake posts:rebake

Спасибо, джи.

Но, как я уже объяснял, после выполнения операций «remap» и «rebake» даже иконки изображений исчезают (то есть ситуация становится хуже).

При переназначении необходимо указать правильный путь, иначе это может привести к ошибкам. Я вручную переназначил один из S3-ссылок из примера вывода, который вы предоставили ранее, и это работает.

Изображение, размещённое в бакете:

https://bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/original/2X/9/9d8f29892278f164e8ce27a6b58cc8af0760802c.png

То же изображение, размещённое на вашем локальном сервере:

https://bathindahelper.com/uploads/default/original/2X/9/9d8f29892278f164e8ce27a6b58cc8af0760802c.png

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

 ./launcher enter app
  discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  rake posts:rebake

Спасибо ещё раз.

Я щёлкнул правой кнопкой мыши по (первому) изображению, и путь, отображённый в адресной строке, не соответствовал моему бакету:

То же самое произошло со вторым изображением.

Вы можете проверить один пример поста на моём сайте здесь (пост написан на хинди, но вы легко найдёте маленький значок изображения внутри поста). Полное изображение отображается только при щелчке по этому значку.

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

Похоже, вы ранее использовали CloudFront для кэширования. Очистите кэш браузера и попробуйте снова.
Если вы настраивали CloudFront, лучше отменить все эти изменения.

Cloudflare {edit: CloudFront} (или любая другая CDN) не задействована с моей стороны на моём сайте уже около 2 лет.

Возможно, изображения на meta действительно хранятся в Cloudflare.

Не Cloudflare. Это CloudFront. Вы очистили кэш браузера?

Да, CloudFront (извините).

Да, очистил. Более того, я открыл эту тему в режиме инкогнито Firefox.

Теперь я тоже получаю те же ссылки CloudFront. Похоже, что для вашего сайта включен AWS CloudFront. CloudFront кэширует изображения в вашем бакете. Думаю, вам нужно удалить дистрибуцию из CloudFront. Вам нужно войти в свою учетную запись AWS, чтобы проверить, активен ли дистрибуция CloudFront?

Привет, мы неправильно поняли CloudFront. На самом деле, мета-дискурс кэширует изображение. Это моя ошибка.

Я никогда не использовал CloudFront (или какую-либо другую CDN) ни в AWS, ни во фронтенде. Хотя около двух лет назад я использовал CloudFlare примерно месяц, но затем полностью от него отказался.
Также я не выбирал CloudFront в AWS. Поэтому здесь тоже нет вопросов.

Кроме того, на моём ПК при открытии изображений отображаются адреса AWS-бакета, а не какой-либо другой CDN.

Я неправильно понял CloudFront. На самом деле meta discourse закэшировал изображение. Я отредактировал свой предыдущий пост. Посмотрите.

Вы предлагаете лишь переназначить пути к изображениям (с URL из S3-хранилища на локальный путь сервера), а затем снова выполнить сборку.

Но, как я уже говорил выше, я уже пробовал это делать, и это только усугубило проблему. (к тому же, после повторной сборки функция «Восстановить» тоже перестаёт работать, и откатиться назад становится сложно).

Есть ли какие-то ещё полезные идеи?

Когда вы выполняли перенаправление, вы уверены, что пути были такими же, как ниже:

discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/

Какой путь вы указали при перенаправлении?

Я уже приводил вам пример в предыдущем сообщении. Он сработал. Я не знаю никаких других способов.

Я попробую снова, с максимальной тщательностью.
Но я искал способ понять, что происходит за кулисами. По крайней мере, на примере одного поста я хотел увидеть, какие посты привязаны к каким бакетам и в какой каше я оказался.

В любом случае, я попробую снова и сообщу об этом здесь. Ещё раз спасибо.

Путь, который вы указали в предыдущем переназначении, отразится в выводе команды ниже. Поскольку оба бакета всё ещё существуют, похоже, что ваше предыдущее переназначение не удалось. В любом случае, решение за вами. Надеюсь, вы скоро найдете решение. Удачи.

./launcher enter app
rails c
Upload.all.sample(2000).pluck(:url)

Спасибо

Не лучше вас, но я только что прошёл этот путь — и справился с помощью @Pravi.

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

Это не очень просто — будьте предельно внимательны с текстом и ссылками, иначе, если что-то пойдёт не так, наводить порядок будет очень сложно. Но это вполне реально.

Шаг 1 — Скопируйте файлы из вашего S3-бакета в папку public/uploads/default

Сначала установите AWS CLI внутри контейнера приложения:

cd /var/discourse
./launcher enter app
sudo apt install awscli

Настройте AWS, указав ваш S3-идентификатор и пароль (обычно это просто):

aws configure

Затем используйте aws для копирования всего содержимого бакета в public/uploads/default/:

aws s3 sync s3://my-bucket-name/ public/uploads/default/

Шаг 2 — Перенастройте URL S3

Это проще всего сделать, найдя изображение на вашем форуме и проверив его URL. Вам нужна вся часть до самого имени файла (включая последний /):

discourse remap //the-long-url-in-your-images-until-the-filename /uploads/default/

Шаг 3 — Пересоберите посты и перезапустите приложение:

rake posts:rebake
exit
./launcher rebuild app

Шаг 4 — Отключите S3

  1. Отключите загрузки в S3 в настройках (или в вашем app.yml, если вы настраивали его таким образом). Если вы использовали CDN, то также удалите ссылку на него из настроек (иначе отключение не сработает по-настоящему).
  2. Выключите ваш контейнер. Я сделал это, переместив содержимое в новый контейнер в качестве резервной копии на начальном этапе.

Уф! Готово. Пока что я не столкнулся ни с какими проблемами. Идите и проверьте!

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