Резервная копия содержит множество директорий и поддиректорий. Я полагаю, вам нужно рекурсивно скопировать файлы из обеих бакетов в соответствующие расположения на локальном сервере. Например, все содержимое директорий 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/путь не отображался.
При переназначении необходимо указать правильный путь, иначе это может привести к ошибкам. Я вручную переназначил один из S3-ссылок из примера вывода, который вы предоставили ранее, и это работает.
Вы можете проверить один пример поста на моём сайте здесь (пост написан на хинди, но вы легко найдёте маленький значок изображения внутри поста). Полное изображение отображается только при щелчке по этому значку.
Однако, если я выполню переназначение, а затем повторную сборку, то даже этот значок полностью исчезнет. И у посетителя не останется никакой возможности увидеть изображение.
Похоже, вы ранее использовали CloudFront для кэширования. Очистите кэш браузера и попробуйте снова.
Если вы настраивали CloudFront, лучше отменить все эти изменения.
Теперь я тоже получаю те же ссылки CloudFront. Похоже, что для вашего сайта включен AWS CloudFront. CloudFront кэширует изображения в вашем бакете. Думаю, вам нужно удалить дистрибуцию из CloudFront. Вам нужно войти в свою учетную запись AWS, чтобы проверить, активен ли дистрибуция CloudFront?
Я никогда не использовал CloudFront (или какую-либо другую CDN) ни в AWS, ни во фронтенде. Хотя около двух лет назад я использовал CloudFlare примерно месяц, но затем полностью от него отказался.
Также я не выбирал CloudFront в AWS. Поэтому здесь тоже нет вопросов.
Кроме того, на моём ПК при открытии изображений отображаются адреса AWS-бакета, а не какой-либо другой CDN.
Вы предлагаете лишь переназначить пути к изображениям (с URL из S3-хранилища на локальный путь сервера), а затем снова выполнить сборку.
Но, как я уже говорил выше, я уже пробовал это делать, и это только усугубило проблему. (к тому же, после повторной сборки функция «Восстановить» тоже перестаёт работать, и откатиться назад становится сложно).
Я попробую снова, с максимальной тщательностью.
Но я искал способ понять, что происходит за кулисами. По крайней мере, на примере одного поста я хотел увидеть, какие посты привязаны к каким бакетам и в какой каше я оказался.
В любом случае, я попробую снова и сообщу об этом здесь. Ещё раз спасибо.
Путь, который вы указали в предыдущем переназначении, отразится в выводе команды ниже. Поскольку оба бакета всё ещё существуют, похоже, что ваше предыдущее переназначение не удалось. В любом случае, решение за вами. Надеюсь, вы скоро найдете решение. Удачи.
./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/:
Шаг 3 — Пересоберите посты и перезапустите приложение:
rake posts:rebake
exit
./launcher rebuild app
Шаг 4 — Отключите S3
Отключите загрузки в S3 в настройках (или в вашем app.yml, если вы настраивали его таким образом). Если вы использовали CDN, то также удалите ссылку на него из настроек (иначе отключение не сработает по-настоящему).
Выключите ваш контейнер. Я сделал это, переместив содержимое в новый контейнер в качестве резервной копии на начальном этапе.
Уф! Готово. Пока что я не столкнулся ни с какими проблемами. Идите и проверьте!
Отличная работа! Я считаю, что именно эти шаги в итоге помогли мне добиться успеха, хотя я пробовал множество других переназначений, которые работали не так хорошо! Здорово, что есть четкие инструкции.