# Migrate a phpBB3 forum to Discourse

**URL:** https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810
**Category:** Migrating to Discourse
**Tags:** how-to
**Created:** [05.Июль.2015 22:02:57 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810 "2015-07-05T22:02:57Z")
**Posts on this page:** 20
**Page:** 17

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [22.Декабрь.2021 02:35:26 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/647 "2021-12-22T02:35:26Z")

</div>

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

> [@Canapin](#):
>
> Не знаю, типичны ли мои проблемы при импорте в phpBB или они очень специфичны для моего случая.

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

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [22.Декабрь.2021 12:57:50 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/648 "2021-12-22T12:57:50Z")

</div>

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

* * *

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

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [22.Декабрь.2021 17:48:50 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/649 "2021-12-22T17:48:50Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [01.Январь.2022 14:01:48 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/650 "2022-01-01T14:01:48Z")

</div>

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

```plaintext
   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».

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

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

```

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [03.Январь.2022 14:33:56 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/651 "2022-01-03T14:33:56Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [03.Январь.2022 22:41:14 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/652 "2022-01-03T22:41:14Z")

</div>

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

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

* * *

> [@gerhard](#):
>
> Также небольшой тизер: мы работаем над решением, которое сделает все импорты — не только для phpBB — гораздо лучше, быстрее, проще в настройке и избавит от назойливых проблем с конвертацией BBCode… 😉

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

---

<div class="post-metadata">

### Author: ![Sebastien\_Guilbaud](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sebastien_guilbaud/32/218699_2.png) [@Sebastien\_Guilbaud](https://meta.discourse.org/u/Sebastien_Guilbaud)
#### Post date: [13.Январь.2022 07:15:37 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/653 "2022-01-13T07:15:37Z")

</div>

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

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

```plaintext
Не удалось сопоставить сообщение с 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?

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [13.Январь.2022 19:39:51 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/654 "2022-01-13T19:39:51Z")

</div>

> [@Canapin](#):
>
> Думаю, сейчас много сказать нельзя, но есть ли какие-то подсказки, как это будет работать, и когда появятся рабочие скрипты импорта, использующие эту новую функцию?

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [13.Январь.2022 19:40:04 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/655 "2022-01-13T19:40:04Z")

</div>

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

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

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

> <https://github.com/discourse/discourse/blob/f82f0e11798fea1130c91a3958a26dd52453e3f7/script/import_scripts/phpbb3/database/database_3_0.rb#L115-L129>

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

---

<div class="post-metadata">

### Author: ![Sebastien\_Guilbaud](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sebastien_guilbaud/32/218699_2.png) [@Sebastien\_Guilbaud](https://meta.discourse.org/u/Sebastien_Guilbaud)
#### Post date: [14.Январь.2022 09:03:34 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/656 "2022-01-14T09:03:34Z")

</div>

> [@gerhard](#):
>
> Хм, разве в этом опросе так много анонимных голосов?

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

> [@gerhard](#):
>
> Вам нужно будет повозиться с этим SQL-запросом:

С помощью

```plaintext
 SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';

```

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

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

---

<div class="post-metadata">

### Author: ![ePirat](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/epirat/32/246560_2.png) [@ePirat](https://meta.discourse.org/u/ePirat)
#### Post date: [17.Январь.2022 20:04:21 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/657 "2022-01-17T20:04:21Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [17.Январь.2022 20:16:16 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/658 "2022-01-17T20:16:16Z")

</div>

Существует скрипт массового импорта для phpBB, работающий с PostgreSQL. Вы его видели? [discourse/script/bulk\_import/phpbb\_postgresql.rb at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/main/script/bulk_import/phpbb_postgresql.rb)

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

> [@ePirat](#):
>
> Насколько я понимаю, это в основном вопрос добавления правильных SQL-запросов для схемы PostgreSQL с использованием подходящего адаптера базы данных.

👍

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

---

<div class="post-metadata">

### Author: ![ePirat](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/epirat/32/246560_2.png) [@ePirat](https://meta.discourse.org/u/ePirat)
#### Post date: [17.Январь.2022 20:20:16 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/659 "2022-01-17T20:20:16Z")

</div>

> [@gerhard](#):
>
> Существует скрипт массового импорта для phpBB, работающий на PostgreSQL. Вы его видели? [discourse/phpbb\_postgresql.rb at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/main/script/bulk_import/phpbb_postgresql.rb)

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [17.Январь.2022 20:23:07 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/660 "2022-01-17T20:23:07Z")

</div>

> [@ePirat](#):
>
> Планируется ли для них замена?

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

---

<div class="post-metadata">

### Author: ![ePirat](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/epirat/32/246560_2.png) [@ePirat](https://meta.discourse.org/u/ePirat)
#### Post date: [17.Январь.2022 20:30:04 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/661 "2022-01-17T20:30:04Z")

</div>

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

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [17.Январь.2022 20:32:02 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/662 "2022-01-17T20:32:02Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [27.Январь.2022 15:56:51 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/663 "2022-01-27T15:56:51Z")

</div>

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

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

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

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

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

---

<div class="post-metadata">

### Author: ![Steven](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/steven/32/187890_2.png) [@Steven](https://meta.discourse.org/u/Steven)
#### Post date: [27.Январь.2022 16:11:10 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/664 "2022-01-27T16:11:10Z")

</div>

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

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

**тест**

 

**test**

```plaintext
<b>тест

test</b>

```

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [27.Январь.2022 16:25:49 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/665 "2022-01-27T16:25:49Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [27.Январь.2022 16:44:56 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/666 "2022-01-27T16:44:56Z")

</div>

> [@Canapin](#):
>
> Мой форум ещё не импортирован, поэтому я всё ещё могу работать над импортером.

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

> [@Canapin](#):
>
> Разве использование `<strong>` и `<em>` не имело бы больше смысла, несмотря на их семантическое «свойство»?

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

[Предыдущая страница](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810.md?page=16)

[Следующая страница](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810.md?page=18)
