docs: documentation for Halo 2.0 (#92)

提供 Halo 2.0 的文档。

TODO list:

- [x] Halo 2.0 的配置文档
- [ ] ~~插件/主题开发的简要文档~~

```release-note
提供 Halo 2.0 的文档
```
JohnNiang-patch-1
Ryan Wang 2 years ago committed by GitHub
parent 2e421f26ab
commit 95971a90df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -3,135 +3,4 @@ title: 相关说明
description: 开发环境的一些说明
---
## 所需要的环境
1. IDE[IntelliJ IDEA](https://www.jetbrains.com/idea/download/) 或者 [STS](https://spring.io/tools)Spring Tools Suite
2. 工具:[Gradle](https://gradle.org/)[Lombok](https://projectlombok.org/) 插件
3. JDK`11+`
> 推荐 IntelliJ IDEA 社区版(开源免费)<https://github.com/JetBrains/intellij-community>
`Halo` 项目使用了 `Lombok`,运行 `Halo` 之前请检查 `IDE` 是否已经安装好了 `Lombok` 插件。
如果使用的 `IDE``IntelliJ IDEA`,请在设置中启用 `Build, Execution, Deployment/Annotation Processors``Enable annotation processing`
如果仍然因为 `Lombok` 报错,请更新 `IntelliJ IDEA` 至最新版。
## 克隆项目Optional
如果你已经 `fork` 了 [`Halo`](https://github.com/halo-dev/halo),请将以下命令中的 `halo-dev` 替换为你的 `GitHub 用户名`
```bash
git clone --recursive https://github.com/halo-dev/halo
// 如果你在 GitHub 上已经添加了你的 ssh key请使用以下命令进行 clone
git clone --recursive git@github.com:halo-dev/halo.git
```
这里推荐使用第二种方式进行克隆,这样每次提交代码的时候,就不会提示登录 `GitHub` 了。
## 导入项目
导入项目的时候请选择 `Gradle 项目`进行导入。
> `IntelliJ IDEA` 在导入项目的时候请勾选 `auto import`,推荐使用 `gradle wrapper`
## 运行方式
`Halo` 运行方式总体来讲有以下两种:
### 直接运行 `Application` 主类(配合 IDE 运行)
如果需要指定配置,请在 `Run/Debug Configuration` 内进行设置 `VM options`(这里推荐采用上文的[自定义配置](#%E8%87%AA%E5%AE%9A%E4%B9%89%E9%85%8D%E7%BD%AE)),例如:
```ini
-Dspring.profiles.active=dev
-Dhalo.auth-enabled=false
-Dhalo.production-env=false
```
### 采用 `gradle bootRun task` 运行(不需要 IDE
在项目根目录下运行以下命令:
```bash
# 类 Unix 用户
./gradlew bootRun
# Windows 用户
./gradlew.bat bootRun
```
如果需要手动指定配置,可添加 `--args` 参数(这里推荐采用上文的[自定义配置](#%E8%87%AA%E5%AE%9A%E4%B9%89%E9%85%8D%E7%BD%AE)),例如:
```bash
# 类 Unix 用户
./gradlew bootRun --args="--spring.profiles.active=dev --server.port=2333"
# Windows 用户
./gradlew.bat bootRun --args="--spring.profiles.active=dev --server.port=2333"
```
如果一切正常且没有额外指定配置,则可根据控制台的输出链接进行访问 `Halo`
```java
2019-06-06 16:20:52.285 INFO 1330 --- [ restartedMain] run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090
2019-06-06 16:20:52.285 INFO 1330 --- [ restartedMain] run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin
2019-06-06 16:20:52.285 DEBUG 1330 --- [ restartedMain] run.halo.app.listener.StartedListener : Halo doc was enable at http://127.0.0.1:8090/swagger-ui.html # 仅在开发环境才会输出
```
首次运行的时候,会跳转到博客安装页面,请大家耐心填写完毕,最后正式进入`开发之旅`。
这里推荐一个配置:
| key | value |
| :----- | :------------ |
| 用户名 | test |
| 昵称 | test |
| 邮箱 | test@test.com |
| 密码 | opentest |
---
## 高级配置
### 调整启动参数VMoptions
运行命令中添加 `VM options`,例如:
```ini
-Dspring.profiles.active=dev
```
### 调整启动参数args
运行命令中添加参数,例如:
```ini
--spring.profiles.active=dev
```
`IDE` 一般都会提供一个 `Run/Debug 配置`,可以添加 `VM options``参数`。以上示例可以直接应用在以`命令运行`方式上。
### 启用自动构建Build project automatically
在开发环境下,修改代码之后,每次都需要重启应用,是一个非常耗时的操作。
有一个专门解决这个问题的工具,那就是 [JRebel](https://jrebel.com/),但是它的费用实在是太昂贵,作为普通的开发者很难承受这笔费用(但**不推荐**使用破解版)。
于是 `Halo` 最后采用了 `Spring Boot` 官方推荐的 [Developer Tools](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html)。
这里以 `IntelliJ IDEA` 为例。
1. 进入 `Settings` (Preferences on macOS)。
2. 打开 `Build, Execution, Deployment > Compiler`. 启用 `Build project automatically`
3. 点击 `应用`
4. 按 `Ctrl+Shift+A` (Cmd+Shift+A on macOS)快捷键,然后搜索 `Registry`。打开之后找到 `compiler.automake.allow.when.app.running`,并启用它 (IntelliJ IDEA 15 and newer)。
> 来源于 <https://zeroturnaround.com/software/jrebel/quickstart/intellij/enable-automatic-compilation-in-intellij-idea/>
Developer Tools 原理
在保存代码的时候,`IDE` 会自动为我们编译代码,`Developer Tools` 检测到代码的 `class 文件`(只能检测 `classpath` 下的 `class 文件`)的变更,会自动重启项目。注意,这里的重启速度会有质的提升,具体原因是 `Spring Boot` 提供的 `restart 技术`提供了两个 `classloaders``base classloader` 和 `restart classloader`。当项目重启的时候 `restart classloader` 将会被抛弃,并重启创建一个,这比 `code starts`(冷启动)快很多。当然,肯定是比不上 `JRebel` 采用的 `Reload 技术`
更多细节请查阅: [Automatic Restart](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart)
WIP

@ -0,0 +1,6 @@
---
title: 准备工作
description: 插件开发的准备工作
---
WIP

@ -3,74 +3,4 @@ title: 准备工作
description: 主题开发的环境搭建
---
:::info
Halo 的模板引擎为 FreeMarker建议在开发 Halo 的主题之前,先阅读一遍 FreeMarker 的相关文档:<https://freemarker.apache.org>
:::
## 搭建开发环境
> 假设你已经在本地电脑配置好了 Java 开发环境。
Halo 的运行可参考上述 [系统开发](/developer-guide/core/prepare),或者直接下载打包好的程序启动,如下步骤:
1. 从 [GitHub release](https://github.com/halo-dev/halo/releases) 或者 [https://dl.halo.run](https://dl.halo.run) 下载最新的运行包。
2. 在终端中执行 `java -jar halo.jar --spring.profiles.active=dev`
启动完成之后,在电脑的用户目录即可看到 `halo-dev` 文件夹。
## 新建主题
1. 在 `~/halo-dev/templates/themes` 下新建一个文件夹,该文件夹就是你所新建的主题目录。
2. 使用你熟悉的编辑器打开你所新建的主题目录,这里我们推荐使用 [Visual Studio Code](https://code.visualstudio.com),并安装 [FreeMarker](https://marketplace.visualstudio.com/items?itemName=dcortes92.FreeMarker) 扩展。
:::info
我们同样为 Halo 主题开发了一个 `Visual Studio Code` Snippets 扩展,以简化一些操作,但目前处于 beta 状态,有需要的可以试试 [Halo theme develop Snippets](https://marketplace.visualstudio.com/items?itemName=halo-dev.halo-theme-dev-snippets-for-vs-code)。
:::
## 开发约定
- 主题目录下必须存在 `theme.yaml主题描述文件``settings.yaml主题配置文件`,相关格式在后面会详细讲解。
- 如果要开源到 GitHub 我们建议将仓库名设置为 `halo-theme-主题名`,并设置仓库的 `topic``halo``halo-theme`,这样可以方便使用者搜索。
- 所有模板文件的后缀为 `.ftl`
- 主题目录需要以 `screenshot.png` 命名的预览图片,以供后台展示。
## 开发样板
> 为了让开发者更快速的上手主题的开发,我们提供了一个简单的开发样板以供参考。
仓库地址:<https://github.com/halo-dev/halo-theme-quick-starter>
## 目录结构
> 为了让开发更加规范,我们推荐使用以下的目录结构。
```txt
├── module // 公共模板目录
│   ├── comment.ftl // 比如:评论模板
│   ├── layout.ftl // 比如:布局模板
├── source // 静态资源目录
│   ├── css // 样式目录
│   ├── images // 图片目录
│   ├── js // JS 脚本目录
│   └── plugins // 前端库目录
├── index.ftl // 首页
├── post.ftl // 文章页
├── post_xxx.ftl // 自定义文章模板post_diary.ftl。可在后台发布文章时选择。
├── sheet.ftl // 自定义页面
├── sheet_xxx.ftl // 自定义模板sheet_search.ftl、sheet_author.ftl。可在后台发布页面时选择。
├── archives.ftl // 归档页
├── categories.ftl // 分类目录页
├── category.ftl // 单个分类的所属文章页
├── tags.ftl // 标签页面
├── tag.ftl // 单个标签的所属文章页
├── search.ftl // 搜索结果页
├── links.ftl // 内置页面:友情链接
├── photos.ftl // 内置页面:图库
├── journals.ftl // 内置页面:日志
├── 404.ftl // 404 页
├── 500.ftl // 500 页
├── README.md // README一般用于主题介绍或说明
├── screenshot.png // 主题预览图
├── settings.yaml // 主题选项配置文件
└── theme.yaml // 主题描述文件
```
WIP

@ -1,6 +1,6 @@
---
title: 使用 Docker Compose 部署 Halo
description: 使用 Docker Compose 部署 Halo
title: 使用 Docker Compose 部署
description: 使用 Docker Compose 部署
---
:::info
@ -12,7 +12,7 @@ description: 使用 Docker Compose 部署 Halo
1. 在系统任意位置创建一个文件夹,此文档以 `~/halo-app` 为例。
```bash
mkdir ~/halo-app && cd ~/halo-app
mkdir ~/halo-next && cd ~/halo-next
```
:::info
@ -34,7 +34,7 @@ description: 使用 Docker Compose 部署 Halo
services:
halo:
image: halohub/halo:1.5.4
image: halohub/halo-dev:next
container_name: halo
restart: on-failure:3
volumes:
@ -54,21 +54,21 @@ description: 使用 Docker Compose 部署 Halo
```
:::info
您可以前往 <https://hub.docker.com/r/halohub/halo> 查看最新版本镜像,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的
您可以前往 <https://hub.docker.com/r/halohub/halo-dev> 查看最新版本镜像,需要注意的是,`halohub/halo-dev` 仅作为 Halo 2.0 测试期间的镜像,正式发布之后会有改动
:::
2. 创建 Halo + MySQL 的实例:
2. 创建 Halo + PostgreSQL 的实例:
```yaml {22-23,45}
version: "3"
services:
halo_server:
image: halohub/halo:1.5.4
image: halohub/halo-dev:next
container_name: halo_server
restart: on-failure:3
depends_on:
- halo_mysql
- halo_db
networks:
halo_network:
volumes:
@ -86,9 +86,9 @@ description: 使用 Docker Compose 部署 Halo
- HALO_ADMIN_PATH=admin
- HALO_CACHE=memory
halo_mysql:
halo_db:
image: mysql:8.0.27
container_name: halo_mysql
container_name: halo_db
restart: on-failure:3
networks:
halo_network:
@ -111,78 +111,6 @@ description: 使用 Docker Compose 部署 Halo
halo_network:
```
3. 创建 Halo + MySQL + Redis 的实例:
```yaml {22-23,29,49,62}
version: "3"
services:
halo_server:
image: halohub/halo:1.5.4
container_name: halo_server
restart: on-failure:3
depends_on:
- halo_mysql
- halo_redis
networks:
halo_network:
volumes:
- ./:/root/.halo
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090"
environment:
- SERVER_PORT=8090
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_DATASOURCE_URL=jdbc:mysql://halo_mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=o#DwN&JSa56
- HALO_ADMIN_PATH=admin
- HALO_CACHE=redis
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_DATABASE=0
- SPRING_REDIS_HOST=halo_redis
- SPRING_REDIS_PASSWORD=dm5fD%rvPtq
halo_mysql:
image: mysql:8.0.27
container_name: halo_mysql
restart: on-failure:3
networks:
halo_network:
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
volumes:
- /etc/localtime:/etc/localtime:ro
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_DATASOURCE_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halodb
halo_redis:
image: redis
container_name: halo_redis
restart: on-failure:3
networks:
halo_network:
volumes:
- ./redis/data:/data
- ./redis/logs:/logs
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_REDIS_PASSWORD 变量值
command: redis-server --requirepass dm5fD%rvPtq
ports:
- "6379:6379"
networks:
halo_network:
```
3. 启动 Halo 服务
```bash
@ -264,17 +192,9 @@ reverse_proxy 127.0.0.1:8090
> 需要注意的是,`halo-app.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
3. 清空 [leveldb 或 Redis](../../config.md#缓存) 缓存(如果有使用 leveldb 或 Redis 作为缓存策略)
```bash
rm -rf ~/halo-app/.leveldb
rm -rf ~/halo-app/redis
```
4. 更新 Halo 服务
5. 更新 Halo 服务
针对使用 `latest` 标签镜像的更新:
针对使用 `next` 标签镜像的更新:
```bash
docker-compose pull && docker-compose up -d

@ -1,5 +1,5 @@
---
title: 使用 Docker 部署 Halo
title: 使用 Docker 部署
description: 使用 Docker 部署
---
@ -9,58 +9,42 @@ description: 使用 Docker 部署
## 使用 Docker 镜像
Halo 在 Docker Hub 上发布的镜像为 [halohub/halo](https://hub.docker.com/r/halohub/halo)
可用的 Halo 2.0.0-alpha.1 的 Docker 镜像:
1. 创建 [工作目录](../prepare#工作目录)
- [halohub/halo-dev](https://hub.docker.com/r/halohub/halo-dev)
- [ghcr.io/halo-dev/halo-dev](https://github.com/halo-dev/halo/pkgs/container/halo-dev)
```bash
mkdir ~/.halo && cd ~/.halo
```
2. 下载示例配置文件到 [工作目录](../prepare#工作目录)
> 注意:以上两个镜像仅作为 Halo 2.0 测试期间的镜像,正式发布之后会更改为 `halohub/halo``ghcr.io/halo-dev/halo`
```bash
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
```
1. 创建容器
3. 编辑配置文件,配置数据库或者端口等,如需配置请参考 [配置参考](../config)
```bash
vim application.yaml
```
```bash
docker run \
-it -d \
--name halo-next \
-p 8090:8090 \
-v ~/halo-next:/root/halo-next \
-e HALO_EXTERNAL_URL=http://localhost:8090/ \ # 请修改外部访问链接
-e HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd \ # 请修改管理员密码
halohub/halo-dev:2.0.0-alpha.1
```
4. 拉取最新的 Halo 镜像
:::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose)
:::
```bash
docker pull halohub/halo:1.5.4
```
:::info
查看最新版本镜像:<https://hub.docker.com/r/halohub/halo> ,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的。
:::
- **-it** 开启输入功能并连接伪终端
- **-d** 后台运行容器
- **--name** 为容器指定一个名称
- **-p** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v** 工作目录映射。形式为:`-v 宿主机路径:/root/halo-next`,后者不能修改。
- **--restart** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。
5. 创建容器
1. 用浏览器访问 `$HALO_EXTERNAL_URL/console/`(外部访问链接)即可进入 Halo 管理端。
```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.5.4
```
:::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 MySQL请参考[使用 Docker 部署 Halo 和 MySQL](./other/docker-mysql)
:::
- **-it** 开启输入功能并连接伪终端
- **-d** 后台运行容器
- **--name** 为容器指定一个名称
- **-p** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v** 工作目录映射。形式为:-v 宿主机路径:/root/.halo后者不能修改。
- **--restart** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。
6. 打开 `http://ip:端口号` 即可看到安装引导界面。
:::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
:::
:::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
:::
## 反向代理

@ -16,7 +16,7 @@ description: 在 Linux 上快速安装 Halo
### CentOS
```bash
sudo yum install java-11-openjdk -y
sudo yum install java-17-openjdk -y
```
检查版本:
@ -28,15 +28,15 @@ java -version
如果输出以下类似内容即代表成功
```bash
openjdk version "11.0.10" 2021-01-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode, sharing)
openjdk version "17.0.4.1" 2022-08-12
OpenJDK Runtime Environment Homebrew (build 17.0.4.1+1)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.4.1+1, mixed mode, sharing)
```
### Ubuntu
```bash
sudo apt-get install openjdk-11-jre -y
sudo apt-get install openjdk-17-jre -y
```
检查版本:
@ -48,176 +48,176 @@ java -version
如果输出以下类似内容即代表成功
```bash
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode)
openjdk version "17.0.4.1" 2022-08-12
OpenJDK Runtime Environment Homebrew (build 17.0.4.1+1)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.4.1+1, mixed mode, sharing)
```
## 安装
1. 创建新的系统用户
:::info
我们不推荐直接使用系统 root 用户来运行 Halo。如果您需要直接使用 root 用户,请跳过这一步。
:::
:::info
我们不推荐直接使用系统 root 用户来运行 Halo。如果您需要直接使用 root 用户,请跳过这一步。
:::
创建一个名为 halo 的用户(名字可以随意)
创建一个名为 halo 的用户(名字可以随意)
```bash
useradd -m halo
```
```bash
useradd -m halo
```
给予 sudo 权限
给予 sudo 权限
```bash
usermod -aG wheel halo
```
```bash
usermod -aG wheel halo
```
为 halo 用户创建密码
为 halo 用户创建密码
```bash
passwd halo
```
```bash
passwd halo
```
登录到 halo 账户
登录到 halo 账户
```bash
su - halo
```
```bash
su - halo
```
2. 创建存放 [运行包](../prepare#运行包) 的目录,这里以 `~/app` 为例
```bash
mkdir ~/app && cd ~/app
```
```bash
mkdir ~/app && cd ~/app
```
3. 下载运行包
```bash
wget https://dl.halo.run/release/halo-1.5.4.jar -O halo.jar
```
```bash
wget https://dl.halo.run/prerelease/halo-2.0-alpha.1.jar -O halo.jar
```
:::info
如果下载速度不理想,可以 [在这里](../downloads) 选择其他下载地址。
:::
:::info
如果下载速度不理想,可以 [在这里](../downloads) 选择其他下载地址。
:::
4. 创建 [工作目录](../prepare#工作目录)
```bash
mkdir ~/.halo && cd ~/.halo
```
```bash
mkdir ~/halo-next && cd ~/halo-next
```
5. 下载示例配置文件到 [工作目录](../prepare#工作目录)
```bash
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
```
```bash
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
```
6. 编辑配置文件,配置数据库或者端口等,如需配置请参考 [配置参考](../config)
```bash
vim application.yaml
```
```bash
vim application.yaml
```
7. 测试运行 Halo
```bash
cd ~/app && java -jar halo.jar
```
```bash
cd ~/app && java -jar halo.jar
```
8. 如看到类似以下日志输出,则代表启动成功。
```bash
run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090
run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin
run.halo.app.listener.StartedListener : Halo has started successfully!
```
```bash
run.halo.app.listener.StartedListener : Halo started at http://127.0.0.1:8090
run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin
run.halo.app.listener.StartedListener : Halo has started successfully!
```
打开 `http://ip:端口号` 即可看到安装引导界面。
打开 `http://ip:端口号` 即可看到安装引导界面。
:::info
如测试启动正常,请继续看`作为服务运行`部分,第 8 步仅仅作为测试。当你关闭 ssh 连接之后,服务会停止。你可使用 <kbd>CTRL</kbd>+<kbd>C</kbd> 停止运行测试进程。
:::
:::info
如测试启动正常,请继续看`作为服务运行`部分,第 8 步仅仅作为测试。当你关闭 ssh 连接之后,服务会停止。你可使用 <kbd>CTRL</kbd>+<kbd>C</kbd> 停止运行测试进程。
:::
:::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip: 端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
:::
:::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip: 端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
:::
## 作为服务运行
1. 退出 halo 账户,登录到 root 账户
> 如果当前就是 root 账户,请略过此步骤。
> 如果当前就是 root 账户,请略过此步骤。
```bash
exit
```
```bash
exit
```
2. 下载 Halo 官方的 halo.service 模板
```bash
wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service
```
```bash
wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service
```
3. 修改 halo.service
```bash
vim /etc/systemd/system/halo.service
```
```bash
vim /etc/systemd/system/halo.service
```
4. 修改配置
- **YOUR_JAR_PATH**Halo 运行包的绝对路径,例如 `/home/halo/app/halo.jar`,注意:此路径不支持 `~` 符号。
- **USER**:运行 Halo 的系统用户,如果有按照上方教程创建新的用户来运行 Halo修改为你创建的用户名称即可。反之请删除 `User=USER`
- **YOUR_JAR_PATH**Halo 运行包的绝对路径,例如 `/home/halo/app/halo.jar`,注意:此路径不支持 `~` 符号。
- **USER**:运行 Halo 的系统用户,如果有按照上方教程创建新的用户来运行 Halo修改为你创建的用户名称即可。反之请删除 `User=USER`
```ini
[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target
```ini
[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=USER
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog
[Service]
Type=simple
User=USER
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog
StandError=inherit
StandError=inherit
[Install]
WantedBy=multi-user.target
```
[Install]
WantedBy=multi-user.target
```
:::tip
请确保 `/usr/bin/java` 是正确无误的。建议将 `ExecStart` 中的命令复制出来运行一下,保证命令有效。
:::
:::tip
请确保 `/usr/bin/java` 是正确无误的。建议将 `ExecStart` 中的命令复制出来运行一下,保证命令有效。
:::
5. 重新加载 systemd
```bash
systemctl daemon-reload
```
```bash
systemctl daemon-reload
```
6. 运行服务
```bash
systemctl start halo
```
```bash
systemctl start halo
```
7. 在系统启动时启动服务
```bash
systemctl enable halo
```
```bash
systemctl enable halo
```
您可以查看服务日志检查启动状态
您可以查看服务日志检查启动状态
```bash
journalctl -n 20 -u halo
```
```bash
journalctl -n 20 -u halo
```
## 反向代理

@ -3,6 +3,10 @@ title: 写在前面
description: 在开始前,您需要了解的事项
---
:::warning 提示
当前文档是 Halo 2.0 测试阶段的文档,强烈不建议尝试将 1.5 升级到 2.0 测试版,也不建议在生产环境使用,当前版本仅用于测试。我们欢迎大家在测试过程中反馈任何问题。另外,在 Halo 2.0 正式发布的时候,我们会提供完整的升级指南。
:::
## 环境要求
这里将讲述运行 Halo 所要求的一些软硬件的配置,我们建议您在运行或者部署之前先浏览一遍此页面。
@ -15,7 +19,7 @@ description: 在开始前,您需要了解的事项
#### CPU
无特别要求。目前我们的 [Docker 镜像](https://hub.docker.com/r/halohub/halo) 也已经支持多平台。
无特别要求。目前我们的 [Docker 镜像](https://hub.docker.com/r/halohub/halo-dev) 也已经支持多平台。
#### 内存
@ -38,25 +42,12 @@ Halo 理论上可以运行在任何支持 Java 的平台。
必须在运行环境安装好 JRE这是运行 Halo 所要求的的最低软件环境要求。如果您使用 Docker 运行 Halo可忽略此要求。
:::info
从 1.4.3 起,版本要求为 11 以上的版本。1.4.3 以下需要 1.8 以上的版本
当前版本2.0)需要 JRE 17 的版本,推荐使用 OpenJDK 17
:::
#### MySQL可选
这并不是 Halo 必须依赖的Halo 默认使用自带的 `H2 Database`,无需单独安装。如果 `H2 Database` 不能满足你的要求,您需要在系统内安装并运行好 MySQL。
具体要求:
1. 版本5.7 +
2. 字符集Character Set`utf8mb4`
3. 排序规则Collate`utf8mb4_bin`
4. 存储引擎:`InnoDB`
综上,建议创建数据库采用下面的命令:
#### PostgreSQL可选
```bash
create database halodb character set utf8mb4 collate utf8mb4_bin;
```
也可以使用系统自带的 H2 Database 数据库,无需安装。但不推荐在生产环境中使用 H2 Database。
#### Web 服务器(可选)
@ -89,11 +80,11 @@ create database halodb character set utf8mb4 collate utf8mb4_bin;
### 工作目录
指 Halo 所依赖的工作目录,在 Halo 运行的时候会在系统当前用户目录下产生一个 `.halo` 的文件夹,绝对路径为 `~/.halo`。由于这个工作目录是固定的,所以上面所说的 `运行包`不限制所存放的位置,里面通常包含下列目录或文件:
指 Halo 所依赖的工作目录,在 Halo 运行的时候会在系统当前用户目录下产生一个 `.halo-next` 的文件夹,绝对路径为 `~/.halo-next`。由于这个工作目录是固定的,所以上面所说的 `运行包`不限制所存放的位置,里面通常包含下列目录或文件:
1. `db`:存放 H2 Database 的物理文件,如果您使用 MySQL 数据库,那么不会存在这个目录。
2. `templates/themes`:里面包含用户所下载的主题。
3. `static`:相当于网站的根目录。
1. `db`:存放 H2 Database 的物理文件,如果你使用其他数据库,那么不会存在这个目录。
2. `themes`:里面包含用户所安装的主题。
2. `plugins`:里面包含用户所安装的插件。
5. `attachments`:附件目录。
4. `logs`:运行日志目录。
5. `upload`:附件目录。
6. `application.yaml`:配置文件。

@ -13,53 +13,53 @@ description: 版本升级指南
1. 停止正在运行的服务
```bash
service halo stop
```
```bash
service halo stop
```
2. 备份数据以及旧的运行包(**重要**
```bash
cp -r ~/.halo ~/.halo.archive
```
```bash
cp -r ~/.halo ~/.halo.archive
```
```bash
mv ~/app/halo.jar ~/app/halo.jar.archive
```
```bash
mv ~/app/halo.jar ~/app/halo.jar.archive
```
> 需要注意的是,`.halo.archive` 和 `halo.jar.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
> 需要注意的是,`.halo.archive` 和 `halo.jar.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
3. 清空 [leveldb](./config.md#缓存) 缓存(如果有使用 leveldb 作为缓存策略)
```bash
rm -rf ~/.halo/.leveldb
```
```bash
rm -rf ~/.halo/.leveldb
```
4. 下载最新版本的运行包
```bash
cd ~/app && wget https://dl.halo.run/release/halo-1.5.4.jar -O halo.jar
```
```bash
cd ~/app && wget https://dl.halo.run/release/halo-1.5.4.jar -O halo.jar
```
:::info
如果下载速度不理想,可以[在这里](/getting-started/downloads)选择其他下载地址。
:::
:::info
如果下载速度不理想,可以[在这里](/getting-started/downloads)选择其他下载地址。
:::
5. 启动测试
```bash
java -jar halo.jar
```
```bash
java -jar halo.jar
```
:::info
如测试启动正常,请继续下一步。使用 <kbd>CTRL</kbd>+<kbd>C</kbd> 停止运行测试进程。
:::
:::info
如测试启动正常,请继续下一步。使用 <kbd>CTRL</kbd>+<kbd>C</kbd> 停止运行测试进程。
:::
6. 重启服务
```bash
service halo start
```
```bash
service halo start
```
## Docker
@ -69,51 +69,51 @@ service halo start
1. 停止并删除当前运行中的容器
```bash
docker stop halo
```
```bash
docker stop halo
```
```bash
docker rm -f halo
```
```bash
docker rm -f halo
```
:::info
你的容器名称不一定为 `halo`,在执行前可以先执行 `docker ps -a` 查看一下。
:::
:::info
你的容器名称不一定为 `halo`,在执行前可以先执行 `docker ps -a` 查看一下。
:::
2. 备份数据(重要)
```bash
cp -r ~/.halo ~/.halo.archive
```
```bash
cp -r ~/.halo ~/.halo.archive
```
> 需要注意的是,`.halo.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
> 需要注意的是,`.halo.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
3. 清空 [leveldb](./config.md#缓存) 缓存(如果有使用 leveldb 作为缓存策略)
```bash
rm -rf ~/.halo/.leveldb
```
```bash
rm -rf ~/.halo/.leveldb
```
4. 拉取最新的 Halo 镜像
```bash
docker pull halohub/halo:1.5.4
```
```bash
docker pull halohub/halo:1.5.4
```
:::info
查看最新版本镜像:<https://hub.docker.com/r/halohub/halo> ,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的。
:::
:::info
查看最新版本镜像:<https://hub.docker.com/r/halohub/halo> ,我们推荐使用具体版本号的镜像,但也提供了 `latest` 标签的镜像,它始终是最新的。
:::
5. 创建容器
```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.5.4
```
```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.5.4
```
- **-it** 开启输入功能并连接伪终端
- **-d** 后台运行容器
- **--name** 为容器指定一个名称
- **-p** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v** 工作目录映射。形式为:-v 宿主机路径:/root/.halo后者不能修改。
- **--restart** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。
- **-it** 开启输入功能并连接伪终端
- **-d** 后台运行容器
- **--name** 为容器指定一个名称
- **-p** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v** 工作目录映射。形式为:-v 宿主机路径:/root/.halo后者不能修改。
- **--restart** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。

@ -34,6 +34,13 @@ const config = {
showLastUpdateAuthor: true,
remarkPlugins: [math, mermaid],
rehypePlugins: [katex],
lastVersion: "1.5.4",
versions: {
current: {
label: "2.0.0-SNAPSHOT",
path: "2.0.0-SNAPSHOT",
},
},
},
blog: false,
theme: {

@ -25,6 +25,18 @@
"message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。",
"description": "The 2nd paragraph of the 404 page"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "回到顶部",
"description": "The ARIA label for the back to top button"
},
"theme.blog.archive.title": {
"message": "历史博文",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "历史博文",
"description": "The page & hero description of the blog archive page"
},
"theme.admonition.note": {
"message": "备注",
"description": "The default label used for the Note admonition (:::note)"
@ -45,18 +57,6 @@
"message": "警告",
"description": "The default label used for the Caution admonition (:::caution)"
},
"theme.blog.archive.title": {
"message": "历史博文",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "历史博文",
"description": "The page & hero description of the blog archive page"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "回到顶部",
"description": "The ARIA label for the back to top button"
},
"theme.blog.paginator.navAriaLabel": {
"message": "博文列表分页导航",
"description": "The ARIA label for the blog pagination"
@ -224,10 +224,6 @@
"message": "本页总览",
"description": "The label used by the button on the collapsible TOC component"
},
"theme.blog.post.readingTime.plurals": {
"message": "阅读需 {readingTime} 分钟",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.post.readMore": {
"message": "阅读更多",
"description": "The label used in blog post item excerpts to link to full blog posts"
@ -236,6 +232,10 @@
"message": "阅读 {title} 的全文",
"description": "The ARIA label for the link to full blog posts from excerpts"
},
"theme.blog.post.readingTime.plurals": {
"message": "阅读需 {readingTime} 分钟",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "收起侧边栏",
"description": "The title attribute for collapse button of doc sidebar"
@ -256,6 +256,41 @@
"message": "展开侧边栏",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "找到 {count} 份文件",
"description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.SearchPage.existingResultsTitle": {
"message": "「{query}」的搜索结果",
"description": "The search page title for non-empty query"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "在文档中搜索",
"description": "The search page title for empty query"
},
"theme.SearchPage.inputPlaceholder": {
"message": "在此输入搜索字词",
"description": "The placeholder for search page input"
},
"theme.SearchPage.inputLabel": {
"message": "搜索",
"description": "The ARIA label for search page input"
},
"theme.SearchPage.algoliaLabel": {
"message": "通过 Algolia 搜索",
"description": "The ARIA label for Algolia mention"
},
"theme.SearchPage.noResultsText": {
"message": "未找到任何结果",
"description": "The paragraph for empty search result"
},
"theme.SearchPage.fetchingNewResults": {
"message": "正在获取新的搜索结果...",
"description": "The paragraph for fetching new search results"
},
"theme.SearchBar.seeAll": {
"message": "查看全部 {count} 个结果"
},
"theme.SearchBar.label": {
"message": "搜索",
"description": "The ARIA label and placeholder for search button"
@ -352,41 +387,6 @@
"message": "搜索文档",
"description": "The placeholder of the input of the DocSearch pop-up modal"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "找到 {count} 份文件",
"description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.SearchPage.existingResultsTitle": {
"message": "「{query}」的搜索结果",
"description": "The search page title for non-empty query"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "在文档中搜索",
"description": "The search page title for empty query"
},
"theme.SearchPage.inputPlaceholder": {
"message": "在此输入搜索字词",
"description": "The placeholder for search page input"
},
"theme.SearchPage.inputLabel": {
"message": "搜索",
"description": "The ARIA label for search page input"
},
"theme.SearchPage.algoliaLabel": {
"message": "通过 Algolia 搜索",
"description": "The ARIA label for Algolia mention"
},
"theme.SearchPage.noResultsText": {
"message": "未找到任何结果",
"description": "The paragraph for empty search result"
},
"theme.SearchPage.fetchingNewResults": {
"message": "正在获取新的搜索结果...",
"description": "The paragraph for fetching new search results"
},
"theme.SearchBar.seeAll": {
"message": "查看全部 {count} 个结果"
},
"theme.tags.tagsPageTitle": {
"message": "标签",
"description": "The title of the tag list page"

@ -1,6 +1,6 @@
{
"version.label": {
"message": "Next",
"message": "2.0.0-SNAPSHOT",
"description": "The label for version current"
},
"sidebar.tutorialSidebar.category.入门": {
@ -11,14 +11,6 @@
"message": "安装指南",
"description": "The label for category 安装指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其他指南": {
"message": "其他指南",
"description": "The label for category 其他指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者指南": {
"message": "开发者指南",
"description": "The label for category 开发者指南 in sidebar tutorialSidebar"
@ -27,6 +19,10 @@
"message": "系统开发",
"description": "The label for category 系统开发 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.插件开发": {
"message": "插件开发",
"description": "The label for category 插件开发 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.主题开发": {
"message": "主题开发",
"description": "The label for category 主题开发 in sidebar tutorialSidebar"
@ -34,9 +30,5 @@
"sidebar.tutorialSidebar.category.参与贡献": {
"message": "参与贡献",
"description": "The label for category 参与贡献 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.link.REST API": {
"message": "REST API",
"description": "The label for link REST API in sidebar tutorialSidebar, linking to https://api.halo.run"
}
}

@ -26,36 +26,25 @@ module.exports = {
type: "category",
label: "安装指南",
items: [
"getting-started/install/linux",
// "getting-started/install/linux",
"getting-started/install/docker",
{
type: "category",
label: "其他指南",
items: [
"getting-started/install/other/bt-panel",
"getting-started/install/other/oneinstack",
"getting-started/install/other/tencent-cloudbase",
"getting-started/install/other/docker-mysql",
"getting-started/install/other/docker-compose"
],
},
"getting-started/install/third-party",
// "getting-started/install/docker-compose",
],
},
"getting-started/config",
"getting-started/upgrade",
"getting-started/downloads",
],
},
{
type: "category",
label: "用户指南",
items: [
"user-guide/backup-migration",
"user-guide/markdown",
"user-guide/faq",
// "getting-started/config",
// "getting-started/upgrade",
// "getting-started/downloads",
],
},
// {
// type: "category",
// label: "用户指南",
// items: [
// "user-guide/backup-migration",
// "user-guide/markdown",
// "user-guide/faq",
// ],
// },
{
type: "category",
label: "开发者指南",
@ -64,28 +53,33 @@ module.exports = {
type: "category",
label: "系统开发",
items: [
"developer-guide/core/structure",
// "developer-guide/core/structure",
"developer-guide/core/prepare",
"developer-guide/core/code-style",
// "developer-guide/core/code-style",
],
},
{
type: "category",
label: "插件开发",
items: ["developer-guide/plugin/prepare"],
},
{
type: "category",
label: "主题开发",
items: [
"developer-guide/theme/prepare",
"developer-guide/theme/config-files",
"developer-guide/theme/global-variable",
"developer-guide/theme/public-template-tag",
"developer-guide/theme/page-variable",
"developer-guide/theme/template-tag",
// "developer-guide/theme/config-files",
// "developer-guide/theme/global-variable",
// "developer-guide/theme/public-template-tag",
// "developer-guide/theme/page-variable",
// "developer-guide/theme/template-tag",
],
},
{
type: "link",
label: "REST API",
href: "https://api.halo.run",
},
// {
// type: "link",
// label: "REST API",
// href: "https://api.halo.run",
// },
],
},
{

Loading…
Cancel
Save