前言
號(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)題:
默認(rèn)的 【Docker部署】 方式需要使用 H2 Database 數(shù)據(jù)庫(kù)。但是作為一個(gè)長(zhǎng)期運(yùn)營(yíng)的平臺(tái),H2 肯定不行,所以只能選擇【DockerCompose部署】方式
騰訊云 Linux 發(fā)行版軟件倉(cāng)庫(kù)中的 Docker 版本過(guò)舊,默認(rèn)的 docker 版本較低,與 halo 的compose.yml 不兼容。
騰訊云主機(jī)訪(fǎng)問(wèn)跨境網(wǎng)絡(luò)不太穩(wěn)定,如果需要從 github 上安裝相關(guān)軟件,則經(jīng)常會(huì)下載失敗。
官方文檔說(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ò)信息即可