Migrate a XenForo forum to Discourse

Безопасно ли настроить уровни доверия, значки и другие параметры Discourse до импорта? Мне кажется, что этот импортер просто добавляет или заменяет сообщения, темы и профили? Я бы не хотел настроить всё в параметрах Discourse, а затем увидеть, что эти настройки были удалены, хотя в коде я ничего подобного пока не заметил.

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

Он только вставляет. В основном ничего не заменяет. Если пользователь уже существует, он его не изменит. Он не будет использовать созданные вами категории. Если вы запустите его снова с обновлённой базой данных из вашего старого сайта, он добавит новые данные, но не изменит то, что было импортировано в предыдущих запусках. Это значительно ускоряет процесс, но если вам по какой-то причине нужно изменить скрипт, придётся удалить всё и начать заново.

4 лайка

Итак, два вопроса. Во-первых, можно ли ускорить выполнение этого процесса? У меня сервер Linode с 32 ядрами CPU и 64 ГБ оперативной памяти, но импорт 250 тысяч постов всё равно занимает 4–5 часов.

Во-вторых, импорт вложений происходит до или после импорта постов? Судя по скрипту, это происходит после. Очень обидно ждать 4–5 часов, чтобы потом обнаружить, что вложения не импортировались.

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

Вы можете изменить скрипт так, чтобы он импортировал только недавние загрузки, но если вы не планируете серьёзной разработки, просто подождите 5 часов.

2 лайка

Что ж, я уже пробовал это несколько раз, но вложения не импортируются, и у меня заканчиваются идеи. Надеюсь, кто-нибудь сможет помочь (спасибо @pfaffman за ваши советы на данный момент).

Я разместил файлы *.data в их исходной структуре папок из XenForo (то есть в папке ‘attachments’) в /root/attachments внутри контейнера Docker. Я обновил скрипт импорта, указав путь /root/attachments. Я вижу файлы в /root/attachments через командную строку с помощью команды ls.

Я запустил скрипт, и каждый раз (после ожидания около 4–5 часов) все сообщения с вложениями или фотографиями показывают старый BBCode из XenForo ([ATTACH]123456[/ATTACH]), а в установке Discourse я не вижу ни картинок, ни вложений.

Что я могу делать не так? Мне кажется, что я уже на 90% добился успеха, просто чего-то не хватает.

Вам придётся посмотреть код. Выполняется ли вообще код вложения? Соответствуют ли ваши вложения формату, который ожидает скрипт?

Если функция вложения запускается после импорта постов, то вам не нужно запускать всё заново — она просто пропустит посты (или закомментируйте импорт постов, чтобы немного ускорить процесс).

Однако ошибок может быть множество: от неправильной конфигурации до несовместимости с вашей версией ZenForo. Вам придётся изучить код и добавить вывод отладочной информации, чтобы понять, что происходит.

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

До тех пор я бы считал этот скрипт нерабочим.

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

Скрипт официального импорта XenForo сейчас не работает?

Импорт пользователей и категорий проходит без проблем,

При импорте постов с папкой вложений возникают ошибки

script/import_scripts/xenforo.rb:180:in `block in import_posts'
/var/www/discourse/script/import_scripts/base.rb:908:in `block in batches'
/var/www/discourse/script/import_scripts/base.rb:907:in `loop'
/var/www/discourse/script/import_scripts/base.rb:907:in `batches'
script/import_scripts/xenforo.rb:174:in `import_posts'
script/import_scripts/xenforo.rb:32:in `execute'
/var/www/discourse/script/import_scripts/base.rb:47:in `perform'
script/import_scripts/xenforo.rb:396:in `<main>'
   113289 / 146471 ( 77.3%)  [3766 items/min]  Ошибка при создании поста 162516. Пропуск.
undefined method `synchronize' for #<DiscourseRedis:0x00005571b2d0c5b8>
/var/www/discourse/lib/discourse_redis.rb:44:in `method_missing'
/var/www/discourse/lib/distributed_mutex.rb:84:in `try_to_get_lock'
/var/www/discourse/lib/distributed_mutex.rb:61:in `get_lock'
/var/www/discourse/lib/distributed_mutex.rb:30:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/lib/post_creator.rb:407:in `transaction'
/var/www/discourse/lib/post_creator.rb:205:in `create'
/var/www/discourse/script/import_scripts/base.rb:580:in `create_post'
/var/www/discourse/script/import_scripts/base.rb:528:in `block in create_posts'
/var/www/discourse/script/import_scripts/base.rb:515:in `each'
/var/www/discourse/script/import_scripts/base.rb:515:in `create_posts'
script/import_scripts/xenforo.rb:180:in `block in import_posts'
/var/www/discourse/script/import_scripts/base.rb:908:in `block in batches'
/var/www/discourse/script/import_scripts/base.rb:907:in `loop'
/var/www/discourse/script/import_scripts/base.rb:907:in `batches'
script/import_scripts/xenforo.rb:174:in `import_posts'
script/import_scripts/xenforo.rb:32:in `execute'
/var/www/discourse/script/import_scripts/base.rb:47:in `perform'
script/import_scripts/xenforo.rb:396:in `<main>'
   113290 / 146471 ( 77.3%)  [3766 items/min]  Ошибка при создании поста 162517. Пропуск.
undefined method `synchronize' for #<DiscourseRedis:0x00005571b2d0c5b8>
/var/www/discourse/lib/discourse_redis.rb:44:in `method_missing'
/var/www/discourse/lib/distributed_mutex.rb:84:in `try_to_get_lock'
/var/www/discourse/lib/distributed_mutex.rb:61:in `get_lock'
/var/www/discourse/lib/distributed_mutex.rb:30:in `block in synchronize'
/var/www/disc

Какая у вас версия Redis?

Мне едва удалось перевести своё существующее сообщество Xenforo в Discourse, поэтому я решил поделиться своим опытом, чтобы помочь тем, кто пытается сделать то же самое. Имейте в виду, что я не очень разбираюсь в этом, поэтому некоторые мои выводы могут быть неверны. Мне удалось завершить импорт в Discourse с потерей примерно 20% вложений. Я не могу точно объяснить причину, но проблема, похоже, затрагивает только последние 2–3 года публикаций на моём форуме, тогда как всё, что было раньше, имело успешный импорт на уровне 95% и выше. Моё единственное предположение — это связано с переходом с XF 1.x на XF 2.x.

Тем, кто пытается сделать то же самое, следует знать, что этот скрипт требует значительной доработки для работы с XF 2.x. В частности, строки 375–378 содержат неверные таблицы базы данных для импорта вложений из галереи медиа Xenforo. Мне удалось обойти эту проблему, отключив XFMG от форума и удалив его, поскольку я использовал XFMG только для зеркального отображения вложений с форума.

Если вам интересно, строка 376 ссылается на таблицу xengallery_media, что, очевидно, относится к XFMG 1.x, так как в XFMG 2.x эта таблица была переименована в xf_mg_media_item. Остальную часть мне не удалось привести в соответствие, и я подозреваю, что требуется дополнительный код для сопоставления идентификаторов вложений с постами.

В итоге я закомментировал строку 314: s = process_xf_attachments(:gallery, s),

чтобы скрипт не выдавал ошибку из-за отсутствия соответствующей SQL-таблицы.

После этого я последовал совету из поста @Jack51 в этой теме:

с внесением следующих изменений:

На шестом шаге необходимо обновить версию MariaDB. Замените mariadb-server-10.3 на mariadb-server-10.5.

На седьмом шаге следует использовать service mariadb start вместо service mysql start.

Я также изменил

frozen_string_literal: true

на

frozen_string_literal: false,

так как столкнулся с той же ошибкой, о которой упоминал кто-то другой в этой теме.

Кажется, в этой теме было много путаницы относительно того, куда помещать вложения, чтобы скрипт их обнаружил, и, признаюсь, у меня тоже возникли с этим трудности. Для тех, кто совершенно не знаком с Docker (как и я), было бы крайне полезно указать, что, хотя контейнеры Docker по сути являются виртуальными машинами, работающими на вашем сервере (то есть вы имеете дело с двумя разными операционными системами/файловыми системами), существует общее пространство для передачи файлов:

/var/discourse/shared/standalone/tmp

Эта директория находится на вашей хост-машине, и файлы, помещённые туда, будут отображаться в:

/shared/tmp

после входа в контейнер Docker. Таким образом, если вы сохраняете ту же структуру файлов/папок из Xenforo, вам нужно скопировать папки:

internal_data/attachments

в

/var/discourse/shared/standalone/tmp

на вашей хост-машине, и эта папка появится в /shared/tmp после входа в ваш контейнер Docker.

Далее, при редактировании скрипта xenforo.rb, измените:

ATTACHMENT_DIR = '/tmp/attachments'

на

ATTACHMENT_DIR = '/shared/tmp/internal_data/attachments',

и ваши вложения окажутся в правильном месте. Стоит отметить, что в Xenforo также есть папка data/attachments, но она заполнена файлами .jpg, а не нужными вам файлами .data. Кто-то ранее совершил эту ошибку в этой теме, поэтому я решил указать на неё.

Кроме того, я получил ошибку прав доступа от скрипта, поэтому, возможно, вам придётся изменить права на директорию:

sudo chmod a+rw -R /shared/tmp/internal_data/

Я бы сказал, что самый явный признак того, что скрипт не обнаруживает ваши вложения, — это его необычная тишина, тогда как он, вероятно, должен выдавать время от времени ошибки:

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

На этом у меня всё. Не поймите меня неправильно, я рад, что этот скрипт вообще существует: 80% успеха лучше, чем ничего (у меня был аналогичный процент успеха при переходе с vBulletin на Xenforo в 2009 году), и я с нетерпением жду работы с платформой Discourse. Надеюсь, этот пост поможет кому-то, и, возможно, когда-нибудь кто-то с более лучшими навыками, чем у меня, обновит этот скрипт, чтобы он работал ещё лучше.

4 лайка

В текущей версии скрипта импорта не было учтено множество вложений, так как они не всегда встраиваются в BB-код поста. Я создал запрос на слияние с рядом улучшений и исправлений. Теперь скрипт видит все вложения, а также импортирует лайки, аватары и личные сообщения, а также создаёт постоянные ссылки для категорий и тем.

5 лайков

@gerhard, я думаю, что этот PR сейчас на твоем столе. Не мог бы ты слить его, когда у тебя будет немного времени?

2 лайка

Да, я заметил это вчера. :blush: Я совершенно забыл об этом. Пересмотрю сегодня или на следующей неделе.

1 лайк

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

Извините, мне следовало просто проверить GitHub — похоже, что это было включено 28 ноября.

1 лайк

6 сообщений были перенесены в новую тему: Константа AVATAR_DIR не указана в скрипте импорта XenForo

Хочу просто напомнить всем, кто ищет способ перейти с Xenforo (найдя эту тему через Google или иным способом), что здесь тестируется импортер для программного обеспечения форума Flarum:

1 лайк

Интересно, но было бы ещё интереснее, если бы у нас был надёжный импортер из XenForo в Discourse.

Этот человек выглядит очень уверенным в том, что делает, и я это приветствую!

1 лайк

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

Эти инструкции устарели для Ubuntu 22.04?

После успешной установки MySQL происходит следующее:

root@root-app:/# sudo mysql
ERROR 2002 (HY000): Не удается подключиться к локальному серверу MySQL через сокет ‘/var/run/mysqld/mysqld.sock’ (2)