網站首頁 編程語言 正文
概述
Discourse 是一個完全開源的論壇平臺。具有豐富的插件庫與主題庫,適用于開源社區的構建。Rainbond官方社區就是基于Discourse搭建的實際案例。
Rainbond官方社區建立之初就已經使用了Discourse,當時的版本為 1.5.4。時過境遷,為了更好的社區體驗,Rainbond社區運營團隊決定部署最新版本的Discourse社區,并將原社區的數據遷移到新社區中。
這篇文檔,會詳細介紹如何在Rainbond容器云平臺上部署Discourse,以及在整個部署乃至遷移數據過程中所趟平的坑。對于有意搭建基于Discourse的社區的小伙伴,會有很大的幫助。
了解更多有關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服務鏡像
使用命令行工具 launcher
來構建 web_only 鏡像:
./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 guox@goodrain.com # 下面的步驟,會將初始化數據用的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_PASSWORD=你自定義的數據庫密碼
DISCOURSE_DB_USERNAME=discourse
DISCOURSE_DEVELOPER_EMAILS=管理員的郵箱地址
DISCOURSE_HOSTNAME=為社區準備的域名,如果希望使用Rainbond默認為80端口生成的域名,這個值設置為 ${DOMAIN}
DISCOURSE_REDIS_HOST=127.0.0.1
DISCOURSE_SMTP_ADDRESS=可用的smtp服務器
DISCOURSE_SMTP_PORT=smtp服務器的端口
DISCOURSE_SMTP_USER_NAME=smtp賬戶
DISCOURSE_SMTP_PASSWORD=smtp賬戶的密碼
建立依賴
利用Rainbond依賴關系,將三個服務建立起正確的依賴關系。
discourse_web 依賴 postgresql10
discourse_web 依賴 redis 訪問
訪問
discourse_web的80端口所對應的域名,看到歡迎頁面即可證明系統部署完成了。
一些踩過的坑
郵件配置
Discourse初始化安裝,是會向管理員的郵箱發送注冊郵件的,所以正確的配置郵件服務是重中之重,官方推薦的郵件服務器及配置方式參見:
https://github.com/discourse/discourse/blob/main/docs/INSTALL-email.md
數據恢復
如果你是一個向我一樣的老版本用戶,那么將舊版本的數據導入到新版本的 Discourse,就會是個非常必要的操作。Discourse支持全站數據的備份與恢復,但是我在實際恢復過程中遇到了很多問題,究其原因還是我的舊版本實在是太老了。具體的解決方式,請參見下面的帖子,我得到了來自官方工程師大牛的幫助:
https://meta.discourse.org/t/restore-from-old-version-to-a-new-version-of-discourse-failed/135545
原文鏈接:https://blog.csdn.net/zqg5258423/article/details/103816593
相關推薦
- 2022-05-22 python_tkinter彈出對話框創建_python
- 2022-03-29 C語言中的getchar()使用詳解_C 語言
- 2022-06-06 淺談Redis?中的過期刪除策略和內存淘汰機制_Redis
- 2023-01-03 在C語言中getchar的使用方法和讀取規則講解_C 語言
- 2024-07-15 SpringBoot使用Apache Poi導出word文檔
- 2022-02-24 Kubernetes究竟是個容器應用程序還是集群操作系統,它這么復雜的原因出在哪?
- 2023-01-20 Python輸入整數進行排序方式_python
- 2022-10-17 docker網絡及部署集群和打包鏡像問題_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支