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

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

$ 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?

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

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

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


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

:slight_smile:

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

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

Хм…

$ 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)

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

Спасибо.

$ grep -R email_domains_blocklist ./

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

$ 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:

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

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

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

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

Следуйте этому посту и запустите этот скрипт, на который есть ссылка в посте, используя

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

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

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

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

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

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

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

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

$ sudo apt-get install mysql-server

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

$ sudo mysql

вместо

$ mysql -u root

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

$ 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 в текущих исходных кодах показывает, что

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

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

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

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

$ 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, который всё ещё присутствует на момент написания и не изменит ничего, если это уже исправлено

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

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

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

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

$ redis-server --daemonize yes

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

Наконец :pray: и

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

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

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

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