Halo Blog 搭建筆記

前言

號(hào)稱(chēng)好久之前就要開(kāi)始自己搭個(gè)個(gè)人 blog 系統(tǒng)的,卻遲遲因?yàn)楦鞣N原因,一直沒(méi)有付諸于行動(dòng)。

想寫(xiě)的東西有很多,卻也遲遲沒(méi)有整理出對(duì)外可以分享的東西。 不想寫(xiě)些流水,不想將就。

但是世界上本沒(méi)有完美之物,這才是進(jìn)化被需要的本質(zhì)所在

好了,前言廢話(huà)結(jié)束,直接進(jìn)入正篇。

系統(tǒng)選型

按照程序員的思維,搭建之前肯定需要技術(shù)選型。 放狗搜索了一陣子,綜合對(duì)比下來(lái),選擇了 Halo 這個(gè) blog 開(kāi)源系統(tǒng)。 選擇它有四個(gè)核心因素,分別是:功能相對(duì)比較完備,系統(tǒng)皮膚做得不錯(cuò),開(kāi)源,Java 代碼編寫(xiě),插件也相對(duì)比較豐富。

其他的一些開(kāi)源 blog 產(chǎn)品,要不皮膚做得差,要不維護(hù)更新不太頻繁。 當(dāng)然如果有你覺(jué)得更好的blog,也可以幫忙推薦下。

環(huán)境搭建

四大問(wèn)題

主要參考官方文檔,但是官方文檔的安裝還是挺有門(mén)檻的,非程序員出身一般都搞不定。我當(dāng)時(shí)買(mǎi)的是騰訊云主機(jī),在根據(jù)Halo官方文檔安裝時(shí),主要遇到如下幾個(gè)問(wèn)題:

  1. 默認(rèn)的 【Docker部署】 方式需要使用 H2 Database 數(shù)據(jù)庫(kù)。但是作為一個(gè)長(zhǎng)期運(yùn)營(yíng)的平臺(tái),H2 肯定不行,所以只能選擇【DockerCompose部署】方式

  2. 騰訊云 Linux 發(fā)行版軟件倉(cāng)庫(kù)中的 Docker 版本過(guò)舊,默認(rèn)的 docker 版本較低,與 halo 的compose.yml 不兼容。

  3. 騰訊云主機(jī)訪(fǎng)問(wèn)跨境網(wǎng)絡(luò)不太穩(wěn)定,如果需要從 github 上安裝相關(guān)軟件,則經(jīng)常會(huì)下載失敗。

  4. 官方文檔說(shuō)的 Nginx Proxy Manager 并不好用,無(wú)法幫我生成 https 證書(shū)(反向代理還是比較 work 的)。

關(guān)鍵步驟

安裝 docker

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin       

安裝成功后的版本

lighthouse@VM-4-3-ubuntu:~$ docker compose version
Docker Compose version v2.21.0
lighthouse@VM-4-3-ubuntu:~$ docker --version
Docker version 24.0.7, build afdd53b

修改compose.yml

主要是修改這兩處數(shù)據(jù)庫(kù)密碼:

- --spring.r2dbc.password=o#DwN&JSa56
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56

完整的 yam 格式如下:

version: "3"

services:
  halo:
    image: halohub/halo:2.11
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
      - --spring.r2dbc.username=root
      # MySQL 的密碼,請(qǐng)保證與下方 MYSQL_ROOT_PASSWORD 的變量值一致。
      - --spring.r2dbc.password=o#DwN&JSa56
      - --spring.sql.init.platform=mysql
      # 外部訪(fǎng)問(wèn)地址,請(qǐng)根據(jù)實(shí)際需要修改
      - --halo.external-url=http://localhost:8090/

  halodb:
    image: mysql:8.1.0
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    command: 
      - --default-authentication-plugin=caching_sha2_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    environment:
      # 請(qǐng)修改此密碼,并對(duì)應(yīng)修改上方 Halo 服務(wù)的 SPRING_R2DBC_PASSWORD 變量值
      - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
      - MYSQL_DATABASE=halo

networks:
  halo_network:

安裝Nginx

這里需要先說(shuō)明一下,我的測(cè)試聯(lián)調(diào)步驟:

  • 測(cè)試 java serverr 能否正常訪(fǎng)問(wèn)

  • 測(cè)試 http+nginx 協(xié)議訪(fǎng)問(wèn)網(wǎng)站

  • 測(cè)試 https++nginx 協(xié)議訪(fǎng)問(wèn)網(wǎng)站

官方文檔推薦安裝 NPM(Nginx Proxy Manager) (https://docs.halo.run/getting-started/install/other/nginxproxymanager) 但是我發(fā)現(xiàn)成功安裝后,通過(guò) http+nginx 協(xié)議能夠正常訪(fǎng)問(wèn)網(wǎng)站,但是 https 證書(shū)無(wú)法安裝成功,NPM 各種報(bào)錯(cuò)。

這里附一下常用的命令

sudo docker pull halohub/halo:2.11

vi compose.yaml

sudo docker compose up -d

sudo docker compose down

wget http://127.0.0.1:8090/console  (看看Java server 能否正常工作)

另外,記得最后需要關(guān)閉在外網(wǎng)測(cè)試使用的一些端口,比如 8090 81 端口 。

Https證書(shū)

因?yàn)?NPM 報(bào)錯(cuò)了,所以我根據(jù)了它的報(bào)錯(cuò)信息,發(fā)現(xiàn)它也是封裝了certbot 這種工具。然后我就決定索性繞過(guò) NPM,直接使用certbot來(lái)安裝了。

根據(jù)官網(wǎng) https://certbot.eff.org/ 介紹,選擇對(duì)應(yīng)的反向代理和操作系統(tǒng)版本,進(jìn)行安裝就基本可以了。

這里有個(gè)點(diǎn)需要注意,就是配置自動(dòng)更新證書(shū)。根據(jù) https://www.digitalocean.com/community/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-ubuntu-20-04#step-4-handling-certbot-automatic-renewals 的介紹,我們需要在系統(tǒng)重啟后或者證書(shū)更新后,重新觸發(fā) nginx 等反向代理去刷新配置。在 numnan.com.conf 這個(gè)文件最后,加上這句話(huà)

renew_hook = systemctl reload nginx    # 
cd /etc/letsencrypt/renewal
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ ls  ## 顯示結(jié)果根據(jù)你的域名而定
numnan.com.conf
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ vi numnan.com.conf 
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ sudo vi numnan.com.conf 
lighthouse@VM-4-3-ubuntu:/etc/letsencrypt/renewal$ sudo certbot renew --dry-run # 執(zhí)行沒(méi)有報(bào)錯(cuò)信息即可

附錄

  1. 【Halo 官方文檔鏈接】

  2. 【Ubuntu 系統(tǒng)安裝 docker】

  3. 【CerBot 自動(dòng)更新 https 證書(shū)】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容