前言
这是博主首次搭建个人博客,开始尝试玩弄一些服务器的操作。一开始,我逐步跟随技术大牛的教程进行操作,并习惯性地记录笔记。最近,我渐渐有了整理笔记并进行分享的想法。于是,我萌生了搭建个人博客的念头,并决定首次分享自己搭建博客的过程和所使用的方法。尽管我仍然是一名小白,如果我有任何错误之处,请大家指正,我会努力改进。好了,现在让我们开始吧!
特别致谢
本次分享的原作者:我不是咕咕鸽
教程摘录:【有趣的 Docker 项目】好用又强大的开源建站工具 —— Halo 2.0(链接:https://blog.laoda.de/archives/docker-compose-install-halo-version-2/?highlight=halo)
感谢咕咕鸽的分享
官网地址:https://halo.run/
GitHub 地址:https://github.com/halo-dev/halo
Demo 地址:https://demo.halo.run
Demo 后台:https://demo.halo.run/console
用户名:
demo
密码:
P@ssw0rd123..
正文
基本上安装过程与咕咕鸽分享的教程一致,只是部署的位置不同。咕咕鸽的教程是直接在服务器上部署。而我会将博客部署在内网环境中,并使用内网穿透的方式映射到公网中,最后通过反向代理实现域名访问。关于内网穿透,我会尽快更新,这里只做简要说明。同样,关于反向代理也只做配置的一部分说明。我目前使用的是 Zerotier 实现内网穿透,并使用 Nginx 做反向代理。
下面先讲讲为什么选择这样繁琐的方式搭建个人博客。其实,由于目前我的收入并不理想,所以在购买服务器时,我相对更注重价格而非性能。现在我的服务器上运行了较多的服务,为了将来能够拥有更多的玩法,我选择了内网穿透和反向代理的方式进行部署。
这种部署方式有一个好处就是,在内网环境中完成博客的部署后,我只需要在本地服务器上添加服务,通过穿透和反向代理就可以快速地映射到公网中。同样,如果在内网中发现了问题,也可以轻松进行修改,然后再映射到公网上。
好了,废话说了这么多,下面正式开始。
Halo 2.0 简介
在选择 Halo 博客之前,我看了很多平台,包括 Hexo、WordPress、Typecho 等。甚至在以前,我尝试过使用 HTML 自己编写前端,并直接在服务器上使用宝塔面板部署。最终,我选择了 Halo,因为它最适合我目前的需求。
由于工作原因,我需要记录一些笔记,并一直使用 Notion 进行记录。这次,我希望能够将个人博客和笔记需求合二为一,并且最重要的是博客必须轻量化。我不喜欢过于复杂的界面,因此 Halo 成为了最适合我的平台。
Halo 界面简单、功能完善,且支持后台编辑,非常适合我当前的个人需求。
有关更详细的特点,大家可以访问官网(https://www.halo.run)了解。
项目部署
环境准备
当前部署环境:
服务器:本地服务器(戴尔 R730XD)
部署系统:Debian 12(EXSI 8.0 虚拟机)
需要安装:Docker、Docker-compose、Nginx Proxy Manager(可选)、Zerotier(可选)
需要准备一个域名(可选)。在进行反向代理时需要使用,我的域名是很久以前在贝锐(https://domain.oray.com)购买的。大家可以自己寻找平台购买,也可以使用免费的域名。——小声地嘀咕:如果条件允许,建议看看国外的供应商,国内备案太麻烦
再啰嗦一点,关于本地搭建 all-in-one 的方法我会尽快更新,这次视频暂时不展开。
部署 Halo
通过 SSH 登录到服务器(最好使用 ROOT 用户登录,以防权限不足)。这里我演示使用 MAC OS 终端命令ssh 「用户名」@「IP地址」 -p 「端口号」
格式进行登录。
ssh [root@10.100.1.21](mailto:root@10.100.1.21) -p 22
输入用户密码后即可登录。
接下来创建安装目录,并进入该目录。可以任意创建,便于分类容器。
mkdir -p /root/data/docker_data/halo
cd /root/data/docker_data/halo
这里使用 Docker Compose 进行部署。首先在文件夹中创建一个 docker-compose.yml
文件(我习惯使用 vi 工具,大家可以使用其他工具,原理相同):
vi docker-compose.yml
然后将 Docker Compose 的内容直接复制到 docker-compose.yml
文件中:
version: "3"
services:
halo:
image: halohub/halo:2.10
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "9100:8090"
# 将内部端口8090映射到容器外部9100,确保外部端口未被占用
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 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=o#DwN&JSa56
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=https://xn--9krq6q.xn--1jvr1n.xn--fiqs8s
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"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo
networks:
halo_network:
⚠️注意:
一定要修改数据库密码以防意外发生--halo.external-url=http://localhost:8090/
,其中的http://localhost:8090/
需要更改为你的域名。如果你想使用域名 abc.com,将其改为--halo.external-url=https://abc.com
在数据库的3306
端口处,我并未将其写成3306:3306
,而是改为了前者。这样做是为了不将 Halo 数据库的端口暴露在公网,从而在一定程度上保障博客的安全性(来自咕咕鸽的额外提醒)
保存退出。如果和我一样使用 vi 工具,请直接按下 ESC 键,然后输入英文冒号 :wq
即可保存并退出。
保存成功后,可以查看端口情况,防止冲突。如果同时运行了许多服务,可以使用 lsof -i:「端口号」
命令查询。
lsof -i:8090
lsof -i:3306
如果出现下面的命令未找到的错误信息:-bash: lsof: command not found
,可以运行 apt install lsof
命令安装 lsof。
apt install lsof
如果查询端口没有显示任何信息,说明该端口未被占用。
这样我们就可以开始部署了,在确保当前处于刚刚设置 Docker Compose 的文件夹下时,使用 docker-compose up -d
开始部署 Halo。
cd /root/data/docker_data/halo # 进入 docker-compose 文件所在的文件夹下
docker-compose up -d
如果使用 docker-compose up -d
命令时出现 ***yaml: line 17: found character that cannot start any token
错误。只需要重新进入 docker-compose,删除注释即可(小声地嘀咕,写文章的时候正在同步操作,习惯性地按了 TAB 键。当然,发布时肯定已经修改了这个问题)。
安装完成后,理论上我们可以使用 http://IP:9100
访问 Halo 了。
然后首次访问我们根据自己的情况进行设置,设置完成即可登录。
这篇文章将是我在博客上发布的第一篇文章。🥰🥰🥰
到这里,重新使用 http://IP:9100
就可以访问前端了。接下来,大家可以自行探索 Halo 的使用。
内网穿透和反向代理
由于我在服务器上进行了内网穿透,公网服务器可以直接使用 IP 访问内网。关于内网穿透的教程,我会尽快更新。因此,我们直接进行反向代理的设置,进入 Nginx Proxy Manager 后台。
在后台设置域名、内网地址和端口号。
注意⚠️:
对于docker-compose.yml
文件中的--halo.external-url=http://localhost:8090/
部分,其中的http://localhost:8090/
需要更改为你的域名。例如,如果你的域名是abc.com
,那么需要改为--halo.external-url=https://abc.com
(来自咕咕鸽的额外提醒)。
然后申请一个 SSL 证书,只允许加密通信。
最后,使用域名尝试访问。
成功!🎉🎉🎉我即将更新我的第一篇博客。
卸载 Halo
卸载 Halo 首先进入到 Halo 的 Docker Compose 文件夹中,使用 docker-compose down
命令删除。
cd /root/data/docker_data/halo
docker-compose down
然后返回上一级文件夹,使用 rm -rf 「文件路径」
删除相应的文件。
成功删除后,就没有 Halo 文件夹了。
结尾
感谢大家观看,这是我第一次写博客。如果有问题,请随时指出。祝大家使用愉快。教程中还未涉及的内容,我会尽快更新。请大家耐心等待。(小声地嘀咕:我仍然是一个新手,如果有错误之处,请多包涵。欢迎大家指出。)
如果有问题,可以在 GitHub 提出 Issues,也可以在评论区或 Halo 的官方论坛中相互交流和探讨。
最后,感谢 Halo 团队的辛勤付出,让我们能够使用如此优秀的博客!
同时感谢咕咕鸽(小声地嘀咕:实际上,文章中的很多内容都是咕咕鸽写的。我只是稍作搬运,并加入了一些自己的东西)。