喵pass

使用 Docker Compose 部署 Halo

2025/10/29
14
0

更新时间:2025-08-14 14:02:39

官方地址:Halo - 强大易用的开源建站工具

一、环境搭建

部署前需先安装 Docker 和 Docker Compose,建议参考官方文档安装(部分 Linux 发行版软件仓库中的 Docker 版本可能过旧):

二、创建容器组

1. 选择镜像源

Halo 官方维护的 Docker 镜像仓库如下,可根据需求选择:

注意事项:

  • Halo 2 未更新 Docker 的 latest 标签镜像(因不兼容 1.x 版本,避免误操作),推荐使用固定版本标签,例如 2.212.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 为例。

2. 创建工作目录

在系统任意位置创建文件夹(示例为 ~/halo),Halo 产生的所有数据会保存在此目录,请妥善保存:

bash

mkdir ~/halo && cd ~/halo

3. 创建 docker-compose.yaml 配置文件

以下提供 4 种场景的配置文件,可根据数据库需求选择(所有 Halo 相关配置均通过 Docker 容器启动参数设置,无需额外创建 application.yaml 文件)。

场景 1:Halo + PostgreSQL(推荐)

~/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)。

场景 2:Halo + MySQL

~/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)。

场景 3:Halo + H2(不推荐生产环境)

注意: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/

场景 4:使用外部数据库

需提前手动创建数据库(以 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

4. 运行参数详解

参数名

描述

spring.r2dbc.url

数据库连接地址,格式参考下方 “数据库配置”

spring.r2dbc.username

数据库用户名

spring.r2dbc.password

数据库密码

spring.sql.init.platform

数据库平台名称,支持 postgresqlmysqlmariadbh2

halo.external-url

外部访问链接,若需公网访问,需配置为实际访问地址

5. 数据库配置

链接方式

链接地址格式

spring.sql.init.platform

PostgreSQL(推荐)

r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE}

postgresql

MySQL

r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE}

mysql

MariaDB

r2dbc:pool:mariadb://{HOST}:{PORT}/{DATABASE}

mariadb

H2 Database

r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE

h2

信息:完整配置选项列表可查阅 配置说明

三、启动 Halo 服务

1. 启动服务

~/halo 目录下执行以下命令,后台启动 Halo 服务:

bash

docker-compose up -d

2. 查看日志

实时查看服务运行日志:

bash

docker-compose logs -f

3. 访问管理页面

用浏览器访问 http://[服务器IP或域名]:8090/console 即可进入 Halo 管理页面,首次启动会进入初始化页面。

提示

  • 若需配置域名访问,建议先完成反向代理和域名解析,再进行初始化。

  • 若通过 http://ip:端口号 无法访问,需:

    1. 在服务器厂商后台将 8090 端口添加到安全组;

    2. 若使用 Linux 面板,需在面板安全组中同样添加 8090 端口。

四、更新容器组

1. 备份数据(可选但推荐)

参考 备份与恢复 文档,对 Halo 数据进行完整备份。

2. 执行更新

  1. 修改 docker-compose.yaml 中 Halo 服务的镜像版本(例如将 2.21 改为新版本号):

    yaml

    services:
      halo:
        image: registry.fit2cloud.com/halo/halo:2.21  # 此处替换为目标版本
    
  2. 重启服务以应用更新:

    bash

    docker-compose up -d
    

五、反向代理

可选择以下任意一种反向代理软件,假设已安装并了解基本操作(详细配置可参考 Halo 反向代理文档)。

1. Nginx

在 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;
  }
}

2. Caddy 2

在 Caddyfile 中添加以下内容:

caddyfile

www.yourdomain.com  # 替换为你的域名
encode gzip
reverse_proxy 127.0.0.1:8090

3. Traefik

  1. 提前创建 Traefik 网络:docker network create traefik

  2. 修改 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 日 更新

赞赏码.png