Хорошо, давайте быстро подытожим.
Я занимаюсь добровольной миграцией форума, который сейчас работает на vBulletin 3.
Начинаем с дампа базы данных (20 ГБ, вы не ослышались) в тестовой среде.
Выполнил обновление до vBulletin 5. Заняло 5–6 часов, но процесс завершился успешно. Версия — vBulletin 5.4.
Произвёл чистку имён пользователей, чтобы они соответствовали требованиям Discourse.
Затем установил Discourse в Docker и в общих чертах последовал этому руководству для подготовки. Под «в общих чертах» имеется в виду, что большая часть информации была избыточной или устаревшей, но это помогло сориентироваться в дальнейших действиях.
Сейчас я на этапе, где буквально перестаю видеть от усталости, так как у меня почти нет опыта программирования на Ruby.
Итак, после завершения установки я зашёл в контейнер командой ./launcher enter app, затем:
- Установил пакеты
freetds-devиlibmariadb-dev. - Отредактировал файл
Gemfile, добавив gemphp_serialize. - Из командной строки выполнил
export IMPORT=1, чтобы настроить среду для импорта. - От имени пользователя
discourseвыполнилbundle install --no-deployment --without test --without development --path vendor/bundle.
Получил ошибку:
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.
If this is a development machine, remove the /var/www/discourse/Gemfile freeze
by running `bundle config unset deployment`.
The list of sources changed
The dependencies in your gemfile changed
You have added to the Gemfile:
* mysql2
* redcarpet
* php_serialize
* sqlite3 (~> 1.3, >= 1.3.13)
* ruby-bbcode-to-md
* reverse_markdown
* tiny_tds
* csv
* parallel
Поэтому продолжил:
- Выполнил
bundle config unset deploymentи снова запустил предыдущую команду. - Проверил, что пакеты
mysql2иphp_serializeприсутствуют (они были). - Добавил аватары со старого форума (вложений импортировать не нужно) и назначил владельца директорий пользователю
discourseв его домашней папке/home/discourse. - Отредактировал файл
script/import_scripts/vbulletin5.rb, изменив параметры подключения к базе данных. - От имени пользователя
discourseвыполнилbundle exec ruby script/import_scripts/vbulletin5.rb.
Это вернуло ошибку о том, что tzinfo не поддерживает целочисленные значения, о которой упоминается здесь на этом же форуме Discourse.
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [2294 items/min] ]
importing users
Traceback (most recent call last):
15: from script/import_scripts/vbulletin5.rb:726:in `<main>'
14: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
13: from script/import_scripts/vbulletin5.rb:46:in `execute'
12: from script/import_scripts/vbulletin5.rb:79:in `import_users'
11: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
10: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
9: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
8: from script/import_scripts/vbulletin5.rb:98:in `block in import_users'
7: from /var/www/discourse/script/import_scripts/base.rb:264:in `create_users'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
4: from /var/www/discourse/script/import_scripts/base.rb:265:in `block in create_users'
3: from script/import_scripts/vbulletin5.rb:110:in `block (2 levels) in import_users'
2: from script/import_scripts/vbulletin5.rb:718:in `parse_timestamp'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timezone.rb:575:in `utc_to_local'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.5/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)
Предложение от @Haddoq заключалось в том, чтобы изменить строку с Time.zone.at(@tz.utc_to_local(timestamp)) на Time.zone.at(timestamp).
Также было рекомендовано добавить поле lastvisit в запрос к пользователям, иначе возникнет ещё одна ошибка, что я и сделал.
Однако теперь, когда я запускаю миграцию командой bundle exec ruby script/import_scripts/vbulletin5.rb, получаю следующее:
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing groups...
41 / 41 (100.0%) [120217 items/min]
importing users
Traceback (most recent call last):
13: from script/import_scripts/vbulletin5.rb:727:in `<main>'
12: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
11: from script/import_scripts/vbulletin5.rb:46:in `execute'
10: from script/import_scripts/vbulletin5.rb:79:in `import_users'
9: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
8: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
7: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
6: from script/import_scripts/vbulletin5.rb:80:in `block in import_users'
5: from script/import_scripts/vbulletin5.rb:723:in `mysql_query'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:22:in `query'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `query'
2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `handle_interrupt'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `block in query'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `_query': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CASE WHEN u.scheme='blowfish:10' THEN token (Mysql2::Error)
WHEN u.scheme='lega' at line 2
На данный момент я немного растерян. Кто-нибудь может помочь?

