phpBB3フォーラムをDiscourseへ移行する

私も同じエラーに遭遇しました。これは、古い shared/standalone/import/mysql/imported ファイルが存在する場合に発生すると思われます。そのファイルを削除すると、エラーが解消されました。

「いいね!」 2

パスワードの移行が私の環境ではどうやら機能しませんでした。

phpBB 3.0 のダンプからインポートする前に、shared/standalone/import/settings.ymlpasswords: true を設定しました。containers/app.yml には以下のような設定があります。

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discoursehosting/discourse-migratepassword.git

インポート後、./launcher rebuild app を実行しました。インポート自体は完全に成功したようですが、phpBB のパスワードではログインできません。インポート中に目立ったエラーメッセージは見当たりませんでしたし、パスワードは 20 文字あるので最小文字数制限もクリアしているはずです。

トラブルシューティングのために何を確認すべきでしょうか?

追加情報:データベースの user_custom_fields テーブルに import_pass エントリがあり、phpBB データベースにあったパスワードハッシュと一致しています。この部分は正常に動作したようです。

編集:あっ、何が起きたか分かりました。phpBB では LDAP 認証に切り替わっていたことを完全に忘れていました!インポートしたパスワード自体は問題なかったのですが、15 年前のパスワードだったのです!なので今度は LDAP からパスワードハッシュを抽出する何かを急遽作る必要がありますね… :slight_smile:

「いいね!」 1

みなさん、こんにちは。

最近、添付ファイルを含むインポートを行った方はいますか?

ユーザーや投稿は正常に動作していますが、添付ファイルが投稿に追加されません。

まだ一部の投稿に BBCode が残っています。

奇妙なことに、files フォルダの内容が Discourse の uploads フォルダに転送されています。

当初は phpBB のバージョン 3.0.12 が古すぎたせいだと思い、phpBB を 3.0.14 にアップグレードし、Discourse と uploads フォルダをクリーンアップして再度インポートを試みました。しかし、効果はありませんでした。

その後、テストサーバーで phpBB のバージョンを 3.2.0 にアップグレードし(サポートツールキットを実行してデータベースからモジュールを削除した後)、再度試しましたが、やはり成功しませんでした。

データベースをさらに調査する前に、このスクリプトが全員にとって機能するものかどうか確認したかったのです。

設定ファイルに誤りがあったとは思いませんが、もう一度見直していただければ役立つかもしれません。

# phpBB3 インポーター用の設定ファイルの例です。

database:
  type: MySQL # 現在サポートされているのは MySQL のみです
  host: localhost
  port: 3306
  username: root
  password:
  schema: phpbb
  table_prefix: phpbb_ # フォーラムが異なるプレフィックスを使用している場合は変更してください。通常、すべてのテーブル名は phpbb_ で始まります
  batch_size: 1000 # 何をしているか理解していない限り、この値を変更しないでください。デフォルト値(1000)で問題なく動作します。

import:
  # 複数の phpBB フォーラムを単一の Discourse フォーラムにインポートする場合は、これを設定してください。
  #
  # 例えば、複数のサイトをインポートする場合、競合を避けるために
  # インポートされるすべての ID に 'first' というプレフィックスを付けます。
  # 以降のインポート実行では、異なる 'site_name' を指定する必要があります。
  #
  # site_name: first
  #
  site_name:

  # 新しいカテゴリの作成
  #
  # 例えば、親カテゴリとサブカテゴリを作成する場合。
  #
  # new_categories:
  # - forum_id: foo
  #   name: Foo カテゴリ
  # - forum_id: bar
  #   name: Bar カテゴリ
  #   parent_id: foo
  #
  new_categories: []

  # カテゴリのマッピング
  #
  # 例えば、phpBB のカテゴリ 1 と 2 のトピックは新しい「Foo カテゴリ」にインポートされ、
  # phpBB のカテゴリ 3 のトピックはサブカテゴリ「Bar カテゴリ」にインポートされ、
  # phpBB のカテゴリ 4 のトピックはカテゴリ 5 にマージされ、カテゴリ 6 はスキップされます。
  #
  # category_mappings:
  #   1: foo
  #   2: foo
  #   3: bar
  #   4: 5
  #   6: SKIP
  #
  category_mappings: {}

  # タグのマッピング
  #
  # 例えば、phpBB のカテゴリ 1 からインポートされたトピックは 'first-category' でタグ付けされます。
  #
  # tag_mappings:
  #   1:
  #   - first-category
  #   2:
  #   - second-category
  #   3:
  #   - third-category
  #
  tag_mappings:

  # 階級から信頼レベルへのマッピング
  #
  # phpBB 3.x の階級レベルを信頼レベルにマッピングします
  # 階級が 3000 以上のユーザーは TL3 になります。
  #
  # rank_mapping:
  #   trust_level_1: 200
  #   trust_level_2: 1000
  #   trust_level_3: 3000
  #
  rank_mapping:

  # 警告:何をしているか理解していない限り、このオプションを有効にしないでください。
  # BBCode から Markdown への変換が破綻し、インポートが大幅に遅くなる可能性があります。
  use_bbcode_to_md: false

  # 現在の phpBB インストール(またはそのコピー)のルートディレクトリへのパスです。
  # インポーターはベースディレクトリ内に /files と /images ディレクトリが存在することを想定しています。
  # Docker ベースのインポーターを使用していない場合は、この値を /var/www/phpbb のような適切なパスに変更してください。
  # アバター、添付ファイル、またはカスタムスマイリーをインポートする場合にのみ必要です。
  phpbb_base_dir: /shared/import/data

  site_prefix:
    # ポスト内の内部リンクを書き換えるために必要です
    original: ***.com   # http(s):// を含めないでください
    new: https://****.org       # http:// または https:// を含めてください

  # 古いフォーラムリンクを新しい場所へリダイレクトする場合は、これを有効にしてください。
  permalinks:
    categories: true  # /viewforum.php?f=1 を /c/category-name にリダイレクト
    topics: true      # /viewtopic.php?f=6&t=43 を /t/topic-name/81 にリダイレクト
    posts: false      # /viewtopic.php?p=2455#p2455 を /t/topic-name/81/4 にリダイレクト
    # リンクの種類ごとにプレフィックスを付加します。例えば 'forum' を付けると、/forum/viewtopic.php?f=6&t=43 を /t/topic-name/81 にリダイレクトします
    # フォーラムがサブフォルダにインストールされていない場合は、空のままにしてください。
    prefix:

  avatars:
    uploaded: true  # アップロードされたアバターをインポート
    gallery: false   # phpBB が提供する定義済みアバターをインポート
    remote: false   # 警告:これによりインポートが大幅に遅くなる可能性があります。リモートアバターのダウンロードを試みます。

  # true の場合:匿名ユーザーは停止されたユーザーとしてインポートされます。ログインできず、メールアドレスもありません。
  # false の場合:すべての匿名ユーザーにシステムユーザーが使用されます。
  anonymous_users: true

  # 「migratepassword」プラグインを使用して現在のパスワードでログインできるようにするため、パスワードハッシュをインポートする場合は、これを有効にしてください。
  # このプラグインは以下で利用可能です:https://github.com/discoursehosting/discourse-migratepassword
  passwords: false

  # デフォルトでは、以下の項目がすべてインポートされます。false に設定することで無効にできます。
  bookmarks: true
  attachments: true
  private_messages: false
  polls: false

  # true の場合:インポートされた各ユーザーは、phpBB からの元のユーザー名を名前として持ちます
  # false の場合:インポート中にユーザー名が変更されていない限り、インポートされた各ユーザーの名前は空白になります
  username_as_name: false

  phpBB で使用されているスマイリーを絵文字にマッピングします。デフォルトのスマイリーのほとんどは既にマッピングされていますが、気に入らないマッピングはここで上書きできます。
  # マッピング構文は:emoji_name: 'phpBB のスマイリー'
  # または複数のスマイリーを 1 つの絵文字にマッピングすることも可能です:emoji_name: ['smiley1', 'smiley2']
  emojis:
    # ここに 2 つの例を示します...
    smiley: [':D', ':-D', ':grin:']
    heart: ':love:'
「いいね!」 1

この問題は、import_phpbb3.sh が正しいパスに phpbb_mysql.sql ファイルを見つけられない場合に発生します。

「いいね!」 1

phpBB にも同様の問題が当てはまるものと思います。v3.2.x から v3.3.3 までのダンプをインポートしようとしていますが、親投稿が欠落しているものが数千件にのぼっています。複数回の実行や、複数の連続したバージョンのバックアップを行っても状況は変わりません。デバッグを簡素化するため、スクリプトがメッセージ ID の URL を旧フォーラムへの参照確認用として出力できるようにすると良いでしょう。(… viewtopic.php?p=57912)

「いいね!」 1

実はこの機会に、失敗したインポート行とそのエラーメッセージをダンプファイルに記録して分析用に共有するのはどうでしょうか…単なる提案ですが…

少なくとも1つのケースでは、トピックのURLが viewtopic.php?f=3&t=1472 なのに、最初の投稿 viewtopic.php?p=145185 が削除・除去されたなどの理由で存在せず、現在の最初の投稿が viewtopic.php?p=145186 となり、これは「返信」となっています。

明確にするために、ダンプファイルに「親トピックが実際に存在しない」のか、「再構築用にまだインポートされていない」のかを明記することを検討してはいかがでしょうか。

「いいね!」 1

最近、添付ファイルを含めた完全なインポートが全員でできたか、少しフィードバックをもらえると嬉しいです。私の環境ではうまくいきません。

現状、この問題がスクリプト側にあるのか、phpBBフォーラムのデータベース側にあるのか、わかりません :pray:

「いいね!」 1

画像をダウンロードして、正しい場所に配置しましたか?

最近やっていませんが、動作しないとは思えません。

「いいね!」 1

はい、フォルダと設定ファイルを二度確認しました。奇妙なことに、それらはデフォルト/元のフォルダにインポートされているようですが、投稿には統合されていません。

これは非常に古い phpBB で、いくつかのプラグインが付属していました。少し整理をしてから、phpBB 3.0.12 から最新の 3.1 または 3.2 へのアップグレードに成功し、各バージョンでインポートをテストしましたが、うまくいきませんでした。データベースに問題がある可能性があります。そのため、次回もし完全なインポートに成功されることがあれば、そのご報告をいただけると大変助かります。phpBB のデータベースが原因であれば、いくつかのサポートを得て本格的に調査いたします。スクリプトが原因であれば、お待ちすることも可能です。メッセージをありがとうございます!

「いいね!」 1

phpBB3 のインポートを最後にやったのはいつか覚えていませんが、スクリプトが非常にうまく機能しているため、おそらくそのせいではないかと疑っています(確認する方法はありませんが)。

Discourse へアップロードされる際の問題は、phpBB の投稿内でそれらがどのように参照されているかに関連している可能性が高いです。実行時にエラーが表示されますか?それがヒントになるかもしれません。あるいは、プラグインが投稿内やデータベースでの参照方法を変更したのかもしれません。いくつか調査する必要があるでしょう。

「いいね!」 2

「ファイルが見つからない」「投稿時間が不正」といったエラーがいくつかありましたが、以前のインポート時にも同様のものが発生していたため、大きな問題ではないと思います。また、初回実行時には「親投稿が存在しない」というエラーが多数発生しましたが、このスレッドの earlier で言及されている通り、スクリプトを2回実行することで解決しました。

それ以外では、スクリプトは大きな問題なく非常にスムーズに動作しました。

ファイルを目次(月別・年別)のサブフォルダに整理するためのプラグイン(主に.htaccessファイルのようです)がありましたが、私はすべてのファイルを同じフォルダに整理しました。その結果、クリーンなphpBBバージョンへのアップグレードは問題なく動作しました。インポートされたすべてのファイルは、phpBB 3.1 および 3.2 で正常に動作しました。

データベースについてさらに詳しく調査します。以前のインポートからSQLファイルを持っているかもしれません。テストサーバーで添付ファイルと投稿のテーブルを比較してみます。もしかすると見落としている点があるかもしれません。

「いいね!」 4

その通りです。TextProcessor::process_attachments にバグがあり、添付ファイルが投稿の Markdown に埋め込まれない問題が発生していました。PR を提出しました。

「いいね!」 5

お疲れ様でした。2回のパスを経て、インポートが完璧になりました。ありがとうございます!

「いいね!」 4

こんにちは、約35,000件の投稿をインポートしたのですが、インポート中に「親投稿 XXXXXX が存在しません。スキップします」というメッセージが多数表示されました。処理が終了した時点で、Discourse フォーラムには(私の認識では)すべての「トピック」が表示されていますが、回答が一切ありません。実質的には、トピックそのもの(トピック本文を含む最初の投稿)以外に投稿がインポートされませんでした。

また、アバターもインポートされませんでした。アバターは「import」フォルダ配下の正しいディレクトリに配置したつもりです。

元のフォーラムは phpBB2 で、phpBB3 へは通常通りインポートされ、すべての投稿が正常に表示されていました。ただし、以前に古いメッセージの多くを削除しましたが、phpBB3 ではすべて問題なく動作しているようです。

何かアドバイスはありますか?確認できるインポートスクリプトはありますか?

「いいね!」 1

これは数週間から数ヶ月前から続いている状態ですが、ご安心ください。import_phpbb3.sh コマンドを再度実行すれば、インポートは完了します。

「いいね!」 3

どうもありがとうございます!投稿には効果がありましたが、アバターには効きませんでした。引き続き修正策を探しています。

「いいね!」 1

何度もトピックを読み返し、いくつかの移行を実行しましたが、毎回このプラグインに混乱し、同様のバグに遭遇しました。3回目の移行で、気が狂いそうになりました。このプラグインの動作方法は、移行を行うユーザーを混乱させる可能性があると思います。

移行プロセスにDiscourseでプラグインを有効にする必要があることが、どこかに明記されているべきです。もしどこかに既に書かれているのであれば、私が見落とした可能性があり、この情報は強調されるべきかもしれません。

もし私が間違っていたら、訂正してください。 :slight_smile:

「いいね!」 1

phpBB 3.0.7 からのインポートにおけるスマイリー変換の修正を報告します。

  • 一部のスマイリーが Discourse に正しく変換されませんでした。


    (ただし、理由があって常にそうだったわけではありません。同一の絵文字が、表示される場合とされない場合がありました。最初はランダムに見えました。)

  • また、一部の絵文字が単純に消えてしまいました。
    phpBB:
    image
    Discourse:
    image

問題は、replace_smilies(text) で使用されている正規表現にありました。

誤った正規表現:

<!-- s(\S+) --><img src="{SMILIES_PATH}/.+?" alt=".*?" title=".*?" /><!-- s?:\S+ -->

正規表現の先頭は、その後に : 文字があることを想定していませんが、正規表現の末尾では想定しています。

<!-- s
<!-- s?:

(また、正規表現の末尾にある s 文字の 0 または 1 を照合する ? が、正規表現の先頭にはない理由も疑問です)

この : を正規表現から削除したところ、私の 2 つのスミリーの問題は完全に解決したようです。

私の phpbb フォーラムでは、多くのスミリーが実際には : で始まっていました(例: :mrgreen::evil:)、しかし一部はそうではありませんでした(例: 8-);))。
古い正規表現は、誤ったスミリーキャプチャにつながりました。例えば、隣接する複数のスミリーが 1 つのスミリーとしてキャプチャされていました。


修正された正規表現:

<!-- s(\S+) --><img src="{SMILIES_PATH}/.+?" alt=".*?" title=".*?" /><!-- s?\S+ -->

git の使用に慣れていないこと、また他の phpBB バージョンからのインポートに影響があるかどうかわからないため、Discourse リポジトリで直接コードを修正していません。何かを台無しにしたくありません。


いずれにしても、もし私と同じような問題に遭遇した人がいれば、これが解決策です。

「いいね!」 4

phpBB 3.0.7 からの移行で役立つ可能性のある別の問題が修正されました。

phpBB フォーラムの投稿内容の先頭に、行ごとに複数のスペースが含まれる場合がありました。ユーザーがメッセージを作成する際に注意せずにスペースキーを連打するのを好むためだと推測されますが、レンダリングされたページではこれらの複数のスペースは無視されるため、問題ありませんでした。

生の phpBB テキストコンテンツ:

Salut tous  :)😊:evil:😈:);) 
  
     Alors voilà, le combi n'a pas roulé beaucoup ces derniers temps cause CT pas OK 😈:evil: mais il a fait ces 2000 kms sans broncher 😉:wink:  
Maintenant le CT est OK . Merci L'Atelier Du Raz 8-')

    Je dois donc changer le joint-spi au bout de 40 000 kms en 10 ans 🙄:roll: 
C'est un silicone et j'ai vu qu'il y avait des "doubles lèvres " !? 
What's About ?

             Je trouve ça un peu limte 😈:evil: 
Merci tous, fred

ブラウザでのレンダリングページ:


しかし、phpBB から Discourse へのインポート中に、これらの既存のスペースがコードブロックに変換されてしまいました。

このように表示されるべきです。


各行の先頭のスペースを削除する正規表現を追加することで修正しました。

 text.gsub!(/^[^\\S\\r\\n]+/, "\\n")

このファイル内の process_smilies(text) の直前にこれを追加しました。


もう一つ問題が発生しました。
このコード(まだ text_processor.rb にあります)で:

    def clean_bbcodes(text)
      # Many phpbb bbcode tags have a hash attached to them. Examples:
      #   [url=https://google.com:1qh1i7ky]click here[/url:1qh1i7ky]
      #   [quote="cybereality":b0wtlzex]Some text.[/quote:b0wtlzex]
      text.gsub!(/:(?:\\w{8})\\]/, ']')

私のデータベースでは、これらのハッシュの長さは 5 文字から 8 文字の間ですが、正規表現は 8 文字のハッシュのみを削除します。そのため、インポートでは短いハッシュが削除されずに残ってしまいました。
正規表現を次のように変更して修正しました。

text.gsub!(/:(?:\\w{5,8})\\]/, ']')

同じファイルで、もう一つ小さな問題があります。[color] BBCode タグを削除する正規表現は、必須の # で始まる16進数値を想定しています。しかし、[color] は「red」、「blue」などの文字列も値として受け入れます。そのため、元の正規表現を変更しました。

      # remove color tags
      text.gsub!(/\\[\\/?color(=#[a-z0-9]*)?\\]/i, "")

# の後に ? を追加して、# をオプションにしました。
修正されたコード:

      # remove color tags
      text.gsub!(/\\[\\/?color(=#?[a-z0-9]*)?\\]/i, "")

これらの問題が phpBB のインポートで一般的かどうか、それとも私のケースに非常に特有なものなのかはわかりません。後者の場合、ここで説明したことが歓迎されない、または余分なものでないことを願っています。もしそうであれば、お知らせください。そうすれば気まずくならずに済みます。: grinning_face_with_smiling_eyes:


編集:移行後、すべての既存のトピックをすべての既存ユーザーにとって「既読」として設定することは可能ですか?

目標は、移行後、既存のユーザーが既存の(時には古い)トピックをクリックしても、移行前に既に読んだトピックの最初のメッセージに誘導されないようにすることです。

理想的には、既存のユーザーが既存のトピックをクリックすると、最初のメッセージではなく、最後のメッセージ(移行終了以降のもの)が開かれるはずです。

ただし、これは小さなユーザビリティの問題です(ユーザーがフォーラムを使用し、トピックを読むにつれて数週間で自然に解消されます)。しかし、この提案について質問されました。

「いいね!」 7

これらの修正を共有していただきありがとうございます!

過去の移行で正規表現に同様の調整を行う必要があったため、これらは将来のphpbbインポートに役立ちます。

このトピックが役立つかもしれません How to mark imported posts as read - #2 by stuwest

「いいね!」 3