Discourse改端口教程 :外部 NGINX 代理来控制 HTTP/HTTPS,而不让 Discourse 容器直接绑定 80/443

Discourse + 外部 NGINX + 自定义 SSL + 临时代理

:one: 停止现有容器

cd /var/discourse
./launcher stop app


:two: 修改 Discourse 容器配置

编辑 /var/discourse/containers/app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"  # 使用 Unix Socket

# ❌ 注释掉端口映射
# expose:
#   - "3080:80"
#   - "3443:443"

params:
  db_default_text_search_config: "pg_catalog.english"
  db_shared_buffers: "1024MB"

  # 禁用容器内 SSL
  DISCOURSE_ENABLE_SSL: false
  DISCOURSE_ENABLE_LETSENCRYPT: false

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8



重点:

  • 注释掉 expose

  • 使用 web.socketed.template.yml

  • 禁用容器内 SSL


:three: 重建容器

./launcher rebuild app

此时容器会把 HTTP 服务绑定到 Unix Socket:

/var/discourse/shared/standalone/nginx.http.sock


:four: 安装宿主 NGINX

sudo apt update
sudo apt install nginx


:five: 配置 NGINX 反向代理

创建 /etc/nginx/sites-available/discourse

server {
    listen 3443 ssl;#自己要的端口
    server_name 自己的域名;

    ssl_certificate /var/discourse/shared/standalone/ssl/ssl.cer;
    ssl_certificate_key /var/discourse/shared/standalone/ssl/ssl.key;

    location / {
        proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

启用站点:

sudo ln -s /etc/nginx/sites-available/discourse /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx


完成


起因是别人送了个国内主机 让我给他搭discourse玩

没备案 遂443被封

改用3443端口(这里还得手动调容器内ngix禁用 转到宿主机ngix 异常麻烦)

改了端口之后发现很多功能都能连带着改 自带图墙失效 注册账号失效 甚至logo都加载不出来

建议不要折腾 就专门开个主机默认443使用最好 时间成本太高了

Discourse 本身设计默认 HTTPS 443,很多内部资源、AJAX 请求、WebSocket、上传服务、favicon/logo 都硬编码了 HTTPS + 默认端口。你改成 3443 后,即使 Nginx、Docker 内部映射改了,也会出现各种 ERR_CONNECTION_CLOSED、资源加载失败、注册功能异常等连锁问题

Discourse 的问题就在这里。

和以前用过的 DISCUZ 这样的论坛不一样,你可以在后面用 DISCUZ 跑 8080 端口,前面给个 Nginx 做个反向代理,所有的内容和端口通过 Nginx 控制就行。

甚至 SSL 就可以单独装在 Nginx 上了。

Discourse 是深度绑定 https,而且很多时候都要求必须走 https,在升级或者一些插件安装的时候还是要求走 https 或者 443,这个是写死的。

最好的办法就是国内部署,备案一个,想想办法可能公司主办人出面申请机会大点。

如果实在不行就放外面吧,问题就是担心被 GFW,但只要内容不太过分,GFW 也不一定能够看上你的这个小站。

1 Like

是的 此帖留给后来人 尽量不要改端口

现在没有一锅端全改的脚本 一个个迁太繁琐了

是的。

而且最好就是一台机器部署一个 Discourse 实例。

虽然有想过有一台机器部署多个 Discourse 实例,但因为 443 端口被占用,另外一个实例肯定要改端口。

其实跑起来和维护起来都很麻烦。

在cdn上 比如cloudflare

把回源端口改成3443 应该是可以https吧。

或者干脆直接cf tunnel。

Cloudflare Tunnel 反代应该也可以吧,我还没尝试。

感谢,折腾一下午,用楼主的方案解决了(ai也给出了同样的方案):handshake:

其实除了改端口之外,还可以用CF的tunnel

主要除了挂discourse,我还想使用别的服务,discourse80443端口占了有点烦

大佬有时间可以再分享一下cftunnel方案,学习一下

1 Like

好的,既然有人需要,这周写一个教程出来 只需要自备一个域名就好

1 Like