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

**URL:** https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245
**Category:** Migration
**Created:** [15.Июль.2025 05:48:02 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245 "2025-07-15T05:48:02Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [15.Июль.2025 05:48:02 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/1 "2025-07-15T05:48:02Z")

</div>

Мы успешно мигрировали наше сообщество ([techenclave.com](http://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-файлов) для пользователей, тем, ответов и личных сообщений. Это позволяет процессу импорта безопасно возобновляться с последней успешно импортированной записи после сбоев (например, перезагрузки сервера или ошибок скрипта), экономя значительное время.

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

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.

---

_[View the full topic](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245)._
