搭建Halo博客
写在开始前
平常工作生活中,我会写一些markdown
的文章,用来记录工作中遇到的问题,或者写一些教程,以便将来重新遇到相同的问题,或是需要部署相同的东西时,能通过记录快速避开已经解决过的问题。
在搭博客之前,因为上海疫情原因,只能居家办公,公司的电脑又没有拿回来,导致我在公司写的一些markdown
笔记没有及时同步到家里的电脑上,这时候就出现了版本冲突的问题,所以其实我只是想有一个可以远程同步功能的markdown
工具。这是搭博客的原因之一。
那么另一个原因就是平常遇到很有挑战性的东西时,记录下来后很想和周围人分享,但我也不想写到一些国内的网站上,所以这就促使我搭建个人的博客网站了。自己的博客不管怎么整都无所谓,还能满足自己开心就好的条件。
于是在机缘巧合下,在github
上看到halo
博客,感觉颜值很能打,功能也很不错,所以决定搭一个自己的博客。感谢Ryan Wang大神开源了这么好的博客系统,也感谢所有做出贡献的开发者们。那么我们就开始搭建Halo吧。
参考资料:
Halo官网:https://halo.run
Github:https://github.com/halo-dev/halo
Halo官方文档:https://docs.halo.run
其实Halo
官方教程写的非常全面,非常清晰。但我有些不同的需求,所以自己研究了一阵子,总算把自己的博客搭建成功了。
本篇文章将会介绍使用docker-compose
搭建Halo
博客,并连接自己的mysql
数据库,redis
服务端及nginx
。在halo
官方教程中,mysql
和redis
都是用docker-compose
部署的。我本人是不太喜欢将有状态的服务用docker
部署的,如果你跟我一样想自己部署mysql
和redis
,可以参考我这篇文章。
1. 准备工作
那么我们想要搭建一个自己的博客,首先需要一台vps服务器和一个域名,当然我们可能还需要一些Linux
相关的知识,不过如果你是小白,也可以跟着教程一步一步搭建,一步一步学习,其实搭建博客还是很简单的。
1.1 vps服务器
首先我们需要一台服务器来部署Halo
博客,如果想知道如何购买vps,推荐一个我在购买vps时参考的博主咕咕鸽,他的博客有很多关于vps的介绍和测试,欢迎大家去看看,买到心仪的vps。本文不介绍如何购买服务器。
因为懒得备案的缘故,所以我的服务器选择的是RackNerd,主要的原因是同样价格下,RackNerd的vps给的更多一些,不管是CPU核心数还是RAM等。虽然性能并不是多好,但可以搭建更多好玩的东西,另外就是不用备案了。
服务器的操作系统,选择debian
或是centos
又或者是其他linux
操作系统都是可以的,本文选择的是centos
,因为我本人对centos
更加熟悉,所以选择了它,大家可以根据自己的喜好选择。
1.2 域名配置(可选)
另外我自己的站点用IP
访问就太low了,所以需要一个域名来提高b格。我是在namesilo 购买的域名,大家也可以在网上看看好的域名网站,选择适合自己的就可以。
那么当我们拥有了域名后,我们就要设置域名指向我们自己的服务器了,选择增加A
记录,前缀可以不填,直接使用domain.com
即可,当然我们也可以设置一下CNAME
,将www.domain.com
指向domain.com
,这样当你访问www.domain.com
时,将会指向domain.com
。当然你也可以设置两条A记录,两者选一种即可。
1.3 基础软件安装简单使用
先下载必要的软件
vim
是编辑器软件,我们之后修改文件内容使用net-tools
用于查看网络信息的依赖包(非必需)htop
查看服务器信息的软件,可以当作是top
的升级版(非必需)
#安装必要软件包
#vim
yum install -y vim* net-tools
#新建一个文件,自带命令
touch xxx.config
#使用vim编辑文件内容
vim xxx.config
# 了解以下3个命令即可简单修改文件
# 使用 i 命令,进行输入(insert)状态,可以增删了
# 使用 control C 退出输入(insert)状态
# 使用 :wq 进行保存并退出
2. 搭建及配置博客所需中间件
3.1 nginx
关于nginx
的安装和配置可以查看另一篇文章部署nginx及申请TLS证书,里面有详细的nginx
安装和配置教程,另外还涉及了关于域名申请证书的方法。
那么如果你已经看完了nginx
的文章,那么我们就开始配置反向代理吧。我们只需要在我们配置好的domain.conf
文件中增加以下内容即可。
# halo
location / {
proxy_pass http://127.0.0.1:8090; #配置halo的端口号,要与halo的端口一致
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
设置完成后,我们重载一下nginx
,等下安装完halo
后就可以访问了。当然,你也可以先部署halo
再配置nginx
。
#检查配置文件是否正确
nginx -t
#重载nginx
nginx -s reload
3.2 MySQL
关于MySQL
的安装和配置,你同样可以查看另一篇文章部署MySQL,可以根据教程进行搭建,当然你也可以选择和halo官方文档上一样的方式,使用docker-compose
来进行部署MySQL
。不过halo
不是必须需要配置MySQL
数据库,你也可以使用halo
内置的H2数据库
。
H2是一个Java编写的关系型数据库,它可以被嵌入Java应用程序中使用,或者作为一个单独的数据库服务器运行。
如果你想要使用MySQL
作为halo
的数据库,需要注意的是halo
要求:
- 数据库版本为
MySQL 5.7+
- 字符集为
utf8mb4
- 排序规则为
utf8mb4_bin
- 数据库引擎为
InnoDB
当我们已经部署好MySQL
后,我们需要准备好MySQL
数据库的用户名,密码及端口号,让halo
连接我们自己的数据库。
root #用户名
123456 #密码
3306 #端口号
halo
只需要我们建一个数据库即可,无需建表,halo
将会自己创建数据库表。所以我们需要先创建一个数据库给halo
,可以使用navicat
创建数据库,也可以链接MySQL
客户端使用sql
命令进行创建。
3.2.1 Navicat创建数据库
连接自己的数据库后,右键数据库,点击新建数据库即可。
数据库名设置为halodb
,字符集设置为utf8mb4
,排序规则设置为utf8mb4_bin
,点击确定创建即可。
3.2.2 命令行创建数据库
- 登录
MySQL
数据库
#登录数据库,输入密码回车进入
mysql -uroot -p
- 创建数据
--参考创建数据的语法
CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
--创建halo数据库
CREATE DATABASE IF NOT EXISTS halodb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE
utf8mb4_bin;
3.3 Redis
安装和配置Redis
,你可以参考部署Redis这篇文章。或者你也可以选择和halo官方文档上一样的方式使用docker-compose
来部署Redis
。Redis
不是halo
必备的中间件,你可以选择不配置Redis
,使用其他的缓存方式即可。
halo
支持三种缓存策略:
memory
将数据缓存至内存,重启服务缓存将清空。level
将数据缓存至本地,重启服务不会清空缓存。redis
将数据缓存至 Redis,重启服务不会清空缓存,如需分布式部署 Halo,请选用此种缓存方式。
如果我们配置了Redis
,我们需要准备好Redis
数据库的密码及端口号,让halo
连接我们自己的redis
数据库。
123456 #密码
6379 #端口号
3. docker-compose部署Halo
关于docker
及docker-compose
的安装,可以查看另一篇文章部署docker及docker-compose,里面有详细的教程,欢迎参考。如果你不想使用docker
来部署Halo
,可以参考halo官方文档 的其他部署方式。
我们先创建一个存放halo
文件的目录,将来halo
产生的数据都会在这个目录中,也方便管理和备份。
#创建halo的目录,之后我们将docker-compose.yaml文件也放在这个目录中
mkdir /data/halo && cd /data/halo
要使用docker
来部署halo
,我们需要先写一个docker-compose
配置文件,halo官方文档 上的docker-compose
配置文件没有连接自己的中间件的方式,但是我们其实可以从中窥探一二。我们可以将文档上创建Halo + MySQL + Redis 的实例
的yaml
文件拿下来修改一下即可。
我们将配置文件内容拷贝下来,修改一下以使用我们自己搭建的中间件。
version: "3"
services:
halo: #halo的服务名,这个名字可以使用docker-compose命令
image: halohub/halo:1.5.3 #halo的镜像,也可以选择latest最新版,不指定版本
container_name: halo #容器名
restart: unless-stopped #重启方式:除非手动停止
network_mode: "bridge" #桥接模式,使用docker0
#挂载文件目录和时间文件
#挂载时间文件时,可能会报错,因为在centos7.9中,timezone是一个目录,所以我们在timezone里新建一个文件,也叫timezone,让容器挂载。
#运行这个命令 echo 'Asia/Shanghai' > /etc/timezone/timezone #将时区写入timezone
volumes:
- /data/halo:/root/.halo
- /etc/timezone/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090" #宿主机端口:容器端口号
environment:
- SERVER_PORT=8090 #halo端口号,如要修改,上面ports也需要同步修改
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver #halo使用的数据驱动,指定为mysql
- SPRING_DATASOURCE_URL=jdbc:mysql://domain.com:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true #设置数据库链接字符串,切记字符编码设置为utf8,如果根据文档设置成数据库指定的utf8mb4会报错无法启动起来。domain.com换成你的公网IP地址,因为在容器中无法访问宿主机的127.0.0.1
- SPRING_DATASOURCE_USERNAME=root #mysql用户名
- SPRING_DATASOURCE_PASSWORD=123456 #mysqlmima
- HALO_ADMIN_PATH=admin #halo后台管理的路径,你可以访问domain.com/admin进入
- HALO_CACHE=redis #缓存策略 上面配置redis中间件时已说明了halo有三种方式设置,添入即可,如果不使用redis无需下面的配置
- SPRING_REDIS_PORT=6379 #redis的端口
- SPRING_REDIS_DATABASE=0 #使用redis数据库的第几个库
- SPRING_REDIS_HOST=domain.com #输入你的公网IP地址,因为在容器中无法访问宿主机的127.0.0.1
- SPRING_REDIS_PASSWORD=123456 #redis的密码
- MAX_UPLOAD_SIZE=10m #限制上传文件的大小
#下面可以配置jvm的内容限制
# - JVM_XMS=512m
# - JVM_XMX=512m
配置好docker-compose.yaml
文件后,我们保存退出,然后就可以开始部署了。
#部署halo,当前目录需要存在docker-compose文件才可以运行
docker-compose up -d
部署完成后,我们访问我们的域名:domain.com
,看看是不是已经成功进入halo
了。如果没有启动起来也没有关系,检查前面的步骤看看是不是哪里没有注意,只要步骤对了,那么一定是可以运行起来的。
4. 总结
到这里,halo就已经搭建完成了。如果各位觉得halo
不错,请到halo的github点个star🌟
,如果使用中有什么问题,也可以去halo论坛,看看能不能找到解决办法。希望看到这篇文章的每个人都可以搭建一个属于自己的博客。