0. 簡(jiǎn)要介紹
Discourse 是由 Stack Overflow 創(chuàng)始人之一的 Jeff Atwood 主導(dǎo)的開源論壇項(xiàng)目详恼,使用時(shí)能感受到和 Stack Overflow 的關(guān)聯(lián)性叠纷,比如為鼓勵(lì)有效的技術(shù)討論沉噩、控制人身攻擊等做了很多努力笛谦,頁(yè)面的布局方式也有相似之處。Discourse 提供了非常豐富的配置方式盐类,也支持插件擴(kuò)展彼硫,是值得學(xué)習(xí)的論壇類開源項(xiàng)目。
本文主要介紹通過(guò) Docker 鏡像的方式在公有云環(huán)境中部署 Discourse 環(huán)境寝受,公有云選為阿里云坷牛,操作系統(tǒng)為 Ubuntu 16.04。
1. 準(zhǔn)備工作
1.1 阿里云環(huán)境準(zhǔn)備
Discourse 官方文檔中推薦的最低配置是 1 核 2G很澄,這里就選用了最低配:ecs.n4.small,對(duì)于沒(méi)有很高訪問(wèn)量的站點(diǎn),這個(gè)配置也足夠用了甩苛。
服務(wù)器購(gòu)買完成后蹂楣,記得要更新一下系統(tǒng),最新的系統(tǒng)修復(fù)了不少 bug:
apt update
apt upgrade -y
1.2 郵箱配置
Discourse 比較依賴郵箱系統(tǒng)讯蒲,需要根據(jù)郵箱來(lái)進(jìn)行注冊(cè)和消息通知痊土,所以一定要有一個(gè)可用的郵件服務(wù)系統(tǒng),Discourse 推薦使用第三方的郵件系統(tǒng)墨林,其實(shí)自己搭建也是完全可行的赁酝,但郵件系統(tǒng)搭建也要花費(fèi)一定的精力,而且也有一定的難度旭等,本文使用的郵箱系統(tǒng)是 ElastishMail酌呆,具體的注冊(cè)方式就不詳細(xì)描述了。
1.3 注冊(cè)域名
使用 IP 訪問(wèn)當(dāng)然也是沒(méi)有問(wèn)題的搔耕,不過(guò)總歸是不方便隙袁,建議還是為接下來(lái)要搭建的 Discourse 站點(diǎn)注冊(cè)一個(gè)域名,阿里云收購(gòu)了萬(wàn)網(wǎng)弃榨,所以域名注冊(cè)在阿里云的網(wǎng)站內(nèi)就可以搞定了菩收。
2. 基礎(chǔ)安裝
Discourse 本身是挺復(fù)雜的,看安裝過(guò)程的耗時(shí)和輸出信息就知道了鲸睛。幸運(yùn)的是娜饵,Discourse 提供了自動(dòng)化安裝的腳本,較低了部署的難度官辈。Discourse 依賴的軟件并不多划咐,主要是 git(用來(lái)拉取 Discourse 的代碼)、docker(因?yàn)橐褂?Docker 部署) 和 ruby(原因是 Discourse 是用 ruby 編寫的)以及 ruby 的包管理工具 gem钧萍。
安裝 git
# install git
$ sudo apt install git
安裝 docker
# install docker
$ sudo wget -qO- https://get.docker.com/ | sh
配置 docker 使用國(guó)內(nèi)的鏡像
# Configure docker to use Chinese mirrors
$ sudo vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com",
"http://hub.c.163.com"]
}
$ sudo systemctl restart docker.service
安裝 discourse
# install discourse
$ sudo -s
$ mkdir /var/discourse
$ git clone https://github.com/discourse/discourse_docker.git /var/discourse
$ cd /var/discourse
$ ./discourse-setup
運(yùn)行 discourse-setup 腳本后褐缠,會(huì)提示輸入一些安裝信息,以此輸入之前注冊(cè)的域名和郵箱信息即可风瘦。
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 port? [587]:
SMTP user name? [user@example.com]:
SMTP password? [pa$$word]:
Let's Encrypt account email? (ENTER to skip) [me@example.com]:
配置完成后队魏,需要進(jìn)行很久的編譯,稍安勿燥万搔,半小時(shí)之內(nèi)都是正常的胡桨。等待腳本 discourse-setup 腳本執(zhí)行結(jié)束,就可以訪問(wèn)剛剛配置好的 discourse 網(wǎng)站了瞬雹!
PS:Discourse 在國(guó)內(nèi)云環(huán)境中部署昧谊,因?yàn)楸娝苤脑颍浖南螺d可能會(huì)遇到問(wèn)題酗捌,本文所參考的一篇資料中談到了gem 的連接問(wèn)題呢诬,不過(guò)在寫作本文的過(guò)程中并沒(méi)有遇到該問(wèn)題涌哲,如果遇到網(wǎng)絡(luò)原因造成的安裝失敗,大家就需要各現(xiàn)神通了尚镰。
3. 進(jìn)階配置
3.1 設(shè)置自動(dòng)備份
為了網(wǎng)站的信息安全阀圾,當(dāng)然要對(duì)數(shù)據(jù)定期進(jìn)行備份,配置備份的界面如下:
圖中配置的是每天備份一次狗唉,保留最近的七個(gè)備份初烘。但這依然有問(wèn)題,原因是備份文件是存儲(chǔ)在 docker 內(nèi)部的分俯,萬(wàn)一 docker 崩潰了肾筐,備份文件也一樣拿不回來(lái),更為保險(xiǎn)的方式是將備份文件再上傳到第三方的存儲(chǔ)系統(tǒng)中缸剪,discourse 也支持這樣的配置吗铐,但因?yàn)?discourse 的作者生活在美帝,用的都是 S3橄登、Dropbox抓歼、Box 和 Google Drive,我等只有看著流口水的份拢锹,所以完全不可用谣妻。目前我的解決方式是 crontab 啟動(dòng)定時(shí)任務(wù),然后用 python 上傳備份文件到內(nèi)部的 Ceph 集群里卒稳,因?yàn)闆](méi)有通用性蹋半,就先不把這種方式的詳細(xì)步驟放上來(lái)了,如果有需要的話充坑,我可以考慮把上傳到 OSS 公有云的方法補(bǔ)充上减江。另外自己寫 Discourse 的插件也是可行的,只是我對(duì) Ruby 完全不了解捻爷,所以沒(méi)有采用這種方式辈灼。
3.2 設(shè)置 https
對(duì)于 HTTPS 的支持,discourse 也提供了自動(dòng)化腳本也榄,只需修改配置文件巡莹,并重新編譯即可。
修改配置文件:需要在 /var/discourse/containers/app.yml 的 templates 段中增加一個(gè)行:
$ cat /var/discourse/containers/app.yml
...
templates:
...
- "templates/web.letsencrypt.ssl.template.yml"
...
然后執(zhí)行以下命令:
$ /var/discourse/launcher rebuild app
腳本運(yùn)行結(jié)束后即完成了 https 的配置甜紫,但這個(gè)執(zhí)行時(shí)間依舊不短降宅,大概在十到二十分鐘。