[{"data":1,"prerenderedAt":518},["ShallowReactive",2],{"docs:/docs/dev/deploy":3},{"id":4,"title":5,"body":6,"description":511,"extension":512,"meta":513,"navigation":246,"path":514,"seo":515,"stem":516,"__hash__":517},"docs/docs/dev/deploy.md","打包与部署",{"type":7,"value":8,"toc":502},"minimark",[9,12,16,42,55,62,70,498],[10,11,5],"h1",{"id":5},[13,14,15],"h2",{"id":15},"构建",[17,18,23],"pre",{"className":19,"code":20,"language":21,"meta":22,"style":22},"language-sh shiki shiki-themes github-dark","npm run build\n","sh","",[24,25,26],"code",{"__ignoreMap":22},[27,28,31,35,39],"span",{"class":29,"line":30},"line",1,[27,32,34],{"class":33},"svObZ","npm",[27,36,38],{"class":37},"sU2Wk"," run",[27,40,41],{"class":37}," build\n",[43,44,45,46,49,50,54],"p",{},"构建会依次执行：抓取发行版数据（",[24,47,48],{},"scripts/fetch-releases.mjs","）→ Nuxt 构建 → ",[51,52,53],"strong",{},"预渲染文档站路由","为静态 HTML。",[43,56,57,58,61],{},"产物在 ",[24,59,60],{},".output/"," 目录：",[17,63,68],{"className":64,"code":66,"language":67,"meta":22},[65],"language-text",".output/\n├─ server/index.mjs          # Nitro 服务入口\n└─ public/                   # 静态资源（含文档站的 *.html）\n   ├─ docs/guide/index.html  # ← 文档页静态 HTML\n   ├─ _nuxt/                 # 前端资源\n   └─ index.html             # 官网首页（原样拷贝自 public/）\n","text",[24,69,66],{"__ignoreMap":22},[71,72,75,90,93,106,109,132,136,169,175,201,205,208,298],"callout",{"title":73,"type":74},"文档改动需要重新构建","note",[43,76,77,78,81,82,85,86,89],{},"文档页是",[51,79,80],{},"构建期预渲染","的静态文件，因此线上修改内容必须重新 ",[24,83,84],{},"npm run build"," 并部署。\n开发环境下 ",[24,87,88],{},"npm run dev"," 是即时生效、无需重建。\n::",[13,91,92],{"id":92},"启动服务",[17,94,96],{"className":19,"code":95,"language":21,"meta":22,"style":22},"node .output/server/index.mjs\n",[24,97,98],{"__ignoreMap":22},[27,99,100,103],{"class":29,"line":30},[27,101,102],{"class":33},"node",[27,104,105],{"class":37}," .output/server/index.mjs\n",[43,107,108],{},"默认监听 3000 端口，可用环境变量指定：",[17,110,112],{"className":19,"code":111,"language":21,"meta":22,"style":22},"PORT=8880 node .output/server/index.mjs\n",[24,113,114],{"__ignoreMap":22},[27,115,116,120,124,127,130],{"class":29,"line":30},[27,117,119],{"class":118},"s95oV","PORT",[27,121,123],{"class":122},"snl16","=",[27,125,126],{"class":37},"8880",[27,128,129],{"class":33}," node",[27,131,105],{"class":37},[13,133,135],{"id":134},"pm2-托管","pm2 托管",[17,137,139],{"className":19,"code":138,"language":21,"meta":22,"style":22},"# --no-daemon 让进程在前台运行，容器场景下必须加，否则脚本执行完容器会一直重启\nPORT=8880 pm2 start /root/nodehost/.output/server/index.mjs --no-daemon\n",[24,140,141,147],{"__ignoreMap":22},[27,142,143],{"class":29,"line":30},[27,144,146],{"class":145},"sAwPA","# --no-daemon 让进程在前台运行，容器场景下必须加，否则脚本执行完容器会一直重启\n",[27,148,150,152,154,156,159,162,165],{"class":29,"line":149},2,[27,151,119],{"class":118},[27,153,123],{"class":122},[27,155,126],{"class":37},[27,157,158],{"class":33}," pm2",[27,160,161],{"class":37}," start",[27,163,164],{"class":37}," /root/nodehost/.output/server/index.mjs",[27,166,168],{"class":167},"sDLfK"," --no-daemon\n",[43,170,171,174],{},[24,172,173],{},"start.sh"," 里可以这样写：",[17,176,178],{"className":19,"code":177,"language":21,"meta":22,"style":22},"#!/bin/sh\nPORT=8880 pm2 start /root/nodehost/.output/server/index.mjs --no-daemon\n",[24,179,180,185],{"__ignoreMap":22},[27,181,182],{"class":29,"line":30},[27,183,184],{"class":145},"#!/bin/sh\n",[27,186,187,189,191,193,195,197,199],{"class":29,"line":149},[27,188,119],{"class":118},[27,190,123],{"class":122},[27,192,126],{"class":37},[27,194,158],{"class":33},[27,196,161],{"class":37},[27,198,164],{"class":37},[27,200,168],{"class":167},[13,202,204],{"id":203},"docker-部署流程","Docker 部署流程",[43,206,207],{},"服务器上的实际发布流程（打包 → 上传 → 解压 → 重启）：",[17,209,211],{"className":19,"code":210,"language":21,"meta":22,"style":22},"# 本地：打包并上传\nnpm run build\ntar -cf .output.tar ./.output/\n\n# 服务器：停服 → 替换 → 重启\ndocker stop nuxt-p2p-webrtc-sys\nrm -rf ./.output/\ntar -vxf .output.tar\ndocker restart nuxt-p2p-webrtc-sys\n",[24,212,213,218,226,241,248,254,266,277,288],{"__ignoreMap":22},[27,214,215],{"class":29,"line":30},[27,216,217],{"class":145},"# 本地：打包并上传\n",[27,219,220,222,224],{"class":29,"line":149},[27,221,34],{"class":33},[27,223,38],{"class":37},[27,225,41],{"class":37},[27,227,229,232,235,238],{"class":29,"line":228},3,[27,230,231],{"class":33},"tar",[27,233,234],{"class":167}," -cf",[27,236,237],{"class":37}," .output.tar",[27,239,240],{"class":37}," ./.output/\n",[27,242,244],{"class":29,"line":243},4,[27,245,247],{"emptyLinePlaceholder":246},true,"\n",[27,249,251],{"class":29,"line":250},5,[27,252,253],{"class":145},"# 服务器：停服 → 替换 → 重启\n",[27,255,257,260,263],{"class":29,"line":256},6,[27,258,259],{"class":33},"docker",[27,261,262],{"class":37}," stop",[27,264,265],{"class":37}," nuxt-p2p-webrtc-sys\n",[27,267,269,272,275],{"class":29,"line":268},7,[27,270,271],{"class":33},"rm",[27,273,274],{"class":167}," -rf",[27,276,240],{"class":37},[27,278,280,282,285],{"class":29,"line":279},8,[27,281,231],{"class":33},[27,283,284],{"class":167}," -vxf",[27,286,287],{"class":37}," .output.tar\n",[27,289,291,293,296],{"class":29,"line":290},9,[27,292,259],{"class":33},[27,294,295],{"class":37}," restart",[27,297,265],{"class":37},[71,299,302,305,323,326,329,415,419,452],{"title":300,"type":301},"别忘了取回数据文件","warning",[43,303,304],{},"统计数据库存在容器根目录，重建容器前请先拷出来：",[17,306,308],{"className":19,"code":307,"language":21,"meta":22,"style":22},"docker cp nuxt-p2p-webrtc-sys:/stats.db ./\n",[24,309,310],{"__ignoreMap":22},[27,311,312,314,317,320],{"class":29,"line":30},[27,313,259],{"class":33},[27,315,316],{"class":37}," cp",[27,318,319],{"class":37}," nuxt-p2p-webrtc-sys:/stats.db",[27,321,322],{"class":37}," ./\n",[43,324,325],{},"::",[13,327,328],{"id":328},"文档站的部署相关配置",[330,331,332,345],"table",{},[333,334,335],"thead",{},[336,337,338,342],"tr",{},[339,340,341],"th",{},"位置",[339,343,344],{},"作用",[346,347,348,363,380,395,405],"tbody",{},[336,349,350,356],{},[351,352,353],"td",{},[24,354,355],{},"content.config.ts",[351,357,358,359,362],{},"内容集合定义（内容源 = ",[24,360,361],{},"content/","）",[336,364,365,374],{},[351,366,367,370,371],{},[24,368,369],{},"nuxt.config.ts"," 的 ",[24,372,373],{},"routeRules",[351,375,376,379],{},[24,377,378],{},"/docs/**"," 开 SSR + 预渲染；其余路由保持 SPA",[336,381,382,389],{},[351,383,384,370,386],{},[24,385,369],{},[24,387,388],{},"nitro.prerender.routes",[351,390,391,392,362],{},"待预渲染的文档路由清单（来自 ",[24,393,394],{},"docs-nav.ts",[336,396,397,402],{},[351,398,399],{},[24,400,401],{},"server/routes/sitemap.xml.get.ts",[351,403,404],{},"站点地图（文档页 lastmod 取源文件 mtime）",[336,406,407,412],{},[351,408,409],{},[24,410,411],{},"server/routes/raw/[...slug].md.get.ts",[351,413,414],{},"原文 Markdown 端点（AI 友好）",[416,417,418],"h3",{"id":418},"环境变量",[330,420,421,431],{},[333,422,423],{},[336,424,425,428],{},[339,426,427],{},"变量",[339,429,430],{},"说明",[346,432,433,442],{},[336,434,435,439],{},[351,436,437],{},[24,438,119],{},[351,440,441],{},"服务端口",[336,443,444,449],{},[351,445,446],{},[24,447,448],{},"SITE_URL",[351,450,451],{},"站点对外域名（sitemap / llms.txt 中使用）；不设置则回退到请求的 Origin",[71,453,456,459,462,480,483],{"title":454,"type":455},"部署时建议设置 SITE_URL","tip",[43,457,458],{},"否则 sitemap 里写进的是请求来源地址，内网 / 回环访问时会产生不可用的 URL。\n::",[13,460,461],{"id":461},"开发调试提示",[463,464,465,473],"ul",{},[466,467,468,469,472],"li",{},"构建产物体积主要来自前端全量打包。可优化方向：按路由懒加载、Vuetify 按需引入、细化 ",[24,470,471],{},"manualChunks"," 分包策略。",[466,474,475,476,479],{},"如果 dev server 前端异常，先确认端口（默认 7009）没有被旧实例占用 —— 两个实例共享 ",[24,477,478],{},".nuxt"," 会互相干扰。",[13,481,482],{"id":482},"相关",[463,484,485,492],{},[466,486,487],{},[488,489,491],"a",{"href":490},"/docs/dev","开发文档首页",[466,493,494],{},[488,495,497],{"href":496},"/docs/dev/theme-cover","主题封面生成",[499,500,501],"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 .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 .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":22,"searchDepth":228,"depth":228,"links":503},[504,505,506,507,508],{"id":15,"depth":149,"text":15},{"id":92,"depth":149,"text":92},{"id":134,"depth":149,"text":135},{"id":203,"depth":149,"text":204},{"id":328,"depth":149,"text":328,"children":509},[510],{"id":418,"depth":228,"text":418},"p2pee 构建与部署说明：npm run build、产物结构、环境变量与端口、pm2/docker 托管。","md",{},"/docs/dev/deploy",{"title":5,"description":511},"docs/dev/deploy","Ye1Upl6JRh-R9FT4Dcuf80jLDvbRd8LWvaS3LurR0fU",1792518096640]