[{"data":1,"prerenderedAt":953},["ShallowReactive",2],{"docs-list-zh":3,"docs-zh-introduction":911},[4,189,415,550,613,721],{"id":5,"title":6,"body":7,"description":181,"extension":182,"meta":183,"navigation":184,"path":185,"seo":186,"stem":187,"__hash__":188},"docs_zh\u002Fzh\u002Fdocs\u002Fcli.md","CLI 参考",{"type":8,"value":9,"toc":175},"minimark",[10,14,22,136,140,157,160],[11,12,6],"h1",{"id":13},"cli-参考",[15,16,17,21],"p",{},[18,19,20],"code",{},"passerelle"," 命令提供以下子命令。",[23,24,25,38],"table",{},[26,27,28],"thead",{},[29,30,31,35],"tr",{},[32,33,34],"th",{},"命令",[32,36,37],{},"说明",[39,40,41,52,62,72,82,92,106,116,126],"tbody",{},[29,42,43,49],{},[44,45,46],"td",{},[18,47,48],{},"passerelle setup",[44,50,51],{},"向网关注册守护进程、生成身份，并在 PM2 下启动。",[29,53,54,59],{},[44,55,56],{},[18,57,58],{},"passerelle link",[44,60,61],{},"输出一次性链接，用于打开仪表盘并用 PIN 验证机器。",[29,63,64,69],{},[44,65,66],{},[18,67,68],{},"passerelle status",[44,70,71],{},"显示守护进程状态、隧道 URL 与已注册服务。",[29,73,74,79],{},[44,75,76],{},[18,77,78],{},"passerelle attach",[44,80,81],{},"附加到正在运行的守护进程前台 UI。",[29,83,84,89],{},[44,85,86],{},[18,87,88],{},"passerelle detach",[44,90,91],{},"分离 UI 而不终止守护进程（在 UI 中 Ctrl+C 也会分离）。",[29,93,94,99],{},[44,95,96],{},[18,97,98],{},"passerelle version",[44,100,101,102,105],{},"输出守护进程版本与提交哈希（",[18,103,104],{},"--json"," 输出机器可读格式）。",[29,107,108,113],{},[44,109,110],{},[18,111,112],{},"passerelle config",[44,114,115],{},"编辑持久化用户配置（网关 URL、身份）。",[29,117,118,123],{},[44,119,120],{},[18,121,122],{},"passerelle credits",[44,124,125],{},"显示项目致谢与链接。",[29,127,128,133],{},[44,129,130],{},[18,131,132],{},"passerelle restart",[44,134,135],{},"重启由 PM2 管理的守护进程。",[137,138,139],"h2",{"id":139},"全局参数",[141,142,143],"ul",{},[144,145,146,149,150,153,154,156],"li",{},[18,147,148],{},"-v",", ",[18,151,152],{},"--version"," — ",[18,155,98],{}," 的别名",[137,158,159],{"id":159},"底层机制",[15,161,162,163,167,168,170,171,174],{},"守护进程在 ",[164,165,166],"strong",{},"PM2"," 下运行，以便在重启后继续存活。",[18,169,132],{}," 会重新加载已构建的 ",[18,172,173],{},"dist\u002F","，无需重新安装包。",{"title":176,"searchDepth":177,"depth":177,"links":178},"",2,[179,180],{"id":139,"depth":177,"text":139},{"id":159,"depth":177,"text":159},"passerelle 命令提供以下子命令。","md",{},true,"\u002Fzh\u002Fdocs\u002Fcli",{"title":6,"description":181},"zh\u002Fdocs\u002Fcli","oLS6b9bmaCEOQ6suZZHADe3apd_HO5DnmCbF6HnH6cY",{"id":190,"title":191,"body":192,"description":198,"extension":182,"meta":410,"navigation":184,"path":411,"seo":412,"stem":413,"__hash__":414},"docs_zh\u002Fzh\u002Fdocs\u002Fcontribution.md","贡献指南",{"type":8,"value":193,"toc":404},[194,196,199,202,205,293,296,299,361,364,393,397,400],[11,195,191],{"id":191},[15,197,198],{},"感谢您对 Passerelle 的关注！我们欢迎所有的贡献，无论是提交 Bug 报告还是开发新功能。",[137,200,201],{"id":201},"快速开始",[15,203,204],{},"要设置开发环境，您需要安装 Docker 和 Node.js。",[206,207,208,247,275],"ol",{},[144,209,210,213,214],{},[164,211,212],{},"克隆仓库","：",[215,216,220],"pre",{"className":217,"code":218,"language":219,"meta":176,"style":176},"language-bash shiki shiki-themes github-dark","git clone https:\u002F\u002Fgithub.com\u002Fjules-gd-dev\u002Fpasserelle.git\ncd passerelle\n","bash",[18,221,222,238],{"__ignoreMap":176},[223,224,227,231,235],"span",{"class":225,"line":226},"line",1,[223,228,230],{"class":229},"svObZ","git",[223,232,234],{"class":233},"sU2Wk"," clone",[223,236,237],{"class":233}," https:\u002F\u002Fgithub.com\u002Fjules-gd-dev\u002Fpasserelle.git\n",[223,239,240,244],{"class":225,"line":177},[223,241,243],{"class":242},"sDLfK","cd",[223,245,246],{"class":233}," passerelle\n",[144,248,249,252,253],{},[164,250,251],{},"启动开发环境","：\nPasserelle 使用 Docker Compose 来编排网关 API、Web 仪表盘和 Cloudflare 隧道。",[215,254,256],{"className":217,"code":255,"language":219,"meta":176,"style":176},"docker compose -f docker-compose.dev.yml up\n",[18,257,258],{"__ignoreMap":176},[223,259,260,263,266,269,272],{"class":225,"line":226},[223,261,262],{"class":229},"docker",[223,264,265],{"class":233}," compose",[223,267,268],{"class":242}," -f",[223,270,271],{"class":233}," docker-compose.dev.yml",[223,273,274],{"class":233}," up\n",[144,276,277,213,280],{},[164,278,279],{},"安装 CLI 依赖",[215,281,283],{"className":217,"code":282,"language":219,"meta":176,"style":176},"npm install\n",[18,284,285],{"__ignoreMap":176},[223,286,287,290],{"class":225,"line":226},[223,288,289],{"class":229},"npm",[223,291,292],{"class":233}," install\n",[137,294,295],{"id":295},"代码质量",[15,297,298],{},"我们执行严格的代码格式化和静态检查。在提交 Pull Request 之前，请确保您的代码通过所有测试：",[215,300,302],{"className":217,"code":301,"language":219,"meta":176,"style":176},"# 格式化代码\nnpm run format\n\n# 运行代码检查 (Linter)\nnpm run lint\n\n# 运行测试\nnpm test\n",[18,303,304,310,320,326,332,342,347,353],{"__ignoreMap":176},[223,305,306],{"class":225,"line":226},[223,307,309],{"class":308},"sAwPA","# 格式化代码\n",[223,311,312,314,317],{"class":225,"line":177},[223,313,289],{"class":229},[223,315,316],{"class":233}," run",[223,318,319],{"class":233}," format\n",[223,321,323],{"class":225,"line":322},3,[223,324,325],{"emptyLinePlaceholder":184},"\n",[223,327,329],{"class":225,"line":328},4,[223,330,331],{"class":308},"# 运行代码检查 (Linter)\n",[223,333,335,337,339],{"class":225,"line":334},5,[223,336,289],{"class":229},[223,338,316],{"class":233},[223,340,341],{"class":233}," lint\n",[223,343,345],{"class":225,"line":344},6,[223,346,325],{"emptyLinePlaceholder":184},[223,348,350],{"class":225,"line":349},7,[223,351,352],{"class":308},"# 运行测试\n",[223,354,356,358],{"class":225,"line":355},8,[223,357,289],{"class":229},[223,359,360],{"class":233}," test\n",[137,362,363],{"id":363},"提交更改",[206,365,366,372,383,386],{},[144,367,368,369],{},"创建一个特性分支：",[18,370,371],{},"git checkout -b feature\u002Fmy-feature",[144,373,374,375,382],{},"遵循 ",[376,377,381],"a",{"href":378,"rel":379},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[380],"nofollow","Conventional Commits"," 规范提交您的更改。",[144,384,385],{},"推送分支并开启 Pull Request。",[144,387,388,389,392],{},"代码合并后，欢迎将您的名字添加到仓库根目录的 ",[18,390,391],{},"AUTHORS.md"," 文件中！",[137,394,396],{"id":395},"ai-代理与自动化","AI 代理与自动化",[15,398,399],{},"我们明确欢迎由 AI 生成的贡献和自主代理提交的 Pull Request！只要代码严格遵守本项目的代码检查 (Linting)、格式化和设计准则，我们都会乐意接受。我们认识到，随着软件工程本身性质的快速发展，这些规则将不断演变，我们非常期待与整个生态系统共同适应和进化。",[401,402,403],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":176,"searchDepth":177,"depth":177,"links":405},[406,407,408,409],{"id":201,"depth":177,"text":201},{"id":295,"depth":177,"text":295},{"id":363,"depth":177,"text":363},{"id":395,"depth":177,"text":396},{},"\u002Fzh\u002Fdocs\u002Fcontribution",{"title":191,"description":198},"zh\u002Fdocs\u002Fcontribution","o60-VS_FTdIJE2AmEf_Acv09ULFq2TdPHJu7P08KZ4Y",{"id":416,"title":417,"body":418,"description":176,"extension":182,"meta":545,"navigation":184,"path":546,"seo":547,"stem":548,"__hash__":549},"docs_zh\u002Fzh\u002Fdocs\u002Finstall.md","安装",{"type":8,"value":419,"toc":538},[420,422,425,436,442,445,463,466,478,485,496,499,511,514,517,529,535],[11,421,417],{"id":417},[137,423,424],{"id":424},"前置要求",[141,426,427,433],{},[144,428,429,432],{},[164,430,431],{},"Node.js 20+"," 与 npm",[144,434,435],{},"一台你要访问的机器（守护进程）",[15,437,438,441],{},[18,439,440],{},"cloudflared"," 二进制文件会在首次运行时自动下载——你无需自行安装 Cloudflare 工具。",[137,443,444],{"id":444},"安装守护进程",[215,446,448],{"className":217,"code":447,"language":219,"meta":176,"style":176},"npm install -g @julesgd\u002Fpasserelle\n",[18,449,450],{"__ignoreMap":176},[223,451,452,454,457,460],{"class":225,"line":226},[223,453,289],{"class":229},[223,455,456],{"class":233}," install",[223,458,459],{"class":242}," -g",[223,461,462],{"class":233}," @julesgd\u002Fpasserelle\n",[137,464,465],{"id":465},"首次设置",[215,467,469],{"className":217,"code":468,"language":219,"meta":176,"style":176},"passerelle setup\n",[18,470,471],{"__ignoreMap":176},[223,472,473,475],{"class":225,"line":226},[223,474,20],{"class":229},[223,476,477],{"class":233}," setup\n",[15,479,480,481,484],{},"这会向网关注册守护进程、生成身份，并在 PM2 下启动守护进程。你会获得一个 ",[164,482,483],{},"PIN","，用于在仪表盘中验证该机器。",[486,487,488],"blockquote",{},[15,489,490,491,495],{},"默认情况下，守护进程会向官方网关注册。若要使用你自己的网关，请参阅",[376,492,494],{"href":493},"\u002Fzh\u002Fdocs\u002Fself-host","自托管网关","。",[137,497,498],{"id":498},"获取新的隧道链接",[215,500,502],{"className":217,"code":501,"language":219,"meta":176,"style":176},"passerelle link\n",[18,503,504],{"__ignoreMap":176},[223,505,506,508],{"class":225,"line":226},[223,507,20],{"class":229},[223,509,510],{"class":233}," link\n",[15,512,513],{},"输出一个一次性方框链接，用于打开仪表盘并使用 PIN 验证机器。PIN 在使用后立即轮换。",[137,515,516],{"id":516},"查看状态",[215,518,520],{"className":217,"code":519,"language":219,"meta":176,"style":176},"passerelle status\n",[18,521,522],{"__ignoreMap":176},[223,523,524,526],{"class":225,"line":226},[223,525,20],{"class":229},[223,527,528],{"class":233}," status\n",[15,530,531,532,534],{},"阅读 ",[376,533,6],{"href":185},"了解所有命令。",[401,536,537],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":176,"searchDepth":177,"depth":177,"links":539},[540,541,542,543,544],{"id":424,"depth":177,"text":424},{"id":444,"depth":177,"text":444},{"id":465,"depth":177,"text":465},{"id":498,"depth":177,"text":498},{"id":516,"depth":177,"text":516},{},"\u002Fzh\u002Fdocs\u002Finstall",{"title":417,"description":176},"zh\u002Fdocs\u002Finstall","Sz02JF3j8GxINoWUwBfTgghNIJ-8XXnUthsWlQuSmQk",{"id":551,"title":552,"body":553,"description":560,"extension":182,"meta":608,"navigation":184,"path":609,"seo":610,"stem":611,"__hash__":612},"docs_zh\u002Fzh\u002Fdocs\u002Fintroduction.md","简介",{"type":8,"value":554,"toc":603},[555,558,561,564,567,570,594,597],[11,556,557],{"id":20},"Passerelle",[15,559,560],{},"Passerelle 通过临时的 Cloudflare 隧道暴露本地服务，并由自托管的网关编排。浏览器从不持有任何长期凭证——令牌仅保留在服务端的 httpOnly cookie 中。",[137,562,563],{"id":563},"为何使用",[15,565,566],{},"将开发服务器、数据库界面或任何本地服务暴露到互联网，通常意味着暴露一个端口，或把流量托付给第三方。Passerelle 为每台机器提供一个隧道，由你掌控的网关进行认证，其安全模型的设计使得凭证不会通过 URL、日志或浏览器泄露。",[137,568,569],{"id":569},"三个组成部分",[141,571,572,582,588],{},[144,573,574,577,578,581],{},[164,575,576],{},"守护进程","（",[18,579,580],{},"@julesgd\u002Fpasserelle","）—— 运行在你要访问的机器上。开启 Cloudflare 隧道并将请求代理到本地服务。",[144,583,584,587],{},[164,585,586],{},"网关"," —— 一个自托管服务器（Hono），通过 WebSocket 认证守护进程、签发一次性交接码，并提供仪表盘。",[144,589,590,593],{},[164,591,592],{},"仪表盘"," —— 一个 PWA，用于连接机器、验证 PIN 并打开服务。",[137,595,596],{"id":596},"下一步",[15,598,599,600,602],{},"阅读",[376,601,417],{"href":546},"，用一条命令启动守护进程。",{"title":176,"searchDepth":177,"depth":177,"links":604},[605,606,607],{"id":563,"depth":177,"text":563},{"id":569,"depth":177,"text":569},{"id":596,"depth":177,"text":596},{},"\u002Fzh\u002Fdocs\u002Fintroduction",{"title":552,"description":560},"zh\u002Fdocs\u002Fintroduction","TkyMstc0luzWmhDjkREMnvtr6UeYxdgNhjkbXje74KQ",{"id":614,"title":615,"body":616,"description":622,"extension":182,"meta":716,"navigation":184,"path":717,"seo":718,"stem":719,"__hash__":720},"docs_zh\u002Fzh\u002Fdocs\u002Fsecurity.md","安全模型",{"type":8,"value":617,"toc":707},[618,620,623,626,642,645,655,658,669,673,680,684,687,690,693,696],[11,619,615],{"id":615},[15,621,622],{},"Passerelle 的设计使得长期凭证既无法到达浏览器，也不会出现在 URL 中。每一项加固都在源码中就地记录",[137,624,625],{"id":625},"与秘密绑定的握手",[15,627,628,629,632,633,637,638,641],{},"每个守护进程使用",[164,630,631],{},"每机器独有的秘密","注册。用",[634,635,636],"em",{},"不同","秘密声称同一 ",[18,639,640],{},"machineId"," 的重新注册会被拒绝，因此在重连窗口内，已知的机器 ID 无法被劫持。",[137,643,644],{"id":644},"令牌永不离开服务器",[15,646,647,648,577,651,654],{},"长期会话令牌仅存于网关上一个",[164,649,650],{},"经 httpOnly、AES-256-GCM 加密的 cookie",[18,652,653],{},"__Host-passerelle_sessions","）中。浏览器从不接收它，因此仪表盘上的 XSS 无法窃取它。",[137,656,657],{"id":657},"一次性交接码",[15,659,660,661,664,665,668],{},"打开服务时",[164,662,663],{},"不会","带着令牌重定向。网关通过可信 WebSocket 向守护进程推送一个一次性交接码，然后仅以 ",[18,666,667],{},"?code=\u003Ccode>"," 重定向浏览器。守护进程将该代码一次性兑换为 httpOnly cookie。因此令牌永远不会出现在历史记录、Referer 或访问日志中。",[137,670,672],{"id":671},"pin-轮换","PIN 轮换",[15,674,675,676,679],{},"用于验证机器的 PIN 在使用后",[164,677,678],{},"立即失效","，包括在 headless（PM2）模式下。",[137,681,683],{"id":682},"ssrf-防护","SSRF 防护",[15,685,686],{},"代理在转发前拒绝私网与链路本地目标地址，阻断将隧道用作内部 SSRF 探测的尝试。",[137,688,689],{"id":689},"速率限制",[15,691,692],{},"PIN 验证、代理与公开端点各自带有按 IP 的限流，以削弱暴力破解与滥用。",[137,694,695],{"id":695},"纵深防御",[141,697,698,701,704],{},[144,699,700],{},"守护进程以最低权限在 PM2 下运行。",[144,702,703],{},"网关容器丢弃所有 Linux capabilities 并禁止提权。",[144,705,706],{},"版本策略端点让网关能向过时的守护进程与 PWA 发出警告。",{"title":176,"searchDepth":177,"depth":177,"links":708},[709,710,711,712,713,714,715],{"id":625,"depth":177,"text":625},{"id":644,"depth":177,"text":644},{"id":657,"depth":177,"text":657},{"id":671,"depth":177,"text":672},{"id":682,"depth":177,"text":683},{"id":689,"depth":177,"text":689},{"id":695,"depth":177,"text":695},{},"\u002Fzh\u002Fdocs\u002Fsecurity",{"title":615,"description":622},"zh\u002Fdocs\u002Fsecurity","JmxkviG0fI6vowiF5k93iC4tsGWF_Y0I5OrzybqqjJU",{"id":722,"title":494,"body":723,"description":729,"extension":182,"meta":907,"navigation":184,"path":493,"seo":908,"stem":909,"__hash__":910},"docs_zh\u002Fzh\u002Fdocs\u002Fself-host.md",{"type":8,"value":724,"toc":901},[725,727,730,732,752,755,758,818,830,833,855,858,881,884,893,898],[11,726,494],{"id":494},[15,728,729],{},"网关是一个小型的 Hono 服务器，通过 WebSocket 认证守护进程、存储机器↔秘密绑定，并提供仪表盘 PWA。它通过 Cloudflare 隧道暴露到互联网。",[137,731,424],{"id":424},[141,733,734,745],{},[144,735,736,737,740,741,744],{},"一个 Cloudflare 账户，以及用 ",[18,738,739],{},"cloudflared tunnel create \u003C名称>"," 创建的隧道——记下",[164,742,743],{},"隧道 UUID"," 与生成的凭证 JSON。",[144,746,747,748,751],{},"一个指向该隧道的主机名（例如 ",[18,749,750],{},"passerelle.example.com","）。",[137,753,754],{"id":754},"配置",[15,756,757],{},"复制环境模板并填入你的值：",[215,759,763],{"className":760,"code":761,"language":762,"meta":176,"style":176},"language-ini shiki shiki-themes github-dark","# .env\nTUNNEL_UUID=\u003C你的隧道uuid>\nTUNNEL_CREDENTIALS_PATH=\u002Fetc\u002Fcloudflared\u002F\u003C你的隧道uuid>.json\nTUNNEL_HOSTNAME=\u003C你的隧道主机名>\n\n# 32 字节的十六进制密钥——用以下命令生成：\n# node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\nSESSION_COOKIE_KEY=\n","ini",[18,764,765,770,780,788,796,800,805,810],{"__ignoreMap":176},[223,766,767],{"class":225,"line":226},[223,768,769],{"class":308},"# .env\n",[223,771,772,776],{"class":225,"line":177},[223,773,775],{"class":774},"snl16","TUNNEL_UUID",[223,777,779],{"class":778},"s95oV","=\u003C你的隧道uuid>\n",[223,781,782,785],{"class":225,"line":322},[223,783,784],{"class":774},"TUNNEL_CREDENTIALS_PATH",[223,786,787],{"class":778},"=\u002Fetc\u002Fcloudflared\u002F\u003C你的隧道uuid>.json\n",[223,789,790,793],{"class":225,"line":328},[223,791,792],{"class":774},"TUNNEL_HOSTNAME",[223,794,795],{"class":778},"=\u003C你的隧道主机名>\n",[223,797,798],{"class":225,"line":334},[223,799,325],{"emptyLinePlaceholder":184},[223,801,802],{"class":225,"line":344},[223,803,804],{"class":308},"# 32 字节的十六进制密钥——用以下命令生成：\n",[223,806,807],{"class":225,"line":349},[223,808,809],{"class":308},"# node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n",[223,811,812,815],{"class":225,"line":355},[223,813,814],{"class":774},"SESSION_COOKIE_KEY",[223,816,817],{"class":778},"=\n",[15,819,820,822,823,825,826,829],{},[18,821,814],{}," 用于加密 ",[18,824,653],{}," cookie。它在重启间",[164,827,828],{},"必须保持稳定","，否则每次部署都会使所有浏览器会话失效。",[137,831,832],{"id":832},"启动",[215,834,836],{"className":217,"code":835,"language":219,"meta":176,"style":176},"docker compose -f docker-compose.prod.yml up -d\n",[18,837,838],{"__ignoreMap":176},[223,839,840,842,844,846,849,852],{"class":225,"line":226},[223,841,262],{"class":229},[223,843,265],{"class":233},[223,845,268],{"class":242},[223,847,848],{"class":233}," docker-compose.prod.yml",[223,850,851],{"class":233}," up",[223,853,854],{"class":242}," -d\n",[15,856,857],{},"这会启动三个服务：",[141,859,860,866,874],{},[144,861,862,865],{},[18,863,864],{},"app"," —— 网关 API + 静态 PWA，已加固（丢弃 capabilities、禁止提权）。",[144,867,868,871,872,495],{},[18,869,870],{},"tunnel"," —— 在你的主机名上暴露网关的 ",[18,873,440],{},[144,875,876,877,880],{},"一个 ",[18,878,879],{},"passerelle-data"," 卷，存放机器注册表——在部署间保留它，以免守护进程被重新质询。",[137,882,883],{"id":883},"将守护进程指向你的网关",[15,885,886,887,889,890,892],{},"在 ",[18,888,48],{}," 时提供你的网关 URL（而非官方的），或稍后用 ",[18,891,112],{}," 编辑。",[15,894,599,895,897],{},[376,896,615],{"href":717},"以理解每一项加固所防护的内容。",[401,899,900],{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":176,"searchDepth":177,"depth":177,"links":902},[903,904,905,906],{"id":424,"depth":177,"text":424},{"id":754,"depth":177,"text":754},{"id":832,"depth":177,"text":832},{"id":883,"depth":177,"text":883},{},{"title":494,"description":729},"zh\u002Fdocs\u002Fself-host","ustXlz9Yv49TyBBdkp2lDDgNoOVgRqiXFE0vFyBIyyY",{"id":551,"title":552,"body":912,"description":560,"extension":182,"meta":951,"navigation":184,"path":609,"seo":952,"stem":611,"__hash__":612},{"type":8,"value":913,"toc":946},[914,916,918,920,922,924,940,942],[11,915,557],{"id":20},[15,917,560],{},[137,919,563],{"id":563},[15,921,566],{},[137,923,569],{"id":569},[141,925,926,932,936],{},[144,927,928,577,930,581],{},[164,929,576],{},[18,931,580],{},[144,933,934,587],{},[164,935,586],{},[144,937,938,593],{},[164,939,592],{},[137,941,596],{"id":596},[15,943,599,944,602],{},[376,945,417],{"href":546},{"title":176,"searchDepth":177,"depth":177,"links":947},[948,949,950],{"id":563,"depth":177,"text":563},{"id":569,"depth":177,"text":569},{"id":596,"depth":177,"text":596},{},{"title":552,"description":560},1785698531771]