最近帮朋友建了个关于数据科学的交流论坛。说实话,近几年运营社区相当不易,网站推广、内容筛选、站务管理一堆麻烦事,不免勾起了学生时代论坛撕逼的黑历史,而当年技术圈的“知名”论坛,现在很多沦为了广告集中地,内容质量已大不如前,操作习惯上也还停留在十年前,体验和SEO都很糟糕。

一开始我是拒绝的,直到某土豪一言不合的买ECS,后来心想不如借此熟悉下ECS和Discourse,一番折腾后论坛上线了:DataGeekers

当然本文只记录建站方法,不讲论坛😶

关于Discourse

介绍一下,Discourse目前是个全新的开源论坛,官方号称是定位于下一个十年的网络论坛服务:

其使用瀑布流主题,社交化的会话操作和消息推送,markdown输入贴合工程师习惯,同时多响应式布局在移动端的支持效果还不错,必要的功能兼具简洁的界面,首页样式如下:

discourse-overview

目前来看,Discourse在国外的普及度较高,国内的站点相对少些,多半的原因是百度收录的少。

准备工作

Discourse依赖Ruby on RailsEmber.jsPostgreSQLRedis环境来部署,没有这些技术经验的话很难手工部署成功,不过官方提供了docker image,省去了很多麻烦,因此为了提供站点服务,只需要:

  1. 一个域名:自行从服务商购买即可
  2. 服务邮箱:最重要的建站条件,购买域名的时候一般会附赠,需要至少一个域账户
  3. 可访问外网的Ubuntu服务器:最好是内存1G以上的ECS
  4. SSL证书/CDN服务:用于支持HTTPS,非必须

以上这些可以在任何一家国内云服务商上买到,我这里使用的阿里云。

开始部署

因为有了docker image,部署过程相对容易了很多,整个流程最主要的阻力来源于GFW,这里要感谢Discourse中文论坛,参考了很多网友的建议。如果你购买的国外ECS,几乎是一键build,没有参考本文的必要。

基础环境

为了方便后续进行更新,建议直接git clone下最新的代码然后部署到docker实例中,因此基础的环境只需要git客户端和docker即可,安装方法就不说明了……

唯一需要注意的是,国内访问源docker image的下载龟速,建议使用国内的source,在/etc/default/docker中替换如下内容:

1
DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn"

更改后重启docker服务service docker restart,这个源亲测速度可以。

容器配置

官方的建议,通常把代码clone到/var/discourse目录,需要修改配置文件/var/discourse/containers/app.yml

template部分

1
2
3
4
5
6
7
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/sshd.template.yml"
- "templates/web.china.template.yml" # 解决rubygems.org被墙问题

如果web.china.template.yml仍然被墙,那就只用代理了😑

env部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 域名
DISCOURSE_HOSTNAME: www.xxx.com
# 管理员账户,使用这些邮箱注册的用户的会自动获得管理员身份
DISCOURSE_DEVELOPER_EMAILS: 'xxx@live.com,xxx@outlook.com'
# 邮箱部分
DISCOURSE_SMTP_ADDRESS: smtp.mxhichina.com # 邮箱服务地址 - 从购买商那里获得
DISCOURSE_SMTP_PORT: 25 # 邮箱端口,一般为25
DISCOURSE_SMTP_USER_NAME: noreply@xxx.com # 邮箱的一个域账户,提前在邮箱服务建好
DISCOURSE_SMTP_PASSWORD: pwdforuser # 域账户密码
# SMTP登录设置 - 必须
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: true

邮箱是Discourse最重要的设置,DISCOURSE_SMTP_USER_NAME相当于论坛的系统邮箱,比如经常收到的某社区摘要,帐号重置邮件就是这样的帐号发送的,可以起些像noreplyadmin这样更加official的名称。

最后还要将刚才这个邮箱账户设置为系统提示邮箱notification_email

1
2
run:
- exec: rails r "SiteSetting.notification_email='noreply@xxx.com'"

初始化

第一次启动如下,时间根据网络环境在30分钟左右不等:

1
./launcher bootstrap app

后续启停docker:

1
2
3
4
5
# 重新构建,改了app.yml需要做,时间同初始化
./launch rebuild app
# 启停docker实例
./launcher stop app
./launcher start app

如果“一切顺利”,通过IP和域名就可以直接访问了(域名DNS配置好)。

HTTPS

HTTPS不用多说了,已经快2017年了,专业网站如果再不支持https,后续搜索引擎的收录都会是个问题。

这两年因为有Let's EncryptSymantec这类公信力较高的免费SSL证书,HTTPS普及有了很大的进展。

Discourse这里就可以原生支持https,来自Let's Encrypt的良心出品,只需要在简单配置,就能得到SSL证书,并完成自动续期。

1
2
3
4
templates:
- "templates/web.letsencrypt.ssl.template.yml" # 追加let's encrypt模版
env:
LETSENCRYPT_ACCOUNT_EMAIL: email@mydomain.com # 获取SSL证书的认证邮件 - 可以使用另一个域帐号

操作完成后再一次rebuild即可使用https访问主站。

开启了https后唯一的问题是访问速度,有条件的可以购买CDN服务,加速效果可观,亲测在边缘网络下有近3倍的速度提升。

后话

网站上线后,管理员要做大量的网站配置工作,备案、板块、登录等都需要亲自对照文档微调,琐碎又费力,这些会影响最终的页面效果和用户体验,因此样式、板块的选择和权衡也要结合后续论坛的定位。

尽管如此,这些都不如对社区持续运营和推广,毕竟论坛是为了促进交流和沉淀内容,如果做不到,最终可能就会变成一厢情愿,这个地方网站的运营人员后续需要投入很多精力。

另个最大的感受就是云服务的便利,建站所需几乎都可以在云上直接购买到,体验非常好,节省了以前很多无谓的折腾。这些计算、存储、网络托管的需求堪比衣食住行一样普遍,想来,云市场仍然有巨大空间,一个地方超市也不会只有一家沃尔玛。