mirror of
https://github.com/halo-dev/docs.git
synced 2025-10-20 01:17:19 +00:00
docs: documentation for Halo 2.0 (#92)
提供 Halo 2.0 的文档。 TODO list: - [x] Halo 2.0 的配置文档 - [ ] ~~插件/主题开发的简要文档~~ ```release-note 提供 Halo 2.0 的文档 ```
This commit is contained in:
@@ -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)
|
|
||||||
|
6
docs/developer-guide/plugin/prepare.md
Normal file
6
docs/developer-guide/plugin/prepare.md
Normal file
@@ -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,9 +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
|
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:
|
||||||
@@ -111,78 +111,6 @@ description: 使用 Docker Compose 部署 Halo
|
|||||||
halo_network:
|
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 服务
|
3. 启动 Halo 服务
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -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
|
针对使用 `next` 标签镜像的更新:
|
||||||
rm -rf ~/halo-app/.leveldb
|
|
||||||
|
|
||||||
rm -rf ~/halo-app/redis
|
|
||||||
```
|
|
||||||
|
|
||||||
4. 更新 Halo 服务
|
|
||||||
|
|
||||||
针对使用 `latest` 标签镜像的更新:
|
|
||||||
|
|
||||||
```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#工作目录)
|
1. 创建容器
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
|
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
|
||||||
|
```
|
||||||
|
|
||||||
3. 编辑配置文件,配置数据库或者端口等,如需配置请参考 [配置参考](../config)
|
:::info
|
||||||
|
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL,请参考:[使用 Docker Compose 部署](./docker-compose)
|
||||||
|
:::
|
||||||
|
|
||||||
```bash
|
- **-it:** 开启输入功能并连接伪终端
|
||||||
vim application.yaml
|
- **-d:** 后台运行容器
|
||||||
```
|
- **--name:** 为容器指定一个名称
|
||||||
|
- **-p:** 端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
|
||||||
|
- **-v:** 工作目录映射。形式为:`-v 宿主机路径:/root/halo-next`,后者不能修改。
|
||||||
|
- **--restart:** 建议设置为 `unless-stopped`,在 Docker 启动的时候自动启动 Halo 容器。
|
||||||
|
|
||||||
4. 拉取最新的 Halo 镜像
|
1. 用浏览器访问 `$HALO_EXTERNAL_URL/console/`(外部访问链接)即可进入 Halo 管理端。
|
||||||
|
|
||||||
```bash
|
:::tip
|
||||||
docker pull halohub/halo:1.5.4
|
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
|
||||||
```
|
:::
|
||||||
|
|
||||||
:::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
|
|
||||||
```
|
|
||||||
|
|
||||||
:::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。
|
也可以使用系统自带的 H2 Database 数据库,无需安装。但不推荐在生产环境中使用 H2 Database。
|
||||||
|
|
||||||
具体要求:
|
|
||||||
|
|
||||||
1. 版本:5.7 +
|
|
||||||
2. 字符集(Character Set):`utf8mb4`
|
|
||||||
3. 排序规则(Collate):`utf8mb4_bin`
|
|
||||||
4. 存储引擎:`InnoDB`
|
|
||||||
|
|
||||||
综上,建议创建数据库采用下面的命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
68
sidebars.js
68
sidebars.js
@@ -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",
|
||||||
},
|
// },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user