calmh
(Jakob Borg)
1
我们有一个 Discourse 安装,已运行多年,目前使用最新 Docker 镜像升级到最新版本(2.4.0beta2),部署在公网 IP 上,前面没有代理或其他中间层,使用 LetsEncrypt 证书。
有时用户注册 IP 和最后登录 IP 显示正常,有时则不然,看不出任何规律。例如,这是一个 7 小时前 创建的用户,其地址信息毫无意义:
另一个 17 小时前 创建的用户则完全正常:
情况就是这样:有些用户显示正常,有些则不然。大家有什么想法吗?
我现在注意到一个现象:这些用户可能是通过 IPv6 访问的,因为我从未在这些字段中看到过 IPv6 地址。Discourse 是否不支持 IPv6?Docker 代理是否无法理解或传递相关信息?还是其他原因?
Discourse 完全支持,但你需要配置你的服务器以及其前面的所有组件,以确保 IPv6 能够正常工作等。
calmh
(Jakob Borg)
3
IPv6 功能非常完善,我们使用的是推荐的 Docker 镜像,并配合 web 和 data 模板进行配置。前端没有其他组件。我们还需要调整哪些地方?
需要注意的是,我们的容器 yml 文件已经存在好几年了,虽然它包含了最新的模板,且镜像本身也频繁重建。这是否可能是随着时间推移发生的变化?
calmh
(Jakob Borg)
4
看起来其他运行默认 Docker 设置的用户也遇到了同样的问题。
https://meta.discourse.org/t/why-are-my-301-redirects-not-working-ipv6-users-also-show-as-localhost/80442/9
很难说。我刚刚审计了在 talk.commonmark.org 注册的最近约 8 位新用户,这是一个非常标准的默认安装,他们的“最后登录 IP
不,它们都不是,但我不确定这个托管服务商是否支持 IPv6。
calmh
(Jakob Borg)
8
那么我确信它不会出现针对通过 IPv6 访问的用户显示 localhost 而非 IPv6 地址的问题。但这并不意味着该问题不存在。
在 Discourse 官方托管服务上并不存在此问题,至少该服务支持 IPv6。在随机托管商处的标准安装中,我也未发现类似问题。除了您未回答我那个相当重要的问题外,我不知道还能说什么。
calmh
(Jakob Borg)
10
啊,是的,那些是普通注册,没有单点登录(SSO)或关联账户。
我不怀疑它在你的托管环境中能运行,但你使用的并不是大多数用户采用的“标准”Docker 配置,对吧?我的意思是,在代理正确设置头部等条件的情况下,我确信它有可能运行,问题在于默认配置是否如此,如果不是,我们能否让它实现这一点。
pfaffman
(Jay Pfaffman)
11
我很确定你需要在 app.yml 中添加一些配置,让 Nginx 能够识别你的 IPv6 地址并透传客户端地址。不过我自己也还没弄明白具体该怎么做。关于运行反向代理的帖子中有 IPv6 示例,可以提供一些线索。
这确实列在了我要解决的问题清单上,但我的清单实在太长了。最终我选择禁用 IPv6,我想可能是因为这个问题,但也可能是由于我对 IPv6 的其他不了解之处。
(Jeff,你可以申请一个被路由的 IPv6 地址段,但需要主动申请,然后配置你的主机以使用它。)
Falco
(Falco)
12
Meta 只是一个标准的 Docker 安装,搭配外部反向代理,并且对 IPv6 支持极佳:
pfaffman
(Jay Pfaffman)
13
你的 discourse.conf 中是否有部分配置指示它使用你的 IPv6 地址执行 set_real_ip?类似如下内容:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 172.18.0.0/24;
set_real_ip_from 172.17.0.0/24;
set_real_ip_from <SOME_IP_V6_ADDRESS_THING_HERE?>
real_ip_recursive on;
real_ip_header X-Forwarded-For;
types {
calmh
(Jakob Borg)
14
我认为外部反向代理是关键——仅从 Docker 容器内部根本无法解决此问题,或者至少无法轻易解决。
我现在的解决方案是让 Discourse Docker 监听一个 Unix 套接字,并在同一台机器上(在 Docker 外部)用 Caddy 作为前端。Caddy 的配置非常简单,已包含 Let’s Encrypt,现在 IPv6 也能按预期工作了。
forum.example.com {
proxy / unix:/var/discourse/shared/web-only/nginx.http.sock {
transparent
websocket
}
}