Если у вас есть старый форум Phorum и вы планируете миграцию на Discourse, то этот урок для вас. Процесс прост, и мы будем использовать официальный скрипт импорта Phorum. Давайте начнём.
На высоком уровне мы выполним следующие шаги:
- Подготовка локальной среды разработки.
- Экспорт базы данных из рабочей среды.
- Импорт рабочей базы данных в локальный экземпляр Discourse.
- Запуск скрипта импорта Phorum.
Что можно мигрировать
- Категории
- Все форумы и папки => Корневая категория
- Темы и сообщения
- Пользователи (со следующими атрибутами)
- статус блокировки
- имя пользователя
- настоящее имя => имя
- электронная почта
- статус администратора
- дата добавления
- время последнего присутствия
Подготовка локальной среды разработки
Следуйте одному из этих руководств для установки самого Discourse и обратитесь к этому руководству, если возникнут проблемы.
Установите сервер базы данных MySQL;
Ubuntu 18.04:
$ sudo apt update
$ sudo apt install mysql-server -y
После завершения установки MySQL проверьте его состояние:
$ systemctl status mysql.service
Если он не запущен, выполните следующее:
$ sudo systemctl start mysql
MacOS:
$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
Проверьте состояние служб:
$ brew services list
Вы должны увидеть что-то вроде этого:
...
mysql@5.7 started
...
В противном случае выполните следующее и проверьте снова:
$ brew services start mysql@5.7
Для Windows вы можете следовать официальному руководству по установке.
Эта среда будет нашим сервером Discourse.
Экспорт базы данных из рабочей среды:
Экспортируйте рабочую базу данных (с рабочего сервера Phorum):
$ mysqldump -u USER_NAME -p DATABASE_NAME > phorum_dump.sql
Скопируйте дамп базы данных на сервер Discourse.
Используйте
scpилиrsyncдля копирования базы данных. И, конечно, вы можете сначала сжать её в gzip.
Импорт рабочей базы данных на сервер Discourse
На сервере Discourse создайте базу данных:
$ mysql -u root
Если у вашего пользователя базы данных есть пароль, используйте:
mysql -u root -p, а затем введите пароль.
mysql> CREATE DATABASE phorum;
Убедитесь, что база данных создана:
mysql> SHOW DATABASES;
Вы должны увидеть что-то вроде этого:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| phorum |
| sys |
+--------------------+
5 rows in set (0.04 sec)
Это пустая база данных. Наш следующий шаг — импортировать в неё рабочую базу данных.
$ mysql -u root phorum < phorum_dump.sql
Пока мы здесь, давайте получим префикс таблиц. Он понадобится нам позже:
$ mysql -u root
mysql> USE phorum;
mysql> SHOW TABLES;
Вы увидите что-то вроде этого:
+---------------------------+
| Tables_in_phorum |
+---------------------------+
| pw_banlists |
| pw_files |
| pw_forum_group_xref |
| pw_forums |
| pw_groups |
| pw_messages |
| pw_messages_edittrack |
| pw_pm_buddies |
| pw_pm_folders |
| pw_pm_messages |
| pw_pm_xref |
| pw_search |
| pw_settings |
| pw_subscribers |
| pw_user_custom_fields |
| pw_user_group_xref |
| pw_user_newflags |
| pw_user_permissions |
| pw_users |
+---------------------------+
19 rows in set (0.00 sec)
Из вывода выше видно, что префикс — pw_.
Запуск скрипта импорта Phorum
Сначала установите зависимости импортера:
$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install
Теперь настройте скрипт под наши требования. В нашем примере это будет выглядеть так:
PHORUM_DB = "phorum"
TABLE_PREFIX = "pw_"
BATCH_SIZE = 1000
# ...
host: "localhost",
username: "root",
password: "", # Измените это, если у вас есть пароль для базы данных MySQL
database: PHORUM_DB
Если вы хотите создать перенаправление URL, раскомментируйте следующее:
# categories.each do |category|
# Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
# end
#...
# results.each do |post|
# if post['parent_id'] == 0
# topic = topic_lookup_from_imported_post_id(post['id'].to_i)
# Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
# end
# end
Это будет выглядеть так:
categories.each do |category|
Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
end
#...
results.each do |post|
if post['parent_id'] == 0
topic = topic_lookup_from_imported_post_id(post['id'].to_i)
Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
end
end
Запустите импортер с чистым экземпляром Discourse:
bundle exec rake db:drop db:create db:migrate
bundle exec ruby script/import_scripts/phorum.rb
Импортер подключится к серверу MySQL и выполнит миграцию нашей базы данных Phorum в базу данных Discourse.
Запустите сервер Discourse после завершения импорта:
$ bundle exec rails server
Запустите Sidekiq для обработки мигрированных данных:
$ bundle exec sidekiq
Вы можете отслеживать прогресс Sidekiq по адресу
http://localhost:3000/sidekiq/queues.
Настройте ваш производственный сервер Discourse, следуя этому уроку.
Выполните резервное копирование базы данных Discourse и загрузите её на ваш производственный сервер Discourse, следуя этому уроку.
Готово ![]()