前言
最近想重新搭一个博客,目标其实很明确:尽量少折腾,尽快上线。
如果完全走命令行,当然也不是不行,但对我来说,部署博客这件事没必要从第一步就把时间花在各种环境细节上。最后我选了 Halo + 1Panel 这套组合:Halo 负责博客本身,1Panel 负责部署和运维,整体体验比我预想中顺手不少。
这篇文章就记录一下,我是怎么在 1Panel 里把 Halo 跑起来的。
如果你也想搭一个自己的博客,希望过程尽量简单一些,这篇应该能给你一个比较清晰的参考。
为什么是 Halo?
选博客系统这件事,说到底还是看你想要什么。
我自己比较在意的点其实不复杂:
后台别太难用
默认界面别太老气
后续能换主题、装插件
部署不要太折腾
适合长期写内容,而不是只适合“装一次”
Halo 给我的感觉是比较现代,也比较克制。它不是那种功能堆得很满、但实际体验很粗糙的系统,后台观感和写作体验都还不错。对个人博客来说,这一点挺重要的——毕竟你以后会经常打开它,而不只是装完就不管。
如果你想要的是一个能尽快开始写作,同时也保留一定扩展性的博客系统,Halo 是个挺不错的选择。
为什么用 1Panel 来部署?
理由很简单:省心。
1Panel 这类现代化面板的意义,不是替代所有命令行,而是把那些重复、机械、容易出错的部署和运维动作,尽量做得更直观一些。
比如这些事情,用 1Panel 来做会方便很多:
安装和管理应用
查看容器运行状态
看日志排错
配置网站和反向代理
申请 HTTPS 证书
对于博客这种长期在线、偶尔还要维护一下的服务来说,这种可视化管理体验其实很实用。
所以这套组合可以简单理解为:
Halo:负责内容和博客后台
1Panel:负责部署、代理、证书和日常管理
两者配合起来,刚好够用。
部署前需要准备什么?
开始之前,建议先准备好下面这些东西。
1. 一台云服务器
配置不用太高,普通轻量服务器基本就能跑,比如:
2 核 CPU
2GB 内存
40GB 磁盘
如果只是个人博客、访问量不大,这样的配置一般足够了。
2. 装好 1Panel
这篇文章默认你已经装好了 1Panel。
如果还没装,可以先按官方文档完成初始化,再继续下面的步骤。
3. 一个域名
虽然没有域名也能先通过 IP 访问,但如果你想把博客正式跑起来,域名还是很有必要准备的。
比如可以用这样的子域名:
blog.gnix807.cn(以我的域名为例)
后面不管是做 HTTPS、绑定站点,还是日常访问,都会方便很多。
4. 放行必要端口
至少确认以下端口可以正常使用:
804438090
其中 8090 一般用于前期测试 Halo 服务是否正常;正式上线后,对外通常主要就是 80 和 443。
方式一:通过 1Panel 应用商店安装 Halo
1Panel 应用商店里已经自带 Halo,这通常是最省事的做法,我也更推荐优先用这个方式。
第一步:登录 1Panel 后台
先进入 1Panel 管理界面。

左侧菜单里后面主要会用到这几个模块:
应用商店
容器
网站
第二步:搜索 Halo
打开 应用商店,直接搜索 Halo。
搜到对应应用,点击进入安装页面。

这一步没什么难度,主要就是确认当前环境里已经提供了可直接安装的版本。
第三步:填写安装参数
安装页面通常会让你填写一些基础参数,比如:
应用名称,如
halo
访问端口,如
8090
数据库服务,通常包含数据库名称、用户、密码
镜像版本,一般默认为最新版
重启策略,一般保持默认即可

这里最值得重视的是 数据库。
博客的数据不是一次性的,后续文章、配置、上传的附件,都依赖它保存。如果这里没处理好,后面容器重建时很容易出问题。
此外,如勾选高级设置里的 端口外部访问,就不必专门去创建防火墙端口放行。
第四步:开始安装并等待启动
确认参数没问题后,直接点击安装。
接下来 1Panel 会自动完成镜像拉取、容器创建和服务启动。
安装完成后,可以到容器管理页面里确认 Halo 是否处于运行状态。只要状态正常,基本就说明服务已经起来了。

第五步:先用 IP + 端口测试访问
在做域名和 HTTPS 之前,我建议先直接访问:
http://你的服务器IP:8090
这一步主要是为了先确认一件事:Halo 本身有没有正常运行。
如果这一步就访问不到,那问题通常出在容器、端口或者防火墙;如果这一步能打开,但域名访问不行,那再去排查反向代理和解析就会更清晰。
这个顺序很重要,能少走很多弯路。
方式二:使用 Docker Compose 在 1Panel 中部署
如果你更习惯自己控制配置,那也可以直接用 Docker Compose。
下面这份配置是一个比较基础、也比较常见的例子(来自官方文档):
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo-pro:2.22
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:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: postgres:15.4
restart: on-failure:3
networks:
halo_network:
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:⚠️注意:
此示例使用的数据库为PostgreSQL,且数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在
halodb服务中添加端口映射,PostgreSQL 的端口为5432。
这份配置的核心点主要有几个:
使用 Halo 官方镜像
将容器的
8090端口映射到宿主机把 Halo 数据目录挂载到本地
设置容器自动重启
在 1Panel 里,你可以通过容器编排功能新建一个项目,把这份配置粘贴进去,然后启动服务。
启动完成后,同样先访问:
http://你的服务器IP:8090
只要页面能打开,就说明部署已经成功了一大半。
第一次打开 Halo:初始化站点
第一次访问 Halo 时,通常会进入初始化页面。

这里需要设置一些基础信息,比如:
网站标题
管理员用户名
管理员邮箱
登录密码
填写完成之后,Halo 就会创建你的博客站点,随后可以进入后台。
到这一步,其实博客已经能用了,只是访问方式还比较原始,通常还是 IP + 端口。
配置域名访问
如果你希望博客像一个正式的网站,那下一步就该把域名接上了。
第一步:添加域名解析
到你的域名管理后台,添加一条 A 记录,把子域名解析到服务器公网 IP。

比如:
主机记录:
blog(随你想要什么前缀)记录值:你的服务器公网 IP
配置完成后,等解析生效,就可以准备在 1Panel 里绑定这个域名。
第二步:在 1Panel 中创建网站并做反向代理
打开 1Panel 的 网站 管理,新建一个站点,填写你的域名,比如:
blog.gnix807.cn (以我的域名为例)

然后把请求反向代理到 Halo 所在端口,一般填:
127.0.0.1:8090
这一步的本质是让 1Panel 接收外部访问,再把请求转发给 Halo 容器。
配好之后,你就可以尝试直接通过域名访问博客。
配置 HTTPS
既然已经用了域名,HTTPS 基本就可以顺手一起配掉。
这不只是为了安全,更多也是为了避免浏览器的“不安全”提示影响访问体验。
在 1Panel 里,一般可以直接申请 Let’s Encrypt 免费证书。流程通常是:
打开 网站 选项卡
点击 证书
先 创建Acme帐户
申请证书
启用 HTTPS

配置完成之后,你的博客地址就能从:
http://blog.gnix807.cn
变成:
https://blog.gnix807.cn
到这里,整个博客基本就算正式上线了。

部署过程中比较容易踩的坑
实际操作里,我觉得下面这几个问题最常见。
1. 端口没有放行
如果你发现页面打不开,先别急着怀疑 Halo 本身。
很多时候只是服务器安全组或防火墙没有放行对应端口。
优先检查:
804438090
2. 没有做数据持久化
这是比“启动失败”更隐蔽、也更危险的问题。
如果没有把 Halo 的数据目录挂载到宿主机,容器一旦删除、重建,文章和配置就可能一起丢失。博客这种服务最重要的其实就是数据,所以数据目录一定要提前规划好。
3. 域名解析还没生效
有时候你会发现配置看起来都没问题,但域名还是打不开。
这种情况很常见,尤其是在刚添加 DNS 记录之后。
先等等,确认解析已经生效,再继续排查其他问题。
4. HTTPS 证书申请失败
证书申请失败时,通常不是证书本身的问题,而是访问链路里有一步没通。
可以依次检查:
域名是否已经正确解析到服务器
80端口是否开放网站是否能从公网正常访问
反向代理配置是否正确
按这个顺序排查,通常会快很多。
部署完成后,建议顺手做的几件事
等 Halo 跑起来之后,我建议别急着关掉后台,可以顺手把下面这些事情也做一下:
修改站点标题和基础信息
挑一个自己喜欢的主题
开启 HTTPS
备份数据目录
了解附件和图片的存储方式
补充 SEO 信息
记好数据目录所在位置
尤其是备份,真的越早做越好。
博客一开始文章不多时,很多人会觉得无所谓;但只要你开始持续写,备份就会变成一件很现实的事情。
最后
如果你问我,在 1Panel 中部署 Halo 值不值得折腾,我的答案是值得。
它不属于那种特别“硬核”的方案,不需要你从第一步开始就和一堆底层配置反复拉扯;但它也不是那种完全封闭、后面不方便扩展的托管型方案。
对想搭个人博客的人来说,这个平衡点其实挺舒服的:
上手门槛不高
部署效率不错
后续维护也方便
想继续折腾时还有空间
很多时候,搭博客最难的不是技术,而是你总在比较方案、反复收藏教程,却一直没有真正开始。
所以比起继续犹豫,我更建议你先把站点搭起来。
先上线,再慢慢把它变成你喜欢的样子。