[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"lang-vue":3,"catalog":8,"post-parse-post/post/migration-blog-to-codeberg":277,"lang-yaml":1092,"lang-bash":1097,"platform-codeberg":1102,"$fViMxHbq4onDtXRL2CKP84z42Zf9ssrtj8QkIsy4OZzY":1107},{"name":4,"alias":5,"icon":6,"color":7},"Vue",[],"",120,[9,30,48,67,84,100,118,134,151,169,185,204,221,244,261],{"id":10,"title":11,"path":12,"pubDate":13,"excerpt":14,"updateDate":21,"maintainDate":21,"tags":22,"hitokoto":24,"readingTime":25},"post/post/build-blog-with-gh-and-jsd.md","GitHub Pages+Jsdelivr 让你的静态网站用上CDN","/post/build-blog-with-gh-and-jsd","2026-01-19T00:00:00.000Z",{"type":15,"value":16},"minimark",[17],[18,19,20],"p",{},"最近突然发现Jsdelivr不仅可以直接读取GitHub仓库的静态资源，还有国内镜像源，这就有得玩了。结合GitHub Pages，我们可以实现一个完全免费的静态网站CDN加速服务。",null,[23],"web","serverless太爽了",{"text":26,"minutes":27,"time":28,"words":29},"5 min read",4.7,282000,940,{"id":31,"title":32,"path":33,"pubDate":34,"excerpt":35,"updateDate":21,"maintainDate":21,"tags":40,"hitokoto":42,"readingTime":43},"post/post/build-smart-home-with-rp.md","响应式编程 + MQTT 来构建智能家居系统","/post/build-smart-home-with-rp","2026-02-24T00:00:00.000Z",{"type":15,"value":36},[37],[18,38,39],{},"Home Assistant 的控制系统并不能满足我的需求。我通过使用响应式编程和MQTT协议来实现了一个建议的智能家居系统。",[41],"智能家居","重复造轮子是对的",{"text":44,"minutes":45,"time":46,"words":47},"10 min read",9.53,571800,1906,{"id":49,"title":50,"path":51,"pubDate":52,"excerpt":53,"updateDate":58,"maintainDate":21,"tags":59,"hitokoto":61,"readingTime":62},"post/post/card-message-collect.md","卡片消息收藏","/post/card-message-collect","2026-03-22T00:00:00.000Z",{"type":15,"value":54},[55],[18,56,57],{},"收集下我见过的卡片消息，以备不时之需。","2026-04-03T00:00:00.000Z",[60],"bot","用完就扔似乎不太好",{"text":63,"minutes":64,"time":65,"words":66},"14 min read",13.255,795300,2651,{"id":68,"title":69,"path":70,"pubDate":71,"excerpt":72,"updateDate":21,"maintainDate":21,"tags":77,"hitokoto":78,"readingTime":79},"post/post/create-a-new-comment-system.md","初尝后端：开发评论系统","/post/create-a-new-comment-system","2026-03-02T00:00:00.000Z",{"type":15,"value":73},[74],[18,75,76],{},"之前用的Giscus是基于iframe的，写个样式根本没法写，打算换个新评论系统。为了踏出自己的舒适圈，我决定学习写后端，评论系统正好是一个不错的后端项目。",[23],"再接第三方就彻底学不会后端了(x",{"text":80,"minutes":81,"time":82,"words":83},"6 min read",5.36,321600,1072,{"id":85,"title":86,"path":87,"pubDate":88,"excerpt":89,"updateDate":21,"maintainDate":21,"tags":94,"hitokoto":95,"readingTime":96},"post/post/dark-mode-with-hsl.md","HSL与亮暗色模式","/post/dark-mode-with-hsl","2026-01-04T00:00:00.000Z",{"type":15,"value":90},[91],[18,92,93],{},"众所周知，不同人有不同的亮暗色喜好，网站需要同时兼容这两套主题。通过RGB来设计网页颜色需要同时设计两种颜色，因此翻车的网站也不再少数，这时候就需要HSL来登场了。",[23],"通过HSL调色来设计网页吧",{"text":26,"minutes":97,"time":98,"words":99},4.125,247500,825,{"id":101,"title":102,"path":103,"pubDate":104,"excerpt":105,"updateDate":21,"maintainDate":21,"tags":110,"hitokoto":112,"readingTime":113},"post/post/deploy-llbt-by-docker.md","使用Docker部署Llbt踩坑记录","/post/deploy-llbt-by-docker","2025-12-09T00:00:00.000Z",{"type":15,"value":106},[107],[18,108,109],{},"长时间不搞docker了，很多东西都忘了，再加上本来就不擅长docker，导致安装Llbt的经历挺坎坷的。同时这次也是一次多开的安装经历，协议端多开的需求应该很少吧？这方面也没有多少文章，希望这篇文章对用这方面需求的人，能有些帮助。",[111,60],"docker","记录下使用Docker多开部署Llbt的经历",{"text":114,"minutes":115,"time":116,"words":117},"7 min read",6.66,399600,1332,{"id":119,"title":120,"path":121,"pubDate":122,"excerpt":123,"updateDate":21,"maintainDate":21,"tags":128,"hitokoto":129,"readingTime":130},"post/post/experience-about-webtui.md","Nuxt4编写WebTui主题小结","/post/experience-about-webtui","2026-02-21T00:00:00.000Z",{"type":15,"value":124},[125],[18,126,127],{},"旧的博客主题SEO写炸了，想换个新的主题了。这次机缘巧合之下，竟然找到了有搞WebTui的项目。稍微研究下搞出来了。新主题由Nuxt4 + oklch 组成。分享下编写主题的经验。",[23],"总算搞出来WebTui了",{"text":44,"minutes":131,"time":132,"words":133},9.335,560100,1867,{"id":135,"title":136,"path":137,"pubDate":138,"excerpt":139,"updateDate":21,"maintainDate":21,"tags":144,"hitokoto":145,"readingTime":146},"post/post/first-use-home-assistant.md","HomeAssistant初体验","/post/first-use-home-assistant","2026-01-27T00:00:00.000Z",{"type":15,"value":140},[141],[18,142,143],{},"想玩智能家居，啥都不懂。摸爬滚打了几天，写点流水账记录一下，也许可以给和我一样啥都不懂的人一些帮助",[41],"你花200块就买了个遥控玩具？",{"text":147,"minutes":148,"time":149,"words":150},"9 min read",8.63,517800,1726,{"id":152,"title":153,"path":154,"pubDate":155,"excerpt":156,"updateDate":21,"maintainDate":21,"tags":161,"hitokoto":163,"readingTime":164},"post/post/first-use-rss.md","RSS：一个神奇的订阅方式","/post/first-use-rss","2025-12-29T00:00:00.000Z",{"type":15,"value":157},[158],[18,159,160],{},"在开发博客时，我在网上浏览别人的博客时，遇到了一个名为RSS的神奇东西...",[23,162],"科普","通过RSS来订阅各种网页信息吧！",{"text":165,"minutes":166,"time":167,"words":168},"4 min read",3.13,187800,626,{"id":170,"title":171,"path":172,"pubDate":173,"excerpt":174,"updateDate":21,"maintainDate":21,"tags":179,"hitokoto":180,"readingTime":181},"post/post/migration-blog-to-codeberg.md","将托管在CodeBerg上的博客使用CI在Vercel上部署博客","/post/migration-blog-to-codeberg","2026-04-01T00:00:00.000Z",{"type":15,"value":175},[176],[18,177,178],{},"近期GitHub宣布要拿项目去练ai了。虽然我对这种行为也不是很抵触，但巨硬默认开启这个选项，关闭说明写的又不明不白。我打算搬家搬去CodeBerg。今天研究了一天跑通了CodeBerg + Forgejo Runner。记录下。",[23],"搬家啦～搬家啦～",{"text":44,"minutes":182,"time":183,"words":184},9.755,585300,1951,{"id":186,"title":187,"path":188,"pubDate":189,"excerpt":190,"updateDate":21,"maintainDate":21,"tags":195,"hitokoto":198,"readingTime":199},"post/post/record-paru-wrong.md","Arch滚挂了，记录下","/post/record-paru-wrong","2025-12-14T00:00:00.000Z",{"type":15,"value":191},[192],[18,193,194],{},"听说Arch天天滚挂，不知道是怎么一回事，今天我终于滚挂了，水篇文章记录下。",[196,197],"水","linux","paru把自己跟新坏了...",{"text":200,"minutes":201,"time":202,"words":203},"3 min read",2.225,133500,445,{"id":205,"title":206,"path":207,"pubDate":208,"excerpt":209,"updateDate":21,"maintainDate":21,"tags":214,"hitokoto":216,"readingTime":217},"post/post/sim-card-is-wrong.md","一件离谱的事情","/post/sim-card-is-wrong","2026-01-09T00:00:00.000Z",{"type":15,"value":210},[211],[18,212,213],{},"今天去外地面试，却没想到一口气挂了俩SIM卡，差点被地球Online踢出服务器",[215,196],"生活","万物互联建立在脆弱的支柱上",{"text":165,"minutes":218,"time":219,"words":220},3.055,183300,611,{"id":222,"title":223,"path":224,"pubDate":225,"excerpt":226,"updateDate":21,"maintainDate":21,"tags":236,"hitokoto":238,"readingTime":239},"post/post/steampy-login-steam-fail.md","SteamPy登录Steam被阻止","/post/steampy-login-steam-fail","2026-03-19T00:00:00.000Z",{"type":15,"value":227},[228],[18,229,230,231,235],{},"不知道是鉴权方式改了还是我更新Steam App的缘故，在SteamPy里登录Steam报",[232,233,234],"code",{},"Steam 阻止了此登录","。搞了半天总算解决了。",[237,196],"游戏","太过安全也会让使用变得麻烦",{"text":240,"minutes":241,"time":242,"words":243},"2 min read",1.315,78900,263,{"id":245,"title":246,"path":247,"pubDate":248,"excerpt":249,"updateDate":21,"maintainDate":254,"tags":255,"hitokoto":256,"readingTime":257},"post/post/test-giscus.md","感谢GH让静态网页也能用上评论","/post/test-giscus","2025-12-21T00:00:00.000Z",{"type":15,"value":250},[251],[18,252,253],{},"博客要开发评论系统了...缺一个测试用的页面，于是就写了这篇文章，顺便记录下怎么用 giscus 的","2026-04-06T00:00:00.000Z",[23],"通过 giscus 把 Discussion 当作评论",{"text":240,"minutes":258,"time":259,"words":260},1.56,93600,312,{"id":262,"title":263,"path":264,"pubDate":265,"excerpt":266,"updateDate":21,"maintainDate":21,"tags":271,"hitokoto":272,"readingTime":273},"post/post/use-nerd-font-at-web.md","在Web中使用NerdFont","/post/use-nerd-font-at-web","2025-12-18T00:00:00.000Z",{"type":15,"value":267},[268],[18,269,270],{},"众所周知，fa图标在web开发中被广泛使用，但该图标集部分图标有着vip要求，而且使用需要特殊的组件...但今天我发现了在tui中广泛使用的NerdFont图标集，也可以在web使用。",[23],"用nerd来替换掉你的fa图标",{"text":165,"minutes":274,"time":275,"words":276},3.04,182400,608,{"id":170,"title":171,"body":278,"description":178,"excerpt":1080,"extension":1084,"hitokoto":180,"maintainDate":21,"meta":1085,"navigation":1086,"path":172,"pubDate":173,"readingTime":1087,"seo":1088,"stem":1089,"tags":1090,"updateDate":21,"__hash__":1091},{"type":15,"value":279,"toc":1057},[280,282,287,292,314,325,332,349,354,357,366,380,387,400,407,414,418,448,456,462,530,541,548,551,556,560,577,583,593,609,613,623,628,634,640,652,662,670,677,685,694,698,702,722,729,745,749,752,759,762,771,777,784,791,794,820,827,830,837,840,846,850,869,873,889,906,911,955,959,965,977,982,1031,1045],[18,281,178],{},[283,284,286],"h2",{"id":285},"正文使用ci替代vercel集成","正文：使用CI替代Vercel集成",[288,289,291],"h3",{"id":290},"vercel-cli的使用","Vercel Cli的使用",[18,293,294,295,298,299,302,303,306,307,310,311,313],{},"非常遗憾，",[232,296,297],{},"Vercel","并不支持",[232,300,301],{},"CodeBerg","，所以我们无法像在",[232,304,305],{},"GitHub","上那样推送完就傻瓜式部署了。\n不过我们可以通过",[232,308,309],{},"Vercel cli","手动将代码推送到",[232,312,297],{},"上，再在CI中使用改cli，就可以和以前一样自动部署。",[18,315,316,317,320,321,324],{},"首先，我们需要去申请一个",[232,318,319],{},"Vercel Token","，",[232,322,323],{},"vercel cli","的指令都需要它来执行。",[326,327],"share-card",{"author":328,"content":329,"img":330,"url":331,"website":297},"","你可以在这里申请Vercel Token","https://vercel.com/favicon.ico","https://vercel.com/account/settings/tokens",[18,333,334,335,337,338,340,341,348],{},"申请完",[232,336,319],{},"后，我们就可以在本地安装",[232,339,309],{},"了。安装方法很简单，直接使用",[232,342,347],{"className":343,"language":345,"highlight":346},[344],"language-bash","bash","\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">npm\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> install\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -g\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> vercel\u003C/span>\u003C/span>\u003C/code>","npm install -g vercel","安装即可：",[350,351,353],"h4",{"id":352},"上传到vercel","上传到Vercel",[18,355,356],{},"安装完后，我们可以一下命令将代码推送到预览环境:",[358,359,364],"pre",{"className":360,"code":361,"language":345,"meta":328,"highlight":362,"lineCount":363,"forceScrollState":-1},[344],"vercel --token=你的Token\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">vercel\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --token=你的Token\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",1,[232,365,361],{"__ignoreMap":328},[18,367,368,369,372,373,375,376,379],{},"但在CI中，我们是不可能手动确认项目的，所以我们需要加上",[232,370,371],{},"--yes","。\n也不想占用宝贵的CI时间，来等待",[232,374,297],{},"编译完成，所以我们还需要加上",[232,377,378],{},"--no-wait","。",[358,381,385],{"className":382,"code":383,"language":345,"meta":328,"highlight":384,"lineCount":363,"forceScrollState":-1},[344],"vercel --yes --no-wait --token=你的Token\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">vercel\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --yes\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --no-wait\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --token=你的Token\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,386,383],{"__ignoreMap":328},[388,389,390],"warning",{},[18,391,392,393,395,396,399],{},"你需要确保你的项目文件夹名称和你在",[232,394,297],{},"上创建的项目名称一致，否则会部署失败。可能需要手动编写",[232,397,398],{},"vercel.json","来指定项目名称。",[18,401,402,403,406],{},"如果没有问题的话，我们就可以在CI中使用这个命令了。当然，在CI中我们需要加上",[232,404,405],{},"--prod","参数来部署到生产环境。最终的命令长这个样子。",[358,408,412],{"className":409,"code":410,"language":345,"meta":328,"highlight":411,"lineCount":363,"forceScrollState":-1},[344],"vercel --no-wait --prod --yes --token=你的Token\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">vercel\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --no-wait\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --prod\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --yes\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --token=你的Token\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,413,410],{"__ignoreMap":328},[288,415,417],{"id":416},"ci-介绍","CI 介绍",[18,419,420,421,320,423,425,426,428,429,432,433,436,437,439,440,442,443,445,446,379],{},"相对于",[232,422,305],{},[232,424,301],{},"支持自托管运行环境，但并没有内置的运行环境，所谓的官方运行环境也是官方自己部署的。\n",[232,427,301],{},"支持",[232,430,431],{},"Forgejo Runner","和",[232,434,435],{},"Woodpecker","两种CI工具。\n要使用",[232,438,435],{},"需要像官方发出申请，而",[232,441,431],{},"则有三种免费的运行环境。\n我并没有怎么研究",[232,444,435],{},"，这里主要讲",[232,447,431],{},[18,449,450,452,453,455],{},[232,451,301],{},"是一个非营利组织，主要为了支持开源软件。如果你的软件是闭源的，你可能就不符合",[232,454,301],{},"的CI使用条件了，需要自行部署了。",[18,457,458,459,461],{},"目前",[232,460,301],{},"提供了三种无需申请的运行环境:",[463,464,465,484],"table",{},[466,467,468],"thead",{},[469,470,471,475,478,481],"tr",{},[472,473,474],"th",{},"名称",[472,476,477],{},"CPU",[472,479,480],{},"内存",[472,482,483],{},"时间限制",[485,486,487,502,516],"tbody",{},[469,488,489,493,496,499],{},[490,491,492],"td",{},"codeberg-tiny",[490,494,495],{},"1",[490,497,498],{},"2G",[490,500,501],{},"2分钟",[469,503,504,507,510,513],{},[490,505,506],{},"codeberg-small",[490,508,509],{},"2",[490,511,512],{},"4G",[490,514,515],{},"5分钟",[469,517,518,521,524,527],{},[490,519,520],{},"codeberg-medium",[490,522,523],{},"4",[490,525,526],{},"8G",[490,528,529],{},"10分钟",[18,531,532,533,536,537,540],{},"架构都是",[232,534,535],{},"X86","的，环境应该是",[232,538,539],{},"Linux","。可以满足博客打包上传了。",[18,542,543,544,547],{},"如果你的任务不是很紧急，可以加上-lazy后缀，如",[232,545,546],{},"codeberg-tiny-lazy","，它会在1天内的空闲时间执行，减轻服务器的压力。",[18,549,550],{},"官方原文如下：",[552,553],"git-card",{"platform":554,"repo":555},"codeberg","actions/meta",[288,557,559],{"id":558},"编写ci配置文件","编写CI配置文件",[18,561,562,564,565,568,569,572,573,576],{},[232,563,431],{},"的配置文件在",[232,566,567],{},".forgejo/workflows","目录下，格式和",[232,570,571],{},"GitHub Actions","的配置文件基本一样，都是",[232,574,575],{},"YAML","格式的。",[18,578,579,580,582],{},"下面是我的博客部署到",[232,581,297],{},"的CI配置文件：",[358,584,591],{"className":585,"code":587,"language":588,"meta":328,"highlight":589,"lineCount":590,"forceScrollState":-1},[586],"language-yaml","name: Deploy Nuxt4 to Vercel\n\non:\n  push:\n    branches:\n      - v2\n  workflow_dispatch:\n\njobs:\n  deploy:\n    runs-on: codeberg-tiny\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Setup Node.js environment\n        uses: pnpm/action-setup@v5\n\n      - name: Install Vercel CLI\n        run: pnpm i vercel\n\n      - name: Push To Vercel\n        run: pnpx vercel --no-wait --prod --yes --token=${{ secrets.VERCEL_TOKEN }}\n","yaml","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 2ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">name\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">Deploy Nuxt4 to Vercel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"2\">\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"3\">\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\">on\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"4\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">push\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"5\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">branches\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"6\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">- \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">v2\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"7\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">workflow_dispatch\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"8\">\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"9\">\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">jobs\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"10\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">deploy\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"11\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">runs-on\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">codeberg-tiny\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"12\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">steps\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"13\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">- \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">name\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">Checkout code\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"14\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">uses\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">actions/checkout@v4\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"15\">\u003Cspan class=\"indent\" style=\"--indent-offset: 0ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 2ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 4ch;\">\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"16\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">- \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">name\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">Setup Node.js environment\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"17\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">uses\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">pnpm/action-setup@v5\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"18\">\u003Cspan class=\"indent\" style=\"--indent-offset: 0ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 2ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 4ch;\">\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"19\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">- \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">name\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">Install Vercel CLI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"20\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">run\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">pnpm i vercel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"21\">\u003Cspan class=\"indent\" style=\"--indent-offset: 0ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 2ch;\">\u003C/span>\u003Cspan class=\"indent\" style=\"--indent-offset: 4ch;\">\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"22\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">- \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">name\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">Push To Vercel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"23\">\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan class=\"indent\">  \u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">run\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">: \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">pnpx vercel --no-wait --prod --yes --token=${{ secrets.VERCEL_TOKEN }}\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",23,[232,592,587],{"__ignoreMap":328},[18,594,595,596,599,600,602,603,605,606,608],{},"需要注意的是，",[232,597,598],{},"runs-on","填写的是",[232,601,492],{},"、",[232,604,506],{},"或",[232,607,520],{},"等运行环境名称。如果你有自部署的，也可以填写自部署的环境名称。",[283,610,612],{"id":611},"附1配合-docker-部署forgejo-runner","附1：配合 Docker 部署Forgejo Runner",[18,614,615,616,619,620,622],{},"我采用了",[232,617,618],{},"Docker","来配合",[232,621,431],{},"使用。但怀疑是我科学上网环境变量配置的有问题，导致网速奇差无比，基本上不能使用。因此我并没有在正文中介绍它。",[18,624,625,627],{},[232,626,431],{},"的文档说的十分详细。但有人和我一样英语不好，或者有些大聪明根本不看文档...我还是简单介绍一下部署方法吧。",[326,629],{"author":328,"content":630,"img":631,"url":632,"website":633},"Forgejo Runner安装指导","https://forgejo.org/favicon.svg","https://forgejo.org/docs/latest/admin/actions/runner-installation/","Forgejo",[288,635,637,638],{"id":636},"_1-安装forgejo-runner","1. 安装",[232,639,431],{},[18,641,642,643,645,646,648,649,651],{},"我是搭配",[232,644,618],{},"使用的，所以要先安装",[232,647,618],{},"。至于",[232,650,618],{},"如何安装，这里不展开赘述。",[18,653,654,655,658,659,661],{},"在科学上网+",[232,656,657],{},"root","环境下执行以下命令，完成",[232,660,431],{},"的下载和验证：",[358,663,668],{"className":664,"code":665,"language":345,"meta":328,"highlight":666,"lineCount":667,"forceScrollState":-1},[344],"export ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')\nexport RUNNER_VERSION=$(curl -X 'GET' https://data.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | jq .name -r | cut -c 2-)\nexport FORGEJO_URL=\"https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-${ARCH}\"\nwget -O forgejo-runner ${FORGEJO_URL} || curl -o forgejo-runner ${FORGEJO_URL}\nchmod +x forgejo-runner\nwget -O forgejo-runner.asc ${FORGEJO_URL}.asc || curl -o forgejo-runner.asc ${FORGEJO_URL}.asc\ngpg --keyserver hkps://keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710\ngpg --verify forgejo-runner.asc forgejo-runner && echo \"✓ Verified\" || echo \"✗ Failed\"\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#C678DD;--shiki-light:#A626A4\">export\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\"> ARCH\u003C/span>\u003Cspan style=\"--shiki-dark:#56B6C2;--shiki-light:#383A42\">=\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">$\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">(\u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">uname\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -m\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> | \u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">sed\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> 's/x86_64/amd64/;s/aarch64/arm64/'\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"2\">\u003Cspan style=\"--shiki-dark:#C678DD;--shiki-light:#A626A4\">export\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\"> RUNNER_VERSION\u003C/span>\u003Cspan style=\"--shiki-dark:#56B6C2;--shiki-light:#383A42\">=\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">$\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">(\u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">curl\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -X\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> 'GET'\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> https://data.forgejo.org/api/v1/repos/forgejo/runner/releases/latest\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> | \u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">jq\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> .name\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -r\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> | \u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">cut\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -c\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> 2-\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"3\">\u003Cspan style=\"--shiki-dark:#C678DD;--shiki-light:#A626A4\">export\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\"> FORGEJO_URL\u003C/span>\u003Cspan style=\"--shiki-dark:#56B6C2;--shiki-light:#383A42\">=\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">\"https://code.forgejo.org/forgejo/runner/releases/download/v\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">${\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">RUNNER_VERSION\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">/forgejo-runner-\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">${\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">RUNNER_VERSION\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">-linux-\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">${\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">ARCH\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#E45649\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"4\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">wget\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -O\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#E45649\"> $\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">{\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">FORGEJO_URL\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> || \u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">curl\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -o\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#E45649\"> $\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">{\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">FORGEJO_URL\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"5\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">chmod\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> +x\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"6\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">wget\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -O\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner.asc\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#E45649\"> $\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">{\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">FORGEJO_URL\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">.asc\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> || \u003C/span>\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">curl\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -o\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner.asc\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#E45649\"> $\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">{\u003C/span>\u003Cspan style=\"--shiki-dark:#E06C75;--shiki-light:#E45649\">FORGEJO_URL\u003C/span>\u003Cspan style=\"--shiki-dark:#d19a66;--shiki-light:#0431FA\">}\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">.asc\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"7\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">gpg\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --keyserver\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> hkps://keys.openpgp.org\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --recv\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> EB114F5E6C0DC2BCDD183550A4B61A2DC5923710\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"8\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">gpg\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --verify\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner.asc\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> &#x26;&#x26; \u003C/span>\u003Cspan style=\"--shiki-dark:#56B6C2;--shiki-light:#0184BC\">echo\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> \"✓ Verified\"\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> || \u003C/span>\u003Cspan style=\"--shiki-dark:#56B6C2;--shiki-light:#0184BC\">echo\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> \"✗ Failed\"\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",8,[232,669,665],{"__ignoreMap":328},[18,671,672,673,676],{},"接着将",[232,674,675],{},"forgejo-runner","移动到软件目录下，并设置相应权限：",[358,678,683],{"className":679,"code":680,"language":345,"meta":328,"highlight":681,"lineCount":682,"forceScrollState":-1},[344],"cp forgejo-runner /usr/local/bin/forgejo-runner\nchmod 755 /usr/local/bin/forgejo-runner\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">cp\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> /usr/local/bin/forgejo-runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"2\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">chmod\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> 755\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> /usr/local/bin/forgejo-runner\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",2,[232,684,680],{"__ignoreMap":328},[18,686,687,688,693],{},"完成上述操作后，你可以输入",[232,689,692],{"className":690,"language":345,"highlight":691},[344],"\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -v\u003C/span>\u003C/span>\u003C/code>","forgejo-runner -v","来验证安装是否成功，正确的话它会输出版本号。",[288,695,697],{"id":696},"_2-创建运行环境","2. 创建运行环境",[350,699,701],{"id":700},"创建-runner-用户","创建 runner 用户",[18,703,704,705,708,709,711,712,715,716,718,719,721],{},"裸root运行是十分不安全的，官方推荐创建一个",[232,706,707],{},"runner","用户来运行",[232,710,431],{},"，官方的",[232,713,714],{},"systemd","也是以",[232,717,707],{},"用户身份来运行的。\n所以我们也来创建一个",[232,720,707],{},"用户：",[358,723,727],{"className":724,"code":725,"language":345,"meta":328,"highlight":726,"lineCount":682,"forceScrollState":-1},[344],"useradd --create-home runner\nusermod -aG docker runner\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">useradd\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> --create-home\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\" data-line-number=\"2\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">usermod\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -aG\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> docker\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> runner\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,728,725],{"__ignoreMap":328},[18,730,731,732,737,738,740,741,744],{},"完成以下操作后，我们通过",[232,733,736],{"className":734,"language":345,"highlight":735},[344],"\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">su\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> runner\u003C/span>\u003C/span>\u003C/code>","su runner","切换到",[232,739,707],{},"用户，并切换到",[232,742,743],{},"~","目录，来配置环境。",[350,746,748],{"id":747},"配置-forgejo-runner","配置 Forgejo Runner",[18,750,751],{},"我们通过下面的步骤来创建默认配置文件：",[358,753,757],{"className":754,"code":755,"language":345,"meta":328,"highlight":756,"lineCount":363,"forceScrollState":-1},[344],"forgejo-runner generate-config > config.yml\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> generate-config\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> \u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\">>\u003C/span>\u003Cspan style=\"--shiki-dark:#ABB2BF;--shiki-light:#383A42\"> \u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\">config.yml\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,758,755],{"__ignoreMap":328},[18,760,761],{},"配置文件的注释很详细，请根据自己的需求进行修改",[388,763,764],{},[18,765,766,767,770],{},"我使用时，配置文件最下面的",[232,768,769],{},"connections","不需要填写，后面有专门的命令来注册链接。",[18,772,773,774,776],{},"完成这之后，我们可以通过下面命令来启动",[232,775,431],{},"了。",[358,778,782],{"className":779,"code":780,"language":345,"meta":328,"highlight":781,"lineCount":363,"forceScrollState":-1},[344],"forgejo-runner daemon -c ./runner-config.yml\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> daemon\u003C/span>\u003Cspan style=\"--shiki-dark:#D19A66;--shiki-light:#986801\"> -c\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> ./runner-config.yml\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,783,780],{"__ignoreMap":328},[18,785,786,787,790],{},"它在启动后会输出",[232,788,789],{},"Starting runner daemon","，之后马上会因为没有连接而报错退出。",[350,792,793],{"id":793},"添加连接",[18,795,796,797,799,800,803,804,807,808,807,811,807,814,817,818,379],{},"要连接到",[232,798,301],{},"，我们首先拿到一个",[232,801,802],{},"Token","。在",[232,805,806],{},"设置"," -> ",[232,809,810],{},"Actions",[232,812,813],{},"运行器",[232,815,816],{},"创建新运行器"," 可以找到你的",[232,819,802],{},[18,821,822],{},[823,824],"img",{"alt":825,"src":826},"获取Token","/image/migration-blog-to-codeberg/codeberg-token.png",[18,828,829],{},"之后执行下面的命令来添加连接：",[358,831,835],{"className":832,"code":833,"language":345,"meta":328,"highlight":834,"lineCount":363,"forceScrollState":-1},[344],"forgejo-runner register\n","\u003Cpre class=\"shiki shiki-themes one-dark-pro one-light\" style=\"--shiki-dark:#abb2bf;--shiki-light:#383A42;--shiki-dark-bg:#282c34;--shiki-light-bg:#FAFAFA;--line-number-width: 1ch;\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" data-line-number=\"1\">\u003Cspan style=\"--shiki-dark:#61AFEF;--shiki-light:#4078F2\">forgejo-runner\u003C/span>\u003Cspan style=\"--shiki-dark:#98C379;--shiki-light:#50A14F\"> register\u003C/span>\u003C/span>\n\u003C/code>\u003C/pre>",[232,836,833],{"__ignoreMap":328},[18,838,839],{},"接着按要求填入Git托管平台url，token就可以完成注册。",[18,841,842,843,845],{},"这时再执行下面的命令，则不会收到报错，并且可以在",[232,844,301],{},"上看到你的运行器。",[288,847,849],{"id":848},"_3-设置后台托管","3. 设置后台托管",[18,851,852,853,860,861,864,865,868],{},"如果上述步骤没有问题的话，可以将 ",[854,855,859],"a",{"href":856,"rel":857},"https://code.forgejo.org/forgejo/runner/src/branch/main/contrib/forgejo-runner.service",[858],"nofollow","官方的systemd单元格文件","\n复制到",[232,862,863],{},"/etc/systemd/system/forgejo-runner.service","，然后",[232,866,867],{},"systemctl enable --now forgejo-runner","来启动了。不要忘记看日志它是否正常工作。",[283,870,872],{"id":871},"附2codeberg的使用体验","附2：CodeBerg的使用体验",[18,874,875,877,878,880,881,885,886,888],{},[232,876,301],{},"有全中文，不用再和",[232,879,305],{},"一样啃生肉了。 ",[882,883,884],"hide",{},"你都做程序员了，还看不懂English?","\n而且",[232,887,301],{},"可以为你的项目设置头像，之前一直都觉得项目都顶着一个用户的头像...非常奇怪。",[18,890,891,893,894,896,897,899,900,902,903,379],{},[232,892,301],{},"支持从",[232,895,305],{},"快速迁移，输入url就能进行克隆，非常方便。项目主题，issue什么的一个都不缺。\n同时",[232,898,301],{},"的API是完全没有任何速率限制的，不用像",[232,901,305],{},"一样要自行申请一个",[232,904,905],{},"API Token",[326,907],{"author":328,"content":908,"img":909,"url":910,"website":301},"CodeBerg API文档","https://codeberg.org/favicon.ico","https://codeberg.org/api/swagger",[18,912,913,914,916,917,420,919,921,922,924,925,927,928,930,931,934,935,938,939,941,942,320,945,320,948,951,952,954],{},"但在",[232,915,810],{},"上，",[232,918,301],{},[232,920,305],{},"还是非常脆弱的。\n上文讲述的官方",[232,923,431],{},"也才刚上线一年左右。之前的环境都要向官方申请才能使用CI。\n同时",[232,926,520],{},"也才",[232,929,529],{},"的运行时长，我的",[232,932,933],{},"Stapxs-QQ-Lite-X","编译",[232,936,937],{},"Electron","平均时长都在10分钟以上，根本不可能够用。\n而且仅有疑似",[232,940,539],{},"的环境，相对于能同时提供",[232,943,944],{},"Win",[232,946,947],{},"Win Arm",[232,949,950],{},"MacOS","的",[232,953,305],{},"而言，十分孱弱了。\n如果真的想承担软件编译，还是自行部署吧。",[283,956,958],{"id":957},"闲谈日益糟糕的github","闲谈：日益糟糕的GitHub",[18,960,961],{},[823,962],{"alt":963,"src":964},"正在屠戮GitHub的巨硬","/image/migration-blog-to-codeberg/greathard-kill-gh.png",[18,966,967,969,970,972,973,976],{},[232,968,305],{},"被巨硬收购后，已经变得越来越糟糕了。之前",[232,971,305],{},"的拿它的新UI乱推",[232,974,975],{},"Copilot","已经搞得我想写个新主页了。",[18,978,979],{},[823,980],{"alt":963,"src":981},"/image/migration-blog-to-codeberg/confused-ui.png",[18,983,984,985,320,988,990,991,994,995,998,999,1001,1002,432,1004,1006,1007,1009,1010,320,1013,1016,1017,1019,1020,1022,1023,1025,1026,432,1028,1030],{},"作为一个",[232,986,987],{},"Git托管平台",[232,989,305],{},"主页的一半篇幅是AI聊天框，另一半是你最近的",[232,992,993],{},"Issue","与",[232,996,997],{},"Fork","。\n我是无法理解，你收不到回应通知，光点开",[232,1000,993],{},"看看就有人搭理你了吗？将用户已经知道的信息放在主页上，完全就是在浪费空间。\n更加糟糕的是，在",[232,1003,993],{},[232,1005,997],{},"上，是由",[232,1008,975],{},"的处理按钮的。\n前段时间",[232,1011,1012],{},"matplotlib",[232,1014,1015],{},"AI","乱发",[232,1018,997],{},"还攻击开发者，闹得沸沸扬扬的。过度往开源社区里塞",[232,1021,1015],{},"，让",[232,1024,1015],{},"占领",[232,1027,993],{},[232,1029,997],{},"，并非是正确的事情。",[18,1032,1033,1034,994,1036,1038,1039,1041,1042,1044],{},"将AI聊天框和不知有何意义的",[232,1035,993],{},[232,1037,997],{},"拼合在一起，就得到了现在的",[232,1040,305],{},"主页了。不知道的看到这占大头的聊天框还以为是个",[232,1043,1015],{},"聊天平台了。",[18,1046,1047,1048,1050,1051,1053,1054,1056],{},"现在",[232,1049,305],{},"又要拿开源项目乱练",[232,1052,1015],{},"。往日最大的开源社区——",[232,1055,305],{},"正在转变为巨硬手下售卖Token的打工人。真是悲哀——！",{"title":328,"searchDepth":682,"depth":1058,"links":1059},4,[1060,1068,1078,1079],{"id":285,"depth":682,"text":286,"children":1061},[1062,1066,1067],{"id":290,"depth":1063,"text":291,"children":1064},3,[1065],{"id":352,"depth":1058,"text":353},{"id":416,"depth":1063,"text":417},{"id":558,"depth":1063,"text":559},{"id":611,"depth":682,"text":612,"children":1069},[1070,1072,1077],{"id":636,"depth":1063,"text":1071},"1. 安装Forgejo Runner",{"id":696,"depth":1063,"text":697,"children":1073},[1074,1075,1076],{"id":700,"depth":1058,"text":701},{"id":747,"depth":1058,"text":748},{"id":793,"depth":1058,"text":793},{"id":848,"depth":1063,"text":849},{"id":871,"depth":682,"text":872},{"id":957,"depth":682,"text":958},{"type":15,"value":1081},[1082],[18,1083,178],{},"md",{},true,{"text":44,"minutes":182,"time":183,"words":184},{"title":171,"description":178},"post/migration-blog-to-codeberg",[23],"uVSqV0bS0T2ET5Mb3pBvHkqbTCH48mf6ORQE0JB2eaQ",{"name":575,"alias":1093,"icon":1095,"color":1096},[1094],"yml","",280,{"name":1098,"alias":1099,"icon":1101,"color":7},"Shell",[1100,345],"sh","",{"name":301,"alias":1103,"icon":1104,"color":1105,"unknown":1106},[],"",260,false,{"name":1108,"updatedAt":1109,"stars":1110,"forks":1063,"desc":1111,"issues":1112,"avatar":1113,"owner":1114,"url":1115},"meta","2026-01-30T23:53:06.000Z",48,"Information and discussions around hosted Forgejo Actions at Codeberg",16,"https://codeberg.org/avatars/9c6ff69f2f41faeeaa469e3421baba8f","Forgejo Actions @ Codeberg","https://codeberg.org/actions/meta"]