之前我寫了一篇,用gitbook搭建檔案中心,gitbook是一款搭建部落格的技術,是靜態部落格技術,不帶後臺管理系統、不帶資料庫,要發文章的話,是通過提供markdown檔案,渲染成html,通過nginx對外存取。後來也給他們展示過其他靜態部落格技術如docsify搭建出來的樣子,我自己還是蠻喜歡的,比較簡潔,但是產品最終還是選擇了帶後臺管理系統的方案-halo。
這個halo,屬於動態部落格技術,國產的,java開發的,資料庫支援h2(記憶體資料庫,重啟丟資料,不要用於生產)、postgreSql、mysql。既然是動態部落格技術,那就是帶後臺管理系統的,適合給不懂技術的人員使用,好些人還是不習慣markdown的,markdown的話,圖床也是個問題(倒是可以用公司內部的oss服務)。
這個方案還是比較適合我們這邊,為啥呢,因為我們現在在搞信創,資料庫是國產的,國產資料庫有幾款是基於pg改的,我們的國產資料庫就屬於pg改的,所以這個方案也能滿足信創要求。
本文只是簡單記錄下搭建過程以及部分踩坑過程以備忘。
演示站點:https://docs.halo.run/#線上體驗
檔案:https://docs.halo.run/category/安裝指南
我們搭建出來的效果最終大概這樣(用的earth主題):
之前也寫了個內網環境沒網如何用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/
有網路的話,這個就行:
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 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外掛:
https://docs.docker.com/compose/install/linux/
然後就照著這裡弄吧:
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外掛:
外掛首頁:
https://www.halo.run/store/apps/app-HTyhC
如果安裝報錯,請檢查「本地未安裝」中是否存在未安裝成功的主題。
這個功能對我很重要,我在開發環境搭好後,就是產品自己去搞成自己想要的效果了,為了避免轉測試、上線後,他需要再重複弄,這個整站的遷移功能就很重要,省了我很多事。
https://docs.halo.run/user-guide/backup
使用該機制,可以快速備份環境再匯入新環境,不用手動重新設定一遍。
建立資料庫時,我是新建了一個專門的使用者,然後把新建的庫分給這個使用者。結果這個halo連上後,啟動時,一直說使用者名稱密碼錯誤,但是同樣的使用者名稱密碼,用dbeaver都是可以連線的,報錯的就是程式會報錯,當時還以為halo程式有問題。
後來也是抓包解決了:
是國產庫那邊,說,密碼第一次設定後,首次使用的話,必須要再改一次還是怎麼的,我改來改去都有問題。後來把問題反饋給那邊,那邊說這個首次使用的密碼必須強制修改的機制可以關閉,也是坑爹。
我們現在要上生產的話,資料庫密碼必須是設定成加密的,所以,我這個上線部署方案估計都有點問題,後面可能還是要看下halo的程式碼,我大概知道是用spring boot 3.x + jdk 17搞的,密碼加密不知道支援不,不支援的話,到時候還得二開一下。
大概就是這些了,成都馬上又迎來幾個月的冬天了,瑟瑟發抖。