Перейти к содержанию

Миграция из Discourse

Forum Pro импортирует стандартную администраторскую резервную копию Discourse напрямую. Участники сохраняют рабочие пароли, контент переносится точно, файлы размещаются в вашем хранилище, а весь процесс можно возобновить и запускать повторно.

Что потребуется

Резервная копия Discourse из Admin → Backups, файл типа .sql.gz. Это всё. Дамп потоково разбирается в PHP, поэтому PostgreSQL не нужно устанавливать ни на старом, ни на новом сервере.

Команда

bin/plugin forum-pro import-discourse backup.sql.gz \
    --source-url https://discourse.example.com \
    --download-files
Параметр Назначение
--source-url Базовый URL старого форума. Используется для распознавания и перезаписи внутренних ссылок и как база для загрузки файлов.
--download-files Перенести каждое упомянутое изображение, вложение и аватар в ваше хранилище.
--files-only Пропустить контент и выполнить только проход по файлам. Используйте, чтобы завершить загрузку файлов позже.
--delay-ms Задержка в миллисекундах между загрузками файлов, чтобы не перегружать старый CDN.

Что переносится

Участники и идентификация

  • Участники с рабочими паролями. Хеши pbkdf2 Discourse проверяются нативно и обновляются до bcrypt при первом входе каждого участника, поэтому никому не придётся сбрасывать пароль.
  • Администраторы и модераторы как роли модераторов.
  • Пользовательские группы, включая цвета их оформления, и членство в них.
  • Пользовательские значки наград и звания участников.

Структура и контент

  • Категории. Родительская категория с дочерними становится разделом; закрытые категории становятся доступными только сотрудникам.
  • Темы и сообщения с преобразованием Markdown: загрузки, цитаты, эмодзи и блоки [details] обрабатываются.
  • История изменений сообщений, поэтому цепочка правок сохраняется.
  • Лайки, импортируемые как реакции.
  • Метки.
  • Принятые ответы.
  • Закладки.
  • Опросы с голосами.
  • Отслеживаемые и отключённые темы, поэтому настройки уведомлений участников сохраняются.
  • Личные сообщения.

Ссылки

  • Внутренние ссылки между темами и сообщениями перезаписываются на новые адреса.

Идемпотентность

Каждая импортированная строка несёт свой id Discourse. Повторный запуск прерванного импорта никогда не создаёт дубликаты: существующие строки распознаются и пропускаются. Если импорт прервался на половине форума с 40 000 сообщений, запустите ту же команду снова.

Перенос файлов

--download-files загружает каждое упомянутое изображение, вложение и аватар со старого CDN в контентно-адресуемое хранилище, а затем перезаписывает ссылки в сообщениях. Процесс возобновляемый и ограничен по частоте параметром --delay-ms.

Если нужно быстро получить контент, а файлы перенести позже, запустите импорт без --download-files, а затем:

bin/plugin forum-pro import-discourse backup.sql.gz \
    --source-url https://discourse.example.com --files-only --delay-ms 250

Старый форум должен оставаться доступным, пока не завершится проход по файлам, поэтому не переключайте DNS, пока файлы не перенесены.

Предлагаемый план переключения

  1. Разверните новый форум на тестовом хосте и настройте его как нужно: категории, группы, параметры защиты от спама, оформление.
  2. Сделайте резервную копию Discourse и запустите импорт с --download-files. Заложите на это реальное время; большой форум с многолетними изображениями переносится долго.
  3. Проверьте результат. Выборочно откройте темы с блоками кода, цитатами и изображениями. Убедитесь, что значки и звания нескольких участников перенеслись. Проверьте личные сообщения.
  4. Сделайте свежую резервную копию и повторите импорт незадолго до переключения, чтобы забрать всё, что появилось после шага 2. Импорт идемпотентен, поэтому добавятся только изменения.
  5. Переведите Discourse в режим только для чтения, чтобы после финального экспорта ничего не появилось.
  6. Настройте редиректы со старых URL (ниже).
  7. Переключите DNS в последнюю очередь.

Оставьте Discourse работать в режиме только для чтения ещё некоторое время после переключения. Это стоит немного и служит запасным вариантом.

Редиректы со старых URL

Старые URL Discourse могут отдавать 301 на соответствующие адреса Forum Pro, что сохраняет поисковые позиции и старые закладки.

frontend:
  legacy_redirects:
    enabled: true
    discourse:
      hosts: ['forum.example.com']       # старые имена хоста Discourse
      target_base: 'https://my-site.example' # пусто — тот же хост

Распознаются и перенаправляются следующие формы URL Discourse:

Путь Discourse Перенаправляется на
/t/<slug>/<id> и /t/<slug>/<id>/<post> Тему, к правильному сообщению
/p/<id> Сообщение в его теме
/c/<slug> Категорию
/u/<username> Профиль участника
/ Корень форума

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

Использовать это можно двумя способами:

  • Направить старое имя хоста на сайт Grav. Запросы к forum.example.com/t/... попадут в Grav, который отдаст 301 на example.com/forum/....
  • Разместить форум на старом имени хоста. Оставьте target_base пустым, и редиректы останутся на том же хосте.

После импорта

Запустите эти команды, когда всё успокоится:

bin/plugin forum-pro recount      # исправить денормализованные счётчики
bin/plugin forum-pro reindex      # построить поисковый индекс по импортированному контенту
bin/plugin forum-pro integrity    # отчёт о согласованности только для чтения

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

Вероятно, стоит также пройтись по Admin → Forum → Tags и объединить метки, пришедшие в нескольких написаниях.

Что нужно знать

  • Журнал показателей не заполняется задним числом. DAU/MAU и графики трендов на панели управления накапливаются с момента установки Forum Pro, поэтому импортированный форум начинается с плоского графика. Такие итоги, как число участников и сообщений, рассчитываются в реальном времени и сразу верны.
  • Удалённые пользователи Discourse импортируются как заглушка «Deleted User», чтобы их сообщения сохранили место в ветках.
  • Массовая очистка сообщений существует не просто так. Импорт часто приносит тысячи старых личных сообщений. Инструменты массового архивирования и удаления с выбором всех N элементов позволяют участникам очистить их, не нажимая тысячу раз.

Импорт из другой платформы

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

Оба импортёра построены на общем слое импорта: сопоставление id для идемпотентности, цепочка преобразования Markdown, адаптеры хешей паролей и возобновляемый перенос файлов не зависят от источника. Добавление новой платформы в основном сводится к обучению слоя читать другой формат экспорта.

Свяжитесь с нами насчёт импортёра для вашей платформы. Напишите на premium@getgrav.org, что у вас работает и как выглядит экспорт, и мы честно скажем, что потребуется. Если ваша платформа распространена, вы, вероятно, не первый, кто спрашивает.

Если ваша текущая платформа умеет экспортировать в резервную копию Discourse, этот путь работает уже сегодня.

Так переехал getgrav.org

Форум сообщества Grav работает на Forum Pro. Девять лет истории, более 41 000 сообщений в более чем 9 300 темах от более чем 3 800 участников переехали из Discourse через этот импортёр одной командой, и пароль каждого участника продолжил работать на другой стороне. Стоит осмотреться там перед планированием собственного переезда.