使用halo快速搭建應用文件中心

三國夢迴發表於2023-12-03

背景

之前我寫了一篇,用gitbook搭建文件中心,gitbook是一款搭建部落格的技術,是靜態部落格技術,不帶後臺管理系統、不帶資料庫,要發文章的話,是透過提供markdown檔案,渲染成html,透過nginx對外訪問。後來也給他們展示過其他靜態部落格技術如docsify搭建出來的樣子,我自己還是蠻喜歡的,比較簡潔,但是產品最終還是選擇了帶後臺管理系統的方案-halo。

這個halo,屬於動態部落格技術,國產的,java開發的,資料庫支援h2(記憶體資料庫,重啟丟資料,不要用於生產)、postgreSql、mysql。既然是動態部落格技術,那就是帶後臺管理系統的,適合給不懂技術的人員使用,好些人還是不習慣markdown的,markdown的話,圖床也是個問題(倒是可以用公司內部的oss服務)。

這個方案還是比較適合我們這邊,為啥呢,因為我們現在在搞信創,資料庫是國產的,國產資料庫有幾款是基於pg改的,我們的國產資料庫就屬於pg改的,所以這個方案也能滿足信創要求。

本文只是簡單記錄下搭建過程以及部分踩坑過程以備忘。

halo簡介

官網: https://www.halo.run/

演示站點:https://docs.halo.run/#線上體驗

文件:https://docs.halo.run/category/安裝指南

我們搭建出來的效果最終大概這樣(用的earth主題):

image-20231203200329360

搭建過程

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也行,但是生產上我們這邊是完全沒網,估計還是得這樣)

1db75525fd7fdbfd1acd2b9caf9526e

[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外掛

在內網伺服器上安裝會失敗,因為這個需要請求外網伺服器

image-20231128101218594

離線安裝markdown外掛:

外掛首頁:

https://www.halo.run/store/apps/app-HTyhC

image-20231128101613808

image-20231128101808000

安裝主題

image-20231128102735862

如果安裝報錯,請檢查“本地未安裝”中是否存在未安裝成功的主題。

備份恢復

這個功能對我很重要,我在開發環境搭好後,就是產品自己去搞成自己想要的效果了,為了避免轉測試、上線後,他需要再重複弄,這個整站的遷移功能就很重要,省了我很多事。

https://docs.halo.run/user-guide/backup

使用該機制,可以快速備份環境再匯入新環境,不用手動重新配置一遍。

搭建過程中涉及國產db的一個小坑

建立資料庫時,我是新建了一個專門的使用者,然後把新建的庫分給這個使用者。結果這個halo連上後,啟動時,一直說使用者名稱密碼錯誤,但是同樣的使用者名稱密碼,用dbeaver都是可以連線的,報錯的就是程式會報錯,當時還以為halo程式有問題。

後來也是抓包解決了:

1701608044716

是國產庫那邊,說,密碼第一次設定後,首次使用的話,必須要再改一次還是怎麼的,我改來改去都有問題。後來把問題反饋給那邊,那邊說這個首次使用的密碼必須強制修改的機制可以關閉,也是坑爹。

遺留問題

我們現在要上生產的話,資料庫密碼必須是配置成加密的,所以,我這個上線部署方案估計都有點問題,後面可能還是要看下halo的程式碼,我大概知道是用spring boot 3.x + jdk 17搞的,密碼加密不知道支援不,不支援的話,到時候還得二開一下。

結語

大概就是這些了,成都馬上又迎來幾個月的冬天了,瑟瑟發抖。