diff --git a/404.html b/404.html
index 7955302d..c2ddcf87 100644
--- a/404.html
+++ b/404.html
@@ -1 +1 @@
-
404: This page could not be found404
This page could not be found.
\ No newline at end of file
+404: This page could not be found404
This page could not be found.
\ No newline at end of file
diff --git a/_next/static/q6vnYXmQjKt4ngHOQiFe7/_buildManifest.js b/_next/static/1zO73xAILQeCTg3qgONcH/_buildManifest.js
similarity index 93%
rename from _next/static/q6vnYXmQjKt4ngHOQiFe7/_buildManifest.js
rename to _next/static/1zO73xAILQeCTg3qgONcH/_buildManifest.js
index 35044221..e5583b8e 100644
--- a/_next/static/q6vnYXmQjKt4ngHOQiFe7/_buildManifest.js
+++ b/_next/static/1zO73xAILQeCTg3qgONcH/_buildManifest.js
@@ -1 +1 @@
-self.__BUILD_MANIFEST=function(s){return{__rewrites:{beforeFiles:[],afterFiles:[{source:"/:path*/_meta",destination:"/404"}],fallback:[]},"/":[s,"static/chunks/343-9b9bc361294c2765.js","static/css/e68b73cab80c6d1b.css","static/chunks/pages/index-598eb6a65ebd0988.js"],"/_error":["static/chunks/pages/_error-b56819d0c5bcf883.js"],"/development":[s,"static/chunks/pages/development-5535cb8a1ecdacff.js"],"/development/frontend":[s,"static/chunks/pages/development/frontend-381fe0bb96f99443.js"],"/docs":[s,"static/chunks/pages/docs-be9cdbe6ca1dff45.js"],"/docs/advanced":[s,"static/chunks/pages/docs/advanced-c5de161a49e71f03.js"],"/docs/community":[s,"static/chunks/pages/docs/community-e8fbadc4aa043be7.js"],"/docs/docker":[s,"static/chunks/pages/docs/docker-65c96e9ed5728fb4.js"],"/docs/features":[s,"static/chunks/pages/docs/features-4eda84378b96b0b5.js"],"/docs/scripts":[s,"static/chunks/pages/docs/scripts-e16f6a5ca885660e.js"],"/themes":[s,"static/chunks/pages/themes-a65cd342485614a7.js"],"/themes/kami":[s,"static/chunks/pages/themes/kami-e5a27cc90eef2ca8.js"],"/themes/shiro":[s,"static/chunks/pages/themes/shiro-5d05126d70ab3573.js"],"/themes/shiro/extra":[s,"static/chunks/pages/themes/shiro/extra-b4fc3bc9faeaf031.js"],"/themes/yun":[s,"static/chunks/pages/themes/yun-60cf591672d2d522.js"],"/usage":[s,"static/chunks/pages/usage-a2fab104296cfc4f.js"],"/usage/macros":[s,"static/chunks/pages/usage/macros-4ad1725a69b4f6e0.js"],"/usage/search":[s,"static/chunks/pages/usage/search-9815091c1e91d7a8.js"],"/usage/serverless":[s,"static/chunks/pages/usage/serverless-58c28758c861f13b.js"],"/usage/xlog":[s,"static/chunks/pages/usage/xlog-81491f4aa1e04149.js"],sortedPages:["/","/_app","/_error","/development","/development/frontend","/docs","/docs/advanced","/docs/community","/docs/docker","/docs/features","/docs/scripts","/themes","/themes/kami","/themes/shiro","/themes/shiro/extra","/themes/yun","/usage","/usage/macros","/usage/search","/usage/serverless","/usage/xlog"]}}("static/chunks/48-c59c1f922cbfc0f3.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
\ No newline at end of file
+self.__BUILD_MANIFEST=function(s){return{__rewrites:{beforeFiles:[],afterFiles:[{source:"/:path*/_meta",destination:"/404"}],fallback:[]},"/":[s,"static/chunks/343-9b9bc361294c2765.js","static/css/e68b73cab80c6d1b.css","static/chunks/pages/index-598eb6a65ebd0988.js"],"/_error":["static/chunks/pages/_error-b56819d0c5bcf883.js"],"/development":[s,"static/chunks/pages/development-5535cb8a1ecdacff.js"],"/development/frontend":[s,"static/chunks/pages/development/frontend-381fe0bb96f99443.js"],"/docs":[s,"static/chunks/pages/docs-be9cdbe6ca1dff45.js"],"/docs/advanced":[s,"static/chunks/pages/docs/advanced-c5de161a49e71f03.js"],"/docs/community":[s,"static/chunks/pages/docs/community-e8fbadc4aa043be7.js"],"/docs/docker":[s,"static/chunks/pages/docs/docker-70b2d570f212d9df.js"],"/docs/features":[s,"static/chunks/pages/docs/features-4eda84378b96b0b5.js"],"/docs/scripts":[s,"static/chunks/pages/docs/scripts-e16f6a5ca885660e.js"],"/themes":[s,"static/chunks/pages/themes-a65cd342485614a7.js"],"/themes/kami":[s,"static/chunks/pages/themes/kami-e5a27cc90eef2ca8.js"],"/themes/shiro":[s,"static/chunks/pages/themes/shiro-5d05126d70ab3573.js"],"/themes/shiro/extra":[s,"static/chunks/pages/themes/shiro/extra-b4fc3bc9faeaf031.js"],"/themes/yun":[s,"static/chunks/pages/themes/yun-60cf591672d2d522.js"],"/usage":[s,"static/chunks/pages/usage-a2fab104296cfc4f.js"],"/usage/macros":[s,"static/chunks/pages/usage/macros-4ad1725a69b4f6e0.js"],"/usage/search":[s,"static/chunks/pages/usage/search-9815091c1e91d7a8.js"],"/usage/serverless":[s,"static/chunks/pages/usage/serverless-58c28758c861f13b.js"],"/usage/xlog":[s,"static/chunks/pages/usage/xlog-81491f4aa1e04149.js"],sortedPages:["/","/_app","/_error","/development","/development/frontend","/docs","/docs/advanced","/docs/community","/docs/docker","/docs/features","/docs/scripts","/themes","/themes/kami","/themes/shiro","/themes/shiro/extra","/themes/yun","/usage","/usage/macros","/usage/search","/usage/serverless","/usage/xlog"]}}("static/chunks/48-c59c1f922cbfc0f3.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
\ No newline at end of file
diff --git a/_next/static/q6vnYXmQjKt4ngHOQiFe7/_ssgManifest.js b/_next/static/1zO73xAILQeCTg3qgONcH/_ssgManifest.js
similarity index 100%
rename from _next/static/q6vnYXmQjKt4ngHOQiFe7/_ssgManifest.js
rename to _next/static/1zO73xAILQeCTg3qgONcH/_ssgManifest.js
diff --git a/_next/static/chunks/nextra-data-en-US.json b/_next/static/chunks/nextra-data-en-US.json
index e54b223a..c3bcb591 100644
--- a/_next/static/chunks/nextra-data-en-US.json
+++ b/_next/static/chunks/nextra-data-en-US.json
@@ -1 +1 @@
-{"/_app":{"title":" App","data":{"":""}},"/_app":{"title":" App","data":{"":""}},"/development/frontend":{"title":"前端开发指南","data":{"":"为什么要写这一节?我希望不再是只有 Kami 一个风格,能有更多主题可供选择。\n此系统采用了前后端分离的形式,并没有提供模板渲染的选择,所以前端项目可以使用任何框架和架构设计。但是虽然开发比较自由,但是也存在诸多不便,比如接口调用和数据定义,路由约定上。所以在这一节,具体讲讲如何开发前端项目。","路由约定#路由约定":"Kami 是由 NextJS、React 开发的,作为最最原始的项目,至今(截止 2021.12)已有近两年的历史,经过这些时间的沉淀,我希望前端项目路由的组织上能够遵守这一个约定。\n路由的约定能很大程度保证网站因更换不同前端主题导致 SEO 异常,死链接等问题。\n约定如下:\nPath\tDescrition\tMark\t/\t主页\t强制要求\t/posts\t博文列表\t强制要求\t/posts/:category/:slug\t博文详情页\t强制要求\t/pages/:slug\t独立页面详情页\t强制要求\t/notes/:nid\t日记详情页\t强制要求\t/feed\tRSS 订阅\t强制要求\t/:category/:slug\t302 -> /posts/:category/:slug\t建议\t/category/:slug\t分类中文章列表页\t建议\t/notes\t日记列表或者跳转最新日记页\t建议\t/notes/latest\t最新日记详情页\t建议\t/friends\t友链\t建议\t/says\t一言详情页\t可选\t/sitemap\t站点地图\t建议\t/timeline\t时间线\t可选\t/recently\t动态页\t可选\t/favorite/:type\t附加页\t可选\t/projects\t项目页\t可选\t/projects/:id\t项目详情页\t可选","框架上的选择与建议#框架上的选择与建议":"建议选择附带 SSR 功能的现代化框架:\nReact:NextJS, RakkasJS, umi\nVue: Vite (vite-ssr), NuxtJS\n\n小程序:\nReact: Remax, taro\nVue: uni-app","接口调用与-sdk-的使用#接口调用与 SDK 的使用":"考虑到单独编写接口定义和返回类型太麻烦,这里提供一个 SDK 方便开发。\nSDK 仍在 beta 阶段,未来接口可能出现变化。\n详见:api-client"}},"/development":{"title":"开发指南","data":{"":"为了方便开发者快速上手,我们提供了一些开发指南,帮助开发者快速了解和使用我们的产品。","项目技术栈#项目技术栈":"React\nNestJS\nTypeScript\nMongoDB\nRedis\nDocker\n\n你可以点击上面的链接了解更多有关这些技术的信息。","启动开发环境#启动开发环境":"此系统采用了前后端分离的形式,因此需要分别启动前端和后端的开发环境。但是由于不同的前端不同写法,我们认为作为一名开发者都应该知道如何 「举一反三」, 并且不同的前端可能步骤会 大相径庭 ,因此我们不会提供如何启动前端开发环境的指南。\n有关前端开发设计指南,你可以在侧边栏中找到。\n你需要确定好你的开发环境中已经安装了以下工具:\nNode.js (>= 16)\nPNPM\nMongoDB\nRedis\nGit","启动后端#启动后端":"首先,你需要克隆本仓库到你的本地(你可能需要 fork 一份到你的仓库中,并且使用 --depth=1 来加速克隆):\n\n然后,你需要安装依赖,我们使用了 PNPM 作为包管理器,并不建议你使用其他的管理器安装。\n在您提交相关 PR 时,我们也会检查您是否使用了 PNPM,如果没有,我们将会拒绝您的 PR(一个项目多个 lock 总不是一个好的选择)。\n\n\n接下来,我们就可以开始启动后端的开发环境了。"}},"/docs/community":{"title":"社区部署教程","data":{"":"以下是社区用户分享的部署方式,你可以参考他们的部署方式,但我们不保证它们的可用性。如果你也有教程想要与大家分享的,欢迎您向文档提交 Pull Request 以分享您的部署方式。"}},"/docs/docker":{"title":"Docker 部署","data":{"":"","安装-docker#安装 Docker":"如果你的服务器在国内,建议使用阿里云的镜像加速,安装命令如下:\n\n在国外,可以直接使用官方脚本安装:\n\n如果您成功安装了 Docker 和 Docker-Compose,可以通过以下命令查看版本:","拉取配置文件#拉取配置文件":"","配置-core-启动配置文件#配置 Core 启动配置文件":"在下方的表格里填入你的配置,然后点击复制,创建一个 .env 文件,将复制的内容粘贴进去,保存即可。\n鼠标悬停在下方的表格中,可以查看对应的配置项名字。\n\n\n\nJWT 密钥:需要填写长度不小于 16 个字符,不大于 32 个字符的字符串,用于加密用户的 JWT,务必保存好自己的密钥,不要泄露给他人。\n被允许的域名:需要填写被允许的域名,通常是前端的域名,如果允许多个域名访问,用英文逗号,分隔。\n是否开启加密:如果你确定要开启加密,将 false 改为 true,开启加密后,你需要在下方填写加密密钥。\n加密密钥:具体内容可参考 https://mx-space.js.org/feature/security.html\n\n\n若开启加密,则需注意密钥长度必须为 64 位,不然会在初始化时报错。注意这是不可逆的,务必保存自己的秘钥。所以并不是非常推荐使用,除非你真的需要加密,","启动-core#启动 Core":"","完成#完成":"恭喜你完成了 Core 部署,不过仅仅如此是不够的,你需要对 Core 进行初始化等等,尽情探索吧!"}},"/docs/features":{"title":"主要功能","data":{"":"","mix-space--markdown--html#Mix Space + Markdown > HTML":"Mix Space 的 Markdown 除了支持标准的 Markdown 语法和 GFM 外,还支持「文本宏」,它可以让你在文章中使用动态数据,比如:\n\n在经过 Mix Space 处理后,会被替换成:\n\n这种简易的以 [[ 开头, ]] 结尾的语法,非常便于使用。你甚至可以使用任意 JS 代码去执行一个函数,也可以是一个 JS 语句。了解更多有关文本宏的信息 功能 - 文本宏","日记#日记":"作为个人空间,日记是必不可少的功能。Mix Space 的日记功能非常强大,它支持:\n标记「回顾日记」,并自动将其归档到「回顾日记」页面\n私人日记密码保护,只有知道密码的人才能查看\n定时发布,可以将日记定时发布到未来的某个时间点","评论#评论":"评论是一个网站的重要组成部分,Mix Space 的评论功能非常强大,它支持:\n反垃圾评论,使用 Mix Space 的反垃圾评论系统配合多种自定义规则,可以有效的防止垃圾评论\n邮件通知,当有人评论时,会发送邮件通知给文章作者","xlog-集成#xLog 集成":"通过 Mix Space 的 xLog 功能,你可以将你的博客文章同步到 xLog 平台。并且当你没有为文章写摘要的时候,可以直接使用 xLog 平台生成的摘要,当然你也可以使用自己的 GPT API Key 去调用 GPT 生成文章摘要。\nxLog 是面向所有人的最棒的链上、开源的博客社区。","文件管理#文件管理":"你可以使用 Mix Space 上传文件,然后在任意地方中使用,比如文章中,或者是日记中。你可以使用 Markdown 语法插入图片,也可以使用 HTML 语法插入图片。","通知#通知":"Mix Space 支持多种通知方式,让你不错过任何一条重要的通知。\n邮件通知,当有人评论时,会发送邮件通知给文章作者\nBark 通知支持","友链#友链":"Mix Space 的友链系统支持自助申请,你可以在后台设置是否需要审核,如果需要审核,你可以在后台设置通过 OR 拒绝理由。并且在后台可以看到友链的可用性检查结果。","计划任务#计划任务":"Mix Space 有着强大的计划任务功能,它们都被统一管理,你可以在后台执行计划任务:\n备份数据库\n清除缓存、访问记录、临时文件\n推送百度搜索\n推送 Algolia 搜索\n删除过期的数据\netc...","其他#其他":"Mix Space 还有很多其他功能,比如:\n动态化配置前端,你可以在后台设置前端的配置,比如网站名称,网站描述,网站图标等等\n终端功能,你可以在后台进入终端,执行一些命令,比如清除缓存,备份数据等等\n云函数,你可以在后台设置云函数,让你的网站更加强大\nAlgolia Search,你可以在后台设置 Algolia Search,让你的网站支持站内搜索功能\n项目展示功能,你可以向访客展示你的项目,展现你的技术能力\n迁移,Mix Space 支持从 Markdown 导入文章,也支持导出文章为 Markdown。"}},"/docs":{"title":"引言","data":{"":"Mix Space 是一个一款简洁而不简单的个人博客系统,它够快,够现代。你可以利用它构建一个属于自己的个人空间,记录生活,分享知识。在本章节,我们将完成的是 后端 的安装,而 前端 的安装则需要你阅读 前端主题文档。\n为什么分开部署?请查看本页 一些你需要知道的事情 小节。","快速开始#快速开始":"我们提供了三种部署方式,并且社区也提供了更多的部署方式,你可以根据自己的喜好选择一种部署方式。\n\n\n\n\n\n\n\n\n\n\n还有更多部署方式吗?欢迎您向文档提交 Pull Request 以分享您的部署方式。按上方后端部署文档完成你的部署后,你可以通过下面的方式继续部署 Mix Space 前端 (为什么分开部署?请查看 一些你需要知道的事情)","一些你需要知道的事情#一些你需要知道的事情":"","遇到报错怎么办#遇到报错怎么办?":"新时代新风气,我们遇到了一个人工智能蓬勃发展的时代,所以在你遇到了问题的时候请先询问 Bing AI, ChatGPT 等人工智能,它们会帮助你解决大部分问题。如果你遇到了一些人工智能解决不了的问题,那么请再次阅读文档,如果文档依旧没有解决你的问题,那么请在对应仓库的 GitHub Issues 中提出你的问题,我们会尽快解决。","mix-space-的组成结构#Mix Space 的组成结构":"所以,Mix Space 由两部分组成:后端 和 前端。如果你没法理解的话,建议询问 Bing AI, ChatGPT 等人工智能以此来了解它们、以及知道它们的区别。(比如这样询问 ChatGPT)总之你需要知道的便是:这不是像 Typecho、WordPress 这样的「一步曲」就搞定的系统,而是需要 「两步曲」 才能完成安装。\n但万幸的是,我们开发者已经为你准备好了一切,你只需要按照文档推荐的步骤来操作即可,即使你不是开发者,也可以轻松完成安装。\n知道了这些,你就可以避免掉大部分的问题了,开始安装体验吧!"}},"/docs/scripts":{"title":"预设脚本部署","data":{"":"经用户反馈,我们发现预设脚本部署的方式存在一些问题,因此我们建议您使用其他部署方式。"}},"/":{"title":"Mix Space - An Alternative Personal Space.","data":{"":"An Alternative Personal Space.\n\n一个替代个人空间的新方式\n\n\n5 分钟拥有自己的 Mix Space →\n\n\n\n\n\n\n\n\n\n\n\n\n\n几分钟内创建强大的现代博客网站。\n\n\n\n\n部署一行完成.\n\nMix Space 有多种部署方式,您可以选择最适合您的方式来部署您的 Mix Space。采用 Docker 部署,您可以在几分钟内部署您的博客,而不需要任何专业知识。使用预设脚本部署亦是如此。\n\n\n\n\n\n\n\n\n\n/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n全平台黑暗模式\n\n\n\n\nMarkdown + 自定义语法, 丰富您的内容。\n\nMix Space 支持自定义 Markdown 内语法,您可以使用自定义语法来丰富您的内容。\n\n\n\n\n\n\n\n\n\n\n无限扩展、无限可能,实现歌单解析,追番列表等功能。\n\n\n\n数据统计面板\n\nMix Space 支持访客统计,您可以在后台查看您的 网站访问量,访问来源,访问设备等信息。\n\n\n\n记录生活点滴\n\nMix Space 不仅是博客,更是记录生活点滴的个人空间。您可以在 Mix Space 分享您的多彩缤纷的生活。\n\n\n\n强大的友链系统,促进你与老友的联系。\n\nMix Space 的友链系统强大且全面,在后台你可以检测你的老友是否还「健在」 有了 Mix Space,你的友链一切尽在掌握。\n\n\n\n更多特性...\n\n文件管理 / WebSocket / 友链支持 / 计划任务 / 数据迁移... 更多新特性等待您的探索。\n\n拥有你自己的 Mix Space →"}},"/themes/kami":{"title":"Kami 主题","data":{"":"下一个代替项目将会是 Shiro,当它完成之时,我便不再投入任何精力到 Kami 中。迎接未来总需要舍弃一些东西,非常感谢大家三年来使用 Kami,不管你是谁,都需要对你说声谢谢。—— Innei\n\n由于 Kami 主题将不再维护,该部分文档将会保持最小程度的更新;值得注意的是,使用 Kami 要求服务器的 Linux 内核版本不小于 4.19。","检查内核版本#检查内核版本":"如果你的内核版本小于 4.19,请升级内核。或者使用最新的 Ubuntu / Debian 。","克隆项目#克隆项目":"","安装依赖#安装依赖":"","配置-env#配置 ENV":"复制 .env.example 为 .env\n编辑 .env 文件,它看起来应该是这个样子的","开始构建#开始构建":"","启动前端#启动前端":"","反向代理#反向代理":"以下配置文件以 Nginx 为例,若使用 Caddy 进行配置可参考 Caddyfile 文件示例进行相应修改。\n\n完整示例如下","完成#完成":"如果您按照文档示例配置 Nginx 反向代理,您要时刻记住,您的:\nAPI 地址为 https://www.example.com/api/v2\nKami 地址为 https://www.example.com\nGateWay 为 https://www.example.com\n后台为 https://www.example.com/qaqdmin\n本地后台为 https://www.example.com/proxy/qaqdmin"}},"/themes/shiro/extra":{"title":"额外功能","data":{"":"","我的动态#我的动态":"Shiro 主题中,有一个可以在顶部显示博主当前正在做的事情的功能,这个功能是通过云函数和 ProcessReporter 软件实现的。\n\n\n\n\n\n\n非常感谢 Innei, timochan, TNXG 的贡献,目前 ProcessReporter 已支持全平台!","配置云函数#配置云函数":"进入后台,点击左侧菜单栏的「其他 -> 配置与云函数」,然后点击新建按钮,在选项卡中填入以下信息:\n名称:update\n引用:ps\n数据类型:Function\n请求方式:POST\n\n这个地方还需要设置一个密钥,在 Secret 中填入 key,在 Value 中填入你自己的密钥。\n这个密钥将用于验证你的软件是否有权限更新博主的动态,所以请务必设置一个复杂的密钥。密钥在后面的步骤中还需要用到,所以请务必记住。\n上方没有提到的选项都不需要填写,然后在右侧的代码编辑器中填入以下代码:\n\n点击保存按钮,云函数就配置完成了。","配置主题配置#配置主题配置":"继续在「配置与云函数」页面,找到「theme -> shiro」配置,点击编辑,进入编辑页面,在代码中找到 module,加入 activity 配置,如下:(高亮部分)","配置软件#配置软件":"前往对应着你的电脑系统的软件的 GitHub 仓库,下载并打开 ProcessReporter。\n\n\n\n\n\n由于不同平台有不同的使用方法,不同的软件我们会在下方具体讲述。","processreporter-mac#ProcessReporter Mac":"打开软件后,你会发现你的系统菜单栏中多了一个图标,点击图标,然后点击「设置」,在弹出的窗口中填入你的信息:\nEndpoint:{你的API地址}/fn/ps/update (请将 {你的API地址} 替换为你的 API 地址,如:https://api.example.com/api/v2)\nAPI Key:填入你刚刚在云函数中设置的密钥\n\n如果你希望软件在开机时自动启动,可以勾选「Launch at login」选项。接着关闭窗口,再次点击菜单栏中的图标,点击「Enable」即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。","processreporter-windows#ProcessReporter Windows":"Windows 版本的使用问题,请前往 TNXG/ProcessReporterWinpy 查看。","使用-gui-版本#使用 GUI 版本":"在 Releases 页面下载 ProcessReporterWinpy_Launcher.exe\n,配置好 config.yml 文件,然后运行 ProcessReporterWinpy_Launcher.exe 即可。config.yml 配置具体配置项以及说明请参考 TNXG/ProcessReporterWinpy。","使用预编译的二进制文件#使用预编译的二进制文件":"在 Releases 页面下载 ProcessReporterWinpy.exe,配置好 config.yml 文件后,在终端运行即可,示例如下\n\nconfig.yml 配置具体配置项以及说明请参考 TNXG/ProcessReporterWinpy。","使用源代码#使用源代码":"下载代码后,修改 config.yml 文件,填入你的信息:\napi_url:{你的API地址}/fn/ps/update (请将 {你的API地址} 替换为你的 API 地址,如:https://api.example.com/api/v2)\napi_key:填入你刚刚在云函数中设置的密钥\nreport_time: 上报间隔(单位:秒)\n\n接着运行程序即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。","processreporter-linux#ProcessReporter Linux":"在仓库的 Releases 页面下载对应的二进制包,解压运行即可,具体请参照项目的 README 进行配置运行。安装完成后,新建 .env.process 文件,填入你的信息:\n\n然后执行程序即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。如果有什么疑问,可以去阅读该项目的 README"}},"/themes/shiro":{"title":"Shiro 主题","data":{"":"","demo#Demo":"","前提要求#前提要求":"你已安装 Mix Space 后端并且已启动\n你已注册 Vercel 和 GitHub 账号\n你已注册 Clerk 账号\n\n\n请注意,Shiro 主题的部署教程与初版有所不同,如果你已经部署过 Shiro 主题,请重新阅读本文档(尤其是填入配置文件环节,配置有所变化),并阅读最后一节「移除 Edge Config」。","安装#安装":"","克隆仓库#克隆仓库":"登陆 GitHub 账号,打开 Innei/Shiro,点击右上角的 Fork 按钮,将仓库克隆到你的账号下。","打开-vercel-创建项目#打开 Vercel 创建项目":"登陆 Vercel 账号,点击右上角的 New Project 按钮,选择 Import Git Repository,选择你刚刚 Fork 的仓库,点击 Import 按钮,即可进入到项目配置页面。","打开-clerk-创建项目#打开 Clerk 创建项目":"打开 Clerk 仪表盘 点击 Add application 按钮,填入你的博客名称,并配置信息,点击 Create application 按钮,即可完成配置。\n请你务必记住你的 Clerk 页面的公钥和私钥,稍后将会用到。","设置主题配置#设置主题配置":"进入 Mix Space 后台,进入「配置与云函数」页面,点击右上角的新增按钮,在编辑页面中,填入以下设置:\n名称:shiro\n引用:theme\n数据类型:JSON\n数据:(点击下方的按钮复制)\n\n\n请注意,这份配置你需要自行修改成符合你的需求的配置。直接使用下面的配置可能会导致你的博客无法按照你的预期运行。\n\n\n点击按钮保存配置,随后继续进行下面的步骤。","配置环境变量#配置环境变量":"在下方的配置表格中,填入你的环境变量,然后点击复制按钮,将环境变量复制到剪贴板中。","键入环境变量--开始部署#键入环境变量 & 开始部署":"在刚刚进入的 Vercel 项目配置页面中,点击 Environment Variables,然后键盘上的 Ctrl + V 将环境变量粘贴到输入框中,然后点击 Deploy 按钮,等待部署完成。","完成#完成!":"至此,你已完成了 Shiro 主题的部署,你可以访问你的博客了。有关配置域名的教程,请参考 Vercel 文档。","移除-edge-config#移除 Edge Config":"在后续的 Shiro 更新中, Edge Config 将不再被使用。你可能需要移除 Edge Config,以防止不必要的资源使用。进入 Vercel 部署此项目的仪表盘,点击上方的 Storage,进入设置页面,点击左侧的 Projects,将链接的项目取消链接,接着点击左侧的 Settings,点击右侧的 Delete Edge Config 按钮,即可完成删除。"}},"/usage":{"title":"使用指南","data":{"":"本章节将会带您了解 Mix Space 的一些功能,以及如何使用它们。\n温馨提示:此指南需要一定的基础知识 & 理解能力,请准备好哦~","官方指南#官方指南":"","社区使用指南#社区使用指南":""}},"/usage/macros":{"title":"文本宏","data":{"":"这是一个实验性特征,可能会造成系统的不稳定。经过测试,使用大量文本宏会造成请求文章的接口变慢。","简介#简介":"使用此功能需要先在后台中开启,设置 - 系统 - 文本设定 - 文本宏替换。\nRequired: mx-server >=3.26.0文本宏是一个以 [[ ]] 包裹的语法,例如 [[ $created ]] 是一个合法的语法。在文章中可以插入文本宏,和 Markdown 一样,但是这个语法不是用 Markdown 解析和渲染,而是直接会在服务端进行替换。因此可以通过这个特征在文章中插入一些来自服务端的数据,也可以执行一些函数。例如说一篇文章的标题为「实例标题」,他的正文内容为:\n\n将会输出:\n\n又比如说:\n\n将会输出:\n\n这是一个动态的数据,dayjs 函数由服务端提供。\n所有的函数方法均在服务端执行,请注意内存的泄露造成系统的不稳定。","语法格式#语法格式":"以 [[ 开头, ]] 结尾,注意一个空格是必须的。","访问变量#访问变量":"访问变量使用 $ 前缀。目前可以访问的变量有:当前记录的所有字段(数据库记录值)比如说:title created slug nid _id ..你可以像这样来调用变量:[[ $created ]]","使用函数#使用函数":"函数的执行行为和云函数的执行行为保持一致。\n执行函数使用 # 前缀。你可以使用任意 JS 代码去执行一个函数,也可以是一个 JS 语句。如:\n\n使用内置方法。如:\n\n内置方法目前有:\ndayjs —— 日期处理\nformatNow(time: Date | string): string —— 相对时间\ncenter(text: string): string —— 居中\nright(text: string): string —— 居右\nopacity(text: string, opacity: number): string —— 透明文本\nblur(text: string, blur: number): string —— 高斯模糊化文字\ncolor(text: string, color: string): string —— 给文字上色\nsize(text: string): string —— 给文字上色"}},"/usage/search":{"title":"Algolia Search","data":{"":"","介绍#介绍":"Algolia 是一个数据库实时搜索服务,能够提供毫秒级的数据库搜索服务,并且其服务能以 API 的形式方便地布局到网页、客户端、APP 等多种场景。像 VuePress 官方文档就是使用的 Algolia 搜索,使用 Algolia 搜索最大的好处就是方便,它会自动爬取网站的页面内容并构建索引,你只用申请一个 Algolia 服务,在网站上添加一些代码,就可以实现一个全文搜索功能。","使用#使用":"在这之前,你需要先在 Algolia 官网注册一个账号,或者直接用第三方登录。","新建应用#新建应用":"登录 Algolia 账号,进入控制台,在左上角点击 Applications 下列表,点击 New Application,填写应用名称,选择 BUILD 订阅(免费),选择好数据中心,点击 Create Application,即可创建一个应用。一些额外说明的地方都在图片上标注了,可参考下面的图片。","创建索引index#创建索引(Index)":"在新建应用之后,你会直接跳转到如下图所示的界面,只需要在输入框中输入一个索引名称,点击 Create Index,即可创建一个索引。请记住你所创建的索引名称(Index Name),后面的步骤会用到。","获取相关变量#获取相关变量":"接下来,在左下角找到齿轮图标,进入设置,在右侧找到 API Keys,进入,这里有两个变量需要复制下来备用,分别是 Application ID 和 Admin API Key,请复制下这两个变量的值,后面的步骤会用到。","后台配置#后台配置":"进入后台,设定->系统->Algolia Search,将“开启 Algolia Search”开关打开,将前面准备的 IndexName、Application ID(AppID) 和 Admin API Key(ApiKey) 填入对应的框中,右上角保存即可。\n至此,Algolia 搜索的配置就完成了。稍等一会,就可以尝试在主页用 Ctrl + K 调用 Algolia 进行站内搜索了。"}},"/usage/serverless":{"title":"云函数","data":{"":"","介绍#介绍":"云函数是 Mix Space 中的一个重要功能,它极大地辅助了使用者在 Mix Space 中的体验。通过云函数,Mix Space 可以额外实现实现歌单解析,追番列表等等的功能。你可以在此处看到 Mix Space 目前收录的云函数 Snappets","使用#使用":"有一些前端主题需要使用云函数,这个时候你需要进入到云函数设置界面,将云函数代码填入到对应的位置。","1-进入云函数设置界面#1. 进入云函数设置界面":"进入后台管理,点击左侧菜单栏的 其他 - 云函数,即可进入云函数管理页面。","2-下载扩展包#2. 下载扩展包":"在右上方,点击 下载拓展包,你将会看到一个弹窗。","3-导入#3. 导入":"请在弹窗内请找到对应的主题的云函数代码,点击导入,即可完成下载对应的云函数代码。\n接下来,你可以在云函数管理页面看到你刚刚导入的云函数代码。","开发者文档#开发者文档":""}},"/usage/xlog":{"title":"xLog 集成","data":{"":"","介绍#介绍":"此功能需要:\nCore: >=3.43.1\n\nxLog 功能可以将你的博客同步到 xLog 平台。具体就是 此文章已经由它的创作者签名并安全地存储在区块链上。当你没有为文章写摘要的时候,可以使用 xLog 平台生成的摘要,当然你也可以使用自己的 GPT API Key 去调用 GPT 去生成摘要。","使用#使用":"在 系统 - 第三方服务集成,填写 xLog SiteId 即可,然后去 xLog 平台去升级为钱包登录即可。钱包的注册方法请根据 xLog 的引导一步步注册。SiteId 是一个字符串,可以在 xLog 平台的设置 - 域名找到;例如 example.xlog.app,即 SiteId = example。当你完成钱包的注册,并使用钱包登录 xLog 平台的时候,就完成设置工作了。接下来你发布文章的时候,会自动的进行同步和签名;当然,需要经过你的同意。"}},"/docs/advanced":{"title":"进阶部署","data":{"":"在您进行进阶部署前,我们给予最后的警告:如果你不是开发者,或者不想折腾,请不要选择进阶部署,因为它需要你具备一定的开发能力。由于自身技术原因导致的问题,我们将不会提供任何技术支持。情节严重者,我们将永久拉黑您的账号。","要求#要求":"已安装 Node.js 16.0.0 或以上版本\n已安装 Git, PNPM, PM2\n已安装 MongoDB, Redis 并正常运行","1-克隆并安装#1. 克隆并安装":"","2-构建--bundle#2. 构建 & Bundle":"","3-配置-ecosystemconfigjs#3. 配置 ecosystem.config.js":"","4-启动#4. 启动":"进入 ./apps/core/out,创建一个 ecosystem.config.js 文件\n将上方复制的内容黏贴进去,然后执行以下命令启动服务","5-反向代理-or-#5. 反向代理 or ...":"剩下的就是你的事了,你可以使用 Nginx 或者 Caddy 等反向代理工具,也可以使用 Cloudflare 等 CDN 服务。本文不再赘述。"}},"/themes":{"title":"前端主题","data":{"":""}},"/themes/yun":{"title":"Yun 主题","data":{"":"由于 Yun 主题将不再维护,此文档将不再更新,但是你仍然可以使用它。","克隆项目#克隆项目":"","安装依赖#安装依赖":"","配置服务#配置服务":"如果你部署 Mix Space 后端与部署 Yun 前端在同一台服务器,并且后端监听的端口为 2333,那么你可以跳过这一步。\n\n前往 ./server/constant.ts\n\n\n\n修改为你的后端 API 地址。","开始构建#开始构建":"","启动前端#启动前端":""}}}
\ No newline at end of file
+{"/_app":{"title":" App","data":{"":""}},"/_app":{"title":" App","data":{"":""}},"/development/frontend":{"title":"前端开发指南","data":{"":"为什么要写这一节?我希望不再是只有 Kami 一个风格,能有更多主题可供选择。\n此系统采用了前后端分离的形式,并没有提供模板渲染的选择,所以前端项目可以使用任何框架和架构设计。但是虽然开发比较自由,但是也存在诸多不便,比如接口调用和数据定义,路由约定上。所以在这一节,具体讲讲如何开发前端项目。","路由约定#路由约定":"Kami 是由 NextJS、React 开发的,作为最最原始的项目,至今(截止 2021.12)已有近两年的历史,经过这些时间的沉淀,我希望前端项目路由的组织上能够遵守这一个约定。\n路由的约定能很大程度保证网站因更换不同前端主题导致 SEO 异常,死链接等问题。\n约定如下:\nPath\tDescrition\tMark\t/\t主页\t强制要求\t/posts\t博文列表\t强制要求\t/posts/:category/:slug\t博文详情页\t强制要求\t/pages/:slug\t独立页面详情页\t强制要求\t/notes/:nid\t日记详情页\t强制要求\t/feed\tRSS 订阅\t强制要求\t/:category/:slug\t302 -> /posts/:category/:slug\t建议\t/category/:slug\t分类中文章列表页\t建议\t/notes\t日记列表或者跳转最新日记页\t建议\t/notes/latest\t最新日记详情页\t建议\t/friends\t友链\t建议\t/says\t一言详情页\t可选\t/sitemap\t站点地图\t建议\t/timeline\t时间线\t可选\t/recently\t动态页\t可选\t/favorite/:type\t附加页\t可选\t/projects\t项目页\t可选\t/projects/:id\t项目详情页\t可选","框架上的选择与建议#框架上的选择与建议":"建议选择附带 SSR 功能的现代化框架:\nReact:NextJS, RakkasJS, umi\nVue: Vite (vite-ssr), NuxtJS\n\n小程序:\nReact: Remax, taro\nVue: uni-app","接口调用与-sdk-的使用#接口调用与 SDK 的使用":"考虑到单独编写接口定义和返回类型太麻烦,这里提供一个 SDK 方便开发。\nSDK 仍在 beta 阶段,未来接口可能出现变化。\n详见:api-client"}},"/development":{"title":"开发指南","data":{"":"为了方便开发者快速上手,我们提供了一些开发指南,帮助开发者快速了解和使用我们的产品。","项目技术栈#项目技术栈":"React\nNestJS\nTypeScript\nMongoDB\nRedis\nDocker\n\n你可以点击上面的链接了解更多有关这些技术的信息。","启动开发环境#启动开发环境":"此系统采用了前后端分离的形式,因此需要分别启动前端和后端的开发环境。但是由于不同的前端不同写法,我们认为作为一名开发者都应该知道如何 「举一反三」, 并且不同的前端可能步骤会 大相径庭 ,因此我们不会提供如何启动前端开发环境的指南。\n有关前端开发设计指南,你可以在侧边栏中找到。\n你需要确定好你的开发环境中已经安装了以下工具:\nNode.js (>= 16)\nPNPM\nMongoDB\nRedis\nGit","启动后端#启动后端":"首先,你需要克隆本仓库到你的本地(你可能需要 fork 一份到你的仓库中,并且使用 --depth=1 来加速克隆):\n\n然后,你需要安装依赖,我们使用了 PNPM 作为包管理器,并不建议你使用其他的管理器安装。\n在您提交相关 PR 时,我们也会检查您是否使用了 PNPM,如果没有,我们将会拒绝您的 PR(一个项目多个 lock 总不是一个好的选择)。\n\n\n接下来,我们就可以开始启动后端的开发环境了。"}},"/docs/community":{"title":"社区部署教程","data":{"":"以下是社区用户分享的部署方式,你可以参考他们的部署方式,但我们不保证它们的可用性。如果你也有教程想要与大家分享的,欢迎您向文档提交 Pull Request 以分享您的部署方式。"}},"/docs/docker":{"title":"Docker 部署","data":{"":"","安装-docker#安装 Docker":"如果你的服务器在国内,建议使用阿里云的镜像加速,安装命令如下:\n\n在国外,可以直接使用官方脚本安装:\n\n如果您成功安装了 Docker 和 Docker-Compose,可以通过以下命令查看版本:","拉取配置文件#拉取配置文件":"","配置-core-启动配置文件#配置 Core 启动配置文件":"在下方的表格里填入你的配置,然后点击复制,创建一个 .env 文件,将复制的内容粘贴进去,保存即可。\n鼠标悬停在下方的表格中,可以查看对应的配置项名字。\n\n\n\nJWT 密钥:需要填写长度不小于 16 个字符,不大于 32 个字符的字符串,用于加密用户的 JWT,务必保存好自己的密钥,不要泄露给他人。\n被允许的域名:需要填写被允许的域名,通常是前端的域名,如果允许多个域名访问,用英文逗号,分隔。\n是否开启加密:如果你确定要开启加密,将 false 改为 true,开启加密后,你需要在下方填写加密密钥。\n加密密钥:具体内容可参考 https://mx-space.js.org/feature/security.html\n\n\n若开启加密,则需注意密钥长度必须为 64 位,不然会在初始化时报错。注意这是不可逆的,务必保存自己的秘钥。所以并不是非常推荐使用,除非你真的需要加密,","启动-core#启动 Core":"","完成#完成":"恭喜你完成了 Core 部署,不过仅仅如此是不够的,你需要进入后台对 Core 进行初始化等操作(在反向代理之后进行),这里不再赘述。除此之外,如引言所述还需要部署一个前端主题用于展示,请参考 前端主题文档 继续完成部署前端主题的步骤。"}},"/docs/features":{"title":"主要功能","data":{"":"","mix-space--markdown--html#Mix Space + Markdown > HTML":"Mix Space 的 Markdown 除了支持标准的 Markdown 语法和 GFM 外,还支持「文本宏」,它可以让你在文章中使用动态数据,比如:\n\n在经过 Mix Space 处理后,会被替换成:\n\n这种简易的以 [[ 开头, ]] 结尾的语法,非常便于使用。你甚至可以使用任意 JS 代码去执行一个函数,也可以是一个 JS 语句。了解更多有关文本宏的信息 功能 - 文本宏","日记#日记":"作为个人空间,日记是必不可少的功能。Mix Space 的日记功能非常强大,它支持:\n标记「回顾日记」,并自动将其归档到「回顾日记」页面\n私人日记密码保护,只有知道密码的人才能查看\n定时发布,可以将日记定时发布到未来的某个时间点","评论#评论":"评论是一个网站的重要组成部分,Mix Space 的评论功能非常强大,它支持:\n反垃圾评论,使用 Mix Space 的反垃圾评论系统配合多种自定义规则,可以有效的防止垃圾评论\n邮件通知,当有人评论时,会发送邮件通知给文章作者","xlog-集成#xLog 集成":"通过 Mix Space 的 xLog 功能,你可以将你的博客文章同步到 xLog 平台。并且当你没有为文章写摘要的时候,可以直接使用 xLog 平台生成的摘要,当然你也可以使用自己的 GPT API Key 去调用 GPT 生成文章摘要。\nxLog 是面向所有人的最棒的链上、开源的博客社区。","文件管理#文件管理":"你可以使用 Mix Space 上传文件,然后在任意地方中使用,比如文章中,或者是日记中。你可以使用 Markdown 语法插入图片,也可以使用 HTML 语法插入图片。","通知#通知":"Mix Space 支持多种通知方式,让你不错过任何一条重要的通知。\n邮件通知,当有人评论时,会发送邮件通知给文章作者\nBark 通知支持","友链#友链":"Mix Space 的友链系统支持自助申请,你可以在后台设置是否需要审核,如果需要审核,你可以在后台设置通过 OR 拒绝理由。并且在后台可以看到友链的可用性检查结果。","计划任务#计划任务":"Mix Space 有着强大的计划任务功能,它们都被统一管理,你可以在后台执行计划任务:\n备份数据库\n清除缓存、访问记录、临时文件\n推送百度搜索\n推送 Algolia 搜索\n删除过期的数据\netc...","其他#其他":"Mix Space 还有很多其他功能,比如:\n动态化配置前端,你可以在后台设置前端的配置,比如网站名称,网站描述,网站图标等等\n终端功能,你可以在后台进入终端,执行一些命令,比如清除缓存,备份数据等等\n云函数,你可以在后台设置云函数,让你的网站更加强大\nAlgolia Search,你可以在后台设置 Algolia Search,让你的网站支持站内搜索功能\n项目展示功能,你可以向访客展示你的项目,展现你的技术能力\n迁移,Mix Space 支持从 Markdown 导入文章,也支持导出文章为 Markdown。"}},"/docs":{"title":"引言","data":{"":"Mix Space 是一个一款简洁而不简单的个人博客系统,它够快,够现代。你可以利用它构建一个属于自己的个人空间,记录生活,分享知识。在本章节,我们将完成的是 后端 的安装,而 前端 的安装则需要你阅读 前端主题文档。\n为什么分开部署?请查看本页 一些你需要知道的事情 小节。","快速开始#快速开始":"我们提供了三种部署方式,并且社区也提供了更多的部署方式,你可以根据自己的喜好选择一种部署方式。\n\n\n\n\n\n\n\n\n\n\n还有更多部署方式吗?欢迎您向文档提交 Pull Request 以分享您的部署方式。按上方后端部署文档完成你的部署后,你可以通过下面的方式继续部署 Mix Space 前端 (为什么分开部署?请查看 一些你需要知道的事情)","一些你需要知道的事情#一些你需要知道的事情":"","遇到报错怎么办#遇到报错怎么办?":"新时代新风气,我们遇到了一个人工智能蓬勃发展的时代,所以在你遇到了问题的时候请先询问 Bing AI, ChatGPT 等人工智能,它们会帮助你解决大部分问题。如果你遇到了一些人工智能解决不了的问题,那么请再次阅读文档,如果文档依旧没有解决你的问题,那么请在对应仓库的 GitHub Issues 中提出你的问题,我们会尽快解决。","mix-space-的组成结构#Mix Space 的组成结构":"所以,Mix Space 由两部分组成:后端 和 前端。如果你没法理解的话,建议询问 Bing AI, ChatGPT 等人工智能以此来了解它们、以及知道它们的区别。(比如这样询问 ChatGPT)总之你需要知道的便是:这不是像 Typecho、WordPress 这样的「一步曲」就搞定的系统,而是需要 「两步曲」 才能完成安装。\n但万幸的是,我们开发者已经为你准备好了一切,你只需要按照文档推荐的步骤来操作即可,即使你不是开发者,也可以轻松完成安装。\n知道了这些,你就可以避免掉大部分的问题了,开始安装体验吧!"}},"/docs/scripts":{"title":"预设脚本部署","data":{"":"经用户反馈,我们发现预设脚本部署的方式存在一些问题,因此我们建议您使用其他部署方式。"}},"/":{"title":"Mix Space - An Alternative Personal Space.","data":{"":"An Alternative Personal Space.\n\n一个替代个人空间的新方式\n\n\n5 分钟拥有自己的 Mix Space →\n\n\n\n\n\n\n\n\n\n\n\n\n\n几分钟内创建强大的现代博客网站。\n\n\n\n\n部署一行完成.\n\nMix Space 有多种部署方式,您可以选择最适合您的方式来部署您的 Mix Space。采用 Docker 部署,您可以在几分钟内部署您的博客,而不需要任何专业知识。使用预设脚本部署亦是如此。\n\n\n\n\n\n\n\n\n\n/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n全平台黑暗模式\n\n\n\n\nMarkdown + 自定义语法, 丰富您的内容。\n\nMix Space 支持自定义 Markdown 内语法,您可以使用自定义语法来丰富您的内容。\n\n\n\n\n\n\n\n\n\n\n无限扩展、无限可能,实现歌单解析,追番列表等功能。\n\n\n\n数据统计面板\n\nMix Space 支持访客统计,您可以在后台查看您的 网站访问量,访问来源,访问设备等信息。\n\n\n\n记录生活点滴\n\nMix Space 不仅是博客,更是记录生活点滴的个人空间。您可以在 Mix Space 分享您的多彩缤纷的生活。\n\n\n\n强大的友链系统,促进你与老友的联系。\n\nMix Space 的友链系统强大且全面,在后台你可以检测你的老友是否还「健在」 有了 Mix Space,你的友链一切尽在掌握。\n\n\n\n更多特性...\n\n文件管理 / WebSocket / 友链支持 / 计划任务 / 数据迁移... 更多新特性等待您的探索。\n\n拥有你自己的 Mix Space →"}},"/themes/kami":{"title":"Kami 主题","data":{"":"下一个代替项目将会是 Shiro,当它完成之时,我便不再投入任何精力到 Kami 中。迎接未来总需要舍弃一些东西,非常感谢大家三年来使用 Kami,不管你是谁,都需要对你说声谢谢。—— Innei\n\n由于 Kami 主题将不再维护,该部分文档将会保持最小程度的更新;值得注意的是,使用 Kami 要求服务器的 Linux 内核版本不小于 4.19。","检查内核版本#检查内核版本":"如果你的内核版本小于 4.19,请升级内核。或者使用最新的 Ubuntu / Debian 。","克隆项目#克隆项目":"","安装依赖#安装依赖":"","配置-env#配置 ENV":"复制 .env.example 为 .env\n编辑 .env 文件,它看起来应该是这个样子的","开始构建#开始构建":"","启动前端#启动前端":"","反向代理#反向代理":"以下配置文件以 Nginx 为例,若使用 Caddy 进行配置可参考 Caddyfile 文件示例进行相应修改。\n\n完整示例如下","完成#完成":"如果您按照文档示例配置 Nginx 反向代理,您要时刻记住,您的:\nAPI 地址为 https://www.example.com/api/v2\nKami 地址为 https://www.example.com\nGateWay 为 https://www.example.com\n后台为 https://www.example.com/qaqdmin\n本地后台为 https://www.example.com/proxy/qaqdmin"}},"/themes/shiro/extra":{"title":"额外功能","data":{"":"","我的动态#我的动态":"Shiro 主题中,有一个可以在顶部显示博主当前正在做的事情的功能,这个功能是通过云函数和 ProcessReporter 软件实现的。\n\n\n\n\n\n\n非常感谢 Innei, timochan, TNXG 的贡献,目前 ProcessReporter 已支持全平台!","配置云函数#配置云函数":"进入后台,点击左侧菜单栏的「其他 -> 配置与云函数」,然后点击新建按钮,在选项卡中填入以下信息:\n名称:update\n引用:ps\n数据类型:Function\n请求方式:POST\n\n这个地方还需要设置一个密钥,在 Secret 中填入 key,在 Value 中填入你自己的密钥。\n这个密钥将用于验证你的软件是否有权限更新博主的动态,所以请务必设置一个复杂的密钥。密钥在后面的步骤中还需要用到,所以请务必记住。\n上方没有提到的选项都不需要填写,然后在右侧的代码编辑器中填入以下代码:\n\n点击保存按钮,云函数就配置完成了。","配置主题配置#配置主题配置":"继续在「配置与云函数」页面,找到「theme -> shiro」配置,点击编辑,进入编辑页面,在代码中找到 module,加入 activity 配置,如下:(高亮部分)","配置软件#配置软件":"前往对应着你的电脑系统的软件的 GitHub 仓库,下载并打开 ProcessReporter。\n\n\n\n\n\n由于不同平台有不同的使用方法,不同的软件我们会在下方具体讲述。","processreporter-mac#ProcessReporter Mac":"打开软件后,你会发现你的系统菜单栏中多了一个图标,点击图标,然后点击「设置」,在弹出的窗口中填入你的信息:\nEndpoint:{你的API地址}/fn/ps/update (请将 {你的API地址} 替换为你的 API 地址,如:https://api.example.com/api/v2)\nAPI Key:填入你刚刚在云函数中设置的密钥\n\n如果你希望软件在开机时自动启动,可以勾选「Launch at login」选项。接着关闭窗口,再次点击菜单栏中的图标,点击「Enable」即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。","processreporter-windows#ProcessReporter Windows":"Windows 版本的使用问题,请前往 TNXG/ProcessReporterWinpy 查看。","使用-gui-版本#使用 GUI 版本":"在 Releases 页面下载 ProcessReporterWinpy_Launcher.exe\n,配置好 config.yml 文件,然后运行 ProcessReporterWinpy_Launcher.exe 即可。config.yml 配置具体配置项以及说明请参考 TNXG/ProcessReporterWinpy。","使用预编译的二进制文件#使用预编译的二进制文件":"在 Releases 页面下载 ProcessReporterWinpy.exe,配置好 config.yml 文件后,在终端运行即可,示例如下\n\nconfig.yml 配置具体配置项以及说明请参考 TNXG/ProcessReporterWinpy。","使用源代码#使用源代码":"下载代码后,修改 config.yml 文件,填入你的信息:\napi_url:{你的API地址}/fn/ps/update (请将 {你的API地址} 替换为你的 API 地址,如:https://api.example.com/api/v2)\napi_key:填入你刚刚在云函数中设置的密钥\nreport_time: 上报间隔(单位:秒)\n\n接着运行程序即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。","processreporter-linux#ProcessReporter Linux":"在仓库的 Releases 页面下载对应的二进制包,解压运行即可,具体请参照项目的 README 进行配置运行。安装完成后,新建 .env.process 文件,填入你的信息:\n\n然后执行程序即可。如果一切正常,刷新一下你的博客你就可以在博客顶部看到你的动态了。如果有什么疑问,可以去阅读该项目的 README"}},"/themes/shiro":{"title":"Shiro 主题","data":{"":"","demo#Demo":"","前提要求#前提要求":"你已安装 Mix Space 后端并且已启动\n你已注册 Vercel 和 GitHub 账号\n你已注册 Clerk 账号\n\n\n请注意,Shiro 主题的部署教程与初版有所不同,如果你已经部署过 Shiro 主题,请重新阅读本文档(尤其是填入配置文件环节,配置有所变化),并阅读最后一节「移除 Edge Config」。","安装#安装":"","克隆仓库#克隆仓库":"登陆 GitHub 账号,打开 Innei/Shiro,点击右上角的 Fork 按钮,将仓库克隆到你的账号下。","打开-vercel-创建项目#打开 Vercel 创建项目":"登陆 Vercel 账号,点击右上角的 New Project 按钮,选择 Import Git Repository,选择你刚刚 Fork 的仓库,点击 Import 按钮,即可进入到项目配置页面。","打开-clerk-创建项目#打开 Clerk 创建项目":"打开 Clerk 仪表盘 点击 Add application 按钮,填入你的博客名称,并配置信息,点击 Create application 按钮,即可完成配置。\n请你务必记住你的 Clerk 页面的公钥和私钥,稍后将会用到。","设置主题配置#设置主题配置":"进入 Mix Space 后台,进入「配置与云函数」页面,点击右上角的新增按钮,在编辑页面中,填入以下设置:\n名称:shiro\n引用:theme\n数据类型:JSON\n数据:(点击下方的按钮复制)\n\n\n请注意,这份配置你需要自行修改成符合你的需求的配置。直接使用下面的配置可能会导致你的博客无法按照你的预期运行。\n\n\n点击按钮保存配置,随后继续进行下面的步骤。","配置环境变量#配置环境变量":"在下方的配置表格中,填入你的环境变量,然后点击复制按钮,将环境变量复制到剪贴板中。","键入环境变量--开始部署#键入环境变量 & 开始部署":"在刚刚进入的 Vercel 项目配置页面中,点击 Environment Variables,然后键盘上的 Ctrl + V 将环境变量粘贴到输入框中,然后点击 Deploy 按钮,等待部署完成。","完成#完成!":"至此,你已完成了 Shiro 主题的部署,你可以访问你的博客了。有关配置域名的教程,请参考 Vercel 文档。","移除-edge-config#移除 Edge Config":"在后续的 Shiro 更新中, Edge Config 将不再被使用。你可能需要移除 Edge Config,以防止不必要的资源使用。进入 Vercel 部署此项目的仪表盘,点击上方的 Storage,进入设置页面,点击左侧的 Projects,将链接的项目取消链接,接着点击左侧的 Settings,点击右侧的 Delete Edge Config 按钮,即可完成删除。"}},"/usage":{"title":"使用指南","data":{"":"本章节将会带您了解 Mix Space 的一些功能,以及如何使用它们。\n温馨提示:此指南需要一定的基础知识 & 理解能力,请准备好哦~","官方指南#官方指南":"","社区使用指南#社区使用指南":""}},"/usage/macros":{"title":"文本宏","data":{"":"这是一个实验性特征,可能会造成系统的不稳定。经过测试,使用大量文本宏会造成请求文章的接口变慢。","简介#简介":"使用此功能需要先在后台中开启,设置 - 系统 - 文本设定 - 文本宏替换。\nRequired: mx-server >=3.26.0文本宏是一个以 [[ ]] 包裹的语法,例如 [[ $created ]] 是一个合法的语法。在文章中可以插入文本宏,和 Markdown 一样,但是这个语法不是用 Markdown 解析和渲染,而是直接会在服务端进行替换。因此可以通过这个特征在文章中插入一些来自服务端的数据,也可以执行一些函数。例如说一篇文章的标题为「实例标题」,他的正文内容为:\n\n将会输出:\n\n又比如说:\n\n将会输出:\n\n这是一个动态的数据,dayjs 函数由服务端提供。\n所有的函数方法均在服务端执行,请注意内存的泄露造成系统的不稳定。","语法格式#语法格式":"以 [[ 开头, ]] 结尾,注意一个空格是必须的。","访问变量#访问变量":"访问变量使用 $ 前缀。目前可以访问的变量有:当前记录的所有字段(数据库记录值)比如说:title created slug nid _id ..你可以像这样来调用变量:[[ $created ]]","使用函数#使用函数":"函数的执行行为和云函数的执行行为保持一致。\n执行函数使用 # 前缀。你可以使用任意 JS 代码去执行一个函数,也可以是一个 JS 语句。如:\n\n使用内置方法。如:\n\n内置方法目前有:\ndayjs —— 日期处理\nformatNow(time: Date | string): string —— 相对时间\ncenter(text: string): string —— 居中\nright(text: string): string —— 居右\nopacity(text: string, opacity: number): string —— 透明文本\nblur(text: string, blur: number): string —— 高斯模糊化文字\ncolor(text: string, color: string): string —— 给文字上色\nsize(text: string): string —— 给文字上色"}},"/usage/search":{"title":"Algolia Search","data":{"":"","介绍#介绍":"Algolia 是一个数据库实时搜索服务,能够提供毫秒级的数据库搜索服务,并且其服务能以 API 的形式方便地布局到网页、客户端、APP 等多种场景。像 VuePress 官方文档就是使用的 Algolia 搜索,使用 Algolia 搜索最大的好处就是方便,它会自动爬取网站的页面内容并构建索引,你只用申请一个 Algolia 服务,在网站上添加一些代码,就可以实现一个全文搜索功能。","使用#使用":"在这之前,你需要先在 Algolia 官网注册一个账号,或者直接用第三方登录。","新建应用#新建应用":"登录 Algolia 账号,进入控制台,在左上角点击 Applications 下列表,点击 New Application,填写应用名称,选择 BUILD 订阅(免费),选择好数据中心,点击 Create Application,即可创建一个应用。一些额外说明的地方都在图片上标注了,可参考下面的图片。","创建索引index#创建索引(Index)":"在新建应用之后,你会直接跳转到如下图所示的界面,只需要在输入框中输入一个索引名称,点击 Create Index,即可创建一个索引。请记住你所创建的索引名称(Index Name),后面的步骤会用到。","获取相关变量#获取相关变量":"接下来,在左下角找到齿轮图标,进入设置,在右侧找到 API Keys,进入,这里有两个变量需要复制下来备用,分别是 Application ID 和 Admin API Key,请复制下这两个变量的值,后面的步骤会用到。","后台配置#后台配置":"进入后台,设定->系统->Algolia Search,将“开启 Algolia Search”开关打开,将前面准备的 IndexName、Application ID(AppID) 和 Admin API Key(ApiKey) 填入对应的框中,右上角保存即可。\n至此,Algolia 搜索的配置就完成了。稍等一会,就可以尝试在主页用 Ctrl + K 调用 Algolia 进行站内搜索了。"}},"/usage/serverless":{"title":"云函数","data":{"":"","介绍#介绍":"云函数是 Mix Space 中的一个重要功能,它极大地辅助了使用者在 Mix Space 中的体验。通过云函数,Mix Space 可以额外实现实现歌单解析,追番列表等等的功能。你可以在此处看到 Mix Space 目前收录的云函数 Snappets","使用#使用":"有一些前端主题需要使用云函数,这个时候你需要进入到云函数设置界面,将云函数代码填入到对应的位置。","1-进入云函数设置界面#1. 进入云函数设置界面":"进入后台管理,点击左侧菜单栏的 其他 - 云函数,即可进入云函数管理页面。","2-下载扩展包#2. 下载扩展包":"在右上方,点击 下载拓展包,你将会看到一个弹窗。","3-导入#3. 导入":"请在弹窗内请找到对应的主题的云函数代码,点击导入,即可完成下载对应的云函数代码。\n接下来,你可以在云函数管理页面看到你刚刚导入的云函数代码。","开发者文档#开发者文档":""}},"/usage/xlog":{"title":"xLog 集成","data":{"":"","介绍#介绍":"此功能需要:\nCore: >=3.43.1\n\nxLog 功能可以将你的博客同步到 xLog 平台。具体就是 此文章已经由它的创作者签名并安全地存储在区块链上。当你没有为文章写摘要的时候,可以使用 xLog 平台生成的摘要,当然你也可以使用自己的 GPT API Key 去调用 GPT 去生成摘要。","使用#使用":"在 系统 - 第三方服务集成,填写 xLog SiteId 即可,然后去 xLog 平台去升级为钱包登录即可。钱包的注册方法请根据 xLog 的引导一步步注册。SiteId 是一个字符串,可以在 xLog 平台的设置 - 域名找到;例如 example.xlog.app,即 SiteId = example。当你完成钱包的注册,并使用钱包登录 xLog 平台的时候,就完成设置工作了。接下来你发布文章的时候,会自动的进行同步和签名;当然,需要经过你的同意。"}},"/docs/advanced":{"title":"进阶部署","data":{"":"在您进行进阶部署前,我们给予最后的警告:如果你不是开发者,或者不想折腾,请不要选择进阶部署,因为它需要你具备一定的开发能力。由于自身技术原因导致的问题,我们将不会提供任何技术支持。情节严重者,我们将永久拉黑您的账号。","要求#要求":"已安装 Node.js 16.0.0 或以上版本\n已安装 Git, PNPM, PM2\n已安装 MongoDB, Redis 并正常运行","1-克隆并安装#1. 克隆并安装":"","2-构建--bundle#2. 构建 & Bundle":"","3-配置-ecosystemconfigjs#3. 配置 ecosystem.config.js":"","4-启动#4. 启动":"进入 ./apps/core/out,创建一个 ecosystem.config.js 文件\n将上方复制的内容黏贴进去,然后执行以下命令启动服务","5-反向代理-or-#5. 反向代理 or ...":"剩下的就是你的事了,你可以使用 Nginx 或者 Caddy 等反向代理工具,也可以使用 Cloudflare 等 CDN 服务。本文不再赘述。"}},"/themes":{"title":"前端主题","data":{"":""}},"/themes/yun":{"title":"Yun 主题","data":{"":"由于 Yun 主题将不再维护,此文档将不再更新,但是你仍然可以使用它。","克隆项目#克隆项目":"","安装依赖#安装依赖":"","配置服务#配置服务":"如果你部署 Mix Space 后端与部署 Yun 前端在同一台服务器,并且后端监听的端口为 2333,那么你可以跳过这一步。\n\n前往 ./server/constant.ts\n\n\n\n修改为你的后端 API 地址。","开始构建#开始构建":"","启动前端#启动前端":""}}}
\ No newline at end of file
diff --git a/_next/static/chunks/pages/docs/docker-65c96e9ed5728fb4.js b/_next/static/chunks/pages/docs/docker-70b2d570f212d9df.js
similarity index 64%
rename from _next/static/chunks/pages/docs/docker-65c96e9ed5728fb4.js
rename to _next/static/chunks/pages/docs/docker-70b2d570f212d9df.js
index 1c25ecff..90f761f3 100644
--- a/_next/static/chunks/pages/docs/docker-65c96e9ed5728fb4.js
+++ b/_next/static/chunks/pages/docs/docker-70b2d570f212d9df.js
@@ -1 +1 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[813],{874:function(e,s,t){"use strict";var r=t(6935),n={"text/plain":"Text","text/html":"Url",default:"Text"};e.exports=function(e,s){var t,o,l,a,i,c,d,h,p=!1;s||(s={}),l=s.debug||!1;try{if(i=r(),c=document.createRange(),d=document.getSelection(),(h=document.createElement("span")).textContent=e,h.ariaHidden="true",h.style.all="unset",h.style.position="fixed",h.style.top=0,h.style.clip="rect(0, 0, 0, 0)",h.style.whiteSpace="pre",h.style.webkitUserSelect="text",h.style.MozUserSelect="text",h.style.msUserSelect="text",h.style.userSelect="text",h.addEventListener("copy",function(t){if(t.stopPropagation(),s.format){if(t.preventDefault(),void 0===t.clipboardData){l&&console.warn("unable to use e.clipboardData"),l&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var r=n[s.format]||n.default;window.clipboardData.setData(r,e)}else t.clipboardData.clearData(),t.clipboardData.setData(s.format,e)}s.onCopy&&(t.preventDefault(),s.onCopy(t.clipboardData))}),document.body.appendChild(h),c.selectNodeContents(h),d.addRange(c),!document.execCommand("copy"))throw Error("copy command was unsuccessful");p=!0}catch(r){l&&console.error("unable to copy using execCommand: ",r),l&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(s.format||"text",e),s.onCopy&&s.onCopy(window.clipboardData),p=!0}catch(r){l&&console.error("unable to copy using clipboardData: ",r),l&&console.error("falling back to prompt"),t="message"in s?s.message:"Copy to clipboard: #{key}, Enter",o=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C",a=t.replace(/#{\s*key\s*}/g,o),window.prompt(a,e)}}finally{d&&("function"==typeof d.removeRange?d.removeRange(c):d.removeAllRanges()),h&&document.body.removeChild(h),i()}return p}},635:function(e,s,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/docs/docker",function(){return t(9069)}])},584:function(e,s,t){"use strict";t.d(s,{C:function(){return a}});var r=t(1527),n=t(959),o=t(874),l=t.n(o);function a(e){let{variableNames:s}=e,[t,o]=(0,n.useState)(Array(s.length).fill("")),a=(e,s)=>{let r=[...t];r[e]=s,o(r)};return(0,r.jsxs)("div",{className:"p-4 mt-2",children:[s.map((e,s)=>(0,r.jsxs)("div",{className:"flex items-center space-x-4 mb-4",children:[(0,r.jsx)("input",{type:"text",className:"border rounded px-2 py-2 w-1/2 bg-transparent focus:outline-none focus:border-black hover:border-white-400 transition duration-300 font-[400] font-sans text-sm cursor-not-allowed",value:e.name||e.key,"data-tip":e.key,onMouseOver:e=>{e.target.style.color="transparent",setTimeout(()=>{e.target.style.color="inherit",e.target.value=e.target.dataset.tip},300)},onMouseLeave:s=>{s.target.style.color="transparent",setTimeout(()=>{s.target.style.color="inherit",s.target.value=e.name||e.key},300)},disabled:!0}),(0,r.jsx)("input",{type:"text",className:"border rounded px-2 py-2 w-1/2 focus:outline-none focus:border-black hover:border-gray-400 transition duration-300 font-[400] font-sans text-sm",style:{outline:"none",boxShadow:"none"},placeholder:"Enter value...",value:t[s],onChange:e=>a(s,e.target.value)})]},"".concat(e.key))),(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,r.jsx)("h2",{className:"sr-only",children:"环境变量配置"}),(0,r.jsx)("button",{type:"button",className:"border bg-black w-full text-white px-4 py-2 rounded-lg text-sm transform transition-all duration-300 focus:outline-none hover:bg-gray-700",onClick:()=>{let e=s.map((e,s)=>"".concat(e.key,"=").concat(t[s])).join("\n");l()(e)},children:"复制"})]})]})}},9069:function(e,s,t){"use strict";t.r(s);var r=t(1527),n=t(2027),o=t(6736);t(421);var l=t(9173),a=t(584);function i(e){let s=Object.assign({h1:"h1",h3:"h3",p:"p",pre:"pre",code:"code",span:"span",blockquote:"blockquote",ul:"ul",li:"li",strong:"strong",a:"a"},(0,o.ah)(),e.components);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{children:"Docker 部署"}),"\n","\n",(0,r.jsxs)(l.Rg,{children:[(0,r.jsx)(s.h3,{id:"安装-docker",children:"安装 Docker"}),(0,r.jsx)(s.p,{children:"如果你的服务器在国内,建议使用阿里云的镜像加速,安装命令如下:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"curl"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-fsSL"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://get.docker.com"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"|"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"bash"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-s"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"--mirror"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"Aliyun"})]})})}),(0,r.jsx)(s.p,{children:"在国外,可以直接使用官方脚本安装:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"curl"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-fsSL"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://get.docker.com"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"|"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"bash"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-s"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"docker"})]})})}),(0,r.jsx)(s.p,{children:"如果您成功安装了 Docker 和 Docker-Compose,可以通过以下命令查看版本:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsxs)(s.code,{"data-language":"bash","data-theme":"default",children:[(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-v"})]}),"\n",(0,r.jsx)(s.span,{className:"line",children:" "}),"\n",(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"compose"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"version"})]})]})}),(0,r.jsx)(s.h3,{id:"拉取配置文件",children:"拉取配置文件"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsxs)(s.code,{"data-language":"bash","data-theme":"default",children:[(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"cd"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:"&&"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"mkdir"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-p"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"mx-space/core"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:"&&"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"cd"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" $_"})]}),"\n",(0,r.jsx)(s.span,{className:"line",children:" "}),"\n",(0,r.jsx)(s.span,{className:"line",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"# 拉取docker-compose.yml 文件"})}),"\n",(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"wget"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://fastly.jsdelivr.net/gh/mx-space/core@master/docker-compose.yml"})]})]})}),(0,r.jsx)(s.h3,{id:"配置-core-启动配置文件",children:"配置 Core 启动配置文件"}),(0,r.jsxs)(s.p,{children:["在下方的表格里填入你的配置,然后点击复制,创建一个 ",(0,r.jsx)(s.code,{children:".env"})," 文件,将复制的内容粘贴进去,保存即可。"]}),(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"鼠标悬停在下方的表格中,可以查看对应的配置项名字。"}),"\n"]}),(0,r.jsx)(a.C,{variableNames:[{key:"JWT_SECRET",name:"[JWT 密钥] 长度不小于 16 个字符,不大于 32 个字符"},{key:"ALLOWED_ORIGINS",name:"[被允许的域名] 如果允许多个域名访问,用英文逗号,分隔"},{key:"ENCRYPT_ENABLE",name:"[是否开启加密] true 为开启,false 为关闭"},{key:"ENCRYPT_KEY",name:"[加密密钥] 详情请见下方提示"}]}),(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JWT 密钥"})}),":需要填写长度不小于 16 个字符,不大于 32 个字符的字符串,用于加密用户的 JWT,务必保存好自己的密钥,不要泄露给他人。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"被允许的域名"})}),":需要填写被允许的域名,通常是前端的域名,如果允许多个域名访问,用英文逗号,分隔。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"是否开启加密"})}),":如果你确定要开启加密,将 false 改为 true,开启加密后,你需要在下方填写加密密钥。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"加密密钥"})}),":具体内容可参考 ",(0,r.jsx)(s.a,{href:"https://mx-space.js.org/feature/security.html",children:"https://mx-space.js.org/feature/security.html"})]}),"\n"]}),(0,r.jsx)(l.UW,{type:"warning",children:(0,r.jsxs)(s.p,{children:["若开启加密,则需注意密钥长度",(0,r.jsx)(s.strong,{children:"必须为 64 位"}),",不然会在初始化时报错。注意这是",(0,r.jsx)(s.strong,{children:"不可逆"}),"的,务必保存自己的秘钥。所以并不是非常推荐使用,除非你真的需要加密,"]})}),(0,r.jsx)(s.h3,{id:"启动-core",children:"启动 Core"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"compose"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"up"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-d"})]})})}),(0,r.jsx)(s.h3,{id:"完成",children:"完成"}),(0,r.jsx)(s.p,{children:"恭喜你完成了 Core 部署,不过仅仅如此是不够的,你需要对 Core 进行初始化等等,尽情探索吧!"})]})]})}s.default=(0,n.j)({MDXContent:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,o.ah)(),e.components);return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(i,{...e})}):i(e)},pageOpts:{filePath:"pages/docs/docker.mdx",route:"/docs/docker",headings:[{depth:1,value:"Docker 部署",id:"docker-部署"},{depth:3,value:"安装 Docker",id:"安装-docker"},{depth:3,value:"拉取配置文件",id:"拉取配置文件"},{depth:3,value:"配置 Core 启动配置文件",id:"配置-core-启动配置文件"},{depth:3,value:"启动 Core",id:"启动-core"},{depth:3,value:"完成",id:"完成"}],title:"Docker 部署"},pageNextRoute:"/docs/docker"})},6935:function(e){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var s=document.activeElement,t=[],r=0;r{let r=[...t];r[e]=s,o(r)};return(0,r.jsxs)("div",{className:"p-4 mt-2",children:[s.map((e,s)=>(0,r.jsxs)("div",{className:"flex items-center space-x-4 mb-4",children:[(0,r.jsx)("input",{type:"text",className:"border rounded px-2 py-2 w-1/2 bg-transparent focus:outline-none focus:border-black hover:border-white-400 transition duration-300 font-[400] font-sans text-sm cursor-not-allowed",value:e.name||e.key,"data-tip":e.key,onMouseOver:e=>{e.target.style.color="transparent",setTimeout(()=>{e.target.style.color="inherit",e.target.value=e.target.dataset.tip},300)},onMouseLeave:s=>{s.target.style.color="transparent",setTimeout(()=>{s.target.style.color="inherit",s.target.value=e.name||e.key},300)},disabled:!0}),(0,r.jsx)("input",{type:"text",className:"border rounded px-2 py-2 w-1/2 focus:outline-none focus:border-black hover:border-gray-400 transition duration-300 font-[400] font-sans text-sm",style:{outline:"none",boxShadow:"none"},placeholder:"Enter value...",value:t[s],onChange:e=>a(s,e.target.value)})]},"".concat(e.key))),(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,r.jsx)("h2",{className:"sr-only",children:"环境变量配置"}),(0,r.jsx)("button",{type:"button",className:"border bg-black w-full text-white px-4 py-2 rounded-lg text-sm transform transition-all duration-300 focus:outline-none hover:bg-gray-700",onClick:()=>{let e=s.map((e,s)=>"".concat(e.key,"=").concat(t[s])).join("\n");l()(e)},children:"复制"})]})]})}},9069:function(e,s,t){"use strict";t.r(s);var r=t(1527),n=t(2027),o=t(6736);t(421);var l=t(9173),a=t(584);function i(e){let s=Object.assign({h1:"h1",h3:"h3",p:"p",pre:"pre",code:"code",span:"span",blockquote:"blockquote",ul:"ul",li:"li",strong:"strong",a:"a"},(0,o.ah)(),e.components);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{children:"Docker 部署"}),"\n","\n",(0,r.jsxs)(l.Rg,{children:[(0,r.jsx)(s.h3,{id:"安装-docker",children:"安装 Docker"}),(0,r.jsx)(s.p,{children:"如果你的服务器在国内,建议使用阿里云的镜像加速,安装命令如下:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"curl"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-fsSL"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://get.docker.com"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"|"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"bash"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-s"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"--mirror"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"Aliyun"})]})})}),(0,r.jsx)(s.p,{children:"在国外,可以直接使用官方脚本安装:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"curl"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-fsSL"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://get.docker.com"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"|"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"bash"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-s"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"docker"})]})})}),(0,r.jsx)(s.p,{children:"如果您成功安装了 Docker 和 Docker-Compose,可以通过以下命令查看版本:"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsxs)(s.code,{"data-language":"bash","data-theme":"default",children:[(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-v"})]}),"\n",(0,r.jsx)(s.span,{className:"line",children:" "}),"\n",(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"compose"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"version"})]})]})}),(0,r.jsx)(s.h3,{id:"拉取配置文件",children:"拉取配置文件"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsxs)(s.code,{"data-language":"bash","data-theme":"default",children:[(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"cd"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:"&&"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"mkdir"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-p"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"mx-space/core"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:"&&"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"cd"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" $_"})]}),"\n",(0,r.jsx)(s.span,{className:"line",children:" "}),"\n",(0,r.jsx)(s.span,{className:"line",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"# 拉取 docker-compose.yml 文件"})}),"\n",(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"wget"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"https://fastly.jsdelivr.net/gh/mx-space/core@master/docker-compose.yml"})]})]})}),(0,r.jsx)(s.h3,{id:"配置-core-启动配置文件",children:"配置 Core 启动配置文件"}),(0,r.jsxs)(s.p,{children:["在下方的表格里填入你的配置,然后点击复制,创建一个 ",(0,r.jsx)(s.code,{children:".env"})," 文件,将复制的内容粘贴进去,保存即可。"]}),(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"鼠标悬停在下方的表格中,可以查看对应的配置项名字。"}),"\n"]}),(0,r.jsx)(a.C,{variableNames:[{key:"JWT_SECRET",name:"[JWT 密钥] 长度不小于 16 个字符,不大于 32 个字符"},{key:"ALLOWED_ORIGINS",name:"[被允许的域名] 如果允许多个域名访问,用英文逗号,分隔"},{key:"ENCRYPT_ENABLE",name:"[是否开启加密] true 为开启,false 为关闭"},{key:"ENCRYPT_KEY",name:"[加密密钥] 详情请见下方提示"}]}),(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"JWT 密钥"})}),":需要填写长度不小于 16 个字符,不大于 32 个字符的字符串,用于加密用户的 JWT,务必保存好自己的密钥,不要泄露给他人。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"被允许的域名"})}),":需要填写被允许的域名,通常是前端的域名,如果允许多个域名访问,用英文逗号,分隔。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"是否开启加密"})}),":如果你确定要开启加密,将 false 改为 true,开启加密后,你需要在下方填写加密密钥。"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:(0,r.jsx)(s.code,{children:"加密密钥"})}),":具体内容可参考 ",(0,r.jsx)(s.a,{href:"https://mx-space.js.org/feature/security.html",children:"https://mx-space.js.org/feature/security.html"})]}),"\n"]}),(0,r.jsx)(l.UW,{type:"warning",children:(0,r.jsxs)(s.p,{children:["若开启加密,则需注意密钥长度",(0,r.jsx)(s.strong,{children:"必须为 64 位"}),",不然会在初始化时报错。注意这是",(0,r.jsx)(s.strong,{children:"不可逆"}),"的,务必保存自己的秘钥。所以并不是非常推荐使用,除非你真的需要加密,"]})}),(0,r.jsx)(s.h3,{id:"启动-core",children:"启动 Core"}),(0,r.jsx)(s.pre,{"data-language":"bash","data-theme":"default",hasCopyCode:!0,children:(0,r.jsx)(s.code,{"data-language":"bash","data-theme":"default",children:(0,r.jsxs)(s.span,{className:"line",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"docker"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"compose"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"up"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:"-d"})]})})}),(0,r.jsx)(s.h3,{id:"完成",children:"完成"}),(0,r.jsxs)(s.p,{children:["恭喜你完成了 Core 部署,不过仅仅如此是不够的,你需要进入后台对 Core 进行初始化等操作(在反向代理之后进行),这里不再赘述。除此之外,如引言所述还需要部署一个",(0,r.jsx)(s.strong,{children:"前端"}),"主题用于展示,请参考 ",(0,r.jsx)(s.a,{href:"https://mx-space.js.org/themes",children:"前端主题文档"})," 继续完成部署前端主题的步骤。"]})]})]})}s.default=(0,n.j)({MDXContent:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,o.ah)(),e.components);return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(i,{...e})}):i(e)},pageOpts:{filePath:"pages/docs/docker.mdx",route:"/docs/docker",headings:[{depth:1,value:"Docker 部署",id:"docker-部署"},{depth:3,value:"安装 Docker",id:"安装-docker"},{depth:3,value:"拉取配置文件",id:"拉取配置文件"},{depth:3,value:"配置 Core 启动配置文件",id:"配置-core-启动配置文件"},{depth:3,value:"启动 Core",id:"启动-core"},{depth:3,value:"完成",id:"完成"}],title:"Docker 部署"},pageNextRoute:"/docs/docker"})},6935:function(e){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var s=document.activeElement,t=[],r=0;r