【Discourse部署】超详细实战教学

前言

Discourse 是一个功能强大、现代的开源论坛和社区平台。它不仅仅是传统的论坛软件,更是一个构建高质量、结构化讨论的社区中心。

简单来说:

  1. 它是什么? 一个开源、基于 Web 的论坛/社区平台。

  2. 它的作用? 促进用户之间的在线讨论、知识共享、问题解答和社区建设。

  3. 为啥用它? (核心优势)

    • 提升讨论质量: 设计上鼓励有深度、有价值的对话(如点赞、徽章、信任等级系统、自动标记低质量内容)。

    • 现代化体验: 响应式设计(完美适配手机、平板、电脑),实时更新(无需刷新页面),直观的用户界面。

    • 强大的社区功能: 支持分类、标签、置顶、Wiki 帖、全文搜索、用户徽章、通知系统、私信等。

    • 开源与可扩展: 免费使用和修改源代码,有活跃的开发者社区和丰富的插件生态系统。

    • SEO 友好: 结构清晰,内容易于被搜索引擎抓取和索引。

    • 安全与维护: 核心团队积极维护,注重安全更新。

    • 集成能力强: 可与常见工具(如 SSO 登录、Slack、GitHub 等)集成。

  4. 可以用它做什么?

    • 建立用户支持论坛: 让用户互相帮助,减轻官方支持压力。

    • 构建产品社区: 用户讨论产品、分享技巧、提出建议。

    • 创建知识库/FAQ: 利用 Wiki 帖功能维护结构化知识。

    • 内部团队沟通: 项目讨论、知识沉淀、公司公告。

    • 兴趣社区/粉丝论坛: 围绕特定主题(如游戏、技术、爱好)建立交流中心。

    • 作为官方公告和反馈渠道: 发布更新,收集用户反馈。

Discourse 部署教程

Discourse docekr部署教程

配置项 需求 说明
邮件 配置好smtp 密钥 电子邮件对于 Discourse 中的帐户创建和通知至关重要。配置好smtp 密钥

服务器配置说明:

配置项 参数
cpu 1C
内存 2G + 2G swap
系统 Ubuntu 24.04 任意linux系统

docker部署教程

安装docker

见本站docker安装教程:https://halo.blog360.sbs/archives/dockeran-zhuang-jiao-cheng

Discourse 镜像下载容器启动

下载项目源码

git clone https://github.com/discourse/discourse_docker.git /opt/discourse
cd /opt/discourse
chmod 700 containers

执行生成配置文件脚本

./discourse-setup

出现提示时回答以下问题:

Hostname for your Discourse? [discourse.example.com]:
Email address for admin account(s)? [[email protected],[email protected]]:
SMTP server address? [smtp.example.com]:
SMTP port? [587]:
SMTP user name? [[email protected]]:
SMTP password? [pa$$word]:
Let's Encrypt account email? (ENTER to skip) [[email protected]]:
Optional Maxmind License key () [xxxxxxxxxxxxxxxx]:

从电子邮件设置中获取 SMTP 详细信息,请务必完成该部分。 Let’s Encrypt 帐户设置旨在为您的网站提供免费的 HTTPS 证书,如果希望网站安全,请务必进行设置。 这将代表生成一个app.yml配置文件,然后启动引导程序。Bootstrapping 需要2-8 分钟来设置您的 Discourse。如果需要在引导后更改这些设置,可以./discourse-setup再次运行(它将重新使用文件中以前的值)或使用和 then/containers/app.yml手动编辑,否则更改将不会生效。

配置文件说明

## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Uncomment these two lines if you wish to add Lets Encrypt (https)
  # - "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to a max of 25% of the total memory.
  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "1024MB"

  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  TZ: Asia/Shanghai
  # DISCOURSE_DEFAULT_LOCALE: en

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  UNICORN_WORKERS: 4
  #HTTP_PROXY: "http://192.168.73.1:3067"
  #HTTPS_PROXY: "http://192.168.73.1:3067"

  DISCOURSE_ENABLE_HTTPS: false                # 完全禁用HTTPS
  DISCOURSE_SKIP_HTTPS_REDIRECT: true          # 禁止HTTPS重定向

  # 强制HTTPS资源生成 (核心修复)
  DISCOURSE_FORCE_HTTPS: true                  # 生成HTTPS资源链接
  DISCOURSE_USE_HTTPS: true                    # 双重确保HTTPS资源

  # 代理相关设置
  # DISCOURSE_RELATIVE_URL_ROOT: "/"             # 修复路径问题
  UNICORN_LISTEN_ADDRESS: "0.0.0.0"            # 监听所有接口

  # 代理头识别设置 (解决无限重定向)
  RACK_ENV: production
  RAILS_ENV: production
  ## TODO: The domain name this Discourse instance will respond to
  ## Required. Discourse will not work with a bare IP number.
  DISCOURSE_HOSTNAME: test.blog360.sbs

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example '[email protected],[email protected]'
  DISCOURSE_DEVELOPER_EMAILS: '[email protected]'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS is required
  # WARNING: SMTP password should be wrapped in quotes to avoid problems
  DISCOURSE_SMTP_ADDRESS: smtp.qq.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: [email protected]
  DISCOURSE_SMTP_PASSWORD: "1234567"
  #DISCOURSE_SMTP_FORCE_TLS: true ssl(465端口)协议开启此项关闭START_TLS
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_DOMAIN: [email protected] # (required by some providers)
  DISCOURSE_NOTIFICATION_EMAIL: [email protected]
  LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: peer        # (optional, default: peer, valid values: none, peer, client_once, fail_if_no_peer_cert)
  #DISCOURSE_SMTP_AUTHENTICATION: plain            # (default: plain, valid values: plain, login, cram_md5)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate

  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## The maxmind geolocation IP account ID and license key for IP address lookups
  ## see https://meta.discourse.org/t/-/173941 for details
  #DISCOURSE_MAXMIND_ACCOUNT_ID: 123456
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
docker_params:
	memory: 1g
	memory-swap: "1g"
## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /opt/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /opt/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Any custom commands to run after building
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='[email protected]'"
  - exec: echo "End of custom commands"

配置总结:

配置项 是否必须 说明
DISCOURSE_HOSTNAME 发布域名或者IP
DISCOURSE_DEVELOPER_EMAILS 默认管理员邮箱
DISCOURSE_SMTP_ADDRESS smtp地址
DISCOURSE_SMTP_PORT 端口与DISCOURSE_SMTP_FORCE_TLS(465配置)和DISCOURSE_SMTP_ENABLE_START_TLS(587配置)两者只能启用一个
DISCOURSE_SMTP_USER_NAME smtp用户名
DISCOURSE_SMTP_PASSWORD smtp 密钥 ,注意是密钥而非密码
DISCOURSE_SMTP_DOMAIN 默认配邮箱地址
DISCOURSE_NOTIFICATION_EMAIL 默认配置邮箱地址
LETSENCRYPT_ACCOUNT_EMAIL 默认配置邮箱地址

配置代理

配置系统级别代理或者配置github代理

配置系统代理

# 配置app.yml文件。容器系统代理
env:
  HTTP_PROXY: "http://192.168.73.1:3067"
  HTTPS_PROXY: "http://192.168.73.1:3067"

国内代理源可以去2025年07月更新!18个Github镜像站,国内更快部署下载或者Github Proxy 文件代理加速修改可用镜像源

运行启动命令根据提示连接异常域名,执行查找脚本更改代理

grep -ril --exclude-dir={.git,.svn} '查找的字符串' /文件路径 2>/dev/null

启动 Discourse

配置完成后自动构建并启动容器(首次启动约需 10-15 分钟):

​
# 重构app
./launcher rebuild app

# 查看容器状态
sudo ./launcher status app
​
# 日志监控
sudo ./launcher logs app

Discourse 发布教程

nginx 发布教程

添加配置域名发布文件

server {
​
    listen 80;
    server_name test.blog360.sbs;
​
    client_max_body_size 20m;
  # 主请求代理
  location / {
    proxy_pass http://172.30.0.2:80;
​
    # 关键头信息传递 (解决混合内容问题)
        proxy_set_header Host $http_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;  # 告知Discourse使用HTTPS
​
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
​
        # 缓存优化
        proxy_cache_bypass $http_upgrade;
​
        # 修复静态资源路径
        sub_filter_once off;
        sub_filter_types text/html text/css application/javascript;
  }
​
}

申请免费证书(ssl证书可选)

安装Certbot工具

# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
​
# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

申请ssl证书(nginx)

sudo certbot --nginx -d your-domain.com
  • 替换 your-domain.com 为你的域名

修改app.yml配置文件

  DISCOURSE_ENABLE_HTTPS: false                # 完全禁用HTTPS
  DISCOURSE_SKIP_HTTPS_REDIRECT: true          # 禁止HTTPS重定向

  # 强制HTTPS资源生成 (核心修复)
  DISCOURSE_FORCE_HTTPS: true                  # 生成HTTPS资源链接
  DISCOURSE_USE_HTTPS: true                    # 双重确保HTTPS资源

  # 代理相关设置
  # DISCOURSE_RELATIVE_URL_ROOT: "/"             # 修复路径问题
  UNICORN_LISTEN_ADDRESS: "0.0.0.0"            # 监听所有接口

  # 代理头识别设置 (解决无限重定向)
  RACK_ENV: production
  RAILS_ENV: production

重新构建

# 重构app
./launcher rebuild app
1 Like

我是一个做网站菜鸟,因为兴趣爱好,想搭建一个技术交流社区,准备搭建一个discourse,分享这篇教程,希望对有需要安装discourse的朋友,有帮助,避免踩坑,discourse的中文教程比较少,有的教程已经过时了,全靠翻译软件,研究了好几天。

需要做一个属于自己的discourse需要准备的:

阿里云轻量云服务器香港一个,国内的服务器下载github的插件像蜗牛一样,所以还是推荐用阿里云香港的轻量云,或者其它家轻量服务器,轻量服务器比较便宜,适合新手,配置需要内存大于2GB,不然会无法安装,如果需要装到国内服务器,可以采用香港服务器按量付费,然后用平台里的制作镜像然后克隆到国内服务器的方式,这样会节省踩坑的时间。

一个好记的短域名并解析到服务器ip,推荐com和net,其它域名缺少辨识度,域名可以搜域名批量查询,用规则查询比较短的。

系统:Ubuntu 20.04,比较常用。

开通新的服务器以后,先把防火墙端口都打开(后期调试完毕以后,根据需求关掉端口,只保留用到的端口,省的被黑客攻击),在控制面板设置好root的密码,然后直接在网页上ssh远程连接到服务器上,或者下载 XTerminal之类的ssh软件。


然后粘贴下面三个命令,按回车执行,有选项的时候按yes,升级系统源还有安装git软件。

apt update
apt upgrade -y
apt install git

然后粘贴下面三个命令,按回车执行,用管理员身份,这一步sudo -s如果操作不仔细,会在安装的时候出现一些创建莫名失败的提示,导致安装失败,是因为没有权限导致的。

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

下载完以后,执行安装向导

./discourse-setup

然后根据提示输入要绑定的域名,第一次安装时间比较久,建议先除了主域名以外其它,随便乱填,然后后面能够成功再重新构建,看不懂的可以用截图加微信图片翻译,邮件可以用阿里云的邮件服务

然后会有一个提示是继续安装还是按ctrl+c取消,建议继续安装。

安装完成以后访问绑定的域名出现注册页面代表discourse安装成功了。

然后安装一个liunx面板,这一步主要是为了安装其它网站程序,以及方便菜鸟傻瓜式管理用,对比了下这个面板比宝塔要简单很多,而且比较清爽,不会很多广告,而且安装的速度只要几秒钟,不会像宝塔一样,要长时间编译环境。

执行下面的脚本:

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

安装的时候会提示检测到已经安装过docker,然后出现登陆后台。

按照提示,找到后台登陆进去,在容器管理里面可以看到app,就是discourse,可以在这里启动或者停止。

然后进入文件,编辑app.yml,主要修改的地方,用中文注释了。

## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Uncomment the next line to enable the IPv6 listener
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Uncomment these two lines if you wish to add Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to a max of 25% of the total memory.
  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "128MB"
  ## 修改附件上传的最大值
  upload_size: 300m
  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

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

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  UNICORN_WORKERS: 2

  ## TODO: The domain name this Discourse instance will respond to
  ## Required. Discourse will not work with a bare IP number.
  ## 修改主域名
  DISCOURSE_HOSTNAME: bbs.izdh.net

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example '[email protected],[email protected]'
  ## 修改管理员邮箱
  DISCOURSE_DEVELOPER_EMAILS: '[email protected]'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  ## 修改发信邮箱服务器
  DISCOURSE_SMTP_ADDRESS: smtpdm.aliyun.com
  ## 修改发信邮箱端口
  DISCOURSE_SMTP_PORT: 80
  ## 修改为自动发信邮箱账号
  DISCOURSE_SMTP_USER_NAME: [email protected]
  ## 修改发信邮箱密码
  DISCOURSE_SMTP_PASSWORD: "dj6bCRxoHt25NcD6"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  DISCOURSE_SMTP_DOMAIN: smtpdm.aliyun.com
  ## 修改为自动发信邮箱账号
  DISCOURSE_NOTIFICATION_EMAIL: [email protected]
  DISCOURSE_SMTP_ENABLE_START_TLS: false
  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: [email protected]

  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
## 安装2个插件
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved	
          - git clone https://github.com/discourse/discourse-reactions

## Any custom commands to run after building
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='[email protected]'"
  - exec: echo "End of custom commands"

修改保存以后,回到终端,使用指令或者在后台停止容器,然后再重构,不过好像没安装这个面板可以不用停止容器,安装这个面板了以后不停止容器直接重构会报错。

./launcher stop app
./launcher bootstrap app

等待重构完成,执行容器启动命令。

./launcher start app

进入discourse,会提示发邮件激活,如果收不到,可以用下面指令,创建一个管理员账号直接跳过,然后在左边设置里语言设置为中文即可,然后有个地方可以发邮件测试,会提示报错原因,多试几次就可以成功了。

./launcher enter app
rake admin:create

如果需要创建其它网站,直接参考官方的教程,比较简单就不详细介绍了,也可以在网站里,新建一个环境,然后网站权限修改成777,就可以安装各种程序了。


主要解决的问题,可以一个服务器运行几个网站,这样节省了买服务器的费用,而且更加适合新手。

后面测试邮件发送的时候发现的一个问题:

容器的这些设置,编辑app.yml里面,重构好像并不起作用,需要在容器环境变量这里修改,不过只需要5-6秒就可以生效,对插件安装有没有影响还不太清楚。

和其它网站共存好像就是先新建一个反向代理,然后把默认的容器443端口改成一个10443,然后要配置证书,就能正常访问了。

反向代理

配置证书

1 Like

卸载Discourse

cd /var/discourse
./launcher stop app
./launcher destroy app
cd 
sudo rm -rf /var/discourse -R

Discourse必须配置好SMTP才可以正常使用,不然没法验证邮箱,无法注册账号,很多人都被拦在这一步了!本文分享了正确的配置方法,同时还总结了大家经常遇到的问题。

在哪里配置SMTP?

Discouser的SMTP配置参数在/discourse/containers/app.yml这个文件中修改。以下为本站的配置参数,本站使用的是阿里云的邮件推送服务,除了密码之外其他都是本站目前在用的

  DISCOURSE_SMTP_ADDRESS: smtpdm.aliyun.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: [email protected]
  DISCOURSE_SMTP_PASSWORD: "密码不给看"
  DISCOURSE_SMTP_FORCE_TLS: true           # (端口如果为465这项必须设置为true)
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default: true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)
  DISCOURSE_NOTIFICATION_EMAIL: [email protected]    # (发信from邮箱,和账号邮箱要一致)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: peer        # (optional, default: peer, valid values: none, peer, client_once, fail_if_no_peer_cert)
  #DISCOURSE_SMTP_AUTHENTICATION: plain            # (default: plain, valid values: plain, login, cram_md5)

准备好SMTP账号

不管你使用哪一家的邮件服务,请先确认相关账号参数正确,特别是密码。最好是在其他地方验证过的。

常见问题1:很多邮箱的SMTP密码是单独配置的,不要和邮箱账号密码混淆。

常见问题2:有些邮件推送服务是有白名单IP和域名限制的,这一点也要注意。

两个很重要的配置

  1. DISCOURSE_SMTP_PORT端口号,一般配置25和587都可以。注意:如果要使用465,必须配置DISCOURSE_SMTP_FORCE_TLS: true ,必须!很多人因为这个失败!很多人!真的,大概十万左右!如果没有配置会遇到报错“end of file reached”。官方其实不推荐使用465,说是什么机构说这个过时了,不安全之类的!
  2. DISCOURSE_NOTIFICATION_EMAIL必须和DISCOURSE_SMTP_USER_NAME一致。不然就会遇到报错:436 “MAIL FROM” doesn’t conform with authentication。

如何反复调试邮件服务器?

如果SMTP配置失败了怎么办?我们假设你已经完成了所有安装步骤,并且卡在 Web 界面无法激活管理员账号。

首先,用终端连接服务器,然后 cd /opt/1panel/apps/discourse 去到安装目录。

然后执行 ./discourse-doctor 命令,该命令会执行一个诊断程序,并且会让你提供一个邮件地址发送测试邮件。你可以根据发送结果的错误,在网上搜索,你到底是哪里配置错了。

然后,你需要修改你的 SMTP 设置,怎么修改呢?

在 1Panel 的可视化面板里,进入 /opt/1panel/apps/discourse/containers 这个目录,然后用文本编辑器编辑 app.yml ,直接编辑你之前的 SMTP 设置。其他安装方法也一样,在安装目录里找到/discourse/containers/app.yml这个文件即可。

编辑完成后保存,回到终端。

在终端中执行 ./launcher destroy app 然后等待执行结束。

再执行 ./launcher start app 等待执行结束。

如果你只是修改 SMTP,是不需要./launcher rebuild app的,destroy 和 start 就能生效,并且速度更快。

然后,你可以重复执行 ./discourse-doctor 诊断进行调试。

如果你的站点可以访问,并且已经登录管理员账号。也可以在这里测试服务器配置。/admin/email/server-settings

解决安装后邮件发送错误的一些方法

诊断:

./launcher enter appopenssl s_client -connect smtp.beget.com:465 -servername smtp.beget.co

在 Rails 中测试:

./launcher enter app
rails c
ActionMailer::Base.smtp_settings = {
  address: 'smtp.beget.com',
  port: 465,
  user_name: '[email protected]',
  password: 'password',
  authentication: :login,
  ssl: true,
  tls: true,
  enable_starttls_auto: false,
  openssl_verify_mode: 'none'
}

# 测试发送
ActionMailer::Base.mail(
  from: '[email protected]',
  to: '[email protected]',
  subject: '来自 Rails 的测试',
  body: '测试消息'
).deliver_now

这会导致清晰的错误文本

DISCOURSE_SMTP_DOMAIN: your install Domain # (required by some providers)

这样设置后, error - end of file reached 和 SSL_read: unexpected eof while reading的错误得以解决

宝塔面板部署discourse教程

准备工作

首先准备一台Linux服务器,我的系统是Ubuntu。宝塔面板安装好之后,首先去安装好Docker和Nginx。

获取源码

在宝塔面板上打开终端,输入以下命令:

#创建discourse目录
mkdir /www/dk_project/dk_app/discourse/
#进入discourse目录
cd /www/dk_project/dk_app/discourse/
#克隆项目
git clone https://github.com/discourse/discourse_docker.git .
#把该discourse目录加入全局信任列表,防止警告报错信息
git config --global --add safe.directory /www/dk_project/dk_app/discourse

编辑 Discourse 配置

因为 Linux 面板会占用默认的 80 443 端口,并且我们的安装目录也和默认的不一样,所以我们不能直接按照官方执行 ./discourse-setup而是需要先编辑配置!

我们回到宝塔的可视化界面,在【文件】管理中找到 /www/dk_project/dk_app/discourse/samples/standalone.yml 这个文件,这是用于单容器安装的模板配置文件。

我们将它复制并重命名到 /www/dk_project/dk_app/discourse/containers/app.yml 这个位置,然后用 宝塔 的文本编辑器直接打开编辑。

需要编辑的点有以下几个:

  1. 端口映射
expose:
  - "127.0.0.1:8973:80"   # http
  - "127.0.0.1:4433:443" # https

这里,我们将容器在宿主机的端口设置为了 8973 和 4433,这样就不会因为面板占用端口而安装失败了,你也可以改成别的端口,但记住,后面要用。同时,我们禁止了容器直接向公网暴露自己,方便我们使用 1Panel 防火墙。

  1. 访问地址 你自己的域名
DISCOURSE_HOSTNAME: 'discourse.org.cn'

不必多说,就是你的域名。

  1. 管理员邮件地址
    DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
    这个一定要提前设好自己的邮箱,不然最后一步没法激活管理员账号。
  2. 邮件发送配置
  DISCOURSE_SMTP_ADDRESS: smtp.you.com
  DISCOURSE_SMTP_PORT: 25
  DISCOURSE_SMTP_USER_NAME: 邮箱
  DISCOURSE_SMTP_PASSWORD: 密码
  DISCOURSE_NOTIFICATION_EMAIL: 发信邮箱    # (address to send notifications from)

这个很少有人能一次性配对,考虑到不同人使用不同的邮件供应商,你们可以在网上搜搜怎么配。Discourse 的安装向导,必须在收到管理员激活邮件之后才能正常完成。但没关系,我们稍后有一节专门讲这个。【编者注释:端口不要用465,用25一般不会有问题。部分邮件服务商会要求DISCOURSE_SMTP_USER_NAME和DISCOURSE_NOTIFICATION_EMAIL要一致,比如阿里云邮箱推送服务。这里要注意下。 】


  1. 配置永久化存储
volumes:
  - volume:
      host: /www/dk_project/dk_app/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /www/dk_project/dk_app/discourse/shared/standalone/log/var-log
      guest: /var/log

相当于将两个宿主机文件映射到运行容器内,使得 Discourse 每次“重建”时不会丢失内容。后续,你也可以用 1Panel 的文件直接去管理这些目录,不用深入 Docker 终端了。

完成之后,检查一遍,点击确认保存。

  1. 将containers目录的权限改成700。

开始安装

回到终端,如果已经断开连接了,你需要重新用 SSH 连接。
cd /www/dk_project/dk_app/discourse 回到安装目录。
然后执行:
./launcher rebuild app

等待安装结束,即可完成安装了。【编者注:这里要等一会儿,不要急。大概十来分钟】
如果一切正常,终端将不会弹出任何错误提示,并回到命令行。然后,你将在 宝塔 的“容器”面板里,看到一个已经在运行的容器:【编者注:安装中间会有一个临时的容器,要等到app出来才安装完。】

配置网站和证书

在Docker > 网站 > 创建 > 反代容器 里面创建网站。如下图所示:

点刚才创建的网站,点配置,选择 SSL,根据提示跳转到证书页面创建证书。然后回到这里配置好证书,选中强制HTTPS!到这里你的安装就结束了。

如果你之前的邮件配置正确,此时,你可以用浏览器访问你的 yourname.com 完成剩下的安装进程。

安装过程中出现任何问题,你都可以通过修改配置,重新执行 ./launcher rebuild app 来继续安装。

1 Like

这个插件不错哦,L站同款。

可以用下面的 2 个命令。

./launcher enter app
rake posts:rebake

或者

cd /var/discourse
./launcher enter app
bundle exec rake posts:rebake

效果是一样的,主要目的就是把 MD 文件重新生成一套 HTML 代码。

Discourse 的设计逻辑,对 MD 转换成可以显示的 HTML 的时候是存在缓存里面的,所有内容都不是动态生成。

更换DISCOURSE_HOSTNAME 之后也需要 rake posts:rebake

1 Like

欢迎入坑 Discourse 。

针对稳定版,可以在配置文件中选择每次更新检查的版本。

取消掉这个注释后,选择 stable 分支。

为什么使用 Discourse 与 Cloudflare

将 Discourse 与 Cloudflare 一起使用可以带来以下几个好处:

  • 性能:Cloudflare 的 CDN 可以加速全球访问您 Discourse 论坛上的常见资源,从而改善无论用户位于何处的社区成员的使用体验(来源)。
  • 安全性:Cloudflare 为您的 Discourse 论坛提供额外的安全层,例如 DDoS 防护(来源)和 HTTPS 支持(来源),如果没有使用 Discourse 的 Lets Encrypt 配置

对于自托管用户来说,重要的是要注意,虽然 Cloudflare 可以提供这些好处,但它也增加了 Discourse 设置的复杂性。本文件旨在帮助您应对这种复杂性,并充分利用 Discourse 与 Cloudflare 的结合。

配置 Discourse 与 Cloudflare

  • Cloudflare 基础知识:在开始配置 Discourse 与 Cloudflare 时,首先确保您熟悉 Cloudflare 基础知识。Cloudflare 基础知识 是一个集中提供 Cloudflare 资源的地方。
  • 设置:为了获得 Cloudflare 的 安全性、性能和可靠性 的好处,您需要在您的域名上配置 Cloudflare。设置指南

最佳实践

以下链接假设您已登录并且只有一个账户。

  • DNS:确保指向您 Discourse 实例的 DNS 记录被代理。点击这里管理您的 DNS 记录
  • SSL/TLS 加密模式应设置为“完全(严格)”。点击这里管理您的 SSL/TLS 设置:warning: 如果未正确设置,可能会导致重定向循环。
  • 缓存级别 应设置为标准。点击这里设置缓存级别
  • 创建页面规则:为 community.example.com/session/* 创建页面规则,将缓存级别设置为“绕过”。点击这里创建页面规则
  • 规则设置 应配置为规范化传入的 URL。点击这里配置规则设置
  • 网络设置:根据 Cloudflare 的计划类型,应配置如下。如果尚未启用,请启用 IPv6 兼容性WebSocketsIP 地理位置网络错误日志洋葱路由。如果尚未禁用,请禁用 伪 IPv4响应缓冲真实客户端 IP 头gRPC。根据您的站点政策设置 最大上传大小,100 MB 足够。点击这里配置网络设置
  • WAF 设置:根据 Cloudflare 计划类型和安全需求配置。 如果您的 Cloudflare 账户支持托管规则,请配置托管规则以“跳过发布创建/编辑的 WAF”。操作步骤如下:
    • 添加一个托管规则,匹配 URI 路径和请求方法。该规则应如下所示:
(http.request.uri.path eq "/posts(/[0-9]+)?" and http.request.method in {"POST" "PUT"})
  • 选择“跳过所有剩余规则”选项。
  • 启用“记录匹配请求”。如果您使用 数据探索器 插件,请配置托管规则以“跳过管理员查询的 WAF”。操作步骤如下:
  • 添加一个托管规则,匹配 URI 路径和请求方法。该规则应如下所示:
(http.request.uri.path contains "/admin/plugins/explorer/queries/" and http.request.method eq "PUT")

自托管用户的额外配置

为了确保正确的 IP 地址发送到 Discourse,您需要在 containers/app.yml 文件的末尾添加以下行:

cloudflare.template.yml

(相关:如何设置 Cloudflare? - #6 由 codinghorror

支持

如需来自 Cloudflare 的直接支持,请访问原始帖子 @ Cloudflare Community

或者,您可以在 Meta 上搜索特定问题:‘cloudflare’ 搜索结果 - Discourse Meta