Миграция с XenForo на Discourse: обзор процесса

Мы успешно мигрировали наше сообщество (techenclave.com) с XenForo на Discourse.

Всего сообщений: 2,5 млн
Всего пользователей: 79 тыс. (активные и забаненные)
Всего личных сообщений: 0,7 млн

Нашему сообществу уже 20 лет, поэтому оно пережило свою долю миграций: с Proboards, vBulletin, IPB, XenForo и теперь на Discourse.

Сама миграция заняла 4 дня, но ей предшествовали 4 недели подготовительной работы и 4 недели разработки кастомных плагинов.

Спасибо всем, кто помогал и направлял нас, когда мы заходили в тупик. :folded_hands:
В целом миграция прошла невероятно успешно, и практически ни один полезный данные не был утерян.


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

Ключевые улучшения в основном скрипте импорта XenForo

Оптимизация производительности (ключевая пагинация): Самое важное улучшение — внедрение ключевой пагинации (WHERE id > last_id). Этот метод радикально ускоряет пакетную обработку по сравнению с традиционными запросами OFFSET, особенно на больших наборах данных, используя индексированные первичные ключи для получения следующей партии записей.

Надежная система контрольных точек и возобновления: Реализована продвинутая логика контрольных точек (с использованием .json-файлов) для пользователей, тем, ответов и личных сообщений. Это позволяет процессу импорта безопасно возобновляться с последней успешно импортированной записи после сбоев (например, перезагрузки сервера или ошибок скрипта), экономя значительное время.

Двухэтапная стратегия импорта постов: Посты теперь импортируются в два отдельных этапа:

  1. Сначала темы: Все оригинальные темы XenForo (первые посты) импортируются первыми, чтобы гарантировать существование родительских тем до импорта ответов.

  2. Затем ответы: Последующие посты внутри тем импортируются после, корректно связываясь с только что созданными темами 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.

Спасибо за分享! В списке много пунктов, которые я выделил как задачи для текущего проекта миграции с SMF на Discourse :slightly_smiling_face:

Доступен ли ваш кастомизированный код импортера для общественности? Меня особенно интересует, как вы реализовали двухпроходный импорт для обеспечения корректности новых ссылок.

Вы можете обратиться к скриптам импорта, которые я использовал. Файл, который вы хотите посмотреть, это:
xenforo_import_enhanced.rb

Причина, по которой нам пришлось выполнить импорт в два этапа, заключается в том, что со временем неизбежно старая тема объединяется с новой. Однако посты сохраняют старые ID и обрабатываются первыми. Поскольку на тот момент соответствующая тема ещё не импортирована, все такие посты отбрасываются и теряются.

Огромное спасибо! Обязательно посмотрю.

Кроме того, я ценю ваш дополнительный комментарий о мыслях, стоящих за этим. Нам повезло, что мы не столкнулись с такой проблемой. Основная причина, по которой я рассматривал двухэтапный импорт, заключалась в том, что гиперссылки в цитатах всё ещё содержат старый URL. И хотя постоянные ссылки тоже должны работать, мне кажется, было бы лучше сразу использовать новые URL-адреса постов.

Вау! Поздравляю! И спасибо, что поделились.

Это ожидаемо, да. То, как вы сейчас обрабатываете их отзывы, имеет решающее значение. Отвечайте на их комментарии, убедитесь, что они чувствуют, что их услышали, и подчеркните улучшения и новые функции (уверен, их много!). Если у вас возникнут трудности с обработкой отзывов, опубликуйте их здесь, и я с радостью помогу.

Посмотрите последний раздел этой статьи — там есть несколько полезных советов: How to prepare your community for a Discourse migration

После четырёх неудачных попыток с импортером по умолчанию ваша версия сработала безупречно.

Как и обещал, делюсь этой сводкой. Для обобщения всей обратной связи, собранной за последние 3 месяца, использовал Gemini 2.5 Pro.

На мой взгляд, главная проблема — отсутствие качественных тем оформления. Я бы хотел видеть на Discourse платный рынок тем, как это реализовано на других платформах форумов.


Сводка

Отзывы о переходе на Discourse резко поляризованы, но большинство активных пользователей выражают значительное недовольство, что привело к снижению вовлеченности. Ключевые проблемы сосредоточены в разделах Навигация и удобство использования и Интерфейс и дизайн, особенно для пользователей десктопа, привыкших к традиционным макетам форумов. Хотя некоторые пользователи ценят современный вид и технические улучшения, среди критиков преобладает мнение, что платформа ставит форму выше содержания, что создает высокую когнитивную нагрузку и менее интуитивный опыт.


1. Навигация и удобство использования (Наивысший приоритет)

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

  • Ключевые пункты обратной связи и их значимость:

    • Бесконечная прокрутка непопулярна: Самый сильный консенсус — неприятие бесконечной прокрутки, особенно на десктопе. Пользователи скучают по контексту и контролю, которые давала нумерация страниц при навигации по длинным веткам.
    • В целом сложно ориентироваться: Значительное число пользователей описывают платформу как запутанную, перегруженную, утомительную, с крутой кривой обучения, в которую они не хотят инвестировать ради форума.
    • Трудности с поиском последнего/непрочитанного поста: Распространенная проблема — невозможность интуитивно перейти к последнему сообщению или возобновить чтение с конкретного места в ветке, что вынуждает пользователей осваивать неочевидные обходные пути.
    • Плохое обнаружение контента: Пользователи скучают по старой странице категорий, которая давала четкое иерархическое обобщение структуры форума и последней активности в разделах. Новый макет воспринимается как «каша».
    • Сломанное цитирование: Процесс цитирования текста описывается как сложный и ненадежный, особенно на мобильных устройствах и планшетах, где всплывающее окно цитаты может перекрываться нативным интерфейсом.
  • Практические выводы:

    • Приоритет «традиционного форума»: Основная проблема — отклонение от ожидаемой модели форума. Тема или макет, имитирующие постраничный, более структурированный вид, особенно для страницы категорий, позволили бы устранить самые серьезные претензии.
    • Улучшение навигационных подсказок: Сделать переход к первому, последнему и последнему непрочитанному посту очевидным действием в один клик. Текущая функциональность полосы прокрутки для многих не интуитивна. Рассмотрите возможность добавления явных кнопок вверху и внизу веток.
    • Пересмотреть поведение цитирования по умолчанию: Необходимость вручную выделять текст для цитирования является серьезным барьером. Изучите плагины или настройки, которые делают цитирование всего поста действием по умолчанию в один клик.

2. Интерфейс и дизайн (Высокий приоритет)

Пользователи считают, что текущий дизайн тратит место и вредит читаемости, напрямую влияя на их способность и желание потреблять контент.

  • Ключевые пункты обратной связи и их значимость:

    • Чрезмерное использование белого пространства: Это самая часто упоминаемая дизайнерская ошибка. Пользователи на больших мониторах считают, что узкая центральная колонна тратит значительную часть экрана и снижает плотность информации.
    • Желание кастомизации: Пользователи активно ищут способы улучшить свой опыт с помощью пользовательских CSS, разных тем (Default вместо Horizon) и меньшего размера шрифта. Это указывает на сильное желание большего контроля над внешним видом на уровне пользователя.
    • Плохая читаемость: Сочетание белого пространства, размера шрифта и отсутствия четкого разделения между постами затрудняет сканирование и чтение контента по сравнению с предыдущим ПО.
  • Практические выводы:

    • Разработать тему «Компактная» или «На всю ширину»: Прямо решить проблему с белым пространством, предложив официальную тему, использующую больше ширины экрана. Это также удовлетворит желание кастомизации и является самым распространенным обходным путем, который пользователи реализуют самостоятельно.
    • Улучшить визуальные разделители: Увеличить визуальное различие между постами. Небольшие изменения, такие как границы, чередование фоновых цветов или разные макеты блоков информации о пользователе, могут значительно улучшить читаемость и снизить «чатоподобное» ощущение.
    • Пересмотреть размер шрифта и иерархию: Провести аудит типографики темы, чтобы обеспечить более последовательную и плотную по информации иерархию, особенно для текста подкатегорий и содержимого постов.

3. Общее настроение и вовлеченность пользователей (Высокое влияние)

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

  • Ключевые пункты обратной связи и их значимость:

    • Негативное настроение / Снижение использования: Это критический показатель. Несколько пользователей прямо заявляют, что теперь посещают форум реже.
    • Позитивное настроение: Меньшая, но заметная группа пользователей наслаждается современным ощущением, скоростью и функциями, такими как система уведомлений и редактор Markdown.
    • Адаптивные пользователи: Эта группа скучает по старому форуму, но понимает технические причины миграции и готова адаптироваться.
  • Практические выводы:

    • Признать и сообщить: Публично признать отзывы пользователей и сообщить четкий план улучшений UI/UX. Это может помочь удержать пользователей, которые сейчас расстроены, но готовы адаптироваться.
    • Приоритет «улучшений качества жизни»: Сначала сосредоточиться на изменениях с низкими затратами, но высоким эффектом (например, изменение цветов категорий на цвета старой темы, как предложил один из пользователей), чтобы показать, что отзывы слышны и учитываются.
    • Создать руководство «Начало работы»: Хотя некоторые пользователи не хотят читать руководства, закрепленная тема, быстро объясняющая 5 самых запутанных изменений (например, навигация по веткам и цитирование), могла бы облегчить переход для многих.

4. Основная функциональность и производительность (Средний приоритет)

Хотя эти проблемы упоминаются реже, чем UI/UX, они затрагивают основную цель форума.

  • Ключевые пункты обратной связи и их значимость:

    • «Чатоподобное» ощущение: Дизайн поощряет короткие, реактивные ответы, а не развернутые структурированные обсуждения, из-за чего платформа кажется больше чат-приложением, чем форумом.
    • Плохой поиск: Пользователи сообщают, что поиск неэффективно приоритезирует результаты по заголовкам тем, что затрудняет поиск известных веток.
    • Проблемы с производительностью: Один пользователь отметил, что текстовый редактор начинает тормозить и вызывать нагрев ноутбука на длинных ветках.
  • Практические выводы:

    • Настройка релевантности поиска: Изучить настройки Discourse или плагины, которые могут придавать больший вес заголовкам тем в результатах поиска. Предложение администратора использовать расширенный синтаксис — это обходной путь, а не решение проблемы поведения поиска по умолчанию.
    • Мониторинг производительности на длинных ветках: Следить за производительностью редактора и прокрутки на ветках с тысячами ответов, чтобы устранить потенциальные узкие места на стороне клиента.
    • Включить поиск на базе ИИ: Как предложил администратор, включение поиска с поддержкой искусственного интеллекта может стать долгосрочным решением проблемы релевантности поиска, но это следует взвешивать с учетом потенциальных затрат.

Почему бы не использовать Marketplace? Хотя результат обычно остаётся приватным.

Для этих пользователей стоит явно указать на обзор категорий. Или даже рассмотреть возможность замены этого обзора на вариант, который им больше понравится. Это также возможность вовлечь их в процесс.
Поделитесь скриншотами того, как выглядят различные настройки параметра Desktop category page style, и спросите, какой вариант им нравится больше?

Кажется, нам стоит явно получить такую обратную связь. Не могли бы вы попросить их сообщить об этом здесь, на Meta?

Это можно исправить с помощью пользовательских тем :slight_smile: Рассмотрите возможность добавления этого компонента темы в выбор пользователя: GitHub - discourse/discourse-full-width-component: Make Discourse occupy the full browser width · GitHub

Я не понимаю, что имеется в виду под «чётким разделением постов»?

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

На рынке тем стоимость делится между несколькими покупателями. У создателя темы также есть стимул создавать множество тем.

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

Компонент с полной шириной на Horizon

С пользовательской темой на базе Foundation

Тем не менее, вы правы: изменения даются нелегко, и многие пользователи уже адаптировались, хотя некоторым всё ещё сложно. Трудно угодить всем. Я просто хотел поделиться всем опытом.

Дам больше подробностей по проблеме с цитированием на мобильных устройствах и планшетах.

Продолжаем обсуждение из переход с XenForo на Discourse: обзор миграции:

Спасибо! Миграция с XenForo успешно завершена с использованием вашего улучшенного скрипта импорта. - 07.12.2025