KubuntuのVMでmyBBフォーラムをDiscourseに移行する

何時間も費やした挙句、あと少しだと思ったのですが…

$ 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)
                                                                    ^^^^^^^
Did you mean?  exist?

まだうまくいきません :frowning:

「いいね!」 1

私の理解が正しければ、このメソッドは非推奨となり、現在のバージョンのRubyからは削除されたようです。

インポートスクリプトはこの変更を反映するように更新する必要があります。


おそらく、ここで exists を “s” なしの exist に置き換えることを試してみてください。

:slight_smile:

Rubyドキュメント: https://ruby-doc.org/3.2.2/File.html#method-c-exist-3F

「いいね!」 1

ああ、それはそれ以前からずっと非推奨になっていました。関連する箇所をgrepで見つけて変更しようと思いますが、この長くて今のところあまり報われない作業から休憩する必要があります :wink:

ええと…

$ bundle exec ruby script/import_scripts/mybb.rb
既存のグループを読み込んでいます…
既存のユーザーを読み込んでいます…
既存のカテゴリを読み込んでいます…
既存の投稿を読み込んでいます…
既存のトピックを読み込んでいます…
/home/silverdr/sources/discourse/lib/site_setting_extension.rb:444:in `get': No setting named 'email_domains_blacklist' exists (Discourse::InvalidParameters)

サイト設定で新しい名前を見つけることができます。email_domains_blocklist だと思います。

ありがとうございます。

$ grep -R email_domains_blocklist ./\n```
は何も返しません。

$ grep -R email_domains_blacklist ./\n./script/import_scripts/base.rb: email_domains_blacklist: ‘’,\n./app/models/site_setting.rb: email_domains_blacklist: "blocked_email_domains",\n```
は上記のように返します。これは、おそらく blocked_email_domains であることを意味します。一方で、以前の試みで、@Paul_King が上記でリンクしたgistベースのスクリプトで元の script/import_scripts/base.rb を置き換えたことに気づきました。

元のスクリプトを元に戻したところ、今回は正常に完了したようです。あまりにも順調すぎて信じられません。何か見落としがあったはずです :wink: 今から調べてみます。

「いいね!」 2

旅のまとめ(この投稿よりもずっと長いです ;-)):

注:プロセス中に仮想マシンでKubuntuディストリビューションを使用したため、OSやディストリビューションが異なると同じではない可能性があることに注意してください。

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の認証が変更されました。現在、MySQLのrootになるには、ホストで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 gemのインストール

現在のソースのGemfileを確認すると、

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

は実際には必要ないことがわかります。環境変数IMPORT1に設定するだけで十分です。
ただし、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のインストールスクリプトはRedisを起動しますが、永続的なサービスとして有効にしないため、再起動やクラッシュなどでは持続しません。

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

残りのいくつかのこと

  • OK - ユーザーのパスワードが明らかに欠けています。両方のアプリケーションがハッシュとソルトを保存しているにもかかわらず、ハッシュの長さから判断すると、「mybb」は古いハッシュアルゴリズムを使用しているようです。したがって、これは理解可能であり、問題にはなりません。誰もが最初にパスワードをリセットできるはずです。
  • 一部のbbcodeが変換されません。例えば、コードブロックには、モノスペースのCourierフォントなどを設定するタグが付いています。これ以上自動化を試みる気力はありません。もし何か解決策を見つけたら、ここにいる私たちに知らせてください!:man_bowing:
「いいね!」 2

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