什么是 Halo ?

Halo 是一款基于 Java / Spring Boot 开发的开源博客系统,专注于为个人博客和技术博客提供优雅、现代的解决方案。 其核心理念是让用户回归写作本身,具备开箱即用的部署方式、现代化的后台管理界面和原生的 Markdown 写作体验。 系统拥有强大的主题系统和插件化架构,支持功能扩展,同时保持轻量。

Halo 支持以下部署方式:

  1. Docker Compose 部署

  2. Docker 部署

  3. 1Panel 部署(最简单,但是最吃服务器性能)

  4. Helm 部署

  5. Podman 部署

  6. JAR 文件部署(比较复杂,但对小破站友好)

  7. 离线包部署


教程简介

本教程采用的第六种部署方式 —— JAR 文件部署,该部署方式虽然比较复杂,但对2核2G的小破站来说却是最友好的方式(亲自尝试过)

https://docs.halo.run/

在此之前

准备

  1. 一台Linux服务器(配置至少 2G 的 RAM)

  2. JDK21 的 Java 运行环境,这里推荐使用 Zulu21

  3. Halo 的 jar 程序包

  4. SSH + SFTP 工具

  5. 确定服务器 MySQL 已安装,如果需要使用 MySQL 可以查看下面的这个博客👇👇👇

    https://blog.playereg.top/archives/019c1ddc-c5a6-74cf-8627-d187fa24c22e

附件


正式部署

上传资源

首先,使用 SFTP 工具将 Halo 的 jar 程序包Zulu JDK 21 的 tar.gz 压缩包上传到你服务器下的 /home 目录下

717b9cbe-0af1-4880-b8dc-6c3f4afd8855.gif

然后切换到 /home ,并查看Halo 的 jar 程序包Zulu JDK 21 的 tar.gz 压缩包是否上传成功

cd /home && ll

如果输出有 halo-2.22.12.jarzulu21.48.15-ca-jdk21.0.10-linux_x64.tar.gz ,则资源成功上传至服务器中

root@ubuntu-vm-server:~# cd /home && ll
total 316740
drwxr-xr-x  3 root root      4096 Feb  3 09:16 ./
drwxr-xr-x 23 root root      4096 Feb  1 15:34 ../
-rw-r--r--  1 root root 110445057 Feb  3 09:16 halo-2.22.12.jar # <== Halo程序包
drwxr-x---  4 user user      4096 Feb  1 15:53 user/
-rw-r--r--  1 root root 213871305 Feb  3 09:16 zulu21.48.15-ca-jdk21.0.10-linux_x64.tar.gz # <== Zulu JDK 21

配置运行环境

Halo 2.21 以上的版本需要使用 JDK21 运行环境,因此这里我使用 Zulu21 做演示,使用 Zulu JDK 一定程度上还能够提升服务器性能,接下来将开始配置 Zulu JDK 21

首先将 Zulu JDK 21 的 tar.gz 压缩包解压到 /opt 目录下

tar -xzf zulu21.48.15-ca-jdk21.0.10-linux_x64.tar.gz -C /opt/

使用 ll /opt/ 命令检查一下是否解压成功,如果输出结果中存在 zulu21.48.15-ca-jdk21.0.10-linux_x64 目录,这说明解压成功

root@ubuntu-vm-server:/home# ll /opt/
total 12
drwxr-xr-x  3 root root 4096 Feb  3 10:42 ./
drwxr-xr-x 23 root root 4096 Feb  1 15:34 ../
drwxr-xr-x 10 root root 4096 Jan  8 14:25 zulu21.48.15-ca-jdk21.0.10-linux_x64/ # <== 解压好的JDK环境

接着将工作区切换到 /opt 目录下,并重命名 JDK 环境文件夹名称为 zulu21

cd /opt/
mv ./zulu21.48.15-ca-jdk21.0.10-linux_x64/ ./zulu21/

接着使用 ll 命令检查一下是否成功重命名,如果输出结果中存在 zulu21 ,则说明修改成功

root@ubuntu-vm-server:/opt# ll
total 12
drwxr-xr-x  3 root root 4096 Feb  3 10:54 ./
drwxr-xr-x 23 root root 4096 Feb  1 15:34 ../
drwxr-xr-x 10 root root 4096 Jan  8 14:25 zulu21/ # <== 名称被修改成了 zulu21

接着检查 zulu21 能否正常使用,这里直接运行 -version 查看版本

./zulu21/bin/java -version

如果正常输出 JDK 版本,说明环境正常

root@ubuntu-vm-server:/opt# ./zulu21/bin/java -version
openjdk version "21.0.10" 2026-01-20 LTS
OpenJDK Runtime Environment Zulu21.48+15-CA (build 21.0.10+7-LTS)
OpenJDK 64-Bit Server VM Zulu21.48+15-CA (build 21.0.10+7-LTS, mixed mode, sharing)

接下来需要为 Zulu JDK 21 创建 zulu21 的软链接,以便后续直接通过 zulu21 命令使用 JDK 环境

ln -sf /opt/zulu21/bin/java /usr/local/bin/zulu21

接下来直接使用 zulu21 -version 命令检查是否软链接成功,如果正常输出 JDK 版本,这软链接成功

root@ubuntu-vm-server:/opt# zulu21 -version
openjdk version "21.0.10" 2026-01-20 LTS
OpenJDK Runtime Environment Zulu21.48+15-CA (build 21.0.10+7-LTS)
OpenJDK 64-Bit Server VM Zulu21.48+15-CA (build 21.0.10+7-LTS, mixed mode, sharing)

到这里 JDK 环境配置完成,由于本次教程最终目的是为了让 Halo 的 jar 程序包在服务器上运行,这里并未配置 zulu21 的系统环境变量 JAVA_HOME ,如果需要 JAVA_HOME 可以自行配置

安装并配置 Halo

首先在 /opt 目录下创建 /app 目录,用于存放 Web 应用,然后将 Halo jar程序包移动到 /app 目录并重命名为 halo2.jar ,并检查是否移动成功

mkdir ./app # 创建 /app 目录
sudo mv /home/halo-2.22.12.jar ./app/halo2.jar # 移动 Halo 程序包到 /app 目录下
ll ./app # 检查 /app 目录内容

如果输出结果为以下结果,则 Halo jar 程序包成功被移动到了 /app 目录下

root@ubuntu-vm-server:/opt# ll ./app
total 107868
drwxr-xr-x 2 root root      4096 Feb  3 11:45 ./
drwxr-xr-x 4 root root      4096 Feb  3 11:45 ../
-rw-r--r-- 1 root root 110445057 Feb  3 11:45 halo2.jar

接下来为 Halo 创建工作目录 ~/.halo2 ,并将当前工作区切换到该目录下

mkdir ~/.halo2 && cd ~/.halo2

接下来切换到 MySQL 命令行

# 切换到 MySQL 命令行
mysql -u root -p

为 Halo 创建数据库,这里我使用的是 MySQL 数据库,创建 halo_db 数据库,并查看是否配置成功

create database halo_db character set utf8mb4 collate utf8mb4_bin; -- 创建 halo_db 数据库
SHOW DATABASES LIKE 'halo_db'; -- 查看是否创建成功

如果创建成功,查看结果如下:

+--------------------+
| Database (halo_db) |
+--------------------+
| halo_db            |
+--------------------+
1 row in set (0.01 sec)

使用 quit; 命令退出 MySQL 命令行,接着在 ~/.halo2 目录下创建 Halo 的 yaml 配置文件

  • 使用 Vim 编辑器:sudo vim application.yaml

  • 使用 Nano 编辑器:sudo nano application.yaml

server:
  # 运行端口
  port: 8090
spring:
  # 数据库配置,支持 MySQL、MariaDB、PostgreSQL、H2 Database,具体配置方式可以参考下面的数据库配置
  r2dbc:
    url: r2dbc:pool:mysql://127.0.0.1:3306/halo_db?allowPublicKeyRetrieval=true&useSSL=false
    username: root
    password: 123456 # 修改成你自己的密码
  sql:
    init:
      mode: always
      # 需要配合 r2dbc 的配置进行改动
      platform: mysql
halo:
  security:
    two-factor-disabled: true
  # 工作目录位置
  work-dir: ${user.home}/.halo2
  # 外部访问地址
  external-url: http://localhost:8090
  # 附件映射配置,通常用于迁移场景
  attachment:
    resource-mappings:
      - pathPattern: /upload/**
        locations:
          - migrate-from-1.x

然后初步运行 Halo 验证配置是否生效,并做初始化设置

# 切换工作目录到 Halo 所在目录
cd /opt/app/

# 运行 Halo
zulu21 -Dfile.encoding=UTF-8 -jar halo2.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
页面url:http://你的服务器IP:8090/console

初始化完成后可以登录验证一下是否正确部署

看到以下这个管理员界面说明 Halo 成功部署

配置 Halo 的系统服务

接下来配置 Halo 的系统 service 服务,用于更加方便的启动 Halo 服务

首先回到 SSH 命令行,使用快捷键 ctrl + c 停止 Halo 服务,然后使用以下命令为 Halo 创建系统服务

  • 使用 Vim 编辑器:sudo vim /etc/systemd/system/halo2.service

  • 使用 Nano 编辑器:sudo nano /etc/systemd/system/halo2.service

其中 halo2.service 的配置为:

[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
ExecStart=/opt/zulu21/bin/java -Dfile.encoding=UTF-8 -server -Xms256m -Xmx1024m -jar /opt/app/halo2.jar --spring.config.additional-location=optional:file:/root/.halo2/
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandardOutput=syslog
StandardError=inherit

[Install]
WantedBy=multi-user.target

保存后,从新加载 service 配置项

systemctl daemon-reload

运行 sudo systemctl start halo2 命令启动 Halo 服务,并使用 sudo systemctl status halo2 查看服务运行状态,出现以下结果,则表明 Halo 成功加入到系统服务中

● halo2.service - Halo Service
     Loaded: loaded (/etc/systemd/system/halo2.service; disabled; preset: enabled)
     Active: active (running) since Tue 2026-02-03 13:22:36 UTC; 4s ago # <== Halo 服务正在运行
       Docs: https://docs.halo.run
   Main PID: 4033 (java)
      Tasks: 40 (limit: 9380)
     Memory: 460.8M (peak: 460.8M)
        CPU: 12.478s
     CGroup: /system.slice/halo2.service
             └─4033 /opt/zulu21/bin/java -Dfile.encoding=UTF-8 -server -Xms256m -Xmx1024m -jar /opt/app/halo2.jar --spring.config.additional-location=optional:file:/root/.halo2/

到了这步,Halo 已经可以通过 systemctl 命令进行服务管理

sudo systemctl start halo2    # 启动
sudo systemctl restart halo2  # 重启
sudo systemctl stop halo2     # 关闭
sudo systemctl status halo2   # 查看状态
sudo systemctl enable halo2   # 设置自启动
sudo systemctl disable halo2  # 禁用自启动

到了这里,你的 Halo 已经搭建完成了

恭喜成为入门站长!!! ٩(๑•̀ω•́๑)۶