railsコマンドまたはrakeタスクでの再ベイクが機能せず、HTMLの再構築は機能します。なぜですか?

こんにちは!

インポートされたBBcodeを含む、壊れた画像を持つ投稿を修復しようとしています。

画像はコンポーザーのプレビューには表示されますが、最終的な投稿コンテンツには壊れた画像が含まれます。

いくつかの投稿で「HTMLの再構築」機能を使用した後、それが本番フォーラムで投稿を修復したのを見て、すべての投稿をrakeタスクを使用して再ベイクしました。

驚いたことに、壊れた画像を持つ投稿は修復されませんでした。

そこで、テストフォーラム(同じバックアップ、同じデータ)で、railsコマンドとrakeタスクの両方を使用して特定の投稿の再ベイクを試したところ、次の動作が見られました。

  • 画像が一瞬表示されますが、投稿はすぐに壊れた画像を持つ元の状態に戻ります。

しかし、「HTMLの再構築」機能を使用すると、完全に機能し、画像は壊れた画像に戻りません。数分後にはサーバーに正しくアップロードされます。

この現象について説明していただけますか?なぜrailsコンソールまたはrakeタスクからの再ベイクがこの動作をし、HTMLの再構築とコマンドラインの再ベイクの違いは何ですか?

ビデオキャプチャ:

  1. railsコンソールから:

  2. rakeタスクから:

非常に興味深く、(まだすべての投稿の画像をバッチで修復しようとしています)。


これは、HTMLの再構築を使用した例で、この投稿の埋め込み画像が正しく表示され、サーバーに自動的にアップロードされたことを示しています(明らかに、casimagesへの元のリンクはまだありますが、これは期待される動作です)。数日前のものです:Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper

「いいね!」 4

そのRakeタスクは、それらを再ベイク対象としてマークし、サムネイルの再構築もトリガーすると考えられます。Sidekiqでキューイングされているものがあるか確認しましたか?

「いいね!」 3

編集:

投稿のrake rebakeタスクは4分後にPullHotLinkedImagesをトリガーし、同時に処理済みタスクの数を即座に1つ増やしますが、キュータブには何も追加されていないようでした。

手動でHTML再構築を行った少数の投稿では、画像は数日間完璧に表示されており(私のサーバーにもダウンロードされています)。

「いいね!」 4

管理用レンチとコンソールで動作が異なる理由は分かりませんが、同様の問題を抱えていたこのトピックを見つけました。API を使用して再ベイクすることで解決したようです。

https://meta.discourse.org/t/some-linked-images-not-displaying-show-as-broken/142177/7

お役に立つか分かりませんが、共有させていただきました。:slightly_smiling_face:

編集: もう 1 つ前の投稿を読むべきでした。どうやらそれも信頼性が低いようです。すみません、私の間違いでした。誤報です。

「いいね!」 3

10件の投稿が新しいトピックに分割されました: 一部のドメインでホットリンク画像をプルできません

Jayがrake/railsのrebakeとrebuild HTMLの違いに気づいた以外に、他にアイデアがある人はいますか?

これらのタスクの違いについての公式な回答があれば歓迎です :slight_smile:

もし解決できなければ、画像の問題を抱えている可能性のある40000件の投稿を「HTMLを再構築」するためにAPI方式で開始します…そしてそれが私にとってうまくいくことを願っています :confused: :person_shrugging:

あるいは、railsを使って「HTMLを再構築」する他の方法があれば? :thinking:

HTMLの再構築: post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)

Rake posts:rebake: post.rebake!(**opts) (optsは通常空)
Oneboxについては、タスク posts:refresh_oneboxes を試すことができ、壊れた画像については、タスク posts:invalidate_broken_images を試すことができます。後者があなたの問題の解決策になるかもしれません。

「いいね!」 8

数件の投稿でテストしたところ、見事に機能しました!
数千件の投稿で試してみて、どうなるか見てみます!本当にありがとうございました!

「いいね!」 5

現在の状況は以下の通りです。

40000件の投稿すべてに対して [img] 文字列を含む post.rebake!(invalidate_broken_images: true) を試したところ、多くの画像で機能しましたが、同じ外部画像ホスティングサービスでホストされているにもかかわらず、すべてではありませんでした。
例えば、数千件の「機能する」casimagesリンク(有効な画像にリンクし、編集時のコンポーザープレビューで画像を表示する)がありますが、投稿のクックされたバージョンでは壊れており、私のスクリプトのおかげでサーバーに正常に表示およびアップロードされました。しかし、他にも多くの場合、単に機能せず、その理由がわかりません。

Post.where('raw LIKE ?', '%[img]%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
end

他の画像ホスティングからの画像リンクもアップロードされたものと、そうでないものがありました。
これらの投稿と画像リンクの間に違いは見つけられませんでした。すべて機能する画像があり、同じ画像ホスティングを使用していたことが不可解でした。
この操作を複数回試しましたが、外部ホスティングサービスに関係なく、結果は一貫性がありませんでした…画像がアップロードされたりされなかったりしました。ランダムなように見えました。

これは、@Amthi が遭遇した問題に少し似ています: Some linked images not displaying/show as broken - #8 by Amethi 説明もなく一部の画像でのみ機能したというものです。


:information_source: ここではcasimagesについてのみ話しますが、私のインポートされたフォーラムはさまざまな他の画像ホスティングを使用していました。

それで、casimagesが私のIPを一時的にブラックリストに登録したのではないかと考えました。これは、すべての画像で機能しなかったことと、画像サーバーからのアップロードの成功がランダムであったことの両方を説明できる可能性があります。
Rebuild HTML オプションが(最初にのみ)機能し、画像が外部ホスティングサービスにホストされているにもかかわらず壊れた画像アイコンの代わりに表示されるケースもありましたが、プル外部画像 Sidekiq タスクがトリガーされると画像が壊れました。
rebake!(invalidate_broken_images: true) を使用したレールスクリプトでも同様です。
:weary:

そのため、現在、レール rebake! コマンドごとに 5 秒待機する、より遅いアプローチを試しています。

total = Post.where('lower(raw) LIKE ?', '%[img]https:%').count
i = 0
Post.where('raw LIKE ?', '%[img]https:%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
    print "#{i}/#{total}"
    print "\r"
    i +=1
    sleep(5)
end

約60時間後に改善されたかどうかを確認します…

この問題の根本原因、および「通常の」リベイクで画像がサーバーにアップロードできない理由(casimagesによって一時的にブラックリストに登録されていない場合)を理解したいと思います。

ちなみに、casimagesサーバーの証明書は問題ないようです :smile:

また、invalidate_broken_images が実際に何をするのかも理解していません。Discourseのコードにはあまり詳しくありません。

invalidage_broken_images の出現箇所を確認するためにコードを見たところ、以下のファイルが見つかりました。

なぜ \u003cimg 文字列を具体的に検索しているのでしょうか?私の投稿はphpBBからのインポートであり、生のバージョンには [img] bbCodeのみが含まれており、\u003cimg\u003e タグは含まれていません。そのため、どのように影響を与える可能性があるのでしょうか(そして、それは影響を与えました。前のメッセージを参照してください)。:thinking:

また、これら2つのメソッドの違いもよく理解していません(?):

rebake はデフォルトの引数を false に設定し、rebake! はデフォルトの引数を true に設定するように見えます。

これら2つはどのように関連していますか(私はもちろん、Rubyでの ! 文字の意味を認識しています)、そしてなぜ異なるファイルにあるのですか?

私の目標は、外部画像が時々アップロードされたりされなかったりする理由を理解し、たとえ1時間に1枚画像をアップロードすることになったとしても、それらを適切かつ自動的にアップロードするための信頼できる方法を見つけることです。 :sweat_smile:
ほぼ2週間この問題に取り組んでおり、私(そして私がサーバーを移行した人々)を狂わせています。:woozy_face:

また、Discourseのログには何も記録されていません。複数の Sidekiq is consuming too much memory (using: 592.25M) というメッセージが表示されるだけです。私はWindows 10のWSL経由でUbuntuを使用していますが、機能するソリューション(見つかった場合…)はVPSで使用する予定です。

「いいね!」 1

それはさらに下の方、716行目で何をしているかを見るとわかります。画像を削除して、再度ダウンロードしようとします。(一見したところでは)

「いいね!」 1

この説明をありがとう。 :slight_smile:


それで、私の投稿をリベイクして [img] を含める作業が55時間近くになりました。私のRailsスクリプトから40000件の投稿を反復処理するごとに5秒の遅延を設けています。

見たところ、以前よりもずっとうまく機能しています。ほとんどの有効な画像(Imageshackとその不安定な動作は除外します)は、一見したところ、私のフォーラムに問題なくアップロードされているようです。しかし、100%確実にするために、もっと詳しく見てみます。100%確実なのは、結果がはるかに、はるかに良くなり、一貫性があるということです。

ですから、私が遭遇した問題(そしておそらく@Amethiの問題)は、invalidate_broken_images を使用したリモート画像のダウンロードにおけるランダム性であり、さまざまな画像ホスティングプロバイダーからのレート制限のようなものに関連していたのではないかと疑っています…? :thinking: 不思議なのは、他のインポートしたフォーラムでは問題に気づかなかったことです… :face_with_raised_eyebrow:


とはいえ、結果が十分に満足のいくもので、遅延がリモート画像のダウンロードを実際に改善するのであれば、本番フォーラムでも同じ方法を実行しますが、各投稿のリベイク間の時間を5秒から10秒または15秒(あるいはそれ以上、急いでいるわけではありません。これらはすべてかなり古い投稿であり、VPSは私のコンピューターよりもはるかに低いスペックです)に増やします。

早すぎる結論は出したくありませんが、私の最初の問題の解決策は、Richardが提案した解決策と、各投稿のリベイク間に遅延を追加することの両方を適用することかもしれません

「いいね!」 3

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