用全站 CDN 部署 Discourse 論壇
- 2020 年 4 月 8 日
- 筆記
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 分鐘後,可通過之前設定的域名: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: [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 論壇服務的一點小小的心得,本文中如有錯誤或疏漏還請多指教。最後,歡迎大家前往 discuss.nebula-graph.io 參與圖資料庫及開源的討論~
作者有話說:Hi,我是 George,是 Nebula Graph 的實施工程師,在運維領域有一些心得體會,希望能為圖資料庫領域帶來一些自己的貢獻。希望本文對你有所幫助,如果有錯誤或不足也請與我交流,不甚感激!
以上為 Nebula Graph 部署 Discourse 論壇服務的一點小小的心得,本文中如有錯誤或疏漏歡迎前往 Nebula Graph 的 GitHub:https://github.com/vesoft-inc/nebula 提建議 ?;加入 Nebula Graph 交流群,請聯繫 Nebula Graph 官方小助手微訊號:NebulaGraphbot