[{"data":1,"prerenderedAt":784},["ShallowReactive",2],{"page-/post/hono/hono-gitea-bun-hono-pm2-auto-action":3,"surrounding-page":775},{"id":4,"title":5,"author":6,"body":7,"date":761,"description":114,"extension":762,"group":6,"lastmod":763,"meta":764,"navigation":765,"path":766,"rawbody":767,"seo":768,"showTitle":5,"stem":769,"tags":770,"versions":772,"__hash__":774},"content/post/Hono/hono-gitea-bun-hono-pm2-auto-action.md","【Hono】Gitea+Bun+Hono+Pm2 自动化部署后记",null,{"type":8,"value":9,"toc":759},"minimark",[10,13,26,41,47,54,61,75,80,83,97,108,138,141,148,167,178,181,346,351,755],[11,12],"br",{},[14,15,16,17,21,22,25],"p",{},"本文记录一下",[18,19,20],"code",{},"bun","项目在使用",[18,23,24],{},"pm2","部署时产生的一点问题。",[14,27,28,29,32,33,37,38],{},"部署流程：使用",[18,30,31],{},"Gitea","自建git仓库，编写workflow，on",[34,35,36],"span",{},"push","，自动拉取代码=>下载依赖=>打包=>移动到目标文件夹=>启动/重启 ",[18,39,40],{},"pm2 stop/start ecosystem.config.cjs",[42,43,44],"blockquote",{},[14,45,46],{},"云服务器（新加坡）：debian 12  2h4g\nbun: 1.1.31\npm2: 5.4.2",[14,48,49,50,53],{},"这是一个4G内存的机器，所以我上了gitea，利用gitea的",[18,51,52],{},"act_runner","自动部署。",[14,55,56,57],{},"2G的服务器我实测打包Nuxt项目会爆内存，刚好",[58,59,60],"strong",{},"峰值内存要吃2G出头。",[14,62,63,64,67,68,70,71,74],{},"项目本身使用",[18,65,66],{},"honojs","，有几个简单接口，只有登录注册业务。因为已经用其他项目把",[18,69,52],{},"调通了，所以这个项目也很顺利的运行成功。整个gitea actions运行时间在",[18,72,73],{},"1s","左右",[14,76,77],{},[58,78,79],{},"但是pm2启动后显示error，没有错误日志!!",[14,81,82],{},"actions是已经成功跑完的，所以生产环境需要的文件已经被移动到了目标文件夹内。",[14,84,85,86,89,90,93,94],{},"尝试在项目根目录直接使用",[18,87,88],{},"bun run index.js","后，发现有打不开",[18,91,92],{},".env.production","里配置的目录的情况，原来是没正确加载上",[18,95,96],{},"NODE_ENV",[14,98,99,100,103,104,107],{},"于是又查阅了一番pm2文档、bun文档，发现需要给",[18,101,102],{},"pm2 start","加上",[18,105,106],{},"--env production","参数",[109,110,115],"pre",{"className":111,"code":112,"language":113,"meta":114,"style":114},"language-shell shiki shiki-themes github-light","pm2 start ecosystem.config.cjs --env production\n","shell","",[18,116,117],{"__ignoreMap":114},[34,118,121,124,128,131,135],{"class":119,"line":120},"line",1,[34,122,24],{"class":123},"s7eDp",[34,125,127],{"class":126},"sYBdl"," start",[34,129,130],{"class":126}," ecosystem.config.cjs",[34,132,134],{"class":133},"sYu0t"," --env",[34,136,137],{"class":126}," production\n",[14,139,140],{},"加上后，重新提交代码，自动部署，发现还是一样，显示error但没有日志",[14,142,143,144,147],{},"再次在项目根目录直接使用",[18,145,146],{},"NODE_ENV=production bun run index.js","，发现可以正常运行，那估计就是pm2有什么问题影响了，但单看配置文件是没有写错的，还是不知道什么原因无法用pm2启动",[14,149,150,151,154,155,158,159,162,163,166],{},"于是又不用配置文件启动，尝试直接",[18,152,153],{},"pm2 start index.js --interpreter bun"," 跑一下试试，这时候发现可以了，而且mode很明显是",[18,156,157],{},"fork","，而刚才我配置",[18,160,161],{},"ecosystem.config.js","时用的是",[18,164,165],{},"cluster","。",[14,168,169,170,173,174,177],{},"bun官网也只是提了一下要配置一下",[18,171,172],{},"interpreter","为",[18,175,176],{},"~/.bun/bin/bun","。无奈只能先这样处理，等后续解决后再来水一篇！",[14,179,180],{},"👇下面是配置参考",[109,182,186],{"className":183,"code":184,"language":185,"meta":114,"style":114},"language-typescript shiki shiki-themes github-light","module.exports = {\n  apps: [\n    {\n      name: 'your_app_name',\n      port: '5577',\n      // 运行bun项目时，先设置为fork模式\n      exec_mode: 'fork',\n      // instances: 'max',\n      script: 'index.js',\n      interpreter: '/root/.bun/bin/bun',\n      env: {\n        NODE_ENV: 'production'\n      },\n      env_production: {\n        NODE_ENV: 'production'\n      }\n    }\n  ]\n}\n\n","typescript",[18,187,188,207,213,219,231,242,249,260,266,277,288,294,303,309,315,322,328,334,340],{"__ignoreMap":114},[34,189,190,193,197,200,204],{"class":119,"line":120},[34,191,192],{"class":133},"module",[34,194,196],{"class":195},"sgsFI",".",[34,198,199],{"class":133},"exports",[34,201,203],{"class":202},"sD7c4"," =",[34,205,206],{"class":195}," {\n",[34,208,210],{"class":119,"line":209},2,[34,211,212],{"class":195},"  apps: [\n",[34,214,216],{"class":119,"line":215},3,[34,217,218],{"class":195},"    {\n",[34,220,222,225,228],{"class":119,"line":221},4,[34,223,224],{"class":195},"      name: ",[34,226,227],{"class":126},"'your_app_name'",[34,229,230],{"class":195},",\n",[34,232,234,237,240],{"class":119,"line":233},5,[34,235,236],{"class":195},"      port: ",[34,238,239],{"class":126},"'5577'",[34,241,230],{"class":195},[34,243,245],{"class":119,"line":244},6,[34,246,248],{"class":247},"sAwPA","      // 运行bun项目时，先设置为fork模式\n",[34,250,252,255,258],{"class":119,"line":251},7,[34,253,254],{"class":195},"      exec_mode: ",[34,256,257],{"class":126},"'fork'",[34,259,230],{"class":195},[34,261,263],{"class":119,"line":262},8,[34,264,265],{"class":247},"      // instances: 'max',\n",[34,267,269,272,275],{"class":119,"line":268},9,[34,270,271],{"class":195},"      script: ",[34,273,274],{"class":126},"'index.js'",[34,276,230],{"class":195},[34,278,280,283,286],{"class":119,"line":279},10,[34,281,282],{"class":195},"      interpreter: ",[34,284,285],{"class":126},"'/root/.bun/bin/bun'",[34,287,230],{"class":195},[34,289,291],{"class":119,"line":290},11,[34,292,293],{"class":195},"      env: {\n",[34,295,297,300],{"class":119,"line":296},12,[34,298,299],{"class":195},"        NODE_ENV: ",[34,301,302],{"class":126},"'production'\n",[34,304,306],{"class":119,"line":305},13,[34,307,308],{"class":195},"      },\n",[34,310,312],{"class":119,"line":311},14,[34,313,314],{"class":195},"      env_production: {\n",[34,316,318,320],{"class":119,"line":317},15,[34,319,299],{"class":195},[34,321,302],{"class":126},[34,323,325],{"class":119,"line":324},16,[34,326,327],{"class":195},"      }\n",[34,329,331],{"class":119,"line":330},17,[34,332,333],{"class":195},"    }\n",[34,335,337],{"class":119,"line":336},18,[34,338,339],{"class":195},"  ]\n",[34,341,343],{"class":119,"line":342},19,[34,344,345],{"class":195},"}\n",[14,347,348],{},[58,349,350],{},".gitea/workflow/build.yaml 这个完全和github一致，熟悉github actions的可以略过了",[109,352,356],{"className":353,"code":354,"language":355,"meta":114,"style":114},"language-yaml shiki shiki-themes github-light","name: Gitea Actions Demo\nrun-name: ${{ gitea.actor }} is testing out Gitea Actions  \non: [push]\njobs:\n  Explore-Gitea-Actions:\n    runs-on: debian\n    steps:\n      - run: echo \"  The job was automatically triggered by a ${{ gitea.event_name }} event.\"\n      - run: echo \"  This job is now running on a ${{ runner.os }} server hosted by Gitea!\"\n      - run: echo \"  The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}.\"\n      # 把代码checkout到一个临时的文件夹中\n      - name: Check out repository code\n        uses: actions/checkout@v3\n      # 下载依赖，因为我要在服务器打包代码\n      - name: Install dependencies\n        run: bun install\n      # 打包代码\n      - name: Build Project\n        run: npm run build\n      # 打包后的代码，移动到指定的文件夹内\n      # 为了测试配置文件，我把两个配置文件都copy过去了，实际只用到了.env.production\n      - name: Copy Files\n        run: |\n          mkdir -p /root/a/b\n          cp -R out/* /root/a/b/\n          cp -R ecosystem.config.cjs /root/a/b/ecosystem.config.cjs\n          cp -R package.json /root/a/b/package.json\n          cp -R .env.production /root/a/b/.env.production\n          cp -R .env /root/a/b/.env\n      # 下载依赖\n      - name: Install dependencies\n        run: |\n          cd /root/a/b\n          bun install\n     # 使用pm2启动项目 --env production\n      - name: Deploy to production2\n        run: |\n          cd /root/a/b\n          pm2 stop ecosystem.config.cjs\n          pm2 start ecosystem.config.cjs --env production\n      - run: echo \"  The ${{ gitea.repository }} repository has been cloned to the runner.\"\n      - run: echo \" ️ The workflow is now ready to test your code on the runner.\"\n      - name: List files in the repository\n        run: |\n          ls ${{ gitea.workspace }}          \n      - run: echo \"  This job's status is ${{ job.status }}.\"\n","yaml",[18,357,358,370,383,396,404,411,421,428,441,452,463,468,479,489,494,505,515,520,531,540,546,552,564,574,580,586,592,598,604,610,616,627,636,642,648,654,666,675,680,686,692,704,716,728,737,743],{"__ignoreMap":114},[34,359,360,364,367],{"class":119,"line":120},[34,361,363],{"class":362},"shJU0","name",[34,365,366],{"class":195},": ",[34,368,369],{"class":126},"Gitea Actions Demo\n",[34,371,372,375,377,380],{"class":119,"line":209},[34,373,374],{"class":362},"run-name",[34,376,366],{"class":195},[34,378,379],{"class":126},"${{ gitea.actor }} is testing out Gitea Actions",[34,381,382],{"class":195},"  \n",[34,384,385,388,391,393],{"class":119,"line":215},[34,386,387],{"class":133},"on",[34,389,390],{"class":195},": [",[34,392,36],{"class":126},[34,394,395],{"class":195},"]\n",[34,397,398,401],{"class":119,"line":221},[34,399,400],{"class":362},"jobs",[34,402,403],{"class":195},":\n",[34,405,406,409],{"class":119,"line":233},[34,407,408],{"class":362},"  Explore-Gitea-Actions",[34,410,403],{"class":195},[34,412,413,416,418],{"class":119,"line":244},[34,414,415],{"class":362},"    runs-on",[34,417,366],{"class":195},[34,419,420],{"class":126},"debian\n",[34,422,423,426],{"class":119,"line":251},[34,424,425],{"class":362},"    steps",[34,427,403],{"class":195},[34,429,430,433,436,438],{"class":119,"line":262},[34,431,432],{"class":195},"      - ",[34,434,435],{"class":362},"run",[34,437,366],{"class":195},[34,439,440],{"class":126},"echo \"  The job was automatically triggered by a ${{ gitea.event_name }} event.\"\n",[34,442,443,445,447,449],{"class":119,"line":268},[34,444,432],{"class":195},[34,446,435],{"class":362},[34,448,366],{"class":195},[34,450,451],{"class":126},"echo \"  This job is now running on a ${{ runner.os }} server hosted by Gitea!\"\n",[34,453,454,456,458,460],{"class":119,"line":279},[34,455,432],{"class":195},[34,457,435],{"class":362},[34,459,366],{"class":195},[34,461,462],{"class":126},"echo \"  The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}.\"\n",[34,464,465],{"class":119,"line":290},[34,466,467],{"class":247},"      # 把代码checkout到一个临时的文件夹中\n",[34,469,470,472,474,476],{"class":119,"line":296},[34,471,432],{"class":195},[34,473,363],{"class":362},[34,475,366],{"class":195},[34,477,478],{"class":126},"Check out repository code\n",[34,480,481,484,486],{"class":119,"line":305},[34,482,483],{"class":362},"        uses",[34,485,366],{"class":195},[34,487,488],{"class":126},"actions/checkout@v3\n",[34,490,491],{"class":119,"line":311},[34,492,493],{"class":247},"      # 下载依赖，因为我要在服务器打包代码\n",[34,495,496,498,500,502],{"class":119,"line":317},[34,497,432],{"class":195},[34,499,363],{"class":362},[34,501,366],{"class":195},[34,503,504],{"class":126},"Install dependencies\n",[34,506,507,510,512],{"class":119,"line":324},[34,508,509],{"class":362},"        run",[34,511,366],{"class":195},[34,513,514],{"class":126},"bun install\n",[34,516,517],{"class":119,"line":330},[34,518,519],{"class":247},"      # 打包代码\n",[34,521,522,524,526,528],{"class":119,"line":336},[34,523,432],{"class":195},[34,525,363],{"class":362},[34,527,366],{"class":195},[34,529,530],{"class":126},"Build Project\n",[34,532,533,535,537],{"class":119,"line":342},[34,534,509],{"class":362},[34,536,366],{"class":195},[34,538,539],{"class":126},"npm run build\n",[34,541,543],{"class":119,"line":542},20,[34,544,545],{"class":247},"      # 打包后的代码，移动到指定的文件夹内\n",[34,547,549],{"class":119,"line":548},21,[34,550,551],{"class":247},"      # 为了测试配置文件，我把两个配置文件都copy过去了，实际只用到了.env.production\n",[34,553,555,557,559,561],{"class":119,"line":554},22,[34,556,432],{"class":195},[34,558,363],{"class":362},[34,560,366],{"class":195},[34,562,563],{"class":126},"Copy Files\n",[34,565,567,569,571],{"class":119,"line":566},23,[34,568,509],{"class":362},[34,570,366],{"class":195},[34,572,573],{"class":202},"|\n",[34,575,577],{"class":119,"line":576},24,[34,578,579],{"class":126},"          mkdir -p /root/a/b\n",[34,581,583],{"class":119,"line":582},25,[34,584,585],{"class":126},"          cp -R out/* /root/a/b/\n",[34,587,589],{"class":119,"line":588},26,[34,590,591],{"class":126},"          cp -R ecosystem.config.cjs /root/a/b/ecosystem.config.cjs\n",[34,593,595],{"class":119,"line":594},27,[34,596,597],{"class":126},"          cp -R package.json /root/a/b/package.json\n",[34,599,601],{"class":119,"line":600},28,[34,602,603],{"class":126},"          cp -R .env.production /root/a/b/.env.production\n",[34,605,607],{"class":119,"line":606},29,[34,608,609],{"class":126},"          cp -R .env /root/a/b/.env\n",[34,611,613],{"class":119,"line":612},30,[34,614,615],{"class":247},"      # 下载依赖\n",[34,617,619,621,623,625],{"class":119,"line":618},31,[34,620,432],{"class":195},[34,622,363],{"class":362},[34,624,366],{"class":195},[34,626,504],{"class":126},[34,628,630,632,634],{"class":119,"line":629},32,[34,631,509],{"class":362},[34,633,366],{"class":195},[34,635,573],{"class":202},[34,637,639],{"class":119,"line":638},33,[34,640,641],{"class":126},"          cd /root/a/b\n",[34,643,645],{"class":119,"line":644},34,[34,646,647],{"class":126},"          bun install\n",[34,649,651],{"class":119,"line":650},35,[34,652,653],{"class":247},"     # 使用pm2启动项目 --env production\n",[34,655,657,659,661,663],{"class":119,"line":656},36,[34,658,432],{"class":195},[34,660,363],{"class":362},[34,662,366],{"class":195},[34,664,665],{"class":126},"Deploy to production2\n",[34,667,669,671,673],{"class":119,"line":668},37,[34,670,509],{"class":362},[34,672,366],{"class":195},[34,674,573],{"class":202},[34,676,678],{"class":119,"line":677},38,[34,679,641],{"class":126},[34,681,683],{"class":119,"line":682},39,[34,684,685],{"class":126},"          pm2 stop ecosystem.config.cjs\n",[34,687,689],{"class":119,"line":688},40,[34,690,691],{"class":126},"          pm2 start ecosystem.config.cjs --env production\n",[34,693,695,697,699,701],{"class":119,"line":694},41,[34,696,432],{"class":195},[34,698,435],{"class":362},[34,700,366],{"class":195},[34,702,703],{"class":126},"echo \"  The ${{ gitea.repository }} repository has been cloned to the runner.\"\n",[34,705,707,709,711,713],{"class":119,"line":706},42,[34,708,432],{"class":195},[34,710,435],{"class":362},[34,712,366],{"class":195},[34,714,715],{"class":126},"echo \" ️ The workflow is now ready to test your code on the runner.\"\n",[34,717,719,721,723,725],{"class":119,"line":718},43,[34,720,432],{"class":195},[34,722,363],{"class":362},[34,724,366],{"class":195},[34,726,727],{"class":126},"List files in the repository\n",[34,729,731,733,735],{"class":119,"line":730},44,[34,732,509],{"class":362},[34,734,366],{"class":195},[34,736,573],{"class":202},[34,738,740],{"class":119,"line":739},45,[34,741,742],{"class":126},"          ls ${{ gitea.workspace }}          \n",[34,744,746,748,750,752],{"class":119,"line":745},46,[34,747,432],{"class":195},[34,749,435],{"class":362},[34,751,366],{"class":195},[34,753,754],{"class":126},"echo \"  This job's status is ${{ job.status }}.\"\n",[756,757,758],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":114,"searchDepth":209,"depth":209,"links":760},[],"2025-02-10T00:00:00.000Z","md","2025-02-12T00:00:00.000Z",{},true,"/post/hono/hono-gitea-bun-hono-pm2-auto-action","---\ntitle: 【Hono】Gitea+Bun+Hono+Pm2 自动化部署后记\ndate: 2025-02-10\nlastmod: 2025-02-12\ntags: [\"Hono\"]\nversions: [\"hono@4.5.11\"]\nshowTitle: 【Hono】Gitea+Bun+Hono+Pm2 自动化部署后记\n---\n\u003Cbr />\n\n本文记录一下`bun`项目在使用`pm2`部署时产生的一点问题。\n\n部署流程：使用`Gitea`自建git仓库，编写workflow，on[push]，自动拉取代码=>下载依赖=>打包=>移动到目标文件夹=>启动/重启 `pm2 stop/start ecosystem.config.cjs`\n\n> 云服务器（新加坡）：debian 12  2h4g\n> bun: 1.1.31\n> pm2: 5.4.2\n\n这是一个4G内存的机器，所以我上了gitea，利用gitea的`act_runner`自动部署。\n\n2G的服务器我实测打包Nuxt项目会爆内存，刚好**峰值内存要吃2G出头。**\n\n项目本身使用`honojs`，有几个简单接口，只有登录注册业务。因为已经用其他项目把`act_runner`调通了，所以这个项目也很顺利的运行成功。整个gitea actions运行时间在`1s`左右\n\n**但是pm2启动后显示error，没有错误日志!!**\n\nactions是已经成功跑完的，所以生产环境需要的文件已经被移动到了目标文件夹内。\n\n尝试在项目根目录直接使用`bun run index.js`后，发现有打不开`.env.production`里配置的目录的情况，原来是没正确加载上`NODE_ENV`\n\n于是又查阅了一番pm2文档、bun文档，发现需要给`pm2 start`加上`--env production`参数\n\n```shell\npm2 start ecosystem.config.cjs --env production\n```\n\n加上后，重新提交代码，自动部署，发现还是一样，显示error但没有日志\n\n再次在项目根目录直接使用`NODE_ENV=production bun run index.js`，发现可以正常运行，那估计就是pm2有什么问题影响了，但单看配置文件是没有写错的，还是不知道什么原因无法用pm2启动\n\n于是又不用配置文件启动，尝试直接`pm2 start index.js --interpreter bun` 跑一下试试，这时候发现可以了，而且mode很明显是`fork`，而刚才我配置`ecosystem.config.js`时用的是`cluster`。\n\nbun官网也只是提了一下要配置一下`interpreter`为`~/.bun/bin/bun`。无奈只能先这样处理，等后续解决后再来水一篇！\n\n👇下面是配置参考\n\n```typescript\nmodule.exports = {\n  apps: [\n    {\n      name: 'your_app_name',\n      port: '5577',\n      // 运行bun项目时，先设置为fork模式\n      exec_mode: 'fork',\n      // instances: 'max',\n      script: 'index.js',\n      interpreter: '/root/.bun/bin/bun',\n      env: {\n        NODE_ENV: 'production'\n      },\n      env_production: {\n        NODE_ENV: 'production'\n      }\n    }\n  ]\n}\n\n```\n\n**.gitea/workflow/build.yaml 这个完全和github一致，熟悉github actions的可以略过了**\n\n```yaml\nname: Gitea Actions Demo\nrun-name: ${{ gitea.actor }} is testing out Gitea Actions  \non: [push]\njobs:\n  Explore-Gitea-Actions:\n    runs-on: debian\n    steps:\n      - run: echo \"  The job was automatically triggered by a ${{ gitea.event_name }} event.\"\n      - run: echo \"  This job is now running on a ${{ runner.os }} server hosted by Gitea!\"\n      - run: echo \"  The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}.\"\n      # 把代码checkout到一个临时的文件夹中\n      - name: Check out repository code\n        uses: actions/checkout@v3\n      # 下载依赖，因为我要在服务器打包代码\n      - name: Install dependencies\n        run: bun install\n      # 打包代码\n      - name: Build Project\n        run: npm run build\n      # 打包后的代码，移动到指定的文件夹内\n      # 为了测试配置文件，我把两个配置文件都copy过去了，实际只用到了.env.production\n      - name: Copy Files\n        run: |\n          mkdir -p /root/a/b\n          cp -R out/* /root/a/b/\n          cp -R ecosystem.config.cjs /root/a/b/ecosystem.config.cjs\n          cp -R package.json /root/a/b/package.json\n          cp -R .env.production /root/a/b/.env.production\n          cp -R .env /root/a/b/.env\n      # 下载依赖\n      - name: Install dependencies\n        run: |\n          cd /root/a/b\n          bun install\n     # 使用pm2启动项目 --env production\n      - name: Deploy to production2\n        run: |\n          cd /root/a/b\n          pm2 stop ecosystem.config.cjs\n          pm2 start ecosystem.config.cjs --env production\n      - run: echo \"  The ${{ gitea.repository }} repository has been cloned to the runner.\"\n      - run: echo \" ️ The workflow is now ready to test your code on the runner.\"\n      - name: List files in the repository\n        run: |\n          ls ${{ gitea.workspace }}          \n      - run: echo \"  This job's status is ${{ job.status }}.\"\n```\n\n",{"title":5,"description":114},"post/Hono/hono-gitea-bun-hono-pm2-auto-action",[771],"Hono",[773],"hono@4.5.11","h-Thqf1MP_jt9XV2iGNOQUz0MEZkJZur8EQboKH7S38",[776,780],{"title":777,"path":778,"stem":779},"OpenClaw 安装入门（Windows）","/post/zzao/openclaw/openclaw-install-windows","post/zzao/openclaw/openclaw-install-windows",{"title":781,"path":782,"stem":783},"假设你是AI，你的Skill应该是什么样的","/post/zzao/ai-skill-structure","post/zzao/ai-skill-structure",1779005086189]