使用 Let's Encrypt 设置多个域名 / 重定向

您好 @pfaffman,原始帖子中的编辑在 to: 行有一个错误的 +,这会破坏正则表达式。应该将其删除。

另外,以下段落需要编辑,因为它不再有意义:

需要替换两个模式,一个以 --keylength 结尾,另一个以 --fullchainpath 结尾(在实际文件中,您的原始域名在这些开关之前)。输入您的(子)域名(以及任何以 -d 开头的附加子域名),然后将以下内容添加到 app.ymlhooks 部分(在文件末尾附近):

我建议:

在此帖子中使用 domain1 和 domain2 来生成您需要的代码。domain1 是您的原始域名,domain2 是您要添加的附加域名。将生成的 after_ssl: 块添加到 app.yml 的 hooks: 部分,然后执行 launcher rebuild app

1 个赞

哎呀。我删除了+号并调整了文本。我稍后在电脑旁再看看。

@textkit,这是一个维基,所以如果你愿意,可以进行进一步编辑。

自上次更新到 3.5.0.beta8-dev 以来

/etc/runit/1.d/letsencrypt

在 docker 容器中丢失了。所以它无法构建。解决方法:https://www.forcewww.com/

因此,这停止工作了:

## 为非 www 和 www 域名添加 Let's Encrypt 证书
  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d example.de -d www.example.de --keylength"

在从 Docker 容器中删除此类工具/二进制文件之前,最好能收到通知……

4 个赞

这是 Discourse 处理 LetsEncrypt 的方式的更改,还是 LetsEncrypt 本身的更改?

我现在有一台服务器因这个问题而出现故障。目前我的解决方法是注释掉 app.yml 的那部分,但我认为将来我们需要某种方式将这些附加证书添加到设置中。

2 个赞

Discourse 已将该内容移至另一个文件。目前正在处理中。我将在未来几天内尝试查看需要做什么才能支持多个子域。

2 个赞

我编辑了 OP(原始帖子)并使用了一个新模板,但尚未进行测试。

1 个赞

不,这行不通:

失败

Errno::ENOENT: No such file or directory @ rb_sysopen - /usr/local/bin/letsencrypt
失败位置:/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/replace_command.rb:11:in `read’
replace failed with the params {“filename”=>“/usr/local/bin/letsencrypt”, “from”=>“/-d spokes.nz/”, “to”=>“-d spokes.nz -d www.spokes.nz”}
bootstrap failed with exit code 1
引导失败 请向上滚动并查找更早的错误消息,可能不止一个。

2 个赞

太早了。

也许可以尝试将替换放在ssh内容曾经存在于底部的节中,如果这说得通的话(我在手机上,我明天会尝试查看)。

1 个赞

您好 @nathank

我猜想您遇到的错误可能与您的 app.yml 文件中建议的诗节的最后一行末尾的斜杠和引号前缺少空格有关?

我从错误消息推断出您的相应行是(逐字)

from: /-d spokes.nz/
to: “-d spokes.nz -d www.spokes.nz”

我之所以这么说,是因为在我的例子中,这些行是

from: /-d nzarchitecture.net.nz /
to: "-d nzarchitecture.net.nz -d www.nzarchitecture.net.nz "

并且在每行末尾都有空格,如所示,我现在可以重建 Discourse 而不会出现该错误。(如果您仔细看,您会发现 @pfaffman 在此线程开头发布的更新后的诗节确实显示了那些额外的空格)。

正如您在错误消息中提到的,我的 usr/local/bin/ 目录中也完全没有任何文件,这让我怀疑缺少该 letsencrypt 文件并不是触发错误的原因。

话虽如此,虽然 Discourse 在其网址 nzarchitecture.net.nz 上运行正常,但不幸的是,如果我在浏览器中输入 www.nzarchitecture.net.nz,我仍然会收到证书错误 - 我不知道这是否是由于缺少该文件造成的。

2 个赞

我只是注意到我目前正在尝试将此内容滚动到环境变量中,以便直接在 discourse_docker 中处理,例如逗号分隔的主机名别名列表。这似乎是一个足够常见的用例,可以直接处理。

这将使此情况的配置更加容易,因此没有人需要修改他们的 app.ymls

我目前的计划是使用 DISCOURSE_HOSTNAMEwww.domain.com

允许使用类似的环境变量:
DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com 将会拉取证书,适用于所有主机名。

(在我进行此操作时,Let’s Encrypt 的自动续订似乎也没有正常工作,所以我也在修复那些问题)

8 个赞

太棒了!非常感谢。这肯定会让事情变得更容易!

3 个赞

我错过了!我按照你的建议做了,但仍然引导失败:

失败

Errno::ENOENT: No such file or directory @ rb_sysopen - /usr/local/bin/letsencrypt
失败位置:/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/replace_command.rb:11:in `read’
replace 失败,参数为 {“filename”=>“/usr/local/bin/letsencrypt”, “from”=>“/-d spokes.nz /”, “to”=>"-d spokes.nz -d www.spokes.nz "}
bootstrap 失败,退出代码为 1
引导失败 请向上滚动并查找更早的错误消息,可能不止一个。

太棒了!!!

3 个赞

这可能不是问题的核心,但在我摸索的过程中,我还将 Digital Ocean 上运行的 Docker 版本从(我认为是)20.0.4 更新到了 28.3.3 - 也许这有所帮助,至少解决了这个错误。如果别的没有帮助,至少它消除了我在重建过程开始时收到的 Docker ‘已弃用’警告。

1 个赞

您需要删除尝试修改 Let’s Encrypt 文件的部分,并等待 PR 被接受。

2 个赞

我明白了!幸运的是,我使用的是两个容器的安装,所以这没什么大不了的。

到目前为止,这有什么进展吗?

1 个赞

是的,我有一个待审核的拉取请求:

4 个赞

大家好,跟进一下,多域名现已合并——在最新版本的 discourse_docker 中,您可以包含 ssl 和 letsencrypt 模板,并设置 DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com 形式的环境变量来设置备用主机名。

您的站点将在证书请求时额外拉取配置的主机名,无需其他配置更改。

4 个赞

[quote=“featheredtoast, post:172, topic:56685”]您现在可以包含 ssl 和 letsencrypt 模板,并设置形式为 DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com 的环境变量来设置备用主机名。

[/quote]

请原谅我的无知,但这是可以通过站点设置进行编辑,还是需要编辑 app.yml 中的内容?

如果是前者,我在更新到最新版本后找不到它,如果是后者,app.yml 中应该具体调整什么?

它放在 app.yml 中。它不由 Discourse 处理,而是由容器中的 NGINX 处理,并且无法访问 Discourse 数据库。

它放在 ENV 部分

env:
   DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com

您只需包含您希望用户能够链接到并重定向到您网站实际主机名的其他域。

3 个赞

太好了——一切都正常了,谢谢!

如果有一种巧妙的方法可以让 Discourse 在下次更新时将管理员提供的别名写入 app.yml 本身,或者将信息保留在 app.yml 指令可以读取的地方,那就更好了。

2 个赞