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: 开发环境的一些说明 description: 开发环境的一些说明
--- ---
## 所需要的环境 WIP
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)

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

@ -3,74 +3,4 @@ title: 准备工作
description: 主题开发的环境搭建 description: 主题开发的环境搭建
--- ---
:::info WIP
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 // 主题描述文件
```

@ -1,6 +1,6 @@
--- ---
title: 使用 Docker Compose 部署 Halo title: 使用 Docker Compose 部署
description: 使用 Docker Compose 部署 Halo description: 使用 Docker Compose 部署
--- ---
:::info :::info
@ -12,7 +12,7 @@ description: 使用 Docker Compose 部署 Halo
1. 在系统任意位置创建一个文件夹,此文档以 `~/halo-app` 为例。 1. 在系统任意位置创建一个文件夹,此文档以 `~/halo-app` 为例。
```bash ```bash
mkdir ~/halo-app && cd ~/halo-app mkdir ~/halo-next && cd ~/halo-next
``` ```
:::info :::info
@ -34,7 +34,7 @@ description: 使用 Docker Compose 部署 Halo
services: services:
halo: halo:
image: halohub/halo:1.5.4 image: halohub/halo-dev:next
container_name: halo container_name: halo
restart: on-failure:3 restart: on-failure:3
volumes: volumes:
@ -54,21 +54,21 @@ description: 使用 Docker Compose 部署 Halo
``` ```
:::info :::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} ```yaml {22-23,45}
version: "3" version: "3"
services: services:
halo_server: halo_server:
image: halohub/halo:1.5.4 image: halohub/halo-dev:next
container_name: halo_server container_name: halo_server
restart: on-failure:3 restart: on-failure:3
depends_on: depends_on:
- halo_mysql - halo_db
networks: networks:
halo_network: halo_network:
volumes: volumes:
@ -86,68 +86,9 @@ description: 使用 Docker Compose 部署 Halo
- HALO_ADMIN_PATH=admin - HALO_ADMIN_PATH=admin
- HALO_CACHE=memory - HALO_CACHE=memory
halo_mysql: halo_db:
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
networks:
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 image: mysql:8.0.27
container_name: halo_mysql container_name: halo_db
restart: on-failure:3 restart: on-failure:3
networks: networks:
halo_network: halo_network:
@ -166,19 +107,6 @@ description: 使用 Docker Compose 部署 Halo
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56 - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halodb - 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: networks:
halo_network: halo_network:
``` ```
@ -264,17 +192,9 @@ reverse_proxy 127.0.0.1:8090
> 需要注意的是,`halo-app.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。 > 需要注意的是,`halo-app.archive` 文件名不一定要根据此文档命名,这里仅仅是个示例。
3. 清空 [leveldb 或 Redis](../../config.md#缓存) 缓存(如果有使用 leveldb 或 Redis 作为缓存策略) 5. 更新 Halo 服务
```bash
rm -rf ~/halo-app/.leveldb
rm -rf ~/halo-app/redis
```
4. 更新 Halo 服务
针对使用 `latest` 标签镜像的更新: 针对使用 `next` 标签镜像的更新:
```bash ```bash
docker-compose pull && docker-compose up -d docker-compose pull && docker-compose up -d

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

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

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

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

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

@ -25,6 +25,18 @@
"message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。",
"description": "The 2nd paragraph of the 404 page" "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": { "theme.admonition.note": {
"message": "备注", "message": "备注",
"description": "The default label used for the Note admonition (:::note)" "description": "The default label used for the Note admonition (:::note)"
@ -45,18 +57,6 @@
"message": "警告", "message": "警告",
"description": "The default label used for the Caution admonition (:::caution)" "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": { "theme.blog.paginator.navAriaLabel": {
"message": "博文列表分页导航", "message": "博文列表分页导航",
"description": "The ARIA label for the blog pagination" "description": "The ARIA label for the blog pagination"
@ -224,10 +224,6 @@
"message": "本页总览", "message": "本页总览",
"description": "The label used by the button on the collapsible TOC component" "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": { "theme.blog.post.readMore": {
"message": "阅读更多", "message": "阅读更多",
"description": "The label used in blog post item excerpts to link to full blog posts" "description": "The label used in blog post item excerpts to link to full blog posts"
@ -236,6 +232,10 @@
"message": "阅读 {title} 的全文", "message": "阅读 {title} 的全文",
"description": "The ARIA label for the link to full blog posts from excerpts" "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": { "theme.docs.sidebar.collapseButtonTitle": {
"message": "收起侧边栏", "message": "收起侧边栏",
"description": "The title attribute for collapse button of doc sidebar" "description": "The title attribute for collapse button of doc sidebar"
@ -256,6 +256,41 @@
"message": "展开侧边栏", "message": "展开侧边栏",
"description": "The ARIA label and title attribute for expand button of doc sidebar" "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": { "theme.SearchBar.label": {
"message": "搜索", "message": "搜索",
"description": "The ARIA label and placeholder for search button" "description": "The ARIA label and placeholder for search button"
@ -352,41 +387,6 @@
"message": "搜索文档", "message": "搜索文档",
"description": "The placeholder of the input of the DocSearch pop-up modal" "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": { "theme.tags.tagsPageTitle": {
"message": "标签", "message": "标签",
"description": "The title of the tag list page" "description": "The title of the tag list page"

@ -1,6 +1,6 @@
{ {
"version.label": { "version.label": {
"message": "Next", "message": "2.0.0-SNAPSHOT",
"description": "The label for version current" "description": "The label for version current"
}, },
"sidebar.tutorialSidebar.category.入门": { "sidebar.tutorialSidebar.category.入门": {
@ -11,14 +11,6 @@
"message": "安装指南", "message": "安装指南",
"description": "The label for category 安装指南 in sidebar tutorialSidebar" "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.开发者指南": { "sidebar.tutorialSidebar.category.开发者指南": {
"message": "开发者指南", "message": "开发者指南",
"description": "The label for category 开发者指南 in sidebar tutorialSidebar" "description": "The label for category 开发者指南 in sidebar tutorialSidebar"
@ -27,6 +19,10 @@
"message": "系统开发", "message": "系统开发",
"description": "The label for category 系统开发 in sidebar tutorialSidebar" "description": "The label for category 系统开发 in sidebar tutorialSidebar"
}, },
"sidebar.tutorialSidebar.category.插件开发": {
"message": "插件开发",
"description": "The label for category 插件开发 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.主题开发": { "sidebar.tutorialSidebar.category.主题开发": {
"message": "主题开发", "message": "主题开发",
"description": "The label for category 主题开发 in sidebar tutorialSidebar" "description": "The label for category 主题开发 in sidebar tutorialSidebar"
@ -34,9 +30,5 @@
"sidebar.tutorialSidebar.category.参与贡献": { "sidebar.tutorialSidebar.category.参与贡献": {
"message": "参与贡献", "message": "参与贡献",
"description": "The label for category 参与贡献 in sidebar tutorialSidebar" "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", type: "category",
label: "安装指南", label: "安装指南",
items: [ items: [
"getting-started/install/linux", // "getting-started/install/linux",
"getting-started/install/docker", "getting-started/install/docker",
{ // "getting-started/install/docker-compose",
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/config", // "getting-started/config",
"getting-started/upgrade", // "getting-started/upgrade",
"getting-started/downloads", // "getting-started/downloads",
],
},
{
type: "category",
label: "用户指南",
items: [
"user-guide/backup-migration",
"user-guide/markdown",
"user-guide/faq",
], ],
}, },
// {
// type: "category",
// label: "用户指南",
// items: [
// "user-guide/backup-migration",
// "user-guide/markdown",
// "user-guide/faq",
// ],
// },
{ {
type: "category", type: "category",
label: "开发者指南", label: "开发者指南",
@ -64,28 +53,33 @@ module.exports = {
type: "category", type: "category",
label: "系统开发", label: "系统开发",
items: [ items: [
"developer-guide/core/structure", // "developer-guide/core/structure",
"developer-guide/core/prepare", "developer-guide/core/prepare",
"developer-guide/core/code-style", // "developer-guide/core/code-style",
], ],
}, },
{
type: "category",
label: "插件开发",
items: ["developer-guide/plugin/prepare"],
},
{ {
type: "category", type: "category",
label: "主题开发", label: "主题开发",
items: [ items: [
"developer-guide/theme/prepare", "developer-guide/theme/prepare",
"developer-guide/theme/config-files", // "developer-guide/theme/config-files",
"developer-guide/theme/global-variable", // "developer-guide/theme/global-variable",
"developer-guide/theme/public-template-tag", // "developer-guide/theme/public-template-tag",
"developer-guide/theme/page-variable", // "developer-guide/theme/page-variable",
"developer-guide/theme/template-tag", // "developer-guide/theme/template-tag",
], ],
}, },
{ // {
type: "link", // type: "link",
label: "REST API", // label: "REST API",
href: "https://api.halo.run", // href: "https://api.halo.run",
}, // },
], ],
}, },
{ {

Loading…
Cancel
Save