背景
之前我寫了一篇,用gitbook搭建文檔中心,gitbook是一款搭建博客的技術,是靜態博客技術,不帶後臺管理系統、不帶數據庫,要發文章的話,是通過提供markdown文件,渲染成html,通過nginx對外訪問。後來也給他們展示過其他靜態博客技術如docsify搭建出來的樣子,我自己還是蠻喜歡的,比較簡潔,但是產品最終還是選擇了帶後臺管理系統的方案-halo。
這個halo,屬於動態博客技術,國產的,java開發的,數據庫支持h2(內存數據庫,重啓丟數據,不要用於生產)、postgreSql、mysql。既然是動態博客技術,那就是帶後臺管理系統的,適合給不懂技術的人員使用,好些人還是不習慣markdown的,markdown的話,圖牀也是個問題(倒是可以用公司內部的oss服務)。
這個方案還是比較適合我們這邊,爲啥呢,因爲我們現在在搞信創,數據庫是國產的,國產數據庫有幾款是基於pg改的,我們的國產數據庫就屬於pg改的,所以這個方案也能滿足信創要求。
本文只是簡單記錄下搭建過程以及部分踩坑過程以備忘。
halo簡介
演示站點:https://docs.halo.run/#在線體驗
文檔:https://docs.halo.run/category/安裝指南
我們搭建出來的效果最終大概這樣(用的earth主題):
搭建過程
docker安裝
之前也寫了個內網環境沒網如何用rpm搭建docker的文章,後來有好心人提示我可以用更簡單的辦法。
可以參考官網這裏,https://docs.docker.com/engine/install/binaries/
這個是直接利用靜態鏈接的方式,把docker需要的所有的二進制都搞到這一個壓縮包裏了,比如說,大家安裝nginx的時候,經常提示大家缺少了openssl、pcre等動態庫,這種就屬於動態鏈接了,其實你也可以不依賴系統的動態庫,直接指定openssl、pcre的源碼,然後直接編譯進最終的nginx的二進制文件裏,這種就是靜態鏈接了,這種的問題是,如果運維統一升級了openssl這些,但你自己編譯的這個nginx還是老版本,就會有風險,這裏的這種docker安裝方式,也是同樣道理。
但是我這邊反正是用這種方式,文檔中心也不怎麼重要,內網也很少遇到需要升級這些基礎組件的場景,開整。
https://download.docker.com/linux/static/stable/x86_64/
下載了 docker-24.0.7.tgz
tar xzvf docker-24.0.7.tgz
cp docker/* /usr/bin/
[root@AppDevPlatform3 upload]# docker -v
Docker version 24.0.7, build afdd53b
啓動:
dockerd &
檢查:
[root@AppDevPlatform3 upload]# ps -ef|grep docker
root 1101154 1005806 1 15:34 pts/0 00:00:00 dockerd
root 1101163 1101154 0 15:34 ? 00:00:00 containerd --config /var/run/docker/containerd/containerd.toml
如果生產安裝的話,可以再多搞點事,比如開機自啓動、非root用戶啓動:
https://docs.docker.com/engine/install/linux-postinstall/
加載halo的image
有網絡的話,這個就行:
https://hub.docker.com/r/halohub/halo
docker pull halohub/halo
內網機器沒網的話,我是先在有網的機器上把鏡像拉下來後,用docker save後傳輸到內網機器後,docker load來解決這個問題。(公司內docker私服ok也行,但是生產上我們這邊是完全沒網,估計還是得這樣)
[root@xxx local-image]# docker load <halo.tar
01d4e4b4f381: Loading layer [==================================================>] 80.35MB/80.35MB
...
3.072kB/3.072kB
創建數據庫
這個就大家自己弄吧,假設建了個庫叫test,url爲:1.1.1.1:5432/test
啓動docker
我這邊是沒打算用docker compose方式,因爲安裝docker compose還要多費點事情,然後docker compose的話,是會自己給我們整一個halo進程 + mysql/postgre進程,我這邊都有外置的db了,單跑個docker足矣。
docker run -it -d --privileged --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
--server.port=8090
--spring.r2dbc.url=r2dbc:pool:postgresql://1.1.1.1/test?currentSchema=test
--spring.r2dbc.username=abc
--spring.r2dbc.password=def
--spring.sql.init.platform=postgresql
這塊主要是數據庫相關的參數,我這個是連接pg庫的,參數的詳細信息,大家參考官網文檔:
https://docs.halo.run/getting-started/install/docker
我這邊加了個--privileged參數,是因爲我遇到個什麼報錯來着,啓動不了,加了後就ok了。
參數詳解:https://www.python100.com/html/100478.html
使用docker-compose啓動(可選)
如果還是選擇用docker-compose,這裏也簡單記錄下,安裝docker-compose插件:
https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
然後就照着這裏弄吧:
https://docs.halo.run/getting-started/install/docker-compose
我貼下我的配置:
docker-compose.yaml
version: "3"
services:
halo:
image: halohub/halo:2.10
container_name: halo
restart: on-failure:3
network_mode: "host"
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://1.1.1.15432/test?currentSchema=abc
- --spring.r2dbc.username=abc
- --spring.r2dbc.password=def
- --spring.sql.init.platform=postgresql
- --server.port=8090
docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml logs -f
訪問網站及後臺
訪問對應的ip:8090端口即可。
安裝markdown插件
在內網服務器上安裝會失敗,因爲這個需要請求外網服務器
離線安裝markdown插件:
插件首頁:
https://www.halo.run/store/apps/app-HTyhC
安裝主題
如果安裝報錯,請檢查“本地未安裝”中是否存在未安裝成功的主題。
備份恢復
這個功能對我很重要,我在開發環境搭好後,就是產品自己去搞成自己想要的效果了,爲了避免轉測試、上線後,他需要再重複弄,這個整站的遷移功能就很重要,省了我很多事。
https://docs.halo.run/user-guide/backup
使用該機制,可以快速備份環境再導入新環境,不用手動重新配置一遍。
搭建過程中涉及國產db的一個小坑
創建數據庫時,我是新建了一個專門的用戶,然後把新建的庫分給這個用戶。結果這個halo連上後,啓動時,一直說用戶名密碼錯誤,但是同樣的用戶名密碼,用dbeaver都是可以連接的,報錯的就是程序會報錯,當時還以爲halo程序有問題。
後來也是抓包解決了:
是國產庫那邊,說,密碼第一次設置後,首次使用的話,必須要再改一次還是怎麼的,我改來改去都有問題。後來把問題反饋給那邊,那邊說這個首次使用的密碼必須強制修改的機制可以關閉,也是坑爹。
遺留問題
我們現在要上生產的話,數據庫密碼必須是配置成加密的,所以,我這個上線部署方案估計都有點問題,後面可能還是要看下halo的代碼,我大概知道是用spring boot 3.x + jdk 17搞的,密碼加密不知道支持不,不支持的話,到時候還得二開一下。
結語
大概就是這些了,成都馬上又迎來幾個月的冬天了,瑟瑟發抖。