您需要确保两个容器在同一个 Docker 网络上。如果您没有正常运行 NPM,那么您(暂时)没有 Discourse 配置问题。
我错误地忘记了 MariaDB Docker 网络;但在添加
network_mode: bridge
后,我仍然收到 npm 连接到 Discourse 数据库的错误;
environment:
DB_MYSQL_HOST: "172.17.0.2" #数据容器 - 但启用时我收到错误 ( error connect ECONNREFUSED 172.17.0.2:3306 )。
# DB_MYSQL_HOST: "db" 默认 npm 数据库 (在 discourse 外部)。
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "h4xb0xr1z__0k"
DB_MYSQL_NAME: "npm"
当 npm 和 Maria 启动并运行时;Maria 的日志是好的……但 npm
error connect ECONNREFUSED 172.17.0.2:3306
有什么遗漏的吗?
我的 docker-compose 文件
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
network_mode: bridge
restart: unless-stopped
ports:
- '80:80' # 公共 HTTP 端口
- '443:443' # 公共 HTTPS 端口
- '81:81' # 管理员 Web 端口
environment:
DB_MYSQL_HOST: "172.17.0.2" # 数据容器 - 但启用时我收到错误 ( connect ECONNREFUSED 172.17.0.2:3306 )。
# DB_MYSQL_HOST: "db" 默认 npm 数据库 (discourse 外部)。
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "mypassword"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
# depends_on:
# - db
db:
image: 'mariadb:latest'
restart: unless-stopped
network_mode: bridge
environment:
MYSQL_ROOT_PASSWORD: 'mypassword'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'mypassword'
volumes:
- ./data/mysql:/var/lib/mysql
我正在运行 discourse,数据 + 仅 Web;npm 和 maria 之后的 IP 映射如下:
数据容器 IP:172.17.0.2
仅 Web 容器 IP:172.17.0.3
npm 容器 IP:172.17.0.5
maria 数据 (npm) IP:172.17.0.4
你好 @tophee
你能否就使用 NPM 和 SQLite 给出你的建议?因为与 mariadb 的问题相比,它更容易且更值得信赖。
我已经设置好了 NPM 和 SQLite,并且一切正常,包括 nginx 虚拟主机、ssl 等。但是,我想确保如何将 discourse 的数据库与 NPM 连接起来?因为我在使用 discourse 网站设置 NPM 时遇到了 502 错误。
我的 docker-compose
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
network_mode: bridge # -- 此网络已添加,以便 NPM 与 discourse 位于同一网络中,现在它们可以互相看到。
ports:
# 公共 HTTP 端口:
- '80:80'
# 公共 HTTPS 端口:
- '443:443'
# 管理员 Web 端口:
- '81:81'
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
不,我的建议是使用 NPM 的标准设置,除非您知道自己在做什么。这就是我使用标准设置的原因。
如果您通过 websocket 连接 discourse 容器,则不需要第 3 步。
这是因为
您确定 172.17.0.2 是您的 db 容器吗?- 无论如何:您可以通过让 NPM 保持在自己的网络上并通过 web socket 连接 discourse 来跳过此麻烦。
感谢 @tophee 的澄清,我已经完成并纠正了所有问题,但似乎我没有使用 websocket,而是专注于 npm 设置和 discourse 容器的端口;
我使用 NPM 时遇到的问题是 CloudFlared Argo 隧道,在完成 NPM、SSL 等所有设置后,我设法运行了 CloudFlared argo 隧道,但问题是 CloudFlared 不能作为辅助代理运行,我们需要禁用 NPM 来放在源 Web 前面;我从 CloudFlare 收到的错误是:
错误 1000:DNS 指向禁止的 IP
在 Cloudflare 上搜索此错误后,它给了我这个:
您的源站存在一个反向代理,它将请求发送回 Cloudflare 代理。请勿使用反向代理,请联系您的托管提供商或站点管理员在源站配置 HTTP 重定向。
我们如何禁用 NPM 作为反向代理?
我的目的是在安装和运行 NPM 的同时,让源 IP 在没有 NPM 的情况下工作;以便 Cloudflared 可以与我们的服务器通信?
卸载 NPM。NPM 的全部意义在于充当反向代理。如果你不想要反向代理,就把它关掉。
我不太明白你的意思,而且我肯定对此一无所知。你可能应该去看看 NPM 论坛之类的。这与 discourse 无关。
我已经打开了那里;我也在这里讨论过,是的,在玩了两天之后我禁用了它;但我想在这里添加如何使用 Discourse 和 NPM 添加自定义端口支持,因为这个主题仅支持带 NPM 的套接字 nginx;
谢谢。
不。除非你遵循套接字说明,否则它不仅仅支持套接字。它说你不必使用套接字:
当我上次测试时,使用建议的端口可以正常工作。
这些说明帮助我使用 Nginx Proxy Manager 设置了 Discourse。
但是,浏览器在尝试从 http 加载字体和图像时会显示“混合内容”错误。
您可以使用此处的选项“强制 HTTPS”链接:
哇,这是一个相当复杂的主题,有很多的“如果”和“但是”。
今天我也尝试了设置,但很不幸地彻底失败了。说明的初衷是好的,但恕我直言,它们并不那么容易理解/领会。
当我使用 Docker 时,我通常希望容器能够独立/隔离地运行。没有太多的依赖、先决条件和“单点故障”。但这正是这种方法所带来的问题:NPM 是一个很棒的工具。我不明白为什么我必须对它的 Docker 配置进行特殊调整,才能让 Discourse 正常运行并为其提供证书。在家中,我也为我的 DynDNS 域名使用 NPM,以便随时灵活地分配服务和主机。并公开其中一些(Home Assistant、Grafana 等)。
今天我想合并我的两个 Discourse 实例。我特意从 Hetzner/德国租用了一台云服务器。这就是为什么 Discourse 没有预装,因为说明是这样假设的。
我希望 Discourse 默认能官方提供使用 NPM 的安装方式。或者至少不要让 ./discourse-setup 脚本带来这么多麻烦。
安装多个实例的小教程 
在本例中,我们将从一个全新的服务器安装开始,然后可能需要恢复一个旧实例。
第 0 步:备份!!!
下载备份。稍后您将需要它。
第 1 步:NGINX 代理管理器
mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
nano docker-compose.yml
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80' # http / reserved!
- '81:81' # web-admin port
- '443:443' # https / reserved!
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
最后运行:docker-compose up -d
(对于像我有时一样懒惰的人,只需使用 casaOS(使用非 80/81/443 端口)。只需确保您使用安全的登录凭据和一个带有 SSL 证书的额外代理主机以增加安全性。如果您知道自己在做什么,甚至可以设置一些防火墙规则。)
第 2 步:在 Ubuntu 服务器上安装 Docker
sudo apt update && apt upgrade -y
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io
第 3 步:Discourse 安装准备
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app1.yml
nano /var/discourse/containers/app1.yml
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
nano /var/discourse/containers/app2.yml
对您的 app.yml 文件进行任何必要的更改。这包括为每个实例公开不同的端口(是的,您甚至可以将其用于维护)、邮件设置等。
例如,app1 使用端口 8080/1443,app2 使用端口 8081/2443 用于 http/https。
/var/discourse/launcher rebuild app1
/var/discourse/launcher rebuild app2
第 4 步:最后但同样重要的是配置 NGINX 代理管理器
观看此视频以基本了解如何使用 NGINX 代理管理器。
您需要做的就是将您的代理主机条目指向每个实例(http 端口,例如 8080 和 8081,使用您的本地或公共 IP,这取决于您),您将能够为每个实例和域获取免费的 Let’s Encrypt 证书。只需确保启用强制 SSL 等。
第 5 步:完成。喝杯咖啡。
在我的情况下,它工作得很完美。
预装的软件依赖项可能存在一些小问题,但我相信您会找到解决方案。不要因为我关于 casaOS 的建议而生气。但对于喜欢摆弄服务器、以易于使用、安全可靠的方式利用所有可用资源的人来说,我相信您会发现这个 Docker 管理很有趣。
第 6 步:最后,恢复您之前的备份。
我可以使用 Cloudflare Tunnel 组合此域名吗?
当然可以。
请确保您公开了正确的端口,并在 Cloudflare Tunnels 中为您的域名设置了该端口。
我个人不推荐此方案,因为它使我依赖 Cloudflare,并且每个隧道代理都会在我的防火墙上打一个洞
,这让我感觉像是在安装木马。
防火墙管理对服务器管理员至关重要。在将网站公开到 DMZ 之前,您需要做一些功课。
