開源社群Discourse在Rainbond上的部署
[TOC]
概述
Discourse 是一個完全開源的論壇平台。具有豐富的插件庫與主題庫,适用于開源社群的建構。
Rainbond官方社群就是基于Discourse搭建的實際案例。
Rainbond官方社群建立之初就已經使用了Discourse,當時的版本為 1.5.4。時過境遷,為了更好的社群體驗,Rainbond社群營運團隊決定部署最新版本的Discourse社群,并将原社群的資料遷移到新社群中。
這篇文檔,會詳細介紹如何在Rainbond容器雲平台上部署Discourse,以及在整個部署乃至遷移資料過程中所趟平的坑。對于有意搭建基于Discourse的社群的小夥伴,會有很大的幫助。
了解更多有關Discourse的資訊:
基于應用市場快速安裝
Discourse 已經釋出到了Rainbond應用市場,可以一鍵部署安裝,即點即用。

點選安裝,選擇應用後稍等一會,即可通路你的Discourse了
在正式使用前,一定要修改以下環境變量:
- 環境變量:
- DISCOURSE_DB_PASSWORD=你自定義的資料庫密碼
- DISCOURSE_DEVELOPER_EMAILS=管理者的郵箱位址
- DISCOURSE_HOSTNAME=為社群準備的域名,如果希望使用Rainbond預設為80端口生成的域名,這個值設定為 ${DOMAIN}
- DISCOURSE_SMTP_ADDRESS=可用的smtp伺服器
- DISCOURSE_SMTP_PORT=smtp伺服器的端口
- DISCOURSE_SMTP_USER_NAME=smtp賬戶
- DISCOURSE_SMTP_PASSWORD=smtp賬戶的密碼
修改完成後,就可以繼續注冊使用了。
Discourse應用如何制作
在使用舊版本Discourse的時候,為了将其容器化,我們做了很多工作。但在目前版本,Discourse官方已經支援并且主推容器化部署,這對于将Discourse部署在Rainbond容器雲平台非常友好。
接下來的部分,我将說明如何制作一個即點即用的Discourse應用。
擷取鏡像
部署的第一步,就是擷取到Discourse的鏡像。
差別于一般的容器化部署,Discourse并沒有将它自己的鏡像托管于
Docker Hub,而是為使用者準備了一套完整的工具,可以讓使用者高度自定義自己需要的鏡像,這套工具就是
discourse_docker。在這套工具裡,使用者可以根據其提供的模版自定義部署的方式、包含的插件等資訊,并通過一條指令,快速建構對應的鏡像;也可以利用它來管理本機正在運作的docker化部署的Discourse。
Discourse部署支援 all in one 的 Standalone 模式,也支援适用于生産的 Multiple 模式。Multiple 模式的意思,就是将Discourse 的WEB部分,和後端資料庫Postgresql、緩存中間件Redis分離部署。
本次部署,将使用 Multiple 模式。最終的拓撲,将會是下面這種情況:
-
環境的要求
首先,我們需要有一個可以運作docker服務的環境,如果你已經安裝了Rainbond容器雲平台,那麼叢集中任何一個節點,都可以滿足你的需要。如果你還沒有安裝Rainbond,或者根本不知道它是什麼,你需要點選
了解一下 。 - 擷取discourse_docker
git clone https://github.com/discourse/discourse_docker.git
-
配置模版
在項目的根目錄中,名為
的目錄下,會有我們所需要的模版檔案samples
web_only.yml
,将這兩個模版檔案拷貝到項目根目錄下的data.yml
目錄下。containers
-
自定義配置
Discourse最主要的自定義在于主題(theme) 和插件(plugins),其中主題可以在網站設定中配置,而插件的安裝,則需要修改上述的模版檔案。
編輯
web_only.yml
檔案,在第84行附近找到如下段落,并追加插件位址:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
- git clone https://github.com/discourse/discourse-whos-online.git
具體原理及操作,點選
其他的标準配置,如郵件伺服器的配置,均以環境變量的方式指定,目前可以保持預設,部署于Rainbond的時候,可以支援自定義環境變量進行替換。
關于Discourse
環境變量配置的說明關于Rainbond如何
自定義環境變量-
建構WEB服務鏡像
使用指令行工具
來建構 web_only 鏡像:launcher
./launcher bootstrap web_only
建構完成後,在伺服器的本地鏡像清單裡,就會出現對應的鏡像:
root@localhost:~/discourse_docker# docker images | grep web_only
local_discourse/web_only latest 79a99d0d8fd1 7 days ago 2.83GB
将這個鏡像推送至Docker hub或者私有的鏡像倉庫備用即可,在我的部署環境裡,我将其推送到了 Docker hub,具體的鏡像位址為:
rainbond/discourse_web:2.4.0-beta8
- 建構資料庫鏡像
使用指令行工具建構 data 鏡像
./launcher bootstrap data
root@iZj6chkije5xk0gfyvcrzyZ:~/discourse_docker# docker images | grep data
local_discourse/data latest 76e100480749 2 weeks ago 2.35GB
這個鏡像不必推送到鏡像倉庫,後續的步驟會繼續拆分這個鏡像,并進行資料自動初始化的處理。
目前建構出來的data鏡像,是一個合并了 postgresql 和 redis 的鏡像。這還不符合我們想要的部署方式,我要将它進行進一步的拆分。
我決定使用官方鏡像來運作 postgresql 和 redis。然後對 postgresql 進行處理,使之可以自動初始化。
redis 部署
這一步比較簡單,直接基于鏡像部署一個标準的redis即可:
postgresql部署
基于官方的postgresql鏡像做了進一步處理,使之可以自動初始化Discourse所需要的資料庫。
部署的方式使用了基于 Dockerfile 的源碼建構,項目位址:
https://github.com/dazuimao1990/pri-postgresql關鍵Dockerfile部分解析:
FROM postgres:10-alpine
MAINTAINER [email protected]
# 下面的步驟,會将初始化資料用的sql腳本放置在指定目錄下
ADD sql/*.sql /docker-entrypoint-initdb.d/
ADD docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENV TZ Aisa/Shanghai
ENV LANG en_US.utf8
ENV PGDATA /var/lib/postgresql/data
ENV PG_MAJOR 10
ENV PG_VERSION 10.11
VOLUME /var/lib/postgresql/data
EXPOSE 5432
自動初始化的原理參見:
https://hub.docker.com/_/postgres中的
Initialization scripts
部分。docker化的資料庫,大部分都支援這種方式自動初始化,這樣做的好處是,基于此鏡像的容器在首次啟動時,不需要其他操作,就會自動執行sql腳本完成初始化。對于Rainbond部署而言,在将這樣的資料庫作為應用的一部分釋出到應用市場後,執行一鍵安裝可以達到即安即用的效果。
這一步的另一個重點在于如何擷取初始化用的sql腳本。這需要利用到上個步驟建構出來的資料庫鏡像。
将這個鏡像啟動為容器:
./launcher start data
這時就會啟動一個已經初始化好了的data容器。我們需要将它裡面的資料庫
discourse
備份出來。
docker exec -ti data bash
pg_dump -d discourse -h 127.0.0.1 -U discourse > data.sqlpg_dump -d discourse -h 127.0.0.1 -U discourse > /shared/data.sql
輸入密碼後即可開始備份,備份完成後在伺服器的
/var/discourse/shared/data/
目錄下,找到對應的
data.sql
檔案。
在官方鏡像使用 data.sql 初始化的時候,發現一個小問題,官方鏡像沒有預設建立
role:postgres
故此手動在
data.sql
前面加入以下内容:
--
-- This row is added manually because when the SQL is imported manually, recived role "postgres" does not exist
--
CREATE USER postgres SUPERUSER;
準備就緒後,就可以在Rainbond部署訂制的postgresql 了
建構之前,需要定義進階設定:
- 元件部署類型 :有狀态服務
-
- POSTGRES_DB=discourse
- POSTGRES_PASSWORD=自定義的資料庫密碼
- POSTGRES_USER=discourse
部署Discourse_web
利用我們已經推送好的 rainbond/discourse_web:2.4.0-beta8 鏡像,來部署WEB服務部分。
點選建構之前,進行進階設定:
-
- DISCOURSE_DB_HOST=127.0.0.1
- DISCOURSE_DB_USERNAME=discourse
- DISCOURSE_REDIS_HOST=127.0.0.1
建立依賴
利用Rainbond
依賴關系,将三個服務建立起正确的依賴關系。
- discourse_web 依賴 postgresql10
- discourse_web 依賴 redis
通路
通路discourse_web的80端口所對應的域名,看到歡迎頁面即可證明系統部署完成了。
一些踩過的坑
郵件配置
Discourse初始化安裝,是會向管理者的郵箱發送注冊郵件的,是以正确的配置郵件服務是重中之重,官方推薦的郵件伺服器及配置方式參見:
https://github.com/discourse/discourse/blob/master/docs/INSTALL-email.md資料恢複
如果你是一個向我一樣的老版本使用者,那麼将舊版本的資料導入到新版本的 Discourse,就會是個非常必要的操作。Discourse支援全站資料的備份與恢複,但是我在實際恢複過程中遇到了很多問題,究其原因還是我的舊版本實在是太老了。具體的解決方式,請參見下面的文章,我得到了來自官方工程師大牛的幫助:
https://meta.discourse.org/t/restore-from-old-version-to-a-new-version-of-discourse-failed/135545