# Миграция форума myBB на Discourse с использованием Kubuntu в виртуальной машине

**URL:** https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051
**Category:** Migration
**Tags:** mybb
**Created:** [07.Апрель.2023 21:10:22 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051 "2023-04-07T21:10:22Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![silverdr](https://avatars.discourse-cdn.com/v4/letter/s/e19adc/32.png) [@silverdr](https://meta.discourse.org/u/silverdr)
#### Post date: [07.Апрель.2023 21:10:22 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/1 "2023-04-07T21:10:22Z")

</div>

После того как я потратил слишком много времени, мне казалось, что я почти добился успеха, но затем…

```plaintext
$ bundle exec ruby script/import_scripts/mybb.rb 
Загрузка существующих групп...
Загрузка существующих пользователей...
Загрузка существующих категорий...
Загрузка существующих постов...
Загрузка существующих тем...

создание пользователей
script/import_scripts/mybb.rb:96:in `block (3 levels) in import_users': undefined method `exists?' for File:Class (NoMethodError)

                  @uploader.create_avatar(newuser, filename) if File.exists?(filename)
                                                                    ^^^^^^^^
Возможно, вы имели в виду: exist?

```

Всё ещё безрезультатно ☹

---

<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: [07.Апрель.2023 21:16:28 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/2 "2023-04-07T21:16:28Z")

</div>

> [@silverdr](#):
>
> `undefined method `exists?'`

Если я правильно понимаю, этот метод был устаревшим, а затем удалён из текущих версий Ruby:

> <https://github.com/ruby/ruby/commit/bf97415c02b11a8949f715431aca9eeb6311add2>

Скрипт импорта следует обновить с учётом этого изменения.

* * *

Возможно, стоит попробовать заменить `exists` на `exist` без «s» здесь:

> <https://github.com/discourse/discourse/blob/main/script/import_scripts/mybb.rb#L96>

🙂

Документация Ruby: [https://ruby-doc.org/3.2.2/File.html#method-c-exist-3F](https://ruby-doc.org/3.2.2/File.html#method-c-exist-3F)

---

<div class="post-metadata">

### Author: ![silverdr](https://avatars.discourse-cdn.com/v4/letter/s/e19adc/32.png) [@silverdr](https://meta.discourse.org/u/silverdr)
#### Post date: [08.Апрель.2023 10:26:58 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/3 "2023-04-08T10:26:58Z")

</div>

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

---

<div class="post-metadata">

### Author: ![silverdr](https://avatars.discourse-cdn.com/v4/letter/s/e19adc/32.png) [@silverdr](https://meta.discourse.org/u/silverdr)
#### Post date: [08.Апрель.2023 11:04:27 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/4 "2023-04-08T11:04:27Z")

</div>

Хм…

```plaintext
$ bundle exec ruby script/import_scripts/mybb.rb
Загрузка существующих групп...
Загрузка существующих пользователей...
Загрузка существующих категорий...
Загрузка существующих постов...
Загрузка существующих тем...
/home/silverdr/sources/discourse/lib/site_setting_extension.rb:444:in `get': Настройка с именем 'email_domains_blacklist' не существует (Discourse::InvalidParameters)

```

---

<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: [08.Апрель.2023 11:48:21 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/5 "2023-04-08T11:48:21Z")

</div>

Новое имя можно найти в настройках сайта. Я думаю, это `email_domains_blocklist`

---

<div class="post-metadata">

### Author: ![silverdr](https://avatars.discourse-cdn.com/v4/letter/s/e19adc/32.png) [@silverdr](https://meta.discourse.org/u/silverdr)
#### Post date: [08.Апрель.2023 12:07:50 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/6 "2023-04-08T12:07:50Z")

</div>

Спасибо.

```plaintext
$ grep -R email_domains_blocklist ./

```

ничего не возвращает.

```plaintext
$ grep -R email_domains_blacklist ./
./script/import_scripts/base.rb: email_domains_blacklist: '',
./app/models/site_setting.rb: email_domains_blacklist: "blocked_email_domains",

```

возвращает то, что выше. Это означает, что скорее всего используется `blocked_email_domains`. С другой стороны, я заметил, что в предыдущих попытках я заменил оригинальный файл `script/import_scripts/base.rb` на версию из гиста, связанную выше пользователем @Paul_King:

> [@Migrate a MyBB forum to Discourse](https://meta.discourse.org/t/migrate-a-mybb-forum-to-discourse/130789/13):
>
> In case it helps anyone, the developer @rahilqf I engaged completed the project including translation of custom MyBB user fields into Discourse custom user fields (which depends on having the [multi-select-user-field plugin](https://github.com/procourse/discourse-multiselect-user-field) installed), MyBB post prefixes translated into Discourse tags, and stripping out of nearly all redundant MyCode tags from MyBB post text. His customized import script version is shared here - [Custom MyBB to Discourse Import Script](https://gist.github.com/rahilwazir/bc220385123f50062492be8908b067d6). He also successfully merged in a Yahoo Gro…

Я восстановил оригинальную версию, и на этот раз всё прошло успешно. Слишком хорошо, чтобы быть правдой. Я, должно быть, что-то упустил 😉 Сейчас разберусь.

---

<div class="post-metadata">

### Author: ![silverdr](https://avatars.discourse-cdn.com/v4/letter/s/e19adc/32.png) [@silverdr](https://meta.discourse.org/u/silverdr)
#### Post date: [10.Апрель.2023 12:35:20 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/7 "2023-04-10T12:35:20Z")

</div>

Подводя итог (гораздо более длинному, чем этот пост) 😉 путешествию:

ПРИМЕЧАНИЕ: Я использовал дистрибутив Kubuntu, запущенный в виртуальной машине, для выполнения этого процесса, поэтому имейте в виду, что на других ОС или даже дистрибутивах это может отличаться.

### 0. Установка окружения разработки Discourse

Следуйте [этому посту](https://meta.discourse.org/t/install-discourse-on-ubuntu-or-debian-for-development/14727) и запустите [этот скрипт](https://github.com/discourse/install-rails/blob/main/linux), на который есть ссылка в посте, используя

```plaintext
`bash <(wget -qO- https://raw.githubusercontent.com/discourse/install-rails/master/linux)` 

```

как описано там, плюс клонируйте исходный код

```plaintext
git clone https://github.com/discourse/discourse.git ~/discourse

```

### 1. Подготовка базы данных MySQL

Сделайте дамп исходной базы данных `mybb`, как описано в начале темы:

```plaintext
$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql

```

и скопируйте/переместите его в только что настроенную среду разработки.

Установите сервер MySQL

```plaintext
$ sudo apt-get install mysql-server

```

В более новых версиях изменилась аутентификация для MySQL. Если вы хотите быть root в MySQL, вам сейчас нужно быть root на хосте, поэтому используйте

```plaintext
$ sudo mysql

```

вместо

```plaintext
$ mysql -u root

```

Конечно, сначала вы должны быть «sudoer» (администратором)

```plaintext
$ sudo mysql
mysql> CREATE DATABASE mybb;
mysql> SHOW DATABASES;
mysql> CREATE USER 'nonrootuser'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON mybb.* TO 'nonrootuser'@'localhost';
mysql> quit
$ mysql -unonrootuser -ppassword mybb < mybb_dump.sql
<здесь вы получите предупреждение о том, что указание пароля в командной строке — не самая умная идея>

$ sudo mysql
mysql> USE mybb;
mysql> SHOW TABLES;
<здесь проверьте, все ли таблицы присутствуют — см. исходный пост>

mysql> quit

```

### 2. Установка Ruby gems

Проверка файла `Gemfile` в текущих исходных кодах показывает, что

```plaintext
$ echo "gem 'mysql2', require: false" >> Gemfile

```

на самом деле не нужна. Достаточно установить переменную окружения `IMPORT` в значение `1`.  
Однако необходимы файлы разработки для клиентов MySQL, что и делает первая строка ниже

```plaintext
$ sudo apt-get install libmysqlclient-dev
$ cd ~/discourse
$ IMPORT=1 bundle install

```

### 2. Подготовка Discourse (база данных PostgreSQL)

```plaintext
$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ export DB_PW="password"
$ export DB_USER="nonrootuser"

```

### 3. Выполнение самого импорта

Следующая строка исправляет давно устаревший и на данный момент уже удаленный вызов метода в скрипте импорта `mybb.rb`, который всё ещё присутствует на момент написания и не изменит ничего, если это уже исправлено

```plaintext
$ sed -i.original 's/File.exists?/File.exist?/' script/import_scripts/mybb.rb

```

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

```plaintext
$ ps -aux |grep redis
silverdr 2808 0.3 0.3 89972 14512 ? Ssl 05:25 2:04 redis-server *:6379
[…]

```

Если вы не видите ничего похожего на строку выше, выполните

```plaintext
$ redis-server --daemonize yes

```

это та же самая команда, которую использовал вышеупомянутый скрипт установки Rails при первой установке.

Наконец 🙏 и

```plaintext
$ IMPORT=1 bundle exec ruby script/import_scripts/mybb.rb

```

Если на этом этапе скрипт не остановился с YAE (Yet Another Error), то пора открыть эту бутылку 🍾

#### Осталось несколько вещей

- ОК — очевидно, что отсутствует одна важная часть: пароли пользователей. Видимо, хотя оба приложения хранят хеши с солью, судя по длине этих хешей, “mybb” использует более старый алгоритм хеширования. Поэтому это понятно и не является критической проблемой. Каждый сможет сбросить свой пароль при первом входе.
- Некоторые элементы BB-кода не конвертируются. У меня, например, проблема с блоками кода, вокруг которых есть теги, устанавливающие моноширинный шрифт Courier и прочее. У меня больше нет сил пытаться автоматизировать это дальше. Если вам удастся что-то сделать с этим, пожалуйста, дайте знать мне / нам здесь! 🙇‍♂️

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [24.Май.2023 11:56:22 UTC](https://meta.discourse.org/t/migrating-a-mybb-forum-to-discourse-using-kubuntu-in-a-vm/266051/8 "2023-05-24T11:56:22Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
