Discourse 介绍

Discourse 是一款由 Stack Overflow 的联合创始人——Jeff Atwood,基于 Ruby on Rails 开发的开源论坛。相较于传统论坛,Discourse 从他全面开放的开源态度、简介明了的页面风格到其特有的内容运作体系都在证明自己是一款为下一个 10 年的互联网而设计的产品。现在,诸如 Car Talk 等国外知名产品都采用 Discourse 为论坛方案。

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

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

丰富的插件、可自定义论坛设置便是 Nebula Graph 选择 Discourse 最大的原因,而本文不在于介绍如何搭建 Discourse(搭建 Discourse 是一个简单的活,可自行搜索教程),本文旨在介绍图数据库 Nebula graph 如何利用 CDN 来部署 Discourse。

部署 Discourse

自托管的原因

尽管 Discourse 官方的托管服务,但由于国内的访问质量不稳定、不能自由的修改插件和自定义网络设置,因此我们决定自行托管这项服务。基于自托管服务,我们对网络、插件系统做了一些自定义修改,使得目前 Nebula Graph社区有着更好的访问速度和功能。

自托管论坛服务要求

经测试以下配置清单可以完全满足我们部署 Discourse 的要求:

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

部署实践

Cloudflare 介绍

Cloudflare 是一家覆盖全世界主要地区的 CDN 服务商,在提供基本的 CDN 服务同时,他们还提供高质量的 DNS 查询、DDOS 保护、缓存加速服务。相比其他的 CDN 服务商,他们产品理念更为先进,不仅有着良好的服务质量且拥有非常低廉的价格(通常情况下甚至是免费的),因此目前 Cloudflare 的用户规模非常庞大,是值得首选的CDN服务商。

设定 Cloudflare 的 DNS记录

先设定 DNS 记录可减少首次部署时无法通过 Let's encrypt 申请证书的概率。在 Cloudflare 的 DNS 配置中,添加类型为 A 的记录指向服务器的 IP 地址即可。

这里需提醒下,不要将 Proxy status 设置为“Proxied”,这会导致页面因重定向次数过多而无法访问。我们将在完成正确的配置后开启 Proxy status 设置。

配置 Cloudflare SSL/TLS

Full 和 Flexible 是 Cloudflare 上最常用的两种 SSL 模式,在正确的启用 CDN 前,需要对其进行设置。首先来到 SSL/TLS 设置面板,选择 Full 模式,这种方式会确保 CDN 回源时也可以通过 HTTPS 来访问源站,有效地提高了内容安全性。

然后进入 Origin Server 标签,进行创建证书的操作,在私钥类型中选择 RSA,BTW,这是最具兼容性的证书类型,ECDSA 则具有更好的性能。

在被证书保护的域名列表中输入论坛的域名,例如 Nebula Graph 论坛地址为:discuss.nebula-graph.io,证书有效期选择 1 年即可。点击 Next 后将会获取到证书的公钥和私钥,分别保存为“ssl.crt”和“ssl.key”将其妥善保存,我们将在后续的步骤中用到他们。

配置和部署 Discourse

Discourse 有完善的 Docker 镜像,因此在正确的安装 Docker 后可以直接运行它。

安装 Discourse

将 Discourse 官方 Docker 镜像拉取至 /var/discourse 目录下。

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

/var/discourse 目录下执行

./discourse-setup

可以看到如下交互式界面,在此界面依次填入域名、管理员邮箱、SMTP 邮件服务器信息以及 Let’s Encrypt 通知邮箱地址即可完成论坛的基础配置。

Hostname for your Discourse? [discourse.example.com]: [论坛的域名]
Email address for admin account(s)? [me@example.com,you@example.com]:[管理员邮箱,此邮箱不会公开]
SMTP server address? [smtp.example.com]: [SMTP邮件服务器地址]
SMTP port? [587]: [SMTP邮件服务器端口]
SMTP user name? [user@example.com]: [论坛自动发信邮箱账号]
SMTP password? [pa$$word]: [论坛自动发信邮箱账号的密码]
Let's Encrypt account email? (ENTER to skip) [me@example.com]: [自动更新证书的通知邮箱地址]
SSL 注意事项

使用 SSL 需要注意的是,如果 DNS 记录还未传播至服务器所使用的 DNS 服务器,将无法使用 Let’s Encrypt 的 SSL 证书自动注册服务。由于我们将使用上文中已申请的 Cloudflare 证书,因此这里可以跳过 Let's Encrypt account email 这一项。

论坛启动

大约等待 10 分钟后,可通过之前设定的域名:discuss.nebula-graph.io 访问自己的 Discourse 论坛。如果首次访问时出现了 502 错误,这是由于服务还未完全初始化,通常情况下稍等片刻即可。

配置 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,论坛可以在全球任何位置被安全的访问。从你的域名访问论坛,并根据需要填写的信息即可初始化论坛并创建管理员账号,通过邮件中的链接确认注册后即可开启论坛服务。

结语

以上是我们为 Nebula Graph 部署 Discourse 论坛服务的一点小小的心得,本文中如有错误或疏漏还请多指教。最后,欢迎大家前往 discuss.nebula-graph.io 参与图数据库及开源的讨论~

作者有话说:Hi,我是 George,是 Nebula Graph 的实施工程师,在运维领域有一些心得体会,希望能为图数据库领域带来一些自己的贡献。希望本文对你有所帮助,如果有错误或不足也请与我交流,不甚感激!

以上为 Nebula Graph 部署 Discourse 论坛服务的一点小小的心得,本文中如有错误或疏漏欢迎前往 Nebula Graph 的 GitHub:https://github.com/vesoft-inc/nebula 提建议

用全站 CDN 部署 Discourse 论坛的更多相关文章

  1. ubuntu安装discourse论坛----结合在apache服务上建立虚拟主机

    指导操作:https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md 一.先安装 Docker / Git: wg ...

  2. [svc]jdk+tomcat部署.jforum论坛部署

    安装jdk和tomcat jdk1.7.0_13(系列)下载url 我这里用的最新的jdk. 去官网下载即可 cd /usr/local/src/ tar xf jdk-8u162-linux-x64 ...

  3. 如何在 Ubuntu Linux 16.04上安装开源的 Discourse 论坛

    导读 Discourse 是一个开源的论坛,它可以以邮件列表.聊天室或者论坛等多种形式工作.它是一个广受欢迎的现代的论坛工具.在服务端,它使用 Ruby on Rails 和 Postgres 搭建, ...

  4. 前端工程之CDN部署

    之前发的一篇文章<变态的静态资源缓存与更新>中提到了静态资源和页面部署之间的时间间隙问题,这个问题会迫使前端静态资源发布必须采用非覆盖式. 那篇文章中没有详细解释为什么会产生不可忍受的时间 ...

  5. 使用Huginn抓取Discourse论坛

    Hi! I don't know why the xpath does not work, but have an easier solution. Discourse also has a JSON ...

  6. discourse论坛迁移

    在源设备的操作备份数据文件tar -czvf discoursefile716.tar.gz /var/discourse然后把此discoursefile716.tar.gz文件传到需要迁移的设备上 ...

  7. Centos7部署ejforum论坛(Java+tomcat+mysql)

    前面搭建Java环境和tomcat环境. 下面进行实战,搭建ejforum论坛 ejforum论坛源码:https://www.lanzous.com/i45rcoh Centos7安装MySQL数据 ...

  8. 搭建LAMP环境部署discuz论坛

    !!!什么是LAMP: LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管理系统(或者 ...

  9. 2014年十个优秀的免费CDN加速服务-国内和国外免费CDN

    这是一篇总结近几年来网络上出现了各类免费CDN服务的文章,文章本来应该早就发出来的,但是因为近期的各种原因一直拖到现在.之前部落已经总结了近几年来的优秀免费空间,新手朋友不必在茫茫“网”海中寻找免费空 ...

随机推荐

  1. Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

    背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...

  2. 一次 Druid 连接池泄露引发的血案!

    最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是 Druid 连接池泄露引发的血案.. 异常日志如下: ERROR - com.alibaba.druid.pool.GetCo ...

  3. 内网渗透之信息收集-Linux系统篇

    linux 系统信息 grep MenTotal /proc/meminfo #查看系统内存总量 cat /etc/issue #查看系统名称 cat /etc/lsb-release #查看系统名称 ...

  4. Js中的window.parent ,window.top,window.self 了解

    在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...

  5. python3:input() 函数

    一.知识介绍: 1.input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型: 2.可以用作文本输入,如用户名,密码框的值输入: 3.语法:input("提示信息:& ...

  6. ajax3

    json json:JavaScript对象表示方法(JavaScript object notation) json:是存储和交换文本信息的语法,类似与xml.他使用键值对的方式来组织,易于人们阅读 ...

  7. 【Python】2.14&2.15学习笔记 运算符与表达式

    太爽了,今天可以尽情熬夜了,明天不上课,可以学一整天\(Python\) 运算符 \(+,-,*,%\)就不说了,说几个和\(c\)不太一样的 除法 print( 5/3 ) 输出了\(1.66666 ...

  8. 关于emgucv控制多摄像头问题

    看到这篇文章你或许已经查阅很多资料,也可能你刚准备深入研究,但是关于调用多摄像头问题我要说明一点,关于多摄像头调用 取决于你电脑本身USB控制器数量,不是说你电脑上5个usb就可以同时控制5台摄像头, ...

  9. Spring Cloud - Nacos注册中心入门单机模式及集群模式

    近几年微服务很火,Spring Cloud提供了为服务领域的一整套解决方案.其中Spring Cloud Alibaba是我们SpringCloud的一个子项目,是提供微服务开发的一站式解决方案. 包 ...

  10. java-乘法口诀表。(新手)

    //创建的一个包名. package qige; //定义一个类. public class KJ { //公共静态的一个主方法. public static void main(String[] a ...