尝试安装插件导致网站崩溃,无法运行重建

我试图安装格式插件,但把代码放错了位置。当我重新构建并加载站点时,插件没有初始化。于是我发现了错误,将其移除……但系统提示某一行存在错误。我找到了该行中的错误,用 yamllint 检查后确认无误,随后移除了插件……但现在重新构建却无法正常工作。系统持续报错,虽然我能加载站点首页,但无法加载任何主题或其他内容。

以下是重新构建和 doctor 工具的输出结果:

摘要
失败
--------------------
NoMethodError: undefined method `each' for nil:NilClass
错误位置:/pups/lib/pups/config.rb:99:in `run_commands'
dfd33a9a3be65ddb9a1fd19c19e5034a44c39f46e330ccdf0533f4f66d7d0005
** 启动失败 ** 请向上滚动查看之前的错误信息,可能不止一条。
可运行 ./discourse-doctor 帮助诊断问题。
root:/var/discourse# ./discourse-doctor
DISCOURSE DOCTOR Thu Jul 16 07:53:05 UTC 2020
操作系统:Linux itsbx 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux



==================== 严重问题!!!! ====================
应用程序未运行!
尝试重新构建
==================== 重新构建日志 ====================
确保启动器为最新版本
获取 origin
启动器已是最新版本
停止旧容器
+ /usr/bin/docker stop -t 60 app
app
cd /pups && git pull && /pups/bin/pups --stdin
已是最新版本。
I, [2020-07-16T07:53:23.985444 #1]  INFO -- : 正在加载 --stdin


失败
--------------------
NoMethodError: undefined method `each' for nil:NilClass
错误位置:/pups/lib/pups/config.rb:99:in `run_commands'
2386f66f76d9c9ffbbcd02bfad9e0530683714d433bff8d70976cae6c4b8fc86
** 启动失败 ** 请向上滚动查看之前的错误信息,可能不止一条。
可运行 ./discourse-doctor 帮助诊断问题。
==================== 重新构建日志结束 ====================
应用程序重新构建失败。

正在检查您的域名 . . .

连接到 yoursite 成功。
您可能需要移除任何非官方插件并重新构建。
尝试重启现有容器 . . .

正在启动现有容器
+ /usr/bin/docker start app
守护进程错误响应:在端点 app (39c7d5a80e10058bc952825fccd073af0f2ff12857895aa1046a6615d879a5a0) 上配置外部连接时驱动失败:启动用户态代理时出错:listen tcp 0.0.0.0:443: bind: 地址已被占用
错误:启动容器失败:app
容器重启失败。


==================== 插件 ====================
          - git clone github.com/discourse/docker_manager.git

未检测到非官方插件。

官方插件列表请参阅:thub.com/discourse/discourse/blob/master/lib/plugin/metadata.rb

========================================
**myhost 上的 Discourse 版本:未找到**
**localhost 上的 Discourse 版本:未找到**


==================== 内存信息 ====================
RAM (MB): 2041

              total        used        free      shared  buff/cache   available
Mem:           1993         144        1237           0         611        1677
Swap:          2047          76        1971

==================== 磁盘空间检查 ====================
---------- 系统磁盘空间 ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        49G   11G   38G  22% /

==================== 磁盘信息 ====================
Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3980448C-AF15-4833-A022-C759F0D2D80A

Device      Start       End   Sectors  Size Type
/dev/vda1  227328 104857566 104630239 49.9G Linux filesystem
/dev/vda14   2048     10239      8192    4M BIOS boot
/dev/vda15  10240    227327    217088  106M Microsoft basic data

分区表条目未按磁盘顺序排列。

==================== 磁盘信息结束 ====================

我完全不知道该怎么办,站点目前彻底无法使用。我移除了链接,因为每篇帖子只能使用 3 个链接,但它们确实存在。重新构建之前一直正常,直到我移除了那个被我放错位置的插件,之后一切就都停止了。之前确实有几行代码出错,但我已确认已修复。我现在完全束手无策。我刚刚尝试重新运行 setup 并确认所有设置,过程顺利,但在重新构建时再次失败……

好吧,在尝试重新运行和编辑操作数小时后,我最终试了

./launcher start app,它运行正常,插件也安装了(尽管我以为我已经把它编辑掉了?)。不管了。不过,现在我不敢尝试重建或安装任何其他东西,因为我不确定具体是什么导致了这个问题,甚至不清楚是什么被修复了。所以,任何见解仍然非常感谢。

仅凭您的描述无法判断可能出现了什么问题,但如果上一次重新构建成功了,那么下一次也很可能会成功。

他大概只是用 ./launcher start app 启动了一个旧镜像。

@Kartoon 你可以尝试重新构建,如果失败,你仍然可以通过相同的命令恢复到最后一个已知良好的镜像。

抱歉,我遇到了一点紧急情况,没能查看这个主题。

重建确实没有成功,我今天又试了一次,还是失败了。在执行 ./launcher start app 后网站运行正常,但每次尝试重建都会失败,同时 discourse doctor 也会报错。如果需要的话,我可以提供它生成的日志,但显然问题仍未解决,我担心这将来会导致其他问题。

听起来你的 yml 文件中存在格式错误。

这类错误往往难以发现和识别。有一些工具可以进行检查。

我通常在添加插件时会复制/粘贴现有插件的一行,然后修改 GitHub URL。这样可以最大限度地降低出错的可能性。

我原本就是这么假设的,起初确实错了。后来我参考了 http://www.yamllint.com/ 来修复因最初将插件文本放错位置而导致的错误,现在它显示完全没问题。我在整个过程中多次检查(包括具体片段和整体内容),它都提示正确。除非该网站因某种原因不准确,而这对我来说是有可能的,毕竟我对这方面并不太了解。

这是我尝试重新构建时得到的结果,随后运行了 discourse doctor(均为五分钟前)。我已删除了个人信息,但在实际日志中所有信息都完整且正确。

rebuild app

确保启动器已是最新版本
正在获取 origin
启动器已是最新版本
正在停止旧容器

  • /usr/bin/docker stop -t 60 app
    app
    cd /pups && git pull && /pups/bin/pups --stdin
    Already up to date.
    I, [2020-07-23T22:58:14.812604 #1] INFO – : Loading --stdin

FAILED

NoMethodError: undefined method each' for nil:NilClass Location of failure: /pups/lib/pups/config.rb:99:in run_commands’
1a575aa2a169fcb4a9bbb0874c55d3fd01ee1e7368ff58e2099c9602f6c32109
** FAILED TO BOOTSTRAP ** 请向上滚动查看更早的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。

discourse-doctor

DISCOURSE DOCTOR Thu Jul 23 22:59:22 UTC 2020
OS: Linux itsbx 4.15.0-111-generic #112-Ubuntu SMP Thu Jul 9 20:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Found containers/app.yml

==================== YML SETTINGS ====================
DISCOURSE_HOSTNAME=good
SMTP_ADDRESS=good
DEVELOPER_EMAILS=good
SMTP_PASSWORD=good
SMTP_PORT=587
SMTP_USER_NAME=good
LETSENCRYPT_ACCOUNT_EMAIL=good

==================== DOCKER INFO ====================
DOCKER VERSION: Docker version 19.03.8, build afacb8b7f0

DOCKER PROCESSES (docker ps -a)

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
343a1aa3c05c local_discourse/app “/sbin/boot” 7 days ago Exited (5) About a minute ago app

==================== SERIOUS PROBLEM!!! ====================
app not running!
Attempting to rebuild
==================== REBUILD LOG ====================
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container

  • /usr/bin/docker stop -t 60 app
    app
    cd /pups && git pull && /pups/bin/pups --stdin
    Already up to date.
    I, [2020-07-23T22:59:41.894064 #1] INFO – : Loading --stdin

FAILED

NoMethodError: undefined method each' for nil:NilClass Location of failure: /pups/lib/pups/config.rb:99:in run_commands’
439734a2cd69755d8351bbdadd9756cb573577d7f1b306aedaafa1c7d4bc29cf
** FAILED TO BOOTSTRAP ** 请向上滚动查看更早的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。
==================== END REBUILD LOG ====================
Failed to rebuild app.

Checking your domain name . . .

Connection to website succeeded.
You should probably remove any non-standard plugins and rebuild.
Attempting to restart existing container. . .

starting up existing container

  • /usr/bin/docker start app
    Error response from daemon: driver failed programming external connectivity on endpoint app (100c15324a128a2b007d8b89e29fe0f455585fd8c7d99855ef87bb4f17892b4b): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
    Error: failed to start containers: app
    Failed to restart the container.

==================== PLUGINS ====================
- git clone GitHub - discourse/docker_manager: Plugin for use with discourse docker image · GitHub

No non-official plugins detected.

See discourse/lib/plugin/metadata.rb at main · discourse/discourse · GitHub for the official list.

========================================
Discourse version at website: NOT FOUND
Discourse version at localhost: NOT FOUND

==================== MEMORY INFORMATION ====================
RAM (MB): 2041

          total        used        free      shared  buff/cache   available

Mem: 1993 140 1310 0 542 1695
Swap: 2047 72 1975

==================== DISK SPACE CHECK ====================
---------- OS Disk Space ----------
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 49G 13G 37G 26% /

==================== DISK INFORMATION ====================
Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3980448C-AF15-4833-A022-C759F0D2D80A

Device Start End Sectors Size Type
/dev/vda1 227328 104857566 104630239 49.9G Linux filesystem
/dev/vda14 2048 10239 8192 4M BIOS boot
/dev/vda15 10240 227327 217088 106M Microsoft basic data

Partition table entries are not in disk order.

==================== END DISK INFORMATION ====================

我立即注意到它显示了“严重问题,app 未运行”以及“网站和本地主机上的 Discourse 版本均未找到”。我(非专业)的假设是,无论这些意味着什么,这就是问题所在。

此外,当我运行重新构建时,我的网站刚刚崩溃了,我执行了“启动 app”来再次修复它。

嗯,看起来不像是格式问题,但我无法确定具体是什么问题。

如果 app.yml 文件让你担心,我认为最好从一个干净的 app.yml 文件重新开始

rm /var/discourse/containers/app.yml
cd /var/discourse
cp samples/standalone.yml containers/app.yml
nano containers/app.yml

确认所有设置无误后,即可重新构建。

这完全奏效了。显然,当时它报告说 YAML 文件是正确的……其实并不是。

随后我遇到了一个临时问题,邮件无法发送。但当我重新检查新的 YAML 文件时,意识到是我把邮箱地址搞错了(我总是忘记在 Mailgun 上设置的是 @mg. 开头……),所以五分钟内就解决了。

啊,太感谢了!现在我不再担心随时会发生毁灭性的灾难了。