用aapanel或者宝塔搭建Discourse论坛,坑很多

在 aaPanel(宝塔国际版/国内版同理)上搭建 Discourse 是一个稍微有点“进阶”的操作。

核心难点在于: Discourse 官方强制推荐 Docker 安装,并且默认想独占 80 和 443 端口。而 aaPanel 的 Nginx 已经占用了这些端口。

解决方案: 我们让 Discourse 的 Docker 容器运行在非标准端口(例如 8088),然后利用 aaPanel 的 Nginx 建立一个反向代理指向它。

以下是保姆级教程:


第一步:准备工作

  1. 服务器配置: 建议 2GB 内存 以上(如果只有 1GB,必须设置 2GB 的 Swap 交换分区,否则安装时 100% 会内存溢出报错)。

  2. 系统环境: 建议 Ubuntu 20.04+ 或 Debian 10+(CentOS 安装 Docker 可能会有奇奇怪怪的问题,但也能用)。

  3. SMTP 服务: Discourse 必须要配置邮件发送服务(如 Mailgun, SendGrid, 阿里云邮件推送等)才能注册管理员账号,这是强制的


第二步:在 aaPanel 安装 Docker

  1. 登录 aaPanel 面板。

  2. App Store 搜索 Docker

  3. 点击安装(Install),等待安装完成。

  4. 确保 Docker 服务显示为“Running”。


第三步:在 aaPanel 创建网站

我们需要先建立一个空网站,用来管理 SSL 证书和反向代理。

  1. 点击 WebsiteAdd site

  2. Domain name: 填写你的论坛域名(例如 bbs.example.com)。

  3. PHP version: 选择 Pure Static (纯静态) 即可,因为 Discourse 不用 PHP。

  4. Database: 不需要创建。

  5. 提交创建。

  6. 设置 SSL:点击网站设置 → SSL → 选择 Let’s Encrypt → 申请并开启 HTTPS(右上角 Force HTTPS 最好也打开)。


第四步:安装 Discourse (命令行操作)

现在需要通过 SSH 连接到你的服务器(使用终端工具或 aaPanel 自带的 Terminal)。

  1. 创建 Discourse 目录并下载程序:

    codeBash

    sudo -s
    mkdir /var/discourse
    git clone https://github.com/discourse/discourse_docker.git /var/discourse
    cd /var/discourse
    
  2. 配置安装文件:

    Discourse 默认提供了一个安装脚本,我们需要编辑它。

    codeBash

    cp samples/standalone.yml containers/app.yml
    nano containers/app.yml
    

    (如果没有 nano,可以用 vi 或 vim)

  3. 关键修改点 (非常重要,请仔细看):

    在编辑器中,你需要修改以下几处:

    • 注释掉 SSL 模板 (因为 SSL 由 aaPanel 托管):
      找到 templates 区域,把包含 web.ssl.template 和 web.letsencrypt.ssl.template 的行前面加 # 注释掉。

      修改后看起来像这样:

      codeYaml

      templates:
        - "templates/postgres.template.yml"
        - "templates/redis.template.yml"
        - "templates/web.template.yml"
        - "templates/web.ratelimited.template.yml"
      ##  - "templates/web.ssl.template.yml"  <-- 注释掉这行
      ##  - "templates/web.letsencrypt.ssl.template.yml" <-- 注释掉这行
      
    • 修改端口映射 (避免和 aaPanel 冲突):
      找到 expose 区域,把 80:80 改成其他端口,比如 8088:80。同时注释掉 443。

      修改后看起来像这样:

      codeYaml

      expose:
        - "8088:80"   # 主机端口8088 映射到 容器端口80
      # - "443:443"   # 注释掉443,不需要容器处理HTTPS
      
    • 配置环境变量
      向下拉,找到 env 区域:

      • DISCOURSE_DEVELOPER_EMAILS: 填你的管理员邮箱。

      • DISCOURSE_HOSTNAME: 填你的域名(bbs.example.com)。

      • 邮件配置 (SMTP): 必须填对,否则收不到验证码。

        • DISCOURSE_SMTP_ADDRESS: 你的 SMTP 服务器地址

        • DISCOURSE_SMTP_PORT: 端口 (通常 587)

        • DISCOURSE_SMTP_USER_NAME: 你的邮箱账号

        • DISCOURSE_SMTP_PASSWORD: 邮箱密码

  4. 保存退出:
    (如果是 nano,按 Ctrl+O 回车保存,Ctrl+X 退出)。


第五步:编译并启动 Discourse

在 /var/discourse 目录下执行:

codeBash

./launcher bootstrap app

这个过程会非常慢,取决于你的服务器性能和网络(大约需要 10-20 分钟)。

如果编译成功,最后会提示 Successfully bootstrapped。

然后启动容器:

codeBash

./launcher start app

此时,Discourse 已经在后台运行,监听在本地的 8088 端口。


第六步:在 aaPanel 设置反向代理

回到 aaPanel 的网页界面:

  1. 点击 Website,找到刚才创建的论坛网站,点击 Conf/Settings

  2. 找到 Reverse Proxy (反向代理) 菜单。

  3. 点击 Add Reverse Proxy

    • Proxy Name: 随意填(如 discourse)。

    • Target URL: 填写 http://127.0.0.1:8088 (这里的 8088 必须和你刚才在 app.yml 里设置的一样)。

    • Sent Domain: 默认 $host 即可。

  4. 点击 Submit (保存)。


第七步:最后的配置

  1. 打开浏览器,访问你的域名 https://bbs.example.com

  2. 你应该能看到 Discourse 的欢迎界面。

  3. 点击 Register 注册第一个账号(必须使用你在 app.yml 里填写的管理员邮箱)。

  4. 去邮箱查收激活邮件,激活后你就是超级管理员了。


常见坑点 & 维护技巧

  1. 图片上传问题
    安装好后,进入 Discourse 后台设置,搜索 force https,勾选它。因为我们是通过 aaPanel 的 SSL 访问的,Discourse 需要知道自己是在 HTTPS 环境下,否则可能会出现图片加载失败或混合内容报错。

  2. 修改配置
    如果你以后想修改 SMTP 或域名,必须:

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

    2. 重新编译 ./launcher rebuild app (注意是 rebuild,这会停机几分钟)。

  3. 磁盘空间
    Discourse 的 Docker 镜像很大,如果你的 VPS 只有 20G 硬盘,要注意清理日志和旧镜像(./launcher cleanup)。

  4. 关于 SWAP
    如果你在 bootstrap 过程中报错失败,90% 是因为内存不够被系统杀进程了。
    请在 aaPanel 的 Linux Tools 里添加 2GB 的 Swap,或者手动添加。

祝你搭建成功!Discourse 虽然搭建麻烦点,但用起来是真的舒服。

上面是常规教程,其实这个论坛搭建,我用了好几个小时,因为装了aapanel,所有用的自带docker,但是问题点特别多,第一个就是优邮箱配置,如果要是用QQ 163之类的邮箱可能还简单一点,但是我用的Namecrane,这几费劲了,因为要改app.yml里边的配置,启用465端口和SSL链接,包括启用后出现BAD CSRF,包括邮箱收到链接激活后一直没下一步等问题都是SSL没配置,试了很多次,我把最终的修改版app.yml发出来参考:

env:

DISCOURSE_FORCE_HTTPS: true

DISCOURSE_SMTP_ADDRESS: us1.workspace.org
DISCOURSE_SMTP_PORT: 465

DISCOURSE_SMTP_USER_NAME: “info@123ys.net”
DISCOURSE_SMTP_PASSWORD: “你的密码或授权码”

关键:465(隐式TLS)

DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false

关键:把认证方式从 plain 改为 login

DISCOURSE_SMTP_AUTHENTICATION: login

很多邮局会校验 HELO/MAIL FROM 域名

DISCOURSE_SMTP_DOMAIN: 123ys.net

很多邮局要求 From 必须是该账号/该域名允许的地址

DISCOURSE_NOTIFICATION_EMAIL: “info@123ys.net”

每次修改推荐重启步命令。不然不生效:

cd /var/discourse
sudo ./launcher rebuild app

还有反代配置:

1) Nginx 规则:把 location / 改成 location ^~ /,并禁用 PHP/Rewrite 干扰

你当前 vhost 里虽然有 location / { proxy_pass ... },但 aaPanel 还引入了:

  • include enable-php-00.conf;

  • include /www/server/panel/vhost/rewrite/bbs.123ys.net.conf;

这些经常会包含 匹配 .css/.js 的 location ~* 或 rewrite,导致 .css 不走你写的 proxy。

直接修改 bbs.123ys.net 的站点配置(推荐这么改)

在 aaPanel → 网站 → bbs.123ys.net → 配置文件:

  1. 注释掉这两行(对 Discourse 完全不需要):
# include enable-php-00.conf;
# include /www/server/panel/vhost/rewrite/bbs.123ys.net.conf;

  1. 把你现在的:
location / {
   ...
}

改成(关键是 ^~):

location ^~ / {
    proxy_pass http://127.0.0.1:8090;
    proxy_http_version 1.1;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $host;
    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 $scheme;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_read_timeout 3600;
    proxy_connect_timeout 60;
}

CF把小云朵叉掉,然后进CF缓存,里边清楚所有缓存。这是我折腾最久的两个地方,仅供参考。看着还不错。