Мы успешно мигрировали наше сообщество (techenclave.com) с XenForo на Discourse.
Всего сообщений: 2,5 млн
Всего пользователей: 79 тыс. (активные и забаненные)
Всего личных сообщений: 0,7 млн
Нашему сообществу уже 20 лет, поэтому оно пережило свою долю миграций: с Proboards, vBulletin, IPB, XenForo и теперь на Discourse.
Сама миграция заняла 4 дня, но ей предшествовали 4 недели подготовительной работы и 4 недели разработки кастомных плагинов.
Спасибо всем, кто помогал и направлял нас, когда мы заходили в тупик. ![]()
В целом миграция прошла невероятно успешно, и практически ни один полезный данные не был утерян.
В основе нашей миграции лежал усовершенствованный скрипт импорта из XenForo, значительно превосходящий стандартную базовую версию. Мы также использовали несколько специализированных вспомогательных скриптов для обработки конкретных преобразований данных и обеспечения целостности данных после импорта.
Ключевые улучшения в основном скрипте импорта XenForo
Оптимизация производительности (ключевая пагинация): Самое важное улучшение — внедрение ключевой пагинации (WHERE id > last_id). Этот метод радикально ускоряет пакетную обработку по сравнению с традиционными запросами OFFSET, особенно на больших наборах данных, используя индексированные первичные ключи для получения следующей партии записей.
Надежная система контрольных точек и возобновления: Реализована продвинутая логика контрольных точек (с использованием .json-файлов) для пользователей, тем, ответов и личных сообщений. Это позволяет процессу импорта безопасно возобновляться с последней успешно импортированной записи после сбоев (например, перезагрузки сервера или ошибок скрипта), экономя значительное время.
Двухэтапная стратегия импорта постов: Посты теперь импортируются в два отдельных этапа:
-
Сначала темы: Все оригинальные темы XenForo (первые посты) импортируются первыми, чтобы гарантировать существование родительских тем до импорта ответов.
-
Затем ответы: Последующие посты внутри тем импортируются после, корректно связываясь с только что созданными темами Discourse. Такой структурированный подход минимизирует появление «сиротских» ответов и повышает согласованность данных.
Полноценный импорт реакций/лайков:
Скрипт теперь интеллектуально различает реакции XenForo, которые напрямую соответствуют основным «Лайкам» (сердечкам) Discourse, и кастомные реакции.
Поддерживается массовая вставка как основных лайков (в таблицу post_actions), так и кастомных реакций (с использованием плагина discourse-reactions), что значительно ускоряет процесс.
Включено сопоставление коротких названий эмодзи XenForo с их аналогами в Discourse (например, thumbsup → +1, heart_eyes → heart).
Расширенный импорт данных маркетплейса (кастомный плагин):
Добавлен специальный раздел для импорта детализированных данных объявлений маркетплейса (например, цена, местоположение, состояние, гарантия, варианты оплаты) из таблицы thread_field_value XenForo.
Эти данные сохраняются в кастомной модели TecencMarket::Listing и как пользовательские поля тем, обеспечивая более богатое отображение и функциональность в Discourse.
Импорт отзывов о маркетплейсе (кастомный плагин):
Введена новая функция для миграции отзывов/оценок пользователей (лайки/дизлайки), связанных с транзакциями на маркетплейсе.
Преобразование префиксов тем в теги: Скрипт теперь автоматически конвертирует префиксы тем XenForo в теги Discourse. Это критически важно для сохранения организации контента и его доступности, с использованием плагина discourse-tagging. Также корректно сопоставляются ID префиксов с читаемыми названиями, используя таблицу фраз XenForo.
Улучшенная обработка содержимого постов: Этот метод получил значительные обновления для лучшей конвертации в Markdown и обработки сложного BBCode XenForo:
Улучшенная обработка цитат: Конвертация тегов [QUOTE] XenForo, включая обработку цитируемых пользователей и ссылки на конкретные посты/темы Discourse, где это возможно.
Исправленное встраивание медиа: Обеспечено, чтобы все импортируемые медиа (YouTube, Twitter/X) находились на отдельных строках для активации функции oneboxing/встраивания Discourse, а старые теги BBCode [MEDIA] конвертировались в стандартные URL.
Конвертация таблиц: Преобразование BBCode [TABLE] XenForo в таблицы Markdown.
Обработка вложений (встроенные и добавленные): Логика обработки вложений была переработана. Теперь скрипт пытается заменить теги [ATTACH] на правильный Markdown для загруженного файла. Критически важно: любые вложения, которые не были явно помечены тегом [ATTACH] в содержимом поста, теперь добавляются в конец поста под четким заголовком «Вложения:», гарантируя, что ни один файл не будет утерян.
Конвертация эмодзи/смайликов: Расширенная карта соответствия смайликов XenForo нативным эмодзи Discourse, что улучшает визуальную согласованность.
Общая очистка BBCode: Более полное удаление и конвертация различных тегов BBCode (например, [B], [I], [URL], [IMG], [LIST], [CODE], [COLOR], [FONT], [SIZE], [INDENT], [USER]).
Кодировка символов и очистка: Включает .scrub! для некорректных последовательностей UTF-8 и CGI.unescapeHTML для правильного декодирования HTML-сущностей.
Обработка приостановленных пользователей: Забаненные пользователи XenForo теперь импортируются как приостановленные пользователи Discourse, сохраняя свои аккаунты, но ограничивая их активность; причины бана сохраняются в пользовательских полях.
Импорт закладок: Импорт всех закладок из XenForo в Discourse. Изначально их было не так много.
Значительная часть пользователей осталась недовольна после миграции. Это ожидаемо. Вы наверняка уже слышали подобное после других миграций. Тем не менее, позже в этой теме мы поделимся резюме полученной обратной связи — возможно, там найдется пища для размышлений для будущего развития Discourse.

