Discourse-app 容器启动后无声停止

尊敬的社区成员:

我尝试按照 discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub 上的官方说明安装 Discourse 的私有实例。尽管脚本看起来非常复杂,但我不得不手动修改 container.yml 和 discourse-setup 文件来设置我自己的配置……

第一个问题:尽管安装脚本很复杂,但它不允许修改暴露的端口!端口 80/443 在我的服务器上无法使用,因为它们已被 nginx 使用。因此,我不得不再次调整设置脚本,将端口 3080/3443 设置为访问 Discourse 所需的端口。

然后,我设法让所有容器都正常运行。通过 Portainer 查看堆栈时,我发现应用程序启动后会悄无声息地停止,并且日志没有提供太多关于原因的信息。由于 redis 和 postgres 没有发布任何端口,Discourse 应用程序是否会因为无法连接到这些组件而失败?我错过了什么或者做错了什么?

_discourse-app_logs.txt (10.4 KB)

提前感谢您的任何帮助!

Caused by:

Errno::EADDRNOTAVAIL: Cannot assign requested address - connect(2) for [::1]:6379

所以它无法连接到 IPv6 回环地址上的 Redis。

理查德您好,感谢您的快速回复!我不是 IT 专业人士,只是喜欢摆弄工具:这个问题该如何解决?

先谢谢您的建议!

您似乎通过为 Redis 和 Postgres 设置单独的容器偏离了标准安装,因此恐怕我无法立即为您提供答案。您是如何在 Discourse 中配置 Redis 设置的?

另外,我确实看到了 redis:4-alpine。恐怕您需要迁移到新版本的 Redis,因为 Discourse 要求版本 6.20 或更高版本。不过,我认为这并不是您问题的根源。

2 个赞

安装脚本仅适用于标准安装。如果您要进行更复杂的设置,则必须手动编辑 yml 文件。这比修改脚本要简单得多。

Discourse 不能在非标准端口上运行。您需要在前面设置一个反向代理。请参阅诸如在运行 Discourse 的同一台机器上运行其他网站之类的帖子。

如果您不打算使用提供的 postgres 和 redis,那么您需要自己找出原因。可能的原因太多,我们无法猜测或推断。我建议在单独的虚拟机上进行标准安装,以了解其工作原理,然后再尝试非常复杂的设置。

3 个赞

我没有执行任何“非标准”安装!我已按照文档中的说明,从 Github 下载了所有内容,仅更改了暴露的端口并运行了脚本:

  • 我没有更改 redis 配置,也没有更改 postgres。
  • 我没有更改 redis 版本。
    这些软件已由正版的 discourse-setup 脚本安装。

@pfaffman 你的意思是“手动编辑 yml”?你说的是哪个 yml?“containers”目录里有很多 .yml 文件……

顺便说一句,我确实有一个反向代理在服务器上,它似乎有一个简单的配置:多个 subdomain.conf 文件定义了重定向 subdomain:80 → 端口 XXX。这是必需的吗?

我建议在单独的虚拟机上进行标准安装,看看它是如何工作的,然后再尝试非常复杂的设置。

我不想进行复杂的设置😊,我只需要让 Discourse 与其他容器一起运行,而这正是 Docker 的设计用途……

再次感谢你的帮助!

通常 discourse-setup 不会安装单独的 postgres 和 redis 实例,当然也不会安装 12 和 4 版本。

您能否发布您的配置以及您对 container.yml 和脚本所做的更改?请确保删除任何机密设置。
另外,请告知您使用的 discourse_docker 存储库的提交版本。

3 个赞

您修改了 discourse-setup 和一个将在您更新 discourse-docker 时被覆盖的文件。更改 app.yml 以外的任何内容都绝对是非标准的。

为什么?无论您需要更改什么,都不是这样做的。您需要将这些更改放入您的 app.yml

Discourse 在非标准端口上无法工作,因此这不是标准安装。

标准安装包括单个容器中的 postgres 和 redis。如前所述,您使用的是不受支持的 redis 和 postgres 版本。您也可以按照此处所述进行双容器安装 从独立容器迁移到单独的 Web 和数据容器(您可以使用 ./discourse-setup --two-containerdiscourse-setup 创建单独的数据和 Web 容器,尽管维护起来有点复杂(您必须知道何时更新数据容器)。

1 个赞

好的,那么我需要:

  • 擦除用修改过的脚本安装的所有软件(希望这很容易恢复)。
  • 重新下载脚本。我当前安装使用的是 git clone https://github.com/discourse/discourse_docker.git /var/discourse:这样可以吗?
  • 在运行 ./discourse-setup 之前,可能只在 app.yml 文件中更改一些设置。
  • 运行标准安装的安装脚本(我更喜欢单个容器)。
  • 设置 nginx 代理,将 discourse.example.com:80/443 路由到正确的容器。文档对此部分有提示吗?

如果我遗漏了任何步骤,请补充列表!

再次感谢您的帮助!

:white_check_mark:

请参阅 Run other websites on the same machine as Discourse

2 个赞

它只会安装 docker。

看起来不错。

app.yml 是由 discourse-setup 创建的。如果它无法访问端口,您将无法运行 discourse-setup,但如果您阅读了源代码,您会发现您可以运行 ./discourse-setup --skip-connection-test 并继续运行。

您的 nginx 将负责 let’s encrypt,因此您需要注释掉 let’s encrypt 模板。我怀疑这在上面和下面的反向代理主题中已经描述过了。

请参阅 使用 Nginx Proxy Manager 管理 Discourse 的多个站点在与 Discourse 相同的机器上运行其他网站(已链接)。

1 个赞

您好 @pfaffman

阅读有关在同一台机器上运行其他网站与 Discourse 的文档,我需要一些确认:

  • 该帖子写道:

如果另一台服务器正在使用端口 80 或 443,则无法使用 ./discourse-setup 来设置 Discourse。您需要使用您喜欢的文本编辑器复制并编辑 samples/standalone.yml

我理解我需要在运行 discourse-setup 之前修改 app.yml,正如序言中所述:

如果另一台服务器正在使用端口 80 或 443,则无法使用 ./discourse-setup 来设置 Discourse。您需要使用您喜欢的文本编辑器复制并编辑 samples/standalone.yml

您能否确认以下流程:

  • 从 Github 下载所有内容
  • 使用选项 --skip-connection-test 运行 discourse-setup 一次 → 这将创建 containers/app.yml
  • 按照上面文档中的描述修改 app.yml
  • 使用 /var/discourse/launcher rebuild app 更新软件
  • 创建指向 Discourse 套接字的 nginx 站点并重启 nginx
  • 最后,在浏览器中访问 https://discourse.mydomain.com 来访问 Discourse,该地址仅指向服务器 IP。

提前感谢您的建议!

更新:

  • 从 Github 下载所有内容:完成
  • 使用 --skip-connection-test 选项运行 discourse-setup 一次:一切顺利,直到脚本返回
docker: Error response from daemon: driver failed programming external connectivity on endpoint app (784361985c928eb26b149d829f37882056562d9b1e77ef4ce71fbfe30c5d80b1): Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.

在我看来,这很正常,因为容器试图访问与现有网络服务器相同的端口。但是,由于没有创建 discourse 容器(如 docker container ls 返回的那样),我想在你继续进行 nginw 配置之前确认这一点……

提前感谢你的帮助!

我认为您需要注释掉这些端口。

您是指“在运行 discourse-setup 之前”吗?如果是这样,我应该修改哪个文件,因为在运行脚本之前 app.yml 不存在?我想安装一个单容器应用程序:我应该再次运行相同的 discourse-setup 脚本还是 /var/discourse/launcher rebuild app 命令?

顺便问一下,我上面的过程是否正确?

使用 nano 或类似工具编辑现有文件并注释掉端口。./launcher rebuild app

在您的情况下,可能还可以使用 --skip-rebuild,因此您将运行:

./discourse-setup --skip-connection-test --skeip-rebuild
nano containers/app.yml
./launcher rebuild app

抱歉打扰您,我需要百分之百确定,因为我绝对不是专家 :wink:

  • 再次运行 ./discourse-setup --skip-connection-test --skip-rebuild(上次运行没有使用 --skip-rebuild 选项)。我不需要删除上次运行已安装的内容
  • 然后我编辑现有的 app.yml 文件并注释掉端口(它们已经被注释掉了)
  • 然后我运行 ./launcher rebuild app

再次感谢您的时间!

您再也不需要运行 discourse-setup 了(除非您更改了内存量,并希望它将内存设置更新为默认推荐设置)。

只需编辑端口并重新构建。

你好 Jay,

这是今天早上重建的结果:

  • ./launcher rebuild app = OK,有一些警告,但 Docker 说 local_discourse/up 正在运行。
  • 我已按照 Run other websites on the same machine as Discourse 中的说明设置了 Nginx 站点并重新启动了 Nginx = OK。
  • 我已设置 DNS 条目,使 discourse.mydomain.com 指向服务器 IP 地址 = OK。
  • 在浏览器中打开 discourse.mydomain.com 会带我到……服务器上运行的 Nextcloud 实例。看起来应该修复配置,因为流量没有正确路由到 Discourse 容器……

我不想安装 NPM,因为我读到它不是一个健壮的工具,而且 Discourse 的配置涉及硬编码 IP:我应该安装吗?

提前感谢您的建议!

所以这听起来像是你 Discourse 安装前面的反向代理 nginx 的问题。

等等……什么?为什么你需要在容器外安装 NPM?

2 个赞