chore: bump docusaurus version to 3.x (#395)

升级 Docusaurus 版本至 3.x

参照 https://docusaurus.io/zh-CN/docs/migration/v3 升级指南。

Fixes #394 

/kind improvement

```release-note
None
```
main
Ryan Wang 4 months ago committed by GitHub
parent 4a53db88f4
commit 250c0180d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -9,7 +9,7 @@ description: 问题反馈渠道及指南
## GitHub Issues ## GitHub Issues
链接:<https://github.com/halo-dev/halo/issues> 链接:[https://github.com/halo-dev/halo/issues](https://github.com/halo-dev/halo/issues)
如果你在使用过程中,遇到了一些 bug 或者需要添加某些新特性,请尽量在 GitHub Issues 进行反馈,这非常有助于我们跟踪解决此问题,您也可以很方便的接收到处理状态。 如果你在使用过程中,遇到了一些 bug 或者需要添加某些新特性,请尽量在 GitHub Issues 进行反馈,这非常有助于我们跟踪解决此问题,您也可以很方便的接收到处理状态。
@ -23,6 +23,6 @@ description: 问题反馈渠道及指南
## Halo 官方社区 ## Halo 官方社区
链接:<https://bbs.halo.run> 链接:[https://bbs.halo.run](https://bbs.halo.run)
此平台主要目的用于与其他 Halo 用户进行交流。但如果您对 GitHub 不是很熟悉或者没有账号,您也可以在此平台进行反馈。 此平台主要目的用于与其他 Halo 用户进行交流。但如果您对 GitHub 不是很熟悉或者没有账号,您也可以在此平台进行反馈。

@ -15,12 +15,12 @@ description: 如果 Halo 对你有帮助,不妨赞助我们
### 资金赞助 ### 资金赞助
- 爱发电:<https://afdian.com/a/halo-dev> - 爱发电:[https://afdian.com/a/halo-dev](https://afdian.com/a/halo-dev)
### 通过我们的推广链接购买服务器 ### 通过我们的推广链接购买服务器
如果你当前还没有购买服务器,可以考虑通过以下链接购买,这会为我们带来一部分收益。 如果你当前还没有购买服务器,可以考虑通过以下链接购买,这会为我们带来一部分收益。
- 阿里云:<https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo> - 阿里云:[https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo](https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo)
- 阿里云新人专享:<https://www.aliyun.com/minisite/goods?userCode=j57gyupo> - 阿里云新人专享:[https://www.aliyun.com/minisite/goods?userCode=j57gyupo](https://www.aliyun.com/minisite/goods?userCode=j57gyupo)
- 腾讯云:<https://curl.qcloud.com/9Ogon25Y> - 腾讯云:[https://curl.qcloud.com/9Ogon25Y](https://curl.qcloud.com/9Ogon25Y)

@ -117,6 +117,6 @@ halo:
``` ```
6. 最终提供以下访问地址: 6. 最终提供以下访问地址:
1. 网站首页:<http://localhost:8090> 1. 网站首页:[http://localhost:8090](http://localhost:8090)
2. Console 控制台:<http://localhost:8090/console> 2. Console 控制台:[http://localhost:8090/console](http://localhost:8090/console)
3. UC 个人中心:<http://localhost:8090/uc> 3. UC 个人中心:[http://localhost:8090/uc](http://localhost:8090/uc)

@ -8,8 +8,8 @@ title: 表单定义
FormKit 相关文档: FormKit 相关文档:
- Form Schema: <https://formkit.com/essentials/schema> - Form Schema: [https://formkit.com/essentials/schema](https://formkit.com/essentials/schema)
- FormKit Inputs: <https://formkit.com/inputs> - FormKit Inputs: [https://formkit.com/inputs](https://formkit.com/inputs)
:::tip :::tip
目前不支持 FormKit Pro 中的输入组件,但 Halo 额外提供了部分输入组件,将在下面文档列出。 目前不支持 FormKit Pro 中的输入组件,但 Halo 额外提供了部分输入组件,将在下面文档列出。

@ -52,4 +52,4 @@ function handleSubmit () {
|---------|------------------------------------|---------|-----------------------------------------| |---------|------------------------------------|---------|-----------------------------------------|
| `group` | string | 无,必填 | 定义组件所属的分组。 | | `group` | string | 无,必填 | 定义组件所属的分组。 |
| `kind` | string | 无,必填 | 定义组件的种类。 | | `kind` | string | 无,必填 | 定义组件的种类。 |
| `value` | { [key: string]: string; } \| null | null | 可选,包含键值对的对象或空值,用于存储数据。 | | `value` | \{ [key: string]: string; \} \| null \| null | 可选,包含键值对的对象或空值,用于存储数据。 |

@ -37,7 +37,7 @@ const items = [
| 属性名 | 类型 | 默认值 | 描述 | | 属性名 | 类型 | 默认值 | 描述 |
|--------------|-----------------------------------------------------------|-----------|--------------------------------------------------| |--------------|-----------------------------------------------------------|-----------|--------------------------------------------------|
| `items` | { label: string; value?: string \| boolean \| number; }[] | 无,必填 | 包含 `label` 和可选 `value` 的对象数组。 | | `items` | \{ label: string; value?: string \| boolean \| number; \}[] | 无,必填 | 包含 `label` 和可选 `value` 的对象数组。 |
| `label` | string | 无,必填 | 组件的标签文本。 | | `label` | string | 无,必填 | 组件的标签文本。 |
| `modelValue` | string \| boolean \| number | undefined | 可选,用于绑定到组件的值,可以是字符串、布尔值或数字。 | | `modelValue` | string \| boolean \| number | undefined | 可选,用于绑定到组件的值,可以是字符串、布尔值或数字。 |

@ -27,7 +27,7 @@ import { VButton } from "@halo-dev/components";
</template> </template>
``` ```
所有可用的基础组件以及文档可查阅:<https://halo-ui-components.pages.dev> 所有可用的基础组件以及文档可查阅:[https://halo-ui-components.pages.dev](https://halo-ui-components.pages.dev)
## 业务组件和指令 ## 业务组件和指令

@ -27,7 +27,7 @@ const groupName = ref('my-test-group')
| 属性名 | 类型 | 默认值 | 描述 | | 属性名 | 类型 | 默认值 | 描述 |
|---------------------|----------------------------------------------------------------|-----------|------------------------------| |---------------------|----------------------------------------------------------------|-----------|------------------------------|
| `restrictions` | Restrictions | undefined | 可选,指定任何限制。 | | `restrictions` | Restrictions | undefined | 可选,指定任何限制。 |
| `meta` | Record<string, unknown> | undefined | 可选,要发送的额外元数据。 | | `meta` | Record\<string, unknown\> | undefined | 可选,要发送的额外元数据。 |
| `autoProceed` | boolean | false | 可选,在某些操作后自动继续。 | | `autoProceed` | boolean | false | 可选,在某些操作后自动继续。 |
| `allowedMetaFields` | string[] | undefined | 可选,指定允许的元数据字段。 | | `allowedMetaFields` | string[] | undefined | 可选,指定允许的元数据字段。 |
| `endpoint` | string | 无,必填 | 数据发送到的端点URL。 | | `endpoint` | string | 无,必填 | 数据发送到的端点URL。 |

@ -85,7 +85,7 @@ export default definePlugin({
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-s3> - [https://github.com/halo-dev/plugin-s3](https://github.com/halo-dev/plugin-s3)
## 类型定义 ## 类型定义

@ -143,4 +143,4 @@ const handleSelect = async (url: string) => {
## 实现案例 ## 实现案例
- <https://github.com/halo-sigs/plugin-unsplash> - [https://github.com/halo-sigs/plugin-unsplash](https://github.com/halo-sigs/plugin-unsplash)

@ -111,4 +111,4 @@ const stripHtmlTags = (str: string) => {
## 实现案例 ## 实现案例
- <https://github.com/halo-sigs/plugin-moments> - [https://github.com/halo-sigs/plugin-moments](https://github.com/halo-sigs/plugin-moments)

@ -18,7 +18,7 @@ export default definePlugin({
``` ```
:::info 提示 :::info 提示
AnyExtension 类型来自 [Tiptap](https://github.com/ueberdosis/tiptap),这意味着 Halo 默认编辑器的扩展点返回类型与 Tiptap 的扩展完全一致Tiptap 的扩展文档可参考:<https://tiptap.dev/docs/editor/api/extensions>。此外Halo 也为默认编辑器的扩展提供了一些独有的参数,用于实现工具栏、指令等扩展。 AnyExtension 类型来自 [Tiptap](https://github.com/ueberdosis/tiptap),这意味着 Halo 默认编辑器的扩展点返回类型与 Tiptap 的扩展完全一致Tiptap 的扩展文档可参考:[https://tiptap.dev/docs/editor/api/extensions](https://tiptap.dev/docs/editor/api/extensions)。此外Halo 也为默认编辑器的扩展提供了一些独有的参数,用于实现工具栏、指令等扩展。
::: :::
### Halo 独有扩展 ### Halo 独有扩展
@ -60,7 +60,7 @@ export interface ExtensionOptions {
![顶部工具栏扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-toolbar.png) ![顶部工具栏扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-toolbar.png)
<https://github.com/halo-sigs/richtext-editor/pull/16> 中,我们实现了对顶部工具栏的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getToolbarItems` 函数即可,如: [https://github.com/halo-sigs/richtext-editor/pull/16](https://github.com/halo-sigs/richtext-editor/pull/16) 中,我们实现了对顶部工具栏的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getToolbarItems` 函数即可,如:
```ts ```ts
{ {
@ -130,7 +130,7 @@ addOptions() {
![工具箱扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-toolbox.png) ![工具箱扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-toolbox.png)
<https://github.com/halo-sigs/richtext-editor/pull/27> 中,我们实现了对编辑器工具箱区域的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getToolboxItems` 函数即可,如: [https://github.com/halo-sigs/richtext-editor/pull/27](https://github.com/halo-sigs/richtext-editor/pull/27) 中,我们实现了对编辑器工具箱区域的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getToolboxItems` 函数即可,如:
```ts ```ts
{ {
@ -201,7 +201,7 @@ Slash Command (斜杠命令)的扩展,可用于在当前行快捷执行功
![Slash Command 扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-slash-command.png) ![Slash Command 扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-slash-command.png)
<https://github.com/halo-sigs/richtext-editor/pull/16> 中,我们实现了对 Slash Command 指令的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getCommandMenuItems` 函数即可,如: [https://github.com/halo-sigs/richtext-editor/pull/16](https://github.com/halo-sigs/richtext-editor/pull/16) 中,我们实现了对 Slash Command 指令的扩展,如果需要添加额外的功能,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getCommandMenuItems` 函数即可,如:
```ts ```ts
{ {
@ -263,7 +263,7 @@ addOptions() {
![悬浮菜单扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-bubble-menu.png) ![悬浮菜单扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-bubble-menu.png)
<https://github.com/halo-sigs/richtext-editor/pull/38> 中,我们重构了对编辑器悬浮区域的扩展,如果需要对某个块进行支持,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getBubbleMenu` 函数即可,如: [https://github.com/halo-sigs/richtext-editor/pull/38](https://github.com/halo-sigs/richtext-editor/pull/38) 中,我们重构了对编辑器悬浮区域的扩展,如果需要对某个块进行支持,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getBubbleMenu` 函数即可,如:
```ts ```ts
{ {
@ -296,7 +296,7 @@ interface BubbleMenuProps {
from?: number; from?: number;
to?: number; to?: number;
}) => boolean; }) => boolean;
tippyOptions?: Record<string, unknown>; // 可自由定制悬浮菜单所用的 tippy 组件的选项 tippyOptions?: Record\<string, unknown\>; // 可自由定制悬浮菜单所用的 tippy 组件的选项
getRenderContainer?: (node: HTMLElement) => HTMLElement; // 悬浮菜单所基准的 DOM getRenderContainer?: (node: HTMLElement) => HTMLElement; // 悬浮菜单所基准的 DOM
defaultAnimation?: boolean; // 是否启用默认动画。默认为 true defaultAnimation?: boolean; // 是否启用默认动画。默认为 true
} }
@ -373,7 +373,7 @@ addOptions() {
![拖拽功能扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-drag.png) ![拖拽功能扩展](/img/developer-guide/plugin/api-reference/ui/extension-points/default-editor-extension-drag.png)
<https://github.com/halo-sigs/richtext-editor/pull/48> 中,我们实现了对所有元素的拖拽功能,如果需要让当前扩展支持拖拽,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getDraggable` 函数,并让其返回 true 即可。如: [https://github.com/halo-sigs/richtext-editor/pull/48](https://github.com/halo-sigs/richtext-editor/pull/48) 中,我们实现了对所有元素的拖拽功能,如果需要让当前扩展支持拖拽,只需要在具体的 Tiptap Extension 中的 `addOptions` 中定义 `getDraggable` 函数,并让其返回 true 即可。如:
```ts ```ts
{ {
@ -474,6 +474,6 @@ addOptions() {
## 实现案例 ## 实现案例
- <https://github.com/halo-sigs/plugin-hybrid-edit-block> - [https://github.com/halo-sigs/plugin-hybrid-edit-block](https://github.com/halo-sigs/plugin-hybrid-edit-block)
- <https://github.com/halo-sigs/plugin-katex> - [https://github.com/halo-sigs/plugin-katex](https://github.com/halo-sigs/plugin-katex)
- <https://github.com/halo-sigs/plugin-text-diagram> - [https://github.com/halo-sigs/plugin-text-diagram](https://github.com/halo-sigs/plugin-text-diagram)

@ -179,10 +179,10 @@ code {
</style> </style>
``` ```
> 来源:<https://vuejs.org/examples/#markdown> > 来源:[https://vuejs.org/examples/#markdown](https://vuejs.org/examples/#markdown)
## 实现案例 ## 实现案例
- <https://github.com/halo-sigs/plugin-stackedit> - [https://github.com/halo-sigs/plugin-stackedit](https://github.com/halo-sigs/plugin-stackedit)
- <https://github.com/halo-sigs/plugin-bytemd> - [https://github.com/halo-sigs/plugin-bytemd](https://github.com/halo-sigs/plugin-bytemd)
- <https://github.com/justice2001/halo-plugin-vditor> - [https://github.com/justice2001/halo-plugin-vditor](https://github.com/justice2001/halo-plugin-vditor)

@ -2,7 +2,7 @@
export interface OperationItem<T> { export interface OperationItem<T> {
priority: number; // 排序优先级 priority: number; // 排序优先级
component: Raw<Component>; // 菜单项组件 component: Raw<Component>; // 菜单项组件
props?: Record<string, unknown>; // 菜单项组件属性 props?: Record\<string, unknown\>; // 菜单项组件属性
action?: (item?: T) => void; // 菜单项点击事件 action?: (item?: T) => void; // 菜单项点击事件
label?: string; // 菜单项标题 label?: string; // 菜单项标题
hidden?: boolean; // 菜单项是否隐藏 hidden?: boolean; // 菜单项是否隐藏

@ -33,7 +33,7 @@ export interface PluginInstallationTab {
id: string; // 选项卡 ID id: string; // 选项卡 ID
label: string; // 选项卡标题 label: string; // 选项卡标题
component: Raw<Component>; // 选项卡面板组件 component: Raw<Component>; // 选项卡面板组件
props?: Record<string, unknown>; // 选项卡面板组件属性 props?: Record\<string, unknown\>; // 选项卡面板组件属性
permissions?: string[]; // 选项卡 UI 权限 permissions?: string[]; // 选项卡 UI 权限
priority: number; // 选项卡排序优先级 priority: number; // 选项卡排序优先级
} }
@ -41,4 +41,4 @@ export interface PluginInstallationTab {
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)

@ -33,7 +33,7 @@ export interface EntityFieldItem {
priority: number; priority: number;
position: "start" | "end"; position: "start" | "end";
component: Raw<Component>; component: Raw<Component>;
props?: Record<string, unknown>; props?: Record\<string, unknown\>;
permissions?: string[]; permissions?: string[];
hidden?: boolean; hidden?: boolean;
} }
@ -71,7 +71,7 @@ export default definePlugin({
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)
## 类型定义 ## 类型定义

@ -42,7 +42,7 @@ import OperationItem from "./interface/OperationItem.md";
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)
## 类型定义 ## 类型定义

@ -37,7 +37,7 @@ export interface PluginTab {
其中,`component` 组件可以注入inject以下属性 其中,`component` 组件可以注入inject以下属性
- `plugin`:当前插件对象,类型为 Ref<[Plugin](#plugin)>。 - `plugin`:当前插件对象,类型为 Ref\<[Plugin](#plugin)\>。
## 示例 ## 示例
@ -77,7 +77,7 @@ const plugin = inject<Ref<Plugin | undefined>>("plugin");
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)
## 类型定义 ## 类型定义

@ -33,7 +33,7 @@ export interface EntityFieldItem {
priority: number; priority: number;
position: "start" | "end"; position: "start" | "end";
component: Raw<Component>; component: Raw<Component>;
props?: Record<string, unknown>; props?: Record\<string, unknown\>;
permissions?: string[]; permissions?: string[];
hidden?: boolean; hidden?: boolean;
} }

@ -78,7 +78,7 @@ export default definePlugin({
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)
## 类型定义 ## 类型定义

@ -33,7 +33,7 @@ export interface ThemeListTab {
id: string; // 选项卡 ID id: string; // 选项卡 ID
label: string; // 选项卡标题 label: string; // 选项卡标题
component: Raw<Component>; // 选项卡面板组件 component: Raw<Component>; // 选项卡面板组件
props?: Record<string, unknown>; // 选项卡面板组件属性 props?: Record\<string, unknown\>; // 选项卡面板组件属性
permissions?: string[]; // 选项卡 UI 权限 permissions?: string[]; // 选项卡 UI 权限
priority: number; // 选项卡排序优先级 priority: number; // 选项卡排序优先级
} }
@ -41,4 +41,4 @@ export interface ThemeListTab {
## 实现案例 ## 实现案例
- <https://github.com/halo-dev/plugin-app-store> - [https://github.com/halo-dev/plugin-app-store](https://github.com/halo-dev/plugin-app-store)

@ -56,7 +56,7 @@ spec:
- `spec.issues`:插件问题反馈地址,如果你的插件是开源在 GitHub 上,可以直接配置为 GitHub Issues 地址。 - `spec.issues`:插件问题反馈地址,如果你的插件是开源在 GitHub 上,可以直接配置为 GitHub Issues 地址。
- `spec.displayName`:插件的显示名称,它通常是以少数几个字来概括插件的用途。 - `spec.displayName`:插件的显示名称,它通常是以少数几个字来概括插件的用途。
- `spec.description`:插件描述,用一段简短的说明来介绍插件的用途。 - `spec.description`:插件描述,用一段简短的说明来介绍插件的用途。
- `spec.license`:插件使用的软件协议,参考:<https://en.wikipedia.org/wiki/Software_license> - `spec.license`:插件使用的软件协议,参考:[https://en.wikipedia.org/wiki/Software_license](https://en.wikipedia.org/wiki/Software_license)
Halo 的插件可以在两种模式下运行:`development` 和 `deployment` Halo 的插件可以在两种模式下运行:`development` 和 `deployment`
`deployment`(默认)模式是插件创建的标准工作流程:为每个插件创建一个新的 Gradle 项目,编码插件(声明新的扩展点和/或添加新的扩展),将插件打包成一个 JAR 文件,部署 JAR 文件到 Halo。 `deployment`(默认)模式是插件创建的标准工作流程:为每个插件创建一个新的 Gradle 项目,编码插件(声明新的扩展点和/或添加新的扩展),将插件打包成一个 JAR 文件,部署 JAR 文件到 Halo。

@ -53,7 +53,7 @@ description: 了解插件项目的文件结构
- `resources` 下的 `plugin.yaml` 为插件的资源描述文件,它是必须的,它描述了插件的基本信息,包括插件的名称、版本、作者、描述、依赖等。 - `resources` 下的 `plugin.yaml` 为插件的资源描述文件,它是必须的,它描述了插件的基本信息,包括插件的名称、版本、作者、描述、依赖等。
- `resources/console` 下的两个文件 `main.js``style.css` 是前端插件部分打包时输出的产物。一个插件可以没有前端部分,因此 `resources/console` 同样可以不存在。 - `resources/console` 下的两个文件 `main.js``style.css` 是前端插件部分打包时输出的产物。一个插件可以没有前端部分,因此 `resources/console` 同样可以不存在。
:::caution 注意 :::warning 注意
从 2.11 开始Halo 支持了 UC 个人中心,且个人中心和 Console 的插件机制共享,所以为了避免歧义,`resources/console` 在后续版本会被重命名为 `resources/ui`,但同时也会兼容 `resources/console` 从 2.11 开始Halo 支持了 UC 个人中心,且个人中心和 Console 的插件机制共享,所以为了避免歧义,`resources/console` 在后续版本会被重命名为 `resources/ui`,但同时也会兼容 `resources/console`
::: :::

@ -11,24 +11,24 @@ description: 这个例子展示了如何开发 Todo List 插件
1. 修改 `build.gradle` 中的 `group` 为你自己的,如: 1. 修改 `build.gradle` 中的 `group` 为你自己的,如:
```groovy ```groovy
group = 'run.halo.tutorial' group = 'run.halo.tutorial'
``` ```
2. 修改 `settings.gradle` 中的 `rootProject.name` 2. 修改 `settings.gradle` 中的 `rootProject.name`
```groovy ```groovy
rootProject.name = 'halo-plugin-todolist' rootProject.name = 'halo-plugin-todolist'
``` ```
3. 修改插件的描述文件 `plugin.yaml`,它位于 `src/main/resources/plugin.yaml`。示例: 3. 修改插件的描述文件 `plugin.yaml`,它位于 `src/main/resources/plugin.yaml`。示例:
```yaml ```yaml
apiVersion: plugin.halo.run/v1alpha1 apiVersion: plugin.halo.run/v1alpha1
kind: Plugin kind: Plugin
metadata: metadata:
name: todolist name: todolist
spec: spec:
enabled: true enabled: true
requires: ">=2.0.0" requires: ">=2.0.0"
author: author:
@ -43,7 +43,7 @@ description: 这个例子展示了如何开发 Todo List 插件
license: license:
- name: "GPL-3.0" - name: "GPL-3.0"
url: "https://github.com/halo-dev/plugin-starter/blob/main/LICENSE" url: "https://github.com/halo-dev/plugin-starter/blob/main/LICENSE"
``` ```
参考链接: 参考链接:
@ -85,9 +85,9 @@ description: 这个例子展示了如何开发 Todo List 插件
2. 然后在项目目录执行命令 2. 然后在项目目录执行命令
```shell ```shell
./gradlew build ./gradlew build
``` ```
3. 使用 `IntelliJ IDEA` 打开 Halo参考 [Halo 开发环境运行](../../core/run.md) 及 [插件入门](../hello-world.md) 配置插件的运行模式和路径: 3. 使用 `IntelliJ IDEA` 打开 Halo参考 [Halo 开发环境运行](../../core/run.md) 及 [插件入门](../hello-world.md) 配置插件的运行模式和路径:

@ -9,12 +9,12 @@ description: 了解如何构建你的第一个插件并在 Halo 中使用它。
1. 打开 [halo-dev/plugin-starter](https://github.com/halo-dev/plugin-starter)。 1. 打开 [halo-dev/plugin-starter](https://github.com/halo-dev/plugin-starter)。
> 这是一个插件的初始模板,你可以基于它来开发自己的插件。 > 这是一个插件的初始模板,你可以基于它来开发自己的插件。
2. 点击 `Use this template` -> `Create a new repository` 2. 点击 `Use this template` -> `Create a new repository`
3. 如图所示填写仓库名后点击 `Create repository from template` 3. 如图所示填写仓库名后点击 `Create repository from template`
![create-repository-for-hello-world-plugin](/img/create-repository-for-hello-world-plugin.png) ![create-repository-for-hello-world-plugin](/img/create-repository-for-hello-world-plugin.png)
你现在已经基于 Halo 插件模板创建了自己的存储库。接下来,你需要将它克隆到你的计算机上。 你现在已经基于 Halo 插件模板创建了自己的存储库。接下来,你需要将它克隆到你的计算机上。

@ -79,7 +79,7 @@ spec:
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移配置文件。 为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移配置文件。
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next> 工具仓库地址:[https://github.com/halo-sigs/convert-theme-config-to-next](https://github.com/halo-sigs/convert-theme-config-to-next)
```bash ```bash
# 1.x 版本主题 # 1.x 版本主题

@ -48,7 +48,7 @@ categoryFinder.getByNames(names)
### 返回值 ### 返回值
List<[#CategoryVo](#categoryvo)> List\<[#CategoryVo](#categoryvo)\>
### 示例 ### 示例
@ -75,7 +75,7 @@ categoryFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<CategoryVo\>](#listresultcategoryvo) [#ListResult\<CategoryVo\>](#listresultcategoryvo)
### 示例 ### 示例
@ -103,7 +103,7 @@ categoryFinder.listAll()
### 返回值 ### 返回值
List<[#CategoryVo](#categoryvo)> List\<[#CategoryVo](#categoryvo)\>
### 示例 ### 示例
@ -131,7 +131,7 @@ categoryFinder.listAsTree()
### 返回值 ### 返回值
List<[#CategoryTreeVo](#categorytreevo)> List\<[#CategoryTreeVo](#categorytreevo)\>
### 示例 ### 示例
@ -172,7 +172,7 @@ categoryFinder.getBreadcrumbs('category-foo')
### 返回值 ### 返回值
List<[#CategoryVo](#categoryvo)> List\<[#CategoryVo](#categoryvo)\>
### 示例 ### 示例
@ -191,7 +191,7 @@ List<[#CategoryVo](#categoryvo)>
<CategoryVo /> <CategoryVo />
### ListResult<CategoryVo\> ### ListResult\<CategoryVo\>
```json title="ListResult<CategoryVo>" ```json title="ListResult<CategoryVo>"
{ {

@ -53,7 +53,7 @@ commentFinder.list(ref,page,size)
### 返回值 ### 返回值
[#ListResult<CommentVo\>](#listresultcommentvo) [#ListResult\<CommentVo\>](#listresultcommentvo)
### 示例 ### 示例
@ -84,7 +84,7 @@ commentFinder.listReply(commentName,page,size)
### 返回值 ### 返回值
[#ListResult<ReplyVo\>](#listresultreplyvo) [#ListResult\<ReplyVo\>](#listresultreplyvo)
### 示例 ### 示例
@ -103,7 +103,7 @@ commentFinder.listReply(commentName,page,size)
<CommentVo /> <CommentVo />
### ListResult<CommentVo\> ### ListResult\<CommentVo\>
```json title="ListResult<CommentVo>" ```json title="ListResult<CommentVo>"
{ {
@ -125,7 +125,7 @@ commentFinder.listReply(commentName,page,size)
<ReplyVo /> <ReplyVo />
### ListResult<ReplyVo\> ### ListResult\<ReplyVo\>
```json title="ListResult<ReplyVo>" ```json title="ListResult<ReplyVo>"
{ {

@ -47,7 +47,7 @@ contributorFinder.getContributors(names)
### 返回值 ### 返回值
List<[#ContributorVo](#contributorvo)> List\<[#ContributorVo](#contributorvo)\>
### 示例 ### 示例

@ -115,7 +115,7 @@ postFinder.listAll();
### 返回值 ### 返回值
List<[#ListedPostVo](#listedpostvo)> List\<[#ListedPostVo](#listedpostvo)\>
### 示例 ### 示例
@ -144,7 +144,7 @@ postFinder.list(page, size);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -174,7 +174,7 @@ postFinder.listByCategory(page, size, categoryName);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -204,7 +204,7 @@ postFinder.listByTag(page, size, tag);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -234,7 +234,7 @@ postFinder.listByOwner(page, size, owner);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -263,7 +263,7 @@ postFinder.archives(page, size);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -301,7 +301,7 @@ postFinder.archives(page, size, year);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -340,7 +340,7 @@ postFinder.archives(page, size, year, month);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -401,13 +401,13 @@ postFinder.archives(page, size, year, month);
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### ListResult<ListedPostVo\> ### ListResult\<ListedPostVo\>
```json title="ListResult<ListedPostVo>" ```json title="ListResult<ListedPostVo>"
{ {
@ -441,7 +441,7 @@ postFinder.archives(page, size, year, month);
- [#ListedPostVo](#listedpostvo) - [#ListedPostVo](#listedpostvo)
### ListResult<PostArchiveVo\> ### ListResult\<PostArchiveVo\>
```json title="ListResult<PostArchiveVo>" ```json title="ListResult<PostArchiveVo>"
{ {

@ -77,7 +77,7 @@ singlePageFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<ListedSinglePageVo\>](#listresultlistedsinglepagevo) [#ListResult\<ListedSinglePageVo\>](#listresultlistedsinglepagevo)
### 示例 ### 示例
@ -104,7 +104,7 @@ singlePageFinder.list(page,size)
<ListedSinglePageVo /> <ListedSinglePageVo />
### ListResult<ListedSinglePageVo\> ### ListResult\<ListedSinglePageVo\>
```json title="ListResult<ListedSinglePageVo>" ```json title="ListResult<ListedSinglePageVo>"
{ {

@ -47,7 +47,7 @@ tagFinder.getByNames(names)
### 返回值 ### 返回值
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
### 示例 ### 示例
@ -74,7 +74,7 @@ tagFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<TagVo\>](#listresulttagvo) [#ListResult\<TagVo\>](#listresulttagvo)
### 示例 ### 示例
@ -102,7 +102,7 @@ tagFinder.listAll()
### 返回值 ### 返回值
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
### 示例 ### 示例
@ -120,7 +120,7 @@ List<[#TagVo](#tagvo)>
<TagVo /> <TagVo />
### ListResult<TagVo\> ### ListResult\<TagVo\>
```json title="ListResult<TagVo>" ```json title="ListResult<TagVo>"
{ {

@ -123,7 +123,7 @@ Setting 资源的 `metadata.name` 必须和 `theme.yaml` 中的 `spec.settingNam
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移设置表单配置文件。 为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移设置表单配置文件。
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next> 工具仓库地址:[https://github.com/halo-sigs/convert-theme-config-to-next](https://github.com/halo-sigs/convert-theme-config-to-next)
```bash ```bash
# 1.x 版本主题 # 1.x 版本主题

@ -22,7 +22,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
#### 变量类型 #### 变量类型
[#UrlContextListResult<PostArchiveVo\>](#urlcontextlistresultpostarchivevo) [#UrlContextListResult\<PostArchiveVo\>](#urlcontextlistresultpostarchivevo)
#### 示例 #### 示例
@ -65,7 +65,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
@ -87,7 +87,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
- [#ListedPostVo](#listedpostvo) - [#ListedPostVo](#listedpostvo)
### UrlContextListResult<PostArchiveVo\> ### UrlContextListResult\<PostArchiveVo\>
```json title="UrlContextListResult<PostArchiveVo>" ```json title="UrlContextListResult<PostArchiveVo>"
{ {

@ -26,7 +26,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -77,13 +77,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -16,7 +16,7 @@ import CategoryTreeVo from "../vo/_CategoryTreeVo.md"
#### 变量类型 #### 变量类型
List<[#CategoryTreeVo](#categorytreevo)> List\<[#CategoryTreeVo](#categorytreevo)\>
#### 示例 #### 示例

@ -25,7 +25,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -78,13 +78,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -19,7 +19,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -71,13 +71,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -25,7 +25,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -78,13 +78,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -16,7 +16,7 @@ import TagVo from '../vo/_TagVo.md'
#### 变量类型 #### 变量类型
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
#### 示例 #### 示例

@ -64,7 +64,7 @@ description: 使用腾讯云轻量应用服务器的应用模板部署 Halo
![添加域名](/img/install/tencent-cloud-lighthouse/domain.png) ![添加域名](/img/install/tencent-cloud-lighthouse/domain.png)
除此之外,在绑定域名之后,还需要修改一下 Halo 的 **外部访问地址** 参数为实际的网站访问地址(如:<https://demo.halo.run>),否则 Halo 的部分功能或者插件可能会出现使用问题,只需要按照下图所示修改应用的参数然后点击确认即可。 除此之外,在绑定域名之后,还需要修改一下 Halo 的 **外部访问地址** 参数为实际的网站访问地址(如:[https://demo.halo.run](https://demo.halo.run)),否则 Halo 的部分功能或者插件可能会出现使用问题,只需要按照下图所示修改应用的参数然后点击确认即可。
![修改外部访问地址](/img/install/tencent-cloud-lighthouse/external-url.png) ![修改外部访问地址](/img/install/tencent-cloud-lighthouse/external-url.png)

@ -12,8 +12,8 @@ import DockerRegistryList from "./slots/_docker-registry-list.md"
## 环境搭建 ## 环境搭建
- Docker 安装文档:<https://docs.docker.com/engine/install/> - Docker 安装文档:[https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
- Docker Compose 安装文档:<https://docs.docker.com/compose/install/> - Docker Compose 安装文档:[https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)
:::tip :::tip
我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。 我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
@ -25,234 +25,234 @@ import DockerRegistryList from "./slots/_docker-registry-list.md"
1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。 1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。
```bash ```bash
mkdir ~/halo && cd ~/halo mkdir ~/halo && cd ~/halo
``` ```
:::info :::info
注意后续操作中Halo 产生的所有数据都会保存在这个目录,请妥善保存。 注意后续操作中Halo 产生的所有数据都会保存在这个目录,请妥善保存。
::: :::
2. 创建 `docker-compose.yaml` 2. 创建 `docker-compose.yaml`
此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要**选择一种**。 此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要**选择一种**。
:::info :::info
需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。 需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。
::: :::
1. 创建 Halo + PostgreSQL 的实例: 1. 创建 Halo + PostgreSQL 的实例:
```yaml {23-29,43} title="~/halo/docker-compose.yaml" ```yaml {23-29,43} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: registry.fit2cloud.com/halo/halo:2.18 image: registry.fit2cloud.com/halo/halo:2.18
restart: on-failure:3 restart: on-failure:3
depends_on: depends_on:
halodb: halodb:
condition: service_healthy condition: service_healthy
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo - --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql - --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql - --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
halodb: halodb:
image: postgres:15.4 image: postgres:15.4
restart: on-failure:3 restart: on-failure:3
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./db:/var/lib/postgresql/data - ./db:/var/lib/postgresql/data
healthcheck: healthcheck:
test: [ "CMD", "pg_isready" ] test: [ "CMD", "pg_isready" ]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
environment: environment:
- POSTGRES_PASSWORD=openpostgresql - POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo - POSTGRES_USER=halo
- POSTGRES_DB=halo - POSTGRES_DB=halo
- PGUSER=halo - PGUSER=halo
networks: networks:
halo_network: halo_network:
``` ```
:::info :::info
此示例的 PostgreSQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 `halodb` 服务中添加端口映射PostgreSQL 的端口为 `5432` 此示例的 PostgreSQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 `halodb` 服务中添加端口映射PostgreSQL 的端口为 `5432`
::: :::
2. 创建 Halo + MySQL 的实例: 2. 创建 Halo + MySQL 的实例:
```yaml {23-29,51} title="~/halo/docker-compose.yaml" ```yaml {23-29,51} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: registry.fit2cloud.com/halo/halo:2.18 image: registry.fit2cloud.com/halo/halo:2.18
restart: on-failure:3 restart: on-failure:3
depends_on: depends_on:
halodb: halodb:
condition: service_healthy condition: service_healthy
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root - --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=o#DwN&JSa56 - --spring.r2dbc.password=o#DwN&JSa56
- --spring.sql.init.platform=mysql - --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
halodb: halodb:
image: mysql:8.1.0 image: mysql:8.1.0
restart: on-failure:3 restart: on-failure:3
networks: networks:
halo_network: halo_network:
command: command:
- --default-authentication-plugin=caching_sha2_password - --default-authentication-plugin=caching_sha2_password
- --character-set-server=utf8mb4 - --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci - --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true - --explicit_defaults_for_timestamp=true
volumes: volumes:
- ./mysql:/var/lib/mysql - ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup - ./mysqlBackup:/data/mysqlBackup
healthcheck: healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s interval: 3s
retries: 5 retries: 5
start_period: 30s start_period: 30s
environment: environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56 - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo - MYSQL_DATABASE=halo
networks: networks:
halo_network: halo_network:
``` ```
:::info :::info
此示例的 MySQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 `halodb` 服务中添加端口映射MySQL 的端口为 `3306` 此示例的 MySQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 `halodb` 服务中添加端口映射MySQL 的端口为 `3306`
::: :::
3. 仅创建 Halo 实例(使用默认的 H2 数据库): 3. 仅创建 Halo 实例(使用默认的 H2 数据库):
:::caution :::warning
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。 不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。
::: :::
```yaml {19-24} title="~/halo/docker-compose.yaml" ```yaml {19-24} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: registry.fit2cloud.com/halo/halo:2.18 image: registry.fit2cloud.com/halo/halo:2.18
restart: on-failure:3 restart: on-failure:3
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
``` ```
4. 仅创建 Halo 实例使用已有外部数据库MySQL 为例): 4. 仅创建 Halo 实例使用已有外部数据库MySQL 为例):
```yaml {7,12-20} title="~/halo/docker-compose.yaml" ```yaml {7,12-20} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: registry.fit2cloud.com/halo/halo:2.18 image: registry.fit2cloud.com/halo/halo:2.18
restart: on-failure:3 restart: on-failure:3
network_mode: "host" network_mode: "host"
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
command: command:
# 修改为自己已有的 MySQL 配置 # 修改为自己已有的 MySQL 配置
- --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo - --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo
- --spring.r2dbc.username=root - --spring.r2dbc.username=root
- --spring.r2dbc.password= - --spring.r2dbc.password=
- --spring.sql.init.platform=mysql - --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
# 端口号 默认8090 # 端口号 默认8090
- --server.port=8090 - --server.port=8090
``` ```
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
3. 启动 Halo 服务 3. 启动 Halo 服务
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
实时查看日志: 实时查看日志:
```bash ```bash
docker-compose logs -f docker-compose logs -f
``` ```
4. 用浏览器访问 /console 即可进入 Halo 管理页面,首次启动会进入初始化页面。 4. 用浏览器访问 /console 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 更新容器组 ## 更新容器组
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 更新 Halo 服务 2. 更新 Halo 服务
修改 `docker-compose.yaml` 中配置的镜像版本。 修改 `docker-compose.yaml` 中配置的镜像版本。
```yaml {3} ```yaml {3}
services: services:
halo: halo:
image: registry.fit2cloud.com/halo/halo:2.18 image: registry.fit2cloud.com/halo/halo:2.18
``` ```
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
## 反向代理 ## 反向代理

@ -10,7 +10,7 @@ import DockerRegistryList from "./slots/_docker-registry-list.md"
在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。 在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。
::: :::
:::caution :::warning
此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。 此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。
如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose) 如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose)
@ -18,7 +18,7 @@ import DockerRegistryList from "./slots/_docker-registry-list.md"
## 环境搭建 ## 环境搭建
- Docker 安装文档:<https://docs.docker.com/engine/install/> - Docker 安装文档:[https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
:::tip :::tip
我们推荐按照 Docker 官方文档安装 Docker因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。 我们推荐按照 Docker 官方文档安装 Docker因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
@ -30,50 +30,50 @@ import DockerRegistryList from "./slots/_docker-registry-list.md"
1. 创建容器 1. 创建容器
```bash ```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18 docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18
``` ```
:::info :::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose) 注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose)
::: :::
- **-it**:开启输入功能并连接伪终端 - **-it**:开启输入功能并连接伪终端
- **-d**:后台运行容器 - **-d**:后台运行容器
- **--name**:为容器指定一个名称 - **--name**:为容器指定一个名称
- **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。 - **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。 - **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
1. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。 2. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 升级版本 ## 升级版本
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 拉取新版本镜像 2. 拉取新版本镜像
```bash ```bash
docker pull registry.fit2cloud.com/halo/halo:2.18 docker pull registry.fit2cloud.com/halo/halo:2.18
``` ```
3. 停止运行中的容器 3. 停止运行中的容器
```bash ```bash
docker stop halo docker stop halo
docker rm halo docker rm halo
``` ```
4. 更新 Halo 4. 更新 Halo
修改版本号后,按照最初安装的方式,重新创建容器即可。 修改版本号后,按照最初安装的方式,重新创建容器即可。
```bash ```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18 docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18
``` ```

@ -58,8 +58,8 @@ title: 使用 JAR 文件部署
:::info :::info
以下是官方维护的下载地址: 以下是官方维护的下载地址:
1. <https://download.halo.run> 1. [https://download.halo.run](https://download.halo.run)
2. <https://github.com/halo-dev/halo/releases> 2. [https://github.com/halo-dev/halo/releases](https://github.com/halo-dev/halo/releases)
::: :::
4. 创建 [工作目录](../prepare#工作目录) 4. 创建 [工作目录](../prepare#工作目录)
@ -132,7 +132,7 @@ title: 使用 JAR 文件部署
- DATABASE数据库名称`halo`,需要提前创建 - DATABASE数据库名称`halo`,需要提前创建
::: :::
:::caution :::warning
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。 不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。
::: :::

@ -25,7 +25,7 @@ Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续
> 说明:默认你的服务器已经安装了 Docker 和 Docker Compose如果你没有安装可以参考[使用 Docker Compose 部署](../docker-compose) 的环境搭建部分来进行安装。 > 说明:默认你的服务器已经安装了 Docker 和 Docker Compose如果你没有安装可以参考[使用 Docker Compose 部署](../docker-compose) 的环境搭建部分来进行安装。
点击下方链接进入 Nginx Proxy Manager以下简称 NPM 官网:<https://nginxproxymanager.com/> 点击下方链接进入 Nginx Proxy Manager以下简称 NPM 官网:[https://nginxproxymanager.com/](https://nginxproxymanager.com/)
我们可以直接选择 [快速安装](https://nginxproxymanager.com/guide/#quick-setup)。 我们可以直接选择 [快速安装](https://nginxproxymanager.com/guide/#quick-setup)。

@ -26,7 +26,7 @@ description: 使用 Traefik 管理 Halo 服务的反向代理
3. 开启 Traefik Dashboard建议使用二级域名的形式示例`traefik.yourdomain.com`)。[文档](https://doc.traefik.io/traefik/operations/dashboard/#dashboard-router-rule) 3. 开启 Traefik Dashboard建议使用二级域名的形式示例`traefik.yourdomain.com`)。[文档](https://doc.traefik.io/traefik/operations/dashboard/#dashboard-router-rule)
4. 开启证书自动生成,通过 ACME 自动管理 TLS 证书的申请、校验与续期。[文档](https://doc.traefik.io/traefik/https/acme/) 4. 开启证书自动生成,通过 ACME 自动管理 TLS 证书的申请、校验与续期。[文档](https://doc.traefik.io/traefik/https/acme/)
:::caution :::warning
ACME 证书 (`/acme.json`) 一定要 [持久化](https://doc.traefik.io/traefik/https/acme/#storage),否则每次重启 Traefik 服务,都会去申请签发证书。可能会触发 Let's ACME 证书 (`/acme.json`) 一定要 [持久化](https://doc.traefik.io/traefik/https/acme/#storage),否则每次重启 Traefik 服务,都会去申请签发证书。可能会触发 Let's
Encrypt 的 [速率限制](https://letsencrypt.org/zh-cn/docs/rate-limits/),导致签名的域名一段时间内无法签发新的证书。 Encrypt 的 [速率限制](https://letsencrypt.org/zh-cn/docs/rate-limits/),导致签名的域名一段时间内无法签发新的证书。
::: :::

@ -37,7 +37,7 @@ Podman 采用无守护进程的包容性架构,因此可以更安全、更简
## 环境搭建 ## 环境搭建
- Podman 安装文档:<https://podman.io/docs/installation> - Podman 安装文档:[https://podman.io/docs/installation](https://podman.io/docs/installation)
:::tip :::tip
我们推荐您先阅读 Podman 官方文档对 Podman 有了相关了解后再考虑通过Linux包管理系统安装 Podman 或者使用文档中指定的方式安装 。 我们推荐您先阅读 Podman 官方文档对 Podman 有了相关了解后再考虑通过Linux包管理系统安装 Podman 或者使用文档中指定的方式安装 。
@ -55,50 +55,50 @@ Podman 采用无守护进程的包容性架构,因此可以更安全、更简
1. 创建容器 1. 创建容器
```bash ```bash
mkdir -p ~/.halo2 mkdir -p ~/.halo2
podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18 podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18
``` ```
:::info :::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose) 注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose)
::: :::
- **-it**:开启输入功能并连接伪终端 - **-it**:开启输入功能并连接伪终端
- **-d**:后台运行容器 - **-d**:后台运行容器
- **--name**:为容器指定一个名称 - **--name**:为容器指定一个名称
- **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。 - **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。 - **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
1. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。 2. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 升级版本 ## 升级版本
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 拉取新版本镜像 2. 拉取新版本镜像
```bash ```bash
podman pull registry.fit2cloud.com/halo/halo:2.18 podman pull registry.fit2cloud.com/halo/halo:2.18
``` ```
3. 停止运行中的容器 3. 停止运行中的容器
```bash ```bash
podman stop halo podman stop halo
podman rm halo podman rm halo
``` ```
4. 更新 Halo 4. 更新 Halo
修改版本号后,按照最初安装的方式,重新创建容器即可。 修改版本号后,按照最初安装的方式,重新创建容器即可。
```bash ```bash
podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18 podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.18
@ -113,50 +113,50 @@ Podman 没有和 Docker 类似的管理进程,在低配置的主机上更友
下面是一个使用 Podstgresql 数据库的示例: 下面是一个使用 Podstgresql 数据库的示例:
```bash ```bash
mkdir -p /opt/podman-data/halo mkdir -p /opt/podman-data/halo
mkdir -p /etc/containers/systemd mkdir -p /etc/containers/systemd
vim /etc/containers/systemd/halo.container vim /etc/containers/systemd/halo.container
``` ```
```conf ```conf
[Unit] [Unit]
Description=The halo container Description=The halo container
Wants=network-online.target Wants=network-online.target
After=network-online.target After=network-online.target
[Container] [Container]
AutoUpdate=registry AutoUpdate=registry
ContainerName=halo ContainerName=halo
User=60000 User=60000
Group=60000 Group=60000
UserNS=keep-id:uid=60000,gid=60000 UserNS=keep-id:uid=60000,gid=60000
Environment=JVM_OPTS="-Xmx512m -Xms256m" Environment=JVM_OPTS="-Xmx512m -Xms256m"
Environment=HALO_WORK_DIR="/.halo" Environment=HALO_WORK_DIR="/.halo"
Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/" Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"
Environment=TZ=Asia/Shanghai Environment=TZ=Asia/Shanghai
Volume=/opt/podman-data/halo:/.halo Volume=/opt/podman-data/halo:/.halo
PublishPort=127.0.0.1:8090:8090 PublishPort=127.0.0.1:8090:8090
Image=ghcr.io/halo-dev/halo:2.18 Image=ghcr.io/halo-dev/halo:2.18
Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password
[Service] [Service]
Restart=always Restart=always
RestartSec=30s RestartSec=30s
StartLimitInterval=30 StartLimitInterval=30
TimeoutStartSec=900 TimeoutStartSec=900
TimeoutStopSec=70 TimeoutStopSec=70
[Install] [Install]
WantedBy=multi-user.target default.target WantedBy=multi-user.target default.target
``` ```
```bash ```bash
systemctl daemon-reload systemctl daemon-reload
systemctl start halo systemctl start halo
# 只需要systemctl start halo. # 只需要systemctl start halo.
# 之后重启会自动启动不需要enable服务. # 之后重启会自动启动不需要enable服务.
``` ```
Podman Quadlet 解析: Podman Quadlet 解析:
@ -191,34 +191,34 @@ Podman Quadlet 解析:
使用默认的 root 用户运行时无需定义 `User=60000 Group=60000 UserNS=keep-id:uid=60000,gid=60000``Environment=HALO_WORK_DIR="/.halo"` `Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"` 使用默认的 root 用户运行时无需定义 `User=60000 Group=60000 UserNS=keep-id:uid=60000,gid=60000``Environment=HALO_WORK_DIR="/.halo"` `Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"`
示例: 示例:
```bash ```bash
mkdir -p /opt/podman-data/halo mkdir -p /opt/podman-data/halo
mkdir -p /etc/containers/systemd mkdir -p /etc/containers/systemd
vim /etc/containers/systemd/halo.container vim /etc/containers/systemd/halo.container
``` ```
```conf ```conf
# /etc/containers/systemd/halo.container # /etc/containers/systemd/halo.container
[Unit] [Unit]
Description=The halo container Description=The halo container
Wants=network-online.target Wants=network-online.target
After=network-online.target After=network-online.target
[Container] [Container]
AutoUpdate=registry AutoUpdate=registry
ContainerName=halo ContainerName=halo
Volume=/opt/podman-data/halo:/root/.halo Volume=/opt/podman-data/halo:/root/.halo
PublishPort=127.0.0.1:8090:8090 PublishPort=127.0.0.1:8090:8090
Image=ghcr.io/halo-dev/halo:2.18 Image=ghcr.io/halo-dev/halo:2.18
Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password
[Service] [Service]
Restart=always Restart=always
RestartSec=30s RestartSec=30s
StartLimitInterval=30 StartLimitInterval=30
TimeoutStartSec=900 TimeoutStartSec=900
TimeoutStopSec=70 TimeoutStopSec=70
[Install] [Install]
WantedBy=multi-user.target default.target WantedBy=multi-user.target default.target
``` ```

@ -8,21 +8,21 @@ description: 从 Halo 1.x 迁移的完整指南和注意事项
- Halo 版本必须为 1.5.x 或 1.6.x。如果不满足需要先升级到 1.5.x 或 1.6.x 版本。 - Halo 版本必须为 1.5.x 或 1.6.x。如果不满足需要先升级到 1.5.x 或 1.6.x 版本。
- Halo 2.0 不兼容 1.x 的主题,建议在升级前先查询你正在使用的主题是否已经支持 2.0。你可以访问 [halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo) 或 [应用市场](https://halo.run/store/apps?type=THEME) 查阅目前支持的主题。 - Halo 2.0 不兼容 1.x 的主题,建议在升级前先查询你正在使用的主题是否已经支持 2.0。你可以访问 [halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo) 或 [应用市场](https://halo.run/store/apps?type=THEME) 查阅目前支持的主题。
- Halo 2.0 目前没有内置 Markdown 编辑器,如果需要重新编辑迁移后的文章,需要额外安装 Markdown 编辑器插件。目前社区已经提供了以下插件: - Halo 2.0 目前没有内置 Markdown 编辑器,如果需要重新编辑迁移后的文章,需要额外安装 Markdown 编辑器插件。目前社区已经提供了以下插件:
- StackEdit<https://halo.run/store/apps/app-hDXMG> - StackEdit[https://halo.run/store/apps/app-hDXMG](https://halo.run/store/apps/app-hDXMG)
- ByteMD<https://halo.run/store/apps/app-HTyhC> - ByteMD[https://halo.run/store/apps/app-HTyhC](https://halo.run/store/apps/app-HTyhC)
- Halo 2.0 不再内置友情链接、日志、图库等模块,需要安装额外的插件,目前官方已提供: - Halo 2.0 不再内置友情链接、日志、图库等模块,需要安装额外的插件,目前官方已提供:
- 链接管理:<https://halo.run/store/apps/app-hfbQg> - 链接管理:[https://halo.run/store/apps/app-hfbQg](https://halo.run/store/apps/app-hfbQg)
- 图库:<https://halo.run/store/apps/app-BmQJW> - 图库:[https://halo.run/store/apps/app-BmQJW](https://halo.run/store/apps/app-BmQJW)
- 瞬间(原日志):<https://halo.run/store/apps/app-SnwWD> - 瞬间(原日志):[https://halo.run/store/apps/app-SnwWD](https://halo.run/store/apps/app-SnwWD)
- Halo 2.0 不再内置外部云存储的支持。需要安装额外的插件,目前官方已提供: - Halo 2.0 不再内置外部云存储的支持。需要安装额外的插件,目前官方已提供:
- S3兼容国内主流的云存储<https://halo.run/store/apps/app-Qxhpp> - S3兼容国内主流的云存储[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
- 阿里云 OSS<https://halo.run/store/apps/app-wCJCD> - 阿里云 OSS[https://halo.run/store/apps/app-wCJCD](https://halo.run/store/apps/app-wCJCD)
- 在迁移过程中不会保留旧版本的用户数据,迁移完成之后,关于文章等数据的关联都将改为 Halo 2.0 的新用户。 - 在迁移过程中不会保留旧版本的用户数据,迁移完成之后,关于文章等数据的关联都将改为 Halo 2.0 的新用户。
- 为了防止直接升级 2.0 导致 1.x 的数据受到破坏,我们已经将工作目录由 `~/.halo` 变更为 `~/.halo2` - 为了防止直接升级 2.0 导致 1.x 的数据受到破坏,我们已经将工作目录由 `~/.halo` 变更为 `~/.halo2`
- 目前 Halo 2.0 仅提供 Docker 部署方式,没有提供可执行 JAR 包,但可以自编译,请参考 [构建](../developer-guide/core/build.md) 文档 - 目前 Halo 2.0 仅提供 Docker 部署方式,没有提供可执行 JAR 包,但可以自编译,请参考 [构建](../developer-guide/core/build.md) 文档
- 可以考虑先在本地运行一个 Halo 2.0,模拟一下导入,检查导入后是否满足要求。 - 可以考虑先在本地运行一个 Halo 2.0,模拟一下导入,检查导入后是否满足要求。
如果遇到了迁移过程中的问题,也可以向我们提交 Issue: <https://github.com/halo-dev/halo/issues/new/choose>,以上暂不支持的功能我们也会陆续完善。 如果遇到了迁移过程中的问题,也可以向我们提交 Issue: [https://github.com/halo-dev/halo/issues/new/choose](https://github.com/halo-dev/halo/issues/new/choose),以上暂不支持的功能我们也会陆续完善。
## 备份数据 ## 备份数据
@ -54,11 +54,11 @@ description: 从 Halo 1.x 迁移的完整指南和注意事项
在迁移过程中,需要提前安装必要的插件: 在迁移过程中,需要提前安装必要的插件:
- 站点迁移:<https://halo.run/store/apps/app-TlUBt> - 站点迁移:[https://halo.run/store/apps/app-TlUBt](https://halo.run/store/apps/app-TlUBt)
- 链接管理:<https://halo.run/store/apps/app-hfbQg> - 链接管理:[https://halo.run/store/apps/app-hfbQg](https://halo.run/store/apps/app-hfbQg)
- 图库:<https://halo.run/store/apps/app-BmQJW> - 图库:[https://halo.run/store/apps/app-BmQJW](https://halo.run/store/apps/app-BmQJW)
- 瞬间(原日志):<https://halo.run/store/apps/app-SnwWD> - 瞬间(原日志):[https://halo.run/store/apps/app-SnwWD](https://halo.run/store/apps/app-SnwWD)
- S3如果需要迁移存在云存储的附件需要安装<https://halo.run/store/apps/app-Qxhpp> - S3如果需要迁移存在云存储的附件需要安装[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
## 配置存储策略 ## 配置存储策略

@ -63,7 +63,7 @@ Halo 目前支持以下数据库:
其中H2 不需要单独运行,其他数据库需要单独安装并配置。一般情况下,推荐按照 [使用 Docker Compose 部署](./install/docker-compose.md) 文档将 Halo 和数据库容器编排在一起。 其中H2 不需要单独运行,其他数据库需要单独安装并配置。一般情况下,推荐按照 [使用 Docker Compose 部署](./install/docker-compose.md) 文档将 Halo 和数据库容器编排在一起。
:::caution :::warning
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../user-guide/backup.md)。 不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../user-guide/backup.md)。
::: :::

@ -37,12 +37,12 @@ slug: /
docker run -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.18 docker run -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.18
``` ```
以上仅作为体验使用,详细部署文档请查阅:<https://docs.halo.run/getting-started/install/docker-compose> 以上仅作为体验使用,详细部署文档请查阅:[https://docs.halo.run/getting-started/install/docker-compose](https://docs.halo.run/getting-started/install/docker-compose)
## 在线体验 ## 在线体验
- 环境地址:<https://demo.halo.run> - 环境地址:[https://demo.halo.run](https://demo.halo.run)
- 后台地址:<https://demo.halo.run/console> - 后台地址:[https://demo.halo.run/console](https://demo.halo.run/console)
- 用户名:`demo` - 用户名:`demo`
- 密码:`P@ssw0rd123..` - 密码:`P@ssw0rd123..`

@ -5,7 +5,7 @@ description: 内置应用市场的使用说明
为了方便使用者安装应用市场的主题和插件,我们提供了一个内置到 Console 的应用市场插件,可以更加方便在 Console 直接安装主题和插件。并且此插件从 Halo 2.10 开始已经预设到 Halo 中,无需手动安装。 为了方便使用者安装应用市场的主题和插件,我们提供了一个内置到 Console 的应用市场插件,可以更加方便在 Console 直接安装主题和插件。并且此插件从 Halo 2.10 开始已经预设到 Halo 中,无需手动安装。
如果你使用了旧版本的 Halo并且当前未安装应用市场插件可以访问 <https://www.halo.run/store/apps/app-VYJbF> 手动下载并在 Console 的插件管理中安装。 如果你使用了旧版本的 Halo并且当前未安装应用市场插件可以访问 [https://www.halo.run/store/apps/app-VYJbF](https://www.halo.run/store/apps/app-VYJbF) 手动下载并在 Console 的插件管理中安装。
:::info 提示 :::info 提示
这是目前唯一由 Halo 官方提供的服务,如果你当前的 Halo 网站处于无法访问外网的环境或者不需要此功能,你可以卸载或者停用此插件,不会影响网站的正常使用。 这是目前唯一由 Halo 官方提供的服务,如果你当前的 Halo 网站处于无法访问外网的环境或者不需要此功能,你可以卸载或者停用此插件,不会影响网站的正常使用。
@ -13,7 +13,7 @@ description: 内置应用市场的使用说明
## 应用市场页面 ## 应用市场页面
这是一个为 Console 提供的独立的应用市场页面,此页面基本和 <https://www.halo.run/store/apps> 保持一致,但有所不同的是,你可以直接在这里查看所有的主题和插件并安装到你的 Halo 站点中。 这是一个为 Console 提供的独立的应用市场页面,此页面基本和 [https://www.halo.run/store/apps](https://www.halo.run/store/apps) 保持一致,但有所不同的是,你可以直接在这里查看所有的主题和插件并安装到你的 Halo 站点中。
![应用市场](/img/user-guide/app-store/app-store-page.png) ![应用市场](/img/user-guide/app-store/app-store-page.png)
@ -51,7 +51,7 @@ description: 内置应用市场的使用说明
目前部分付费主题和插件需要许可证激活才能够正常使用,在购买付费应用之后就会自动为你的 Halo 官网账号中生成对应的应用许可证,**所以在此之前需要确保已经在你的网站中绑定好了 Halo 官网账号**。 目前部分付费主题和插件需要许可证激活才能够正常使用,在购买付费应用之后就会自动为你的 Halo 官网账号中生成对应的应用许可证,**所以在此之前需要确保已经在你的网站中绑定好了 Halo 官网账号**。
:::info 注意 :::info 注意
当前应用市场的许可证暂不支持离线激活,需要 Halo 所在的服务器能够正常访问 <https://www.halo.run> 当前应用市场的许可证暂不支持离线激活,需要 Halo 所在的服务器能够正常访问 [https://www.halo.run](https://www.halo.run)
::: :::
在安装好需要许可证的付费插件或主题后,列表会显示一个许可证状态的图标,点击即可打开许可证激活的对话框,选择许可证并点击激活即可。 在安装好需要许可证的付费插件或主题后,列表会显示一个许可证状态的图标,点击即可打开许可证激活的对话框,选择许可证并点击激活即可。

@ -12,8 +12,8 @@ Halo 默认提供了本地的存储策略类型,你还可以通过安装插件
:::info :::info
目前 Halo 官方维护了两个存储策略插件,可以根据需要选择安装: 目前 Halo 官方维护了两个存储策略插件,可以根据需要选择安装:
1. 阿里云 OSS<https://halo.run/store/apps/app-wCJCD> 1. 阿里云 OSS[https://halo.run/store/apps/app-wCJCD](https://halo.run/store/apps/app-wCJCD)
2. Amazon S3 协议(主流云存储厂商均支持):<https://halo.run/store/apps/app-Qxhpp> 2. Amazon S3 协议(主流云存储厂商均支持):[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
::: :::
你可以点击附件页面右上角的 `存储策略` 按钮对存储策略进行管理。 你可以点击附件页面右上角的 `存储策略` 按钮对存储策略进行管理。

@ -62,6 +62,6 @@ Halo 作为一款好用又强大的开源建站工具,配合上不同的模板
:::info :::info
目前有两个官方渠道可以获取主题和插件: 目前有两个官方渠道可以获取主题和插件:
- 应用市场:<https://halo.run/store/apps> - 应用市场:[https://halo.run/store/apps](https://halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::

@ -111,12 +111,12 @@ server {
1. 可以在 Console 端的概览页面下载最近的日志文件。 1. 可以在 Console 端的概览页面下载最近的日志文件。
2. 使用 docker logs 命令进行查看。 2. 使用 docker logs 命令进行查看。
```bash ```bash
# '-f' 滚动更新日志 # '-f' 滚动更新日志
# '-n 200' 从倒数第200行开始查看 # '-n 200' 从倒数第200行开始查看
# 更多帮助可以查看 'docker logs --help' # 更多帮助可以查看 'docker logs --help'
docker logs -f halo -n 200 docker logs -f halo -n 200
``` ```
### 前台样式丢失,如何解决? ### 前台样式丢失,如何解决?
@ -125,10 +125,10 @@ server {
1. 后台设置的 `博客地址` 与实际访问地址不一致。也可能是开启了 https 之后,无法正常加载 http 资源,将 `博客地址` 改为 https 协议即可。 1. 后台设置的 `博客地址` 与实际访问地址不一致。也可能是开启了 https 之后,无法正常加载 http 资源,将 `博客地址` 改为 https 协议即可。
2. Nginx 配置了静态资源缓存,但没有设置 `proxy_pass`,参考如下: 2. Nginx 配置了静态资源缓存,但没有设置 `proxy_pass`,参考如下:
```nginx ```nginx
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
proxy_pass http://halo; proxy_pass http://halo;
expires 30d; expires 30d;
access_log off; access_log off;
} }
``` ```

@ -10,8 +10,8 @@ description: 插件管理相关功能说明
:::info :::info
目前有两个官方渠道可以获取插件: 目前有两个官方渠道可以获取插件:
- 应用市场:<https://www.halo.run/store/apps> - 应用市场:[https://www.halo.run/store/apps](https://www.halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::

@ -21,8 +21,8 @@ description: 文章管理相关功能说明
:::info :::info
Halo 支持通过插件来拓展文章编辑器,目前 Halo 官方维护了另外两款编辑器插件,可以按需安装使用: Halo 支持通过插件来拓展文章编辑器,目前 Halo 官方维护了另外两款编辑器插件,可以按需安装使用:
1. StackEdit<https://halo.run/store/apps/app-hDXMG> 1. StackEdit[https://halo.run/store/apps/app-hDXMG](https://halo.run/store/apps/app-hDXMG)
2. ByteMD<https://halo.run/store/apps/app-HTyhC> 2. ByteMD[https://halo.run/store/apps/app-HTyhC](https://halo.run/store/apps/app-HTyhC)
::: :::
## 文章设置 ## 文章设置

@ -8,8 +8,8 @@ description: 主题管理相关功能说明
:::info :::info
目前有两个官方渠道可以获取主题: 目前有两个官方渠道可以获取主题:
- 应用市场:<https://www.halo.run/store/apps> - 应用市场:[https://www.halo.run/store/apps](https://www.halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::

@ -104,7 +104,7 @@ Halo 提供了全新创建和基于已有角色创建两种角色创建方式。
:::info :::info
目前 Halo 官方提供的身份认证插件: 目前 Halo 官方提供的身份认证插件:
- OAuth2 认证:<https://halo.run/store/apps/app-ESVDK> - OAuth2 认证:[https://halo.run/store/apps/app-ESVDK](https://halo.run/store/apps/app-ESVDK)
::: :::
你可以在用户管理界面的右上角点击 `身份认证` 按钮,进入身份认证管理页面。 你可以在用户管理界面的右上角点击 `身份认证` 按钮,进入身份认证管理页面。

@ -1,5 +1,6 @@
const darkCodeTheme = require("prism-react-renderer/themes/palenight");
const VersionsArchived = require("./versionsArchived.json"); const VersionsArchived = require("./versionsArchived.json");
const { themes } = require("prism-react-renderer");
const darkCodeTheme = themes.palenight;
/** @type {import('@docusaurus/types').Config} */ /** @type {import('@docusaurus/types').Config} */
const config = { const config = {

@ -39,7 +39,7 @@
}, },
"theme.admonition.caution": { "theme.admonition.caution": {
"message": "警告", "message": "警告",
"description": "The default label used for the Caution admonition (:::caution)" "description": "The default label used for the Caution admonition (:::warning)"
}, },
"theme.blog.paginator.navAriaLabel": { "theme.blog.paginator.navAriaLabel": {
"message": "博文列表分页导航", "message": "博文列表分页导航",

@ -0,0 +1,57 @@
const fs = require('fs');
const path = require('path');
// 指定要扫描的目录
const directoryPath = './docs';
// 递归读取目录中的所有 Markdown 文件
function readDirectory(directory) {
fs.readdir(directory, (err, files) => {
if (err) {
return console.log('无法扫描目录: ' + err);
}
files.forEach(file => {
const filePath = path.join(directory, file);
fs.stat(filePath, (err, stats) => {
if (err) {
return console.log('无法获取文件信息: ' + err);
}
if (stats.isDirectory()) {
// 如果是目录,递归读取
readDirectory(filePath);
} else if (path.extname(file) === '.md') {
// 如果是 Markdown 文件,处理文件内容
processMarkdownFile(filePath);
}
});
});
});
}
// 处理 Markdown 文件内容
function processMarkdownFile(filePath) {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
return console.log('无法读取文件: ' + err);
}
// 使用正则表达式匹配 <https://ryanc.cc> 形式的链接
const updatedData = data.replace(/<https:\/\/[^\s]+>/g, match => {
const url = match.slice(1, -1); // 去掉尖括号
return `[${url}](${url})`;
});
// 将更新后的内容写回文件
fs.writeFile(filePath, updatedData, 'utf8', err => {
if (err) {
return console.log('无法写入文件: ' + err);
}
console.log(`已处理文件: ${filePath}`);
});
});
}
// 开始扫描目录
readDirectory(directoryPath);

@ -3,35 +3,17 @@
"version": "0.0.0", "version": "0.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"prepare": "husky install",
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build", "build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear", "clear": "docusaurus clear",
"deploy": "docusaurus deploy",
"docusaurus": "docusaurus",
"lint": "markdownlint-cli2 \"./docs/**/*.md\" \"./versioned_docs/**/*.md\"",
"prepare": "husky install",
"serve": "docusaurus serve", "serve": "docusaurus serve",
"write-translations": "docusaurus write-translations", "start": "docusaurus start",
"swizzle": "docusaurus swizzle",
"write-heading-ids": "docusaurus write-heading-ids", "write-heading-ids": "docusaurus write-heading-ids",
"lint": "markdownlint-cli2 \"./docs/**/*.md\" \"./versioned_docs/**/*.md\"" "write-translations": "docusaurus write-translations"
},
"dependencies": {
"@docusaurus/core": "2.4.1",
"@docusaurus/plugin-client-redirects": "^2.4.1",
"@docusaurus/preset-classic": "2.4.1",
"@docusaurus/theme-classic": "2.4.1",
"@docusaurus/theme-common": "2.4.1",
"@mdx-js/react": "^1.6.22",
"@svgr/webpack": "^5.5.0",
"clsx": "^1.2.1",
"docusaurus-plugin-image-zoom": "^1.0.1",
"file-loader": "^6.2.0",
"hast-util-is-element": "1.1.0",
"meilisearch-docsearch": "^0.6.0",
"prism-react-renderer": "^1.3.5",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"url-loader": "^4.1.1"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [
@ -45,12 +27,33 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"dependencies": {
"@docusaurus/core": "3.4.0",
"@docusaurus/plugin-client-redirects": "^3.4.0",
"@docusaurus/preset-classic": "3.4.0",
"@docusaurus/theme-classic": "3.4.0",
"@docusaurus/theme-common": "3.4.0",
"@mdx-js/react": "^3.0.0",
"@svgr/webpack": "^5.5.0",
"clsx": "^1.2.1",
"docusaurus-plugin-image-zoom": "^1.0.1",
"file-loader": "^6.2.0",
"hast-util-is-element": "1.1.0",
"meilisearch-docsearch": "^0.6.0",
"prism-react-renderer": "^2.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"url-loader": "^4.1.1"
},
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "^2.4.1", "@docusaurus/module-type-aliases": "^3.4.0",
"@swc/core": "^1.5.7", "@swc/core": "^1.5.7",
"husky": "^7.0.4", "husky": "^7.0.4",
"markdownlint": "^0.25.1", "markdownlint": "^0.25.1",
"markdownlint-cli2": "^0.4.0", "markdownlint-cli2": "^0.4.0",
"swc-loader": "^0.2.6" "swc-loader": "^0.2.6"
},
"engines": {
"node": ">=18.0"
} }
} }

File diff suppressed because it is too large Load Diff

@ -9,7 +9,7 @@ description: 问题反馈渠道及指南
## GitHub Issues ## GitHub Issues
链接:<https://github.com/halo-dev/halo/issues> 链接:[https://github.com/halo-dev/halo/issues](https://github.com/halo-dev/halo/issues)
如果你在使用过程中,遇到了一些 bug 或者需要添加某些新特性,请尽量在 GitHub Issues 进行反馈,这非常有助于我们跟踪解决此问题,您也可以很方便的接收到处理状态。 如果你在使用过程中,遇到了一些 bug 或者需要添加某些新特性,请尽量在 GitHub Issues 进行反馈,这非常有助于我们跟踪解决此问题,您也可以很方便的接收到处理状态。
@ -23,6 +23,6 @@ description: 问题反馈渠道及指南
## Halo 官方社区 ## Halo 官方社区
链接:<https://bbs.halo.run> 链接:[https://bbs.halo.run](https://bbs.halo.run)
此平台主要目的用于与其他 Halo 用户进行交流。但如果您对 GitHub 不是很熟悉或者没有账号,您也可以在此平台进行反馈。 此平台主要目的用于与其他 Halo 用户进行交流。但如果您对 GitHub 不是很熟悉或者没有账号,您也可以在此平台进行反馈。

@ -15,12 +15,12 @@ description: 如果 Halo 对你有帮助,不妨赞助我们
### 资金赞助 ### 资金赞助
- 爱发电:<https://afdian.com/a/halo-dev> - 爱发电:[https://afdian.com/a/halo-dev](https://afdian.com/a/halo-dev)
### 通过我们的推广链接购买服务器 ### 通过我们的推广链接购买服务器
如果你当前还没有购买服务器,可以考虑通过以下链接购买,这会为我们带来一部分收益。 如果你当前还没有购买服务器,可以考虑通过以下链接购买,这会为我们带来一部分收益。
- 阿里云:<https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo> - 阿里云:[https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo](https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=j57gyupo)
- 阿里云新人专享:<https://www.aliyun.com/minisite/goods?userCode=j57gyupo> - 阿里云新人专享:[https://www.aliyun.com/minisite/goods?userCode=j57gyupo](https://www.aliyun.com/minisite/goods?userCode=j57gyupo)
- 腾讯云:<https://curl.qcloud.com/9Ogon25Y> - 腾讯云:[https://curl.qcloud.com/9Ogon25Y](https://curl.qcloud.com/9Ogon25Y)

@ -34,7 +34,7 @@ git checkout v2.4.0
:::warning :::warning
从 2.4.0 开始Console 项目已经合并到 Halo 主项目,所以不再需要单独克隆 Console 的项目仓库。 从 2.4.0 开始Console 项目已经合并到 Halo 主项目,所以不再需要单独克隆 Console 的项目仓库。
详情可查阅:<https://github.com/halo-dev/halo/issues/3393> 详情可查阅:[https://github.com/halo-dev/halo/issues/3393](https://github.com/halo-dev/halo/issues/3393)
::: :::
## 构建 Console ## 构建 Console

@ -34,7 +34,7 @@ git clone git@github.com:halo-dev/halo.git
:::warning :::warning
从 2.4.0 开始Console 项目已经合并到 Halo 主项目,所以不再需要单独克隆 Console 的项目仓库。 从 2.4.0 开始Console 项目已经合并到 Halo 主项目,所以不再需要单独克隆 Console 的项目仓库。
详情可查阅:<https://github.com/halo-dev/halo/issues/3393> 详情可查阅:[https://github.com/halo-dev/halo/issues/3393](https://github.com/halo-dev/halo/issues/3393)
::: :::
## 运行 Console ## 运行 Console

@ -8,8 +8,8 @@ title: 表单定义
FormKit 相关文档: FormKit 相关文档:
- Form Schema: <https://formkit.com/essentials/schema> - Form Schema: [https://formkit.com/essentials/schema](https://formkit.com/essentials/schema)
- FormKit Inputs: <https://formkit.com/inputs> - FormKit Inputs: [https://formkit.com/inputs](https://formkit.com/inputs)
:::tip :::tip
目前不支持 FormKit Pro 中的输入组件,但 Halo 额外提供了部分输入组件,将在下面文档列出。 目前不支持 FormKit Pro 中的输入组件,但 Halo 额外提供了部分输入组件,将在下面文档列出。

@ -11,24 +11,24 @@ description: 这个例子展示了如何开发 Todo List 插件
1. 修改 `build.gradle` 中的 `group` 为你自己的,如: 1. 修改 `build.gradle` 中的 `group` 为你自己的,如:
```groovy ```groovy
group = 'run.halo.tutorial' group = 'run.halo.tutorial'
``` ```
2. 修改 `settings.gradle` 中的 `rootProject.name` 2. 修改 `settings.gradle` 中的 `rootProject.name`
```groovy ```groovy
rootProject.name = 'halo-plugin-todolist' rootProject.name = 'halo-plugin-todolist'
``` ```
3. 修改插件的描述文件 `plugin.yaml`,它位于 `src/main/resources/plugin.yaml`。示例: 3. 修改插件的描述文件 `plugin.yaml`,它位于 `src/main/resources/plugin.yaml`。示例:
```yaml ```yaml
apiVersion: plugin.halo.run/v1alpha1 apiVersion: plugin.halo.run/v1alpha1
kind: Plugin kind: Plugin
metadata: metadata:
name: todolist name: todolist
spec: spec:
enabled: true enabled: true
requires: ">=2.0.0" requires: ">=2.0.0"
author: author:
@ -40,7 +40,7 @@ description: 这个例子展示了如何开发 Todo List 插件
description: "插件开发的 hello world用于学习如何开发一个简单的 Halo 插件" description: "插件开发的 hello world用于学习如何开发一个简单的 Halo 插件"
license: license:
- name: "MIT" - name: "MIT"
``` ```
参考链接: 参考链接:
@ -82,9 +82,9 @@ description: 这个例子展示了如何开发 Todo List 插件
2. 然后在项目目录执行命令 2. 然后在项目目录执行命令
```shell ```shell
./gradlew build ./gradlew build
``` ```
3. 使用 `IntelliJ IDEA` 打开 Halo参考 [Halo 开发环境运行](../../core/run.md) 及 [插件入门](../hello-world.md) 配置插件的运行模式和路径: 3. 使用 `IntelliJ IDEA` 打开 Halo参考 [Halo 开发环境运行](../../core/run.md) 及 [插件入门](../hello-world.md) 配置插件的运行模式和路径:

@ -9,12 +9,12 @@ description: 了解如何构建你的第一个插件并在 Halo 中使用它。
1. 打开 [halo-dev/plugin-starter](https://github.com/halo-dev/plugin-starter)。 1. 打开 [halo-dev/plugin-starter](https://github.com/halo-dev/plugin-starter)。
> 这是一个插件的初始模板,你可以基于它来开发自己的插件。 > 这是一个插件的初始模板,你可以基于它来开发自己的插件。
2. 点击 `Use this template` -> `Create a new repository` 2. 点击 `Use this template` -> `Create a new repository`
3. 如图所示填写仓库名后点击 `Create repository from template` 3. 如图所示填写仓库名后点击 `Create repository from template`
![create-repository-for-hello-world-plugin](/img/create-repository-for-hello-world-plugin.png) ![create-repository-for-hello-world-plugin](/img/create-repository-for-hello-world-plugin.png)
你现在已经基于 Halo 插件模板创建了自己的存储库。接下来,你需要将它克隆到你的计算机上并使用 `IntelliJ IDEA` 打开它。 你现在已经基于 Halo 插件模板创建了自己的存储库。接下来,你需要将它克隆到你的计算机上并使用 `IntelliJ IDEA` 打开它。

@ -42,4 +42,4 @@ spec:
- `spec.homepage`:通常为插件的 GitHub 仓库链接,或可联系到插件作者或插件官网或帮助中心链接等。 - `spec.homepage`:通常为插件的 GitHub 仓库链接,或可联系到插件作者或插件官网或帮助中心链接等。
- `spec.displayName`:插件的显示名称,它通常是以少数几个字来概括插件的用途。 - `spec.displayName`:插件的显示名称,它通常是以少数几个字来概括插件的用途。
- `spec.description`:插件描述,用一段话来介绍插件的用途。 - `spec.description`:插件描述,用一段话来介绍插件的用途。
- `spec.license`:插件使用的软件协议,参考:<https://en.wikipedia.org/wiki/Software_license> - `spec.license`:插件使用的软件协议,参考:[https://en.wikipedia.org/wiki/Software_license](https://en.wikipedia.org/wiki/Software_license)

@ -73,7 +73,7 @@ spec:
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移配置文件。 为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移配置文件。
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next> 工具仓库地址:[https://github.com/halo-sigs/convert-theme-config-to-next](https://github.com/halo-sigs/convert-theme-config-to-next)
```bash ```bash
# 1.x 版本主题 # 1.x 版本主题

@ -48,7 +48,7 @@ categoryFinder.getByNames(names)
### 返回值 ### 返回值
List<[#CategoryVo](#categoryvo)> List\<[#CategoryVo](#categoryvo)\>
### 示例 ### 示例
@ -75,7 +75,7 @@ categoryFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<CategoryVo\>](#listresultcategoryvo) [#ListResult\<CategoryVo\>](#listresultcategoryvo)
### 示例 ### 示例
@ -103,7 +103,7 @@ categoryFinder.listAll()
### 返回值 ### 返回值
List<[#CategoryVo](#categoryvo)> List\<[#CategoryVo](#categoryvo)\>
### 示例 ### 示例
@ -131,7 +131,7 @@ categoryFinder.listAsTree()
### 返回值 ### 返回值
List<[#CategoryTreeVo](#categorytreevo)> List\<[#CategoryTreeVo](#categorytreevo)\>
### 示例 ### 示例
@ -162,7 +162,7 @@ List<[#CategoryTreeVo](#categorytreevo)>
<CategoryVo /> <CategoryVo />
### ListResult<CategoryVo\> ### ListResult\<CategoryVo\>
```json title="ListResult<CategoryVo>" ```json title="ListResult<CategoryVo>"
{ {

@ -53,7 +53,7 @@ commentFinder.list(ref,page,size)
### 返回值 ### 返回值
[#ListResult<CommentVo\>](#listresultcommentvo) [#ListResult\<CommentVo\>](#listresultcommentvo)
### 示例 ### 示例
@ -84,7 +84,7 @@ commentFinder.listReply(commentName,page,size)
### 返回值 ### 返回值
[#ListResult<ReplyVo\>](#listresultreplyvo) [#ListResult\<ReplyVo\>](#listresultreplyvo)
### 示例 ### 示例
@ -103,7 +103,7 @@ commentFinder.listReply(commentName,page,size)
<CommentVo /> <CommentVo />
### ListResult<CommentVo\> ### ListResult\<CommentVo\>
```json title="ListResult<CommentVo>" ```json title="ListResult<CommentVo>"
{ {
@ -125,7 +125,7 @@ commentFinder.listReply(commentName,page,size)
<ReplyVo /> <ReplyVo />
### ListResult<ReplyVo\> ### ListResult\<ReplyVo\>
```json title="ListResult<ReplyVo>" ```json title="ListResult<ReplyVo>"
{ {

@ -47,7 +47,7 @@ contributorFinder.getContributors(names)
### 返回值 ### 返回值
List<[#ContributorVo](#contributorvo)> List\<[#ContributorVo](#contributorvo)\>
### 示例 ### 示例

@ -115,7 +115,7 @@ postFinder.listAll();
### 返回值 ### 返回值
List<[#ListedPostVo](#listedpostvo)> List\<[#ListedPostVo](#listedpostvo)\>
### 示例 ### 示例
@ -144,7 +144,7 @@ postFinder.list(page, size);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -174,7 +174,7 @@ postFinder.listByCategory(page, size, categoryName);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -204,7 +204,7 @@ postFinder.listByTag(page, size, tag);
### 返回值 ### 返回值
[#ListResult<ListedPostVo\>](#listresultlistedpostvo) [#ListResult\<ListedPostVo\>](#listresultlistedpostvo)
### 示例 ### 示例
@ -233,7 +233,7 @@ postFinder.archives(page, size);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -271,7 +271,7 @@ postFinder.archives(page, size, year);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -310,7 +310,7 @@ postFinder.archives(page, size, year, month);
### 返回值 ### 返回值
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo) [#ListResult\<PostArchiveVo\>](#listresultpostarchivevo)
### 示例 ### 示例
@ -371,13 +371,13 @@ postFinder.archives(page, size, year, month);
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### ListResult<ListedPostVo\> ### ListResult\<ListedPostVo\>
```json title="ListResult<ListedPostVo>" ```json title="ListResult<ListedPostVo>"
{ {
@ -411,7 +411,7 @@ postFinder.archives(page, size, year, month);
- [#ListedPostVo](#listedpostvo) - [#ListedPostVo](#listedpostvo)
### ListResult<PostArchiveVo\> ### ListResult\<PostArchiveVo\>
```json title="ListResult<PostArchiveVo>" ```json title="ListResult<PostArchiveVo>"
{ {

@ -77,7 +77,7 @@ singlePageFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<ListedSinglePageVo\>](#listresultlistedsinglepagevo) [#ListResult\<ListedSinglePageVo\>](#listresultlistedsinglepagevo)
### 示例 ### 示例
@ -104,7 +104,7 @@ singlePageFinder.list(page,size)
<ListedSinglePageVo /> <ListedSinglePageVo />
### ListResult<ListedSinglePageVo\> ### ListResult\<ListedSinglePageVo\>
```json title="ListResult<ListedSinglePageVo>" ```json title="ListResult<ListedSinglePageVo>"
{ {

@ -47,7 +47,7 @@ tagFinder.getByNames(names)
### 返回值 ### 返回值
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
### 示例 ### 示例
@ -74,7 +74,7 @@ tagFinder.list(page,size)
### 返回值 ### 返回值
[#ListResult<TagVo\>](#listresulttagvo) [#ListResult\<TagVo\>](#listresulttagvo)
### 示例 ### 示例
@ -102,7 +102,7 @@ tagFinder.listAll()
### 返回值 ### 返回值
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
### 示例 ### 示例
@ -120,7 +120,7 @@ List<[#TagVo](#tagvo)>
<TagVo /> <TagVo />
### ListResult<TagVo\> ### ListResult\<TagVo\>
```json title="ListResult<TagVo>" ```json title="ListResult<TagVo>"
{ {

@ -119,7 +119,7 @@ Setting 资源的 `metadata.name` 必须和 `theme.yaml` 中的 `spec.settingNam
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移设置表单配置文件。 为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移设置表单配置文件。
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next> 工具仓库地址:[https://github.com/halo-sigs/convert-theme-config-to-next](https://github.com/halo-sigs/convert-theme-config-to-next)
```bash ```bash
# 1.x 版本主题 # 1.x 版本主题

@ -22,7 +22,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
#### 变量类型 #### 变量类型
[#UrlContextListResult<PostArchiveVo\>](#urlcontextlistresultpostarchivevo) [#UrlContextListResult\<PostArchiveVo\>](#urlcontextlistresultpostarchivevo)
#### 示例 #### 示例
@ -65,7 +65,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
@ -87,7 +87,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md";
- [#ListedPostVo](#listedpostvo) - [#ListedPostVo](#listedpostvo)
### UrlContextListResult<PostArchiveVo\> ### UrlContextListResult\<PostArchiveVo\>
```json title="UrlContextListResult<PostArchiveVo>" ```json title="UrlContextListResult<PostArchiveVo>"
{ {

@ -26,7 +26,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -77,13 +77,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -16,7 +16,7 @@ import CategoryTreeVo from "../vo/_CategoryTreeVo.md"
#### 变量类型 #### 变量类型
List<[#CategoryTreeVo](#categorytreevo)> List\<[#CategoryTreeVo](#categorytreevo)\>
#### 示例 #### 示例

@ -25,7 +25,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -78,13 +78,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -19,7 +19,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -71,13 +71,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -25,7 +25,7 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
#### 变量类型 #### 变量类型
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo) [#UrlContextListResult\<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
#### 示例 #### 示例
@ -78,13 +78,13 @@ import ListedPostVo from "../vo/_ListedPostVo.md"
### ListedPostVo ### ListedPostVo
<ListedPostVo /> \<ListedPostVo \/\>
- [#CategoryVo](#categoryvo) - [#CategoryVo](#categoryvo)
- [#TagVo](#tagvo) - [#TagVo](#tagvo)
- [#ContributorVo](#contributorvo) - [#ContributorVo](#contributorvo)
### UrlContextListResult<ListedPostVo\> ### UrlContextListResult\<ListedPostVo\>
```json title="UrlContextListResult<ListedPostVo>" ```json title="UrlContextListResult<ListedPostVo>"
{ {

@ -16,7 +16,7 @@ import TagVo from '../vo/_TagVo.md'
#### 变量类型 #### 变量类型
List<[#TagVo](#tagvo)> List\<[#TagVo](#tagvo)\>
#### 示例 #### 示例

@ -11,8 +11,8 @@ import DockerArgs from "./slots/_docker-args.md"
## 环境搭建 ## 环境搭建
- Docker 安装文档:<https://docs.docker.com/engine/install/> - Docker 安装文档:[https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
- Docker Compose 安装文档:<https://docs.docker.com/compose/install/> - Docker Compose 安装文档:[https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)
:::tip :::tip
我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。 我们推荐按照 Docker 官方文档安装 Docker 和 Docker Compose因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
@ -36,236 +36,237 @@ import DockerArgs from "./slots/_docker-args.md"
1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。 1. 在系统任意位置创建一个文件夹,此文档以 `~/halo` 为例。
```bash ```bash
mkdir ~/halo && cd ~/halo mkdir ~/halo && cd ~/halo
``` ```
:::info :::info
注意后续操作中Halo 产生的所有数据都会保存在这个目录,请妥善保存。 注意后续操作中Halo 产生的所有数据都会保存在这个目录,请妥善保存。
::: :::
2. 创建 `docker-compose.yaml` 2. 创建 `docker-compose.yaml`
此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要**选择一种**。 此文档提供两种场景的 Docker Compose 配置文件,请根据你的需要**选择一种**。
:::info :::info
需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。 需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。
::: :::
1. 创建 Halo + PostgreSQL 的实例: 1. 创建 Halo + PostgreSQL 的实例:
```yaml {24-30,47} title="~/halo/docker-compose.yaml" ```yaml {24-30,47} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: halohub/halo:2.10 image: halohub/halo:2.10
container_name: halo container_name: halo
restart: on-failure:3 restart: on-failure:3
depends_on: depends_on:
halodb: halodb:
condition: service_healthy condition: service_healthy
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo - --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql - --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql - --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
halodb: halodb:
image: postgres:15.4 image: postgres:15.4
container_name: halodb container_name: halodb
restart: on-failure:3 restart: on-failure:3
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./db:/var/lib/postgresql/data - ./db:/var/lib/postgresql/data
ports: ports:
- "5432:5432" - "5432:5432"
healthcheck: healthcheck:
test: [ "CMD", "pg_isready" ] test: [ "CMD", "pg_isready" ]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
environment: environment:
- POSTGRES_PASSWORD=openpostgresql - POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo - POSTGRES_USER=halo
- POSTGRES_DB=halo - POSTGRES_DB=halo
- PGUSER=halo - PGUSER=halo
networks: networks:
halo_network: halo_network:
``` ```
2. 创建 Halo + MySQL 的实例: 2. 创建 Halo + MySQL 的实例:
```yaml {24-30,55} title="~/halo/docker-compose.yaml" ```yaml {24-30,55} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: halohub/halo:2.10 image: halohub/halo:2.10
container_name: halo container_name: halo
restart: on-failure:3 restart: on-failure:3
depends_on: depends_on:
halodb: halodb:
condition: service_healthy condition: service_healthy
networks: networks:
halo_network: halo_network:
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root - --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=o#DwN&JSa56 - --spring.r2dbc.password=o#DwN&JSa56
- --spring.sql.init.platform=mysql - --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
halodb: halodb:
image: mysql:8.1.0 image: mysql:8.1.0
container_name: halodb container_name: halodb
restart: on-failure:3 restart: on-failure:3
networks: networks:
halo_network: halo_network:
command: command:
- --default-authentication-plugin=caching_sha2_password - --default-authentication-plugin=caching_sha2_password
- --character-set-server=utf8mb4 - --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci - --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true - --explicit_defaults_for_timestamp=true
volumes: volumes:
- ./mysql:/var/lib/mysql - ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup - ./mysqlBackup:/data/mysqlBackup
ports: ports:
- "3306:3306" - "3306:3306"
healthcheck: healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s interval: 3s
retries: 5 retries: 5
start_period: 30s start_period: 30s
environment: environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56 - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo - MYSQL_DATABASE=halo
networks: networks:
halo_network: halo_network:
``` ```
3. 仅创建 Halo 实例(使用默认的 H2 数据库): 3. 仅创建 Halo 实例(使用默认的 H2 数据库):
:::caution :::warning
不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。 不推荐在生产环境使用默认的 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。
::: :::
```yaml {19-24} title="~/halo/docker-compose.yaml" ```yaml {19-24} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: halohub/halo:2.10 image: halohub/halo:2.10
container_name: halo container_name: halo
restart: on-failure:3 restart: on-failure:3
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
ports: ports:
- "8090:8090" - "8090:8090"
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 30s start_period: 30s
command: command:
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
``` ```
4. 仅创建 Halo 实例使用已有外部数据库MySQL 为例): 4. 仅创建 Halo 实例使用已有外部数据库MySQL 为例):
```yaml {8,12-20} title="~/halo/docker-compose.yaml" ```yaml {8,12-20} title="~/halo/docker-compose.yaml"
version: "3" version: "3"
services: services:
halo: halo:
image: halohub/halo:2.10 image: halohub/halo:2.10
container_name: halo container_name: halo
restart: on-failure:3 restart: on-failure:3
network_mode: "host" network_mode: "host"
volumes: volumes:
- ./halo2:/root/.halo2 - ./halo2:/root/.halo2
command: command:
# 修改为自己已有的 MySQL 配置 # 修改为自己已有的 MySQL 配置
- --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo - --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo
- --spring.r2dbc.username=root - --spring.r2dbc.username=root
- --spring.r2dbc.password= - --spring.r2dbc.password=
- --spring.sql.init.platform=mysql - --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改 # 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/ - --halo.external-url=http://localhost:8090/
# 端口号 默认8090 # 端口号 默认8090
- --server.port=8090 - --server.port=8090
``` ```
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
3. 启动 Halo 服务 3. 启动 Halo 服务
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
实时查看日志: 实时查看日志:
```bash ```bash
docker-compose logs -f docker-compose logs -f
``` ```
4. 用浏览器访问 /console 即可进入 Halo 管理页面,首次启动会进入初始化页面。 4. 用浏览器访问 /console 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 更新容器组 ## 更新容器组
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 更新 Halo 服务 2. 更新 Halo 服务
修改 `docker-compose.yaml` 中配置的镜像版本。 修改 `docker-compose.yaml` 中配置的镜像版本。
```yaml {3} ```yaml {3}
services: services:
halo: halo:
image: halohub/halo:2.10 image: halohub/halo:2.10
container_name: halo container_name: halo
``` ```
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
## 反向代理 ## 反向代理

@ -9,7 +9,7 @@ import DockerArgs from "./slots/_docker-args.md"
在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。 在继续操作之前,我们推荐您先阅读[《写在前面》](../prepare),这可以快速帮助你了解 Halo。
::: :::
:::caution :::warning
此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。 此文档仅提供使用默认 H2 数据库的 Docker 运行方式,主要用于体验和测试,在生产环境我们不推荐使用 H2 数据库,这可能因为操作不当导致数据文件损坏。如果因为某些原因(如内存不足以运行独立数据库)必须要使用,建议按时[备份数据](../../user-guide/backup.md)。
如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose) 如果需要使用其他数据库部署,我们推荐使用 Docker Compose 部署:[使用 Docker Compose 部署](./docker-compose)
@ -17,7 +17,7 @@ import DockerArgs from "./slots/_docker-args.md"
## 环境搭建 ## 环境搭建
- Docker 安装文档:<https://docs.docker.com/engine/install/> - Docker 安装文档:[https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
:::tip :::tip
我们推荐按照 Docker 官方文档安装 Docker因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。 我们推荐按照 Docker 官方文档安装 Docker因为部分 Linux 发行版软件仓库中的 Docker 版本可能过旧。
@ -41,50 +41,50 @@ import DockerArgs from "./slots/_docker-args.md"
1. 创建容器 1. 创建容器
```bash ```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10 docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
``` ```
:::info :::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose) 注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose)
::: :::
- **-it**:开启输入功能并连接伪终端 - **-it**:开启输入功能并连接伪终端
- **-d**:后台运行容器 - **-d**:后台运行容器
- **--name**:为容器指定一个名称 - **--name**:为容器指定一个名称
- **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。 - **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。 - **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
1. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。 2. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 升级版本 ## 升级版本
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 拉取新版本镜像 2. 拉取新版本镜像
```bash ```bash
docker pull halohub/halo:2.10 docker pull halohub/halo:2.10
``` ```
3. 停止运行中的容器 3. 停止运行中的容器
```bash ```bash
docker stop halo docker stop halo
docker rm halo docker rm halo
``` ```
4. 更新 Halo 4. 更新 Halo
修改版本号后,按照最初安装的方式,重新创建容器即可。 修改版本号后,按照最初安装的方式,重新创建容器即可。
```bash ```bash
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10 docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
``` ```

@ -25,7 +25,7 @@ Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续
> 说明:默认你的服务器已经安装了 Docker 和 Docker Compose如果你没有安装可以参考[使用 Docker Compose 部署](../docker-compose) 的环境搭建部分来进行安装。 > 说明:默认你的服务器已经安装了 Docker 和 Docker Compose如果你没有安装可以参考[使用 Docker Compose 部署](../docker-compose) 的环境搭建部分来进行安装。
点击下方链接进入 Nginx Proxy Manager以下简称 NPM 官网:<https://nginxproxymanager.com/> 点击下方链接进入 Nginx Proxy Manager以下简称 NPM 官网:[https://nginxproxymanager.com/](https://nginxproxymanager.com/)
我们可以直接选择 [快速安装](https://nginxproxymanager.com/guide/#quick-setup)。 我们可以直接选择 [快速安装](https://nginxproxymanager.com/guide/#quick-setup)。

@ -26,7 +26,7 @@ description: 使用 Traefik 管理 Halo 服务的反向代理
3. 开启 Traefik Dashboard建议使用二级域名的形式示例`traefik.yourdomain.com`)。[文档](https://doc.traefik.io/traefik/operations/dashboard/#dashboard-router-rule) 3. 开启 Traefik Dashboard建议使用二级域名的形式示例`traefik.yourdomain.com`)。[文档](https://doc.traefik.io/traefik/operations/dashboard/#dashboard-router-rule)
4. 开启证书自动生成,通过 ACME 自动管理 TLS 证书的申请、校验与续期。[文档](https://doc.traefik.io/traefik/https/acme/) 4. 开启证书自动生成,通过 ACME 自动管理 TLS 证书的申请、校验与续期。[文档](https://doc.traefik.io/traefik/https/acme/)
:::caution :::warning
ACME 证书 (`/acme.json`) 一定要 [持久化](https://doc.traefik.io/traefik/https/acme/#storage),否则每次重启 Traefik 服务,都会去申请签发证书。可能会触发 Let's ACME 证书 (`/acme.json`) 一定要 [持久化](https://doc.traefik.io/traefik/https/acme/#storage),否则每次重启 Traefik 服务,都会去申请签发证书。可能会触发 Let's
Encrypt 的 [速率限制](https://letsencrypt.org/zh-cn/docs/rate-limits/),导致签名的域名一段时间内无法签发新的证书。 Encrypt 的 [速率限制](https://letsencrypt.org/zh-cn/docs/rate-limits/),导致签名的域名一段时间内无法签发新的证书。
::: :::

@ -36,7 +36,7 @@ Podman 采用无守护进程的包容性架构,因此可以更安全、更简
## 环境搭建 ## 环境搭建
- Podman 安装文档:<https://podman.io/docs/installation> - Podman 安装文档:[https://podman.io/docs/installation](https://podman.io/docs/installation)
:::tip :::tip
我们推荐您先阅读 Podman 官方文档对 Podman 有了相关了解后再考虑通过Linux包管理系统安装 Podman 或者使用文档中指定的方式安装 。 我们推荐您先阅读 Podman 官方文档对 Podman 有了相关了解后再考虑通过Linux包管理系统安装 Podman 或者使用文档中指定的方式安装 。
@ -66,50 +66,50 @@ Podman 采用无守护进程的包容性架构,因此可以更安全、更简
1. 创建容器 1. 创建容器
```bash ```bash
mkdir -p ~/.halo2 mkdir -p ~/.halo2
podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10 podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
``` ```
:::info :::info
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose) 注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL请参考[使用 Docker Compose 部署](./docker-compose)
::: :::
- **-it**:开启输入功能并连接伪终端 - **-it**:开启输入功能并连接伪终端
- **-d**:后台运行容器 - **-d**:后台运行容器
- **--name**:为容器指定一个名称 - **--name**:为容器指定一个名称
- **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。 - **-p**:端口映射,格式为 `主机(宿主)端口:容器端口` ,可在 `application.yaml` 配置。
- **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。 - **-v**:工作目录映射。形式为:`-v 宿主机路径:/root/.halo2`,后者不能修改。
运行参数详解: 运行参数详解:
<DockerArgs /> <DockerArgs />
1. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。 2. 用浏览器访问 `/console` 即可进入 Halo 管理页面,首次启动会进入初始化页面。
:::tip :::tip
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。 如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 `http://ip:端口号` 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
::: :::
## 升级版本 ## 升级版本
1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。 1. 备份数据,可以参考 [备份与恢复](../../user-guide/backup.md) 进行完整备份。
2. 拉取新版本镜像 2. 拉取新版本镜像
```bash ```bash
podman pull halohub/halo:2.10 podman pull halohub/halo:2.10
``` ```
3. 停止运行中的容器 3. 停止运行中的容器
```bash ```bash
podman stop halo podman stop halo
podman rm halo podman rm halo
``` ```
4. 更新 Halo 4. 更新 Halo
修改版本号后,按照最初安装的方式,重新创建容器即可。 修改版本号后,按照最初安装的方式,重新创建容器即可。
```bash ```bash
podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10 podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
@ -124,50 +124,50 @@ Podman 没有和 Docker 类似的管理进程,在低配置的主机上更友
下面是一个使用 Podstgresql 数据库的示例: 下面是一个使用 Podstgresql 数据库的示例:
```bash ```bash
mkdir -p /opt/podman-data/halo mkdir -p /opt/podman-data/halo
mkdir -p /etc/containers/systemd mkdir -p /etc/containers/systemd
vim /etc/containers/systemd/halo.container vim /etc/containers/systemd/halo.container
``` ```
```conf ```conf
[Unit] [Unit]
Description=The halo container Description=The halo container
Wants=network-online.target Wants=network-online.target
After=network-online.target After=network-online.target
[Container] [Container]
AutoUpdate=registry AutoUpdate=registry
ContainerName=halo ContainerName=halo
User=60000 User=60000
Group=60000 Group=60000
UserNS=keep-id:uid=60000,gid=60000 UserNS=keep-id:uid=60000,gid=60000
Environment=JVM_OPTS="-Xmx512m -Xms256m" Environment=JVM_OPTS="-Xmx512m -Xms256m"
Environment=HALO_WORK_DIR="/.halo" Environment=HALO_WORK_DIR="/.halo"
Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/" Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"
Environment=TZ=Asia/Shanghai Environment=TZ=Asia/Shanghai
Volume=/opt/podman-data/halo:/.halo Volume=/opt/podman-data/halo:/.halo
PublishPort=127.0.0.1:8090:8090 PublishPort=127.0.0.1:8090:8090
Image=ghcr.io/halo-dev/halo:2.10 Image=ghcr.io/halo-dev/halo:2.10
Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password --halo.cache.page.disabled=false Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password --halo.cache.page.disabled=false
[Service] [Service]
Restart=always Restart=always
RestartSec=30s RestartSec=30s
StartLimitInterval=30 StartLimitInterval=30
TimeoutStartSec=900 TimeoutStartSec=900
TimeoutStopSec=70 TimeoutStopSec=70
[Install] [Install]
WantedBy=multi-user.target default.target WantedBy=multi-user.target default.target
``` ```
```bash ```bash
systemctl daemon-reload systemctl daemon-reload
systemctl start halo systemctl start halo
# 只需要systemctl start halo. # 只需要systemctl start halo.
# 之后重启会自动启动不需要enable服务. # 之后重启会自动启动不需要enable服务.
``` ```
Podman Quadlet 解析: Podman Quadlet 解析:
@ -202,34 +202,34 @@ Podman Quadlet 解析:
使用默认的 root 用户运行时无需定义 `User=60000 Group=60000 UserNS=keep-id:uid=60000,gid=60000``Environment=HALO_WORK_DIR="/.halo"` `Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"` 使用默认的 root 用户运行时无需定义 `User=60000 Group=60000 UserNS=keep-id:uid=60000,gid=60000``Environment=HALO_WORK_DIR="/.halo"` `Environment=SPRING_CONFIG_LOCATION="optional:classpath:/;optional:file:/.halo/"`
示例: 示例:
```bash ```bash
mkdir -p /opt/podman-data/halo mkdir -p /opt/podman-data/halo
mkdir -p /etc/containers/systemd mkdir -p /etc/containers/systemd
vim /etc/containers/systemd/halo.container vim /etc/containers/systemd/halo.container
``` ```
```conf ```conf
# /etc/containers/systemd/halo.container # /etc/containers/systemd/halo.container
[Unit] [Unit]
Description=The halo container Description=The halo container
Wants=network-online.target Wants=network-online.target
After=network-online.target After=network-online.target
[Container] [Container]
AutoUpdate=registry AutoUpdate=registry
ContainerName=halo ContainerName=halo
Volume=/opt/podman-data/halo:/root/.halo Volume=/opt/podman-data/halo:/root/.halo
PublishPort=127.0.0.1:8090:8090 PublishPort=127.0.0.1:8090:8090
Image=ghcr.io/halo-dev/halo:2.10 Image=ghcr.io/halo-dev/halo:2.10
Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password --halo.cache.page.disabled=false Exec=--halo.external-url=https://localhost:8090 --spring.sql.init.platform=postgresql --spring.r2dbc.url=r2dbc:pool:postgresql://127.0.0.1:5432/my-db --spring.r2dbc.username=my-user --spring.r2dbc.password=my-password --halo.cache.page.disabled=false
[Service] [Service]
Restart=always Restart=always
RestartSec=30s RestartSec=30s
StartLimitInterval=30 StartLimitInterval=30
TimeoutStartSec=900 TimeoutStartSec=900
TimeoutStopSec=70 TimeoutStopSec=70
[Install] [Install]
WantedBy=multi-user.target default.target WantedBy=multi-user.target default.target
``` ```

@ -8,21 +8,21 @@ description: 从 Halo 1.x 迁移的完整指南和注意事项
- Halo 版本必须为 1.5.x 或 1.6.x。如果不满足需要先升级到 1.5.x 或 1.6.x 版本。 - Halo 版本必须为 1.5.x 或 1.6.x。如果不满足需要先升级到 1.5.x 或 1.6.x 版本。
- Halo 2.0 不兼容 1.x 的主题,建议在升级前先查询你正在使用的主题是否已经支持 2.0。你可以访问 [halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo) 或 [应用市场](https://halo.run/store/apps?type=THEME) 查阅目前支持的主题。 - Halo 2.0 不兼容 1.x 的主题,建议在升级前先查询你正在使用的主题是否已经支持 2.0。你可以访问 [halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo) 或 [应用市场](https://halo.run/store/apps?type=THEME) 查阅目前支持的主题。
- Halo 2.0 目前没有内置 Markdown 编辑器,如果需要重新编辑迁移后的文章,需要额外安装 Markdown 编辑器插件。目前社区已经提供了以下插件: - Halo 2.0 目前没有内置 Markdown 编辑器,如果需要重新编辑迁移后的文章,需要额外安装 Markdown 编辑器插件。目前社区已经提供了以下插件:
- StackEdit<https://halo.run/store/apps/app-hDXMG> - StackEdit[https://halo.run/store/apps/app-hDXMG](https://halo.run/store/apps/app-hDXMG)
- ByteMD<https://halo.run/store/apps/app-HTyhC> - ByteMD[https://halo.run/store/apps/app-HTyhC](https://halo.run/store/apps/app-HTyhC)
- Halo 2.0 不再内置友情链接、日志、图库等模块,需要安装额外的插件,目前官方已提供: - Halo 2.0 不再内置友情链接、日志、图库等模块,需要安装额外的插件,目前官方已提供:
- 链接管理:<https://halo.run/store/apps/app-hfbQg> - 链接管理:[https://halo.run/store/apps/app-hfbQg](https://halo.run/store/apps/app-hfbQg)
- 图库:<https://halo.run/store/apps/app-BmQJW> - 图库:[https://halo.run/store/apps/app-BmQJW](https://halo.run/store/apps/app-BmQJW)
- 瞬间(原日志):<https://halo.run/store/apps/app-SnwWD> - 瞬间(原日志):[https://halo.run/store/apps/app-SnwWD](https://halo.run/store/apps/app-SnwWD)
- Halo 2.0 不再内置外部云存储的支持。需要安装额外的插件,目前官方已提供: - Halo 2.0 不再内置外部云存储的支持。需要安装额外的插件,目前官方已提供:
- S3兼容国内主流的云存储<https://halo.run/store/apps/app-Qxhpp> - S3兼容国内主流的云存储[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
- 阿里云 OSS<https://halo.run/store/apps/app-wCJCD> - 阿里云 OSS[https://halo.run/store/apps/app-wCJCD](https://halo.run/store/apps/app-wCJCD)
- 在迁移过程中不会保留旧版本的用户数据,迁移完成之后,关于文章等数据的关联都将改为 Halo 2.0 的新用户。 - 在迁移过程中不会保留旧版本的用户数据,迁移完成之后,关于文章等数据的关联都将改为 Halo 2.0 的新用户。
- 为了防止直接升级 2.0 导致 1.x 的数据受到破坏,我们已经将工作目录由 `~/.halo` 变更为 `~/.halo2` - 为了防止直接升级 2.0 导致 1.x 的数据受到破坏,我们已经将工作目录由 `~/.halo` 变更为 `~/.halo2`
- 目前 Halo 2.0 仅提供 Docker 部署方式,没有提供可执行 JAR 包,但可以自编译,请参考 [构建](../developer-guide/core/build.md) 文档 - 目前 Halo 2.0 仅提供 Docker 部署方式,没有提供可执行 JAR 包,但可以自编译,请参考 [构建](../developer-guide/core/build.md) 文档
- 可以考虑先在本地运行一个 Halo 2.0,模拟一下导入,检查导入后是否满足要求。 - 可以考虑先在本地运行一个 Halo 2.0,模拟一下导入,检查导入后是否满足要求。
如果遇到了迁移过程中的问题,也可以向我们提交 Issue: <https://github.com/halo-dev/halo/issues/new/choose>,以上暂不支持的功能我们也会陆续完善。 如果遇到了迁移过程中的问题,也可以向我们提交 Issue: [https://github.com/halo-dev/halo/issues/new/choose](https://github.com/halo-dev/halo/issues/new/choose),以上暂不支持的功能我们也会陆续完善。
## 备份数据 ## 备份数据
@ -54,11 +54,11 @@ description: 从 Halo 1.x 迁移的完整指南和注意事项
在迁移过程中,需要提前安装必要的插件: 在迁移过程中,需要提前安装必要的插件:
- 站点迁移:<https://halo.run/store/apps/app-TlUBt> - 站点迁移:[https://halo.run/store/apps/app-TlUBt](https://halo.run/store/apps/app-TlUBt)
- 链接管理:<https://halo.run/store/apps/app-hfbQg> - 链接管理:[https://halo.run/store/apps/app-hfbQg](https://halo.run/store/apps/app-hfbQg)
- 图库:<https://halo.run/store/apps/app-BmQJW> - 图库:[https://halo.run/store/apps/app-BmQJW](https://halo.run/store/apps/app-BmQJW)
- 瞬间(原日志):<https://halo.run/store/apps/app-SnwWD> - 瞬间(原日志):[https://halo.run/store/apps/app-SnwWD](https://halo.run/store/apps/app-SnwWD)
- S3如果需要迁移存在云存储的附件需要安装<https://halo.run/store/apps/app-Qxhpp> - S3如果需要迁移存在云存储的附件需要安装[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
## 配置存储策略 ## 配置存储策略

@ -37,12 +37,12 @@ slug: /
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10 docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
``` ```
以上仅作为体验使用,详细部署文档请查阅:<https://docs.halo.run/getting-started/install/docker-compose> 以上仅作为体验使用,详细部署文档请查阅:[https://docs.halo.run/getting-started/install/docker-compose](https://docs.halo.run/getting-started/install/docker-compose)
## 在线体验 ## 在线体验
- 环境地址:<https://demo.halo.run> - 环境地址:[https://demo.halo.run](https://demo.halo.run)
- 后台地址:<https://demo.halo.run/console> - 后台地址:[https://demo.halo.run/console](https://demo.halo.run/console)
- 用户名:`demo` - 用户名:`demo`
- 密码:`P@ssw0rd123..` - 密码:`P@ssw0rd123..`

@ -12,8 +12,8 @@ Halo 默认提供了本地的存储策略类型,你还可以通过安装插件
:::info :::info
目前 Halo 官方维护了两个存储策略插件,可以根据需要选择安装: 目前 Halo 官方维护了两个存储策略插件,可以根据需要选择安装:
1. 阿里云 OSS<https://halo.run/store/apps/app-wCJCD> 1. 阿里云 OSS[https://halo.run/store/apps/app-wCJCD](https://halo.run/store/apps/app-wCJCD)
2. Amazon S3 协议(主流云存储厂商均支持):<https://halo.run/store/apps/app-Qxhpp> 2. Amazon S3 协议(主流云存储厂商均支持):[https://halo.run/store/apps/app-Qxhpp](https://halo.run/store/apps/app-Qxhpp)
::: :::
你可以点击附件页面右上角的 `存储策略` 按钮对存储策略进行管理。 你可以点击附件页面右上角的 `存储策略` 按钮对存储策略进行管理。

@ -58,6 +58,6 @@ Halo 作为一款好用又强大的开源建站工具,配合上不同的模板
:::info :::info
目前有两个官方渠道可以获取主题和插件: 目前有两个官方渠道可以获取主题和插件:
- 应用市场:<https://halo.run/store/apps> - 应用市场:[https://halo.run/store/apps](https://halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::

@ -21,41 +21,41 @@ docker logs halo | grep 'Generated random password:' | tail -1
1. 停止 Halo 服务 1. 停止 Halo 服务
```bash ```bash
docker stop halo docker stop halo
``` ```
2. 连接 Halo 使用的数据库,删除管理员的用户记录(配置文件中的 `halo.security.initializer.superadminusername`),这里以 `admin` 为例 2. 连接 Halo 使用的数据库,删除管理员的用户记录(配置文件中的 `halo.security.initializer.superadminusername`),这里以 `admin` 为例
以容器化部署的 PostgreSQL 为例,假设容器名称为 `halo_db` 以容器化部署的 PostgreSQL 为例,假设容器名称为 `halo_db`
```bash ```bash
# 进入 psql 命令行 # 进入 psql 命令行
docker exec -it halo_db psql halo docker exec -it halo_db psql halo
# 执行下面的 SQL 删除 admin 用户记录 # 执行下面的 SQL 删除 admin 用户记录
delete from extensions where name like '/registry/users/admin'; delete from extensions where name like '/registry/users/admin';
``` ```
:::info :::info
其他类型的数据库处理方式类似,先通过命令行或数据库连接工具连接到数据库后,再执行上面的 `delete` SQL 语句。 其他类型的数据库处理方式类似,先通过命令行或数据库连接工具连接到数据库后,再执行上面的 `delete` SQL 语句。
::: :::
3. 重新启动 Halo 服务 3. 重新启动 Halo 服务
```bash ```bash
docker start halo docker start halo
``` ```
4. 登录 Halo 控制台 4. 登录 Halo 控制台
如果部署时通过 `halo.security.initializer.superadminusername``halo.security.initializer.superadminpassword` 参数指定了初始化用户名和密码,使用该用户名密码登录控制台。 如果部署时通过 `halo.security.initializer.superadminusername``halo.security.initializer.superadminpassword` 参数指定了初始化用户名和密码,使用该用户名密码登录控制台。
如果未指定该配置,则默认用户名为 `admin`,默认密码将打印在 Halo 容器日志中,可以通过如下命令查看。
```bash 如果未指定该配置,则默认用户名为 `admin`,默认密码将打印在 Halo 容器日志中,可以通过如下命令查看。
docker logs halo | grep 'Generated random password:' | tail -1
``` ```bash
docker logs halo | grep 'Generated random password:' | tail -1
```
### 附件上传提示 `413 Request Entity Too Large` 如何解决? ### 附件上传提示 `413 Request Entity Too Large` 如何解决?
@ -116,12 +116,12 @@ server {
1. 可以在 Console 端的概览页面下载最近的日志文件。 1. 可以在 Console 端的概览页面下载最近的日志文件。
2. 使用 docker logs 命令进行查看。 2. 使用 docker logs 命令进行查看。
```bash ```bash
# '-f' 滚动更新日志 # '-f' 滚动更新日志
# '-n 200' 从倒数第200行开始查看 # '-n 200' 从倒数第200行开始查看
# 更多帮助可以查看 'docker logs --help' # 更多帮助可以查看 'docker logs --help'
docker logs -f halo -n 200 docker logs -f halo -n 200
``` ```
### 前台样式丢失,如何解决? ### 前台样式丢失,如何解决?
@ -130,10 +130,10 @@ server {
1. 后台设置的 `博客地址` 与实际访问地址不一致。也可能是开启了 https 之后,无法正常加载 http 资源,将 `博客地址` 改为 https 协议即可。 1. 后台设置的 `博客地址` 与实际访问地址不一致。也可能是开启了 https 之后,无法正常加载 http 资源,将 `博客地址` 改为 https 协议即可。
2. Nginx 配置了静态资源缓存,但没有设置 `proxy_pass`,参考如下: 2. Nginx 配置了静态资源缓存,但没有设置 `proxy_pass`,参考如下:
```nginx ```nginx
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
proxy_pass http://halo; proxy_pass http://halo;
expires 30d; expires 30d;
access_log off; access_log off;
} }
``` ```

@ -10,8 +10,8 @@ description: 插件管理相关功能说明
:::info :::info
目前有两个官方渠道可以获取插件: 目前有两个官方渠道可以获取插件:
- 应用市场:<https://halo.run/store/apps> - 应用市场:[https://halo.run/store/apps](https://halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::
## 安装插件 ## 安装插件

@ -21,8 +21,8 @@ description: 文章管理相关功能说明
:::info :::info
Halo 支持通过插件来拓展文章编辑器,目前 Halo 官方维护了另外两款编辑器插件,可以按需安装使用: Halo 支持通过插件来拓展文章编辑器,目前 Halo 官方维护了另外两款编辑器插件,可以按需安装使用:
1. StackEdit<https://halo.run/store/apps/app-hDXMG> 1. StackEdit[https://halo.run/store/apps/app-hDXMG](https://halo.run/store/apps/app-hDXMG)
2. ByteMD<https://halo.run/store/apps/app-HTyhC> 2. ByteMD[https://halo.run/store/apps/app-HTyhC](https://halo.run/store/apps/app-HTyhC)
::: :::
## 文章设置 ## 文章设置

@ -8,8 +8,8 @@ description: 主题管理相关功能说明
:::info :::info
目前有两个官方渠道可以获取主题: 目前有两个官方渠道可以获取主题:
- 应用市场:<https://halo.run/store/apps> - 应用市场:[https://halo.run/store/apps](https://halo.run/store/apps)
- Awesome Halo<https://github.com/halo-sigs/awesome-halo> - Awesome Halo[https://github.com/halo-sigs/awesome-halo](https://github.com/halo-sigs/awesome-halo)
::: :::
## 安装主题 ## 安装主题

@ -97,7 +97,7 @@ Halo 提供了全新创建和基于已有角色创建两种角色创建方式。
:::info :::info
目前 Halo 官方提供的身份认证插件: 目前 Halo 官方提供的身份认证插件:
- OAuth2 认证:<https://halo.run/store/apps/app-ESVDK> - OAuth2 认证:[https://halo.run/store/apps/app-ESVDK](https://halo.run/store/apps/app-ESVDK)
::: :::
你可以在用户管理界面的右上角点击 `身份认证` 按钮,进入身份认证管理页面。 你可以在用户管理界面的右上角点击 `身份认证` 按钮,进入身份认证管理页面。

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save