侧边栏壁纸
博主头像
liker的博客

去码头整点薯条

  • 累计撰写 10 篇文章
  • 累计创建 9 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

如何用服务器搭建Halo博客

liker
2025-06-28 / 0 评论 / 0 点赞 / 38 阅读 / 0 字

前言概览

Halo 是一个现代化、轻量级、界面美观的博客系统,它基于 Spring Boot 构建,支持多种主题切换与插件扩展,拥有活跃的社区生态,是技术爱好者和内容创作者搭建个人博客的理想选择。

在正式开始搭建 Halo 博客之前,我们需要提前准备以下资源:

  1. 一台服务器:可以选择云服务平台如阿里云、腾讯云、华为云等。建议选用国内服务器以获得较快访问速度。

  2. 一个域名:可通过阿里云、腾讯云等平台购买。

  3. 域名备案:如果使用国内服务器,则域名需备案,通常需要提供身份证和网站用途等信息,预计 1~7 个工作日。

当然,如果不想购买域名,也可以去闲鱼等平台租一个域名试玩一下~

安装指南

使用 Docker Compose 部署 | Halo 文档

1. 租服务器和申请域名

在开始搭建博客前,我们首先需要准备两个关键资源:服务器域名

🖥 服务器购买建议

我个人是在 京东云 上购买的「轻量云主机」,一年价格较为划算,非常适合个人博客使用。

常见的云服务器有两种形式:

  • 轻量云主机(推荐)

    • 适合个人开发或搭建博客

    • 资源固定(CPU、内存、带宽)

    • 按年购买更划算

    • 固定公网 IP,适合域名绑定

  • 弹性计算实例(ECS)

    • 按小时计费,可灵活启动/关闭

    • 每次重启后公网 IP 可能变化

    • 若要绑定域名,需配置弹性公网 IP(EIP),否则绑定存在限制

💡建议:
如果只是部署个人博客,轻量云主机已经足够,无需购买配置太高的服务器。

🌐 域名购买与备案

我也是在京东云购买了域名,一年价格合理。建议域名和服务器在同一平台购买,这样后续解析与绑定会更加方便。当然直接去某平台租一个月或者一年的域名,也省了备案,商家会帮你解析域名,无需你手动解析。

注意:如果你使用的是国内服务器(如京东云、阿里云、腾讯云等),域名必须进行备案,大约 1 周左右可以完成。

备案过程一般包括:

  • 填写备案信息

  • 上传身份证与网站说明

  • 等待审核通过

类似这种就完全够用,如果是618购买会比平时便宜,阿里云腾讯云同理

2. 安装docker和docker-compose

📌 参考博客

Docker 环境配置(手动安装) | 小傅哥 bugstack 虫洞栈

搭建 Halo 博客的第一步是先在服务器中安装好 DockerDocker 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 配合使用 | Halo 文档

Nginx Proxy Manager (NPM) 是一款基于 Docker 部署的可视化 Nginx 管理面板,支持一键反向代理、HTTPS 证书自动申请(Let's Encrypt)、多站点管理等功能,适合个人博客、内网穿透、AI 服务等场景。

🧰 环境准备

  • 已安装 Docker 和 Docker Compose

  • 域名已解析至服务器公网 IP(如 blog.example.com

  • 推荐服务器开放防火墙端口:80, 443, 81

📦 创建 docker-compose.yml 文件并执行

  1. 创建一个文件夹来存放 NPM 的 docker-compose.yml 文件:

mkdir -p ~/data/docker_data/nginxproxymanager   # 创建一个 npm 的文件夹

cd ~/data/docker_data/nginxproxymanager    # 进入该文件夹

vi docker-compose.yml   # 使用vi工具,注意输入i可以编辑文件,Esc键退出编辑,输入(:wq)是强制保存后退出
  1. 按下 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 目录,用于存放证书,如果不存在的话,会自动创建
  1. 在docker-compose.yml所在文件家打开命令行,执行

docker-compose up -d     # -d 表示后台运行
  1. 部署成功后,访问管理后台,在浏览器输入如下网址

http://<你的服务器IP>:81

默认登录的用户名:admin@example.com 密码:changeme

第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。

至此,我们已经完成了 Nginx Proxy Manager 的搭建。

🐳 配置 Halo 的反向代理

📌 背景说明

Halo 博客容器默认运行在内网的 8090 端口,我们希望通过 https://yourdomain.com 这样的域名来访问博客,需要使用 Nginx Proxy Manager 反向代理

🧩 操作步骤

  1. 打开 Nginx Proxy Manager 管理后台(http://服务器IP:81)

  2. 点击「Add Proxy Host」按钮

  3. 填写代理信息:直接参考官方文档——与 Nginx Proxy Manager 配合使用 | Halo 文档

  1. 勾选选项(推荐):

    • ✅ Block Common Exploits

    • ✅ Websockets Support

    • ✅ Cache Assets

  2. 保存并测试访问 http://yourdomain.com 是否成功跳转到博客首页。

📦一键申请 SSL 证书

📌 目的

让博客支持 https:// 加密访问,更安全也更专业。主要是Nginx Proxy Manager的SSL证书免费申请

⚙️ 操作步骤

  1. 编辑前面添加的 Proxy Host 项

  2. 切换到 SSL 选项卡

  3. 配置:与 Nginx Proxy Manager 配合使用 | Halo 文档

  1. 点击「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容器

📌 参考官方文档

使用 Docker Compose 部署 | 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  

用户指南 | Halo 文档

这里内容实在是太多了,我也摸索了一会,后续给出博客来讲解~

结束语

✅ 总结:

这次整体流程主要是围绕以下几个步骤展开的:

  1. 租服务器和域名备案;

  2. 使用 Docker 和 Docker Compose 搭建 Halo + MySQL;

  3. 安装 Nginx Proxy Manager,配置博客反向代理;

  4. 申请 SSL 证书,实现 HTTPS 安全访问;

  5. 进入 Halo 控制台进行初始化配置,完成博客上线。

整体部署流程虽然繁琐了一点,但基本都能照文档走通,属于“花点耐心就能搞定”的那种。

⚠️ 踩坑:

部署过程中也遇到了一些令人抓头的坑:

  • Nginx Proxy Manager 自动跳转 HTTPS 报错问题:

    管理后台默认运行在 81 端口,但浏览器会把 http://域名:81 自动升级为 https://域名:81,导致 ERR_SSL_PROTOCOL_ERROR,让我以为服务没启动成功,其实只是浏览器缓存的问题。解决方式是:直接用 IP + 81 端口访问后台,或者用无痕窗口打开。

  • Halo 控制台配置:交给下一篇博客总结(确实有些繁琐但是不难)~

🎉 收获:

虽然用的是开源的博客系统,但同时也学到很多细节,好事多磨。

后面会自己写一个前后端都由我开发的博客网站(虽然光是想到前端就已经开始头痛了哈哈哈)。

0

评论区