从开始工作起,我就一直有一个念头:拥有一个属于自己的博客站点,作为展示项目经验、技术成长和工作记录的窗口。
这是一个程序员的“老梦”了。曾多次尝试过搭建博客,但都“兴奋三天、弃坑半年”。以下是我使用过的博客系统:
GitHub Pages + Jekyll:轻便但自定义复杂
Hexo + Vercel:搭建繁琐,主题兼容问题多
Hugo:生成速度快,但学习曲线陡峭
B3log Solo:轻量,但维护不活跃
每一次,我都花了 10 多个小时研究部署、选主题、调样式——然后,没能坚持下去。
直到最近,我又决定“重新开始”。但这一次不一样。
这一次,我不再一味追求炫酷样式,而是希望:
写作门槛低(专注内容)
系统稳定(少维护)
易于 SEO 优化(被更多人看到)
支持 Markdown、移动端适配、主题丰富
于是,我选择了 Halo ——一个现代、强大、易用的博客系统。
⚙️ 技术实现 / 搭建全过程
我使用的部署方案是:Halo + Docker Compose + Nginx + Cloudflare CDN + certbot 证书自动配置。
✅ 为什么选择 Halo?
🧰 博客搭建步骤(含截图)
✅ 技术栈:Halo + Docker + Nginx + certbot(HTTPS) + Cloudflare(加速)
步骤 1:购买服务器 + 域名(我用的是阿里云)
提醒:国内服务器和域名 必须先备案,这一步一般耗时 7~10 天。提交资料包括网站描述、个人身份证信息、域名信息等。
步骤 2:部署 Halo 博客
mkdir ~/halo && cd ~/halo
#创建 docker-compose.yaml, 写入以下内容
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.20
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:
# 启动
docker compose up -d
👉 默认使用 MySQL
+ Redis
,你也可以选择 SQLite 模式(单机更轻便)
步骤 3:绑定域名 + 配置 Nginx
server {
listen 80;
server_name blog.soundjourney.top;
location / {
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
步骤 4:HTTPS 自动证书(使用 certbot)
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d blog.soundjourney.top
🎉 自动签发 + 自动配置 + 自动续期,基本无感知。
步骤 5:配置 Cloudflare(可选)
使用 Cloudflare 做全球加速 + DNS 解析 + 自动缓存,提升访问速度和 SEO 体验。
🕳️ 遇到的问题 & 解决方法
⚠️ 备案时间过长
国内服务要用域名备案,个人需要准备描述材料、实名认证等流程
提前规划时间,建议在备案期间先用临时域名调试
⚠️ 访问安全问题(HTTPS)
初期没配置证书导致浏览器警告,通过
certbot
搭配nginx
后解决Certbot 非常推荐,设置简单,自动续期稳定
⚠️ Halo 初始化过慢
第一次拉镜像稍慢,可以考虑更换 Docker 镜像源(如阿里云)
💡 我的思考 / 下一步计划
这一次,我不再只是“搭一个好看的博客”,而是:
把它作为我的技术资产,持续记录真实项目经验
分享我在 AI 辅助开发、性能优化、DevOps、前端架构 等方面的经验
输出更有结构、更能被检索、更值得回看的内容
🚀 接下来的更新计划:
每周发布 1~2 篇文章(实战/工具/思考/成长)
文章内容包括但不限于:
工作中真实项目复盘(如:SoundJourney)
工程化 + DevOps + 自动部署
AI 工具辅助开发实践
技术 SEO 优化、性能调优等
框架/源码解读
远程办公与职业发展路径