前言概览
Halo 是一个现代化、轻量级、界面美观的博客系统,它基于 Spring Boot 构建,支持多种主题切换与插件扩展,拥有活跃的社区生态,是技术爱好者和内容创作者搭建个人博客的理想选择。
在正式开始搭建 Halo 博客之前,我们需要提前准备以下资源:
一台服务器:可以选择云服务平台如阿里云、腾讯云、华为云等。建议选用国内服务器以获得较快访问速度。
一个域名:可通过阿里云、腾讯云等平台购买。
域名备案:如果使用国内服务器,则域名需备案,通常需要提供身份证和网站用途等信息,预计 1~7 个工作日。
当然,如果不想购买域名,也可以去闲鱼等平台租一个域名试玩一下~
安装指南
使用 Docker Compose 部署 | Halo 文档
1. 租服务器和申请域名
在开始搭建博客前,我们首先需要准备两个关键资源:服务器和域名。
🖥 服务器购买建议
我个人是在 京东云 上购买的「轻量云主机」,一年价格较为划算,非常适合个人博客使用。
常见的云服务器有两种形式:
轻量云主机(推荐)
适合个人开发或搭建博客
资源固定(CPU、内存、带宽)
按年购买更划算
固定公网 IP,适合域名绑定
弹性计算实例(ECS)
按小时计费,可灵活启动/关闭
每次重启后公网 IP 可能变化
若要绑定域名,需配置弹性公网 IP(EIP),否则绑定存在限制
💡建议:
如果只是部署个人博客,轻量云主机已经足够,无需购买配置太高的服务器。
🌐 域名购买与备案
我也是在京东云购买了域名,一年价格合理。建议域名和服务器在同一平台购买,这样后续解析与绑定会更加方便。当然直接去某平台租一个月或者一年的域名,也省了备案,商家会帮你解析域名,无需你手动解析。
注意:如果你使用的是国内服务器(如京东云、阿里云、腾讯云等),域名必须进行备案,大约 1 周左右可以完成。
备案过程一般包括:
填写备案信息
上传身份证与网站说明
等待审核通过
类似这种就完全够用,如果是618购买会比平时便宜,阿里云腾讯云同理

2. 安装docker和docker-compose
📌 参考博客
搭建 Halo 博客的第一步是先在服务器中安装好 Docker 和 Docker Compose,方便我们以容器化方式快速部署服务。
🐳 为什么使用 Docker?
Docker 可以让我们在隔离的容器中运行服务,避免环境冲突,部署也更加轻松。
搭配 Docker Compose,可以用一份配置文件同时启动多个服务(比如 Halo + 数据库 + Nginx)。
🔧 安装Docker(以 CentOS 为例)
# 1. 更新 yum
sudo yum update
## 更新失败按照下面操作
### 1.1备份当前的 yum 源配置,以防万一需要恢复
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
### 1.2从阿里云下载 CentOS 7 的 yum 源配置文件并替换现有的配置
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
### 1.3清理旧的缓存并生成新的缓存
sudo yum clean all
sudo yum makecache
### 1.4再次更新
sudo yum update
# 2. 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置 Docker 的yum源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 4. 安装docker
sudo yum install -y docker-ce-25.0.5 docker-ce-cli-25.0.5 containerd.io
# 6. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
设置Docker国内源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://***替换为你的地址***.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
卸载Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine🔧 安装 Docker Compose
# 指定路径【推荐】
sudo curl -L https://gitee.com/fustack/docker-compose/releases/download/v2.24.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 设置权限
sudo chmod +x /usr/local/bin/docker-compose安装完成后,可以通过以下命令验证:
docker -v
docker-compose -v
3. 安装Nginx_proxy_manager
📌 参考博客
Nginx Proxy Manager (NPM) 是一款基于 Docker 部署的可视化 Nginx 管理面板,支持一键反向代理、HTTPS 证书自动申请(Let's Encrypt)、多站点管理等功能,适合个人博客、内网穿透、AI 服务等场景。
🧰 环境准备
已安装 Docker 和 Docker Compose
域名已解析至服务器公网 IP(如
blog.example.com)推荐服务器开放防火墙端口:
80,443,81

📦 创建 docker-compose.yml 文件并执行
创建一个文件夹来存放 NPM 的
docker-compose.yml文件:
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vi docker-compose.yml # 使用vi工具,注意输入i可以编辑文件,Esc键退出编辑,输入(:wq)是强制保存后退出按下
i,左下角出现--INSERT--后,粘贴下面内容
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 目录,用于存放证书,如果不存在的话,会自动创建在docker-compose.yml所在文件家打开命令行,执行
docker-compose up -d # -d 表示后台运行部署成功后,访问管理后台,在浏览器输入如下网址:
http://<你的服务器IP>:81默认登录的用户名:admin@example.com 密码:changeme
第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建。
🐳 配置 Halo 的反向代理
📌 背景说明
Halo 博客容器默认运行在内网的 8090 端口,我们希望通过 https://yourdomain.com 这样的域名来访问博客,需要使用 Nginx Proxy Manager 反向代理。
🧩 操作步骤
打开 Nginx Proxy Manager 管理后台(http://服务器IP:81)
点击「Add Proxy Host」按钮
填写代理信息:直接参考官方文档——与 Nginx Proxy Manager 配合使用 | Halo 文档
勾选选项(推荐):
✅ Block Common Exploits
✅ Websockets Support
✅ Cache Assets
保存并测试访问
http://yourdomain.com是否成功跳转到博客首页。
📦一键申请 SSL 证书
📌 目的
让博客支持 https:// 加密访问,更安全也更专业。主要是Nginx Proxy Manager的SSL证书免费申请
⚙️ 操作步骤
编辑前面添加的 Proxy Host 项
切换到
SSL选项卡
点击「Save」,等待 Let's Encrypt 自动申请证书。
✅ 注意事项
域名必须已解析到服务器公网 IP;
云服务防火墙必须放行 80 和 443 端口;
第一次申请可能等待几秒,之后自动续期。
⚠️ 埋雷提醒:关于 81 端口跳转报错问题
常见现象:
明明访问
http://你的域名:81是 Nginx Proxy Manager 管理后台,但浏览器会自动跳转到https://你的域名:81,导致报错:
此站点的连接不安全 ERR_SSL_PROTOCOL_ERROR
原因解释:
你访问过
https://你的域名.cn后,浏览器会缓存 “这个域名应该强制使用 HTTPS”(HSTS);但
81端口(NPM 管理后台)并没有开启 HTTPS,只能用http://,所以访问:81时跳转失败。
正确做法 ✅:
管理后台推荐直接访问
http://<服务器IP>:81,不要用域名;或者使用无缓存的浏览器窗口(如无痕模式)打开;
4. 服务器运行Halo容器
📌 参考官方文档
⚙️ 操作步骤
🧱 1. 创建项目目录
在服务器任意位置创建 Halo 所在目录,本例使用 ~/halo:
mkdir ~/halo && cd ~/halo此目录用于存放 Halo 运行所需的所有数据和配置,后续操作均在此目录下完成,请妥善保存和备份。
🧾 2. 创建 docker-compose.yml 文件
Halo 官方提供了多种数据库组合的部署方式(PostgreSQL / MySQL / H2 / 外部数据库),需根据个人需求选择其中一种,不必全部配置。
✅ 本文将采用 Halo + MySQL 模式。
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
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
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
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=http://localhost:8090/
halodb:
image: mysql:8.1.0
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
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:🔧 3. 启动服务
docker-compose up -d✅ 4. 进入控制台
在浏览器输入网址,进入Halo控制台面板,具体参考官方文档:基础说明 | Halo 文档
https://<你的域名>/console进入之后,需要先注册,然后登录,即可进入控制台。
5. Halo控制台基础设置
📌 参考视频和文档
https://www.bilibili.com/video/BV1XeMYeqEw3/?spm_id_from=333.337.search-card.all.click&vd_source=4df08d069d45f57cba1a350ccb2bbd75
这里内容实在是太多了,我也摸索了一会,后续给出博客来讲解~
结束语
✅ 总结:
这次整体流程主要是围绕以下几个步骤展开的:
租服务器和域名备案;
使用 Docker 和 Docker Compose 搭建 Halo + MySQL;
安装 Nginx Proxy Manager,配置博客反向代理;
申请 SSL 证书,实现 HTTPS 安全访问;
进入 Halo 控制台进行初始化配置,完成博客上线。
整体部署流程虽然繁琐了一点,但基本都能照文档走通,属于“花点耐心就能搞定”的那种。
⚠️ 踩坑:
部署过程中也遇到了一些令人抓头的坑:
Nginx Proxy Manager 自动跳转 HTTPS 报错问题:
管理后台默认运行在81端口,但浏览器会把http://域名:81自动升级为https://域名:81,导致ERR_SSL_PROTOCOL_ERROR,让我以为服务没启动成功,其实只是浏览器缓存的问题。解决方式是:直接用 IP + 81 端口访问后台,或者用无痕窗口打开。Halo 控制台配置:交给下一篇博客总结(确实有些繁琐但是不难)~
🎉 收获:
虽然用的是开源的博客系统,但同时也学到很多细节,好事多磨。
后面会自己写一个前后端都由我开发的博客网站(虽然光是想到前端就已经开始头痛了哈哈哈)。
评论区