Discourse 资源缺失

你好,

我按照推荐的安装指南在 Fedora 31 服务器上安装了 Discourse,但使用 podman 而非 Docker 来运行容器。今天早上初次设置时一切顺利,但在尝试通过纯 HTTP 访问主机上的 Nginx 时遇到了问题,最终不得不在两个 Nginx 实例上都使用 SSL 证书。配置 Discourse 后一切正常。

后来我决定在关闭 SSL 的情况下重新构建 Discourse,并使用非 root 用户账户进行构建。此时通过纯 HTTP 访问主机没有问题,但页面显示为空白(标题正常,favicon 也正常)。

我检查了容器中的目录:

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 目前还不允许我在一个帖子中使用两张图片 :slight_smile:

已将其标记为 bug。在构建 tests-passed 时,我无法获得包含所有资源的版本。我尝试进入容器并执行 rake assets:precompile,但同样的资源仍然缺失。

经过无数次重建后,它竟然神奇地能用了。真奇怪。

你好,Adriany,欢迎来到论坛

据我所知,Docker 是必要条件,而非可选项。你在哪里看到了这份更新的安装指南?

我刚刚用 Podman 替换了 Docker,运行良好。它们的命令行语法是兼容的。

1 个赞

好的,经过一些测试后,我现在可以确认每次重建后都会显示空白页面。如果我运行 RAILS_ENV=production bin/rake assets:precompile,之后就能正常工作。不知道为什么,按理说在重建时应该会自动编译这些资源才对?

你看到关于 Podman 与 Docker 不兼容的这篇主题帖了吗?尤其是这条回复:

1 个赞

确实有效。Podman 不应影响初始资源预编译的结果文件。

在重建的资源编译阶段,您是否在输出中看到任何回溯信息?

1 个赞

我们在这里是因为某些功能无法正常工作。应该实际是两种不同的状态。

你非常肯定地断言 Podman 与此无关。最好能证明这一点,从而明确排除它作为影响因素的可能性。据我所知,你尚未使用 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 进行的实验实际上是在测试 launcher,而非 Discourse。至少在我测试时,它依赖于 Docker 的输出细节,而 Podman 并未尝试模拟这些细节。

@Adriany,我猜你使用的是默认存储驱动,这也是 Discourse 推荐的驱动。在 Docker 中,该驱动为 “overlay2”——但我无法确认你的情况是否如此。

3 个赞

我使用的是 overlayfs,它等同于 overlay2。
有趣的是,在尝试添加插件并经历几次构建缺失资源后,它又顺利构建成功了,没有任何资源缺失。而当我在不带插件的情况下重新构建时,整个过程异常顺畅。这是怎么回事?

编辑:它确实对我有效,并且现在资源已在此处缓存。但在运行过程中,其他用户却遇到了问题。

编辑 2:另一次重新构建导致资源像之前一样出错,而解决方法是像之前那样重新构建。

1 个赞

如果我们的资源管道成功生成了文件,且操作系统报告没有错误,但文件在重建(即实际上重启了容器)后消失,我会将赌注重新押在 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

它们确实在那里,所以我想这是 Discourse 的问题,而不是 Podman 的问题,我只是没找到正确的文件位置。

我原本以为可能是 Cloudflare 的问题,但当我在服务器上对 localhost 快速执行 curl 时,同样得到了 404 错误。

1 个赞

您能提供一下在 Docker 上复现此问题的步骤吗?

4 个赞