Discourse简介

Discourse 是由 Stack Overflow 创始人之一的 Jeff Atwood 主导的开源论坛项目,使用时能感受到和 Stack Overflow 的关联性,比如为鼓励有效的技术讨论、控制人身攻击等做了很多努力,页面的布局方式也有相似之处,其目的是为了改变十年未变的论坛软件。Discourse 提供了非常丰富的配置方式,也支持插件扩展,它摒弃了传统论坛的话题讨论形式、拥有自学习系统、全Web应用同时适用于桌面和移动终端。

作为一个开源的论坛项目,Discourse 相对其他的论坛有以下亮点:

高度可定制:从发帖等级要求权限到论坛帖子标题最少字数要求,Discourse 在论坛设置里罗列了 25 设置大项,300+ 个论坛小项,即使大家都使用 Discourse 搭建论坛但是每个用 Discourse 搭建的论坛都有自己的风格。
插件:Discourse 官方及 Discourse 开源社区用户开发了丰富的插件可供使用,比如:个性化导航、自定义论坛封面。
集成:可接入第三方产品,Google Analytics、 Slack、Wordpress 都在支持之列。
免费:虽然 Discourse 有 $100/Month 的托管服务,但是你可以完全自行部署免费使用 Discourse 服务。
其他:Discourse 还有其他许多的好处,举个例子,它提供了一个机器人 Discobot 是一个可自定义的 bot,交互式地教新用户使用平台的许多功能,例如为主题添加书签,单框链接(嵌入的预览),添加 emoji表情,非常简单的格式设置,添加图片回复,标记帖子以及如何使用搜索功能。

因为官方只对Docker镜像提供技术支持,所以本文主要介绍通过 Docker 镜像的方式在公有云环境中部署 Discourse 环境。

编写此文章时Discourse版本为2.7.0.beta4。

公有云选为天翼云,操作系统为 debian 9 64位。

一、准备工作

因为官方只对Docker镜像提供技术支持,所以本文主要介绍通过 Docker 镜像的方式在公有云环境中部署 Discourse 环境。

官方文档推荐ubuntu和debian、所以建议选择ubuntu或debian系统,centos系统也能安装,我在阿里云就是用centos安装,后来搬家到在天翼云采用的debian,本文是在debian/ubuntu下安装的通用教程。

编写此文章时Discourse版本为2.7.0.beta4。

公有云选为天翼云,操作系统为 debian 9 64位。

Discourse 本身是挺复杂的,看安装过程的耗时和输出信息就知道了。幸运的是,Discourse 提供了自动化安装的脚本,较低了部署的难度。Discourse 依赖的软件并不多,主要是 git(用来拉取 Discourse 的代码)、docker(因为要使用 Docker 部署) 和 ruby(原因是 Discourse 是用 ruby 编写的)以及 ruby 的包管理工具 gem。

1、服务器配置要求

  • 2 G内存以上的 Linux 服务器,如果使用 1G 内存的主机,则需要开启 SWAP 分区。
  • 具备完整控制权的域名,注册邮件服务和 CDN 服务时我们会用到它。
  • 一个可用的 SMTP 邮件服务。
  • 为 Linux 服务器部署 Docker 服务,国内用户可添加 Azure 中国、七牛云的镜像域名

若服务器为1G,则按照如下教程添加SWAP分区

创建一个空交换文件:

install -o root -g root -m 0600 /dev/null /swapfile

写出一个1GB的名为swapfile的文件:

dd if=/dev/zero of=/swapfile bs=1k count=1024k

告诉Linux这是交换文件:

mkswap /swapfile

激活它:

swapon /swapfile

将其添加到系统表中,以便在重新引导后可用:

echo "/swapfile swap swap auto 0 0" | tee -a /etc/fstab

设置swappiness,使其仅用作紧急缓冲区:

sysctl -w vm.swappiness=10

2、更新系统

注意更新一下系统,最新的系统修复最新 bug。
apt update
apt upgrade -y

解析域名

邮箱配置

二、安装Docker和git、ruby

因为我选择的是使用Docker容器安装模式,这样省去了很多宿主机安装环境的步骤,所以需要安装Docker和Git两个软件做好准备,同时需要保证你的机器能够连接外网,同时80和443端口没有被占用。

sudo apt-get install git
sudo apt-get install ruby
更新为淘宝源
使用apt-get安装

可以直接使用两个命令完成Ruby的安装。

sudo apt-get update
sudo apt-get install ruby
或者

sudo apt-get install ruby2.0
gem sources -r http://rubygems.org/  删除
gem sources -a https://ruby.taobao.org/    添加
gem sources -l               查看

安装git

Docker 的 安装资源文件 存放在Amazon S3,会间歇性连接失败。所以安装Docker的时候,会比较慢。你可以通过执行下面的命令,这是国内的镜像,高速安装Docker。

curl -sSL https://get.daocloud.io/docker | sh

适用于Ubuntu,Debian,Centos等大部分Linux,会3小时同步一次Docker官方资源

$ sudo vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://registry.docker-cn.com",
                       "http://hub.c.163.com"]
}
$ sudo systemctl restart docker.service

docker安装后默认没有daemon.json这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json

加载重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

查看是否成功

docker info

三、安装Discourse

mkdir /var/discourse

创建/var/discourse目录,你可以自定义任意位置创建目录,但是建议新手就按照这个路径创建。默认root权限。

git clone https://github.com/discourse/discourse_docker.git /var/discourse 

下载discourse镜像

下载完成后,复制/var/discourse/samples/standalone.yml 到/var/discourse/containers/目录下,并重命名为app.yml

配置 Discourse
Discourse 的配置文件位于 /var/discourse/containers/app.yml

邮件服务设定
邮件服务是整个部署过程中容易出现设定错误的部分之一。对于大多数邮件服务而言,正确的配置 SMTP 服务器地址、端口以及发信人的账户密码即可完成设定。SMTP 服务器地址和可用端口通常在邮件服务提供者的帮助页面上都可以查到,部分个人邮箱可能需要创建应用专用密码才能使用SMTP服务。

但对于 Office365 以及腾讯这种企业邮箱而言,则需要手动在 app.yml 中指定账户验证方式为 login。参考配置如下:

DISCOURSE_SMTP_ADDRESS: smtp.office365.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: example@office365.com
DISCOURSE_SMTP_PASSWORD: **
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_AUTHENTICATION: login
这是因为 Discourse 默认的邮箱身份验证方式是 plain。如果不确定使用何种方式验证,可通过 swaks 这个邮件服务测试工具来进行监测。参考:

swaks --to [收件邮箱] --from [发件邮箱] --server [SMTP服务器地址] --auth [login/plain] --auth-user [发件邮箱] -tls -p [端口]
在确保能够通过 Discourse 邮件发送测试的同时,还需注意两项功能设定才能够确保用户能够收到邮件。

位于论坛 Setting-Required 下的 notification email,这里需要配置为和 SMTP 登录账号相同的邮箱地址。
disable emails,通常在进行论坛迁移、备份还原后这一项通常会被设置为 non-staff,此时,设置为 no 后将恢复邮件发送。
SSL、CDN服务设定
在 app.yml 文件中,tempates 下引入 templates/cloudflare.template.yml 和 templates/web.ssl.template.yml 两个模板文件。再次登录 Cloudflare 账号,将 DNS 记录从 DNS only 改为 Proxied,等待记录生效。如果本地的网络质量不佳,也可引入 templates/web.china.template.yml 模版,它将从国内的 Ruby 镜像获取资源。

templates:

  • "templates/postgres.template.yml"
  • "templates/redis.template.yml"
  • "templates/web.template.yml"
  • "templates/web.ratelimited.template.yml"
  • "templates/cloudflare.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"
    在 /var/discourse/shared/standalone/ssl 目录下放入步骤2 中所创建的证书文件。

加入新插件(可选)
为了更好帮助海外用户阅读论坛上的中文内容,我们引入了翻译插件。Discourse 拥有丰富的插件,因此如果有需要,你可以安装任何你感兴趣的插件。

在 app.yml 文件的 hooks 字段下配置可被 git 获取的链接,当 Discourse 的 Docker container 重新创建时新插件既完成安装。

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
- git clone https://github.com/discourse/discourse-translator.git


完成配置后
在完成以上配置后,在 /var/discourse 目录录下运行 ./launcher rebuild app,并再次等待 10 分钟,即可完成最终的构建。

对于个人站长而言,还需安装并配置 Fail2ban 来保护 ssh 服务安全。Discourse 每周会自动创建一个备份保存在本机的 /var/discourse/shared/standalone/backups 目录下,可设置 rsync 将它们备份到本地的服务器上。如果有可用的 Amazon S3 服务,还可在后台配置 S3 服务的相关信息,Discourse 会在完成备份后自动将备份上传至对应的 S3 实例。

现在,你拥有了一个具备全站 CDN 加速能力的 Discourse 论坛,得益于全站 CDN 和全链路 SSL,论坛可以在全球任何位置被安全的访问。从你的域名访问论坛,并根据需要填写的信息即可初始化论坛并创建管理员账号,通过邮件中的链接确认注册后即可开启论坛服务。

配置文件修改完成后,我们可以在命令行界面开始安装了。

cd /var/discourse

先进入discourse目录

./discourse-setup

然后执行discourse目录下的discourse-setup脚本,会要求输入主机邮件服务器等参数,我们已经手动设置好了直接一路按回车,当然按回车的时候可以再核对下手动编辑的配置是否有错,然后慢慢等待安装完成。

安装编译完成后就可以直接访问域名进入WEB配置界面了。

常见问题

1、收不到邮件?

首先排查是否邮箱端口设置有没有问题。SMTP有25(非加密)和465(SSL加密)端口,Discourse默认使用的是STARTTLS(587端口)。实测阿里云企业邮箱也支持587端口和STARTTLS加密的。不行就用25端口即可。