Migrate a phpBB3 forum to Discourse

Это всё довольно типично.

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

Рад, что вы справились!

3 лайка

Спасибо, Констанца, очень полезная ссылка. :+1:


Спасибо за информацию, Джей. Я сделаю PR позже, после завершения миграции, если это поможет создать ещё более совершенный инструмент миграции phpBB3.

Текущий скрипт также игнорирует теги [size=XXX], с которыми я сталкивался при других миграциях.
При моей текущей миграции я быстро написал скрипт в импортере и использовал значение XXX, чтобы заменить эти теги на <small>content</small> и <big>content</big>, так как они поддерживаются в Discourse.
Но это было моим личным пожеланием, и, возможно, более правильным решением (в общем смысле) было бы просто избавиться от этих тегов [size], как это уже делает скрипт импорта с тегами [color].

4 лайка

Спасибо @Canapin за всю вашу обратную связь. PR определенно приветствуется!

Также небольшой тизер: мы работаем над решением, которое должно сделать все импорты — не только phpBB — намного лучше, быстрее, проще в настройке и избавит от назойливых проблем с конвертацией BBCode… :wink:

4 лайка

При импорте моих постов возникло множество таких ошибок (не для всех постов):

   251491 / 251672 ( 99.9%)  [14140 items/min]  Исключение при создании поста 354629. Пропуск.
undefined method `[]' for nil:NilClass
/var/www/discourse/script/import_scripts/phpbb3/importers/post_importer.rb:66:in `block in map_first_post'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.4.1/lib/active_support/core_ext/object/try.rb:15:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.1.4.1/lib/active_support/core_ext/object/try.rb:15:in `try'
/var/www/discourse/script/import_scripts/base.rb:576:in `create_post'
/var/www/discourse/script/import_scripts/base.rb:523:in `block in create_posts'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/import_scripts/base.rb:510:in `create_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:192:in `block in import_posts'
/var/www/discourse/script/import_scripts/base.rb:874:in `block in batches'
/var/www/discourse/script/import_scripts/base.rb:873:in `loop'
/var/www/discourse/script/import_scripts/base.rb:873:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:254:in `batches'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:188:in `import_posts'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:38:in `execute'
/var/www/discourse/script/import_scripts/base.rb:47:in `perform'
/var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
script/import_scripts/phpbb3.rb:33:in `<module:PhpBB3>'
script/import_scripts/phpbb3.rb:14:in `<module:ImportScripts>'
script/import_scripts/phpbb3.rb:13:in `<main>'

Но я не смог понять, что вызывает эту ошибку.

Есть какие-нибудь идеи?

Как я могу проверить, действительно ли отсутствует пост? Не смог найти способ вывести данные (например, содержимое поста), соответствующие сообщению «Исключение при создании поста 354629».

Не помню, чтобы сталкивался с этой ошибкой при предыдущих тестах импорта в прошлые дни, но возможно, я просто не обратил на это внимание… Может ли это быть связано с этой известной проблемой?

251490 / 251672 ( 99.9%)  [14140 items/min]  Родительский пост 337703 не существует. Пропуск 354628: vw-camper est malade !?

Я запустил скрипт импорта дважды, как и положено, в отношении этой конкретной проблемы.

1 лайк

Убедитесь, что в файле settings.yml вы установили tag_mappings: {}, если не используете эту функцию.

3 лайка

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

Проблема решена, большое спасибо.


Предполагаю, что сейчас вы не можете много рассказать, но есть ли какие-то подсказки о том, как это будет работать и когда появятся рабочие скрипты импорта, использующие эту новую систему?
Возможно, я перенесу ещё один phpBB в этом году, поэтому мне было бы очень интересно узнать чуть больше. :slight_smile:

1 лайк

Привет! Я тестирую миграцию phpBB 3.2 на Discourse для форума среднего размера (30 тыс. тем / 600 тыс. сообщений). Почти всё работает отлично, за исключением нескольких тем, которые не импортировались (ошибка: «Родительский пост xx не существует»). Проблема не решается при повторных запусках, но это не критично.

Моя главная проблема заключается в том, что последующие импорты свежих данных (подтверждённых контрольной суммой sha256sum в файле import/mysql/imported) не добавляют новые сообщения в Discourse. На раннем этапе процесса возникает исключение, не знаю, связано ли это с проблемой:

Не удалось сопоставить сообщение с ID 6815

Значение BIGINT UNSIGNED выходит за допустимые пределы в выражении '(`phpbb_prod`.`o`.`poll_option_total` - (select count(distinct `phpbb_prod`.`v`.`vote_user_id`) from `phpbb_prod`.`phpbb3_poll_votes` `v` join `phpbb_prod`.`phpbb3_users` `u` join `phpbb_prod`.`phpbb3_topics` `t` where ((`phpbb_prod`.`u`.`user_id` = `phpbb_prod`.`v`.`vote_user_id`) and (`phpbb_prod`.`v`.`topic_id` = `phpbb_prod`.`t`.`topic_id`) and (`phpbb_prod`.`v`.`poll_option_id` = `phpbb_prod`.`o`.`poll_option_id`) and (`phpbb_prod`.`t`.`topic_id` = `phpbb_prod

Это проблема с встроенными опросами в сообщениях, судя по выводу SQL?

Хорошего дня!

2 лайка

Пока я не могу сказать многого, так как всё ещё находится в разработке. Планы могут измениться… Но «в этом году» — вполне реалистичный прогноз. :wink:

2 лайка

Значение BIGINT UNSIGNED выходит за допустимые пределы

Хм, разве в этом опросе так много анонимных голосов?

Вам придётся поэкспериментировать с этим SQL-запросом:

Возможно, что-то вроде этого: https://stackoverflow.com/a/11704174/451338
Дайте знать, когда найдёте решение, или создайте PR с исправлением. Буду признателен.

3 лайка

Опросы существуют с самого начала работы форума. В то время я не руководил им, но, насколько я помню, анонимным пользователям никогда не разрешалось публиковать сообщения или отвечать на опросы.

С помощью

 SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';

Я смог получить все голоса в опросах, и в двух из них обнаружил отрицательные значения поля “anonymous_votes”. Похоже, что этот форум всё-таки как-то позволял анонимное голосование :slight_smile:

Спасибо @gerhard за подсказку, я покопаюсь поглубже…

4 лайка

Я сейчас изучаю возможность миграции форума phpBB на Discourse. Проблема в том, что наш phpBB использует PostgreSQL вместо MySQL, поэтому я хотел бы адаптировать скрипт для работы и с ним.

Мог бы кто-нибудь дать несколько советов по лучшему подходу к этому? В идеале я хочу, чтобы все могли воспользоваться результатами этой работы, поэтому предпочел бы использовать подход, принятый upstream-разработчиками, а не просто быстро и грязно «накодить» решение.

Насколько я понимаю, это в основном вопрос добавления правильных SQL-инструкций для схемы PostgreSQL с использованием подходящего адаптера базы данных. Однако я не уверен, как нужно адаптировать весь процесс оркестрации для контейнера Docker, чтобы правильно запустить экземпляр PostgreSQL (если это требуется в зависимости от типа БД, указанного в конфигурации), импортировать дамп базы данных и выполнить инструкции.

2 лайка

Существует скрипт массового импорта для phpBB, работающий с PostgreSQL. Вы его видели? discourse/script/bulk_import/phpbb_postgresql.rb at main · discourse/discourse · GitHub

Однако, я не думаю, что он использовался недавно, поэтому, вероятно, он сломан и может не работать с текущими версиями phpBB, так как изменился формат хранения Markdown.

:+1:

Какой бы путь вы ни выбрали, я бы не стал тратить слишком много времени на «полировку» вашего решения, если только вы этого действительно не хотите. Текущие скрипты импорта будут устаревшими в течение этого года…

2 лайка

Спасибо, я об этом не знал! И спасибо за предупреждение о том, что скрипты будут устаревать. Значит, вероятно, не стоит включать такую крупную функцию в основную ветку для тех, кто всё равно скоро откажется от них? Планируется ли какая-то замена для них?

1 лайк

Да, конечно, замена будет.

3 лайка

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

1 лайк

Вы ищете настройку сайта disable_emails

4 лайка

Хотя [b]text[/b] поддерживается встроено в Discourse, он не интерпретируется для блоков текста, содержащих переносы строк.

[b]Например, если у меня в посте есть такой текст…

И я продолжаю строку после пустой строки, я закрываю bbcode, и текст не будет преобразован в жирный[/b]

То же самое для [i] и, вероятно, других тегов.

Мне не удаётся найти чистое решение для этого в моём импорте. Есть какие-нибудь идеи? :man_shrugging:

2 лайка

Это не идеальное решение, но у меня есть идея для плана Б или хотя бы В.

После импорта можно заменить [b] на <b> и [/b] на </b>, так как <b> здесь работает на блочном уровне.

тест

test

<b>тест

test</b>

Но на крупном форуме это займёт время :confused:

3 лайка

Отличная идея!

Мой форум еще не импортирован, поэтому я всё ещё могу работать над импортером.

Разве использование тегов <strong> и <em> не имело бы больше смысла, несмотря на их семантическое «свойство»?

2 лайка

Отличные новости!

Я думаю, что стоит сначала попробовать именно это.

2 лайка