Administrator
Administrator
Published on 2025-04-18 / 8 Visits
1
1

为什么我最终选择了 Halo 搭建技术博客?从反复尝试到正式上线的完整过程

从开始工作起,我就一直有一个念头:拥有一个属于自己的博客站点,作为展示项目经验、技术成长和工作记录的窗口。

这是一个程序员的“老梦”了。曾多次尝试过搭建博客,但都“兴奋三天、弃坑半年”。以下是我使用过的博客系统:

  • GitHub Pages + Jekyll:轻便但自定义复杂

  • Hexo + Vercel:搭建繁琐,主题兼容问题多

  • Hugo:生成速度快,但学习曲线陡峭

  • B3log Solo:轻量,但维护不活跃

每一次,我都花了 10 多个小时研究部署、选主题、调样式——然后,没能坚持下去。

直到最近,我又决定“重新开始”。但这一次不一样。

这一次,我不再一味追求炫酷样式,而是希望:

  • 写作门槛低(专注内容)

  • 系统稳定(少维护)

  • 易于 SEO 优化(被更多人看到)

  • 支持 Markdown、移动端适配、主题丰富

于是,我选择了 Halo ——一个现代、强大、易用的博客系统。


⚙️ 技术实现 / 搭建全过程

我使用的部署方案是:Halo + Docker Compose + Nginx + Cloudflare CDN + certbot 证书自动配置

✅ 为什么选择 Halo?

特性

理由

🌟 安装简单

Docker 一键部署,几分钟上线

🧩 主题丰富

官方/社区主题众多,支持二次开发

✨ Markdown 支持

直接写文章无门槛,支持代码高亮、目录等

📱 移动端适配

主题响应式,手机浏览体验优秀

🔍 SEO 支持好

可配置 URL、meta、sitemap 等

🔒 多用户支持

支持多人管理,权限清晰


🧰 博客搭建步骤(含截图)

✅ 技术栈: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 优化、性能调优等

    • 框架/源码解读

    • 远程办公与职业发展路径


Comment