使用Halo建立个人博客
一直想拥有自己的一块自留地,写点什么,记录些什么,尤其是上了年纪,爱折腾各种东西例如NAS啊黑苹果啊openwrt啊。在上网查资料的过程中,很多人的博客也对我产生了很大的帮助。于是也决定建立一个(想起来几十年前的QQ空间,百度博客啥的,那是我失去的青春啊哈哈哈。)那么今天,我就来分享一下我是如果用Halo来搭建“夏花的小屋”的!
为什么选择Halo&准备工作
为什么选择Halo
首先,感谢油管主我不是咕咕鸽 的视频讲解(https://www.youtube.com/watch?v=7YDuIhDR16w)
他在视频中分析了市面上一些主流的博客搭建框架,例如Typecho,Wordpress,Hexo,Halo等。
Halo在其中,论需要的服务器资源,大概是不如Typecho,Hexo这样的仅需轻量服务器就能运行,Hexo甚至能直接托管到github,但又不像Wordpress那样臃肿,需要性能强劲点的服务器。复杂程度也适中,插件和社区活跃度也仅次于Wordpress,很适合我这种半吊子计算机选手来上手。
并且我在Oracle上有一台1核6G内存40G硬盘的云主机,性能对于跑Halo来说也是足够。所以这么一比较,我就选择使用Halo,而不是其他的来建站
准备工作
一台至少1核1g内存的云主机,国内外皆可(服务器在国内建站域名需要备案,没有国外方便)。我自己的服务器就是上面介绍的甲骨文。本文会以AWS-EC2为例,用的X86_64架构。
一个域名来配置反向代理(可选)。你要是想直接通过IP+端口访问你的站点也不是不行,就是难看了一点哈哈。这里还是推荐去注册一个域名,很多云厂商搞活动1元1个,反正对域名也没有特殊要求。
正式开始搭建
域名解析配置
我以我阿里云的域名解析为例
登录到阿里云控制台,选择云解析DNS,选择你的域名,博主以xiwei1993.tk为例,点击添加记录。


我们配置一条A记录,使用二级域名,也就是xxx.xiwei1993.tk,我以blog.xiwei1993.tk为例,指向我的云主机IP地址
云主机上的配置
我们通过SSH软件登录到我们的云主机,博主这边推荐termius,十分的好用

我们输入以下命令切换到root,然后更新一下系统的软件包,各种提示的确认的地方请输入Y然后回车
sudo su
apt-get update
apt-get upgradeDocker与Docker Compose的安装
输入以下代码安装Docker
apt-install docker.io根据你的CPU架构,来安装Docker Compose
uname -m如果是X86_64架构,那么运行
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose如果是arm架构,那么运行
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-aarch64 -o /usr/local/bin/docker-compose接着给予权限
chmod +x /usr/local/bin/docker-compose查看一下是否安装成功
docker-compose --version如果安装成功,你就会看到终端里显示这个:
Docker Compose version v2.14.2安装Halo
我们在当前文件夹下创建一个文件夹,叫Halo,然后进入这个文件夹
mkdir Halo
cd Halo然后创建一个文件叫docker-compose.yaml
vim docker-compose.yaml这时候敲击键盘的insert键,就能输入文字,我们先在本地电脑找个记事本,复制以下文字
version: "3"
services:
halo:
image: halohub/halo:2.1.0
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./:/root/.halo2
ports:
- "8090:8090"
environment:
- SPRING_R2DBC_URL=r2dbc:pool:postgresql://halodb/halo
- SPRING_R2DBC_USERNAME=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- SPRING_R2DBC_PASSWORD=12345678
- SPRING_SQL_INIT_PLATFORM=postgresql
# 外部访问地址,请根据实际需要修改
- HALO_EXTERNAL_URL=http://blog.xiwei1993.tk:8090/
# 初始化的超级管理员用户名
- HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME=admin
# 初始化的超级管理员密码
- HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=admin
halodb:
image: postgres:latest
container_name: halodb
restart: on-failure:3
networks:
halo_network:
volumes:
- ./db:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=12345678
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:注意有几个地方自己配置一下:
SPRING_R2DBC_PASSWORD,我这里填了12345678,并且下面又要给POSTGRES_PASSWORD要与它保持一直
HALO_EXTERNAL_URL就填写我们刚刚配置了解析的域名
HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME和HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD就是等会儿我们要用到的管理员账户和密码,我都设置为了admin
其他默认即可。我们将这段文字复制,然后在SSH客户端中,右键粘贴至vim编辑器里
然后按一下esc,输入:wq。在窗口左下角可以看到你刚打的这个命令,回车就能保存好了
随后我们启动docker
docker-compose up -d没什么问题的话就能看到下图,所有服务都正常启动了

浏览器里登录Halo后台
我们到自己电脑的浏览器上,输入你的博客地址,博主的就是http://blog.xiwei1993.tk:8090/console (端口别忘了加)
输入刚刚的admin账号密码,登录就能到后台了,站点名称随便取一个,就能看到我们的仪表盘

浏览器里输入http://blog.xiwei1993.tk:8090 就能到我们博客的主页面,当然现在是没有什么文章内容的。

反向代理的配置(可选但是非常有必要)
博客是搭建完了,但是总不能每次访问就在浏览器里输入域名再加上端口号吧,个人建议肯定是把这个隐藏起来,而且目前我们用的是http协议,不安全,最好使用https
官方正好也有教程,我们跟着教程一步一步来
安装Nginx
这里我使用官方推荐的oninstack来安装和配置Nginx
用SSH软件连上你的云主机后,我们输入以下命令
wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1经过一大段时间的编译安装(取决于云主机性能,博主花了将近10分钟左右)
出现以下信息就表示安装成功了(图例的三分钟肯定是骗人的XD)
Nginx installed successfully!
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
####################Congratulations########################
Total OneinStack Install Time: 3 minutes
Nginx install dir: /usr/local/nginx
Index URL: http://创建vhost
即创建一个站点,其实就是我们刚注册的那个域名。
我们先进入oneinstack目录,执行vhost创建命令
cd oninstack
./vhost.sh进入脚本,会显示如下
What Are You Doing?
1. Use HTTP Only
2. Use your own SSL Certificate and Key
3. Use Let's Encrypt to Create SSL Certificate and Key
q. Exit
Please input the correct option: 3我们选3,让它自动帮我们生成SSL证书比较方便,当然你自己有证书也行,接着输入自己的域名
Please input domain(example: www.example.com): blog.xiwei1993.tk
(Default directory: /data/wwwroot/demo.halo.run):他会问你默认目录,回车就行,然后问你需不需要更多站点,我们输入n并回车确认
Do you want to add more domain name? [y/n]: n需不需要强制把http请求转换成https,先选n,后续也可以配置的
Do you want to redirect all HTTP requests to HTTPS? [y/n]: n接下来要生成证书,长度回车默认就行,邮箱随意填写
Please enter your cert key length (default 2048):
Please enter your email: xiwei@qq.com会有一个冗长的申请证书过程。
需不需要防盗链,先选n,这个后面有需要也可以再改。同理rewrite rule也是n,Nginx的请求日志选y
Do you want to add hotlink protection? [y/n]: n
Allow Rewrite rule? [y/n]: n
Allow Nginx/Tengine/OpenResty access_log? [y/n]: y完成后,最终会输出站点的相关信息
Your domain: demo.halo.run
Virtualhost conf: /usr/local/nginx/conf/vhost/blog.xiwei1993.tk.conf
Directory of: /data/wwwroot/blog.xiwei1993.tk修改Nginx配置文件
使用vim打开配置文件,直接复制粘贴我的就行,帮你把反代的都改好了
vim /usr/local/nginx/conf/vhost/blog.xiwei1993.tk.conf完整的内容是:
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/blog.xiwei1993.tk.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog.xiwei1993.tk.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256;
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
ssl_conf_command Options PrioritizeChaCha;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_buffer_size 2k;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name blog.xiwei1993.xyz;
access_log /data/wwwlogs/blog.xiwei1993.xyz_nginx.log combined;
index index.html index.htm index.php;
root /data/wwwroot/blog.xiwei1993.tk;
if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
include /usr/local/nginx/conf/rewrite/none.conf;
#error_page 404 /404.html;
#error_page 502 /502.html;
location / {
limit_req zone=one burst=5 nodelay;
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;
proxy_pass http://halo;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
proxy_pass http://halo;
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://halo;
expires 7d;
access_log off;
}
location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
deny all;
}
location /.well-known {
allow all;
root /data/wwwroot/blog.xiwei1993.tk/;
}
}note
注意替换文件里所有blog.xiwei1993.tk 成你的博客域名
至此,修改完毕。
我们输入以下命令验证一下
nginx -t如果输入入地下就表示改的没问题
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful我们就可以重载一下Ngnix配置
nginx -s reload好了,这时候你就可以直接访问域名,不用加端口号了(哦对了,别忘了去暂停一下docker,将docker-compose.yaml里的HALO_EXTERNAL_URL 替换成https)