✌ 作者名字:高峰君主
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:没有我不会的语言,没有你过不去的坎儿。💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦🔎如果对文章内容有疑问,请在评论区留言,24小时内答复
目录
写在前面
环境要求
这里将讲述运行 Halo 所要求的一些软硬件的配置,我建议你在运行或者部署之前先浏览一遍此页面。
硬件配置
如果你要使用服务器进行部署 Halo,需要注意的是,Halo 目前不支持市面上的云虚拟主机,请使用云服务器或者 VPS。
CPU
无特别要求。目前Halo的 Docker 镜像 也已经支持多平台。
内存
为了获得更好的体验,我建议至少配置 1G 的 RAM。
磁盘
无特别要求,理论上如果不大量在服务器上传附件,Halo 对磁盘的容量要求并不是很高。但我推荐最好使用 SSD 硬盘的服务器,能更快的运行 Halo。
网络
无特别要求,Halo 目前可以在无公网环境下使用,但部分主题由于使用了第三方资源,可能需要公网环境。
软件环境
Halo 理论上可以运行在任何支持 Docker 及 Java 的平台。
Docker(可选)
我主要推荐使用 Docker 运行 Halo,这可以避免一些环境配置相关的问题
JRE(可选)
如果使用 Docker 镜像部署,那么无需在服务器上安装 JRE。但目前Halo也提供了 jar 文件部署的方式,但本文章不会介绍此方法,如有需要,文档可参考:
当前版本(2.0)需要 JRE 17 的版本,推荐使用 OpenJDK 17。
数据库
Halo 目前支持以下数据库:
- PostgreSQL
- MySQL
- MariaDB
- H2
其中,H2 不需要单独运行,其他数据库需要单独安装并配置。一般情况下,推荐使用 Docker Compose 部署将 Halo 和数据库容器编排在一起。
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时备份数据。
Web 服务器(可选)
如果你部署在生产环境,那么你很可能需要进行域名绑定,这时候我们推荐使用诸如 Nginx、Caddy 之类的 Web 服务器进行反向代理。但需要注意的是,目前 Halo 不支持代理到子目录(如:halo.run/blog)。
Wget(可选)
后续的文档中,我会使用 wget 为例,用于下载所需要的文件,所以请确保服务器已经安装好了这个软件包。当然,下载文件不限制工具,如果你对其他工具熟悉,可以忽略。
VIM(可选)
后续的文档中,我会使用 vim 为例,用于修改一些必要的配置文件,所以同样请确保服务器已经安装了这个软件包。当前,修改文档也不限制工具,如果你对其他编辑软件熟悉,也可以忽略。
浏览器支持
- 用户前台:视主题所支持的情况而定。
- 管理后台(Console 和个人中心):支持目前常见的现代浏览器,具体视 Vue 框架的支持情况而定。
名词解释
这里将列出后续文档中一些和 Halo 相关的名词含义。
~(符号)
代表当前系统下的 用户目录。
镜像
指 Halo 构建所产生的 Docker 镜像。用户通过该镜像启动 Halo 应用。
工作目录
指 Halo 所依赖的工作目录,在 Halo 运行的时候会在系统当前用户目录下产生一个 .halo2
的文件夹,绝对路径为 ~/.halo2
。由于这个工作目录是固定的,所以上面所说的 运行包
不限制所存放的位置,里面通常包含下列目录或文件:
db
:存放 H2 Database 的物理文件,如果你使用其他数据库,那么不会存在这个目录。themes
:里面包含用户所安装的主题。plugins
:里面包含用户所安装的插件。attachments
:附件目录。logs
:运行日志目录。application.yaml
:配置文件。
主题
包含了各种站点页面模板的资源包。用户访问 Halo 站点浏览到的内容及样式,由 Halo 管理端所配置使用的主题所决定。
相关使用文档:主题管理相关功能说明
插件
用于扩展 Halo 功能的软件包。插件独立于 Halo 核心应用,可以单独安装、升级、卸载。
相关使用文档:插件管理相关功能说明
使用 Docker Compose 部署
环境搭建
- Docker 安装文档:https://docs.docker.com/engine/install/
- Docker Compose 安装文档:https://docs.docker.com/compose/install/
我推荐按照 Docker 官方文档安装 Docker 和 Docker Compose,因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
创建容器组
目前 Halo 官方维护的 Docker 镜像仓库,可以根据自己的需求选择合适的镜像源:
- registry.fit2cloud.com/halo/halo
- Halohub/光环
- ghcr.io/halo-dev/halo
目前 Halo 2 并未更新 Docker 的 latest 标签镜像,主要因为 Halo 2 不兼容 1.x 版本,防止使用者误操作。我们推荐使用固定版本的标签,比如2.17
或者 2.17.0。
registry.fit2cloud.com/halo/halo:2
:表示最新的 2.x 版本,即每次发布新版本都会更新此镜像。registry.fit2cloud.com/halo/halo:2.17
:表示最新的 2.17.x 版本,即每次发布 patch 版本都会同时更新此镜像。registry.fit2cloud.com/halo/halo:2.17.0
:表示一个具体的版本。
后续文档以 为例。registry.fit2cloud.com/halo/halo:2.17
-
在系统任意位置创建一个文件夹,此文档以 为例。
~/halo
mkdir ~/halo && cd ~/halo
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。 -
创建
docker-compose.yaml
此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要选择一种。
需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。
-
创建 Halo + PostgreSQL 的实例:
~/halo/docker-compose.yamlversion: "3" services: halo: image: registry.fit2cloud.com/halo/halo:2.17 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 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 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 服务中添加端口映射,PostgreSQL 的端口为 。halodb
5432
-
创建 Halo + MySQL 的实例:
~/halo/docker-compose.yamlversion: "3" services: halo: image: registry.fit2cloud.com/halo/halo:2.17 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 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 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 服务中添加端口映射,MySQL 的端口为 。
halodb
3306
-
仅创建 Halo 实例(使用默认的 H2 数据库):
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时备份数据。
~/halo/docker-compose.yamlversion: "3" services: halo: image: registry.fit2cloud.com/halo/halo:2.17 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 command: # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/
-
仅创建 Halo 实例(使用已有外部数据库,MySQL 为例):
~/halo/docker-compose.yamlversion: "3" services: halo: image: registry.fit2cloud.com/halo/halo:2.17 restart: on-failure:3 network_mode: "host" volumes: - ./halo2:/root/.halo2 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
运行参数详解:
参数名 描述 spring.r2dbc.url
数据库连接地址,详细可查阅下方的 数据库配置
spring.r2dbc.username
数据库用户名 spring.r2dbc.password
数据库密码 spring.sql.init.platform
数据库平台名称,支持 、、 postgresql
mysql
h2
halo.external-url
外部访问链接,如果需要在公网访问,需要配置为实际访问地址 数据库配置:
链接方式 链接地址格式 spring.sql.init.platform
PostgreSQL的 r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE}
PostgreSQL的 MySQL的 r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE}
MySQL的 H2 数据库 r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
H2型 -
-
启动 Halo 服务
docker-compose up -d
实时查看日志:
docker-compose logs -f
-
用浏览器访问 /console 即可进入 Halo 管理页面,首次启动会进入初始化页面。
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。http://ip:端口号
当然,方法还有很多种,但我只介绍这一种,因为用这种方法部署后面的麻烦会少些
更新容器组
-
备份数据,可以参考 备份与恢复 进行完整备份。
-
更新 Halo 服务
修改 中配置的镜像版本。
docker-compose.yaml
services: halo: image: registry.fit2cloud.com/halo/halo:2.17
docker-compose up -d
反向代理
你可以在下面的反向代理软件中任选一项,我假设你已经安装好了其中一项,并对其的基本操作有一定了解。如果你对它们没有任何了解,可以参考Halo更为详细的反向代理文档:
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
www.yourdomain.com
encode gzip
reverse_proxy 127.0.0.1:8090
特拉菲克
更新 halo 容器组的配置
networks
中引入已存在的网络 (此网络需要 提前创建)traefik
services.halo.networks
中添加网络traefik
- 修改外部地址为你的域名
- 声明路由规则、开启 TLS
version: "3.8"
networks:
traefik:
external: true
halo:
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.17
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
初始化
通过之前的安装文档,你已经成功安装了 Halo,在首次访问网站的时候会自动跳转到初始化页面,你需要完成这个步骤才能正常使用 Halo。
表单项说明:
- 站点名称:网站的名称,将会显示在浏览器标签页上。
- 邮箱:初始管理员的邮箱地址。
- 用户名:初始管理员的用户名。
- 密码:初始管理员的密码。
- 确认密码:重复输入密码以验证是否匹配。
输入完成之后点击初始化按钮即可完成初始化,初始化完成之后,将会跳转到登录页面,输入刚才设置的用户名和密码即可登录。
第一篇文章
登录管理端
浏览器访问 即可进入 Halo 管理端。/console
新建文章
Halo 安装完成后,默认初始化了一篇 文章,接下来我们将创建并发布一篇自己的文章。Hello Halo
- 在 Halo 管理端,点击仪表盘页面中的 快捷入口,即可进入到文章编辑页面。
创建文章
- 在文章编辑器中,你可以尽情写下你想展现的内容。
- 当内容编辑完成后,点击右上角的 按钮,给文章设置一个合适的标题和别名,同时可以设置文章所属分类、标签及其他一些高级设置。
发布
- 确认无误后,点击弹框下方的 按钮,我们的第一篇文章就成功发布了。
发布
查看文章
文章发布成功后,就可以在主题端查看到我们刚刚创建的文章了。
浏览器访问域名进入站点首页,站点展示的内容及样式由当前启用的主题所决定。
接下来,选一款喜欢的主题,尽情体验 Halo 吧!