[{"data":1,"prerenderedAt":2123},["ShallowReactive",2],{"navigation_docs_en":3,"-en-tutorials-server-cluster":109,"-en-tutorials-server-cluster-surround":2118},[4,40,65,78,87,100],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"开始使用",false,"/en/getting-started","en/1.getting-started",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"介绍","/en/getting-started/introduction","en/1.getting-started/2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"安装","/en/getting-started/installation","en/1.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"项目结构","/en/getting-started/project-structure","en/1.getting-started/4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Studio 模块","/en/getting-started/studio","en/1.getting-started/5.studio","i-lucide-mouse-pointer-2",{"title":31,"path":32,"stem":33,"icon":34},"迁移","/en/getting-started/migration","en/1.getting-started/6.migration","i-lucide-replace",{"title":36,"path":37,"stem":38,"icon":39},"故障排除","/en/getting-started/troubleshooting","en/1.getting-started/7.troubleshooting","i-lucide-wrench",{"title":41,"path":42,"stem":43,"children":44,"page":6},"基础知识","/en/essentials","en/2.essentials",[45,50,55,60],{"title":46,"path":47,"stem":48,"icon":49},"Markdown 语法","/en/essentials/markdown-syntax","en/2.essentials/1.markdown-syntax","i-lucide-heading-1",{"title":51,"path":52,"stem":53,"icon":54},"代码块","/en/essentials/code-blocks","en/2.essentials/2.code-blocks","i-lucide-code-xml",{"title":56,"path":57,"stem":58,"icon":59},"组件","/en/essentials/components","en/2.essentials/3.components","i-lucide-component",{"title":61,"path":62,"stem":63,"icon":64},"图片与嵌入内容","/en/essentials/images-embeds","en/2.essentials/4.images-embeds","i-lucide-image",{"title":66,"path":67,"stem":68,"children":69,"page":6},"教程","/en/tutorials","en/3.tutorials",[70,74],{"title":71,"path":72,"stem":73},"frp使用指南","/en/tutorials/frpc","en/3.tutorials/1.frpc",{"title":75,"path":76,"stem":77},"服务器集群使用说明","/en/tutorials/server-cluster","en/3.tutorials/2.server-cluster",{"title":79,"path":80,"stem":81,"children":82,"page":6},"文档","/en/documents","en/4.documents",[83],{"title":84,"path":85,"stem":86},"kubernetes技术说明","/en/documents/k8s","en/4.documents/1.k8s",{"title":88,"path":89,"stem":90,"children":91,"page":6},"会议记录","/en/meeting","en/5.meeting",[92,96],{"title":93,"path":94,"stem":95},"会议记录说明","/en/meeting/meeting-introduction","en/5.meeting/0.meeting-introduction",{"title":97,"path":98,"stem":99},"二〇二六 · 起点会议（暨二〇二五 · 终点总结）","/en/meeting/2026-meeting-minutes","en/5.meeting/1.2026-meeting-minutes",{"title":101,"path":102,"stem":103,"children":104,"page":6},"团队项目","/en/projects","en/6.projects",[105],{"title":106,"path":107,"stem":108},"团队项目总览","/en/projects/projects-introduction","en/6.projects/0.projects-introduction",{"id":110,"title":75,"body":111,"description":2111,"extension":2112,"links":2113,"meta":2114,"navigation":2115,"path":76,"seo":2116,"stem":77,"__hash__":2117},"docs_en/en/3.tutorials/2.server-cluster.md",{"type":112,"value":113,"toc":2098},"minimark",[114,119,124,128,145,148,151,155,167,171,180,184,188,197,200,204,207,233,236,296,300,303,306,315,2038,2041,2055,2058,2062,2069,2087,2090,2094],[115,116,118],"h2",{"id":117},"一服务器集群架构说明","一、服务器集群架构说明",[120,121,123],"h3",{"id":122},"_1集群的创建","1.集群的创建",[125,126,127],"p",{},"2026年2月14日,团队成员CN059购买了一台8核心8GB的香港VPS服务器,并将其作为TATEN的云服务器使用.随后几天,CN059又购买了数台美国的高速VPS,并开始了TATEN云计算服务器集群的搭建进程.",[125,129,130,131,138,139,144],{},"集群采用了",[132,133,137],"a",{"href":134,"rel":135},"https://github.com/komari-monitor/komari",[136],"nofollow","Monitor探针监控系统","来对整个集群的服务器实时性能进行监控,可以通过监控系统的",[132,140,143],{"href":141,"rel":142},"https://status.powercess.com",[136],"仪表盘","查看每台服务器的CPU、内存、网络等性能指标,以便对服务器的运行状态进行统一的查看和管理.",[125,146,147],{},"2026年2月19-21日,XinHallow和CN059在香港一服务器上部署了kubernetes的master节点,并将美国一、美国二、美国三共三台服务器作为worker节点加入了kubernetes集群中.",[125,149,150],{},"随后购置了美国四节点,我们将美国四节点作为第二个master节点加入集群中.",[120,152,154],{"id":153},"_2集群的架构","2.集群的架构",[125,156,157,158,162,163,166],{},"集群共有五台服务器,分别是一台香港服务器和四台美国服务器.香港一服务器和美国四服务器是控制平面的master节点,美国一服务器是整个集群的nfs服务器,负责集群的持久化存储.通过 ",[159,160,161],"strong",{},"PersistentVolume（PV）"," 和 ",[159,164,165],{},"PersistentVolumeClaim（PVC）"," 机制将 NFS 存储抽象为 Kubernetes 资源",[120,168,170],{"id":169},"_3集群的详细组件","3.集群的详细组件",[125,172,173,174,179],{},"集群的CNI采用",[132,175,178],{"href":176,"rel":177},"https://cilium.io/",[136],"cilium",",Ingress采用cilium的gateway功能,使用coreDNS作为DNS服务器,使用动态PVC作为持久化存储方案.",[115,181,183],{"id":182},"二如何使用集群部署自己的服务","二、如何使用集群部署自己的服务",[120,185,187],{"id":186},"_1准备连接配置文件","1.准备连接配置文件",[125,189,190,191,196],{},"你需要下载kubectl工具，以实现集群的连接.你可以查看",[132,192,195],{"href":193,"rel":194},"https://kubernetes.io/zh-cn/docs/tasks/tools/",[136],"kubectl安装指南","来获取安装kubectl的详细步骤.",[125,198,199],{},"设置好后,将集群连接配置的config文件放置在默认位置（~/.kube/config）,集群的config连接配置文件可以向集群管理员申请获取.",[120,201,203],{"id":202},"_2验证连接","2.验证连接",[125,205,206],{},"打开终端，输入以下命令来验证你是否成功连接到了集群：",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kubectl get nodes\n","bash","",[215,216,217],"code",{"__ignoreMap":213},[218,219,222,226,230],"span",{"class":220,"line":221},"line",1,[218,223,225],{"class":224},"sBMFI","kubectl",[218,227,229],{"class":228},"sfazB"," get",[218,231,232],{"class":228}," nodes\n",[125,234,235],{},"出现这样的输出代表连接成功：",[208,237,241],{"className":238,"code":239,"language":240,"meta":213,"style":213},"language-log shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cn059@cn059-2 Projects % kubectl get nodes\nNAME STATUS ROLES AGE VERSION\nhd-server Ready worker 4h26m v1.35.1\nhka-k8s-server Ready control-plane 47h v1.35.1\nlhka-k8s-worker Ready worker 98m v1.35.1\nusa-k8s-worker Ready storage 43h v1.35.1\nusc-k8s-worker Ready worker 46h v1.35.1\nusd-k8s-master Ready control-plane 33h v1.35.1\nuse-k8s-worker Ready database 12h v1.35.1\n","log",[215,242,243,248,254,260,266,272,278,284,290],{"__ignoreMap":213},[218,244,245],{"class":220,"line":221},[218,246,247],{},"cn059@cn059-2 Projects % kubectl get nodes\n",[218,249,251],{"class":220,"line":250},2,[218,252,253],{},"NAME STATUS ROLES AGE VERSION\n",[218,255,257],{"class":220,"line":256},3,[218,258,259],{},"hd-server Ready worker 4h26m v1.35.1\n",[218,261,263],{"class":220,"line":262},4,[218,264,265],{},"hka-k8s-server Ready control-plane 47h v1.35.1\n",[218,267,269],{"class":220,"line":268},5,[218,270,271],{},"lhka-k8s-worker Ready worker 98m v1.35.1\n",[218,273,275],{"class":220,"line":274},6,[218,276,277],{},"usa-k8s-worker Ready storage 43h v1.35.1\n",[218,279,281],{"class":220,"line":280},7,[218,282,283],{},"usc-k8s-worker Ready worker 46h v1.35.1\n",[218,285,287],{"class":220,"line":286},8,[218,288,289],{},"usd-k8s-master Ready control-plane 33h v1.35.1\n",[218,291,293],{"class":220,"line":292},9,[218,294,295],{},"use-k8s-worker Ready database 12h v1.35.1\n",[120,297,299],{"id":298},"_3编写自己的服务的配置文件","3.编写自己的服务的配置文件",[125,301,302],{},"我们将采用更加完善的集群管理模式,做到一切配置都可追溯,不过目前服务器还没有部署CI/CD流水线,所以目前只能通过手动部署的方式来完成服务部署.",[125,304,305],{},"不过要注意的是,我们的yaml配置文件都需要写好,验证后才可以部署.",[125,307,308,309,314],{},"使用Git从GitHub仓库中拉取",[132,310,313],{"href":311,"rel":312},"https://github.com/TATENcn/gitops",[136],"gitops仓库","，这个仓库是我们的GitOps仓库，里面计划存放所有集群的配置文件，以及CI/CD流水线。截止目前,仍有很多的配置信息没有迁移,我们将尽快完成迁移工作.",[316,317,321],"code-preview",{"className":318},[319,320],"[&>div]:*:my-0","[&>div]:*:w-full",[322,323,325,373,507,970,1179,1216,1324,1619,1730,1869],"code-tree",{"default-value":324},"base/astrbot/00-namespace.yaml",[208,326,330],{"className":327,"code":328,"filename":324,"language":329,"meta":213,"style":213},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: v1\nkind: Namespace\nmetadata:\n  name: astrbot\n","yaml",[215,331,332,345,355,363],{"__ignoreMap":213},[218,333,334,338,342],{"class":220,"line":221},[218,335,337],{"class":336},"swJcz","apiVersion",[218,339,341],{"class":340},"sMK4o",":",[218,343,344],{"class":228}," v1\n",[218,346,347,350,352],{"class":220,"line":250},[218,348,349],{"class":336},"kind",[218,351,341],{"class":340},[218,353,354],{"class":228}," Namespace\n",[218,356,357,360],{"class":220,"line":256},[218,358,359],{"class":336},"metadata",[218,361,362],{"class":340},":\n",[218,364,365,368,370],{"class":220,"line":262},[218,366,367],{"class":336},"  name",[218,369,341],{"class":340},[218,371,372],{"class":228}," astrbot\n",[208,374,377],{"className":327,"code":375,"filename":376,"language":329,"meta":213,"style":213},"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: astrbot-data-pvc\n  namespace: astrbot\n  labels:\n    app: astrbot\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1Gi\n  # 我们已经在集群中部署了一个全局的动态nfs存储方案,所以这里的storageClassName可以直接设置为 standard\n  storageClassName: standard # uncomment and set proper StorageClass\n","base/astrbot/01-pvc.yaml",[215,378,379,387,396,402,411,420,427,436,443,450,459,467,475,486,493],{"__ignoreMap":213},[218,380,381,383,385],{"class":220,"line":221},[218,382,337],{"class":336},[218,384,341],{"class":340},[218,386,344],{"class":228},[218,388,389,391,393],{"class":220,"line":250},[218,390,349],{"class":336},[218,392,341],{"class":340},[218,394,395],{"class":228}," PersistentVolumeClaim\n",[218,397,398,400],{"class":220,"line":256},[218,399,359],{"class":336},[218,401,362],{"class":340},[218,403,404,406,408],{"class":220,"line":262},[218,405,367],{"class":336},[218,407,341],{"class":340},[218,409,410],{"class":228}," astrbot-data-pvc\n",[218,412,413,416,418],{"class":220,"line":268},[218,414,415],{"class":336},"  namespace",[218,417,341],{"class":340},[218,419,372],{"class":228},[218,421,422,425],{"class":220,"line":274},[218,423,424],{"class":336},"  labels",[218,426,362],{"class":340},[218,428,429,432,434],{"class":220,"line":280},[218,430,431],{"class":336},"    app",[218,433,341],{"class":340},[218,435,372],{"class":228},[218,437,438,441],{"class":220,"line":286},[218,439,440],{"class":336},"spec",[218,442,362],{"class":340},[218,444,445,448],{"class":220,"line":292},[218,446,447],{"class":336},"  accessModes",[218,449,362],{"class":340},[218,451,453,456],{"class":220,"line":452},10,[218,454,455],{"class":340},"    -",[218,457,458],{"class":228}," ReadWriteOnce\n",[218,460,462,465],{"class":220,"line":461},11,[218,463,464],{"class":336},"  resources",[218,466,362],{"class":340},[218,468,470,473],{"class":220,"line":469},12,[218,471,472],{"class":336},"    requests",[218,474,362],{"class":340},[218,476,478,481,483],{"class":220,"line":477},13,[218,479,480],{"class":336},"      storage",[218,482,341],{"class":340},[218,484,485],{"class":228}," 1Gi\n",[218,487,489],{"class":220,"line":488},14,[218,490,492],{"class":491},"sHwdD","  # 我们已经在集群中部署了一个全局的动态nfs存储方案,所以这里的storageClassName可以直接设置为 standard\n",[218,494,496,499,501,504],{"class":220,"line":495},15,[218,497,498],{"class":336},"  storageClassName",[218,500,341],{"class":340},[218,502,503],{"class":228}," standard",[218,505,506],{"class":491}," # uncomment and set proper StorageClass\n",[208,508,511],{"className":327,"code":509,"filename":510,"language":329,"meta":213,"style":213},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: astrbot\n  namespace: astrbot\n  labels:\n    app: astrbot\nspec:\n  replicas: 1\n  strategy:\n    type: Recreate\n  selector:\n    matchLabels:\n      app: astrbot\n  template:\n    metadata:\n      labels:\n        app: astrbot\n    spec:\n      containers:\n        - name: astrbot\n          image: soulter/astrbot:latest\n          imagePullPolicy: IfNotPresent\n          env:\n            - name: TZ\n              value: \"Asia/Shanghai\"\n          ports:\n            - containerPort: 6185\n              name: webui\n            - containerPort: 6199\n              name: qq-ws\n            # - containerPort: 6195\n            #   name: wecom-wh\n            # - containerPort: 6196\n            #   name: qq-off-wh\n          volumeMounts:\n            - name: data\n              mountPath: /AstrBot/data\n            - name: localtime\n              mountPath: /etc/localtime\n              readOnly: true\n      volumes:\n        - name: data\n          persistentVolumeClaim:\n            claimName: astrbot-data-pvc # 因为PVC是全局的，所以直接引用即可\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n            type: File\n","base/astrbot/02-deployment.yaml",[215,512,513,522,531,537,545,553,559,567,573,584,591,601,608,615,624,631,639,647,657,665,673,686,697,708,716,729,746,754,767,778,790,800,806,812,818,824,832,844,855,867,877,889,897,908,916,930,941,949,959],{"__ignoreMap":213},[218,514,515,517,519],{"class":220,"line":221},[218,516,337],{"class":336},[218,518,341],{"class":340},[218,520,521],{"class":228}," apps/v1\n",[218,523,524,526,528],{"class":220,"line":250},[218,525,349],{"class":336},[218,527,341],{"class":340},[218,529,530],{"class":228}," Deployment\n",[218,532,533,535],{"class":220,"line":256},[218,534,359],{"class":336},[218,536,362],{"class":340},[218,538,539,541,543],{"class":220,"line":262},[218,540,367],{"class":336},[218,542,341],{"class":340},[218,544,372],{"class":228},[218,546,547,549,551],{"class":220,"line":268},[218,548,415],{"class":336},[218,550,341],{"class":340},[218,552,372],{"class":228},[218,554,555,557],{"class":220,"line":274},[218,556,424],{"class":336},[218,558,362],{"class":340},[218,560,561,563,565],{"class":220,"line":280},[218,562,431],{"class":336},[218,564,341],{"class":340},[218,566,372],{"class":228},[218,568,569,571],{"class":220,"line":286},[218,570,440],{"class":336},[218,572,362],{"class":340},[218,574,575,578,580],{"class":220,"line":292},[218,576,577],{"class":336},"  replicas",[218,579,341],{"class":340},[218,581,583],{"class":582},"sbssI"," 1\n",[218,585,586,589],{"class":220,"line":452},[218,587,588],{"class":336},"  strategy",[218,590,362],{"class":340},[218,592,593,596,598],{"class":220,"line":461},[218,594,595],{"class":336},"    type",[218,597,341],{"class":340},[218,599,600],{"class":228}," Recreate\n",[218,602,603,606],{"class":220,"line":469},[218,604,605],{"class":336},"  selector",[218,607,362],{"class":340},[218,609,610,613],{"class":220,"line":477},[218,611,612],{"class":336},"    matchLabels",[218,614,362],{"class":340},[218,616,617,620,622],{"class":220,"line":488},[218,618,619],{"class":336},"      app",[218,621,341],{"class":340},[218,623,372],{"class":228},[218,625,626,629],{"class":220,"line":495},[218,627,628],{"class":336},"  template",[218,630,362],{"class":340},[218,632,634,637],{"class":220,"line":633},16,[218,635,636],{"class":336},"    metadata",[218,638,362],{"class":340},[218,640,642,645],{"class":220,"line":641},17,[218,643,644],{"class":336},"      labels",[218,646,362],{"class":340},[218,648,650,653,655],{"class":220,"line":649},18,[218,651,652],{"class":336},"        app",[218,654,341],{"class":340},[218,656,372],{"class":228},[218,658,660,663],{"class":220,"line":659},19,[218,661,662],{"class":336},"    spec",[218,664,362],{"class":340},[218,666,668,671],{"class":220,"line":667},20,[218,669,670],{"class":336},"      containers",[218,672,362],{"class":340},[218,674,676,679,682,684],{"class":220,"line":675},21,[218,677,678],{"class":340},"        -",[218,680,681],{"class":336}," name",[218,683,341],{"class":340},[218,685,372],{"class":228},[218,687,689,692,694],{"class":220,"line":688},22,[218,690,691],{"class":336},"          image",[218,693,341],{"class":340},[218,695,696],{"class":228}," soulter/astrbot:latest\n",[218,698,700,703,705],{"class":220,"line":699},23,[218,701,702],{"class":336},"          imagePullPolicy",[218,704,341],{"class":340},[218,706,707],{"class":228}," IfNotPresent\n",[218,709,711,714],{"class":220,"line":710},24,[218,712,713],{"class":336},"          env",[218,715,362],{"class":340},[218,717,719,722,724,726],{"class":220,"line":718},25,[218,720,721],{"class":340},"            -",[218,723,681],{"class":336},[218,725,341],{"class":340},[218,727,728],{"class":228}," TZ\n",[218,730,732,735,737,740,743],{"class":220,"line":731},26,[218,733,734],{"class":336},"              value",[218,736,341],{"class":340},[218,738,739],{"class":340}," \"",[218,741,742],{"class":228},"Asia/Shanghai",[218,744,745],{"class":340},"\"\n",[218,747,749,752],{"class":220,"line":748},27,[218,750,751],{"class":336},"          ports",[218,753,362],{"class":340},[218,755,757,759,762,764],{"class":220,"line":756},28,[218,758,721],{"class":340},[218,760,761],{"class":336}," containerPort",[218,763,341],{"class":340},[218,765,766],{"class":582}," 6185\n",[218,768,770,773,775],{"class":220,"line":769},29,[218,771,772],{"class":336},"              name",[218,774,341],{"class":340},[218,776,777],{"class":228}," webui\n",[218,779,781,783,785,787],{"class":220,"line":780},30,[218,782,721],{"class":340},[218,784,761],{"class":336},[218,786,341],{"class":340},[218,788,789],{"class":582}," 6199\n",[218,791,793,795,797],{"class":220,"line":792},31,[218,794,772],{"class":336},[218,796,341],{"class":340},[218,798,799],{"class":228}," qq-ws\n",[218,801,803],{"class":220,"line":802},32,[218,804,805],{"class":491},"            # - containerPort: 6195\n",[218,807,809],{"class":220,"line":808},33,[218,810,811],{"class":491},"            #   name: wecom-wh\n",[218,813,815],{"class":220,"line":814},34,[218,816,817],{"class":491},"            # - containerPort: 6196\n",[218,819,821],{"class":220,"line":820},35,[218,822,823],{"class":491},"            #   name: qq-off-wh\n",[218,825,827,830],{"class":220,"line":826},36,[218,828,829],{"class":336},"          volumeMounts",[218,831,362],{"class":340},[218,833,835,837,839,841],{"class":220,"line":834},37,[218,836,721],{"class":340},[218,838,681],{"class":336},[218,840,341],{"class":340},[218,842,843],{"class":228}," data\n",[218,845,847,850,852],{"class":220,"line":846},38,[218,848,849],{"class":336},"              mountPath",[218,851,341],{"class":340},[218,853,854],{"class":228}," /AstrBot/data\n",[218,856,858,860,862,864],{"class":220,"line":857},39,[218,859,721],{"class":340},[218,861,681],{"class":336},[218,863,341],{"class":340},[218,865,866],{"class":228}," localtime\n",[218,868,870,872,874],{"class":220,"line":869},40,[218,871,849],{"class":336},[218,873,341],{"class":340},[218,875,876],{"class":228}," /etc/localtime\n",[218,878,880,883,885],{"class":220,"line":879},41,[218,881,882],{"class":336},"              readOnly",[218,884,341],{"class":340},[218,886,888],{"class":887},"sfNiH"," true\n",[218,890,892,895],{"class":220,"line":891},42,[218,893,894],{"class":336},"      volumes",[218,896,362],{"class":340},[218,898,900,902,904,906],{"class":220,"line":899},43,[218,901,678],{"class":340},[218,903,681],{"class":336},[218,905,341],{"class":340},[218,907,843],{"class":228},[218,909,911,914],{"class":220,"line":910},44,[218,912,913],{"class":336},"          persistentVolumeClaim",[218,915,362],{"class":340},[218,917,919,922,924,927],{"class":220,"line":918},45,[218,920,921],{"class":336},"            claimName",[218,923,341],{"class":340},[218,925,926],{"class":228}," astrbot-data-pvc",[218,928,929],{"class":491}," # 因为PVC是全局的，所以直接引用即可\n",[218,931,933,935,937,939],{"class":220,"line":932},46,[218,934,678],{"class":340},[218,936,681],{"class":336},[218,938,341],{"class":340},[218,940,866],{"class":228},[218,942,944,947],{"class":220,"line":943},47,[218,945,946],{"class":336},"          hostPath",[218,948,362],{"class":340},[218,950,952,955,957],{"class":220,"line":951},48,[218,953,954],{"class":336},"            path",[218,956,341],{"class":340},[218,958,876],{"class":228},[218,960,962,965,967],{"class":220,"line":961},49,[218,963,964],{"class":336},"            type",[218,966,341],{"class":340},[218,968,969],{"class":228}," File\n",[208,971,974],{"className":327,"code":972,"filename":973,"language":329,"meta":213,"style":213},"apiVersion: v1\nkind: Service\nmetadata:\n  name: astrbot\n  namespace: astrbot\n  labels:\n    app: astrbot\nspec:\n  type: NodePort\n  selector:\n    app: astrbot\n  ports:\n    - name: webui\n      port: 6185\n      targetPort: 6185\n      nodePort: 30185\n    - name: qq-ws\n      port: 6199\n      targetPort: 6199\n      nodePort: 30199\n    # - name: wecom-wh\n    #   port: 6195\n    #   targetPort: 6195\n    #   nodePort: 30195\n    # - name: qq-off-wh\n    #   port: 6196\n    #   targetPort: 6196\n    #   nodePort: 30196\n","base/astrbot/03-service-nodeport.yaml",[215,975,976,984,993,999,1007,1015,1021,1029,1035,1045,1051,1059,1066,1076,1085,1094,1104,1114,1122,1130,1139,1144,1149,1154,1159,1164,1169,1174],{"__ignoreMap":213},[218,977,978,980,982],{"class":220,"line":221},[218,979,337],{"class":336},[218,981,341],{"class":340},[218,983,344],{"class":228},[218,985,986,988,990],{"class":220,"line":250},[218,987,349],{"class":336},[218,989,341],{"class":340},[218,991,992],{"class":228}," Service\n",[218,994,995,997],{"class":220,"line":256},[218,996,359],{"class":336},[218,998,362],{"class":340},[218,1000,1001,1003,1005],{"class":220,"line":262},[218,1002,367],{"class":336},[218,1004,341],{"class":340},[218,1006,372],{"class":228},[218,1008,1009,1011,1013],{"class":220,"line":268},[218,1010,415],{"class":336},[218,1012,341],{"class":340},[218,1014,372],{"class":228},[218,1016,1017,1019],{"class":220,"line":274},[218,1018,424],{"class":336},[218,1020,362],{"class":340},[218,1022,1023,1025,1027],{"class":220,"line":280},[218,1024,431],{"class":336},[218,1026,341],{"class":340},[218,1028,372],{"class":228},[218,1030,1031,1033],{"class":220,"line":286},[218,1032,440],{"class":336},[218,1034,362],{"class":340},[218,1036,1037,1040,1042],{"class":220,"line":292},[218,1038,1039],{"class":336},"  type",[218,1041,341],{"class":340},[218,1043,1044],{"class":228}," NodePort\n",[218,1046,1047,1049],{"class":220,"line":452},[218,1048,605],{"class":336},[218,1050,362],{"class":340},[218,1052,1053,1055,1057],{"class":220,"line":461},[218,1054,431],{"class":336},[218,1056,341],{"class":340},[218,1058,372],{"class":228},[218,1060,1061,1064],{"class":220,"line":469},[218,1062,1063],{"class":336},"  ports",[218,1065,362],{"class":340},[218,1067,1068,1070,1072,1074],{"class":220,"line":477},[218,1069,455],{"class":340},[218,1071,681],{"class":336},[218,1073,341],{"class":340},[218,1075,777],{"class":228},[218,1077,1078,1081,1083],{"class":220,"line":488},[218,1079,1080],{"class":336},"      port",[218,1082,341],{"class":340},[218,1084,766],{"class":582},[218,1086,1087,1090,1092],{"class":220,"line":495},[218,1088,1089],{"class":336},"      targetPort",[218,1091,341],{"class":340},[218,1093,766],{"class":582},[218,1095,1096,1099,1101],{"class":220,"line":633},[218,1097,1098],{"class":336},"      nodePort",[218,1100,341],{"class":340},[218,1102,1103],{"class":582}," 30185\n",[218,1105,1106,1108,1110,1112],{"class":220,"line":641},[218,1107,455],{"class":340},[218,1109,681],{"class":336},[218,1111,341],{"class":340},[218,1113,799],{"class":228},[218,1115,1116,1118,1120],{"class":220,"line":649},[218,1117,1080],{"class":336},[218,1119,341],{"class":340},[218,1121,789],{"class":582},[218,1123,1124,1126,1128],{"class":220,"line":659},[218,1125,1089],{"class":336},[218,1127,341],{"class":340},[218,1129,789],{"class":582},[218,1131,1132,1134,1136],{"class":220,"line":667},[218,1133,1098],{"class":336},[218,1135,341],{"class":340},[218,1137,1138],{"class":582}," 30199\n",[218,1140,1141],{"class":220,"line":675},[218,1142,1143],{"class":491},"    # - name: wecom-wh\n",[218,1145,1146],{"class":220,"line":688},[218,1147,1148],{"class":491},"    #   port: 6195\n",[218,1150,1151],{"class":220,"line":699},[218,1152,1153],{"class":491},"    #   targetPort: 6195\n",[218,1155,1156],{"class":220,"line":710},[218,1157,1158],{"class":491},"    #   nodePort: 30195\n",[218,1160,1161],{"class":220,"line":718},[218,1162,1163],{"class":491},"    # - name: qq-off-wh\n",[218,1165,1166],{"class":220,"line":731},[218,1167,1168],{"class":491},"    #   port: 6196\n",[218,1170,1171],{"class":220,"line":748},[218,1172,1173],{"class":491},"    #   targetPort: 6196\n",[218,1175,1176],{"class":220,"line":756},[218,1177,1178],{"class":491},"    #   nodePort: 30196\n",[208,1180,1183],{"className":327,"code":1181,"filename":1182,"language":329,"meta":213,"style":213},"apiVersion: v1\nkind: Namespace\nmetadata:\n  name: napcat\n","base/napcat/00-namespace.yaml",[215,1184,1185,1193,1201,1207],{"__ignoreMap":213},[218,1186,1187,1189,1191],{"class":220,"line":221},[218,1188,337],{"class":336},[218,1190,341],{"class":340},[218,1192,344],{"class":228},[218,1194,1195,1197,1199],{"class":220,"line":250},[218,1196,349],{"class":336},[218,1198,341],{"class":340},[218,1200,354],{"class":228},[218,1202,1203,1205],{"class":220,"line":256},[218,1204,359],{"class":336},[218,1206,362],{"class":340},[218,1208,1209,1211,1213],{"class":220,"line":262},[218,1210,367],{"class":336},[218,1212,341],{"class":340},[218,1214,1215],{"class":228}," napcat\n",[208,1217,1220],{"className":327,"code":1218,"filename":1219,"language":329,"meta":213,"style":213},"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: napcat-data-pvc\n  namespace: napcat\n  labels:\n    app: napcat\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 512Mi\n  storageClassName: standard # uncomment and set proper StorageClass\n","base/napcat/01-pvc.yaml",[215,1221,1222,1230,1238,1244,1253,1261,1267,1275,1281,1287,1293,1299,1305,1314],{"__ignoreMap":213},[218,1223,1224,1226,1228],{"class":220,"line":221},[218,1225,337],{"class":336},[218,1227,341],{"class":340},[218,1229,344],{"class":228},[218,1231,1232,1234,1236],{"class":220,"line":250},[218,1233,349],{"class":336},[218,1235,341],{"class":340},[218,1237,395],{"class":228},[218,1239,1240,1242],{"class":220,"line":256},[218,1241,359],{"class":336},[218,1243,362],{"class":340},[218,1245,1246,1248,1250],{"class":220,"line":262},[218,1247,367],{"class":336},[218,1249,341],{"class":340},[218,1251,1252],{"class":228}," napcat-data-pvc\n",[218,1254,1255,1257,1259],{"class":220,"line":268},[218,1256,415],{"class":336},[218,1258,341],{"class":340},[218,1260,1215],{"class":228},[218,1262,1263,1265],{"class":220,"line":274},[218,1264,424],{"class":336},[218,1266,362],{"class":340},[218,1268,1269,1271,1273],{"class":220,"line":280},[218,1270,431],{"class":336},[218,1272,341],{"class":340},[218,1274,1215],{"class":228},[218,1276,1277,1279],{"class":220,"line":286},[218,1278,440],{"class":336},[218,1280,362],{"class":340},[218,1282,1283,1285],{"class":220,"line":292},[218,1284,447],{"class":336},[218,1286,362],{"class":340},[218,1288,1289,1291],{"class":220,"line":452},[218,1290,455],{"class":340},[218,1292,458],{"class":228},[218,1294,1295,1297],{"class":220,"line":461},[218,1296,464],{"class":336},[218,1298,362],{"class":340},[218,1300,1301,1303],{"class":220,"line":469},[218,1302,472],{"class":336},[218,1304,362],{"class":340},[218,1306,1307,1309,1311],{"class":220,"line":477},[218,1308,480],{"class":336},[218,1310,341],{"class":340},[218,1312,1313],{"class":228}," 512Mi\n",[218,1315,1316,1318,1320,1322],{"class":220,"line":488},[218,1317,498],{"class":336},[218,1319,341],{"class":340},[218,1321,503],{"class":228},[218,1323,506],{"class":491},[208,1325,1328],{"className":327,"code":1326,"filename":1327,"language":329,"meta":213,"style":213},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: napcat\n  namespace: napcat\n  labels:\n    app: napcat\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: napcat\n  template:\n    metadata:\n      labels:\n        app: napcat\n    spec:\n      containers:\n        - name: napcat\n          image: mlikiowa/napcat-docker:latest\n          imagePullPolicy: Always\n          ports:\n            - containerPort: 3000\n            - containerPort: 3001\n            - containerPort: 6099\n          volumeMounts:\n            - name: napcat-storage\n              mountPath: /app/.config/QQ\n            - name: napcat-storage\n              mountPath: /app/napcat/config\n            - name: napcat-storage\n              mountPath: /app/napcat/plugins\n      volumes:\n        - name: napcat-storage\n          persistentVolumeClaim:\n            claimName: napcat-data-pvc # 引用全局动态 PVC\n","base/napcat/02-deployment.yaml",[215,1329,1330,1338,1346,1352,1360,1368,1374,1382,1388,1396,1402,1408,1416,1422,1428,1434,1442,1448,1454,1464,1473,1482,1488,1499,1510,1521,1527,1538,1547,1557,1566,1576,1585,1591,1601,1607],{"__ignoreMap":213},[218,1331,1332,1334,1336],{"class":220,"line":221},[218,1333,337],{"class":336},[218,1335,341],{"class":340},[218,1337,521],{"class":228},[218,1339,1340,1342,1344],{"class":220,"line":250},[218,1341,349],{"class":336},[218,1343,341],{"class":340},[218,1345,530],{"class":228},[218,1347,1348,1350],{"class":220,"line":256},[218,1349,359],{"class":336},[218,1351,362],{"class":340},[218,1353,1354,1356,1358],{"class":220,"line":262},[218,1355,367],{"class":336},[218,1357,341],{"class":340},[218,1359,1215],{"class":228},[218,1361,1362,1364,1366],{"class":220,"line":268},[218,1363,415],{"class":336},[218,1365,341],{"class":340},[218,1367,1215],{"class":228},[218,1369,1370,1372],{"class":220,"line":274},[218,1371,424],{"class":336},[218,1373,362],{"class":340},[218,1375,1376,1378,1380],{"class":220,"line":280},[218,1377,431],{"class":336},[218,1379,341],{"class":340},[218,1381,1215],{"class":228},[218,1383,1384,1386],{"class":220,"line":286},[218,1385,440],{"class":336},[218,1387,362],{"class":340},[218,1389,1390,1392,1394],{"class":220,"line":292},[218,1391,577],{"class":336},[218,1393,341],{"class":340},[218,1395,583],{"class":582},[218,1397,1398,1400],{"class":220,"line":452},[218,1399,605],{"class":336},[218,1401,362],{"class":340},[218,1403,1404,1406],{"class":220,"line":461},[218,1405,612],{"class":336},[218,1407,362],{"class":340},[218,1409,1410,1412,1414],{"class":220,"line":469},[218,1411,619],{"class":336},[218,1413,341],{"class":340},[218,1415,1215],{"class":228},[218,1417,1418,1420],{"class":220,"line":477},[218,1419,628],{"class":336},[218,1421,362],{"class":340},[218,1423,1424,1426],{"class":220,"line":488},[218,1425,636],{"class":336},[218,1427,362],{"class":340},[218,1429,1430,1432],{"class":220,"line":495},[218,1431,644],{"class":336},[218,1433,362],{"class":340},[218,1435,1436,1438,1440],{"class":220,"line":633},[218,1437,652],{"class":336},[218,1439,341],{"class":340},[218,1441,1215],{"class":228},[218,1443,1444,1446],{"class":220,"line":641},[218,1445,662],{"class":336},[218,1447,362],{"class":340},[218,1449,1450,1452],{"class":220,"line":649},[218,1451,670],{"class":336},[218,1453,362],{"class":340},[218,1455,1456,1458,1460,1462],{"class":220,"line":659},[218,1457,678],{"class":340},[218,1459,681],{"class":336},[218,1461,341],{"class":340},[218,1463,1215],{"class":228},[218,1465,1466,1468,1470],{"class":220,"line":667},[218,1467,691],{"class":336},[218,1469,341],{"class":340},[218,1471,1472],{"class":228}," mlikiowa/napcat-docker:latest\n",[218,1474,1475,1477,1479],{"class":220,"line":675},[218,1476,702],{"class":336},[218,1478,341],{"class":340},[218,1480,1481],{"class":228}," Always\n",[218,1483,1484,1486],{"class":220,"line":688},[218,1485,751],{"class":336},[218,1487,362],{"class":340},[218,1489,1490,1492,1494,1496],{"class":220,"line":699},[218,1491,721],{"class":340},[218,1493,761],{"class":336},[218,1495,341],{"class":340},[218,1497,1498],{"class":582}," 3000\n",[218,1500,1501,1503,1505,1507],{"class":220,"line":710},[218,1502,721],{"class":340},[218,1504,761],{"class":336},[218,1506,341],{"class":340},[218,1508,1509],{"class":582}," 3001\n",[218,1511,1512,1514,1516,1518],{"class":220,"line":718},[218,1513,721],{"class":340},[218,1515,761],{"class":336},[218,1517,341],{"class":340},[218,1519,1520],{"class":582}," 6099\n",[218,1522,1523,1525],{"class":220,"line":731},[218,1524,829],{"class":336},[218,1526,362],{"class":340},[218,1528,1529,1531,1533,1535],{"class":220,"line":748},[218,1530,721],{"class":340},[218,1532,681],{"class":336},[218,1534,341],{"class":340},[218,1536,1537],{"class":228}," napcat-storage\n",[218,1539,1540,1542,1544],{"class":220,"line":756},[218,1541,849],{"class":336},[218,1543,341],{"class":340},[218,1545,1546],{"class":228}," /app/.config/QQ\n",[218,1548,1549,1551,1553,1555],{"class":220,"line":769},[218,1550,721],{"class":340},[218,1552,681],{"class":336},[218,1554,341],{"class":340},[218,1556,1537],{"class":228},[218,1558,1559,1561,1563],{"class":220,"line":780},[218,1560,849],{"class":336},[218,1562,341],{"class":340},[218,1564,1565],{"class":228}," /app/napcat/config\n",[218,1567,1568,1570,1572,1574],{"class":220,"line":792},[218,1569,721],{"class":340},[218,1571,681],{"class":336},[218,1573,341],{"class":340},[218,1575,1537],{"class":228},[218,1577,1578,1580,1582],{"class":220,"line":802},[218,1579,849],{"class":336},[218,1581,341],{"class":340},[218,1583,1584],{"class":228}," /app/napcat/plugins\n",[218,1586,1587,1589],{"class":220,"line":808},[218,1588,894],{"class":336},[218,1590,362],{"class":340},[218,1592,1593,1595,1597,1599],{"class":220,"line":814},[218,1594,678],{"class":340},[218,1596,681],{"class":336},[218,1598,341],{"class":340},[218,1600,1537],{"class":228},[218,1602,1603,1605],{"class":220,"line":820},[218,1604,913],{"class":336},[218,1606,362],{"class":340},[218,1608,1609,1611,1613,1616],{"class":220,"line":826},[218,1610,921],{"class":336},[218,1612,341],{"class":340},[218,1614,1615],{"class":228}," napcat-data-pvc",[218,1617,1618],{"class":491}," # 引用全局动态 PVC\n",[208,1620,1623],{"className":327,"code":1621,"filename":1622,"language":329,"meta":213,"style":213},"apiVersion: v1\nkind: Service\nmetadata:\n  name: napcat-webui\n  namespace: napcat\nspec:\n  selector:\n    app: napcat # 必须匹配 Pod 的 labels\n  ports:\n    - name: http\n      port: 6099\n      targetPort: 6099\n  type: ClusterIP\n","base/napcat/03-service.yaml",[215,1624,1625,1633,1641,1647,1656,1664,1670,1676,1688,1694,1705,1713,1721],{"__ignoreMap":213},[218,1626,1627,1629,1631],{"class":220,"line":221},[218,1628,337],{"class":336},[218,1630,341],{"class":340},[218,1632,344],{"class":228},[218,1634,1635,1637,1639],{"class":220,"line":250},[218,1636,349],{"class":336},[218,1638,341],{"class":340},[218,1640,992],{"class":228},[218,1642,1643,1645],{"class":220,"line":256},[218,1644,359],{"class":336},[218,1646,362],{"class":340},[218,1648,1649,1651,1653],{"class":220,"line":262},[218,1650,367],{"class":336},[218,1652,341],{"class":340},[218,1654,1655],{"class":228}," napcat-webui\n",[218,1657,1658,1660,1662],{"class":220,"line":268},[218,1659,415],{"class":336},[218,1661,341],{"class":340},[218,1663,1215],{"class":228},[218,1665,1666,1668],{"class":220,"line":274},[218,1667,440],{"class":336},[218,1669,362],{"class":340},[218,1671,1672,1674],{"class":220,"line":280},[218,1673,605],{"class":336},[218,1675,362],{"class":340},[218,1677,1678,1680,1682,1685],{"class":220,"line":286},[218,1679,431],{"class":336},[218,1681,341],{"class":340},[218,1683,1684],{"class":228}," napcat",[218,1686,1687],{"class":491}," # 必须匹配 Pod 的 labels\n",[218,1689,1690,1692],{"class":220,"line":292},[218,1691,1063],{"class":336},[218,1693,362],{"class":340},[218,1695,1696,1698,1700,1702],{"class":220,"line":452},[218,1697,455],{"class":340},[218,1699,681],{"class":336},[218,1701,341],{"class":340},[218,1703,1704],{"class":228}," http\n",[218,1706,1707,1709,1711],{"class":220,"line":461},[218,1708,1080],{"class":336},[218,1710,341],{"class":340},[218,1712,1520],{"class":582},[218,1714,1715,1717,1719],{"class":220,"line":469},[218,1716,1089],{"class":336},[218,1718,341],{"class":340},[218,1720,1520],{"class":582},[218,1722,1723,1725,1727],{"class":220,"line":477},[218,1724,1039],{"class":336},[218,1726,341],{"class":340},[218,1728,1729],{"class":228}," ClusterIP\n",[208,1731,1734],{"className":327,"code":1732,"filename":1733,"language":329,"meta":213,"style":213},"# napcat-gateway.yaml\napiVersion: gateway.networking.k8s.io/v1\nkind: Gateway\nmetadata:\n  name: napcat-gateway\n  namespace: napcat\nspec:\n  gatewayClassName: cilium # 使用 Cilium 的 GatewayClass\n  listeners:\n    - name: http\n      port: 80\n      protocol: HTTP\n      # 允许所有 host（或指定域名）\n      allowedRoutes:\n        namespaces:\n          from: Same # 只允许同 namespace 的路由绑定\n","base/napcat/04-gateway.yaml",[215,1735,1736,1741,1750,1759,1765,1774,1782,1788,1801,1808,1818,1827,1837,1842,1849,1856],{"__ignoreMap":213},[218,1737,1738],{"class":220,"line":221},[218,1739,1740],{"class":491},"# napcat-gateway.yaml\n",[218,1742,1743,1745,1747],{"class":220,"line":250},[218,1744,337],{"class":336},[218,1746,341],{"class":340},[218,1748,1749],{"class":228}," gateway.networking.k8s.io/v1\n",[218,1751,1752,1754,1756],{"class":220,"line":256},[218,1753,349],{"class":336},[218,1755,341],{"class":340},[218,1757,1758],{"class":228}," Gateway\n",[218,1760,1761,1763],{"class":220,"line":262},[218,1762,359],{"class":336},[218,1764,362],{"class":340},[218,1766,1767,1769,1771],{"class":220,"line":268},[218,1768,367],{"class":336},[218,1770,341],{"class":340},[218,1772,1773],{"class":228}," napcat-gateway\n",[218,1775,1776,1778,1780],{"class":220,"line":274},[218,1777,415],{"class":336},[218,1779,341],{"class":340},[218,1781,1215],{"class":228},[218,1783,1784,1786],{"class":220,"line":280},[218,1785,440],{"class":336},[218,1787,362],{"class":340},[218,1789,1790,1793,1795,1798],{"class":220,"line":286},[218,1791,1792],{"class":336},"  gatewayClassName",[218,1794,341],{"class":340},[218,1796,1797],{"class":228}," cilium",[218,1799,1800],{"class":491}," # 使用 Cilium 的 GatewayClass\n",[218,1802,1803,1806],{"class":220,"line":292},[218,1804,1805],{"class":336},"  listeners",[218,1807,362],{"class":340},[218,1809,1810,1812,1814,1816],{"class":220,"line":452},[218,1811,455],{"class":340},[218,1813,681],{"class":336},[218,1815,341],{"class":340},[218,1817,1704],{"class":228},[218,1819,1820,1822,1824],{"class":220,"line":461},[218,1821,1080],{"class":336},[218,1823,341],{"class":340},[218,1825,1826],{"class":582}," 80\n",[218,1828,1829,1832,1834],{"class":220,"line":469},[218,1830,1831],{"class":336},"      protocol",[218,1833,341],{"class":340},[218,1835,1836],{"class":228}," HTTP\n",[218,1838,1839],{"class":220,"line":477},[218,1840,1841],{"class":491},"      # 允许所有 host（或指定域名）\n",[218,1843,1844,1847],{"class":220,"line":488},[218,1845,1846],{"class":336},"      allowedRoutes",[218,1848,362],{"class":340},[218,1850,1851,1854],{"class":220,"line":495},[218,1852,1853],{"class":336},"        namespaces",[218,1855,362],{"class":340},[218,1857,1858,1861,1863,1866],{"class":220,"line":633},[218,1859,1860],{"class":336},"          from",[218,1862,341],{"class":340},[218,1864,1865],{"class":228}," Same",[218,1867,1868],{"class":491}," # 只允许同 namespace 的路由绑定\n",[208,1870,1873],{"className":327,"code":1871,"filename":1872,"language":329,"meta":213,"style":213},"# napcat-route.yaml\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: napcat-webui-route\n  namespace: napcat\nspec:\n  parentRefs:\n    - name: napcat-gateway\n  hostnames:\n    - \"napcat.taten.org\" # 只响应该域名的请求\n  rules:\n    - matches:\n        - path:\n            type: PathPrefix\n            value: / # 根路径即可\n      backendRefs:\n        - name: napcat-webui\n          port: 6099\n","base/napcat/05-router.yaml",[215,1874,1875,1880,1888,1897,1903,1912,1920,1926,1933,1943,1950,1965,1972,1981,1990,1999,2012,2019,2029],{"__ignoreMap":213},[218,1876,1877],{"class":220,"line":221},[218,1878,1879],{"class":491},"# napcat-route.yaml\n",[218,1881,1882,1884,1886],{"class":220,"line":250},[218,1883,337],{"class":336},[218,1885,341],{"class":340},[218,1887,1749],{"class":228},[218,1889,1890,1892,1894],{"class":220,"line":256},[218,1891,349],{"class":336},[218,1893,341],{"class":340},[218,1895,1896],{"class":228}," HTTPRoute\n",[218,1898,1899,1901],{"class":220,"line":262},[218,1900,359],{"class":336},[218,1902,362],{"class":340},[218,1904,1905,1907,1909],{"class":220,"line":268},[218,1906,367],{"class":336},[218,1908,341],{"class":340},[218,1910,1911],{"class":228}," napcat-webui-route\n",[218,1913,1914,1916,1918],{"class":220,"line":274},[218,1915,415],{"class":336},[218,1917,341],{"class":340},[218,1919,1215],{"class":228},[218,1921,1922,1924],{"class":220,"line":280},[218,1923,440],{"class":336},[218,1925,362],{"class":340},[218,1927,1928,1931],{"class":220,"line":286},[218,1929,1930],{"class":336},"  parentRefs",[218,1932,362],{"class":340},[218,1934,1935,1937,1939,1941],{"class":220,"line":292},[218,1936,455],{"class":340},[218,1938,681],{"class":336},[218,1940,341],{"class":340},[218,1942,1773],{"class":228},[218,1944,1945,1948],{"class":220,"line":452},[218,1946,1947],{"class":336},"  hostnames",[218,1949,362],{"class":340},[218,1951,1952,1954,1956,1959,1962],{"class":220,"line":461},[218,1953,455],{"class":340},[218,1955,739],{"class":340},[218,1957,1958],{"class":228},"napcat.taten.org",[218,1960,1961],{"class":340},"\"",[218,1963,1964],{"class":491}," # 只响应该域名的请求\n",[218,1966,1967,1970],{"class":220,"line":469},[218,1968,1969],{"class":336},"  rules",[218,1971,362],{"class":340},[218,1973,1974,1976,1979],{"class":220,"line":477},[218,1975,455],{"class":340},[218,1977,1978],{"class":336}," matches",[218,1980,362],{"class":340},[218,1982,1983,1985,1988],{"class":220,"line":488},[218,1984,678],{"class":340},[218,1986,1987],{"class":336}," path",[218,1989,362],{"class":340},[218,1991,1992,1994,1996],{"class":220,"line":495},[218,1993,964],{"class":336},[218,1995,341],{"class":340},[218,1997,1998],{"class":228}," PathPrefix\n",[218,2000,2001,2004,2006,2009],{"class":220,"line":633},[218,2002,2003],{"class":336},"            value",[218,2005,341],{"class":340},[218,2007,2008],{"class":228}," /",[218,2010,2011],{"class":491}," # 根路径即可\n",[218,2013,2014,2017],{"class":220,"line":641},[218,2015,2016],{"class":336},"      backendRefs",[218,2018,362],{"class":340},[218,2020,2021,2023,2025,2027],{"class":220,"line":649},[218,2022,678],{"class":340},[218,2024,681],{"class":336},[218,2026,341],{"class":340},[218,2028,1655],{"class":228},[218,2030,2031,2034,2036],{"class":220,"line":659},[218,2032,2033],{"class":336},"          port",[218,2035,341],{"class":340},[218,2037,1520],{"class":582},[125,2039,2040],{},"如上述配置所示，我们创建了两个命名空间部署astrbot和napcat搭建QQ机器人.",[125,2042,2043,2044,2049,2050,2054],{},"你也可以在目录下新建文件夹编写自己的服务的配置文件,在编写配置文件之前,请提前学习kubernetes的",[132,2045,2048],{"href":2046,"rel":2047},"https://kubernetes.io/zh-cn/docs/concepts/architecture/",[136],"集群架构","和",[132,2051,2053],{"href":193,"rel":2052},[136],"配置文件","编写方法",[125,2056,2057],{},"你可以去互联网搜索kubernetes的相关教程进行学习,这里不再赘述.",[120,2059,2061],{"id":2060},"_4部署服务","4.部署服务",[125,2063,2064,2065,2068],{},"当你编写好配置文件后,可以使用",[215,2066,2067],{},"kubectl apply","命令来部署服务:",[208,2070,2072],{"className":210,"code":2071,"language":212,"meta":213,"style":213},"kubectl apply -f your-service-config.yaml\n",[215,2073,2074],{"__ignoreMap":213},[218,2075,2076,2078,2081,2084],{"class":220,"line":221},[218,2077,225],{"class":224},[218,2079,2080],{"class":228}," apply",[218,2082,2083],{"class":228}," -f",[218,2085,2086],{"class":228}," your-service-config.yaml\n",[125,2088,2089],{},"逐个运行命令,并及时查看对应yaml文件的运行结果,提前发现并解决问题",[2091,2092,2093],"warning",{},"目前先写这么多,后续会继续完善这个文档.",[2095,2096,2097],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":213,"searchDepth":250,"depth":250,"links":2099},[2100,2105],{"id":117,"depth":250,"text":118,"children":2101},[2102,2103,2104],{"id":122,"depth":256,"text":123},{"id":153,"depth":256,"text":154},{"id":169,"depth":256,"text":170},{"id":182,"depth":250,"text":183,"children":2106},[2107,2108,2109,2110],{"id":186,"depth":256,"text":187},{"id":202,"depth":256,"text":203},{"id":298,"depth":256,"text":299},{"id":2060,"depth":256,"text":2061},"TATEN服务器集群使用说明，包括集群架构、部署流程、维护指南等内容，帮助用户了解和使用TATEN服务器集群。","md",null,{},true,{"title":75,"description":2111},"vPsxgM4QSbm55988eIwH9nI9gnKF-h_5IrLk3dxzCgQ",[2119,2121],{"title":71,"path":72,"stem":73,"description":2120,"children":-1},"内网穿透工具frp的客户端使用说明和配置指南。",{"title":84,"path":85,"stem":86,"description":2122,"children":-1},"TATEN服务器集群与容器编排、负载均衡、自动扩缩容等功能的底层技术细节和使用说明。",1771720383907]