
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)? [[email protected],[email protected]]:[管理者郵箱,此郵箱不會公開]
SMTP server address? [smtp.example.com]: [SMTP郵件伺服器位址]
SMTP port? [587]: [SMTP郵件伺服器端口]
SMTP user name? [[email protected]]: [論壇自動發信郵箱賬号]
SMTP password? [pa$$word]: [論壇自動發信郵箱賬号的密碼]
Let's Encrypt account email? (ENTER to skip) [[email protected]]: [自動更新證書的通知郵箱位址]
SSL 注意事項
使用 SSL 需要注意的是,如果 DNS 記錄還未傳播至伺服器所使用的 DNS 伺服器,将無法使用 Let’s Encrypt 的 SSL 證書自動注冊服務。由于我們将使用上文中已申請的 Cloudflare 證書,是以這裡可以跳過 Let's Encrypt account email 這一項。
論壇啟動
大約等待 10 分鐘後,可通過之前設定的域名:
通路自己的 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: [email protected]
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 論壇服務的一點小小的心得,本文中如有錯誤或疏漏還請多指教。最後,歡迎大家前往
參與圖資料庫及開源的讨論~
作者有話說:Hi,我是 George,是 Nebula Graph 的實施工程師,在運維領域有一些心得體會,希望能為圖資料庫領域帶來一些自己的貢獻。希望本文對你有所幫助,如果有錯誤或不足也請與我交流,不甚感激!
以上為 Nebula Graph 部署 Discourse 論壇服務的一點小小的心得,本文中如有錯誤或疏漏歡迎前往 Nebula Graph 的 GitHub:
https://github.com/vesoft-inc/nebula提建議 👏;加入 Nebula Graph 交流群,請聯系 Nebula Graph 官方小助手微信号:
NebulaGraphbot