Восстановление на новом хосте

Я настроил новый хост, чтобы иметь среду «staging» (тестовую). Я воссоздал ту же установку Discourse с тем же, по идее, версией. У меня запущена версия 2.8.2.

Первое замечание: начиная с версии 2.8.2 размер моей резервной копии уменьшился с 282 МБ до примерно 90 МБ. Не знаю почему, но я просто воспользуюсь этим, добавив немного здравого смысла.

Я загрузил последний архив с моего форума и разместил его в локальном хранилище новой тестовой среды.

Восстановление не удалось из-за следующей ошибки:

[2022-02-27 19:41:18] ALTER TABLE
[2022-02-27 19:41:18] ALTER TABLE
[2022-02-27 19:41:18] Миграция базы данных...
[2022-02-27 19:43:00]
[2022-02-27 19:43:00] Переподключение к базе данных...
[2022-02-27 19:43:00] Перезагрузка настроек сайта...
[2022-02-27 19:43:00] Отключение исходящей почты для пользователей, не являющихся сотрудниками...
[2022-02-27 19:43:02] Отключение режима только для чтения...
[2022-02-27 19:43:02] Очистка кэша категорий...
[2022-02-27 19:43:02] Перезагрузка переводов...
[2022-02-27 19:43:02] Переназначение загрузок...
[2022-02-27 19:43:02] Переназначение 'https://forum.geekbeacon.org' на 'https://forum-staging.geekbeacon.org'
[2022-02-27 19:43:08] Восстановление загрузок, это может занять некоторое время...
[2022-02-27 19:43:36] ИСКЛЮЧЕНИЕ: 8 постов не переназначены на новый URL загрузки S3. Миграция S3 не удалась для базы данных 'default'.
[2022-02-27 19:43:36] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:87:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:317:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:62:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:44:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:61:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:23:in `restore'
/var/www/discourse/script/spawn_backup_restore.rb:36:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'
[2022-02-27 19:43:36] Попытка отката...
[2022-02-27 19:43:36] Откат...
[2022-02-27 19:43:36] Очистка...
[2022-02-27 19:43:36] Удаление функций из схемы discourse_functions...
[2022-02-27 19:43:36] Удаление временной директории '/var/www/discourse/tmp/restores/default/2022-02-27-194051'...
[2022-02-27 19:43:36] Возобновление работы sidekiq...
[2022-02-27 19:43:36] Пометка восстановления как завершенного...
[2022-02-27 19:43:36] Уведомление 'csgeek' об окончании восстановления...

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

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

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

Я вернулся к старому серверу, где у меня настроено два бакета: один для резервных копий, другой для медиафайлов. Я следовал руководству и настроил AWS S3, включая CDN.

Когда я запустил rake uploads:migrate_to_s3, команда завершилась ошибкой. После этого я выполнил posts:rebake, что, похоже, уменьшило количество ошибок, но процесс всё ещё не удаётся:

Обратите внимание: миграция на S3 в настоящее время необратима!
Нажмите [CTRL+c] для отмены или [ENTER] для продолжения.

Миграция загрузок на S3 для 'default'...
Загрузка файлов в S3...
 - Список локальных файлов
 => 208 файлов
 - Список файлов в S3
. => 978 файлов
 - Синхронизация файлов с S3
................................................................................................................................................................................................................
Обновление URL-адресов в базе данных...
Удаление старых оптимизированных изображений...
Пометка всех постов, содержащих лайтбоксы, для пересборки...
15 постов помечены для пересборки
rake aborted!
FileStore::ToS3MigrationError: 1 пост не был пересопоставлен с новым URL-адресом загрузки в S3. Миграция на S3 не удалась для базы данных 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:87:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Задачи: TOP => uploads:migrate_to_s3
(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)

Есть ли способ запустить migrate_to_s3 в режиме подробного вывода, чтобы определить проблемный пост?

У меня та же проблема: миграция моего сервера без изменения S3-бакета.
Есть какие-либо предложения?

Восстановление завершается ошибкой с сообщением вроде этого?

FileStore::ToS3MigrationError: 1 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.

В таком случае лучшее решение — исправить пост(ы), в которых файлы загружены не в то место. Однако, возможно, в этом тесте есть случай ложного срабатывания. В таком случае можно использовать переключатель для задачи rake, который приостановит выполнение, чтобы вы могли всё исправить. Я не могу быстро найти его, и его нет на Backup discourse from the command line, где он должен быть. Сейчас я занят другой задачей, поэтому не могу найти его прямо сейчас.

Да, у меня такая же ошибка.

ИСКЛЮЧЕНИЕ: 3 сообщения не были перенаправлены на новый URL загрузки S3. Миграция S3 не удалась для базы данных ‘default’.

Вы можете попробовать

discourse restore --pause filename

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

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

Та же ошибка:

Загрузка файлов в S3…

* Список локальных файлов
  => 2 файла
* Список файлов в S3
  … => 183549 файлов
* Синхронизация файлов с S3
  ..
  Обновление URL-адресов в базе данных…
  Удаление старых оптимизированных изображений…
  Пометка всех сообщений, содержащих лайтбоксы, для пересборки…
  169809 сообщений помечены для пересборки
  **ОШИБКА: 3 сообщения не переназначены на новый URL загрузки в S3. Миграция в S3 не удалась для БД «default».**
  /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log' /var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
  /var/www/discourse/lib/file_store/to_s3_migration.rb:385:in `migrate_to_s3' /var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
  /var/www/discourse/lib/file_store/s3_store.rb:367:in `copy_from' /var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
  /var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore' /var/www/discourse/lib/backup_restore/restorer.rb:179:in `restore_uploads'
  /var/www/discourse/lib/backup_restore/restorer.rb:72:in `run' script/discourse:243:in `restore'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.4.0/lib/thor/command.rb:28:in `run' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.4.0/lib/thor/invocation.rb:127:in `invoke_command'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.4.0/lib/thor.rb:538:in `dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.4.0/lib/thor/base.rb:584:in `start'
  script/discourse:397:in `<top (required)>' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
  /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors' /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
  /usr/local/bin/bundle:25:in `load' /usr/local/bin/bundle:25:in `'
  Попытка отката…
  Откат…
  Очистка временных файлов…
  Удаление функций из схемы discourse_functions…
  Удаление временной директории «/var/www/discourse/tmp/restores/default/2026-01-13-145033»…
  Возобновление работы sidekiq…
  Пометка восстановления как завершенного…
  Уведомление «system» об окончании восстановления…
  Готово!

Либо исправьте эти три загрузки, либо остановите восстановление до выполнения этой проверки.

Как я могу найти

3 сообщения на 168000?

Можно ли остановить восстановление, пропустив эту проверку?

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

Я публиковал

Вы это сделали? Мне кажется, вы могли просто нажать Ctrl+C после завершения восстановления базы данных. Вы выполняете восстановление только базы данных?

О черт, я даже не подумал о том, чтобы остановить восстановление после базы данных, но до загрузки файлов.
Мне не нужно переносить файлы с S3 — могу ли я просто мигрировать фронтенд и базу данных?

Можешь подсказать, какой вариант позволяет остановить rake-задачу для постов и выявить проблемные? Буду очень благодарен.

Есть какие-то предложения? Спасибо