現在の状況は以下の通りです。
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 説明もなく一部の画像でのみ機能したというものです。
ここではcasimagesについてのみ話しますが、私のインポートされたフォーラムはさまざまな他の画像ホスティングを使用していました。
それで、casimagesが私のIPを一時的にブラックリストに登録したのではないかと考えました。これは、すべての画像で機能しなかったことと、画像サーバーからのアップロードの成功がランダムであったことの両方を説明できる可能性があります。
Rebuild HTML オプションが(最初にのみ)機能し、画像が外部ホスティングサービスにホストされているにもかかわらず壊れた画像アイコンの代わりに表示されるケースもありましたが、プル外部画像 Sidekiq タスクがトリガーされると画像が壊れました。
rebake!(invalidate_broken_images: true) を使用したレールスクリプトでも同様です。
そのため、現在、レール 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サーバーの証明書は問題ないようです
また、invalidate_broken_images が実際に何をするのかも理解していません。Discourseのコードにはあまり詳しくありません。
invalidage_broken_images の出現箇所を確認するためにコードを見たところ、以下のファイルが見つかりました。
end
if RailsMultisite::ConnectionManagement.current_db != "default"
recover_uploads_from_index(path)
else
RailsMultisite::ConnectionManagement.each_connection do
recover_uploads_from_index(path)
end
end
end
desc 'invalidate broken images'
task 'posts:invalidate_broken_images' => :environment do
puts "Invalidating broken images.."
posts = Post.where("raw like '%<img%'")
rebaked = 0
total = posts.count
posts.find_each do |p|
rebake_post(p, invalidate_broken_images: true)
なぜ \u003cimg 文字列を具体的に検索しているのでしょうか?私の投稿はphpBBからのインポートであり、生のバージョンには [img] bbCodeのみが含まれており、\u003cimg\u003e タグは含まれていません。そのため、どのように影響を与える可能性があるのでしょうか(そして、それは影響を与えました。前のメッセージを参照してください)。
また、これら2つのメソッドの違いもよく理解していません(?):
else
post.custom_fields["rebake_attempts"] = attempts + 1
post.save_custom_fields
end
end
end
problems
end
def rebake!(invalidate_broken_images: false, invalidate_oneboxes: false, priority: nil)
new_cooked = cook(raw, topic_id: topic_id, invalidate_oneboxes: invalidate_oneboxes)
old_cooked = cooked
update_columns(
cooked: new_cooked,
baked_at: Time.zone.now,
baked_version: BAKED_VERSION
)
if is_first_post?
guardian.ensure_can_change_post_type!
post = find_post_from_params
params.require(:post_type)
raise Discourse::InvalidParameters.new(:post_type) if Post.types[params[:post_type].to_i].blank?
post.revise(current_user, post_type: params[:post_type].to_i)
render body: nil
end
def rebake
guardian.ensure_can_rebake!
post = find_post_from_params
post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)
render body: nil
end
def unhide
post = find_post_from_params
rebake はデフォルトの引数を false に設定し、rebake! はデフォルトの引数を true に設定するように見えます。
これら2つはどのように関連していますか(私はもちろん、Rubyでの ! 文字の意味を認識しています)、そしてなぜ異なるファイルにあるのですか?
私の目標は、外部画像が時々アップロードされたりされなかったりする理由を理解し、たとえ1時間に1枚画像をアップロードすることになったとしても、それらを適切かつ自動的にアップロードするための信頼できる方法を見つけることです。
ほぼ2週間この問題に取り組んでおり、私(そして私がサーバーを移行した人々)を狂わせています。
また、Discourseのログには何も記録されていません。複数の Sidekiq is consuming too much memory (using: 592.25M) というメッセージが表示されるだけです。私はWindows 10のWSL経由でUbuntuを使用していますが、機能するソリューション(見つかった場合…)はVPSで使用する予定です。