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 也不一定能够看上你的这个小站。

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

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

是的。

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

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

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

在cdn上 比如cloudflare

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

或者干脆直接cf tunnel。

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

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

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

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

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

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