更新时间:2025-08-14 14:02:39
官方地址:Halo - 强大易用的开源建站工具
部署前需先安装 Docker 和 Docker Compose,建议参考官方文档安装(部分 Linux 发行版软件仓库中的 Docker 版本可能过旧):
Docker 安装文档:https://docs.docker.com/engine/install/
Docker Compose 安装文档:https://docs.docker.com/compose/install/
Halo 官方维护的 Docker 镜像仓库如下,可根据需求选择:
halohub/halo
ghcr.io/halo-dev/halo
Halo 2 未更新 Docker 的 latest 标签镜像(因不兼容 1.x 版本,避免误操作),推荐使用固定版本标签,例如 2.21 或 2.21.0。
镜像标签说明:
registry.fit2cloud.com/halo/halo:2:最新的 2.x 版本(每次发布新版本会更新)。
registry.fit2cloud.com/halo/halo:2.21:最新的 2.21.x 版本(每次发布 patch 版本会更新)。
registry.fit2cloud.com/halo/halo:2.21.0:具体的固定版本。
后续文档以 registry.fit2cloud.com/halo/halo:2.21 为例。
在系统任意位置创建文件夹(示例为 ~/halo),Halo 产生的所有数据会保存在此目录,请妥善保存:
bash
mkdir ~/halo && cd ~/halo
docker-compose.yaml 配置文件以下提供 4 种场景的配置文件,可根据数据库需求选择(所有 Halo 相关配置均通过 Docker 容器启动参数设置,无需额外创建 application.yaml 文件)。
~/halo/docker-compose.yaml 内容如下:
yaml
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_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,需与下方 POSTGRES_PASSWORD 一致
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
# 外部访问地址,需根据实际情况修改
- --halo.external-url=http://localhost:8090/
halodb:
image: postgres:15.4
restart: on-failure:3
networks:
halo_network:
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:
信息:默认未设置 PostgreSQL 端口映射,若需在容器外部访问,可在 halodb 服务中添加端口映射(PostgreSQL 默认端口为 5432)。
~/halo/docker-compose.yaml 内容如下:
yaml
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_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:
信息:默认未设置 MySQL 端口映射,若需在容器外部访问,可在 halodb 服务中添加端口映射(MySQL 默认端口为 3306)。
注意:H2 数据库可能因操作不当导致数据文件损坏,仅建议在内存不足时临时使用,且需按时备份数据。
~/halo/docker-compose.yaml 内容如下:
yaml
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
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_OPTS=-Xmx256m -Xms256m
command:
# 外部访问地址,需根据实际情况修改
- --halo.external-url=http://localhost:8090/
需提前手动创建数据库(以 MySQL 为例,需执行 create database halo character set utf8mb4 collate utf8mb4_bin;),~/halo/docker-compose.yaml 内容如下:
yaml
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
network_mode: "host"
volumes:
- ./halo2:/root/.halo2
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可根据实际情况调整,置空表示不添加
- JVM_OPTS=-Xmx256m -Xms256m
command:
# 修改为自己已有的 MySQL 配置
- --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo
- --spring.r2dbc.username=root
- --spring.r2dbc.password=
- --spring.sql.init.platform=mysql
# 外部访问地址,需根据实际情况修改
- --halo.external-url=http://localhost:8090/
# 端口号,默认 8090
- --server.port=8090
信息:完整配置选项列表可查阅 配置说明。
在 ~/halo 目录下执行以下命令,后台启动 Halo 服务:
bash
docker-compose up -d
实时查看服务运行日志:
bash
docker-compose logs -f
用浏览器访问 http://[服务器IP或域名]:8090/console 即可进入 Halo 管理页面,首次启动会进入初始化页面。
提示:
若需配置域名访问,建议先完成反向代理和域名解析,再进行初始化。
若通过 http://ip:端口号 无法访问,需:
在服务器厂商后台将 8090 端口添加到安全组;
若使用 Linux 面板,需在面板安全组中同样添加 8090 端口。
参考 备份与恢复 文档,对 Halo 数据进行完整备份。
修改 docker-compose.yaml 中 Halo 服务的镜像版本(例如将 2.21 改为新版本号):
yaml
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21 # 此处替换为目标版本
重启服务以应用更新:
bash
docker-compose up -d
可选择以下任意一种反向代理软件,假设已安装并了解基本操作(详细配置可参考 Halo 反向代理文档)。
在 Nginx 配置文件中添加以下内容:
nginx
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.com; # 替换为你的域名
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在 Caddyfile 中添加以下内容:
caddyfile
www.yourdomain.com # 替换为你的域名
encode gzip
reverse_proxy 127.0.0.1:8090
提前创建 Traefik 网络:docker network create traefik;
修改 docker-compose.yaml 配置(添加 Traefik 相关配置):
yaml
version: "3.8"
networks:
traefik:
external: true
halo:
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
volumes:
- ./halo2:/root/.halo2
networks:
- traefik
- halo
command:
# 外部访问地址,替换为你的域名
- --halo.external-url=https://yourdomain.com
labels:
traefik.enable: "true"
traefik.docker.network: traefik
traefik.http.routers.halo.rule: Host(`yourdomain.com`) # 替换为你的域名
traefik.http.routers.halo.tls: "true"
traefik.http.routers.halo.tls.certresolver: myresolver
traefik.http.services.halo.loadbalancer.server.port: 8090
最后更新:由 Ryan Wang 于 2025 年 8 月 14 日 更新
