Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc)

このガイドとインポートスクリプトを提供していただきありがとうございます!GoogleグループでGoogle Takeoutを使用して正常に動作しました。.mboxファイルを正しいディレクトリに配置し、スクリプトを実行しただけです。

.mboxに含まれていない親を持つメールのインポートについて質問がありました。たとえば、グループに送信されなかったメールのFWDから開始されたスレッドや、会話の途中でグループを返信リストに追加してループインした多くのスレッドがあります。

現在、インポートすると、これらの以前のメールが存在しないように見えます。メールアイコンをクリックしてHTMLを表示すると、それらを見つけることができます。他の誰かが同じ状況に遭遇し、解決策を持っているかどうか疑問に思っていました。投稿に以前のメールチェーンを含めるか、それを解析してメッセージを抽出してすべて追加しようとすることを想像できました。

「いいね!」 1

引用されたテキストからそれらのメッセージを生成し、インポートスクリプトを実行する前にmboxファイルに追加(おそらくIdヘッダー付き)する方法を見つける必要があります。

「いいね!」 1

これは本当に素晴らしいです。しかし、Discourseにインポートされた一部のメールについて、最初のメールと、フォーマットされていないmbox形式の返信が同じ投稿に表示されるという問題があります。何が原因なのかよくわかりません。

質問ですが、ターゲットのDiscourseインスタンスを削除して再作成せずに、インポートされたすべてのメール(20年分)を削除するにはどうすればよいですか?

推奨RAM要件は8GBであることは承知しています。2GBの仮想マシンで20年分の投稿をインポートしようとしましたが、しばらく実行された後、「killed」というメッセージが表示されてクラッシュしました。DigitalOceanなどのホスティングプロバイダーの8GBマシンは(私にとっては)高価です。より少ないメモリでこれを実行する方法はありますか?おそらく、より小さなバッチでインポートしますか?

それらのカテゴリを削除してから、関連するトピックカスタムフィールドを削除してみてはどうでしょうか。

いや、小規模なマシンではインポートはあまりできないと思います。デスクトップで試すことはできますが、データベースをインターネットに戻すための帯域幅の問題が発生します。

「いいね!」 1

このスレッドのアクティビティはあまり多くないことは承知していますが、正常に動作させることができません。インポートする mbox 形式のメールの多くは正しく分割されていません。From の行は次のようになります。

From MAILER-DAEMON Tue Nov 01 05:57:09 2022

しかし、一部のメッセージは正しくインポートされ、同じ本文内に典型的な From 行で始まる生の mbox 形式のアイテムがあります。つまり、分割されていません。分割を行う正規表現を変更する必要があるようには見えませんし、Ruby もわからないため、インポートスクリプトをデバッグできません。

これからどうすればよいかわかりません。インポートするメッセージは 20 年分あるため、手作業で修正することはできません。要するに、このスクリプトは私には機能していません。なぜ私だけがこのような状況になるのでしょうか?

あなただけではありません。私の最初の有料ディスコースの仕事は、数ヶ月かけて古いmboxファイルをクリーンアップすることでした。そのファイルは、なぜか手編集されていたのですが、その理由は思い出せません。

正規表現をいじるか、あるいは不正なメッセージを修正する他の方法を見つける必要があるようです。一つの方法は、メッセージをファイルごとに分割するために他のツールを使用することです。

ちなみに、私はRubyを知る前にいくつかのインポートスクリプトを書きました。

すべてのインポートはユニークです。20年分のデータがあれば、使用されていたさまざまなシステムで物事が変化したため、いくつかの異なる問題が発生する可能性が高いでしょう。

「いいね!」 2

まったくその通りです。間違いありません。

メールマン2システムから20年分のメッセージをアーカイブディレクトリにインポートしたいのですが、ユーザーID(ステージングされたものさえも)を作成したくありません。多くの購読者が引っ越したり亡くなったりしており、スペースを占めるだけの多くのアカウントが作成されてしまうからです。

それらをすべて同じユーザーID(たとえば「archive」)の下にインポートできますか?

そして、これは愚かな質問かもしれませんが、インポートプロセス中にアプリがオフになっているため、新しい投稿に関するメールの購読者が、ロードされたばかりのすべてのアーカイブに関するメールで溢れることはないということでしょうか?

import_users 関数をコメントアウトすると、すべてのメッセージがシステムによって所有されるようになります。

それほど多くのスペースは節約できません。

パスワードリセットプロセスを使用してアカウントにログインするまで、ユーザーはメールを受信しません。既存のコミュニティにこれらのデータをインポートする場合、インポートスクリプトによって作成された新しいメッセージに関する通知がユーザーに届くと思います。

「いいね!」 1

ありがとうございます。インポートスクリプトを確認したところ、新規ユーザーセクションを無効にできるのではないかと思いました。それをテストすることが私のリストにあります。

ファイルスペースではなく、使用されない可能性のある数百のステージング済みユーザーアカウントを抱えることになるため、むしろヘッドスペース、または非常に長いユーザーリストのようなものです。

ユーザーのことはわかっていると思いますが、20年分のメッセージを誰が投稿したかわからないよりは、誰も使わないアカウントがあった方がずっと良いでしょう。

「いいね!」 3

それはもっともな点ですね、ジェイ。

import_mbox.sh ファイルが見つからず、mbox.rb スクリプトを直接実行しようとすると、多くの Ruby エラーが発生します。

root@lists-import:/var/www/discourse/script/import_scripts# ruby mbox.rb mbox
fatal: detected dubious ownership in repository at ‘/var/www/discourse’
To add an exception for this directory, call:

    git config --global --add safe.directory /var/www/discourse

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.7/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded’: expected file /var/www/discourse/lib/freedom_patches/pluck_first.rb to define constant FreedomPatches::PluckFirst, but didn’t (Zeitwerk::NameError)

  raise Zeitwerk::NameError.new(msg, cref.last)

皆さん、こんにちは。素晴らしいガイドですね。Gerhardさんをはじめ、貢献してくださった皆様に感謝いたします。

どなたか、これをLyris用に適応させた方はいらっしゃいますか?歴史のあるインストール環境を移行したいと考えており、同様のプロジェクトで直面した特別な懸念事項があれば理解したいです。

メーリングリストから Discourse に投稿をインポートする必要があり、2 つの問題が発生しました。

  • sqlite3 が見つかりませんでした。
  • import_mbox.sh が見つかりませんでした。

以下に私の解決策を示します。

sqlite3 のインストール

Gemfile に以下を追加しました。

 gem "sqlite3", "~> 1.3", ">= 1.3.13"

その後、以下を実行しました。

cd discourse
bundle config set frozen false
bundle install

インポートの実行

cd discourse
RAILS_ENV=production bundle exec rails runner script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml
「いいね!」 1

おそらく、1.2. Dockerコンテナの準備の「通常のインポート」の後ろに隠されている次の手順を見落とした可能性があります。

「いいね!」 1

can't modify frozen String というエラーが発生しています。修正方法や、何が間違っているか教えていただけますか?

root@sajcf:~# /var/discourse/launcher stop app
x86_64 arch detected.
+ /usr/bin/docker stop -t 600 app
app
root@sajcf:~# /var/discourse/launcher enter import
x86_64 arch detected.
root@sajcf-import:/var/www/discourse# import_mbox.sh
The mbox import is starting...

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

creating index
indexing files in /shared/import/data/jjcf
indexing /shared/import/data/jjcf/SAJCF.mbox

indexing replies and users

creating categories
/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': can't modify frozen String: "jjcf" (FrozenError)
        from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
        from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'
        from script/import_scripts/mbox.rb:10:in `<main>'

それを解決する方法はGoogleで検索できます。.dup が簡単な方法だと思います。

「いいね!」 1

具体的には、インポートを許可するコードを正常に変更しました。具体的には、/var/www/discourse/script/import_scripts/base.rb ファイルの 447 行目に .dup を追加しました。

params[:name].dup.strip!

1 つ不明な点があります。マルチサイトのいずれかにインポートするにはどうすればよいですか?

「can’t modify frozen String」というエラーが発生したことはありますか? index.db は正常に作成されますが、カテゴリの作成時に失敗します。

root@xxxxxxxxxx:/var/www/discourse# import_mbox.sh
mboxインポートを開始しています...

既存のグループを読み込んでいます...

既存のユーザーを読み込んでいます...

既存のカテゴリを読み込んでいます...

既存の投稿を読み込んでいます...

既存のトピックを読み込んでいます...

インデックスを作成中

/shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com のファイルをインデックス化中

/shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com/export.mbox をインデックス化中

返信とユーザーをインデックス化中

カテゴリを作成中

/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': **can't modify frozen String: \"xxxxx-xxxxxxx@xxxxxxx.com\" (****FrozenError****)**

from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'

from /var/www/discourse/script/import_scripts/base.rb:438:in `each'

from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'

from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'

from script/import_scripts/mbox.rb:13:in `<module:Mbox>'

from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'

from script/import_scripts/mbox.rb:10:in `<main>'