版本说明:本文最后更新于
2023-04-28
,详细更新记录参见文末表格。若链接或图片失效,对文中内容有任何疑义和勘误意见,欢迎留言反馈。
精选程度:★★★★★ | 博文状态:已完结 | 本地标签:是
Halo建站(个人博客)笔记
本笔记介绍了从零开始,搭建一个Halo个人博客的全部过程。包括服务器购买、Halo安装、域名注册、网站备案、安全证书安装等。
如果不需要通过域名访问,则只需要做到Halo安装即可。
搭建网站的总体流程如下所示。

〇、本文概要
0.1、达成目标
从零开始实现Halo个人博客搭建。
0.2、前置知识
- 服务器基础知识(非必须)
- Linux系统概念和基础操作:发行版本、基本命令、Vim编辑器操作等(最好有)
- 容器Docker基础知识(非必须)
- 计网基础概念:
ip
地址、端口、域名、DNS
解析、代理、反向代理、SSL
证书等(最好有)
推荐优先观看
参考资料[2]
,理解网站搭建的基本概念。
一、Halo简介
Halo是一个开源建站工具,1.x
版本主要用于博客搭建。2022年12月正式发布的2.x
版本之后,Halo已经不仅仅满足用来搭建一个博客,而是可以搭建任何网站了。
从个人使用体验来说,具有界面美观、主题丰富、插件安装方便、前后台系统功能完善等优势。
- 官网地址:https://halo.run/
- 文档地址:http://docs.halo.run/
- 社区地址:https://bbs.halo.run/
- 主题仓库:https://halo.run/themes.html
GitHub
地址:https://github.com/halo-dev/halo
二、服务器购买
腾讯云购买轻量应用服务器,系统配置如下所示。
当然,任何厂商购买的服务器都是可以的。配置上内存至少
1G
,系统推荐使用Linux(例如Ubuntu
、Debian
等)。此处我选的是
Debian
,但是下一步我将系统重装成了Ubuntu
,你可以直接选择Ubuntu
系统。
重装系统,使用docker基础镜像,这样可以免去后续docker安装的操作。
如果是腾讯云可以按照这边操作,其他云厂商可能需要不同途径。或者可以直接跳过此步,后续手动安装Docker、Docker-compose。(参考Docker 安装文档、Docker Compose 安装文档)
【注】必须在运行环境安装好Docker环境,目前Halo的默认安装运行方式均使用容器。
此时即可远程一键登录服务器。
三、宝塔面板安装(可选)
宝塔面板是一款服务器运维面板。这里主要是为了后续SSL
证书的部署和反向代理配置的便利。
如果不需要使用域名访问halo博客,则可以跳过此步。
进入宝塔官网,按照自己的系统类型选择安装脚本。
复制到服务器命令行,即可进行安装。(注:最好在纯净的系统上进行安装)安装完成后会有如下提示。
为了使20374端口能够被正常访问,在腾讯云控制台进入防火墙规则界面添加规则。
自定义添加规则详情如下。

此时,通过外网面板地址
即可在浏览器访问到宝塔面板登录界面。
首次登录会要求注册宝塔面板账号,并绑定账号。如果弹出推荐安装的软件,跳过即可。
至此,宝塔面板安装完毕。
四、Halo安装
4.1、Halo安装
命令行验证docker
和docker-compose
安装成功。
docker -v
docker-compose -v
创建安装的目录,创建docker-compose配置文件。
mkdir ~/halo && cd ~/halo # 后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存
vim docker-compose.yml
按下i
进入插入模式。拷贝官方文档配置文件(创建 Halo + MySQL 的实例
),并修改关于密码的部分。
version: "3"
services:
halo:
image: halohub/halo:2.4
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./:/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 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=xxxxxx
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改(填写域名,或者服务器公网ip)
- --halo.external-url=https://xxxxxx.com
# 初始化的超级管理员用户名
- --halo.security.initializer.superadminusername=admin
# 初始化的超级管理员密码
- --halo.security.initializer.superadminpassword=xxxxxx
halodb:
image: mysql:8.0.31
container_name: halodb
restart: on-failure:3
networks:
halo_network:
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
# 不在公网暴露halo数据库的端口,一定程度保障博客的安全
- "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=xxxxxx
- MYSQL_DATABASE=halo
networks:
halo_network:
Esc
退出插入模式,:
进入末行模式,wq
+Enter键
保存并退出。
检查端口是否被占用,如果没有,则不需要其他操作。
lsof -i:8090
为了使8090端口能够被正常访问,在腾讯云控制台进入防火墙规则界面添加规则。
自定义添加规则详情如下。

服务器安装并启动halo服务。
cd ~/halo
sudo docker-compose up -d
''' 或者可以使用如下命令,但请确保你熟悉相关Linux命令 '''
sudo -i # 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,使用该命令
cd /home/lighthouse/halo/
docker-compose up -d
等待安装完成,此时即可在本机通过ip地址+端口
的形式访问,网址为http://[服务器的公网ip]:8090
。
如果无法访问,请检查服务器是否使用了 Linux 面板,其是否还有安全组配置,需要同样将端口号添加到安全组。
通过网址http://[服务器的公网ip]:8090/console
进入后台界面(用户名密码是之前配置文档中设置的)。
4.2、主题和插件安装
官方文档上目前支持的主题和插件等:https://github.com/halo-sigs/awesome-halo
例如,下载theme-butterfly
主题,在halo系统后台直接拖拽安装。
4.3、版本升级
sudo docker ps # 查看当前docker运行状态
sudo docker-compose down # 停止运行中的容器组
cp -r ~/halo ~/halo.archive # 备份数据(重要)
修改 docker-compose.yaml
中配置的镜像版本。
vim docker-compose.yaml # image: halohub/halo:2.4
sudo docker-compose pull # 拉取新版本镜像(或docker-compose pull halo)
sudo docker-compose up -d # 重新运行,即可升级成功
4.4、常用操作
cd ~/halo
sudo docker-compose down # 停止运行中的容器组
sudo docker-compose up -d # 重新运行
五、域名注册
5.1、域名购买
腾讯云域名和DNS
解析服务购买。
此处我购买了
DNS
解析服务(因为感觉折扣很大),但是并不是必须的,腾讯云自带了免费版的域名解析服务。如果购买专业版,后面需要按照它的提示手动配置一下解析服务器,比较麻烦,因此不建议购买。
完成注册域名后,等待一段时间即可在控制台看到自己的域名。
5.2、网站备案
根据提示,在腾讯云上对域名进行备案(https://console.cloud.tencent.com/beian/manage)。
这个阶段全流程大概需要10天到1个月左右,大致包括:域名实名认证、
ICP
备案信息提交、腾讯云初审和返回修改、管局审核通过、公安备案信息提交、公安备案通过。【注意】网站备案成功后,需要在备案成功的网站底部悬挂工信部下发的网站备案号,并生成链接指向工信部网站
https://beian.miit.gov.cn
,供网站访问者查询核对。若未在网站底部添加网站备案号,将被备案所在省通信管理局责令改正,并处五千元以上一万元以下罚款。如果你的服务器在国外,则不需要进行备案。如果服务器在国内,根据相关法规则必须进行备案,域名才能正常访问。
5.3、DNS
域名解析配置
进入DNS解析 DNSPod
控制台。
添加解析记录,记录值为服务器公网ip
地址。
设置完成后,等待一段时间,即可通过域名+端口
的形式访问个人博客。
六、反向代理和SSL
证书安装
我们怎么样才能把IP+端口
变成域名
来访问,答案是用反向代理。
6.1、使用宝塔面板设置反向代理
进入面板网站
项目,点击添加站点。填写前面申请好的域名,其他配置信息如下图所示。
如果提示需要安装
Ngnix
,直接点击安装即可。
进入网站的配置文件,将如下location
两段内容注释,并添加一段配置内容如下。
location / {
proxy_pass http://127.0.0.1:8090/; # 注意改成你实际使用的端口
rewrite ^/(.*)$ /$1 break;
proxy_redirect off;
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_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;
}
至此,反向代理配置成功。可以直接通过域名访问我们的halo博客。
安全起见,此时即可将先前服务器防火墙开放的8090端口撤销。
6.2、使用宝塔面板部署SSL
证书
首先通过腾讯云申请到免费的SSL
证书。
下载证书,选择Nginx
版本。

下载完成后打开证书压缩包,我们只需要用到key和pem后缀的两个文件。
在宝塔面板的刚添加的站点中,设置SSL
,将上述两个文件中内容分别粘贴至如下框中,并保存。同时打开强制HTTPS
开关。

至此,SSL
证书部署完成,再次打开网站,链接已经变为安全。
6.3、(附)通过Nginx proxy manager
实现反向代理和SSL
申请
Nginx proxy manager
是一个很简单的反向代理工具。
官网:https://nginxproxymanager.com/
门槛极低,操作简单,不需要你掌握很复杂的Nginx
配置知识,只需要几步就能很轻松完成反向代理的设置和SSL
证书的部署。
6.3.1、安装Nginx Proxy Manager
创建一个安装目录。
mkdir -p ~/nginxproxymanager
cd ~/nginxproxymanager/
新建配置文件。
vim docker-compose.yml
英文输入法下,按i
进入插入模式。根据官网文档输入配置文件内容。
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建
注意:安装了
nginx-proxy-manager
之后,就不需要再安装Nginx
了,否则会端口冲突(不建议修改nginx-proxy-manager
的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和nginx-proxy-manager
一起使用,只要你到软件后台把宝塔安装的Nginx
关闭或者卸载即可。
打开服务器的81端口,如下所示。

检查端口是否被占用。
lsof -i:81 #查看 81 端口是否被占用,如果被占用,重新自定义一个端口
运行并访问Nginx Proxy Manager
。
cd ~/nginxproxymanager/ # 来到 dockercompose 文件所在的文件夹下
sudo docker-compose up -d
理论上我们就可以输入http://ip:81
访问了。默认登陆名和密码:
Email: admin@example.com
Password: changeme
至此,我们已经完成了Nginx Proxy Manager
的搭建,之后就可以用它给我们的Halo或者其他Web应用做反向代理了。
6.3.2、配置反向代理
点击添加Proxy Hosts
。
查看Docker容器内部的IP
。
ip addr show docker0
填写代理的详细信息,每个条目的解释如下。

Domain Names
:填我们 Halo 网站的域名,首先记得做好DNS
解析,把域名绑定到我们的服务器的IP
上Scheme
:默认http
即可,除非你有自签名证书Forward Hostname/IP
:填入服务器的IP
,或者Docker容器内部的IP
(如果NPM
和 Halo 搭建在同一台服务器上的话)Forward Port
:填入 Halo 映射出的端口,这边默认是8090
Cache Assets
:缓存,可以选择打开Block Common Exploits
: 阻止常见的漏洞,可以选择打开Websockets Support
:WS
支持,可以选择打开Access List
: 这个是NPM
自带的一个限制访问功能,这边我们不管,后续可以自行研究
6.3.3、SSL
证书申请添加
上述界面中打开SSL
标签栏,选择申请一张新的SSL
证书,保存即可。
参考资料
-
[1-博客] 【好玩儿的Docker项目】好用又强大的开源建站工具——Halo 2.0
就是看了这个博主的各类博客搭建框架推荐,才选择使用Halo的。他最为推荐的其实是
WordPress
,但是我还是选择先使用Halo入门。 -
[2-视频] 【白话科普】网站是如何被打开的 | 互联网的运作原理 | 网站上线发布分享系列内容
对于网站搭建的大部分所需知识都用动画的形式,讲解的非常通俗且专业,也都有实操,宝藏视频。
Q & A
暂无
更新记录
时间 | 修改内容 |
---|---|
2023-04-26 | 首次发布版本 |
2023-04-28 | 修复了文中一张图片无法正常显示的问题 |
评论区