Discourse アセットが見つかりません

こんにちは、

Fedora 31 サーバーに推奨されるインストールガイドに従って Discourse をインストールしましたが、コンテナの実行には Docker ではなく Podman を使用しました。今朝、最初にセットアップしたときはすべて問題なく動作しましたが、ホスト上の Nginx へのプレーン HTTP が機能しなかったため、両方の Nginx インスタンスで SSL 証明書を使用する必要がありました。Discourse を設定し直したところ、すべて正常に動作しました。

その後、SSL をオフにして Discourse を再ビルドし、非 root ユーザーアカウントでビルドすることを決めました。ホストへのプレーン HTTP は正常に動作しましたが、白いページが表示されました(タイトルは表示され、ファビコンも機能していました)。

コンテナ内のディレクトリを確認しました:

root@xena-app:/var/www/discourse# ls public/assets -al
total 15640
drwxr-xr-x. 2 discourse discourse      10 Jan 11 13:54 .
drwxr-xr-x. 3 discourse discourse      29 Jan 11 13:57 ..
-rw-r--r--. 1 discourse discourse     595 Jan 11 13:49 _activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js
-rw-r--r--. 1 discourse discourse     250 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.br
-rw-r--r--. 1 discourse discourse     420 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.gz
-rw-r--r--. 1 discourse discourse     695 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.map
-rw-r--r--. 1 discourse discourse  990519 Jan 11 13:50 _admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
-rw-r--r--. 1 discourse discourse   83903 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.br
-rw-r--r--. 1 discourse discourse  106465 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
-rw-r--r--. 1 discourse discourse  366446 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map
drwxr-xr-x. 2 discourse discourse    4096 Jan 11 13:54 admin-login
...

要求されたファイルが実際に存在しないことが確認できました。Nginx のログにもその旨が記載されています:

2020/01/11 13:59:49 [error] 60#60: *20 open() "/var/www/discourse/public/assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js" failed (2: No such file or directory), client: 10.0.2.2, server: _, request: "GET /assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js HTTP/1.0", host: "idlerpg.xyz", referrer: "https://idlerpg.xyz/"

これはインストールの問題ではないかと考えました。なぜなら、今朝 root ユーザーでホスト上にインストールした際にはこれらのファイルが存在していたからです!共有フォルダを削除し、非 root ユーザーで再ビルドしましたが、同じ結果が繰り返されました。その後、今朝と同じ設定で root ユーザーとして再度試してみましたが、同じ問題が発生しました。

非 root でのインストールでは常に「おめでとうございます、Discourse をインストールしました!」というページが表示されますが、インストールが完了すると、アセットファイルが不足しているため空白のページが表示されます。

欠落しているアセットを修正する方法はありますか?

今朝本当に機能したのか疑問に思う人のために、私のスマホからのスクリーンショットを載せます。


Discourseはまだ1つの投稿で2つの画像を使用することを許可していません :slight_smile:

バグとして変更しました。テストが通過した状態で、すべてのアセットを含むバージョンを取得することができません。
コンテナにログインして rake assets:precompile を実行してみましたが、同じアセットが依然として欠落したままです。

何度も再構築を試した結果、なぜか今では正常に動作するようになりました。不思議ですね。

こんにちは、Adrianyさん。フォーラムへようこそ!

私の知る限り、Docker はオプションではなく必須要件です。その新しいインストールガイドはどこで見ましたか?

Docker を Podman に置き換えたばかりですが、問題なく動作しています。コマンドライン構文は互換性があります。

「いいね!」 1

はい、いくつかのテストを行った結果、再ビルドのたびに常に空白のページが表示されることがわかりました。RAILS_ENV=production bin/rake assets:precompileを実行すると、その後常に正常に動作します。なぜそうなるのかは不明ですが、再ビルド時にはコンパイルされるはずです。

Podman と Docker の互換性に関するこのトピック、特にこの投稿をご覧になりましたか?

「いいね!」 1

確かに動作しますね。Podman は、初期アセットのプリコンパイル結果となるファイルには影響を与えるべきではありません。

再構築のアセットコンパイル段階で、出力にバックトレースは表示されますか?

「いいね!」 1

何か動作しない問題があるため、ここにいます。あるべき状態実際の状態は異なります。

Podmanは関与していないと自信を持って主張していますが、それを明確に証明して要因から除外することが望ましいでしょう。AFAIK、問題が解消されるかどうかを確認するために、Dockerでの公式インストール手順を完了していないようです。

はい、その通りです。

I, [2020-01-12T20:58:31.800117 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile'
一時ファイルを削除中
アセットをバンドル中
I, [2020-01-12T20:58:38.208107 #758]  INFO -- : /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js を書き込み中
I, [2020-01-12T20:59:02.428630 #758]  INFO -- : /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js を書き込み中
I, [2020-01-12T20:59:02.447192 #758]  INFO -- : /var/www/discourse/public/assets/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js を書き込み中
I, [2020-01-12T20:59:02.707559 #758]  INFO -- : /var/www/discourse/public/assets/browser-update-1741a2ed67a367faeb0a582af064457e8b1b1354e52e6efcf8bf26301166dec8.js を書き込み中
I, [2020-01-12T20:59:02.753632 #758]  INFO -- : /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js を書き込み中
I, [2020-01-12T20:59:04.073148 #758]  INFO -- : /var/www/discourse/public/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js を書き込み中
I, [2020-01-12T20:59:06.303026 #758]  INFO -- : /var/www/discourse/public/assets/pretty-text-bundle-fa6ea00e2000bf2f9ed3f069be9253477fed5e7290b5d109a3e2d9498ac70e81.js を書き込み中
... [省略]
108798.339928812 圧縮中: vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
uglifyjs '/var/www/discourse/public/assets/_vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' -m -c -o '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' --source-map "root='/assets',url='/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.map'" --output '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js'
gzip -f -c -9 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js > /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.gz

brotli -f --quality=11 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js --output=/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.br


vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js の圧縮完了: 3.33 秒

108801.669283898 圧縮中: admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
uglifyjs '/var/www/discourse/public/assets/_admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' -m -c -o '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' --source-map "root='/assets',url='/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map'" --output '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js'
gzip -f -c -9 /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js > /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
[...]

確かにコンパイルは行われますが、ビルド後に欠落したファイルを表示させるためには、毎回再度実行する必要があります。

興味深いですね。ファイルの作成は問題ないのに、永続化が失敗するということでしょうか?

Podman ボリュームの動作と、それを支えているドライバーについて調べてみてください。Docker の世界では、長年にわたりストレージドライバーに関する非常に多くの奇妙な問題が発生しており、そのため当社のランチャー・スクリプトには「推奨」ドライバーのリストを維持しています。

「いいね!」 4

はっきりさせておきますが、私の Podman での実験は、Discourse ではなくランチャーをテストするものでした。少なくとも私がテストした当時は、Docker の出力詳細に依存しており、Podman はそれをエミュレートしようとはしていませんでした。

@Adriany さん、おそらくデフォルトのストレージドライバを使用されているのでしょう。それは Discourse にも推奨されているドライバで、Docker では「overlay2*」ですが、それがそうであるとは断定できません。

「いいね!」 3

overlayfs を使用しています。これは overlay2 に相当します。
興味深いことに、プラグインを追加しようとした際にアセット不足が発生していたにもかかわらず、さらにビルドを重ねたところ、アセット不足なく正常にビルドされました。しかし、プラグインなしで再ビルドすると、まるでバターのようにスムーズに動作しました。不思議ですね?

編集:私の環境では動作し、現在アセットがキャッシュされています。実行中は他のユーザーに対して動作しなくなりました。

編集 2:別の再ビルドにより、以前と同様にアセットが破損するようになりましたが、前と同じように再ビルドすることで解決しました。

「いいね!」 1

アセットパイプラインがファイルを正常に生成し、OS がエラーなしと報告しても、再ビルド(これによりコンテナが実質的に再起動します)後にファイルが消える場合、私は Podman のストレージドライバに賭けます。

もし誰かが Docker でこの同じ動作を再現できるなら(この場合、いくつかのトピックが存在することになるでしょう)、残念ながらこの件については Podman プロジェクトにチケットを提出する必要があります。

「いいね!」 3

こんにちは、

さらに調査を進めたところ、ファイルの保存場所についての私の予想が間違っていたか、単にファイルを見つけるのが下手だったようです。

ファイル自体はすべて404エラーになっていますが、例を挙げると以下のようになります:

root@idlerpg:/var/www/discourse# find . -type f -name "*discourse-solved*"
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css.map
./public/assets/plugins/_discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.gz
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.br
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.map
./app/assets/javascripts/plugins/discourse-solved.js.erb
./plugins/discourse-solved/test/javascripts/acceptance/discourse-solved-test.js.es6

ファイルは確かに存在しています。つまり、これはPodmanの問題ではなくDiscourse側の問題のようです。単にファイルを適切に探せていなかったのでしょう。

Cloudflareに問題があるのではないかと考えましたが、サーバーのlocalhostで簡単にcurlを実行しても、やはり404エラーが返ってきます。

「いいね!」 1

Docker でこの現象の再現手順を共有していただけませんか?

「いいね!」 4