大家好,
我已经设置了两次 Discourse,一次是在容器中,一次是在虚拟机中,但在这两次安装中,Discourse 都无法访问。我不太确定问题出在哪里。
Discourse 虚拟机:
- 核心数 4
- 内存 6GB
- 存储 50GB
- 操作系统:Ubuntu 22.04.3
干净的 Post OS 安装命令:
apt update -y && apt upgrade -y && apt wget curl zip git docker.io -y && reboot
然后我遵循了以下指南:discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub
完成后,我可以看到容器正在运行,但返回 502 Bad Gateway。
我的设置方式:Nginx 反向代理(包含 SSL)-> VM。这不起作用。
即使我直接将其添加到 hosts 文件中,它也无法加载。
从安装的最后几行可以看到,docker 创建了一个新网络:
DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443
如何让它使用 HOST 机器的 IP?
我不需要另一个网络中的网络。我乐意让 docker 使用 HOST IP,因为这是该 VM 上唯一的服务。
非常感谢任何帮助!
是否有不使用 docker 的官方安装方法?
2 个赞
pfaffman
(Jay Pfaffman)
4
容器是否位于具有公共 IP 的机器上?该公共 IP 是否已分配域名?
您是否运行了 discourse-setup?您是否通过了它检查 DNS 是否有效以及主机是否可用的部分?
您是否运行了大量重建,导致被 Let’s Encrypt 限制了速率,无法分配证书?
不,此计算机已分配本地 IP,流量通过我的防火墙路由到 localIP。这不是问题。
公共 IP 有一个服务器的 A 记录,并且路由正确。forum.somedomain.com 指向正确的服务器。
是的,我已经通过了安装。已 100% 完成(3 次),直到容器正在运行。
它通过了所有域名/DNS 检查。它显示为有效。
不,这无法被速率限制,因为 SSL 证书是通过我的反向代理颁发的。我拥有证书。
此安装已 100% 完成。问题在于 Docker 创建了一个新网络 172.17.0.1,这是不需要的,因为我想使用 HOST 的本地 IP 192.xx.xx.xx。
容器正在运行,但在不同的网络上。我无法将其连接到 HOST IP。
docker 主机应该是服务器的 IP(192.xxx.xxx.xxx),而不是一个新网络。它可能正在工作,但在这个网络上。
我如何告诉安装程序使用我的本地 IP 而不是 172.17.0.1?
@pfaffman 类似这样。来自你的一条评论
如何在安装时设置 ./discourse-setup 使用主机 IP 192.168.1.X 和网络?
pfaffman
(Jay Pfaffman)
7
您不能将 discourse-setup 与反向代理一起使用。您必须自己编辑 yml 文件。有一些关于在同一台机器上运行 discourse 与其他网站的主题。
如果您使用的是执行 SSL 的反向代理,则需要删除 ssl 和 let’s encrypt 模板。
这就是问题所在,我在这台机器上没有运行任何其他服务。它是一个独立的虚拟机。
我认为存在误解。
./docker-setup 安装成功。它为应用程序 172.17.0.1 创建了自己的网络。
如何让安装或 Docker 容器使用主机 IP 192.168.1.X,即使用桥接网络而不是创建自己的网络。
pfaffman
(Jay Pfaffman)
9
但是你说了这个:
如果你在使用反向代理,你就不能使用 discourse-setup。
是的,反向代理在另一台服务器上,但我明白你的意思了。
我有一个想法。我将把我的网络的所有流量路由到 Docker 容器网络。
是否有在 Nginx 反向代理后面运行 Discourse 的安装指南?
或者我是否可以自己构建 Discourse?
Jagster
(Jakke Lehtonen)
11
这很简单。您在 app.yml 中允许 http 端口,Nginx 会将流量发送到那里。并且 SSL 被禁用。这两件事是您需要修复的唯一问题。当然,您必须提供真实 IP,但这每次都必须这样做,无论是后端是 Discourse、Moodle、WordPress 还是其他什么。UFW 试图限制前端和后端之间的访问,因为没有必要允许直接访问后端。
如果我没记错的话,这里有关于如何设置 Apache2 的文档。Nginx 做同样的事情,但当然有它自己的方式。
或者我这次又错过了什么?
1 个赞
让我从头开始,这样您就可以知道我遗漏了什么简单的问题。
我有一个 Nginx 反向代理。它运行并管理公共 IP 并进行服务路由。
例如:客户端请求 cloud.domain.com → Nginx 反向代理(处理 SSL)-> 指向 cloud.domain.com
现在我为 discourse 设置了一个虚拟机,并使用了以下内容:
Ubuntu 23.04。操作系统安装后的命令:
apt update -y \
apt upgrade -y \
apt install wget curl zip git docker.io -y
然后我遵循了 Discourse 的这个指南 discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub
安装成功完成,然后问题就开始了。
由于 docker0 网络,我无法从主机访问 docker 容器。我可以 ping 通 172.17.0.2 并且它正在运行,但从主机 192.168.1.10:80/443 无法将流量传递到容器。
我只想让 docker 容器使用主机网络,因为容器暴露了 80 和 443 端口。
第一个 Nginx 反向代理正确地处理了来自外部的流量并将其传递到 VM。如果不是这样,./discourse-setup 就不会正确地获取域名,并且它将无法为容器检索 SSL 证书。
总之,我知道容器 100% 在工作,只是由于 docker 网络我无法访问它。
如果您需要任何信息,请告诉我。
另一种方法是使用 discourse 基础镜像
https://hub.docker.com/r/discourse/base
并使用 docker compose 等构建自己的编排(请记住,您还需要其他服务,如 redis 和 postgres)
Jagster
(Jakke Lehtonen)
14
我可以使用 Nginx 或 Nginx+Varnish 在同一 VPS 或不同 IP 的 VPS 上为 Discourse 进行此操作。您没有说明您实际如何使用 Nginx 作为反向代理。您的示例有点困难,因为无法知道这些是示例还是您实际上正在尝试使用私有网络。
但是:
当然不会,因为那是处理传入流量的。您必须为后端使用其他端口。
类似这样(实际上与 Varnish 一起使用,但原理完全相同,而且非常基础):
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
proxy_pass_header Server;
明白了,感谢您的具体说明 :)。
我不确定是什么,因为这个 Docker 网络太令人困惑了。
确实如此,这就是我因为 Docker 而感到沮丧的原因 lol
下面是我 WAN 网络如何从我的 nginx 反向代理传递和路由流量到正确主机的确切设置。
map $scheme $hsts_header {
https "max-age=63072000;includeSubDomains; preload";
}
server {
set $forward_scheme https;
set $server "10.10.1.38";
set $port 443;
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name forum.domainname.com;
# Let's Encrypt SSL
include conf.d/include/letsencrypt-acme-challenge.conf;
include conf.d/include/ssl-ciphers.conf;
ssl_certificate /srv/ssl/domainname.pem;
ssl_certificate_key /srv/ssl/domainname-ke.pem;
# Asset Caching
include conf.d/include/assets.conf;
# Block Exploits
include conf.d/include/block-exploits.conf;
# HSTS (需要 ngx_http_headers_module) (63072000 秒 = 2 年)
add_header Strict-Transport-Security $hsts_header always;
# Force SSL
include conf.d/include/force-ssl.conf;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
access_log /var/logs/domainname-access.log proxy;
error_log /var/logs/domainame_error.log warn;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
# HSTS (需要 ngx_http_headers_module) (63072000 秒 = 2 年)
add_header Strict-Transport-Security $hsts_header always;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
# Proxy!
include conf.d/include/proxy.conf;
}
}
奇怪的是,我曾经为一位想要 nginx 反向代理管理器(nginx reverse proxy manager)的客户设置过一个 Docker 容器,它非常简单。
docker-compose up -d
就是这样。私有 IP 192.168.1.3 可以访问容器暴露的 80/443 端口,并且出站流量被正确路由到 192.168.1.3。
Jagster
(Jakke Lehtonen)
16
它之所以令人困惑,是因为它是一个在自己的沙盒中运行的打包系统。基本上就是这样。
但是理解 Docker 和使用 Docker 是两回事(现在有一群开发者开始哭了
)。你的反向代理通过防火墙将流量发送到 IP 地址,你必须告知该 IP 地址和监听端口。然后你在这个 IP 地址上运行 Discourse,也就是 Docker,以及你在 app.yml 中指定的端口。内部的 Nginx 会处理剩下的事情,它与 Discourse 本身协同工作。
Discourse 不应该监听 443 端口,因为你已经终止了 SSL。
而且你基本上不能在反向代理上使用缓存。后端 Discourse 不是一个网页。它是一个发送 JavaScript 和 JSON 的 Web 应用程序。
我大概明白了。
这点我倒是可以同意。我倒不至于说是哭泣,只是对于那些真正懂 Linux 的系统管理员和开发者来说,它毫无用处。创建一个 LxC 或 VM 来隔离环境,然后再让 Docker 创建另一个隔离的环境,这是多余且毫无意义的。
这部分令人困惑。app.yml 在 172.17.0.2 上暴露了 80:80 和 443:443,该 IP 地址位于 Docker 网络 172.17.0.1/16 中,而 VM 的 IP 地址是 10.10.1.38。
如何让 Discourse/Docker 允许所有进入 10.10.1.38 的流量被传递到 172.17.0.2,并且所有传出的流量都必须被传递到 10.10.1.38?解决这个问题只需要这些。字面意思。
我的反向代理将处理从 WAN 到 forum.domainname.com 的路由。
缓存已被移除。
1 个赞
Jagster
(Jakke Lehtonen)
18
仅当您不更改它们时。您应该只使用一个端口。
80:80 和 443:443 是默认设置,仅在没有反向代理或其他作为前端的设备时使用。
1 个赞
你给了我一个主意。
我一直在检查所有的基础文件,我想我已经明白了。
太简单了,哈哈。我正在忙着重建,这可能会100%奏效,使用标准的官方支持的安装方法。
@pfaffman 您可以将此移至安装,因为它现在是受支持的安装。
Jagster
(Jakke Lehtonen)
22
它在那里。它只是被标记为不支持 
你最初的问题是什么,为什么你没有在没有反向代理的情况下开始安装?我只是好奇。