Миграция из 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, пока файлы не перенесены.
Предлагаемый план переключения¶
- Разверните новый форум на тестовом хосте и настройте его как нужно: категории, группы, параметры защиты от спама, оформление.
- Сделайте резервную копию Discourse и запустите импорт с
--download-files. Заложите на это реальное время; большой форум с многолетними изображениями переносится долго. - Проверьте результат. Выборочно откройте темы с блоками кода, цитатами и изображениями. Убедитесь, что значки и звания нескольких участников перенеслись. Проверьте личные сообщения.
- Сделайте свежую резервную копию и повторите импорт незадолго до переключения, чтобы забрать всё, что появилось после шага 2. Импорт идемпотентен, поэтому добавятся только изменения.
- Переведите Discourse в режим только для чтения, чтобы после финального экспорта ничего не появилось.
- Настройте редиректы со старых URL (ниже).
- Переключите 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 через этот импортёр одной командой, и пароль каждого участника продолжил работать на другой стороне. Стоит осмотреться там перед планированием собственного переезда.