Migrate a vBulletin 4 forum to Discourse

Нет бюджета на это. Но, может быть.

2 лайка

Кто-нибудь сталкивался с этой проблемой при запуске скрипта импорта?

Обработка постов…
37785 / 48843 (77,4%) Завершено принудительно*

Процесс был прерван до завершения. При загрузке Форумов импортированные сообщения вроде бы есть, но я беспокоюсь, что процесс не завершился корректно, и это может вызвать проблемы.

Есть какие-либо рекомендации? Возможно, ошибка нехватки памяти? Можно ли просто перезапустить скрипт, чтобы продолжить с того места, где он остановился, или он попытается повторно импортировать дублирующиеся данные? Спасибо.

Запустите скрипт повторно. Это не приведет к дублированию данных.

3 лайка

Спасибо, @pfaffman! Это сработало отлично.

4 лайка

Привет,
Прежде всего, спасибо за этот замечательный гайд. Я ценю проделанную работу.

Что касается моей проблемы:
У меня возникают трудности с подключением к базе данных при запуске скрипта импорта, хотя я использую MariaDB для хранения дампa vBulletin вместо MySQL. Я проверил, что MariaDB запущена, смог импортировать дамп vBulletin в неё, и перепроверил имя пользователя, хост и пароль в скрипте четыре раза, но всё безрезультатно.

Чувствую, что упускаю что-то очевидное. Если кто-то сможет подсказать, в каком направлении двигаться, это было бы очень полезно.

Я использую следующие версии:

mysql2 0.5.2
mariadb-server-10.3
discourse master, коммит git cb8fa46

Полное описание ниже.

При попытке запустить

apt-get update && apt-get install libmysqlclient-dev mysql-server-5.7

я получаю ошибку:

E: Package 'libmysqlclient-dev' has no installation candidate
E: Package 'mysql-server-5.7' has no installation candidate

что логично, возможно, эти пакеты были удалены из репозитория за это время.

Поэтому я запускаю вместо этого:

apt-get update && apt-get install mariadb-server-10.3 libmariadbd-dev

MariaDB работает как прямая замена, что приятно, так как все шаги выполняются до тех пор, пока я не попробую запустить скрипт миграции, после чего получаю ошибку:

root@discourse:/src# su discourse -c 'bundle exec ruby script/import_scripts/vbulletin.rb'
root:@localhost wants vb4
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
==================================================
Access denied for user 'root'@'localhost'
Cannot connect in to database.

Hostname: localhost
Username: root
Password: 
database: vb4

Edit the script or set these environment variables:

export DB_HOST="localhost"
export DB_NAME="vbulletin"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="vb_"
export ATTACHMENT_DIR '/path/to/your/attachment/folder'

Exiting.

По поводу прав доступа:

root@discourse:/src# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 59
Server version: 10.3.17-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                      |
+------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                  |
+------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

Я многократно перепроверил имя пользователя и пароль и даже установил их вручную.

2 лайка

Я провел дополнительное расследование и выяснил, что смена базового образа с Ubuntu 16.04 на Debian, безусловно, является причиной того, что MySQL больше недоступна. Однако меня по-прежнему сбивает с толку вопрос о том, как заставить mysql2 подключаться к MariaDB.

Некоторое время назад я отправил PR, в котором mysql-dep.template.yml использует MariaDB. Я использовал его несколько раз.

Похоже, вы пытаетесь не использовать пароль? Я рекомендую использовать пароль. Скрипт предполагает наличие пароля.

2 лайка

Понял. Попробую установить пароль и посмотрю, сработает ли это. Насколько я понимаю, скрипт импорта всё ещё должен работать с MariaDB. Если так, я продолжу устранение неполадок. Спасибо за быструю помощь!

@pfaffman Вот оно! Большое спасибо. Как только я приведу свой форум в порядок, я смогу отправить pull-запрос с версией для VB3, на случай если она кому-нибудь пригодится.

Это также мой тестовый экземпляр, поэтому я не против опубликовать детали — он всё равно будет удалён :slight_smile:

3 лайка

Спасибо всем за помощь, миграция прошла в основном успешно. Пару вложений где-то потерялось, но в целом всё прошло отлично.

Для тех, кто будет читать это в будущем: я мигрировал с Vb3.8.7.

Мне пришлось внести некоторые правки в SQL-запрос в vbulletin.rb, так как структура моей базы данных не совсем совпадала со скриптом, хотя была довольно близка. Я решил отказаться от пользовательских подписей, чтобы ускорить процесс.

Diff на Github: File fix other by canyon289 · Pull Request #1 · canyon289/discourse · GitHub

Для установки MariaDB, заменяющей MySQL, я использовал следующую команду:

apt-get update && apt-get install mariadb-server-10.3 libmariadbd-dev

А чтобы изменить пароль MariaDB с пустого на значение, эта ссылка оказалась наиболее полной:

Ещё раз не могу выразить достаточно благодарности людям в этой теме и всем контрибьюторам Discourse за код и помощь!

5 лайков

Я только что завершил миграцию, и все 2000+ тем получили категорию, унаследованную от экземпляра vBulletin 4. Система не позволяет мне удалить эту категорию и вернуть все эти перенесённые посты в состояние «без выбранной категории». Появляется сообщение: «Невозможно удалить эту категорию, так как в ней содержится 2322 темы».

Есть ли какое-либо обходное решение?

Либо выполните повторную миграцию, либо измените категорию этих тем. При таком количестве вам придется сделать это через командную строку Ruby.

1 лайк

Привет,

Не уверен насчет контекста этого.

Скопируйте вложения в ваш экземпляр Discourse (для пути проверьте настройки VB4).

Может, кто-нибудь поможет?

Здравствуйте,

Я заметил, что существует скрипт для vBulletin 5, однако не могу найти никаких отзывов о нём. Применима ли информация из этой темы и к нему?

Спасибо!

1 лайк

Скрипт должен работать очень похоже.

1 лайк

Запускаю импорт для установки vB4, но он падает при импорте дочерних категорий. Потерпите, я новичок в Rails/Ruby.

    Traceback (most recent call last):
        20: from script/import_scripts/vbulletin.rb:943:in `<main>'
        19: from /home/vagrant/discourse/script/import_scripts/base.rb:47:in `perform'
        18: from script/import_scripts/vbulletin.rb:84:in `execute'
        17: from script/import_scripts/vbulletin.rb:293:in `import_categories'
        16: from /home/vagrant/discourse/script/import_scripts/base.rb:403:in `create_categories'
        15: from /home/vagrant/discourse/script/import_scripts/base.rb:403:in `each'
        14: from /home/vagrant/discourse/script/import_scripts/base.rb:422:in `block in create_categories'
        13: from /home/vagrant/discourse/script/import_scripts/base.rb:454:in `create_category'
        12: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/suppressor.rb:48:in `save!'
        11: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:319:in `save!'
        10: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
         9: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:212:in `transaction'
         8: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `transaction'
         7: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:278:in `within_new_transaction'
         6: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
         5: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:280:in `block in within_new_transaction'
         4: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:281:in `block in transaction'
         3: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
         2: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/transactions.rb:319:in `block in save!'
         1: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/validations.rb:53:in `save!'
/home/vagrant/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/validations.rb:81:in `raise_validation_error': Validation failed: Slug is invalid (ActiveRecord::RecordInvalid)

Я добавил вывод отладочной информации для диагностики. Значение slug в категории равно nil.

Категория кажется валидной, когда цикл проходит через create_categories(children_categories) do |category|. Я также вывожу в лог opts, import_id и new_category (непосредственно перед .save!) из def create_category в base.rb. Всё, кажется, валидно согласно ожиданиям функций.

Сталкивался ли кто-нибудь с этим раньше?

       37 / 53 ( 69.8%)  [345139 items/min]
category:
{"forumid"=>355, "title"=>"News", "description"=>"RSS Feed", "displayorder"=>6, "parentid"=>205}

Entering create_category...
opts:
{:id=>355, :name=>"News", :position=>6, :description=>"RSS Feed", :parent_category_id=>6}
import_id:
355

new_category:
#<Category id: nil, name: "News", color: "BF1E2E", topic_id: nil, topic_count: 0, created_at: nil, updated_at: nil, user_id: -1, topics_year: 0, topics_month: 0, topics_week: 0, slug: nil, description: nil, text_color: "FFF", read_restricted: false, auto_close_hours: nil, post_count: 0, latest_post_id: nil, latest_topic_id: nil, position: 6, parent_category_id: 6, posts_year: 0, posts_month: 0, posts_week: 0, email_in: nil, email_in_allow_strangers: false, topics_day: 0, posts_day: 0, allow_badges: true, name_lower: nil, auto_close_based_on_last_post: false, topic_template: nil, contains_messages: nil, sort_order: nil, sort_ascending: nil, uploaded_logo_id: nil, uploaded_background_id: nil, topic_featured_link_allowed: true, all_topics_wiki: false, show_subcategory_list: false, num_featured_topics: 3, default_view: nil, subcategory_list_style: "rows_with_featured_topics", default_top_period: "all", mailinglist_mirror: false, minimum_required_tags: 0, navigate_to_first_post_after_read: false, search_priority: 0, allow_global_tags: false, reviewable_by_group_id: nil, required_tag_group_id: nil, min_tags_from_required_group: 1>
    Traceback (most recent call last):
2 лайка

Наш разработчик попробовал запустить скрипт, но не смог продвинуться далеко. Есть ли кто-то, кто заинтересован в выполнении этой работы для нас на консультационной основе?

2 лайка

Конечно, отправьте мне личное сообщение.

2 лайка

Прошу прощения за мою неосведомленность, но как мне отправить личное сообщение? Я не нашел это очевидным. Или вы можете написать мне напрямую по адресу: abboud at cedrus dot com.

Вопрос об импорте: некоторые сообщения на нашем форуме, работающем на vBulletin, содержат ссылки на другие сообщения в том же форуме. Преобразуются ли эти ссылки при импорте? Если нет, что с ними происходит? Они удаляются?

1 лайк

Я не помню, переписывает ли текущая версия их. Скрипт, который у меня есть (который я планирую отправить в виде PR), исправляет их.

2 лайка