以下にアップデート情報をお伝えします。最終的に動作するようになりました。学んだ教訓の中には、他の人の助けになるかもしれないものもありますので、以下に詳細な書き込みをします。OPにUnixパーミッションの落とし穴を追加する価値があるかもしれません。
添付ファイルフォルダのUnixパーミッション
SMF2インポーターは正常に動作していましたが、添付ファイルのUnixパーミッションに関するちょっとした落とし穴がありました。インポートスクリプトを実行する際、それはdiscourseユーザーとして実行されますが、添付ファイルのボリュームマウントに対する読み取りと書き込みの両方の権限を必ずしも持っているわけではありません。
インポート中、インポーターはその同じディレクトリに小さな一時ファイルを作成するようです。そのため、正しいユーザーが読み取りと書き込みの両方の権限を持っていることを確認する必要があります。私はホスト上でディレクトリをdiscourseユーザーに再帰的にchownすることでこれを実現しましたが、非常に緩いパーミッションを設定したり、アクセス制御リストを使用したりするなど、他の方法もあります。
アップロード失敗のデバッグは難しい
SMF2インポーターが何らかの理由でアップロードに失敗した場合、それは同じ方法で失敗を報告するため、添付ファイル/アップロードが失敗した理由を特定するのは難しい場合があります。
理由としては以下が考えられます。
- 添付ファイルがファイルシステムの正しい場所にない。
- 添付ファイルのパーミッションが不十分(
rwが必要)。 - Dockerボリュームマウントが正しく設定されていない。
- SMF2 DBが、添付ファイルフォルダに存在しなくなった添付ファイルがあることを報告している(私たちのSMF2フォーラムは20年近く経っており、「失われた」添付ファイルがかなりありました。これについてはあまりできることはありません…)。
- アップロードオブジェクトが、Discourse DBまたは
/shared/standalone/uploadsのディスクに正しく保存されていない。 - アップロードリンクのマークダウンが作成されていない。
私は、添付ファイルのプロセスをエンドツーエンドでテストし、smf2.rbコードに多数の追加のデバッグputsステートメントを追加することで、これをデバッグしました。これにより、アップロード作成プロセスのどの部分が機能していないかを特定しました。私の場合は、最終的に一つずつ解決された多くの小さな問題がありました。
サボるなマーカス
そして最後に、私は怠惰になり、DBをゼロに完全にクリアしていませんでした。そのため、すべてが成功しているという問題が発生しました。しかし、インポーターは既にインポートされたトピックやポストを上書きしません。そのため、アップロードを参照するマークダウン、つまり次のようになっているはずのものが:
---

ポストに挿入されていませんでした。
動作確認
これがすべてエンドツーエンドで動作しているかを確認する方法は、Railsコンソールで次を実行することでした。
Post.where("raw LIKE ?", "%upload://%").count
これは、実際のアップロードリンクが埋め込まれているポストの数を返し、この数はインポートプロセス全体で徐々に増加していきます。