使用 Nginx Proxy Manager 管理多个 Discourse 站点

您需要确保两个容器在同一个 Docker 网络上。如果您没有正常运行 NPM,那么您(暂时)没有 Discourse 配置问题。

1 个赞

我错误地忘记了 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

有什么遗漏的吗?

1 个赞

我的 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
1 个赞

你好 @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 来跳过此麻烦。

2 个赞

感谢 @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 可以与我们的服务器通信?

1 个赞

卸载 NPM。NPM 的全部意义在于充当反向代理。如果你不想要反向代理,就把它关掉。

我不太明白你的意思,而且我肯定对此一无所知。你可能应该去看看 NPM 论坛之类的。这与 discourse 无关。

2 个赞

我已经打开了那里;我也在这里讨论过,是的,在玩了两天之后我禁用了它;但我想在这里添加如何使用 Discourse 和 NPM 添加自定义端口支持,因为这个主题仅支持带 NPM 的套接字 nginx;

谢谢。

1 个赞

不。除非你遵循套接字说明,否则它不仅仅支持套接字。它说你不必使用套接字:

当我上次测试时,使用建议的端口可以正常工作。

1 个赞

这些说明帮助我使用 Nginx Proxy Manager 设置了 Discourse。
但是,浏览器在尝试从 http 加载字体和图像时会显示“混合内容”错误。

您可以使用此处的选项“强制 HTTPS”链接:

1 个赞

哇,这是一个相当复杂的主题,有很多的“如果”和“但是”。

今天我也尝试了设置,但很不幸地彻底失败了。说明的初衷是好的,但恕我直言,它们并不那么容易理解/领会。

当我使用 Docker 时,我通常希望容器能够独立/隔离地运行。没有太多的依赖、先决条件和“单点故障”。但这正是这种方法所带来的问题:NPM 是一个很棒的工具。我不明白为什么我必须对它的 Docker 配置进行特殊调整,才能让 Discourse 正常运行并为其提供证书。在家中,我也为我的 DynDNS 域名使用 NPM,以便随时灵活地分配服务和主机。并公开其中一些(Home Assistant、Grafana 等)。

今天我想合并我的两个 Discourse 实例。我特意从 Hetzner/德国租用了一台云服务器。这就是为什么 Discourse 没有预装,因为说明是这样假设的。

我希望 Discourse 默认能官方提供使用 NPM 的安装方式。或者至少不要让 ./discourse-setup 脚本带来这么多麻烦。

1 个赞

安装多个实例的小教程 :disguised_face:

在本例中,我们将从一个全新的服务器安装开始,然后可能需要恢复一个旧实例。

第 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 步:最后,恢复您之前的备份。

1 个赞

我可以使用 Cloudflare Tunnel 组合此域名吗?

1 个赞

当然可以。

请确保您公开了正确的端口,并在 Cloudflare Tunnels 中为您的域名设置了该端口。

我个人不推荐此方案,因为它使我依赖 Cloudflare,并且每个隧道代理都会在我的防火墙上打一个洞 :hole:,这让我感觉像是在安装木马。

防火墙管理对服务器管理员至关重要。在将网站公开到 DMZ 之前,您需要做一些功课。