曲水的博客

曲水流觞

Halo建站全流程

41
2025-08-02

由于原来的Halo一直用的是原生的H2数据库,不是很稳定,所以决定切换成Mysql的数据库。顺带升级一下Halo的版本。因为要用到数据库,所以这次采用了Docker Compose来建站,将建站的步骤和途中遇到的问题记录一下备查。

建站流程

建站准备

建站前需要准备的东西不多,一个域名一个服务器就够了。本文演示使用的是2h2g3m的服务器,用来运行一个简版的Mysql加上一个Halo基本够用。采用的系统是Ubuntu 24.04 64位。(CentOS狗都不用)

安装宝塔面板

  • 现在安装宝塔面板已经不需要命令行了,宝塔官网提供了在线安装的方式非常的方便。进入到宝塔在线安装的连接,输入自己的网站的公网ip以及登录的密码,选择需要的服务(这里因为Halo只需要用到Nginx,所以其他服务没有安装,Mysql不安装的原因是因为进到宝塔里面会安装一个丐版的,正式版跑不动)

  • 安装好宝塔面板之后会返回一个宝塔面板的登录信息(这个页面很重要,一定要保存!)。之后就可以根据面板信息的网址、账号、密码登录到宝塔界面里面。

安装Docker服务

在宝塔界面左侧的Docker里面直接选择安装Docker服务即可。

安装Mysql和创建Mysql数据库

  • 在左侧的数据库界面选择安装Mysql数据库即可,安装的时候会提示安装的版本,我这里选择的是丐版(因为服务器内存不够导致的)。
  • 安装好Mysql数据库之后,直接在上方添加数据库中添加一个名为Halo的数据库,密码可以设置成和root密码一致。

安装Docker Compose服务

  • 安装Docker Compose服务的方式有很多种,可以在线安装也可以离线安装,我这里采用的是下载安装包进行离线安装的方式,下载地址可以去Github的这个页面:Docker Compose安装包下载。进去以后找到自己服务器系统以及架构对应的版本安装下来就可以了,我这里安装的是Linux的x86_64的版本。
  • 下载完成之后可以通过宝塔面板把文件丢到任意一个文件夹中,我这里丢到了根目录的Downloads文件夹下面。下面是安装Docker Compose服务的代码:
#进入到下载文件夹
cd Downloads

#将docker-compose移动到相应位置
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

#赋予docker-compose可执行权限
sudo chmod +x /usr/local/bin/docker-compose

#查看docker-compose版本,试验是否安装成功
sudo docker-compose -v

开始建站

安装好Docker和Docker Compose之后,就可以开始Halo建站的过程了。在建站之前,建议先看一下下面一个Part里面的问题1:阿里云系统磁盘总读BPS突然增很高,导致网站502,调整一下服务器的swap设置。建站过程可以参考Halo官网的安装指南

设置和部署Docker Compose服务

  • 在系统的任意一个位置建立一个Halo文件夹,以~/halo为例:

mkdir ~/halo && cd ~/halo

  • 创建 docker-compose.yaml,因为我安装的是Mysql数据库,所以采用的是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:
  • 上面这个文档里面需要修改的信息有:

    • 最上面的version一行可以删掉。
    • spring.r2dbc.password=o#DwN&JSa56后面修改成数据库的root密码。
    • halo.external-url=http://localhost:8090/外部访问地址修改成自己的域名,这个参数部署好Halo博客之后也能修改,这里改不改问题都不大,不影响博客的部署。
    • MYSQL_ROOT_PASSWORD=o#DwN&JSa56后面修改成数据库的root密码。
  • 修改好文档信息并保存之后,就可以启动Docker Compose服务了:

docker-compose up -d

  • 实时查看日志:

docker-compose logs -f

  • 用浏览器访问 公网ip:8090/console 即可进入 Halo 管理页面,首次启动会进入初始化页面。

设置网站信息

在宝塔界面的左边网站一栏,添加自己的站点。(这里可以把根域名和博客的域名都添加上去,添加到一条站点信息里面,方便后面进行管理。

部署反向代理

在站点建立好之后,在右边的设置里面,进来之后可以设置反向代理。设置如图所示:

部署SSL证书

  • SSL证书有很多种获取的方式,可以直接在服务器商申请SSL证书,然后下载下来,把KEY和PEM都上传上去实现部署。但是现在SSL证书更新频次太快了,30天就要进行一次更新很麻烦。
  • 我网站采用的是Let’s Encrypt的SSL证书,Let’s Encrypt是一家免费、开放、自动化的公益证书颁发机构(CA),由互联网安全研究组运作,官方网站为:Let's Encrypt官网。中文版网站:Let's Encrypt中文官网

备份和恢复

  • Halo2.x的版本都提供了非常方便的备份和恢复的方式,是整个网站进行无痛搬迁,不需要重新设置乱七八糟的参数,非常方便。
  • 在Halo的控制台界面,点击备份然后把备份下载下来,在新的服务器的Halo的控制台界面将文件上传上去恢复即可。
  • 这里可能会遇到添加反向代理之后出现上传文件过大导致的报错,这里可以先把反代关了再上传备份文件以后再开启反代,也可以去终端设置一下反代的文件上传大小上限,具体设置方式可以参考这篇文章:上传文件报错 413 Request Entity Too Large应该怎么处理

遇到的问题

问题1:阿里云系统磁盘总读BPS突然增很高,导致网站502

情况描述

在启动Docker Compose服务的时候,无法进行远程连接,阿里云的系统磁盘总读写BPS和IOPS居高不下,系统上所有web服务无法正常使用,整个网站陷入卡死的状态。

发生原因

Swap设置太低造成的,系统最初安装的时候默认是1024MB,dnf运行大量占用了swap,导致磁盘堵塞。

解决方法

  1. 用VNC连接先关闭服务器,或者重启服务器,趁Docker服务还没有启动的时候赶紧连进去把Docker Compose服务关掉。
  2. 将swap文件设置为4G大小,将swappiness从0设置到60。
# 禁用当前的swap分区
sudo swapoff -a

# 删除当前的swap文件(没有可以忽略这步)
sudo rm /swapfile

# 创建新的swap文件
sudo fallocate -l 4G /swapfile

# 设置权限
sudo chmod 600 /swapfile

# 设置swap文件
sudo mkswap /swapfile

# 启动swap文件
sudo swapon /swapfile

# 查看当前swappiness值,默认都是0
cat /proc/sys/vm/swappiness

# 修改swappiness值,修改或添加vm.swappiness=60
vim /etc/sysctl.conf

# 让配置生效
sudo sysctl -p

# 再次查看当前的swappiness值,验证是否修改成功
cat /proc/sys/vm/swappiness

问题2:证书验证及自动续签

情况描述

现在网页的SSL证书已经调整到30天就要做一次续签,非常的麻烦。所以需要寻求一种高效的方式,可以自动续签证书的,解放双手。

未完待续……

  • 0