Мы занимаемся разработкой, тестированием и намеренным поиском уязвимостей в нашем форуме на Discourse, прежде чем перенести всё в продакшн. Я только что мигрировал свой тестовый форум с включённой загрузкой в S3 с одного сервера на другой, и после восстановления все URL-адреса для любых вложений были переписаны на URL форума, а не на S3…
К счастью, это тестовый форум, поэтому нам не так важно сохранение данных, однако я хотел бы:
A. Всё же исправить это.
B. Найти способ смягчить или предотвратить подобное в продакшене.
Пострадали не только посты, но и все изображения, медиафайлы, контент и аватары (что довольно серьёзно)…
Перед восстановлением вы можете настроить S3 на целевом сайте в файле app.yml (не через панель администратора). После подтверждения, что настройка выполнена и соединение с нужным бакетом установлено, можно приступать к восстановлению — медиафайлы должны быть корректно связаны.
Мы фактически сделали именно это, и именно так мы попали в эту ситуацию.
Я скопировал app.yml в точности как был в место назначения, а затем сделал резервную копию из оригинала. Проблема возникла при восстановлении: именно в этот момент URL-адреса были переписаны, несмотря на то, что ничего не изменилось, и загрузка в S3 по-прежнему была включена.
В конце концов мы решили эту проблему с помощью ребейка (мы так считаем, кэширование в Discourse очень агрессивное, поэтому среди множества опробованных решений мы точно не знаем, что именно помогло). Однако остаются без ответа вопросы о том, как проводить миграции с минимальными проблемами или даже восстанавливаться из резервной копии, если это потребуется на продакшене.
Похоже, вы настроили S3 через настройки сайта, а не через переменные окружения, как предлагал Крис. Процесс восстановления должен иметь информацию о S3. Сделать это через настройки сайта невозможно.
Вы также можете создать резервную копию без файлов загрузок через консоль, если хотите: discourse backup --sql_only
Восстановление такой резервной копии не изменит URL-адреса загрузок. Поэтому, если ваш новый сервер имеет доступ к тому же бакету S3, этот способ сработает.
Конфигурация S3 находится в файле app.yml, а не в настройках сайта.
Редактирование:
Я понимаю, что объясняю недостаточно подробно, и не хочу скрывать детали.
Мы используем OVH S3, и он настроен в файле app.yml.
Я сделал резервную копию нашего тестового форума без загрузок, но на тот момент S3 всё ещё был включён.
Затем я восстановил его на новом сайте с тем же самым файлом app.yml, и именно тогда возникла проблема. Чтобы прояснить: сейчас всё исправлено, но я не уверен, было ли это из-за того, что я несколько раз пересоздавал образ, или из-за агрессивного кэширования Discourse. Вот почему мне нужно знать, как правильно это делать, чтобы всё работало с первого раза. Я боюсь, что если когда-нибудь понадобится восстановить резервную копию на производственный экземпляр и мы столкнёмся с этой проблемой, мне нужно будет знать, как быстро её исправить, прежде чем пользователи это заметят.