<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>茶叙记</title><description>见信如晤</description><link>https://www.chaxuji.de/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.10.7</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年6月2日 18:39:15</lastBuildDate><item><title>2025 过去的一年我做了什么</title><link>https://www.chaxuji.de/posts/summary_of_the_2025/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/summary_of_the_2025/</guid><description>2025年，我在毕业与升学的转折中看过了昆明的海鸥与西北的日落，在摄影、博客与草缸的微缩世界里安放焦虑，最终明白万物皆有裂痕，那是光照进来的地方。</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;2025 年度总结：In the Broken Folds&lt;a href=&quot;#2025-年度总结in-the-broken-folds&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;“In the broken folds, there are ten thousand kinds of rebirth.&lt;/p&gt;&lt;p&gt;We always want to hide the cracks and fill the gaps.&lt;/p&gt;&lt;p&gt;But I forgot - everything has cracks, because that’s where the light comes in.”&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;01. 序言：难忘的一年&lt;a href=&quot;#01-序言难忘的一年&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;2025对于我而言，是难以忘记的一年。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一年，我换上了学士服，也收到了新的录取信，给自己的学生时代又延长了三年。&lt;/p&gt;&lt;p&gt;从昆明的海鸥，看到了毕业旅行的日落；折腾过个人博客，也沉迷于草缸的微缩世界。&lt;/p&gt;&lt;p&gt;并不是每一天都闪闪发光，但回头看时，每一步都算数。&lt;/p&gt;&lt;p&gt;关上2025的门，把遗憾清零，把记忆永存。&lt;/p&gt;&lt;p&gt;&lt;em&gt;Goodbye 2025, thank you for the lessons. Next Level: 2026.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/1.wOip4nmF_1VcyGO.webp&quot; srcset=&quot;/_astro/1.wOip4nmF_COmOU.webp 640w, /_astro/1.wOip4nmF_Z1fQNMo.webp 750w, /_astro/1.wOip4nmF_Z5tO28.webp 828w, /_astro/1.wOip4nmF_Z2fc7kf.webp 1080w, /_astro/1.wOip4nmF_1Tvmmc.webp 1280w, /_astro/1.wOip4nmF_ZN0ikS.webp 1668w, /_astro/1.wOip4nmF_ZalCEz.webp 2048w, /_astro/1.wOip4nmF_Z19mdhI.webp 2560w, /_astro/1.wOip4nmF_1VcyGO.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;02. 旅途：从暖冬开始&lt;a href=&quot;#02-旅途从暖冬开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;昆明 | &lt;em&gt;Start with warmth&lt;/em&gt;&lt;a href=&quot;#昆明--start-with-warmth&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在结束考研后，我便去了昆明，这座四季如春的城市。&lt;/p&gt;&lt;p&gt;饵块、米线、乳扇的味道让我有些怀念。&lt;/p&gt;&lt;p&gt;原以为是寒冷的一月，但实际上是被鲜花与海鸥羽毛包裹的无尽生机。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/2.CYWjnstA_1lPkdy.webp&quot; srcset=&quot;/_astro/2.CYWjnstA_Z1lnTO2.webp 640w, /_astro/2.CYWjnstA_1P72mA.webp 750w, /_astro/2.CYWjnstA_Z24H6G5.webp 828w, /_astro/2.CYWjnstA_2fCM0q.webp 1080w, /_astro/2.CYWjnstA_1k97RV.webp 1280w, /_astro/2.CYWjnstA_Z1nmwO9.webp 1668w, /_astro/2.CYWjnstA_ZJHR8P.webp 2048w, /_astro/2.CYWjnstA_Z1IIrKY.webp 2560w, /_astro/2.CYWjnstA_1lPkdy.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;03. 告别：学士学位&lt;a href=&quot;#03-告别学士学位&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;毕业 | &lt;em&gt;Bachelor’s Degree&lt;/em&gt;&lt;a href=&quot;#毕业--bachelors-degree&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在顺利写完了论文后，毕业的日子如期而至。&lt;/p&gt;&lt;p&gt;半年后再回想当时的瞬间，又有了更多的不舍。&lt;/p&gt;&lt;p&gt;在南昌大学的一切都让我难以忘怀——朋友、室友以及在南昌的所有回忆。&lt;/p&gt;&lt;p&gt;扔出去的学士帽，又会落在哪里？&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/3.B_Afoi0c_ZouX1L.webp&quot; srcset=&quot;/_astro/3.B_Afoi0c_ZJOzAd.webp 640w, /_astro/3.B_Afoi0c_2qFmAp.webp 750w, /_astro/3.B_Afoi0c_Z1t8Lsg.webp 828w, /_astro/3.B_Afoi0c_uhtK6.webp 1080w, /_astro/3.B_Afoi0c_Zqcamo.webp 1280w, /_astro/3.B_Afoi0c_1VtiJs.webp 1668w, /_astro/3.B_Afoi0c_Z2v4aoa.webp 2048w, /_astro/3.B_Afoi0c_1A7nMC.webp 2560w, /_astro/3.B_Afoi0c_ZouX1L.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;04. 远行：西北壮阔&lt;a href=&quot;#04-远行西北壮阔&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;毕业旅行 | &lt;em&gt;Vagabonding&lt;/em&gt;&lt;a href=&quot;#毕业旅行--vagabonding&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在毕业后，也和朋友们去了曾经不敢去的地方。&lt;/p&gt;&lt;p&gt;从青海到甘肃，见到了许多从未见过的风景，拍下来许多珍贵的照片。&lt;/p&gt;&lt;p&gt;虽然一路上有些小插曲，但看着眼前的景色，我不禁想：如果我的人生也能像西北那样壮阔该多好。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/4.VoVli0ei_Kitmi.webp&quot; srcset=&quot;/_astro/4.VoVli0ei_Z1QzYja.webp 640w, /_astro/4.VoVli0ei_1jTWRs.webp 750w, /_astro/4.VoVli0ei_2uhWCI.webp 828w, /_astro/4.VoVli0ei_1E5V9a.webp 1080w, /_astro/4.VoVli0ei_IBh1F.webp 1280w, /_astro/4.VoVli0ei_Z1XTnFp.webp 1668w, /_astro/4.VoVli0ei_Z1lfI06.webp 2048w, /_astro/4.VoVli0ei_Z2kgiCf.webp 2560w, /_astro/4.VoVli0ei_Kitmi.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;05. 转折：新篇章加载中&lt;a href=&quot;#05-转折新篇章加载中&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;顺利上岸 | &lt;em&gt;New Chapter Loading…&lt;/em&gt;&lt;a href=&quot;#顺利上岸--new-chapter-loading&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;考研最终也是上岸了，但感觉心境与刚上大学不一样。&lt;/p&gt;&lt;p&gt;尤其是经历了秋招后，对未来的焦虑压过了上岸的喜悦。&lt;/p&gt;&lt;p&gt;想过上无忧无虑的生活，只能在迷茫和悲观中继续前进吧。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/5.D-n0onTP_Z1b0y1x.webp&quot; srcset=&quot;/_astro/5.D-n0onTP_Zrlgv1.webp 640w, /_astro/5.D-n0onTP_Z2l2s8k.webp 750w, /_astro/5.D-n0onTP_Z1aEsn4.webp 828w, /_astro/5.D-n0onTP_Zhd6eF.webp 1080w, /_astro/5.D-n0onTP_Z1cGKma.webp 1280w, /_astro/5.D-n0onTP_19XHJG.webp 1668w, /_astro/5.D-n0onTP_1MCnq0.webp 2048w, /_astro/5.D-n0onTP_NBMMQ.webp 2560w, /_astro/5.D-n0onTP_Z1b0y1x.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;06. 记录：通过我的镜头&lt;a href=&quot;#06-记录通过我的镜头&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;摄影总结 | &lt;em&gt;Through My Lens&lt;/em&gt;&lt;a href=&quot;#摄影总结--through-my-lens&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我总是觉得这一年没怎么拍照，但打开相册后才发现已经拍了那么多。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;年度快门次数：&lt;/strong&gt;  6952&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我试图用快门抓住流逝的时间。几千张底片里，藏着我过去一整年的回忆。&lt;/p&gt;&lt;p&gt;明年，我还想展开三脚架，换上ND镜，光圈收到f11，开启一段365天的长曝光。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/6.DDlC1dAt_25az7T.webp&quot; srcset=&quot;/_astro/6.DDlC1dAt_Z1tX4sd.webp 640w, /_astro/6.DDlC1dAt_1GwRIp.webp 750w, /_astro/6.DDlC1dAt_Z2dhgkg.webp 828w, /_astro/6.DDlC1dAt_Z26e6Ta.webp 1080w, /_astro/6.DDlC1dAt_23tmMh.webp 1280w, /_astro/6.DDlC1dAt_ZE2hTN.webp 1668w, /_astro/6.DDlC1dAt_Z1nCeu.webp 2048w, /_astro/6.DDlC1dAt_Z10ocQD.webp 2560w, /_astro/6.DDlC1dAt_25az7T.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;07. 耕耘：数字花园&lt;a href=&quot;#07-耕耘数字花园&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;开始写博客 | &lt;em&gt;My Digital Garden&lt;/em&gt;&lt;a href=&quot;#开始写博客--my-digital-garden&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hello World.&lt;/p&gt;&lt;p&gt;从去年考研期间我就有了这个想法，但今年才开始专注这一件事。&lt;/p&gt;&lt;p&gt;买域名、买服务器，我在互联网的原野里，搭建了一片属于自己的森林。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;产出统计：&lt;/strong&gt;  14篇文章，15,105字&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我的博客：&lt;/strong&gt;  &lt;a href=&quot;http://chaxuji.de/&quot; target=&quot;_blank&quot;&gt;chaxuji.de&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/7.ByNkWull_2gaWMs.webp&quot; srcset=&quot;/_astro/7.ByNkWull_2rwYbK.webp 640w, /_astro/7.ByNkWull_xPMyr.webp 750w, /_astro/7.ByNkWull_1IdMjH.webp 828w, /_astro/7.ByNkWull_Z1UdIeB.webp 1080w, /_astro/7.ByNkWull_2etKrP.webp 1280w, /_astro/7.ByNkWull_Zt1Tff.webp 1668w, /_astro/7.ByNkWull_9BKq4.webp 2048w, /_astro/7.ByNkWull_ZOnOc5.webp 2560w, /_astro/7.ByNkWull_2gaWMs.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;08. 治愈：微缩世界&lt;a href=&quot;#08-治愈微缩世界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;我的草缸 | &lt;em&gt;Micro World. Zen Mode.&lt;/em&gt;&lt;a href=&quot;#我的草缸--micro-world-zen-mode&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;读研之后，感觉整个人都没什么活力，于是给自己培养了一个小爱好。&lt;/p&gt;&lt;p&gt;30cm的方寸之间，藏着一个静谧的微缩森林。&lt;/p&gt;&lt;p&gt;看着气泡缓缓上升，鱼群在水草中穿梭，是我在忙碌生活里，提前偷来的“退休时刻”。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/8.BMqDen9k_2fPAtj.webp&quot; srcset=&quot;/_astro/8.BMqDen9k_27vxjI.webp 640w, /_astro/8.BMqDen9k_dOlGp.webp 750w, /_astro/8.BMqDen9k_1oclrF.webp 828w, /_astro/8.BMqDen9k_Z1Uy5xK.webp 1080w, /_astro/8.BMqDen9k_2e9o8G.webp 1280w, /_astro/8.BMqDen9k_Ztmgyo.webp 1668w, /_astro/8.BMqDen9k_9ho6U.webp 2048w, /_astro/8.BMqDen9k_ZOIbve.webp 2560w, /_astro/8.BMqDen9k_2fPAtj.webp 5000w&quot; /&gt;---&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;09. 展望：2026&lt;a href=&quot;#09-展望2026&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Please be good to me.&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[ 读书 ]&lt;/strong&gt;  既读文献，也想看些杂书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ 记录 ]&lt;/strong&gt;  多写些博客，多按快门。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ 生活 ]&lt;/strong&gt;  早睡早起，好好生活。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ 热爱 ]&lt;/strong&gt;  无论多忙，都要留时间给草缸和发呆。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“Everything has cracks, because that’s where the light comes in.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;HELLO 2026&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;6686&quot; src=&quot;/_astro/9.BUoxGDN__Z23C1lz.webp&quot; srcset=&quot;/_astro/9.BUoxGDN__Z1W8i0T.webp 640w, /_astro/9.BUoxGDN__1emEaI.webp 750w, /_astro/9.BUoxGDN__2oJDUY.webp 828w, /_astro/9.BUoxGDN__Z19OyyH.webp 1080w, /_astro/9.BUoxGDN__Z25jdGc.webp 1280w, /_astro/9.BUoxGDN__hmfpE.webp 1668w, /_astro/9.BUoxGDN__U0U5X.webp 2048w, /_astro/9.BUoxGDN__Z3YEwb.webp 2560w, /_astro/9.BUoxGDN__Z23C1lz.webp 5000w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「我的项目」基于Cloudflare的自托管起始页</title><link>https://www.chaxuji.de/posts/startnest-cloudflare-start-page/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/startnest-cloudflare-start-page/</guid><description>StartNest 是我做的一款自托管私人起始页和书签工作台，基于 Cloudflare Workers、Workers Assets 和 D1 部署，用来整理常用链接、分组、外观偏好与 Web 面板。</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我一直觉得，浏览器起始页是一类很容易被忽略的小工具。&lt;/p&gt;
&lt;p&gt;每天打开浏览器，第一眼看到的通常就是它。可很多默认起始页要么信息太杂，要么可控性太弱；一些第三方导航页虽然好看，但数据放在哪里、配置能不能备份、能不能按照自己的习惯慢慢调整，这些问题又总会让我有一点不踏实。&lt;/p&gt;
&lt;p&gt;我需要的其实不复杂：它应该足够轻，打开很快；也应该足够私人，能保存我自己的常用链接和偏好；最好还能部署在一个不用长期维护服务器的地方，稳定、便宜、迁移方便。&lt;/p&gt;
&lt;p&gt;于是就有了 &lt;a href=&quot;https://github.com/Liebesfreud/StartNest&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;StartNest&lt;/strong&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;它是一个 &lt;strong&gt;基于 Cloudflare 的自托管私人起始页和书签工作台&lt;/strong&gt;，用来管理常用链接、分组、界面偏好和 Web 面板。它不是那种很重的团队知识库，也不是公共导航站，更像是一个只为自己服务的浏览器入口。&lt;/p&gt;
&lt;a href=&quot;https://github.com/Liebesfreud/StartNest&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Liebesfreud&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;StartNest&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;
&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;1.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 为什么会做 StartNest&lt;a href=&quot;#1-为什么会做-startnest&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在做这个项目之前，我试过不少浏览器起始页和书签管理工具。有的页面做得很漂亮，但自定义空间有限；有的功能很完整，却又显得太重，打开之后像进入一个管理后台，而不是一个日常入口。&lt;/p&gt;&lt;p&gt;我想要的起始页，大概有几个很明确的要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;常用链接要清楚&lt;/strong&gt;：不是简单堆在一起，而是能按照用途分组；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编辑要顺手&lt;/strong&gt;：添加、修改、排序这些操作不能太绕；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外观要可调&lt;/strong&gt;：主题、壁纸、卡片密度这些细节会影响每天打开它时的感受；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据要可控&lt;/strong&gt;：最好能自己部署，能导出导入，不被某个平台绑定；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维护成本要低&lt;/strong&gt;：我不想为了一个起始页长期养一台服务器。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;所以 StartNest 从一开始就没有打算做成一个“大而全”的导航平台。它更接近一个个人工作台：把链接、搜索、天气、面板和外观配置都放在同一个地方，但尽量保持界面的克制和使用流程的直接。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. StartNest 现在能做什么&lt;a href=&quot;#2-startnest-现在能做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果用一句话概括 StartNest，它就是一个可以自己部署、自己掌控数据的私人导航页。&lt;/p&gt;&lt;p&gt;但真正用起来之后，它不只是“放几个链接”这么简单。下面这些模块，是我目前比较满意的部分。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;2.1 首页：时间、天气、搜索和链接入口&lt;a href=&quot;#21-首页时间天气搜索和链接入口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;StartNest 的首页保留了比较明确的起始页结构：顶部是时间、日期和天气信息，中间是搜索框，下面则是按分组整理的链接卡片。&lt;/p&gt;&lt;p&gt;搜索框支持在站内链接中检索，也可以直接跳转到搜索引擎。目前可以在 &lt;strong&gt;Bing&lt;/strong&gt; 和 &lt;strong&gt;Google&lt;/strong&gt; 之间切换。对我来说，这种设计比较符合起始页的使用习惯：如果要去一个常用网站，就点卡片；如果临时想查东西，直接输入关键词就好。&lt;/p&gt;&lt;p&gt;天气组件是可选的。开启自动定位后，它会根据浏览器定位显示当前天气；如果不想让起始页获取位置，也可以直接关闭。这里没有做得特别复杂，只是放一个足够轻量的信息提示。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;2.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 分组和链接：真正按照自己的习惯整理入口&lt;a href=&quot;#22-分组和链接真正按照自己的习惯整理入口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;链接管理是 StartNest 最基础、也是最重要的部分。&lt;/p&gt;&lt;p&gt;现在它支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;创建、编辑和删除分组&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为分组设置图标&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在分组下添加常用链接&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编辑链接标题、地址和描述&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调整分组和链接顺序&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过编辑模式拖动链接排序&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我把编辑能力单独放在“编辑模式”里，是为了让日常使用时页面尽量干净。平时它就是一个普通起始页，点击卡片直接打开网站；需要整理时，再进入编辑模式，页面才会显示添加、编辑、删除和排序相关操作。&lt;/p&gt;&lt;p&gt;链接卡片也做了一些细节配置。比如卡片可以选择 &lt;strong&gt;1x1&lt;/strong&gt; 或 &lt;strong&gt;1x3&lt;/strong&gt; 两种尺寸：前者适合只显示图标的入口，后者适合带标题和描述的常用服务。图标也不只依赖网站 favicon，还可以使用内置图标、图片 URL，或者纯文字缩写。&lt;/p&gt;&lt;p&gt;这些配置单独看都不大，但放在一起会让导航页更贴近自己的使用习惯。因为每个人常用的网站不一样，每个链接的重要程度也不一样，起始页不应该只有一种固定排版。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;3.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 Web 面板：把常用网页变成侧边工作区&lt;a href=&quot;#23-web-面板把常用网页变成侧边工作区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;StartNest 里还有一个我自己很喜欢的功能：&lt;strong&gt;Web 面板&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;有些网页我并不一定想作为普通链接打开，比如一些监控面板、在线工具、轻量文档、内部服务入口。它们更适合像一个侧边工作区一样，随时打开、随时切换。&lt;/p&gt;&lt;p&gt;所以 StartNest 支持在设置里添加 Web 面板，并为每个面板配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;标题；&lt;/li&gt;
&lt;li&gt;URL；&lt;/li&gt;
&lt;li&gt;图标；&lt;/li&gt;
&lt;li&gt;描述；&lt;/li&gt;
&lt;li&gt;打开方式；&lt;/li&gt;
&lt;li&gt;是否启用；&lt;/li&gt;
&lt;li&gt;显示顺序。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果目标网站允许被 iframe 嵌入，就可以直接以内嵌面板的形式打开；如果不允许，也可以配置成新标签页打开。这个功能没有试图绕过网站自己的安全策略，只是给那些适合嵌入的工具一个更顺手的位置。&lt;/p&gt;&lt;p&gt;对我来说，Web 面板让 StartNest 不只是一个“去往别处的链接列表”，它也可以承载一点轻量工作的状态。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;4.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.4 外观设置：起始页应该看着舒服&lt;a href=&quot;#24-外观设置起始页应该看着舒服&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;起始页是一个每天都会见到的页面，所以外观设置不是可有可无的小功能。&lt;/p&gt;&lt;p&gt;StartNest 目前支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浅色、深色、跟随系统&lt;/strong&gt; 三种主题模式；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;舒适 / 紧凑&lt;/strong&gt; 两种卡片密度；&lt;/li&gt;
&lt;li&gt;是否显示分组图标；&lt;/li&gt;
&lt;li&gt;自定义全局壁纸；&lt;/li&gt;
&lt;li&gt;调整壁纸遮罩强度；&lt;/li&gt;
&lt;li&gt;调整背景模糊程度。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我没有把外观系统做得特别花。比起提供很多复杂主题，我更希望它能覆盖几类最常见的偏好：有人喜欢干净的纯色界面，有人喜欢放一张背景图；有人希望卡片更宽松，有人希望一屏里放下更多入口。&lt;/p&gt;&lt;p&gt;这些设置都放在同一个设置页里，修改之后会直接生效。对于一个个人起始页来说，这种“调一下就能看到结果”的体验会舒服很多。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;5.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.5 数据管理：导出、导入和自己掌控&lt;a href=&quot;#25-数据管理导出导入和自己掌控&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;StartNest 是一个自托管项目，所以数据管理不能只停留在“存在数据库里”。&lt;/p&gt;&lt;p&gt;现在它支持通过 JSON 导出和导入配置，包括分组、链接、设置和 Web 面板。这样即使以后换部署环境，或者想把当前配置备份一份，也不需要去数据库里手动折腾。&lt;/p&gt;&lt;p&gt;这件事看起来不复杂，但我觉得很重要。很多个人工具真正能不能长期使用，往往不取决于第一天看起来多漂亮，而取决于它有没有给用户留下迁移和备份的余地。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;6.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 为什么选择 Cloudflare&lt;a href=&quot;#3-为什么选择-cloudflare&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;StartNest 的部署目标是 &lt;strong&gt;Cloudflare Workers + Workers Assets + D1&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;这套组合很适合这种小型私人 Web 工具：前端静态资源由 Workers Assets 托管，后端 API 跑在 Cloudflare Worker 上，数据存在 D1 数据库里。整个项目不需要单独准备服务器，也不需要维护传统意义上的后端运行环境。&lt;/p&gt;&lt;p&gt;我选择 Cloudflare 的原因也比较直接：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署成本低&lt;/strong&gt;：个人使用场景下，免费额度通常已经足够；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维护负担小&lt;/strong&gt;：不用自己管理 VPS、进程、反向代理和数据库服务；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全球访问还不错&lt;/strong&gt;：Cloudflare 的边缘网络本身就适合这种轻量应用；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前后端可以放在同一个 Worker 项目里&lt;/strong&gt;：登录、API、静态资源和数据库访问都比较集中；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D1 足够应付这种数据量&lt;/strong&gt;：链接、分组、设置、面板这些结构并不复杂。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当然，这也意味着它不是一个纯静态站点。StartNest 需要 Worker 后端处理登录、API、D1 数据库访问和前端资源托管，所以部署时不能只按照 Cloudflare Pages 的普通静态站点方式来理解。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;7.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 技术上，它是怎么组成的&lt;a href=&quot;#4-技术上它是怎么组成的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你也对实现方式感兴趣，StartNest 目前主要用到这些技术：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React 19&lt;/strong&gt; 作为前端 UI 框架；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt; 负责前端开发和构建；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; 作为主要语言；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; 负责界面样式；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React Router&lt;/strong&gt; 处理页面路由；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TanStack Query&lt;/strong&gt; 管理前端请求和缓存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zod&lt;/strong&gt; 做数据结构校验；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 承载后端 API；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare D1&lt;/strong&gt; 保存分组、链接、设置、用户资料和面板数据；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wrangler&lt;/strong&gt; 负责本地开发、迁移和部署。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;项目结构也比较清楚：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/          前端应用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;worker/       Cloudflare Worker 后端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;migrations/   D1 数据库迁移 SQL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public/       静态资源与 service worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;后端接口主要围绕几个核心资源展开：分组、链接、排序、设置、导入导出、用户信息、Web 面板和天气数据。前端启动时会通过 &lt;code&gt;/api/bootstrap&lt;/code&gt; 拉取基础数据，并在本地做缓存和状态更新。&lt;/p&gt;&lt;p&gt;登录方面，StartNest 使用管理员账号和密码进行访问控制，并通过 &lt;code&gt;SESSION_SECRET&lt;/code&gt; 签名 session。它不是一个多用户平台，目标很明确：保护自己的私人起始页，不让它变成公开可编辑的导航站。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 部署和使用上的一些提醒&lt;a href=&quot;#5-部署和使用上的一些提醒&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;StartNest 已经准备了 Cloudflare 部署相关配置，但部署前仍然需要自己准备 D1 数据库和必要的环境变量。&lt;/p&gt;&lt;p&gt;核心步骤大致是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;创建 Cloudflare D1 数据库；&lt;/li&gt;
&lt;li&gt;按顺序执行 &lt;code&gt;migrations/&lt;/code&gt; 里的 SQL 迁移；&lt;/li&gt;
&lt;li&gt;在 Worker 项目中绑定 D1，binding 名称保持为 &lt;code&gt;DB&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;配置 &lt;code&gt;ADMIN_USERNAME&lt;/code&gt;、&lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;、&lt;code&gt;SESSION_SECRET&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;npm run build&lt;/code&gt; 构建前端；&lt;/li&gt;
&lt;li&gt;通过 Wrangler 或 Cloudflare 控制台部署 Worker。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这里最容易出问题的地方通常有两个：一个是 D1 binding 名称没有保持为 &lt;code&gt;DB&lt;/code&gt;，另一个是没有配置完整的 Secrets。只要这两块处理好，后续使用基本就是普通 Web 应用的体验。&lt;/p&gt;&lt;p&gt;首次访问时会进入登录页，登录之后就可以开始创建分组、添加链接、设置外观和管理 Web 面板了。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;项目截图占位：当前仓库未包含该文原始截图文件，后续补回 &lt;code&gt;8.webp&lt;/code&gt; 后可恢复。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 现在的状态与后续想法&lt;a href=&quot;#6-现在的状态与后续想法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;StartNest 目前还是一个比较年轻的项目，但核心功能已经能支撑日常使用了。&lt;/p&gt;&lt;p&gt;我之后可能还会继续打磨这些方向：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;优化移动端和小屏设备上的编辑体验；&lt;/li&gt;
&lt;li&gt;给链接和面板增加更多整理方式；&lt;/li&gt;
&lt;li&gt;让图标选择和壁纸配置更直观；&lt;/li&gt;
&lt;li&gt;继续减少部署过程中的理解成本；&lt;/li&gt;
&lt;li&gt;补充更多导入、备份和迁移相关的细节。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我对 StartNest 的期待并不是做成一个很大的产品。它更适合保持在一个私人工具的尺度里：功能够用，界面干净，数据可控，部署之后不需要经常操心。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7. 如果你也想试试看&lt;a href=&quot;#7-如果你也想试试看&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;项目已经开源在 GitHub 上：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub：&lt;/strong&gt;&lt;a href=&quot;https://github.com/Liebesfreud/StartNest&quot; target=&quot;_blank&quot;&gt;https://github.com/Liebesfreud/StartNest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你也想要一个基于 Cloudflare 的自托管起始页，希望把常用链接、搜索、天气、Web 面板和外观偏好都放在自己掌控的环境里，StartNest 应该会是一个值得试试的小工具。&lt;/p&gt;&lt;p&gt;它没有试图替代浏览器，也没有想成为一个复杂的书签系统。它只是把每天打开浏览器时最常见的那些入口，整理成一个更适合自己的页面。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从 Windows 换成 Linux ？Fedora 44 体验与排障</title><link>https://www.chaxuji.de/posts/fedora44-linux-desktop-experience/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/fedora44-linux-desktop-experience/</guid><description>记录一次从 Windows 11 LTSC 切换到 Fedora 44 的桌面体验，包括发行版选择、Niri + DMS 桌面配置、NVIDIA Quadro P520 驱动排障，以及 Fcitx5 在 Edge 与 Wayland 环境下的输入法修复。</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;其实我使用 Linux 已经一年多了，不过之前主要是在 VPS 里用，常见的环境也就是 Debian 和 Alpine。桌面版 Linux 虽然在虚拟机里体验过几次，却从来没有真正作为主力系统长期使用。&lt;/p&gt;
&lt;p&gt;这次决定把笔记本从 Windows 11 LTSC 换成 Linux，起因有点朴素：我发现 Codex 对 PowerShell 的命令并不算适配，而 PowerShell 本身又偏复杂，我也不太愿意继续迁就它。&lt;/p&gt;
&lt;p&gt;刚好手上这台 ThinkPad P14 Gen 1 平时主要用来 Vibe Coding、看文献，没有游戏或大型软件的需求。虽然我给它加装了 16GB 内存，但低压十代 i7 加上状态不太健康的电池，让它在 Windows 11 下的日常体验并不理想。台式机可以承担更重的任务，所以这台笔记本只需要一个轻快、稳定、适合写作和开发的系统。&lt;/p&gt;
&lt;p&gt;一开始我也考虑过黑苹果，但 16GB 左右的镜像体积让我觉得过于臃肿。再加上如今 macOS 已经全面转向 ARM，x86 设备安装新版本 macOS 的体验只会越来越边缘化。想清楚这些之后，我最终决定直接安装 Linux，而且不再保留双系统。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选择 Fedora&lt;a href=&quot;#为什么选择-fedora&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;接下来的问题就是选择发行版。Ubuntu 对我来说有些无趣，也略显臃肿；Debian 更像是适合 VPS 的系统，作为桌面主力总觉得少了点新鲜感；Arch 的社区和文档非常好，我之前也在虚拟机里体验过，但这台笔记本毕竟要承担日常使用，我还是更希望它稳定一些。&lt;/p&gt;&lt;p&gt;选来选去，最后落在了 Fedora 上。&lt;/p&gt;&lt;p&gt;Fedora 桌面版同时提供 GNOME 和 KDE 两种主流体验。我选择的是 GNOME 版本，安装流程整体很顺畅：下载镜像、制作启动盘、进入安装器、处理分区，然后等待安装完成。相比 Debian 和 Arch，Fedora 的安装体验确实轻松很多，真正需要留意的主要是分区。&lt;/p&gt;&lt;p&gt;因为我已经决定完全替换 Windows，所以安装时直接删除原来的 C 盘，让它变成未分配空间；同时也把 Windows 恢复分区一并清理掉，避免留下无用分区。只要确认数据已经备份，这一步其实并不复杂。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;从 GNOME 到 Niri + DMS&lt;a href=&quot;#从-gnome-到-niri--dms&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安装完成后，我使用 GNOME 体验了一段时间。它确实简洁、美观，也很现代，但对我来说稍微有些“简陋”。一些交互逻辑和我目前的使用习惯有出入，需要适应；而 KDE 虽然功能丰富，却又显得复杂，需要投入不少时间去美化和调整。&lt;/p&gt;&lt;p&gt;于是我把目光转向了 Niri + DMS，并了解到了 &lt;a href=&quot;https://danklinux.com&quot; target=&quot;_blank&quot;&gt;Dank Linux&lt;/a&gt; 这个项目。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Dank Linux&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Dank Linux 是一套基于 Wayland 的桌面 shell 套件，目标是替代 GNOME Shell / KDE Plasma，提供一个现代、好看且高度可定制的桌面体验。它基于 &lt;a href=&quot;https://quickshell.outfoxxed.me/&quot; target=&quot;_blank&quot;&gt;Quickshell&lt;/a&gt; 和 Go 构建，很适合觉得 GNOME 太简、KDE 太重的用户。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;安装方式也很直接：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://danklinux.com/install&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这个一键脚本会自动检测发行版、安装依赖并配置 DMS。安装完成后，再简单调整一下壁纸、面板和主题，就可以得到一个相当漂亮的桌面环境。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/1.CvhEc-9U_ZayWcj.webp&quot; srcset=&quot;/_astro/1.CvhEc-9U_Z1Y0OBX.webp 640w, /_astro/1.CvhEc-9U_ZQ9OqX.webp 750w, /_astro/1.CvhEc-9U_Z1BjJGI.webp 828w, /_astro/1.CvhEc-9U_Z1B3meC.webp 1080w, /_astro/1.CvhEc-9U_2v3ifH.webp 1280w, /_astro/1.CvhEc-9U_ZxBUqf.webp 1668w, /_astro/1.CvhEc-9U_ZayWcj.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;NVIDIA 驱动排障&lt;a href=&quot;#nvidia-驱动排障&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;桌面环境折腾完之后，就该处理真正影响体验的问题了：NVIDIA 驱动。&lt;/p&gt;&lt;p&gt;这台笔记本的独显是 NVIDIA Quadro P520。最开始我一直装错驱动版本，导致内核提示 NVIDIA 模块丢失。后来在 Codex 的帮助下才确认：Quadro P520 / GP108 并不适合使用 NVIDIA 595 open kernel module。之前的核心报错大意是：&lt;code&gt;not supported by open nvidia.ko&lt;/code&gt;，以及缺少 GPU System Processor（GSP）支持。&lt;/p&gt;&lt;p&gt;正确方案是安装 RPM Fusion 提供的 580xx proprietary 驱动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装驱动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;akmod-nvidia-580xx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xorg-x11-drv-nvidia-580xx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xorg-x11-drv-nvidia-580xx-libs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xorg-x11-drv-nvidia-580xx-power&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xorg-x11-drv-nvidia-580xx-cuda-libs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--allowerasing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nvidia-settings-580xx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 禁用 nouveau&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;grubby&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--update-kernel=ALL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--args=&lt;/span&gt;&lt;span&gt;&apos;rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouveau,nova_core nvidia-drm.modeset=1&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重建并重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;akmods&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dracut&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;modinfo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nvidia&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-E&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;filename|version|license&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvidia-smi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lspci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-nnk&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-A4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-Ei&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;nvidia|3d&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Fcitx5 与 Edge 的输入法问题&lt;a href=&quot;#fcitx5-与-edge-的输入法问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;驱动处理完之后，我又遇到了另一个很影响日常使用的问题：Fcitx5 在 Edge 中时好时坏，候选框有时不出现，有时位置异常。&lt;/p&gt;&lt;p&gt;这个问题大概率和 Flatpak 沙箱、Wayland 输入法支持、Edge 启动参数以及 niri 的环境变量有关。尤其要注意 &lt;code&gt;--ozone-platform-hint=auto&lt;/code&gt;，它可能导致 Wayland / XWayland 之间的行为不稳定；另外也不要让 niri 把输入法变量覆盖成类似 &lt;code&gt;GTK_IM_MODULE null&lt;/code&gt; 的状态。&lt;/p&gt;&lt;p&gt;我的处理思路是先统一环境变量。系统级配置可以写在 &lt;code&gt;~/.config/environment.d/80-fcitx5.conf&lt;/code&gt;，niri 则需要检查 &lt;code&gt;~/.config/niri/config.kdl&lt;/code&gt; 里的 &lt;code&gt;environment&lt;/code&gt; 块：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;GTK_IM_MODULE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fcitx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;QT_IM_MODULE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fcitx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;XMODIFIERS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@im=fcitx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;INPUT_METHOD&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fcitx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SDL_IM_MODULE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fcitx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;GLFW_IM_MODULE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ibus&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果 Edge 是通过 Flatpak 安装的，还需要给它放行 Fcitx5 的 DBus，并注入对应环境变量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;flatpak&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;override&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--talk-name=org.fcitx.Fcitx5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=GTK_IM_MODULE=fcitx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=QT_IM_MODULE=fcitx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=XMODIFIERS=@im=fcitx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=INPUT_METHOD=fcitx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=SDL_IM_MODULE=fcitx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--env=GLFW_IM_MODULE=ibus&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;com.microsoft.Edge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;最后，在 &lt;code&gt;~/.var/app/com.microsoft.Edge/config/edge-flags.conf&lt;/code&gt; 中强制 Edge 使用 Wayland，并开启 Wayland IME：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--enable-wayland-ime&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ozone-platform=wayland&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这里不要使用 &lt;code&gt;--ozone-platform-hint=auto&lt;/code&gt;。改完之后重新登录桌面，输入法候选框的稳定性会好很多。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;总体来说，把这台 ThinkPad 从 Windows 换到 Fedora 之后，我的感受是：它并没有立刻变成一台“完美电脑”，但确实更接近我现在想要的使用方式了。&lt;/p&gt;&lt;p&gt;Fedora 提供了足够新的软件栈和相对稳定的底座，Niri + DMS 则补上了 GNOME 和 KDE 都没能完全满足我的桌面体验。真正麻烦的地方主要集中在 NVIDIA 驱动和 Wayland 输入法兼容性上，不过在解决掉这些问题后，日常写作、开发、阅读文献都已经足够顺手。&lt;/p&gt;&lt;p&gt;如果手上的设备本来就不是游戏主力，也没有特别依赖 Windows 专属软件，那么把它换成 Linux 并不是一件多么激进的事。至少对这台笔记本来说，Fedora 让它重新变得轻快、安静，也更适合我现在的工作流。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「Gogs」自建 Git 服务，与 GitHub 同步推送</title><link>https://www.chaxuji.de/posts/gogs-self-hosted-git-sync-github/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/gogs-self-hosted-git-sync-github/</guid><description>用 Docker 快速部署轻量级自托管 Git 服务 Gogs，并配置仓库同时推送到 Gogs 与 GitHub，兼顾私有存储与对外同步。</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你和我一样，平时会写一些小工具、学习笔记，甚至还会顺手把带密码的配置文件塞进仓库里，那你大概率也会有一个念头：&lt;strong&gt;并不是所有东西都想直接放到 GitHub 上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我之前也用过 Gitea。它确实成熟、完整，界面和 GitHub 也很接近，但对我这种只是想随手托管几个小项目的人来说，多少还是显得有点重了。尤其是我并不需要 CI/CD、组织协作之类的功能，只想要一个轻量、稳定、占用低的 Git 服务。&lt;/p&gt;
&lt;p&gt;于是我把目光转向了 &lt;strong&gt;Gogs&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它给我的第一感觉很直接：&lt;strong&gt;足够轻，足够简单，也足够适合个人使用。&lt;/strong&gt; 更重要的是，配合 Git 本身的多推送地址能力，我们还可以做到：&lt;strong&gt;代码平时先推到自己的 Gogs，需要公开同步时再一起推送到 GitHub。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 为什么我会选择 Gogs&lt;a href=&quot;#1-为什么我会选择-gogs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;对于一台 1C1G 的小机器来说，Gogs 的负担几乎可以忽略。界面和 GitHub 也比较接近，基本不用重新适应；而它又没有那么多我平时根本用不上的附加功能。&lt;/p&gt;&lt;p&gt;对我来说，Gogs 最合适的使用场景就是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;托管日常写的小项目&lt;/li&gt;
&lt;li&gt;存放不想直接公开的代码和笔记&lt;/li&gt;
&lt;li&gt;作为自己的私人 Git 中转站&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你和我一样，更看重“能用、够轻、维护省心”，那 Gogs 的确很适合作为个人自建 Git 服务的选择。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 用 Docker 部署 Gogs&lt;a href=&quot;#2-用-docker-部署-gogs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Gogs 的部署非常简单，用 Docker Compose 基本十几分钟就能搞定。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;2.1 创建目录&lt;a href=&quot;#21-创建目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先准备一个工作目录：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/docker-projects/gogs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/docker-projects/gogs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 编写 docker-compose.yml&lt;a href=&quot;#22-编写-docker-composeyml&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在当前目录新建 &lt;code&gt;docker-compose.yml&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;gogs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gogs/gogs:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gogs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;127.0.0.1:10880:3000&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;10022:22&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;./data:/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;RUN_CROND=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;BACKUP_INTERVAL=24h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;BACKUP_RETENTION=7d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 启动服务&lt;a href=&quot;#23-启动服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;然后执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;启动完成后，在浏览器中打开 Gogs 的安装页面，按照向导完成初始化即可。Gogs 支持多种数据库，如果只是个人使用，按默认方式一路配置下去就够了。&lt;/p&gt;&lt;p&gt;首次注册的账号默认就是管理员账号，后面创建仓库、配置 SSH Key 等操作都可以在后台直接完成。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 让 Git 克隆和推送更顺手&lt;a href=&quot;#3-让-git-克隆和推送更顺手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你把 SSH 服务映射到了非默认端口，比如上面示例里的 &lt;code&gt;10022&lt;/code&gt;，那么仓库地址通常会变成这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh://git@你的域名:10022/用户名/仓库.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这个地址当然能用，但每次手敲都比较麻烦。&lt;/p&gt;&lt;p&gt;所以我更推荐在本地 &lt;code&gt;~/.ssh/config&lt;/code&gt; 里加一个别名：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mygit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; 你的域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10022&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这样以后克隆仓库时，就可以直接写成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mygit:用户名/仓库.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;日常 push、pull 也都会顺手很多，用起来和 GitHub 基本没什么区别。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 优先用 GitHub 镜像到 Gogs 做备份&lt;a href=&quot;#4-优先用-github-镜像到-gogs-做备份&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这部分其实才是更适合长期使用的方案。&lt;/p&gt;&lt;p&gt;因为 Gogs 本身支持创建&lt;strong&gt;镜像仓库&lt;/strong&gt;，可以直接把 GitHub 仓库镜像到 Gogs。这样 GitHub 继续作为主仓库使用，Gogs 则承担自托管备份的角色，本地仓库也只需要维护 GitHub 这一套主要 remote。&lt;/p&gt;&lt;p&gt;有些仓库我希望：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平时继续以 GitHub 作为主仓库&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在自己的服务器上保留一份自托管备份&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保持同一套本地仓库，不想额外维护双 push 配置&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果是这种需求，我更推荐直接用 &lt;strong&gt;GitHub → Gogs 的镜像仓库&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1161&quot; src=&quot;/_astro/1.5c7I6wCL_Z2s4DV.webp&quot; srcset=&quot;/_astro/1.5c7I6wCL_Z27O8pP.webp 640w, /_astro/1.5c7I6wCL_1drNn2.webp 750w, /_astro/1.5c7I6wCL_Zo0am2.webp 828w, /_astro/1.5c7I6wCL_ZhksKs.webp 1080w, /_astro/1.5c7I6wCL_zd0Rg.webp 1280w, /_astro/1.5c7I6wCL_Z2s4DV.webp 1500w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1131&quot; height=&quot;651&quot; src=&quot;/_astro/2.Bo7PVUrZ_2uXbUE.webp&quot; srcset=&quot;/_astro/2.Bo7PVUrZ_Z2oAvM4.webp 640w, /_astro/2.Bo7PVUrZ_24pl6D.webp 750w, /_astro/2.Bo7PVUrZ_1s7SEw.webp 828w, /_astro/2.Bo7PVUrZ_Z1tLHeH.webp 1080w, /_astro/2.Bo7PVUrZ_2uXbUE.webp 1131w&quot; /&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;4.1 双 push 作为备选项&lt;a href=&quot;#41-双-push-作为备选项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你希望在每次本地推送时，同时把代码发到 GitHub 和 Gogs，那么也可以给同一个 &lt;code&gt;origin&lt;/code&gt; 配置多个 &lt;code&gt;pushurl&lt;/code&gt;，把双 push 作为备选方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 假设你有两个远程地址&lt;a href=&quot;#42-假设你有两个远程地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;GitHub 仓库地址：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git@github.com:你的用户名/项目名.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Gogs 仓库地址：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git@你的Gogs域名:用户名/项目名.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 先清理旧的 pushurl&lt;a href=&quot;#43-先清理旧的-pushurl&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果之前已经改过推送地址，建议先清空，避免配置混乱：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--unset-all&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote.origin.pushurl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4 添加两个推送地址&lt;a href=&quot;#44-添加两个推送地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;然后分别添加 GitHub 和 Gogs：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set-url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git@github.com:你的用户名/项目名.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set-url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git@你的Gogs域名:用户名/项目名.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5 检查配置是否生效&lt;a href=&quot;#45-检查配置是否生效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;你应该能看到类似下面这样的结果：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;origin  git@github.com:你的用户名/项目名.git (fetch)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;origin  git@github.com:你的用户名/项目名.git (push)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;origin  git@你的Gogs域名:用户名/项目名.git (push)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这里的意思是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt; 仍然从 GitHub 拉取&lt;/li&gt;
&lt;li&gt;&lt;code&gt;push&lt;/code&gt; 时会同时推送到 GitHub 和 Gogs&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当然，如果你更希望默认从 Gogs 拉取，也可以反过来设置 fetch 地址。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.6 之后怎么推送&lt;a href=&quot;#46-之后怎么推送&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置完成后，日常直接执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;或者指定当前分支：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;都可以同时推送到两个远程地址。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 这套方案适合什么人&lt;a href=&quot;#5-这套方案适合什么人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你需要的是完整的团队协作、权限体系、CI/CD 流程，甚至还要接各种插件和企业功能，那 Gitea 或 GitLab 显然更适合。&lt;/p&gt;&lt;p&gt;但如果你和我一样：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;只想托管自己的项目&lt;/li&gt;
&lt;li&gt;希望资源占用尽量低&lt;/li&gt;
&lt;li&gt;有些内容不想直接公开&lt;/li&gt;
&lt;li&gt;又想保留同步到 GitHub 的能力&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;那 &lt;strong&gt;GitHub + Gogs 镜像备份&lt;/strong&gt; 这套组合会更省心。&lt;/p&gt;&lt;p&gt;它不花哨，也没有太多复杂概念，但正因为足够简单，反而特别适合个人开发者长期使用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这次从 Gitea 换到 Gogs，并不是因为 Gitea 不好，而是因为我想要的东西其实很明确：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;一个更轻量的自托管 Git 服务，以及一套能兼顾私有存储和公开同步的工作流。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Gogs 刚好满足了这一点。&lt;/p&gt;&lt;p&gt;部署快、占用低、上手简单，再加上 Gogs 自带的镜像仓库能力，用来给 GitHub 做一份自托管备份也很合适。即使你不想用镜像仓库，Git 自带的多推送配置也能作为备选。对于 VPS 资源有限、又想把代码掌握在自己手里的用户来说，这确实是一种很舒服的方案。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「Hermes Agent」龙虾的完美代替品？</title><link>https://www.chaxuji.de/posts/hermes-agent/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/hermes-agent/</guid><description>Hermes Agent 的安装、初始化与多配置文件实战体验，适合作为 OpenClaw 替代路线的入门参考。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;相信你已经非常了解 &lt;strong&gt;OpenClaw&lt;/strong&gt; ，也就是“龙虾”个项目。出圈的爆火让这类 AI Agent 助手项目进入到了大众视野，&lt;strong&gt;OpenClaw&lt;/strong&gt; 聊天渠道多、控制面板完整、节点能力也很丰富，但我认为这个项目还远远不够成熟，小 Bug 不少。所以在简单体验了一段时间的 &lt;strong&gt;OpenClaw&lt;/strong&gt; 后，它就在我的服务器上吃灰了，也许是云端部署限制了它的能力，但目前我认为它能做的事，Codex、ClaudeCode 也能做，甚至能做的更好。&lt;/p&gt;&lt;p&gt;但如果你真正想要的是一个“能长期记住你、会自己总结经验、还能持续替你干活”的常驻代理，那么 &lt;strong&gt;Hermes Agent 现在已经不只是一个替代品，而是更像 OpenClaw 这条路线的下一步。&lt;/strong&gt; 截至 2026 年 4 月，Hermes 官方已经明确提供了从 OpenClaw 自动迁移 settings、memories、skills 和 API keys 的能力，这样我们无缝切换至 &lt;strong&gt;Hermes Agent&lt;/strong&gt; 变得方便不少。(&lt;a href=&quot;https://docs.openclaw.ai/?utm_source=chatgpt.com&quot; target=&quot;_blank&quot;&gt;OpenClaw&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;说得再直白一点：如果你要的是一个常驻在线、能通过聊天工具对话、还能自己记住工作方式并长期复用的 agent，Hermes 已经足够替代 OpenClaw；不过，如果你特别依赖 OpenClaw 的生态以及外围能力，那就别急迁移，再等一等吧，或许还有更好的 Agent 项目出现。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;1. 部署 Hermes Agent&lt;a href=&quot;#1-部署-hermes-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 1 前期准备&lt;a href=&quot;#1-1-前期准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;一台服务器，以2c2g 的 Debian 13 服务器为例&lt;/li&gt;
&lt;li&gt;一个 LLM API Key&lt;/li&gt;
&lt;li&gt;一个 Telegram Bot Token&lt;/li&gt;
&lt;li&gt;你自己的 Telegram 数字用户 ID&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Hermes 官方安装文档里写得很直接：Linux 快速安装的唯一前置条件其实是 &lt;strong&gt;Git&lt;/strong&gt;，其它像 uv、Python 3.11、Node.js v22、ripgrep、ffmpeg，安装器都会自动处理。(&lt;a href=&quot;https://hermes-agent.nousresearch.com/docs/getting-started/installation?utm_source=chatgpt.com&quot; target=&quot;_blank&quot;&gt;hermes-agent.nousresearch.com&lt;/a&gt;)&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1. 2 安装 Hermes Agent&lt;a href=&quot;#1-2-安装-hermes-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先确保你的服务器一键安装好了 Git 和 xz 解压程序，不然会报错：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1806&quot; height=&quot;1320&quot; src=&quot;/_astro/1.BHjDR0TB_1erQJD.webp&quot; srcset=&quot;/_astro/1.BHjDR0TB_23EWDn.webp 640w, /_astro/1.BHjDR0TB_yNR9B.webp 750w, /_astro/1.BHjDR0TB_FqobS.webp 828w, /_astro/1.BHjDR0TB_E70ER.webp 1080w, /_astro/1.BHjDR0TB_Ps7z9.webp 1280w, /_astro/1.BHjDR0TB_Z28bfTI.webp 1668w, /_astro/1.BHjDR0TB_1erQJD.webp 1806w&quot; /&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt update &amp;amp;&amp;amp; apt install git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 xz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt install -y xz-utils&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;根据&lt;a href=&quot;https://hermes-agent.nousresearch.com/docs/getting-started/quickstart&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;，可以使用一键脚本进行安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Linux / macOS / WSL2 / Android (Termux)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;156&quot; src=&quot;/_astro/2.CX_T5Q4v_Z1ozz9F.webp&quot; srcset=&quot;/_astro/2.CX_T5Q4v_1SufJz.webp 640w, /_astro/2.CX_T5Q4v_Z28dCcf.webp 750w, /_astro/2.CX_T5Q4v_Z1ozz9F.webp 786w&quot; /&gt;&lt;/p&gt;&lt;p&gt;完成后，重新加载终端：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source ~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 初始化设置&lt;a href=&quot;#13-初始化设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes model # 选择你的 LLM 提供商和模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes tools # 配置启用哪些工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes setup # 或一次性完成所有配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你输入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes setup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;就能看到类似OpenClaw的初始化设置：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;219&quot; src=&quot;/_astro/3.PL39sa8f_1JIv5w.webp&quot; srcset=&quot;/_astro/3.PL39sa8f_MWbjf.webp 640w, /_astro/3.PL39sa8f_1dxJv0.webp 750w, /_astro/3.PL39sa8f_Z2rJkoU.webp 828w, /_astro/3.PL39sa8f_1JIv5w.webp 918w&quot; /&gt;&lt;/p&gt;&lt;p&gt;这时候只要跟着步骤一步步来就可以了，首先是选择AI的提供商：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;1137&quot; src=&quot;/_astro/4.DM0z9Voi_Z11b5Kf.webp&quot; srcset=&quot;/_astro/4.DM0z9Voi_Z2425nU.webp 640w, /_astro/4.DM0z9Voi_ZspC5h.webp 750w, /_astro/4.DM0z9Voi_Z1NBKuS.webp 828w, /_astro/4.DM0z9Voi_Z11b5Kf.webp 1052w&quot; /&gt;&lt;/p&gt;&lt;p&gt;这一步是设置Hermes Agent的消息渠道，我们选择Telegram：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;813&quot; height=&quot;210&quot; src=&quot;/_astro/5.J7CrXR5j_Z1NlWnn.webp&quot; srcset=&quot;/_astro/5.J7CrXR5j_1LrwWx.webp 640w, /_astro/5.J7CrXR5j_Z1Ce5TR.webp 750w, /_astro/5.J7CrXR5j_Z1NlWnn.webp 813w&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;789&quot; src=&quot;/_astro/6.BGt7Fj5A_Z8hPHM.webp&quot; srcset=&quot;/_astro/6.BGt7Fj5A_ZGsiaY.webp 640w, /_astro/6.BGt7Fj5A_Zca5i2.webp 750w, /_astro/6.BGt7Fj5A_Z8hPHM.webp 783w&quot; /&gt;&lt;/p&gt;&lt;p&gt;创建 Telegram Bot&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开 Telegram，搜索并启动 &lt;strong&gt;BotFather&lt;/strong&gt;（它是 Telegram 官方的机器人管理工具）。&lt;/li&gt;
&lt;li&gt;发送 &lt;code&gt;/newbot&lt;/code&gt; 命令，按指示创建一个新的机器人。你将需要提供一个名称和用户名，Telegram 会为你生成一个唯一的 API Token。
&lt;ul&gt;
&lt;li&gt;你将获得一个类似下面的 API Token（记下来）：&lt;br /&gt;
&lt;code&gt;123456789:ABCDEFghijkLMNOPQRstuvwxyz&lt;/code&gt;
获取聊天ID，在Telegram，不少机器人能获取到聊天ID，自行获取，然后将BOT API Token和聊天ID根据指引填入：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;357&quot; src=&quot;/_astro/7.C7grFn88_26cAoJ.webp&quot; srcset=&quot;/_astro/7.C7grFn88_ZgCH2l.webp 640w, /_astro/7.C7grFn88_14Aus3.webp 750w, /_astro/7.C7grFn88_qQS1B.webp 828w, /_astro/7.C7grFn88_26cAoJ.webp 933w&quot; /&gt;&lt;/p&gt;&lt;p&gt;启动网关&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1263&quot; height=&quot;132&quot; src=&quot;/_astro/8.C6DS_7ox_2k2W9b.webp&quot; srcset=&quot;/_astro/8.C6DS_7ox_Z1xRLyr.webp 640w, /_astro/8.C6DS_7ox_ZSQDfT.webp 750w, /_astro/8.C6DS_7ox_ZEkpNv.webp 828w, /_astro/8.C6DS_7ox_Zh6tr5.webp 1080w, /_astro/8.C6DS_7ox_2k2W9b.webp 1263w&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1227&quot; height=&quot;243&quot; src=&quot;/_astro/9.13zfIFsO_1KfH1f.webp&quot; srcset=&quot;/_astro/9.13zfIFsO_8gNV0.webp 640w, /_astro/9.13zfIFsO_m8Us4.webp 750w, /_astro/9.13zfIFsO_ZxQeVd.webp 828w, /_astro/9.13zfIFsO_1OgCjm.webp 1080w, /_astro/9.13zfIFsO_1KfH1f.webp 1227w&quot; /&gt;&lt;/p&gt;&lt;p&gt;这样就完成 Hermes Agent 的安装和初始化了。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;324&quot; src=&quot;/_astro/10.BmBQZJzx_2poRFX.webp&quot; srcset=&quot;/_astro/10.BmBQZJzx_1dCQvL.webp 640w, /_astro/10.BmBQZJzx_1JJiky.webp 750w, /_astro/10.BmBQZJzx_xsyXr.webp 828w, /_astro/10.BmBQZJzx_2poRFX.webp 942w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 实战应用&lt;a href=&quot;#2-实战应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2. 1 第一次对话&lt;a href=&quot;#2-1-第一次对话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在新的终端中输入&lt;code&gt;hermes&lt;/code&gt;，你会看到一个欢迎横幅，上面有你的模型、可用工具和技能。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2211&quot; height=&quot;1656&quot; src=&quot;/_astro/11.C11FB7Ot_Z1e39Ub.webp&quot; srcset=&quot;/_astro/11.C11FB7Ot_2hgUrs.webp 640w, /_astro/11.C11FB7Ot_ZaMCzM.webp 750w, /_astro/11.C11FB7Ot_2ppyVh.webp 828w, /_astro/11.C11FB7Ot_Z1YLlhQ.webp 1080w, /_astro/11.C11FB7Ot_Z1QTuP3.webp 1280w, /_astro/11.C11FB7Ot_ZLFwj4.webp 1668w, /_astro/11.C11FB7Ot_Z1L18jX.webp 2048w, /_astro/11.C11FB7Ot_Z1e39Ub.webp 2211w&quot; /&gt;&lt;/p&gt;&lt;p&gt;输入信息并按 Enter 键，一切顺利的话，就能看到回复了：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1442&quot; height=&quot;657&quot; src=&quot;/_astro/12.CG8iuv2M_1XbbAL.webp&quot; srcset=&quot;/_astro/12.CG8iuv2M_24TJoH.webp 640w, /_astro/12.CG8iuv2M_Z1VPi1F.webp 750w, /_astro/12.CG8iuv2M_Z1jCEbu.webp 828w, /_astro/12.CG8iuv2M_2os3eN.webp 1080w, /_astro/12.CG8iuv2M_VS4uA.webp 1280w, /_astro/12.CG8iuv2M_1XbbAL.webp 1442w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 多个Agent&lt;a href=&quot;#22-多个agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在Hermes Agent中，每个配置文件（profile）都是一个完全隔离的环境，拥有自己的目录，包含独立的 &lt;code&gt;config.yaml&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;SOUL.md&lt;/code&gt;、记忆、会话、技能、定时任务和状态数据库。&lt;/p&gt;&lt;p&gt;这样如果我们需要一个Agent接入Telegram写代码，一个Agent接入QQ日常对话就只需要创建多个配置文件（profile）就可以了，创建方法如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建空配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes profile create 新配置文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆当前配置文件（仅配置）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes profile create 新配置文件名 --clone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆当前配置文件（全部）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes profile create 新配置文件名 --clone-all&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆指定配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes profile create 新配置文件名 --clone --clone-from 指定配置文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;其他内容等我用一段时间再更新&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「我的项目 NextRep」我开发了一个开源健身记录APP</title><link>https://www.chaxuji.de/posts/nextrep-1.2.0/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/nextrep-1.2.0/</guid><description>NextRep 是我做的一款开源健身记录 APP：离线优先、本地存储、支持 AI 训练分析，适合想认真记录训练过程的人。</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前段时间我一直想找一个真正顺手的健身记录工具。&lt;/p&gt;
&lt;p&gt;很多优秀的 App 只提供 IOS 版本，而安卓的健身 App 要不就是收费高昂，要不就是复杂且 UI 丑陋，作为一个轻度健身小白，我只需要它能帮我简单记录力量训练和有氧，能看见体重和围度的变化趋势，最好还能在我训练完之后，帮我做一点总结和分析。&lt;/p&gt;
&lt;p&gt;可惜试了一圈之后，我总觉得差一点意思。有的 App 界面太重，功能很多，但真正开始训练的时候反而不够顺手。另外很少有类似的开源 App，毕竟训练数据、体重变化、身体围度这些东西，说不上多敏感，但我还是更希望它们安安静静地留在本地。&lt;/p&gt;
&lt;p&gt;于是最后，我决定借助 AI 的力量，自己做一个完全符合自己要求的健身 App。&lt;/p&gt;
&lt;p&gt;它叫 &lt;a href=&quot;https://github.com/Liebesfreud/NextRep&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;NextRep&lt;/strong&gt;&lt;/a&gt;，一个 &lt;strong&gt;AI 驱动、离线优先、隐私友好的本地健身记录 APP&lt;/strong&gt;。&lt;/p&gt;
&lt;a href=&quot;https://github.com/Liebesfreud/NextRep&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Liebesfreud&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;NextRep&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;1309&quot; src=&quot;/_astro/1.CKoNfGq5_uRDH4.webp&quot; srcset=&quot;/_astro/1.CKoNfGq5_Z1Ga051.webp 640w, /_astro/1.CKoNfGq5_2vx5aJ.webp 750w, /_astro/1.CKoNfGq5_Z1YtyzR.webp 828w, /_astro/1.CKoNfGq5_Zuy4I9.webp 1080w, /_astro/1.CKoNfGq5_Z10uyCL.webp 1280w, /_astro/1.CKoNfGq5_uRDH4.webp 1384w&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 为什么会做 NextRep&lt;a href=&quot;#1-为什么会做-nextrep&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我觉得健身记录这件事，我需要简单记录如“今天卧推多少公斤、做了几组”这种数据。但这只是最基础的功能，而我很在意另外一些东西：最近力量有没有进步、体重变化是不是符合预期、哪类动作练得最多、自己这段时间的训练偏好是什么、今天这组训练到底算不算有效。&lt;/p&gt;&lt;p&gt;这些信息其实都藏在日常记录里，我可以很简单的使用 AI 分析这些数据。所以 NextRep 的想法就慢慢明确了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;先把记录这件事做顺手&lt;/strong&gt;：训练中能快速输入，尽可能简单&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再把数据真正利用起来&lt;/strong&gt;：不只是堆在那里，而是能看趋势、看偏好、看变化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后交给 AI 做总结和辅助分析&lt;/strong&gt;：让记录不只是归档，而是能够看到参考意见&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;以及最重要的一点：&lt;strong&gt;尽量把数据留在本地。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NextRep 目前使用本地 SQLite 存储训练记录、身体数据和配置，整体是一个很明显的离线优先思路。除了你主动配置的 AI 接口调用之外，核心数据不会上传云端去。这种让数据完全掌握在自己手里的感觉对我来说很安心。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. NextRep 现在能做什么&lt;a href=&quot;#2-nextrep-现在能做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果要一句话概括，我会说它已经不是一个“简单打卡工具”，而是一个比较完整的个人训练记录系统。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;2.1 首页：保证基础功能，简单易用&lt;a href=&quot;#21-首页保证基础功能简单易用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首页是我最在意的一块，因为这决定了它是不是“训练时愿意打开”的 App。&lt;/p&gt;&lt;p&gt;NextRep 目前支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;力量训练记录&lt;/strong&gt;：可以逐组记录重量、次数、完成状态和 RPE；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有氧训练记录&lt;/strong&gt;：记录力量训练后的有氧燃脂数据；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每日打卡&lt;/strong&gt;：训练完成后会有一点轻量反馈，不至于太死板；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练热力图&lt;/strong&gt;：能直观看到自己这一个月到底练了多少天。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我比较喜欢的一点是，它不是把数据冷冰冰地堆成表格，而是尽量保留一种“训练中心”的感觉。你打开它的时候，看到的是今天该做什么、做到了什么，而不只是历史数据列表。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/2.D9eOTP8D_Z4EvCc.webp&quot; srcset=&quot;/_astro/2.D9eOTP8D_9fShy.webp 640w, /_astro/2.D9eOTP8D_1h6Ssy.webp 750w, /_astro/2.D9eOTP8D_vVXcN.webp 828w, /_astro/2.D9eOTP8D_Z1v8UEv.webp 1080w, /_astro/2.D9eOTP8D_Z2teoY7.webp 1280w, /_astro/2.D9eOTP8D_ZrHtQ8.webp 1668w, /_astro/2.D9eOTP8D_Z4EvCc.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 看板：让训练记录真正变成可读的数据&lt;a href=&quot;#22-看板让训练记录真正变成可读的数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我一直觉得，记录本身不是目的，&lt;strong&gt;看见变化&lt;/strong&gt;才是。所以 NextRep 里单独做了一个数据看板，用来整理身体数据和训练偏好。这里面现在已经有：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;体重、围度等身体统计卡片&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;趋势对比&lt;/strong&gt;，可以更直观地看最近的变化；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练偏好分析&lt;/strong&gt;，比如自己更偏向哪些动作和训练类型；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 身体评估与建议&lt;/strong&gt;，把原始数据转成更容易理解的描述。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/3.BqGZ0vOg_1purFT.webp&quot; srcset=&quot;/_astro/3.BqGZ0vOg_2bRVS.webp 640w, /_astro/3.BqGZ0vOg_1a2S7S.webp 750w, /_astro/3.BqGZ0vOg_oRWR8.webp 828w, /_astro/3.BqGZ0vOg_ZXWlp.webp 1080w, /_astro/3.BqGZ0vOg_ZY4qF1.webp 1280w, /_astro/3.BqGZ0vOg_12rtrX.webp 1668w, /_astro/3.BqGZ0vOg_1purFT.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 AI 教练：这是我最想做的部分&lt;a href=&quot;#23-ai-教练这是我最想做的部分&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;NextRep 支持接入 &lt;strong&gt;OpenAI 兼容的 Chat Completions API&lt;/strong&gt;。配置好模型之后，它会结合最近的训练记录和身体数据，把这些上下文一起交给 AI，做训练分析、制定训练计划。这意味着你可以把它当作一个更懂你近期状态的训练助手不是那种“强行加 AI”的噱头感，而是让 AI 真正站在已有数据上说话。比起无上下文地聊天，这种方式会有用得多。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/4.BIYAj-s-_Z2v1lX0.webp&quot; srcset=&quot;/_astro/4.BIYAj-s-_2cy3cf.webp 640w, /_astro/4.BIYAj-s-_Z1JM5qG.webp 750w, /_astro/4.BIYAj-s-_Z2uW0Gr.webp 828w, /_astro/4.BIYAj-s-_18GmNC.webp 1080w, /_astro/4.BIYAj-s-_aASu1.webp 1280w, /_astro/4.BIYAj-s-_2c7NC0.webp 1668w, /_astro/4.BIYAj-s-_Z2v1lX0.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.4 设置与数据管理：我希望它能长期使用&lt;a href=&quot;#24-设置与数据管理我希望它能长期使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多小项目都会把“设置页”做成一个很边缘的东西，但我自己真的会在意这部分。&lt;/p&gt;&lt;p&gt;NextRep 现在已经支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义动作库管理&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模型配置和切换&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON 数据导入 / 导出&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地数据清理&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这几项虽然不算最显眼，但很重要。因为只有当一个 App 允许你管理自己的动作、掌控自己的模型、备份自己的数据，它才更像一个能长期使用的个人工具，而不是一个一次性玩具。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/5.CvB-aoEo_Z17v24I.webp&quot; srcset=&quot;/_astro/5.CvB-aoEo_25gWDV.webp 640w, /_astro/5.CvB-aoEo_Z1R4aY0.webp 750w, /_astro/5.CvB-aoEo_2rX2zb.webp 828w, /_astro/5.CvB-aoEo_2wcGGT.webp 1080w, /_astro/5.CvB-aoEo_1y7dni.webp 1280w, /_astro/5.CvB-aoEo_Z1uy0iE.webp 1668w, /_astro/5.CvB-aoEo_Z17v24I.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 为什么我会喜欢这种“本地优先”的方式&lt;a href=&quot;#3-为什么我会喜欢这种本地优先的方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这大概也是 NextRep 最核心的气质。&lt;/p&gt;&lt;p&gt;现在很多应用默认就是账号、云同步、服务器、在线状态，仿佛不联网就什么都做不了。但健身记录在我看来，其实是非常适合本地化的一类应用：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;数据结构相对稳定；&lt;/li&gt;
&lt;li&gt;使用场景高频但个人化；&lt;/li&gt;
&lt;li&gt;很多时候并不依赖多人协作；&lt;/li&gt;
&lt;li&gt;用户真正关心的是响应快、记录顺、数据不丢。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;所以 NextRep 选择了 &lt;strong&gt;Drizzle ORM + expo-sqlite&lt;/strong&gt; 这一套本地数据方案，把训练数据、身体数据和配置都留在设备上。这样做当然意味着它暂时不会是那种“大而全”的平台型产品，但我反而觉得这正是它舒服的地方。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 技术上，我是怎么把它做出来的&lt;a href=&quot;#4-技术上我是怎么把它做出来的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你也对这类 App 的实现感兴趣，NextRep 目前主要基于下面这套技术栈：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expo SDK 55 + React Native 0.83&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expo Router&lt;/strong&gt; 做文件系统路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NativeWind v4&lt;/strong&gt; 负责样式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moti + Reanimated 4&lt;/strong&gt; 处理动画和交互反馈&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drizzle ORM + expo-sqlite&lt;/strong&gt; 做本地数据库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; 作为主要语言&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 现在的版本与后续想法&lt;a href=&quot;#5-现在的版本与后续想法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;NextRep 当前已经发布到了 &lt;strong&gt;v1.2.0&lt;/strong&gt;。不过说实话，它在我眼里仍然是一个正在继续生长的项目。我之后还想继续慢慢打磨它，比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;继续优化训练记录流程，让输入更自然；&lt;/li&gt;
&lt;li&gt;丰富看板里的数据维度和可视化；&lt;/li&gt;
&lt;li&gt;让 AI 教练的总结更贴近真实训练语境；&lt;/li&gt;
&lt;li&gt;再补一些我自己训练中真正会用到的小功能。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我现在越来越喜欢这种状态：不是为了做一个“看起来很大”的产品，而是做一个自己愿意长期打开、愿意持续维护的东西。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 如果你也想试试看&lt;a href=&quot;#6-如果你也想试试看&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;虽然这个项目还不算特别成熟，可能还有不少 bug，但项目已经开源在 GitHub 上了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub：&lt;/strong&gt;&lt;a href=&quot;https://github.com/Liebesfreud/NextRep&quot; target=&quot;_blank&quot;&gt;https://github.com/Liebesfreud/NextRep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你刚好也在找一个更偏本地、更重视隐私、同时又想把 AI 真正用进训练记录里的工具，也许可以试试看。说到底，NextRep 对我来说并不只是一个“健身打卡 App”。&lt;/p&gt;&lt;p&gt;它更像是我把自己对训练、对记录、对工具感受的一些想法，慢慢做成了一个真的可以握在手里的东西。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从0开始打造我的草缸</title><link>https://www.chaxuji.de/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%89%93%E9%80%A0%E6%88%91%E7%9A%84%E8%8D%89%E7%BC%B8/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%89%93%E9%80%A0%E6%88%91%E7%9A%84%E8%8D%89%E7%BC%B8/</guid><description>从空缸、底床到注水种草，我把第一次认真开草缸的过程慢慢记录了下来。它不只是一次布景折腾，更像是在忙碌生活里，亲手搭起一个能让自己安静下来的小世界。</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;有时候想给生活找一点安静，不一定非要从什么宏大的目标开始。
对我来说，可能只是从一只空缸开始。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;自从读研之后状态一直有点紧绷。白天被各种事情推着走，回到宿舍之后，刷一会B站、玩一会游戏，这一天就过去了。也一直在找机会出去走走，扫扫街，拍拍照，但在成都，阳光明媚的日子总是少见的。阴天的时候也想找点什么事情，让自己慢一点、安静一点，最好还是那种能长期看着它一点点变好的爱好。&lt;/p&gt;
&lt;p&gt;于是，我把目光放到了草缸上。&lt;/p&gt;
&lt;p&gt;之前也零零散散看过不少别人的开缸分享，总觉得那是一种很特别的治愈：在几十厘米见方的玻璃缸里，摆石头、铺泥、种草、开灯、等水清，最后看着鱼虾在里面慢慢活动起来，像是把一小块水塘搬回了桌面。&lt;/p&gt;
&lt;p&gt;所以这次，我决定认真从 0 开始，给自己搭一个真正属于我的草缸。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 开缸前的准备工作&lt;a href=&quot;#1-开缸前的准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一开始其实没有那么复杂，只是单纯觉得——&lt;strong&gt;我想给自己找一个能长期投入、又能带来反馈的小世界。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;摄影是按下快门的瞬间，写博客是把想法慢慢整理出来，而草缸更像是另一种节奏：它不是立刻给你答案，而是让你在每天开灯、换水、修剪的过程里，慢慢看到变化。而且草缸真的很适合在学习和生活节奏偏满的时候存在。当看着气泡从叶片上慢慢升起的时候，整个人会莫名安静下来。那种感觉很难形容，但确实很解压。&lt;/p&gt;&lt;p&gt;第一次开缸，在小红书上搜了很多教程和思路，但我一开始并不像投入太多，所以我这次准备的思路很简单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;先把超白缸、水草灯、底床这些必须配置补齐&lt;/li&gt;
&lt;li&gt;选相对好养的无碳水草，降低翻车概率&lt;/li&gt;
&lt;li&gt;考虑选择一些皮实的冷水鱼虾&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你也和我一样，是第一次接触草缸，那前期真的不用把自己搞得太焦虑。把必备物品准备好，剩下的可以边养边优化。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;这次开缸用到的基础物品&lt;a href=&quot;#这次开缸用到的基础物品&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;超白缸&lt;/strong&gt;：因为想打造的是桌面小草缸，所以选择了20 x 20 x 20的尺寸，有足够的造景空间，在桌面上也不太占地方。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;565&quot; src=&quot;/_astro/1.B3OW-7ZG_12DmN1.webp&quot; srcset=&quot;/_astro/1.B3OW-7ZG_29gvrm.webp 640w, /_astro/1.B3OW-7ZG_Z1EFx2n.webp 750w, /_astro/1.B3OW-7ZG_Z1PNWH1.webp 828w, /_astro/1.B3OW-7ZG_ZEwVOy.webp 1080w, /_astro/1.B3OW-7ZG_12DmN1.webp 1270w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水草灯&lt;/strong&gt;：这个可以根据自己的水体计算，差不多是1升水对应0.8-1w的功率，最好选带透镜的，不然会很刺眼。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;1516&quot; src=&quot;/_astro/2.BBknKsVK_Udi7R.webp&quot; srcset=&quot;/_astro/2.BBknKsVK_1CRFSb.webp 640w, /_astro/2.BBknKsVK_26KWLk.webp 750w, /_astro/2.BBknKsVK_1j8qcw.webp 828w, /_astro/2.BBknKsVK_ZMB8Eq.webp 1080w, /_astro/2.BBknKsVK_Udi7R.webp 1272w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水草泥&lt;/strong&gt;：市面上有非常多假的水草泥（其实是陶粒），所以选对品牌是非常重要的，尼特利应该是非常知名的品牌了，不过我选择了它的上游代工厂的产品，兰保的水草泥，性价比会更高一些。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;造景石&lt;/strong&gt;：这个完全是个人主管选择，你可以路上捡几块，也可以网购一些特殊石头，我买的是所谓的黑金石，价格便宜，棱角分明还带有一些金色。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水草&lt;/strong&gt;：因为我不打算上二氧化碳设备，所以选择了无碳的水草，前景我选的是天胡荽，中景为罗贝利，后景为高珍珠，记得选择无菌杯水草。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;750&quot; src=&quot;/_astro/3.CLTLvZsj_KT4rs.webp&quot; srcset=&quot;/_astro/3.CLTLvZsj_Z1PghTf.webp 640w, /_astro/3.CLTLvZsj_Z2iz60P.webp 750w, /_astro/3.CLTLvZsj_2jd4aC.webp 828w, /_astro/3.CLTLvZsj_2kW2U9.webp 1080w, /_astro/3.CLTLvZsj_KT4rs.webp 1272w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鱼&lt;/strong&gt;：我选择的是白云金丝，冷水鱼体型小，相对好养活。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;591&quot; src=&quot;/_astro/4.B71a1PIW_mkA5S.webp&quot; srcset=&quot;/_astro/4.B71a1PIW_ZKVVGE.webp 640w, /_astro/4.B71a1PIW_M35fO.webp 750w, /_astro/4.B71a1PIW_ZYf8Gp.webp 828w, /_astro/4.B71a1PIW_gJrzr.webp 1080w, /_astro/4.B71a1PIW_mkA5S.webp 1272w&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 从空缸到注水：开缸全过程&lt;a href=&quot;#2-从空缸到注水开缸全过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;等到所有所需的物品到齐后就可以开缸了&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;先是洗缸、擦缸，然后把水草泥慢慢铺进去，水草泥的量大概需要保证铺满鱼缸，并且厚度至少为5cm，为了有一定的层次感，建议把水草泥铺成前低后高的小坡。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2150&quot; height=&quot;2867&quot; src=&quot;/_astro/5.DWvzT3Xp_Z1eKyTM.webp&quot; srcset=&quot;/_astro/5.DWvzT3Xp_1OEug.webp 640w, /_astro/5.DWvzT3Xp_Z1QQw83.webp 750w, /_astro/5.DWvzT3Xp_ZGtwmM.webp 828w, /_astro/5.DWvzT3Xp_1OTxkU.webp 1080w, /_astro/5.DWvzT3Xp_URLWJ.webp 1280w, /_astro/5.DWvzT3Xp_Kwe9p.webp 1668w, /_astro/5.DWvzT3Xp_Z1aaVQc.webp 2048w, /_astro/5.DWvzT3Xp_Z1eKyTM.webp 2150w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;放入造景，选几块合适的造景石，用清水多次清洗，直到清洗过的水不再浑浊，放入鱼缸摆好造型。&lt;/li&gt;
&lt;li&gt;处理水草，将水草从无菌杯中取出，浸入水中，用手轻轻搓掉水槽根部的凝胶，然后分成一小簇一小簇。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3072&quot; height=&quot;4096&quot; src=&quot;/_astro/6.NbP2ojj-_2qon8E.webp&quot; srcset=&quot;/_astro/6.NbP2ojj-_Zm4owe.webp 640w, /_astro/6.NbP2ojj-_Z2fKA9x.webp 750w, /_astro/6.NbP2ojj-_Z15nAoh.webp 828w, /_astro/6.NbP2ojj-_Z8FcLs.webp 1080w, /_astro/6.NbP2ojj-_Z12GX9D.webp 1280w, /_astro/6.NbP2ojj-_Z1d3vWX.webp 1668w, /_astro/6.NbP2ojj-_1VqqPm.webp 2048w, /_astro/6.NbP2ojj-_Z1y9gWE.webp 2560w, /_astro/6.NbP2ojj-_2qon8E.webp 3072w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;可以往鱼缸内少量加水，确保水草泥表面湿润，接下来就可以用镊子或者其他工具，把水草插入水草泥中，对于需要爬地的前景草而言，要种的深一些，只露出一点叶子就行了。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2150&quot; height=&quot;2867&quot; src=&quot;/_astro/7.CenSXB37_Z2jeJyD.webp&quot; srcset=&quot;/_astro/7.CenSXB37_18KygD.webp 640w, /_astro/7.CenSXB37_ZJUClF.webp 750w, /_astro/7.CenSXB37_prmoA.webp 828w, /_astro/7.CenSXB37_KqmG4.webp 1080w, /_astro/7.CenSXB37_Z8AnG7.webp 1280w, /_astro/7.CenSXB37_ZiVVur.webp 1668w, /_astro/7.CenSXB37_Z2eE7v3.webp 2048w, /_astro/7.CenSXB37_Z2jeJyD.webp 2150w&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2150&quot; height=&quot;2867&quot; src=&quot;/_astro/8.BGSLwTSF_Z28zMLd.webp&quot; srcset=&quot;/_astro/8.BGSLwTSF_Z1D083h.webp 640w, /_astro/8.BGSLwTSF_1xuO8l.webp 750w, /_astro/8.BGSLwTSF_Z2mjjUk.webp 828w, /_astro/8.BGSLwTSF_V5jtu.webp 1080w, /_astro/8.BGSLwTSF_23y6j.webp 1280w, /_astro/8.BGSLwTSF_Z8hYH1.webp 1668w, /_astro/8.BGSLwTSF_Z240aHC.webp 2048w, /_astro/8.BGSLwTSF_Z28zMLd.webp 2150w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;随后沿着缸壁缓缓住满水，就大功告成了！&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;有些草一夹起来就散，有些刚插下去又浮起来，手稍微重一点，前面铺好的底床就被带乱。那一刻你会深刻理解，为什么很多人说草缸是“细致活”。&lt;/p&gt;&lt;p&gt;但很奇怪，虽然过程挺慢，我却没有不耐烦。反而有一种久违的专注感，像是终于可以只做眼前这一件事，不用同时分心很多东西。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 注水之后，才是真正的开始&lt;a href=&quot;#4-注水之后才是真正的开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;造景完成、注满水、打开水草灯的那一刻，不过是生态三无草缸的开始。新缸前期最重要的事情，不是急着放鱼或虾，而是让系统先稳定下来。观察一下水会不会浑？水草有没有融叶？&lt;/p&gt;&lt;p&gt;水草泥前期的肥力太高，一定要记得勤换水，每次换差不多1/2的水。等差不多一周过后，水体趋于稳定，这时候就可以放入那些闯缸鱼/虾了。然后根据后续的变化，加入新的生物或是修建水草。&lt;/p&gt;&lt;p&gt;你不会在第一天就看到“成景”，但你会慢慢看到缸的状态往好的方向走。那种感觉特别微妙，有点像照顾一个刚刚诞生的小系统，也像在生活里给自己保留了一点持续期待的东西。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2867&quot; height=&quot;2150&quot; src=&quot;/_astro/9.DxjaeEhW_naNrf.webp&quot; srcset=&quot;/_astro/9.DxjaeEhW_Z1O1JqM.webp 640w, /_astro/9.DxjaeEhW_CgiH9.webp 750w, /_astro/9.DxjaeEhW_ZpaaqN.webp 828w, /_astro/9.DxjaeEhW_ZR1gfC.webp 1080w, /_astro/9.DxjaeEhW_1fh4y.webp 1280w, /_astro/9.DxjaeEhW_Zrddaa.webp 1668w, /_astro/9.DxjaeEhW_2l7xgt.webp 2048w, /_astro/9.DxjaeEhW_XV3Un.webp 2560w, /_astro/9.DxjaeEhW_naNrf.webp 2867w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;4301&quot; height=&quot;5734&quot; src=&quot;/_astro/10.BH2LamNf_1VV9sw.webp&quot; srcset=&quot;/_astro/10.BH2LamNf_Z1Bep0.webp 640w, /_astro/10.BH2LamNf_awunF.webp 750w, /_astro/10.BH2LamNf_Z2s3Jnu.webp 828w, /_astro/10.BH2LamNf_1ScjIB.webp 1080w, /_astro/10.BH2LamNf_Z65y74.webp 1280w, /_astro/10.BH2LamNf_Z2Pd5x.webp 1668w, /_astro/10.BH2LamNf_MgYNG.webp 2048w, /_astro/10.BH2LamNf_ZcmvYS.webp 2560w, /_astro/10.BH2LamNf_1VV9sw.webp 4301w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在草缸面前，你很难一直处于那种特别焦躁的状态里。你会下意识放慢动作，去看水流、看叶片、看灯光落下来之后的层次变化。那些平时很容易被忽略的小细节，在这个小小的玻璃缸里反而变得非常清晰。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3072&quot; height=&quot;4096&quot; src=&quot;/_astro/11.3iocuQBQ_ZT5tEv.webp&quot; srcset=&quot;/_astro/11.3iocuQBQ_Z20xQHd.webp 640w, /_astro/11.3iocuQBQ_Z1Np7Tx.webp 750w, /_astro/11.3iocuQBQ_DbL8e.webp 828w, /_astro/11.3iocuQBQ_1riAid.webp 1080w, /_astro/11.3iocuQBQ_1X3vI7.webp 1280w, /_astro/11.3iocuQBQ_ZtIVvV.webp 1668w, /_astro/11.3iocuQBQ_Z2dL4a4.webp 2048w, /_astro/11.3iocuQBQ_ZDgfqh.webp 2560w, /_astro/11.3iocuQBQ_ZT5tEv.webp 3072w&quot; /&gt;&lt;/p&gt;&lt;p&gt;它像是把“照顾”这件事情具体化了。&lt;/p&gt;&lt;p&gt;你给它时间，它就给你状态；你愿意稳定地维护，它就会慢慢变得越来越舒服。&lt;/p&gt;&lt;p&gt;这种反馈很温柔，也很直接。所以我现在很喜欢在晚上开着灯看它一会儿。&lt;/p&gt;&lt;p&gt;不需要很久，哪怕只是几分钟，也会觉得这一天终于有了一个柔和的收尾。&lt;/p&gt;&lt;p&gt;从 0 开始搭起这样一个小世界，对我来说更像是一种生活练习：&lt;/p&gt;&lt;p&gt;认真准备，慢慢动手，接受过程里的不完美，然后等待时间把一切养好。&lt;/p&gt;&lt;p&gt;如果你最近也想给自己的生活找一点新的寄托，或许真的可以试试草缸。&lt;/p&gt;&lt;p&gt;它占据的空间不大，却会在很多普通的夜晚里，给你一个安静看一会儿的理由。&lt;/p&gt;&lt;p&gt;嗯…等它再长一阵子，我应该还会继续记录它后面的样子。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「CLIProxyAPI × Octopus」API反代 &amp; 集中管理</title><link>https://www.chaxuji.de/posts/cliproxyapi-octopus/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/cliproxyapi-octopus/</guid><description>探索一套个人使用的 API 反代与集中管理方案。通过 CLIProxyAPI 统一入口，用 Octopus 建立中枢，实现多渠道、多 Key、负载均衡。</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;“工具不在多，在于你能不能用一把钥匙打开所有的门。”&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;如果你和我一样，手上同时有好几种 AI 接入方式/工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方订阅账号，比如 Gemini、Claude、OpenAI 这类订阅计划中包含 CLI 工具的服务&lt;/li&gt;
&lt;li&gt;一些平台提供的 API Key&lt;/li&gt;
&lt;li&gt;公益站、第三方渠道、临时月抛Team车位之类的补充来源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那你大概率也遇到过下面这些问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;每家接入方式都不一样&lt;/strong&gt;：有的走 OAuth 登录，有的只给 API Key，Claude与标准Open AI的协议还不完全兼容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具链很割裂&lt;/strong&gt;：Cherry Studio、LobeChat、Open WebUI、各种脚本和 CLI 工具，大多只能使用标准 API。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换成本很高&lt;/strong&gt;：某条线路挂了要手动换，某个账号额度不够了又得重新改配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后期很难维护&lt;/strong&gt;：API地址、Key太多，模型和映射乱七八糟，时间久了自己都忘了这套 API 配置是哪来的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我折腾这套方案的目的而是想解决一个很朴素的问题：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;能不能把零散的 API 统一归纳成一个稳定、带故障转移、可长期维护的使用方式？&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;我最后采用的方案，是把我使用 API 的方式拆成两层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLIProxyAPI&lt;/strong&gt; 负责把订阅账号和官方 CLI 能力变成标准 API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Octopus&lt;/strong&gt; 负责把这些 API 再统一聚合、故障转移、监控和统计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套组合不一定是唯一的解决方案，但对我来说，它的好处是非常明显的：可以部署在我的美西优化服务器上，尽可能避免 AI 降智，在大陆也有不错的网络连通性。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 我为什么会需要这套东西&lt;a href=&quot;#1-我为什么会需要这套东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最开始我只是想把手上的几类额度都尽量利用起来。&lt;/p&gt;&lt;p&gt;比如有些模型的订阅权益，其实很香，但官方主要是给网页端或者 CLI 用的；而我平时真正高频使用的，却是下面这些工具：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;桌面客户端&lt;/strong&gt; Cherry Studio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行工具&lt;/strong&gt; OpenCode、Claude Code&lt;/li&gt;
&lt;li&gt;自己写的小脚本或工作流&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;问题是明明我已经有订阅、有账号、有额度，但如果不能把它们转成标准 API 形式，那很多工具根本用不了对我来说，这种碎片化体验比“没有额度”还烦。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 为什么是 CLI Proxy API + Octopus&lt;a href=&quot;#2-为什么是-cli-proxy-api--octopus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;有了 CLIProxyAPI，你能把很多原本只能走官方 CLI 的能力转成 API，但当渠道一多，还是会乱，而 Octopus，它很适合做聚合和路由。所以这两个项目放在一起，刚好形成一个完整链路：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;客户端 / 工具 / 脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ Octopus ]        ← 中枢层：聚合、路由、统计&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[ CLIProxyAPI ]      ← 入口层：OAuth 认证、格式转换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Gemini / Claude / OpenAI / Qwen / iFlow ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 部署 CLI Proxy API&lt;a href=&quot;#3-部署-cli-proxy-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;a href=&quot;https://github.com/router-for-me/CLIProxyAPI&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;router-for-me&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;CLIProxyAPI&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;前面已经讲清楚为什么要折腾这套东西了，这里就不继续做介绍。这一层的目标很简单：&lt;strong&gt;Docker 部署 CLI ProxyAPI，把原本依赖官方 CLI 登录的能力，转成可直接调用的标准 API。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1881&quot; height=&quot;882&quot; src=&quot;/_astro/1.IhuP0fu8_OaPkm.webp&quot; srcset=&quot;/_astro/1.IhuP0fu8_ZjjdQt.webp 640w, /_astro/1.IhuP0fu8_Z1NvC6K.webp 750w, /_astro/1.IhuP0fu8_Z1GT697.webp 828w, /_astro/1.IhuP0fu8_Z28MaNM.webp 1080w, /_astro/1.IhuP0fu8_OoysS.webp 1280w, /_astro/1.IhuP0fu8_1esk3v.webp 1668w, /_astro/1.IhuP0fu8_OaPkm.webp 1881w&quot; /&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;3.1 部署前准备&lt;a href=&quot;#31-部署前准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;建议先确认下面几件事：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你有一台能长期在线的 Linux 服务器，或者本地已经装好了 Docker&lt;/li&gt;
&lt;li&gt;已安装 Docker 和 Docker Compose&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 先准备目录&lt;a href=&quot;#32-先准备目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CLI Proxy API 官方仓库里提供了 compose 文件，我更推荐直接用 &lt;strong&gt;Docker Compose&lt;/strong&gt; 允许服务。先建一个工作目录：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/cliproxyapi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/cliproxyapi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 用 Docker Compose 启动 CLI Proxy API&lt;a href=&quot;#33-用-docker-compose-启动-cli-proxy-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以在当前目录下新建一个 &lt;code&gt;docker-compose.yml&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;cli-proxy-api&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;eceasy/cli-proxy-api:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cli-proxy-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;pull_policy&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;8317:8317&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;8085:8085&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;1455:1455&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;54545:54545&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;51121:51121&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;11451:11451&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;./config.yaml:/CLIProxyAPI/config.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;./auths:/root/.cli-proxy-api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;./logs:/CLIProxyAPI/logs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DEPLOY&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.4 如何使用 CPA 的 WebUI&lt;a href=&quot;#34-如何使用-cpa-的-webui&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;根据官方文档，CLI Proxy API 的 WebUI 入口是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://你的服务器IP:8317/management.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你是本机部署，也可以直接访问：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://localhost:8317/management.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;不过这里要注意，WebUI 不是容器一启动就一定能直接用。按照官方教程，你需要先在配置里加入 &lt;code&gt;remote-management&lt;/code&gt; 相关配置，例如是否允许远程访问、管理密钥，以及是否禁用控制面板。&lt;/p&gt;&lt;p&gt;配置改完之后，重启程序；等服务生效后，再用浏览器打开上面的 &lt;code&gt;management.html&lt;/code&gt; 页面。&lt;/p&gt;&lt;p&gt;第一次进入时，需要输入你在配置里设置的管理密钥（&lt;code&gt;secret-key&lt;/code&gt;），输入正确后才能进入 WebUI。&lt;/p&gt;&lt;p&gt;官方教程里提到，进入之后界面本身比较直观，可以直接在面板里继续查看和操作；但有一个限制要特别注意：&lt;strong&gt;OAuth 认证功能仅支持本地运行环境&lt;/strong&gt;，也就是 &lt;code&gt;localhost&lt;/code&gt; 或 &lt;code&gt;127.0.0.1&lt;/code&gt;，如果你是远程服务器部署，就不能直接在 WebUI 里完成这一步。&lt;/p&gt;&lt;p&gt;另外，如果你不想暴露内置控制面板，也可以把 &lt;code&gt;remote-management.disable-control-panel&lt;/code&gt; 设为 &lt;code&gt;true&lt;/code&gt;。这样一来，访问 &lt;code&gt;/management.html&lt;/code&gt; 时就会直接返回 &lt;code&gt;404&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;简单理解的话，这一节可以记成下面这几步：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在配置文件里启用 &lt;code&gt;remote-management&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;设置自己的管理密钥&lt;/li&gt;
&lt;li&gt;重启 CLI Proxy API&lt;/li&gt;
&lt;li&gt;访问 &lt;code&gt;http://你的服务器IP:8317/management.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入管理密钥进入 WebUI&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1496&quot; height=&quot;1421&quot; src=&quot;/_astro/2.BY1fPiAY_28g46C.webp&quot; srcset=&quot;/_astro/2.BY1fPiAY_Z24Hmla.webp 640w, /_astro/2.BY1fPiAY_2ptuEm.webp 750w, /_astro/2.BY1fPiAY_Z1sJEFq.webp 828w, /_astro/2.BY1fPiAY_Zto5kE.webp 1080w, /_astro/2.BY1fPiAY_26CTWE.webp 1280w, /_astro/2.BY1fPiAY_28g46C.webp 1496w&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1464&quot; src=&quot;/_astro/3.iaTtJJo9_ZFqbCE.webp&quot; srcset=&quot;/_astro/3.iaTtJJo9_UymwU.webp 640w, /_astro/3.iaTtJJo9_Z1nvp2P.webp 750w, /_astro/3.iaTtJJo9_1b6Low.webp 828w, /_astro/3.iaTtJJo9_15oNLS.webp 1080w, /_astro/3.iaTtJJo9_180xei.webp 1280w, /_astro/3.iaTtJJo9_ZFqbCE.webp 1500w&quot; /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;参考文档：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://help.router-for.me/cn/management/webui.html&quot; target=&quot;_blank&quot;&gt;https://help.router-for.me/cn/management/webui.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.router-for.me/cn/hands-on/tutorial-6.html&quot; target=&quot;_blank&quot;&gt;https://help.router-for.me/cn/hands-on/tutorial-6.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. Docker 部署 Octopus&lt;a href=&quot;#4-docker-部署-octopus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;a href=&quot;https://github.com/bestruirui/octopus&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;bestruirui&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;octopus&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;当 CLIProxyAPI 已经确认可用之后，再来搭 Octopus。&lt;/p&gt;&lt;p&gt;这一层的职责也很明确：&lt;strong&gt;把多个来源统一收进一个中枢里，让客户端以后只认一个入口。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1719&quot; height=&quot;984&quot; src=&quot;/_astro/4.DNdOJwk9_Z1p4FGw.webp&quot; srcset=&quot;/_astro/4.DNdOJwk9_9mavR.webp 640w, /_astro/4.DNdOJwk9_1q5Dvv.webp 750w, /_astro/4.DNdOJwk9_Z1cY1E7.webp 828w, /_astro/4.DNdOJwk9_ZxXgIU.webp 1080w, /_astro/4.DNdOJwk9_1P3RY4.webp 1280w, /_astro/4.DNdOJwk9_ZjCr2W.webp 1668w, /_astro/4.DNdOJwk9_Z1p4FGw.webp 1719w&quot; /&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;4.1 用 Docker Compose 启动 Octopus&lt;a href=&quot;#41-用-docker-compose-启动-octopus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/octopus&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/octopus&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker-compose.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;octopus&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bestrui/octopus&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;octopus&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;8080:8080&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;./data:/app/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;启动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 首次登录和默认账号&lt;a href=&quot;#42-首次登录和默认账号&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;根据官方 README，服务启动后可以直接访问：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://你的服务器IP:8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;默认账号密码是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户名：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这里一定要注意：&lt;strong&gt;第一次登录后马上修改默认密码。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 把 CLIProxyAPI 接进 Octopus&lt;a href=&quot;#43-把-cliproxyapi-接进-octopus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当 Octopus 面板已经能正常打开之后，下一步就不是继续折腾 Octopus 本身了，而是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;把 CLIProxyAPI 当作一个上游来源接进去。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1704&quot; height=&quot;810&quot; src=&quot;/_astro/5.Cs83DJCz_Te3g2.webp&quot; srcset=&quot;/_astro/5.Cs83DJCz_Z26px0q.webp 640w, /_astro/5.Cs83DJCz_1CrFmR.webp 750w, /_astro/5.Cs83DJCz_Z8Pxzm.webp 828w, /_astro/5.Cs83DJCz_ZaMU6V.webp 1080w, /_astro/5.Cs83DJCz_ZXHzqL.webp 1280w, /_astro/5.Cs83DJCz_TlznT.webp 1668w, /_astro/5.Cs83DJCz_Te3g2.webp 1704w&quot; /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1731&quot; height=&quot;942&quot; src=&quot;/_astro/6.DgfeczbZ_1aDcnx.webp&quot; srcset=&quot;/_astro/6.DgfeczbZ_ZOdQ0D.webp 640w, /_astro/6.DgfeczbZ_Rcx5.webp 750w, /_astro/6.DgfeczbZ_2aeIy7.webp 828w, /_astro/6.DgfeczbZ_PpHzt.webp 1080w, /_astro/6.DgfeczbZ_Z1AF9Yb.webp 1280w, /_astro/6.DgfeczbZ_1RwkC7.webp 1668w, /_astro/6.DgfeczbZ_1aDcnx.webp 1731w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你只是偶尔体验一下某个模型，那这套方案确实有点重。&lt;/p&gt;&lt;p&gt;但如果你已经进入“来源越来越多、客户端越来越多、配置越来越散”的阶段，把入口层和中枢层拆开，后面的维护会轻松很多。&lt;/p&gt;&lt;p&gt;简单总结就是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLIProxyAPI 先负责把订阅能力转成标准 API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Octopus 再负责把这些 API 聚合成统一入口&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;按这个顺序搭，基本是最稳的。先把第一条链路真正跑通，后面无论是加渠道、做轮询，还是做成本统计，都会顺很多。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「我的博客」那些悄然生长的新功能</title><link>https://www.chaxuji.de/posts/blog-new-features-2026.2/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/blog-new-features-2026.2/</guid><description>在一个普通的下午，我为博客添加了热力图、AI总结、瞬间页面、阅读进度条、命令面板……这些大大小小的改动，让它越来越像我真正想要的样子。</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;“一个好的工具，应该在你需要它的那一刻悄悄出现，而不是让你刻意去寻找它。”&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;博客自从迁移到 Astro 以来，我对它的折腾从未停止过。&lt;/p&gt;
&lt;p&gt;这次的更新没有什么轰轰烈烈的大改版，更像是一次次的”打磨”——在某个午后突然觉得少了什么，然后翻出代码，一点一点地把它补上。最终，这些碎片拼在一起，让整个博客焕然一新。&lt;/p&gt;
&lt;p&gt;这篇文章就记录一下这段时间我到底做了什么。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h1&gt;1. 热力图：给时间留下痕迹&lt;a href=&quot;#1-热力图给时间留下痕迹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;第一个让我满意的功能，是侧边栏里的&lt;strong&gt;活动热力图&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;灵感来自 GitHub 的 contribution graph——那一片绿色的方块，是每个开发者时间投入的最直观证明。我想在博客里也有一块属于自己的”时间地图”，记录每一篇文章的诞生。&lt;/p&gt;&lt;p&gt;于是侧边栏多了一个小组件，它会根据文章的发布日期，自动生成一整年的热力分布图。哪些时候笔耕不辍，哪些时候沉寂许久，一眼便知。&lt;/p&gt;&lt;p&gt;这不是一个实用功能，但它是一种&lt;strong&gt;仪式感&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;热力图&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;300&quot; src=&quot;/_astro/1.CUqxoPhs_Z2kYNaG.webp&quot; srcset=&quot;/_astro/1.CUqxoPhs_Z2kYNaG.webp 445w&quot; /&gt;&lt;figcaption&gt;热力图&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;2. 瞬间：碎片时光的容身之所&lt;a href=&quot;#2-瞬间碎片时光的容身之所&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;以前总有一些想记录的东西，又不够写成一篇完整的文章——一张照片、一句话、一个随手拍下的瞬间。&lt;/p&gt;&lt;p&gt;它们无处安放，要么消失在手机相册里，要么被压进草稿箱再也不见天日。&lt;/p&gt;&lt;p&gt;所以我借助自部署的memos，添加了&lt;strong&gt;瞬间&lt;/strong&gt;页面（Memos），作为这些碎片的容身之所。它不需要标题，不需要结构，只需要你把那一刻记录下来。&lt;/p&gt;&lt;p&gt;想到什么就说什么，像是给自己发一条消息。说不定某一天翻回来，会感谢当时的那个自己。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;瞬间&quot; loading=&quot;lazy&quot; width=&quot;1245&quot; height=&quot;771&quot; src=&quot;/_astro/2.DZWgyPo7_1Krv8V.webp&quot; srcset=&quot;/_astro/2.DZWgyPo7_1lfVAB.webp 640w, /_astro/2.DZWgyPo7_1jzxUV.webp 750w, /_astro/2.DZWgyPo7_2s5F2g.webp 828w, /_astro/2.DZWgyPo7_jj3mI.webp 1080w, /_astro/2.DZWgyPo7_1Krv8V.webp 1245w&quot; /&gt;&lt;figcaption&gt;瞬间&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;3. AI总结：让机器先替你读一遍&lt;a href=&quot;#3-ai总结让机器先替你读一遍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;文章写完之后，又给文章页面加了一个 &lt;strong&gt;AI总结组件&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;它会在文章顶部给出一段由 AI 生成的内容摘要，让访客在决定是否深入阅读之前，可以先得到一个快速的概览。&lt;/p&gt;&lt;p&gt;我知道有人对”AI生成”这几个字比较敏感，但我更倾向于把它当成一个&lt;strong&gt;导读工具&lt;/strong&gt;而非替代品——就像一本书的序言，让你知道接下来会看到什么。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;AI总结&quot; loading=&quot;lazy&quot; width=&quot;1155&quot; height=&quot;295&quot; src=&quot;/_astro/3.Ce51WnKI_Z1fyCzm.webp&quot; srcset=&quot;/_astro/3.Ce51WnKI_Z1x4b6Q.webp 640w, /_astro/3.Ce51WnKI_Z2jPYBO.webp 750w, /_astro/3.Ce51WnKI_wICfQ.webp 828w, /_astro/3.Ce51WnKI_2iv6kW.webp 1080w, /_astro/3.Ce51WnKI_Z1fyCzm.webp 1155w&quot; /&gt;&lt;figcaption&gt;AI总结&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;4. 沉浸模式：只剩你和文字&lt;a href=&quot;#4-沉浸模式只剩你和文字&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;有时候打开一篇文章，却总被周围的东西分散注意力——侧边栏、导航栏、各种小组件……&lt;/p&gt;&lt;p&gt;所以我加了一个&lt;strong&gt;沉浸阅读模式&lt;/strong&gt;（Zen Mode）。点击文章页面右侧悬浮的「沉浸阅读」按钮，侧边栏、导航栏会统统隐藏，屏幕上只剩下文章本身。&lt;/p&gt;&lt;p&gt;读完之后，按 &lt;code&gt;ESC&lt;/code&gt; 即可退出，一切恢复原样。&lt;/p&gt;&lt;p&gt;有时候，少即是多。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;沉浸模式&quot; loading=&quot;lazy&quot; width=&quot;1174&quot; height=&quot;1254&quot; src=&quot;/_astro/4.CtM-EoV3_ZaRqn9.webp&quot; srcset=&quot;/_astro/4.CtM-EoV3_Z27l7sf.webp 640w, /_astro/4.CtM-EoV3_Cjl1C.webp 750w, /_astro/4.CtM-EoV3_Z8QhMR.webp 828w, /_astro/4.CtM-EoV3_2nzEjV.webp 1080w, /_astro/4.CtM-EoV3_ZaRqn9.webp 1174w&quot; /&gt;&lt;figcaption&gt;沉浸模式&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;5. 那些小而美的交互改进&lt;a href=&quot;#5-那些小而美的交互改进&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;除了上面几个”大功能”，这次还顺手加了一批体验细节，单独拿出来说每一个都不大，但放在一起，阅读体验的提升是可以感知的。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;5.1 阅读进度条&lt;a href=&quot;#51-阅读进度条&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;文章页面顶部现在有了一条&lt;strong&gt;阅读进度条&lt;/strong&gt;，随着滚动实时更新。&lt;/p&gt;&lt;p&gt;这是一个微小但有意义的改动——在一篇长文里，知道自己”读到哪里了”，内心会多一点踏实。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5.2 命令面板&lt;a href=&quot;#52-命令面板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;按下 &lt;code&gt;Ctrl + K&lt;/code&gt;（macOS 为 &lt;code&gt;⌘ + K&lt;/code&gt;），唤出&lt;strong&gt;命令面板&lt;/strong&gt;，快速跳转到任意页面或文章。&lt;/p&gt;&lt;p&gt;这是一个为键盘控设计的功能，不需要鼠标点来点去，直接搜索、直接跳转，干脆利落。支持方向键上下选择，&lt;code&gt;Enter&lt;/code&gt; 确认，&lt;code&gt;ESC&lt;/code&gt; 关闭。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;命令面板&quot; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;718&quot; src=&quot;/_astro/5.Cgk55Sx-_Z1MSRdI.webp&quot; srcset=&quot;/_astro/5.Cgk55Sx-_ZTcC88.webp 640w, /_astro/5.Cgk55Sx-_1nQDqE.webp 750w, /_astro/5.Cgk55Sx-_Z2g4qDF.webp 828w, /_astro/5.Cgk55Sx-_15RJgy.webp 1080w, /_astro/5.Cgk55Sx-_Z1MSRdI.webp 1114w&quot; /&gt;&lt;figcaption&gt;命令面板&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5.3 欢迎语&lt;a href=&quot;#53-欢迎语&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;导航栏里加了一句&lt;strong&gt;欢迎语&lt;/strong&gt;，根据当前时间段自动变换——早上好、下午好、晚上好……&lt;/p&gt;&lt;p&gt;小小一句话，希望每一位来访的朋友都能感受到一点温度。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;欢迎语&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;154&quot; src=&quot;/_astro/6.Cu1YAh2p_Zb6DYG.webp&quot; srcset=&quot;/_astro/6.Cu1YAh2p_Zb6DYG.webp 388w&quot; /&gt;&lt;figcaption&gt;欢迎语&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5.4 外链提示&lt;a href=&quot;#54-外链提示&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;点击一个外部链接时，现在会弹出一个&lt;strong&gt;提示窗口&lt;/strong&gt;，告知你即将离开当前站点。&lt;/p&gt;&lt;p&gt;这个改动最初只是为了安全考虑，但后来发现它也有另一层意义：给每一次”离开”一点缓冲，提醒你这是一个有意识的选择。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;外链提示&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;517&quot; src=&quot;/_astro/7.Bu05Inr7_Z1Gzbrg.webp&quot; srcset=&quot;/_astro/7.Bu05Inr7_Z28iXWE.webp 640w, /_astro/7.Bu05Inr7_ZMRM9T.webp 750w, /_astro/7.Bu05Inr7_Z1Gzbrg.webp 775w&quot; /&gt;&lt;figcaption&gt;外链提示&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;这些功能加起来，不过是几个下午的折腾。&lt;/p&gt;&lt;p&gt;但每次推送完代码，打开博客刷新页面时，看到那些新东西出现在应该出现的地方，还是会有一种小小的满足感。&lt;/p&gt;&lt;p&gt;博客是一个长期工程，没有终点，只有一次次的”再好一点”。&lt;/p&gt;&lt;p&gt;希望你在这里，也能感受到这份用心。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>一城三色：澳门浮光与沉影</title><link>https://www.chaxuji.de/posts/macau-three-colors/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/macau-three-colors/</guid><description>用一日时光穿行澳门的晨昏之间，看到三种底色交织的画卷：路环的旧色、半岛老城的褐黄、凼仔的流光溢彩。</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;该如何走进澳门这一座城？纸醉金迷的赌场招牌，固然是它被世人熟知的侧影；可当我用一日时光，穿行于它的晨昏之间，却看到了一幅由三种底色交织的画卷——那是属于澳门的，沉默，厚重，却又鲜活的三原色。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第一笔，是路环那片温暾的旧色。&lt;/strong&gt;&lt;a href=&quot;#第一笔是路环那片温暾的旧色&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;穿过拱北口岸，午后的日光灿烂。我没有随着人流涌向大三巴，而是转身坐上了开往路环的25路巴士。&lt;/p&gt;&lt;p&gt;巴士缓慢地驶过澳门的老街。窗外的风景，像是翻阅一册褪色的杂志——骑楼下的茶餐厅，街角的小店，摩托在狭窄的巷弄里灵巧地穿行。巴士时停时走，车厢里满载着市井的嘈杂与生活的温度。我就这样靠在窗边，任车身轻轻摇晃，看一座城最平常的肌理在眼前缓缓流淌。&lt;/p&gt;&lt;p&gt;大约一小时后，路环到了。一下车，整个世界忽然安静下来。时间在这里失去了刻度，变得缓慢，湿润的海风拂面而来，那风里裹挟着旧日的气息——是咸涩的、属于渔港的味道，是阳光下晾晒的咸鱼散发的淡淡腥香，也是老房子墙皮剥落后，裸露出的水泥与岁月混合的气味。那一刻我知道，澳门的第一种颜色，就要在这座安静的小镇里。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/1.yf072qyL_Z1bEBGp.webp&quot; srcset=&quot;/_astro/1.yf072qyL_Z128n1E.webp 640w, /_astro/1.yf072qyL_1ub2Cn.webp 750w, /_astro/1.yf072qyL_Z1eR2xB.webp 828w, /_astro/1.yf072qyL_1os6xG.webp 1080w, /_astro/1.yf072qyL_Zbs0HF.webp 1280w, /_astro/1.yf072qyL_1YsqPk.webp 1668w, /_astro/1.yf072qyL_v1tJ3.webp 2048w, /_astro/1.yf072qyL_1PF4zA.webp 2560w, /_astro/1.yf072qyL_Z1bEBGp.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;沿着十月初五马路慢慢走，右手边是平静的海面，午后的阳光洒在水面上，泛起粼光，海面上泊着几条旧渔船；左手边是矮矮的彩房子，淡黄、浅绿、粉红，油漆在南方烈日下有些斑驳。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/2.rUM5Zpjq_Z2egRXj.webp&quot; srcset=&quot;/_astro/2.rUM5Zpjq_Z1ycI54.webp 640w, /_astro/2.rUM5Zpjq_X6GyX.webp 750w, /_astro/2.rUM5Zpjq_Z1KVnB1.webp 828w, /_astro/2.rUM5Zpjq_lPPgM.webp 1080w, /_astro/2.rUM5Zpjq_Z1e4gYz.webp 1280w, /_astro/2.rUM5Zpjq_VQayq.webp 1668w, /_astro/2.rUM5Zpjq_ZwzLwQ.webp 2048w, /_astro/2.rUM5Zpjq_N3NiG.webp 2560w, /_astro/2.rUM5Zpjq_Z2egRXj.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;一家小小的安德鲁饼店门口飘出蛋挞的甜香，巷子深处，晾晒的衣服在微风中轻轻晃动。这里没有高楼，没有喧嚣，只有老榕树的在墙上投下摇曳的影子。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/3.CkIJjZpG_Z1mwzt9.webp&quot; srcset=&quot;/_astro/3.CkIJjZpG_24CFtn.webp 640w, /_astro/3.CkIJjZpG_Ztf2Fw.webp 750w, /_astro/3.CkIJjZpG_1QT0Wq.webp 828w, /_astro/3.CkIJjZpG_1dA8KW.webp 1080w, /_astro/3.CkIJjZpG_ZmjXup.webp 1280w, /_astro/3.CkIJjZpG_1NAt3A.webp 1668w, /_astro/3.CkIJjZpG_k9vWj.webp 2048w, /_astro/3.CkIJjZpG_1EN6MQ.webp 2560w, /_astro/3.CkIJjZpG_Z1mwzt9.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;我走在海边，从路环码头经过，忽然觉得，这才是澳门最底层的颜色——像一块被岁月反复漂洗的棉布，纹理柔软，颜色淡净，包裹着这座城的余温。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/4.4ID2mHoi_Z1ngf5J.webp&quot; srcset=&quot;/_astro/4.4ID2mHoi_AxHvn.webp 640w, /_astro/4.4ID2mHoi_Z1Wk0Dw.webp 750w, /_astro/4.4ID2mHoi_nO2Yq.webp 828w, /_astro/4.4ID2mHoi_1cQt9m.webp 1080w, /_astro/4.4ID2mHoi_Zn3D70.webp 1280w, /_astro/4.4ID2mHoi_1MQNr0.webp 1668w, /_astro/4.4ID2mHoi_jpQkI.webp 2048w, /_astro/4.4ID2mHoi_1E4rbg.webp 2560w, /_astro/4.4ID2mHoi_Z1ngf5J.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第二笔，是挤在半岛老城里的、沉甸甸的褐黄色。&lt;/strong&gt;&lt;a href=&quot;#第二笔是挤在半岛老城里的沉甸甸的褐黄色&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;从路环乘坐巴士返回半岛，这似乎是游客更加熟悉的澳门。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/5.Dl9GXrli_ZF1Y1u.webp&quot; srcset=&quot;/_astro/5.Dl9GXrli_Z1F8GAi.webp 640w, /_astro/5.Dl9GXrli_QaI3J.webp 750w, /_astro/5.Dl9GXrli_Z1RRm7f.webp 828w, /_astro/5.Dl9GXrli_1U5JdB.webp 1080w, /_astro/5.Dl9GXrli_kaBWf.webp 1280w, /_astro/5.Dl9GXrli_2v64vf.webp 1668w, /_astro/5.Dl9GXrli_11E7oX.webp 2048w, /_astro/5.Dl9GXrli_2miHfv.webp 2560w, /_astro/5.Dl9GXrli_ZF1Y1u.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;我下车后，钻进了那些巷弄。不经意就撞见了圣母玫瑰堂。明快的鹅黄色外墙，在夕阳下显得格外温暖。走进去，光线顿时暗下来，烛火摇曳，空气中有淡淡的蜡和旧木的味道。那份宁静，与外头街市的吵闹只隔着一道门。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/6.ZRfCKygZ_EOD6A.webp&quot; srcset=&quot;/_astro/6.ZRfCKygZ_OAg1T.webp 640w, /_astro/6.ZRfCKygZ_Z1Ihs80.webp 750w, /_astro/6.ZRfCKygZ_BQAuW.webp 828w, /_astro/6.ZRfCKygZ_Z1OeLsf.webp 1080w, /_astro/6.ZRfCKygZ_1F2f5k.webp 1280w, /_astro/6.ZRfCKygZ_Z1eeraB.webp 1668w, /_astro/6.ZRfCKygZ_2mvJx3.webp 2048w, /_astro/6.ZRfCKygZ_Z1n1Nql.webp 2560w, /_astro/6.ZRfCKygZ_EOD6A.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;从教堂出来，在议事亭前地附近闲逛，脚下是波浪形的黑白碎石地，两旁是柠檬黄、浅粉的老建筑。&lt;/p&gt;&lt;p&gt;我沿着碎石路走向大三巴，人潮是免不了的，但那面著名的残壁，当真正立在它面前时，喧嚣似乎被滤掉了些。它像一页巨大的、残缺的史书，被火与时间烧成了褐黄色，那些石头的纹理，仿佛还留着历史的余温。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/7.C-So1Q0-_qgUlY.webp&quot; srcset=&quot;/_astro/7.C-So1Q0-_1t9bOa.webp 640w, /_astro/7.C-So1Q0-_Z14IwkJ.webp 750w, /_astro/7.C-So1Q0-_1gpwid.webp 828w, /_astro/7.C-So1Q0-_Z23MucQ.webp 1080w, /_astro/7.C-So1Q0-_1qtwkI.webp 1280w, /_astro/7.C-So1Q0-_Z1sM9Ud.webp 1668w, /_astro/7.C-So1Q0-_27X1Mr.webp 2048w, /_astro/7.C-So1Q0-_Z1BzwaW.webp 2560w, /_astro/7.C-So1Q0-_qgUlY.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;我绕过人群，从后面的小道上去，就是炮台山。这里清静得多。生了锈的火炮静默地对着远处的海与高楼。站在这里往下看，方才拥挤的大三巴，成了山下一隅。视野再放开，层层叠叠的老房子铺展开来，屋顶是各种深浅的褐与黄，其间夹杂着新绿的树冠。风从海上来，吹过炮台，也吹过底下无数小巷。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/8.C1c5Q_Mj_ZeefPo.webp&quot; srcset=&quot;/_astro/8.C1c5Q_Mj_1rPtap.webp 640w, /_astro/8.C1c5Q_Mj_Z162eYu.webp 750w, /_astro/8.C1c5Q_Mj_1f6NDs.webp 828w, /_astro/8.C1c5Q_Mj_2lSsoH.webp 1080w, /_astro/8.C1c5Q_Mj_KXl8l.webp 1280w, /_astro/8.C1c5Q_Mj_Z28il7A.webp 1668w, /_astro/8.C1c5Q_Mj_1srPA4.webp 2048w, /_astro/8.C1c5Q_Mj_Z2h5Hnk.webp 2560w, /_astro/8.C1c5Q_Mj_ZeefPo.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;这一片的颜色，是厚重的。它不是路环那种生活的淡彩，而是砖石、泥土、老木头，被几百年的风雨、香火、人烟浸润出的颜色。是圣保禄教堂一场大火后留下的焦黄，是教堂墙壁被岁月熏染的暖黄，也是炮台山体岩石本真的沉褐。它们挤在一起，诉说着碰撞、交融与坚守的往事。&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;9&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/9.CQqVYtRd_tTzNO.webp&quot; srcset=&quot;/_astro/9.CQqVYtRd_ZXOwsc.webp 640w, /_astro/9.CQqVYtRd_1xtSbP.webp 750w, /_astro/9.CQqVYtRd_Z1bybY9.webp 828w, /_astro/9.CQqVYtRd_Z209OK1.webp 1080w, /_astro/9.CQqVYtRd_1u7bMy.webp 1280w, /_astro/9.CQqVYtRd_Z1p9usn.webp 1668w, /_astro/9.CQqVYtRd_2bAGfh.webp 2048w, /_astro/9.CQqVYtRd_Z1xVQI7.webp 2560w, /_astro/9.CQqVYtRd_tTzNO.webp 6000w&quot; /&gt;&lt;figcaption&gt;9&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第三笔，是入夜后凼仔那片流光溢彩的金。&lt;/strong&gt;&lt;a href=&quot;#第三笔是入夜后凼仔那片流光溢彩的金&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当夜幕彻底垂下，我穿过跨海大桥，来到凼仔。眼前的景象瞬间切换。威尼斯人、巴黎人、伦敦人……那些庞大的建筑群通体发光，金色的灯光从里透到外，把夜空都映亮了。商场里运河蜿蜒，天花板上绘着永远的蓝天白云；赌场门口，人潮衣着光鲜，奔赴一个不眠的夜晚。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/10.C5-LAt9v_Zbnriq.webp&quot; srcset=&quot;/_astro/10.C5-LAt9v_Z1OkXVp.webp 640w, /_astro/10.C5-LAt9v_Z1Hgcqi.webp 750w, /_astro/10.C5-LAt9v_1BQEah.webp 828w, /_astro/10.C5-LAt9v_ae8Gl.webp 1080w, /_astro/10.C5-LAt9v_ZfPt8B.webp 1280w, /_astro/10.C5-LAt9v_Z15LLuz.webp 1668w, /_astro/10.C5-LAt9v_Q1RkA.webp 2048w, /_astro/10.C5-LAt9v_Z5aann.webp 2560w, /_astro/10.C5-LAt9v_Zbnriq.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;这金色是张扬的、流动的，充满欲望与活力。但奇怪的是，站在这片金色的森林里，我却没有迷失感。因为我知道，只要我愿意，半小时车程就能回到路环的宁静里，或者钻进半岛某条小巷。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;a href=&quot;#最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;回拱北的巴士上，穿行于澳门，这座城市的迷人，或许就在于这三原色从不混淆，却又如此紧密地挨在一起。路环的旧色是它的呼吸，老城的褐黄是它的筋骨与记忆，而凼仔的金色，是它面向世界的脸庞。它们不互相覆盖，只彼此映衬，让这座小小的城，有了说不尽的层次和故事。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Friendtastic! 港迪20周年之旅🏰✨</title><link>https://www.chaxuji.de/posts/hong-kong-disneyland-20th-anniversary/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/hong-kong-disneyland-20th-anniversary/</guid><description>今年一月初与女友一起前往香港迪士尼，刚好赶上20周年庆典！记录这次从珠海出发的梦幻之旅。</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;今年一月初，我和女友一起去了迪士尼乐园，刚好赶上了香港迪士尼20周年，来纪念一下这一次梦幻之旅！&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/1.BMf_mGvv_2lYaNe.webp&quot; srcset=&quot;/_astro/1.BMf_mGvv_2bXni8.webp 640w, /_astro/1.BMf_mGvv_ZlTkQL.webp 750w, /_astro/1.BMf_mGvv_1YeHLb.webp 828w, /_astro/1.BMf_mGvv_Z85eKB.webp 1080w, /_astro/1.BMf_mGvv_Z1I0m1X.webp 1280w, /_astro/1.BMf_mGvv_rU5w2.webp 1668w, /_astro/1.BMf_mGvv_Z11vQzf.webp 2048w, /_astro/1.BMf_mGvv_j7Igi.webp 2560w, /_astro/1.BMf_mGvv_2lYaNe.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;📅 行前准备：开园之前&lt;a href=&quot;#-行前准备开园之前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;门票与预约&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;香港迪士尼的门票价格会根据入院日期的客流量分为4个级别，我们这一次去是周中，也就是最便宜的第1级别票，淡季的迪士尼通常不需要提前购票，这一次的出行我是在到达乐园门口才在第三方平台上购票，在飞猪买的门票无需去官网预约，当场买当场刷二维码就可以入园了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;出行交通&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这一次前往港迪我们是从珠海出发，早上打车前往港珠澳大桥珠海公路口岸，在出境后即可乘坐穿梭巴士（金巴）前往香港了。&lt;/li&gt;
&lt;li&gt;在到达香港后再换乘B5公交车即可抵达迪士尼乐园。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;App&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以下载香港迪士尼官方App查看排队时间、地图、演出时间表等，不想错过20周年演出的小伙伴一定要下载，安卓需要在Play商店下载。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;物资准备&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;港迪还是有不少性价比较高的食物的，所以其实只要带些小零食和矿泉水就行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🏘️ 美国小镇大街&lt;a href=&quot;#️-美国小镇大街&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;设计原型为20世纪初美国市镇，展现煤气灯向电灯过渡、马车向汽车演变时期的复古景观。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/2.vTJJnvuw_1x5hp.webp&quot; srcset=&quot;/_astro/2.vTJJnvuw_1slvO1.webp 640w, /_astro/2.vTJJnvuw_Z15wckS.webp 750w, /_astro/2.vTJJnvuw_1fBQi4.webp 828w, /_astro/2.vTJJnvuw_Z2swkhq.webp 1080w, /_astro/2.vTJJnvuw_11JGg9.webp 1280w, /_astro/2.vTJJnvuw_Z1RvYYM.webp 1668w, /_astro/2.vTJJnvuw_1IebHR.webp 2048w, /_astro/2.vTJJnvuw_Z21jmfw.webp 2560w, /_astro/2.vTJJnvuw_1x5hp.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;入园之后的主干道两侧便是美国小镇大街，大街的两端分别是火车站和城堡，两侧则是各种纪念品商铺和小吃店，这里的食物相比其他主题园区的餐厅来说相对便宜一些，Main Street Bakery这家烘焙店的卷饼、三明治性价比很高，基本都在50-80港币，足够一个人吃饱了，如果没有自带干粮的话可以在这里吃。&lt;/p&gt;&lt;p&gt;一天有两场20周年“迪士尼好友巡游派对”花车巡游，会沿着城堡广场直到美国小镇大街的尽头，道路两侧的人相对广场较少，有更多机会和表演人员互动。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/3.DeGaGbdx_lKMSh.webp&quot; srcset=&quot;/_astro/3.DeGaGbdx_Z3cC4.webp 640w, /_astro/3.DeGaGbdx_2wgd1X.webp 750w, /_astro/3.DeGaGbdx_ZcLR91.webp 828w, /_astro/3.DeGaGbdx_Z28iBFy.webp 1080w, /_astro/3.DeGaGbdx_1lXoR1.webp 1280w, /_astro/3.DeGaGbdx_Z1xihnU.webp 1668w, /_astro/3.DeGaGbdx_23rTjJ.webp 2048w, /_astro/3.DeGaGbdx_Z1G5DDE.webp 2560w, /_astro/3.DeGaGbdx_lKMSh.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/4.CLNBjxjc_Z1pHWRB.webp&quot; srcset=&quot;/_astro/4.CLNBjxjc_1zvehQ.webp 640w, /_astro/4.CLNBjxjc_ZXmtR3.webp 750w, /_astro/4.CLNBjxjc_1mLyKT.webp 828w, /_astro/4.CLNBjxjc_1aoKmu.webp 1080w, /_astro/4.CLNBjxjc_ZpvlSR.webp 1280w, /_astro/4.CLNBjxjc_1Kp5E8.webp 1668w, /_astro/4.CLNBjxjc_gX8xQ.webp 2048w, /_astro/4.CLNBjxjc_1BBIoo.webp 2560w, /_astro/4.CLNBjxjc_Z1pHWRB.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/5.Cwx-w_xx_IgGsJ.webp&quot; srcset=&quot;/_astro/5.Cwx-w_xx_ZjkGTS.webp 640w, /_astro/5.Cwx-w_xx_2cXHJ9.webp 750w, /_astro/5.Cwx-w_xx_Zw4mqP.webp 828w, /_astro/5.Cwx-w_xx_Z1KMI66.webp 1080w, /_astro/5.Cwx-w_xx_1Itirt.webp 1280w, /_astro/5.Cwx-w_xx_Z1aMnNs.webp 1668w, /_astro/5.Cwx-w_xx_2pWMTc.webp 2048w, /_astro/5.Cwx-w_xx_Z1jzK4c.webp 2560w, /_astro/5.Cwx-w_xx_IgGsJ.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🎢  游乐项目&lt;a href=&quot;#--游乐项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;与上迪相比，港迪没有太多刺激项目，但是各种项目的小细节十分不错，而且淡季的排队时间很短，这里简单说一说我游玩的几个项目的个人体验，仅代表个人看法，大家可以做个参考。&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;蚁人与黄蜂女 ★&lt;/strong&gt;&lt;br /&gt;
坐在2人一辆的小车沿着固定轨道前进并朝着标靶射击，整体玩法比较一般，对于漫威IP的呈现还算不错，剧情和场景小细节处理的不错。淡季排队时间较短（&amp;lt;5min），淡季可以选择体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;铁甲奇侠飞行之旅 ★★&lt;/strong&gt;&lt;br /&gt;
钢铁侠IP的4D互动观影，内容和特效十分不错，会有一定的眩晕感，配音为粤语，怕晕的话建议不要和星战急速穿梭连着体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;星战急速穿梭 ★★★&lt;/strong&gt;&lt;br /&gt;
我认为港迪最刺激的过山车（港迪的项目普遍比较温和），以星球大战为主题的室内过山车，刺激来源在于全黑的环境下，突如其来的加速、急转与失重感。&lt;/li&gt;
&lt;li&gt;迷离大宅 ★★★&lt;br /&gt;
同样是乘坐轨道小车探索“恐怖别墅”，其实也只是对儿童有些恐怖，排队时间较长而且一大半时间都在闷闷的室内排队，排队体验较差，内容值得体验。&lt;/li&gt;
&lt;li&gt;灰熊山急速矿车 ★★★&lt;br /&gt;
又是一个刺激的高速过山车，有较强的失重感和突然的加速和后退，是港迪的最热门的项目，排队时间较长，建议想体验的可以早点去。&lt;/li&gt;
&lt;li&gt;小熊维尼历险之旅 ★&lt;br /&gt;
子供向项目，不过也算是回味童年IP了，乘坐轨道小车游览固定场景，互动较少。&lt;/li&gt;
&lt;li&gt;灰姑娘旋转木马 ★★&lt;br /&gt;
在旋转木马中相当不错，场景很出片，如果是双层就更好了，排队时间很短。&lt;/li&gt;
&lt;li&gt;魔雪奇幻之旅 ★★&lt;br /&gt;
作为近年来人气非常高的迪士尼公主IP，在Let it go的歌声中乘坐水上小船，其中有一段略有失重感的俯冲哦，项目本身值得体验，但是排队太久了。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/6.y9zDRmmr_ZAyLPt.webp&quot; srcset=&quot;/_astro/6.y9zDRmmr_1L8iQY.webp 640w, /_astro/6.y9zDRmmr_ZLJphU.webp 750w, /_astro/6.y9zDRmmr_1yoDl2.webp 828w, /_astro/6.y9zDRmmr_1YxVoC.webp 1080w, /_astro/6.y9zDRmmr_oCO8g.webp 1280w, /_astro/6.y9zDRmmr_Z2uCR7F.webp 1668w, /_astro/6.y9zDRmmr_167jzY.webp 2048w, /_astro/6.y9zDRmmr_2qKTqw.webp 2560w, /_astro/6.y9zDRmmr_ZAyLPt.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/7.CDuOpZ-Q_1aliBi.webp&quot; srcset=&quot;/_astro/7.CDuOpZ-Q_Z1huLlY.webp 640w, /_astro/7.CDuOpZ-Q_1eNDi3.webp 750w, /_astro/7.CDuOpZ-Q_Z1ueqRV.webp 828w, /_astro/7.CDuOpZ-Q_Z1jI6Wx.webp 1080w, /_astro/7.CDuOpZ-Q_2axTA2.webp 1280w, /_astro/7.CDuOpZ-Q_ZIHLET.webp 1668w, /_astro/7.CDuOpZ-Q_Z2d9ILb.webp 2048w, /_astro/7.CDuOpZ-Q_ZRv8UD.webp 2560w, /_astro/7.CDuOpZ-Q_1aliBi.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🎊 表演项目&lt;a href=&quot;#-表演项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;香港迪士尼的表演项目也非常不错，其中剧院表演对于大陆游客可能有点难以get到剧情，不过华丽的舞美就已经能让人沉浸于其中了。&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;迪士尼魔法书房 ★★★&lt;br /&gt;
一场非常棒的舞台剧，把迪士尼各大公主IP都串到一起，非常棒的舞台设计。&lt;/li&gt;
&lt;li&gt;米奇幻想曲 ★★&lt;br /&gt;
一场4D小电影，互动做的还不错。&lt;/li&gt;
&lt;li&gt;迪士尼好友Live：城堡派对 ★★★&lt;br /&gt;
港迪20周年限定表演，各大IP中的人物在迪士尼城堡前的舞台登台表演。&lt;/li&gt;
&lt;li&gt;迪士尼好友巡游派对 ★★★&lt;br /&gt;
全新的花车，新的主题曲，一次感动人心的体验！&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/8.BII_KmF5_2oOwER.webp&quot; srcset=&quot;/_astro/8.BII_KmF5_3XRK7.webp 640w, /_astro/8.BII_KmF5_Z2tSPoM.webp 750w, /_astro/8.BII_KmF5_Z8JLKP.webp 828w, /_astro/8.BII_KmF5_Z5eRSX.webp 1080w, /_astro/8.BII_KmF5_Z1Fa0ak.webp 1280w, /_astro/8.BII_KmF5_uKrnF.webp 1668w, /_astro/8.BII_KmF5_ZXFuHB.webp 2048w, /_astro/8.BII_KmF5_lX57V.webp 2560w, /_astro/8.BII_KmF5_2oOwER.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/9.Qi9R64wn_Z1K4PLj.webp&quot; srcset=&quot;/_astro/9.Qi9R64wn_ZydU4Q.webp 640w, /_astro/9.Qi9R64wn_1X5uzb.webp 750w, /_astro/9.Qi9R64wn_ZKWzAN.webp 828w, /_astro/9.Qi9R64wn_P2RsM.webp 1080w, /_astro/9.Qi9R64wn_ZJReMz.webp 1280w, /_astro/9.Qi9R64wn_1q3cKq.webp 1668w, /_astro/9.Qi9R64wn_Z3nJkQ.webp 2048w, /_astro/9.Qi9R64wn_1hfPuG.webp 2560w, /_astro/9.Qi9R64wn_Z1K4PLj.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🎆 星梦光影之旅&lt;a href=&quot;#-星梦光影之旅&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;迪士尼闭园前最棒的体验莫过于城堡烟花表演了，在港迪扩建城堡后这样的体验变得更令人难忘。20周年限定的星空派对表演还有无人机表演，城堡表面的投影等华丽演出。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/10.Cw9C4hx4_hC5Su.webp&quot; srcset=&quot;/_astro/10.Cw9C4hx4_9EMOQ.webp 640w, /_astro/10.Cw9C4hx4_gJzkX.webp 750w, /_astro/10.Cw9C4hx4_Z1tjGRo.webp 828w, /_astro/10.Cw9C4hx4_DeFSg.webp 1080w, /_astro/10.Cw9C4hx4_da43j.webp 1280w, /_astro/10.Cw9C4hx4_ZBLeiE.webp 1668w, /_astro/10.Cw9C4hx4_1k2pwv.webp 2048w, /_astro/10.Cw9C4hx4_nPmNx.webp 2560w, /_astro/10.Cw9C4hx4_hC5Su.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/11.DtLcXUuQ_SoGO7.webp&quot; srcset=&quot;/_astro/11.DtLcXUuQ_19Sw3j.webp 640w, /_astro/11.DtLcXUuQ_1gXiyq.webp 750w, /_astro/11.DtLcXUuQ_Zt5XDV.webp 828w, /_astro/11.DtLcXUuQ_1f1hNS.webp 1080w, /_astro/11.DtLcXUuQ_NVEXV.webp 1280w, /_astro/11.DtLcXUuQ_ZYCn2.webp 1668w, /_astro/11.DtLcXUuQ_1UO1s8.webp 2048w, /_astro/11.DtLcXUuQ_YBXJa.webp 2560w, /_astro/11.DtLcXUuQ_SoGO7.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;6000&quot; height=&quot;4000&quot; src=&quot;/_astro/12.hJMByx4O_ZHSoXD.webp&quot; srcset=&quot;/_astro/12.hJMByx4O_ZwkNHS.webp 640w, /_astro/12.hJMByx4O_Zpg2cL.webp 750w, /_astro/12.hJMByx4O_Z2akjq8.webp 828w, /_astro/12.hJMByx4O_ZmgNXR.webp 1080w, /_astro/12.hJMByx4O_ZMlqNO.webp 1280w, /_astro/12.hJMByx4O_Z1ChJaM.webp 1668w, /_astro/12.hJMByx4O_jvTEn.webp 2048w, /_astro/12.hJMByx4O_ZBF83A.webp 2560w, /_astro/12.hJMByx4O_ZHSoXD.webp 6000w&quot; /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;迪士尼是一个神奇的地方，我觉得如果一个乐园能够让所有年龄的人都快乐，那才算是最棒的乐园。20周年的香港迪士尼，可能没有最刺激的过山车，没有最华丽盛大的演出，但是当我13年后再一次来到这里，我似乎又能拥有13年前与爸爸一起来到这里时，那种孩童般的快乐和体验。那时的城堡很小，但带给我的快乐却是最纯粹的。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>「Done-Hub」解锁Gemini API白嫖新姿势</title><link>https://www.chaxuji.de/posts/Done-Hub/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/Done-Hub/</guid><description>谷歌收紧了API免费层级的用量之后，如何高效获取个人使用的Gemini API，不如看看从Gemini CLI、Antigravity逆向吧。</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Warning&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;我找到了跟好的方法，可以看看最新的文章&lt;a href=&quot;https://www.chaxuji.de/posts/cliproxyapi-octopus/&quot;&gt;&lt;strong&gt;「CLIProxyAPI × Octopus」API反代 &amp;amp; 集中管理&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Done-Hub 是基于 &lt;a href=&quot;https://github.com/MartialBE/one-api&quot; target=&quot;_blank&quot;&gt;one-hub&lt;/a&gt; 二次开发而来的 OpenAI 接口管理 &amp;amp; 分发系统。由于前段时间谷歌收紧了 API 免费层级的用量，导致原来一个账号创建多个 API Key 轮询使用 Gemini 2.5 Pro 的方式直接不可用了。虽然可以从谷大善人那里轻松获取到 Gemini Pro 的学生订阅，但是我还是更喜欢在 Cherry Studio 里直接调用 API。&lt;/p&gt;
&lt;p&gt;现在留给我们的选择只剩下了逆向 API 这一条路，目前我们可以通过各种大佬开源的项目从 Gemini CLI、AI Studio、Antigravity 中逆向出 API。而 Done-Hub 则很方便的集成了多种逆向 API，还提供了简单的 WEB UI 控制面板，并且支持 Docker 部署，那我们白嫖谷歌逆向的 Gemini 就十分方便了。下面来介绍一下我部署 Done-Hub，以及逆向和接入 API 的过程。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;快速部署&lt;a href=&quot;#快速部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Done-Hub 可以按照原版部署教程，只需要将镜像替换为 &lt;code&gt;deanxv/done-hub&lt;/code&gt; 即可，可以参考 &lt;a href=&quot;https://one-hub-doc.vercel.app/deployment/&quot; target=&quot;_blank&quot;&gt;部署说明 | One Hub 文档&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;由于我是个人使用，所有部署了最简单的 SQLite 数据库版本，如果你有更高的需求，你也可以部署 MySQL 或是 PostgreSQL 版本。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建文件夹&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建主目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/data/one-hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/data/one-hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建子目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;下载配置文件模板到子目录&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/MartialBE/one-api/main/config.example.yaml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./data/config.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在主目录创建 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;3.8&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;done-hub&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;deanxv/done-hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;done-hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&quot;3000:3000&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;TZ=Asia/Shanghai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;USER_TOKEN_SECRET=user_token_secret&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 填一个32位随机字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;SESSION_SECRET=session_secret&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 填一个32位随机字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;/data/one-hub:/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启动服务&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;访问 &lt;code&gt;IP:3000&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;root&lt;/code&gt; (默认密码：&lt;code&gt;123456&lt;/code&gt;) 登录。&lt;strong&gt;记得修改密码！！！&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用方式&lt;a href=&quot;#使用方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你可以在侧边栏的 &lt;strong&gt;渠道-创建渠道&lt;/strong&gt; 中，添加各类渠道或逆向 API：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Antigravity to API&lt;a href=&quot;#antigravity-to-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在渠道类型中选择 &lt;code&gt;Antigravity&lt;/code&gt;，并且在下方点击 &lt;strong&gt;Google OAuth 授权&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在弹出的窗口里授权，在最终回调失败的页面中将 &lt;code&gt;localhost:8080&lt;/code&gt; 改为 &lt;code&gt;done-hub&lt;/code&gt; 的域名，提示授权成功即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到 Done-Hub，我们可以发现已经自动填入了 Key。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加 &lt;code&gt;Antigravity&lt;/code&gt; 支持的模型，例如：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gemini-3-pro-high&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gemini-3-pro-low&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gemini-3-flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试通过后，即可正常使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Gemini CLI to API&lt;a href=&quot;#gemini-cli-to-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在渠道类型中选择 &lt;code&gt;GeminiCLI&lt;/code&gt;，并且在下方点击 &lt;strong&gt;Google OAuth 授权&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在弹出的窗口里授权，在最终回调失败的页面中将 &lt;code&gt;localhost:8080&lt;/code&gt; 改为 &lt;code&gt;done-hub&lt;/code&gt; 的域名，提示授权成功即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到 Done-Hub，我们可以发现已经自动填入了 Key。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加 &lt;code&gt;Gemini CLI&lt;/code&gt; 支持的模型，例如：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gemini-3-pro-preview&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试通过后，即可正常使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CodeX to API&lt;a href=&quot;#codex-to-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在渠道类型中选择 &lt;code&gt;Codex&lt;/code&gt;，并且在下方点击 &lt;strong&gt;OpenAI OAuth 授权&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在新打开的页面中登录 OpenAI 账户并同意授权。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;授权成功后，复制浏览器地址栏中的 &lt;strong&gt;完整 URL&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到 Done-Hub，将完整 URL 粘贴到下方输入框中，点击 “提交授权码”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加 &lt;code&gt;Codex&lt;/code&gt; 支持的模型，例如：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gpt-5.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gpt-5.2-codex&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试通过后，即可正常使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「我的博客」从Halo到Astro迁移记录</title><link>https://www.chaxuji.de/posts/halo_to_astro/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/halo_to_astro/</guid><description>本文记录了博客迁移记录：在使用一年后，我下定决心告别臃肿的Halo，从动态框架无缝迁移至高效的Astro静态博客，并实现无服务器部署，同时具备超快的访问速度。</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;1.为什么要更换博客框架&lt;a href=&quot;#1为什么要更换博客框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;Halo博客的痛点&lt;a href=&quot;#halo博客的痛点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;数据库：
由于Halo博客是一个动态的博客框架，依赖数据库，尽管提供了 PostgreSQL 这样高性能低占用选择，但对于我这类访问量低的博客来说，维护一个数据库多少有些得不偿失。&lt;/li&gt;
&lt;li&gt;资源占用：
Halo 博客基于 Java 构建，这使得它的内存占用较高，通常 docker + Halo本体 + 数据库差不多要占用500-700mb的内存，这还是 Halo 内存优化后的结果。如果按照我目前使用1Panel的部署方式，一台2g内存的服务器才能保证有一定的容量。&lt;/li&gt;
&lt;li&gt;备份困难：
Halo 提供了免费自动备份的插件，但是如果你想要异地自动备份则需要购买付费插件。&lt;/li&gt;
&lt;li&gt;难以应对多并发：
在itdog测试时，我发现我的博客基本无法抗住快速测试这样的多并发场景。&lt;/li&gt;
&lt;li&gt;网页加载速度与高成本：
由于是动态博客，在网页加载速度上有先天劣势，如果套CloudFlare的CDN且不做优选的话，加载速度是难以忍受的，而直连的香港服务器成本也相对较高。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;为什么选择Astro&lt;a href=&quot;#为什么选择astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;社区完善：
作为一个还算新兴的框架，Astro的社区目前已经非常完善，适合小白上手，提供了许多优秀的主题。而Hexo、Hugo这样的老框架虽然成熟但是明显在易用性上落后于Astro。&lt;/li&gt;
&lt;li&gt;无服务器：
静态站点最大的优点是无需服务器部署，可以自动化托管在诸多平台上，快速且安全，特别是之前的Next.JS漏洞让我意识到服务器存在许多风险，我其中一台就因为Umami被植入了挖矿病毒。&lt;/li&gt;
&lt;li&gt;文件路由：
Astro的文件路由我认为是十分优秀的，可以满足绝大部分需求。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;2.选择合适的主题&lt;a href=&quot;#2选择合适的主题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;之前在Halo中使用的是由 jiewenhuang 大佬移植的 Fuwari 主题，类似MD3的设计风格，简介流程，非常符合我的审美。&lt;/p&gt;&lt;a href=&quot;https://github.com/jiewenhuang/halo-theme-fuwari&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;jiewenhuang&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;halo-theme-fuwari&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;既然这次换成Astro，那就继续使用 Fuwari 主题，不过原版主题功能不够丰富，所以我选择了 CuteLeaf 大佬基于 Fuwari 主题二次开发的 Firefly 主题。&lt;/p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;saicaca&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;fuwari&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;CuteLeaf&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;Firefly&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;3.在本地安装Astro&lt;a href=&quot;#3在本地安装astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Firefly 主题的开发者们写了十分详细的文档，所以很轻松的搭建起了博客框架。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Firefly文档地址：****&lt;a href=&quot;https://docs-firefly.cuteleaf.cn/&quot; target=&quot;_blank&quot;&gt;https://docs-firefly.cuteleaf.cn/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h2&gt;3.1依赖安装&lt;a href=&quot;#31依赖安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 Node.js&lt;/p&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot;&gt;Node.js 官网&lt;/a&gt; 下载并安装最新版本的 Node.js。&lt;/p&gt;
&lt;p&gt;安装完成后，打开终端或命令提示符，运行以下命令验证 Node.js 是否安装成功：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 pnpm&lt;/p&gt;
&lt;p&gt;如果您尚未安装 pnpm，可以通过 npm 安装：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;安装完成后，打开终端或命令提示符，运行以下命令验证 pnpm 是否安装成功：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 Git&lt;/p&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://git-scm.com/downloads&quot; target=&quot;_blank&quot;&gt;Git 官网&lt;/a&gt; 下载并安装适合您操作系统的 Git 版本。&lt;/p&gt;
&lt;p&gt;安装完成后，打开终端或命令提示符，运行以下命令验证 Git 是否安装成功：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3.2项目启动步骤&lt;a href=&quot;#32项目启动步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆项目&lt;/p&gt;
&lt;p&gt;首先，Fork Firefly 项目并克隆到本地：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/you-github-name/Firefly.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Firefly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;p&gt;使用 pnpm 安装项目依赖：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动开发服务器&lt;/p&gt;
&lt;p&gt;运行以下命令启动开发服务器：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;4.文章迁移&lt;a href=&quot;#4文章迁移&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Halo的插件市场提供了&lt;a href=&quot;https://www.halo.run/store/apps/app-vWbpZ&quot; target=&quot;_blank&quot;&gt;文章导入导出插件&lt;/a&gt;，可以很方便的导出Halo文章为MD文件。&lt;/p&gt;&lt;a href=&quot;https://github.com/Lyn4ever29/halo-plugin-export-md&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Lyn4ever29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;halo-plugin-export-md&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;在Astro框架优秀的智能路由的加持下，我可以把博客目录结构整理的井井有条：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── content/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 2024/                &amp;lt;-- 年份文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── my-trip/         &amp;lt;-- 文章独立文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│       ├── index.md     &amp;lt;-- 文章内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│       └── photo.jpg    &amp;lt;-- 文章图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── 2023/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── old-post/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── index.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── cover.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;5.部署上线&lt;a href=&quot;#5部署上线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;既然选择了Astro框架，那肯定是选择无服务器部署，我选择了以CloudFlare Pages为主，Vercel、EdgeOne Pages为备用线路的部署形式。线路切换的功能来自二叉树树大佬的魔改版Fuwari主题：&lt;/p&gt;&lt;a href=&quot;https://github.com/afoim/fuwari&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;afoim&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;fuwari&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Waiting for api.github.com...&lt;/div&gt;&lt;div&gt;&lt;div&gt;00K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;div&gt;0K&lt;/div&gt;&lt;span&gt;Waiting...&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;section&gt;&lt;h2&gt;5.1 CloudFlare Pages 部署与优选&lt;a href=&quot;#51-cloudflare-pages-部署与优选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我选择 CloudFlare Pages 作为博客的主部署平台，原因在于Pages对免费用户提供了充足的用量：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;连接代码仓库：在 CloudFlare Dashboard 中进入 “Pages” 面板，选择 “创建项目”。直接连接到你的 GitHub仓库。&lt;/li&gt;
&lt;li&gt;构建配置：框架预设选择 Astro，Pages 服务会自动识别并填充正确的构建设置：&lt;/li&gt;
&lt;li&gt;构建命令：pnpm run build&lt;/li&gt;
&lt;li&gt;输出目录：dist&lt;/li&gt;
&lt;li&gt;部署：点击“保存并部署”。几分钟内，你的博客就会有一个 *.pages.dev 的临时域名。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;优选我参考的是这位大佬的教程：&lt;a href=&quot;https://blog.cmliussss.com/p/BestWorkers/&quot; target=&quot;_blank&quot;&gt;加速你的项目！详解 Cloudflare Workers &amp;amp; Pages 优选域名设置 | CMLiussss Blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Vercel和EdgeOne Pages的部署方式几乎一样，但要注意的是Vercel虽然无需优选就要很快的访问速度，但是免费额度较少，EdgeOne Pages我个人体验感觉不如CloudFlare Pages，所以都充当备用线路。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「LXD虚拟化」极限榨干！开设自己的LXC小鸡</title><link>https://www.chaxuji.de/posts/lxc/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/lxc/</guid><description>折腾一下，给自己开几台LXC小鸡玩玩。还可以看看一台内存仅有64mb的LXC小鸡有什么用。</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近买了一台RakSmart的美西1C1G VPS，年付只花了1.8刀，只可惜的年付，所以不准备在上面跑什么服务，放着吃灰了快半个月。在很多人眼里，这种配置除了挂个探针或者跑个简单的梯子，似乎难堪大用。&lt;/p&gt;
&lt;p&gt;不如来折腾一下，给自己开几台LXC小鸡玩玩。还可以看看一台内存仅有64mb的LXC小鸡有什么用。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;准备工作&lt;a href=&quot;#准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宿主机&lt;/strong&gt;：一台 Linux VPS（推荐 Debian 11/12 或 Ubuntu 20.04+），配置 1C1G 即可。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：开设数个 64MB 内存的 Alpine Linux 容器。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一步：重装并给服务器加上SWAP&lt;a href=&quot;#第一步重装并给服务器加上swap&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一台干净的宿主机十分关键，我们首先使用DD脚本来重装系统，这里使&lt;a href=&quot;https://github.com/bin456789/reinstall&quot; target=&quot;_blank&quot;&gt;bin456789&lt;/a&gt;大佬的DD脚本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载DD脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh&lt;/span&gt;&lt;span&gt; || &lt;/span&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;/span&gt;&lt;span&gt;##*/&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$_&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装Debian 12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reinstall.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;debian&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;1GB 内存非常紧张。为了防止某个容器突然发力导致宿主机内存溢出死机，我们必须配置虚拟内存，执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 创建一个 1GB 的 Swap 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fallocate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1G&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/swapfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/swapfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkswap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/swapfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;swapon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/swapfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 写入 fstab 实现开机自动挂载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;/swapfile none swap sw 0 0&apos;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;tee&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/fstab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 调整 Swappiness (倾向于使用物理内存，只有内存吃紧时才用 Swap)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sysctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vm.swappiness=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;vm.swappiness=10&apos;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt; &lt;/span&gt;&lt;span&gt;/etc/sysctl.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第二步：安装与配置 LXD&lt;a href=&quot;#第二步安装与配置-lxd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LXD 是管理 LXC 容器的「神器」，比原生的 LXC 命令更人性化。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 安装 LXD&lt;a href=&quot;#1-安装-lxd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这里推荐使用 Snap 安装，因为版本更新且兼容性好：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 确保 snapd 已安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 LXD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;snap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lxd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 将当前用户加入 lxd 组（如果是 root 操作可忽略，但建议执行）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adduser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lxd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 初始化 LXD（关键步骤！）&lt;a href=&quot;#2-初始化-lxd关键步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;执行初始化命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;⚠️ 注意： 在配置过程中，系统会问你使用什么存储后端 (Storage backend)。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;默认通常是 ZFS 或 Btrfs。&lt;/li&gt;
&lt;li&gt;但是在 1GB 内存机器上，请务必手动输入 &lt;code&gt;dir&lt;/code&gt; (Directory)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;：ZFS 的 ARC 缓存机制会占用大量内存，而 &lt;code&gt;dir&lt;/code&gt; 模式直接使用目录存储，虽然快照性能稍弱，但&lt;strong&gt;不额外占用内存&lt;/strong&gt;，这对小内存机器至关重要。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;
&lt;li&gt;Clustering? -&amp;gt; &lt;code&gt;no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New storage pool? -&amp;gt; &lt;code&gt;yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Name of storage pool? -&amp;gt; &lt;code&gt;default&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Name of the storage backend? -&amp;gt; &lt;code&gt;dir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a new MAAS server? -&amp;gt; &lt;code&gt;no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Network bridge? -&amp;gt; &lt;code&gt;yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Name of the bridge? -&amp;gt; &lt;code&gt;lxdbr0&lt;/code&gt; (默认即可)&lt;/li&gt;
&lt;li&gt;IPv4? -&amp;gt; &lt;code&gt;yes&lt;/code&gt; (auto)&lt;/li&gt;
&lt;li&gt;IPv6? -&amp;gt; &lt;code&gt;no&lt;/code&gt; (除非你需要)&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第三步：定制「64MB 迷你」配置文件&lt;a href=&quot;#第三步定制64mb-迷你配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们需要创建一个 Profile（配置文件模板），以后每次创建小鸡时套用这个模板，就能自动限制它的资源。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建名为 &lt;code&gt;mini&lt;/code&gt; 的配置：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mini&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 Profile：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mini&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;这会打开一个文本编辑器，请将内容修改为以下 YAML 配置：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;64MB Alpine Mini Server Profile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;devices&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;eth0&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;eth0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lxdbr0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;pool&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;disk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;limits.cpu&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;# 限制使用1个核心&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;limits.cpu.allowance&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20%&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# (可选) 限制最多占用20% CPU时间，防止卡死宿主&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;limits.memory&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;64MB&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# 硬性限制内存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;limits.memory.swap&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;false&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 禁止容器使用 Swap，逼迫其在64MB内运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;注：&lt;code&gt;limits.memory.swap: &quot;false&quot;&lt;/code&gt; 比较激进。如果你希望容器满了之后能借用一点宿主机的 Swap 防止崩溃，可以删除这一行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第四步：生产迷你小鸡&lt;a href=&quot;#第四步生产迷你小鸡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一切准备就绪，我们来启动第一台名为 &lt;code&gt;alpine01&lt;/code&gt; 的容器，使用 Alpine Edge 版本。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动容器，同时加载 default（网络）和 mini（资源限制）配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;images:alpine/edge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alpine01&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mini&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;images:alpine/edge&lt;/code&gt;: 使用 Alpine 的 Edge 版本（最新），也可以用 &lt;code&gt;images:alpine/3.18&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--profile default&lt;/code&gt;: 加载默认网络配置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--profile mini&lt;/code&gt;: 加载我们刚才设定的 64MB 限制。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证资源占用：运行 &lt;code&gt;lxc list&lt;/code&gt; 查看列表。 运行 &lt;code&gt;lxc info alpine01&lt;/code&gt; 查看具体资源使用。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;你应该能看到 &lt;code&gt;alpine01&lt;/code&gt; 正在运行，且拥有一个内网 IP（如 10.x.x.x）。&lt;/p&gt;&lt;p&gt;如果你想看看这个示例的资源消耗，这是 LXD 提供的原生监控命令，可以看到该容器实际消耗了宿主机多少资源。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alpine01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第五步：NAT 端口映射&lt;a href=&quot;#第五步nat-端口映射&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;由于宿主机只有一个公网 IP，我们需要通过端口转发来从外网访问这台小鸡。 假设我们将宿主机的 &lt;code&gt;10122&lt;/code&gt; 端口映射到 &lt;code&gt;alpine01&lt;/code&gt; 的 SSH 端口 &lt;code&gt;22&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alpine01&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssh-proxy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proxy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;listen=tcp:0.0.0.0:10122&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connect=tcp:127.0.0.1:22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第六步：配置容器内部环境&lt;a href=&quot;#第六步配置容器内部环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Alpine 默认非常精简，默认没有开启 SSH 远程登录，我们需要进去设置一下。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入容器 Shell：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入容器内部 Shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lxc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alpine01&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在容器内执行安装与配置：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ---- 以下在容器内执行 ----&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 安装 openssh (Alpine 默认可能是 dropbear，openssh 更习惯些)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openssh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rc-update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sshd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 允许 root 密码登录 (或者配置密钥，更安全)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;PermitRootLogin yes&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt; &lt;/span&gt;&lt;span&gt;/etc/ssh/sshd_config&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 设置 root 密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;passwd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# (输入你的密码)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 4. 启动 SSH&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/sshd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 退出容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;exit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;大功告成！ 现在，你可以通过你常用的 SSH 客户端连接你的迷你小鸡了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP&lt;/strong&gt;: 宿主机公网 IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: 10101&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: root&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结与玩法&lt;a href=&quot;#总结与玩法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 1C1G 的机器上，除去系统本身占用，你大约还有 700MB+ 的可用内存。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理论极限&lt;/strong&gt;：你可以开设 10 台 以上这样的 64MB 小鸡。&lt;/li&gt;
&lt;li&gt;能干什么？
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;集群测试&lt;/strong&gt;：模拟 Ansible 批量管理，测试 K3s (可能需要调大一点内存)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内网穿透节点&lt;/strong&gt;：运行 Frp 客户端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态网站&lt;/strong&gt;：每个小鸡跑一个 Nginx 托管静态 HTML，毫无压力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 脚本&lt;/strong&gt;：跑一些轻量的爬虫或监控脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>「WordPress」轻量部署：Caddy&amp;云数据库</title><link>https://www.chaxuji.de/posts/wordpress_caddy/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/wordpress_caddy/</guid><description>不在本地安装 MySQL，而是让 WordPress 连接到云端的 MySQL 。同时，为了解决远程数据库带来的网络延迟，我们将加入Redis作为缓存。</description><pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这一次我们来尝试些不一样的，有没有设想过如果你有一台配置较低的 VPS 例如 1C0.5G，这时候如果想体验完整的 WordPress，光是安装 MySQL 就有可能压垮这台 VPS，而近年来 Aiven 又提供了免费的 MySQL 数据库，为了使配置及占用简单到极致，我们还可以将 Nginx 换成 Caddy。当然最适合低配 VPS 的还是 Hexo、Hugo 等静态站点，写本文纯粹是为了折腾和验证这套方案的可行性，玩玩就行，可千万不要作为实际生产哦！&lt;/p&gt;
&lt;p&gt;部署后内存（含系统）占用 200mb，迷你小鸡也可以尝试 WordPress！&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;Caddy 2 + WordPress + Aiven (MySQL) + Redis 极简部署指南&lt;a href=&quot;#caddy-2--wordpress--aiven-mysql--redis-极简部署指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;核心优势&lt;a href=&quot;#核心优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极低负载&lt;/strong&gt;：VPS 不需要运行最吃内存的 MySQL 进程，1C1G 的机器跑 PHP-FPM + Caddy 绰绰有余。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caddy 加持&lt;/strong&gt;：配置比 Nginx 简单十倍，自动续签 HTTPS。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;前置准备&lt;a href=&quot;#前置准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;服务器&lt;/strong&gt;：Debian 11 或其他主流 Linux 发行版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名&lt;/strong&gt;：已解析到服务器 IP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aiven 账号&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;注册并创建一个 &lt;strong&gt;Free Tier MySQL&lt;/strong&gt; 服务。&lt;/li&gt;
&lt;li&gt;获取连接信息：&lt;code&gt;Host&lt;/code&gt; (地址), &lt;code&gt;Port&lt;/code&gt; (端口), &lt;code&gt;User&lt;/code&gt; (通常是 avnadmin), &lt;code&gt;Password&lt;/code&gt;, &lt;code&gt;Database&lt;/code&gt; (通常是 defaultdb)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：Aiven 强制要求 SSL 连接，WordPress 需要开启相关配置（下文会讲）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;WordPress 本体安装&lt;a href=&quot;#wordpress-本体安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第一步：系统更新与基础环境&lt;/strong&gt;&lt;a href=&quot;#第一步系统更新与基础环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先确保系统干净且最新。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gnupg2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第二步：安装 PHP 及 MySQL 驱动&lt;/strong&gt;&lt;a href=&quot;#第二步安装-php-及-mysql-驱动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;推荐使用 &lt;strong&gt;PHP 8.2&lt;/strong&gt;，它比旧版本性能更好且支持现代特性（Debian 12 默认源即包含此版本）。安装 &lt;code&gt;php8.2-mysql&lt;/code&gt; 以连接数据库。由于没有本地数据库，PHP 及其扩展占用的资源非常少，同时安装 &lt;code&gt;php-redis&lt;/code&gt; 备用。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加 PHP 8.2 软件源&lt;/strong&gt;
首先安装必要的依赖并添加 GPG 密钥和仓库地址：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新系统并安装添加源所需的工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lsb-release&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ca-certificates&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-transport-https&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;software-properties-common&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gnupg2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加 Sury PHP 源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;deb https://packages.sury.org/php/ $(&lt;/span&gt;&lt;span&gt;lsb_release&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sc&lt;/span&gt;&lt;span&gt;) main&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;tee&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/sury-php.list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 导入 GPG 密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://packages.sury.org/php/apt.gpg&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;gpg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dearmor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/trusted.gpg.d/sury-keyring.gpg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新源列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装 PHP 8.2 及其必要扩展&lt;/strong&gt;
现在可以直接指定版本号进行安装：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 PHP 及其必要扩展&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-fpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-mysql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-gd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-imagick&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-mbstring&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-zip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php8.2-intl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;php-redis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键检查&lt;/strong&gt;：
确认 PHP-FPM 运行状态及 Socket 路径（Caddy 需要用）：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;/run/php/php8.2-fpm.sock&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/run/php/php8.2-fpm.sock&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第三步：安装 Caddy 2 Web 服务器&lt;/strong&gt;&lt;a href=&quot;#第三步安装-caddy-2-web-服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Caddy 会自动为你申请和续期 SSL 证书。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加官方源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;debian-keyring&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;debian-archive-keyring&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-transport-https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-1sLf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;gpg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dearmor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/share/keyrings/caddy-stable-archive-keyring.gpg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-1sLf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;tee&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/caddy-stable.list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第四步：部署 WordPress&lt;a href=&quot;#第四步部署-wordpress&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载并解压&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://wordpress.org/latest.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-xzvf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;latest.tar.gz&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--strip-components=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;latest.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第五步：配置 wp-config.php 连接 Supabase&lt;/strong&gt;&lt;a href=&quot;#第五步配置-wp-configphp-连接-supabase&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是最关键的一步。Aiven 是远程数据库，且强制 SSL，我们需要配置 WordPress 以支持 SSL 连接。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;复制配置样本&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wp-config-sample.php&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wp-config.php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编辑配置文件&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wp-config.php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;填入 Aiven 信息&lt;/strong&gt;：
找到数据库定义部分，替换为以下内容（请对照 Aiven 控制台填写）：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// --- Aiven MySQL 配置开始 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_NAME&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;defaultdb&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// Aiven 免费版默认库名通常是 defaultdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_USER&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;avnadmin&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 默认用户名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_PASSWORD&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;你的Aiven强密码&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 注意：端口通常不是 3306，请仔细检查 Aiven 提供的 Host 和 Port&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_HOST&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;mysql-xxxxxxxx.aivencloud.com:端口号&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_CHARSET&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf8&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;DB_COLLATE&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// --- 关键：开启 SSL 连接 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Aiven 强制 SSL，这一行必须加，否则连不上&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;MYSQL_CLIENT_FLAGS&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;MYSQLI_CLIENT_SSL&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// --- 配置结束 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// --- Redis 配置 (预埋，如果使用了Redis插件) ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;WP_CACHE&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生成安全密钥&lt;/strong&gt;：
访问 &lt;a href=&quot;https://api.wordpress.org/secret-key/1.1/salt/&quot; target=&quot;_blank&quot;&gt;WordPress Salt Generator&lt;/a&gt;，将生成的内容覆盖配置文件中的 &lt;code&gt;AUTH_KEY&lt;/code&gt; 等部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保存并退出&lt;/strong&gt; (&lt;code&gt;Ctrl+O&lt;/code&gt; -&amp;gt; &lt;code&gt;Enter&lt;/code&gt; -&amp;gt; &lt;code&gt;Ctrl+X&lt;/code&gt;)。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第六步：权限修正&lt;/strong&gt;&lt;a href=&quot;#第六步权限修正&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这步如果不做，你将无法上传图片，也无法安装插件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-R&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;www-data:www-data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-R&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;755&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;第七步：配置 Caddy 站点&lt;/strong&gt;&lt;a href=&quot;#第七步配置-caddy-站点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编辑 Caddy 配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;清空原内容，填入以下内容（&lt;strong&gt;替换你的域名&lt;/strong&gt;）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;blog.example.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 网站根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root * /var/www/wordpress&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 启用 Gzip 压缩&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;encode gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# PHP 处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;php_fastcgi unix//run/php/php8.2-fpm.sock&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 静态文件服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;file_server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 简单的日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;log {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output file /var/log/caddy/wordpress.log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;重启 Caddy：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;现在，打开浏览器访问你的域名，你应该能直接看到 WordPress 的语言选择界面。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;配置 Redis 本地缓存&lt;a href=&quot;#配置-redis-本地缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;因为数据库在云端（虽然 Aiven 很快，但毕竟有网络延迟），每次打开网页都要去云端查数据太慢了。Redis 能把查到的数据&lt;strong&gt;缓存在 VPS 本地内存&lt;/strong&gt;里，下一个人访问时直接从本地内存读，速度会有质的飞跃。&lt;/p&gt;&lt;p&gt;为了防止 Redis 把内存吃光导致死机，需要进行一点“微调”。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第一步：安装 Redis 服务端&lt;a href=&quot;#第一步安装-redis-服务端&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;虽然我们在第一步里安装了 &lt;code&gt;php-redis&lt;/code&gt;（这是 PHP 和 Redis 对话的驱动），但我们还没安装 Redis &lt;strong&gt;本体&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：配置 Redis（防爆内存关键步骤）&lt;a href=&quot;#第二步配置-redis防爆内存关键步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;这一步非常重要！&lt;/strong&gt; 默认的 Redis 可能会吃光你的内存。要限制它最多只能用一小部分内存（比如 128MB，对 WordPress 对象缓存绰绰有余）。&lt;/p&gt;&lt;p&gt;编辑配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/redis/redis.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;按 &lt;code&gt;Ctrl + W&lt;/code&gt; 搜索配置项，修改（或在文件末尾添加）以下两行：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;限制内存&lt;/strong&gt;：
找到 &lt;code&gt;maxmemory&lt;/code&gt;（默认通常是被注释的），去掉 &lt;code&gt;#&lt;/code&gt; 并改为：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;maxmemory 128mb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(对于 0.5G 内存的 VPS，给 Redis 128MB 足够缓存成千上万个对象了)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设置淘汰策略&lt;/strong&gt;：
当内存满了怎么办？我们要让它自动删除最旧的缓存。找到 &lt;code&gt;maxmemory-policy&lt;/code&gt;，改为：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;maxmemory-policy allkeys-lru&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;保存并退出 (&lt;code&gt;Ctrl+O&lt;/code&gt; -&amp;gt; &lt;code&gt;Enter&lt;/code&gt; -&amp;gt; &lt;code&gt;Ctrl+X&lt;/code&gt;)。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：重启 Redis 并开机自启&lt;a href=&quot;#第三步重启-redis-并开机自启&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;检查是否运行正常（应该显示 Active: active (running)）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(按&lt;/em&gt; &lt;code&gt;q&lt;/code&gt; &lt;em&gt;退出查看)&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第四步：在 WordPress 中启用缓存&lt;a href=&quot;#第四步在-wordpress-中启用缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;现在后端准备好了，我们需要告诉 WordPress 去使用它。推荐使用业内最标准的插件：&lt;strong&gt;Redis Object Cache&lt;/strong&gt;。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;登录 WordPress 后台。&lt;/li&gt;
&lt;li&gt;进入 &lt;code&gt;插件&lt;/code&gt; -&amp;gt; &lt;code&gt;安装插件&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;Redis Object Cache&lt;/code&gt; (作者是 Till Krüss)。&lt;/li&gt;
&lt;li&gt;安装并启用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键一步&lt;/strong&gt;：启用后，点击插件界面的 &lt;strong&gt;“Enable Object Cache”&lt;/strong&gt; 按钮。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第五步：验证是否生效&lt;a href=&quot;#第五步验证是否生效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;看状态&lt;/strong&gt;：
在 WordPress 后台，点击 &lt;code&gt;设置&lt;/code&gt; -&amp;gt; &lt;code&gt;Redis&lt;/code&gt;。 你应该看到 &lt;strong&gt;Status: Connected&lt;/strong&gt;，并且下面的 &lt;strong&gt;Key&lt;/strong&gt; 和 &lt;strong&gt;Memory&lt;/strong&gt; 数据应该会有变化（不再是 0）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;看速度&lt;/strong&gt;：
随意点击几个后台页面或前台文章。你会发现，第一次点可能稍微卡顿（因为在写入缓存），但第二次点击同样的页面，几乎是&lt;strong&gt;秒开&lt;/strong&gt;，因为此时不需要去 Aiven 远程读数据库了，直接从本地内存读取。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「PicImpact」更易用的自托管个人相册&amp;画廊</title><link>https://www.chaxuji.de/posts/picImpact/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/picImpact/</guid><description>PicImpact 是一个支持自部署的摄影师专用的摄影作品展示网站。本文介绍了使用Docker Compose部署PicImpact，并配置存储。</description><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;其实很早之前就已经了解到了这个项目，也试用过一段时间，当时这个项目还不够完善，最后还是选择了&lt;a href=&quot;https://github.com/sambecker/exif-photo-blog&quot; target=&quot;_blank&quot;&gt;exif-photo-blog&lt;/a&gt;这个项目来作为个人相册。但是现在&lt;a href=&quot;https://github.com/besscroft/PicImpact&quot; target=&quot;_blank&quot;&gt;PicImpact&lt;/a&gt;已经迭代的非常出色了，且我在使用&lt;a href=&quot;https://github.com/sambecker/exif-photo-blog&quot; target=&quot;_blank&quot;&gt;exif-photo-blog&lt;/a&gt;项目的过程中遇到一些棘手的问题让我决定将个人相册迁移到&lt;a href=&quot;https://github.com/besscroft/PicImpact&quot; target=&quot;_blank&quot;&gt;PicImpact&lt;/a&gt;。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Exif-Photo-Blog带来的一些问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;没有提供docker部署方式，这就让迁移变得困难&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目前只提供了Vercel一键部署方式，但Vercel免费计划提供的额度不足以支撑相册的高频访问&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vercel部署强烈依赖在线数据库，我想要完全私有&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vercel部署的Exif-Photo-Blog在中国访问体验较差&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;p&gt;迫于这些问题我在很长一段时间内没有更新个人相册，趁着这段时间较为空闲，加上我购置了新的服务器。于是一不做二不休，干脆把个人相册迁移到&lt;a href=&quot;https://github.com/besscroft/PicImpact&quot; target=&quot;_blank&quot;&gt;PicImpact&lt;/a&gt;，以下是我的折腾过程。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;准备工作&lt;a href=&quot;#准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;虽然&lt;a href=&quot;https://github.com/besscroft/PicImpact&quot; target=&quot;_blank&quot;&gt;PicImpact&lt;/a&gt;同样支持Vercel一键部署，但我更推荐你使用Docker Compose。你需要提前准备的有：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;一台服务器（该项目占用较少，1C1G足以）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;已经安装了Docker Compose&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;已经安装了PostgresSQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对象存储（AWS S3，CF R2等）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;现在开始&lt;a href=&quot;#现在开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;创建配置文件​&lt;a href=&quot;#创建配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建一个新的文件夹来存放项目，例如 picimpact​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在该文件夹中，创建一个名为 docker-compose.yml​ 的文件&lt;br /&gt;
​docker-compose.yml​ 的内容如下：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;picimpact&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;picimpact&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATABASE_URL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;postgresql&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//[用户名]:[密码]@[地址和端口]/[数据库]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DIRECT_URL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;postgresql&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//[用户名]:[密码]@[地址和端口]/[数据库]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BETTER_AUTH_SECRET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;自己运行npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;secret或一串随机的字符串都行&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;besscroft&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;picimpact&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;latest&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;: {}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置环境变量&lt;/p&gt;
&lt;blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;将 [用户名]​ 替换为您的数据库用户名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将 [密码]​ 替换为您的数据库密码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将 [地址和端口]​ 替换为数据库服务器的 IP 地址或域名及端口号（例如 192.168.1.10:5432​ 或 db.example.com:5432​）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将 [数据库]​ 替换为您要使用的数据库名称。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在您的终端中运行 openssl rand -base64 32​ 生成一个随机字符串，并填入BETTER_AUTH_SECRET​&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;启动服务&lt;a href=&quot;#启动服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用 cd​ 命令进入您创建 docker-compose.yml​ 文件的文件夹&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行以下命令来启动服务：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开浏览器，访问http://&amp;lt;您的服务器IP&amp;gt;:3000​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注册并登录&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;配置对象存储&lt;a href=&quot;#配置对象存储&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;我选择使用c作为对象存储，如果你有其他选择，请参考&lt;a href=&quot;https://pic-docs.ziyume.com/docs/pic/basic/storages&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;​r2_accesskey_id​：Cloudflare AccessKey_ID&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​r2_accesskey_secret​：Cloudflare AccessKey_Secret&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​r2_account_id​：Cloudflare ACCOUNT_ID，也就是 https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com​&lt;br /&gt;
​&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1860&quot; height=&quot;1329&quot; src=&quot;/_astro/1.BZ7dkBSI_Zno357.webp&quot; srcset=&quot;/_astro/1.BZ7dkBSI_1AabsQ.webp 640w, /_astro/1.BZ7dkBSI_FkAzc.webp 750w, /_astro/1.BZ7dkBSI_Z19IzVQ.webp 828w, /_astro/1.BZ7dkBSI_1qsHH8.webp 1080w, /_astro/1.BZ7dkBSI_ZSCdzS.webp 1280w, /_astro/1.BZ7dkBSI_ZBDIPN.webp 1668w, /_astro/1.BZ7dkBSI_Zno357.webp 1860w&quot; /&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​r2_bucket​：Cloudflare Bucket 存储桶名称，如：picimpact​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​r2_storage_folder​：存储文件夹(Cloudflare R2)，严格格式，如：picimpact​ 或 picimpact/images​ ，填 /​ 或者不填表示根路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​r2_public_domain​：Cloudflare R2 自定义域（公开访问）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;​&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1869&quot; height=&quot;798&quot; src=&quot;/_astro/2.B1V9DQAd_Z15Kcs9.webp&quot; srcset=&quot;/_astro/2.B1V9DQAd_Z2rFlDb.webp 640w, /_astro/2.B1V9DQAd_Z1tbcVg.webp 750w, /_astro/2.B1V9DQAd_Z1EjCAT.webp 828w, /_astro/2.B1V9DQAd_ZehgAK.webp 1080w, /_astro/2.B1V9DQAd_UVFn3.webp 1280w, /_astro/2.B1V9DQAd_fDYvN.webp 1668w, /_astro/2.B1V9DQAd_Z15Kcs9.webp 1869w&quot; /&gt;​&lt;/p&gt;&lt;p&gt;修改Cloudflare R2跨域配置&lt;/p&gt;&lt;p&gt;​&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;294&quot; src=&quot;/_astro/3.DKYxbs8t_ZnviOb.webp&quot; srcset=&quot;/_astro/3.DKYxbs8t_TmG7S.webp 640w, /_astro/3.DKYxbs8t_Zaa40m.webp 750w, /_astro/3.DKYxbs8t_Z2nLzVC.webp 828w, /_astro/3.DKYxbs8t_ZeSDiy.webp 1080w, /_astro/3.DKYxbs8t_ZnviOb.webp 1200w&quot; /&gt;​&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;AllowedOrigins&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;AllowedMethods&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;GET&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;PUT&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;POST&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;DELETE&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;AllowedHeaders&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;ExposeHeaders&quot;: [],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;MaxAgeSeconds&quot;: 3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;压缩图片并上传&lt;a href=&quot;#压缩图片并上传&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;为了减轻存储压力，并优化访问速度，我们需要对上传的照片进行压缩处理，我这里使用的是开源图片压缩工具&lt;a href=&quot;https://github.com/AkiraBit/PicSharp&quot; target=&quot;_blank&quot;&gt;PicSharp&lt;/a&gt;，配合&lt;a href=&quot;https://tinypng.com/developers&quot; target=&quot;_blank&quot;&gt;TinyPNG&lt;/a&gt;的API将图片压缩为WebP进行上传。&lt;/p&gt;&lt;p&gt;​&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1535&quot; height=&quot;1005&quot; src=&quot;/_astro/4.Dk3faRuy_ZnvtrI.webp&quot; srcset=&quot;/_astro/4.Dk3faRuy_ZryuDy.webp 640w, /_astro/4.Dk3faRuy_84cr9.webp 750w, /_astro/4.Dk3faRuy_tJP0I.webp 828w, /_astro/4.Dk3faRuy_ZOShhx.webp 1080w, /_astro/4.Dk3faRuy_Z2pFjzk.webp 1280w, /_astro/4.Dk3faRuy_ZnvtrI.webp 1535w&quot; /&gt;​&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1535&quot; height=&quot;1005&quot; src=&quot;/_astro/5.Rj-yJLRH_Z1EHKVn.webp&quot; srcset=&quot;/_astro/5.Rj-yJLRH_NWJP5.webp 640w, /_astro/5.Rj-yJLRH_1oArUM.webp 750w, /_astro/5.Rj-yJLRH_1Kh5um.webp 828w, /_astro/5.Rj-yJLRH_Z275yLc.webp 1080w, /_astro/5.Rj-yJLRH_1njwJW.webp 1280w, /_astro/5.Rj-yJLRH_Z1EHKVn.webp 1535w&quot; /&gt;&lt;/p&gt;&lt;p&gt;​&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「Gemini-Balance」搭建高可用API Key轮询工具</title><link>https://www.chaxuji.de/posts/gemini-balance/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/gemini-balance/</guid><description>Gemini-Balance是一个开源代理，通过负载均衡多个Key解决Gemini速率限制，并兼容OpenAI API，使其能接入现有工具生态。</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Warning&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;目前谷歌以及收缩了Gemini API的免费层级，可以看看最新的文章&lt;a href=&quot;https://www.chaxuji.de/posts/Done-Hub/&quot;&gt;&lt;strong&gt;「Done-Hub」解锁Gemini API白嫖新姿势&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;写在前面&lt;a href=&quot;#写在前面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;自 Google 发布其强大的大型语言模型 Gemini 以来，Gemini API 凭借其出色的多模态能力和慷慨的免费额度，每个API每天可以提供100次Gemini 2.5 Pro 这样的顶级大模型的调用。对于简单的对话而言，这样的免费额度已经足够使用，但在更深入的实际应用中，我们常常会遇到一些棘手的问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单一 API Key 的速率限制：免费的 Gemini API Key 有每分钟请求次数（RPM）的限制，一旦流量稍大，应用就可能陷入瘫痪。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多 Key 管理的复杂性：为了绕过限制，我们可能会注册多个 Key，但在代码中手动管理和轮询这些 Key 非常繁琐且容易出错。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生态工具的兼容性：许多 LLM 应用和客户端都是围绕 OpenAI 的 API 格式设计的，无法直接使用 Gemini API。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网络环境的挑战：在某些网络环境下，直接访问 Google API 可能会遇到困难。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而开源项目&lt;a href=&quot;https://github.com/snailyp/gemini-balance&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;snailyp/gemini-balance​&lt;/strong&gt;&lt;/a&gt;能够轻松解决以上痛点，它是一个为 Gemini API 设计的轮询代理和负载均衡服务，它的核心使命是简化 Gemini API 的使用，让开发者能够像使用一个“超级API”一样，轻松、高效、稳定地调用 Gemini 的强大能力。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1905&quot; height=&quot;1485&quot; src=&quot;/_astro/1.CcHPj8Ho_Z1wXdBv.webp&quot; srcset=&quot;/_astro/1.CcHPj8Ho_Z1CJ8oW.webp 640w, /_astro/1.CcHPj8Ho_1HwNnU.webp 750w, /_astro/1.CcHPj8Ho_64ODQ.webp 828w, /_astro/1.CcHPj8Ho_2gbep3.webp 1080w, /_astro/1.CcHPj8Ho_Z1V8B0q.webp 1280w, /_astro/1.CcHPj8Ho_1TWjMO.webp 1668w, /_astro/1.CcHPj8Ho_Z1wXdBv.webp 1905w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;核心优势&lt;a href=&quot;#核心优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;1. 多 API Key 管理与负载均衡&lt;a href=&quot;#1-多-api-key-管理与负载均衡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;这是项目的核心功能，它能够为你创建一个 API Key 池。当收到请求时，它会采用轮询策略，依次使用池中的 Key 来处理请求。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;突破速率限制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提高可用性&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 无缝兼容 OpenAI API 格式&lt;a href=&quot;#2-无缝兼容-openai-api-格式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;它可以将标准的 OpenAI Chat API 请求格式实时转换为 Gemini API 所需的格式，并将 Gemini 的响应再转换回 OpenAI 的格式。&lt;/p&gt;&lt;p&gt;能够完美兼容以下核心 OpenAI API 端点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;​&lt;code&gt;POST /v1/chat/completions&lt;/code&gt;​：核心的聊天接口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;​POST /v1/embeddings&lt;/code&gt;​：文本嵌入接口，你可以用 Gemini 的模型来生成向量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;code&gt;POST /v1/images/generations​&lt;/code&gt;：图像生成接口，它巧妙地将 Gemini 的图像模型适配成了 OpenAI 的调用方式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 强大的功能扩展&lt;a href=&quot;#3-强大的功能扩展&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;​gemini-balance​ 不仅仅是一个代理，它还解锁了 Gemini 的许多高级功能。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;图文聊天与修改：通过在配置中指定支持图像的模型（如 gemini-pro-vision​），你可以轻松构建能够理解和处理图片的多模态应用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网页搜索：通过配置 SEARCH_MODELS​，你可以让 Gemini 模型拥有联网搜索的能力，从而回答关于最新事件的问题，获取实时信息。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1639&quot; height=&quot;1276&quot; src=&quot;/_astro/2.AfrJr5mB_2wGjDs.webp&quot; srcset=&quot;/_astro/2.AfrJr5mB_ZyQjOH.webp 640w, /_astro/2.AfrJr5mB_Z2iLvPL.webp 750w, /_astro/2.AfrJr5mB_zV8CY.webp 828w, /_astro/2.AfrJr5mB_ZlQzoR.webp 1080w, /_astro/2.AfrJr5mB_w0HYA.webp 1280w, /_astro/2.AfrJr5mB_2wGjDs.webp 1639w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1650&quot; height=&quot;1481&quot; src=&quot;/_astro/3.99dtXk4L_exEm2.webp&quot; srcset=&quot;/_astro/3.99dtXk4L_2pRs2d.webp 640w, /_astro/3.99dtXk4L_1uTM9Y.webp 750w, /_astro/3.99dtXk4L_2qtPl6.webp 828w, /_astro/3.99dtXk4L_OiAkK.webp 1080w, /_astro/3.99dtXk4L_1V7jsd.webp 1280w, /_astro/3.99dtXk4L_exEm2.webp 1650w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. 自动化、安全与监控&lt;a href=&quot;#4-自动化安全与监控&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;自动模型列表：你无需手动跟踪 Gemini 发布了哪些新模型，服务会自动从 Google 获取并同步最新的可用模型列表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理支持：如果你处于特殊的网络环境中，可以通过配置 PROXIES​ 环境变量，让 gemini-balance​ 通过 HTTP 或 SOCKS5 代理来访问 Google 服务器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问认证：你可以通过设置 AUTH_KEYS​ 环境变量，为你的代理服务设置一个或多个访问密码，防止其被未授权的用户滥用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状态监控：项目提供了一个接口，可以让你实时查看每个 API Key 的当前状态，方便排查问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;实战指南&lt;a href=&quot;#实战指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;得益于 Docker，部署 gemini-balance​ 变得异常简单。在本次部署中，为了应对简单的生产环境，我们不使用资源占用过高的MySQL作为数据库服务，而是使用更加轻量便捷的SQ Lite。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;步骤 1: 创建配置文件&lt;a href=&quot;#步骤-1-创建配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;首先，创建一个文件夹，并在其中创建两个文件：&lt;code&gt;docker-compose.yml&lt;/code&gt;​ 和 &lt;code&gt;.env&lt;/code&gt;​。&lt;/p&gt;&lt;p&gt;&lt;code&gt;​docker-compose.yml​&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version: &apos;3.8&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;volumes:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sqlite_data:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gemini-balance:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image: ghcr.io/snailyp/gemini-balance:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;container_name: gemini-balance&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;restart: unless-stopped&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ports:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;8000:8000&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env_file:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- .env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- DATABASE_TYPE=sqlite&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- SQLITE_DATABASE=/app/data/default_db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;volumes:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- sqlite_data:/app/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;healthcheck:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test: [&quot;CMD-SHELL&quot;, &quot;python -c \&quot;import requests; exit(0) if requests.get(&apos;http://localhost:8000/health&apos;).status_code == 200 else exit(1)\&quot;&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;interval: 30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;timeout: 5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retries: 3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start_period: 10s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;​.env​&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这是你的核心配置文件。从项目官网的 .env.example 复制内容并进行修改。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;数据库配置&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DATABASE_TYPE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;sqlite&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;SQLITE_DATABASE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;default_db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_HOST&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;gemini&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;balance&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;mysql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_SOCKET&lt;/span&gt;&lt;span&gt;=/&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;mysqld&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;mysqld&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;sock&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_PORT&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3306&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_USER&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;gemini&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;change_me&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;default_db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;API_KEYS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;YOUR_API_KEY_1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;YOUR_API_KEY_2&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ALLOWED_TOKENS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;sk-123456&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_TOKEN&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;sk&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;123456&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;For&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Vertex&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Platform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Keys&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VERTEX_API_KEYS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;AQ.Abxxxxxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;For&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Vertex&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Platform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Express&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Base&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VERTEX_EXPRESS_BASE_URL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//aiplatform.googleapis.com/v1beta1/publishers/google&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TEST_MODEL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;gemini&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1.5&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;flash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;THINKING_MODELS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;gemini-2.5-flash-preview-04-17&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;THINKING_BUDGET_MAP&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;gemini-2.5-flash-preview-04-17&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4000&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;IMAGE_MODELS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;gemini-2.0-flash-exp&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SEARCH_MODELS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;gemini-2.0-flash-exp&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;gemini-2.0-pro-exp&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FILTERED_MODELS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;gemini-1.0-pro-vision-latest&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;gemini-pro-vision&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;chat-bison-001&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;text-bison-001&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;embedding-gecko-001&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否启用网址上下文&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;默认启用&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;URL_CONTEXT_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;URL_CONTEXT_MODELS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;gemini-2.5-pro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;gemini-2.5-flash&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;gemini-2.5-flash-lite&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;gemini-2.0-flash&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;gemini-2.0-flash-live-001&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TOOLS_CODE_EXECUTION_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SHOW_SEARCH_LINK&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SHOW_THINKING_PROCESS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;BASE_URL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//generativelanguage.googleapis.com/v1beta&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAX_FAILURES&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAX_RETRIES&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CHECK_INTERVAL_HOURS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TIMEZONE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;Asia&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;Shanghai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;请求超时时间&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;秒&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TIME_OUT&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;代理服务器配置&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;支持&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;socks5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;示例&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PROXIES&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;http://user:pass@host:port&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;socks5://host:port&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PROXIES&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;对同一个API_KEY使用代理列表中固定的IP策略&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PROXIES_USE_CONSISTENCY_HASH_BY_API_KEY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;#########################&lt;/span&gt;&lt;span&gt;image_generate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;相关配置&lt;/span&gt;&lt;span&gt;###########################&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PAID_KEY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;AIzaSyxxxxxxxxxxxxxxxxxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CREATE_IMAGE_MODEL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;imagen&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;3.0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;generate&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;UPLOAD_PROVIDER&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;smms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SMMS_SECRET_TOKEN&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PICGO_API_KEY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;xxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_IMGBED_URL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt;//xxxxxxx.pages.dev/upload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_IMGBED_AUTH_CODE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;xxxxxxxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CLOUDFLARE_IMGBED_UPLOAD_FOLDER&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##########################################################################&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;#########################&lt;/span&gt;&lt;span&gt;stream_optimizer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;相关配置&lt;/span&gt;&lt;span&gt;########################&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_OPTIMIZER_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_MIN_DELAY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0.016&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_MAX_DELAY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0.024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_SHORT_TEXT_THRESHOLD&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_LONG_TEXT_THRESHOLD&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STREAM_CHUNK_SIZE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##########################################################################&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;######################### &lt;/span&gt;&lt;span&gt;日志配置&lt;/span&gt;&lt;span&gt; #######################################&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;日志级别&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;debug&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;warning&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;critical&lt;/span&gt;&lt;span&gt;)，&lt;/span&gt;&lt;span&gt;默认为&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否开启自动删除错误日志&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTO_DELETE_ERROR_LOGS_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;自动删除多少天前的错误日志&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTO_DELETE_ERROR_LOGS_DAYS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否开启自动删除请求日志&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTO_DELETE_REQUEST_LOGS_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;自动删除多少天前的请求日志&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTO_DELETE_REQUEST_LOGS_DAYS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##########################################################################&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;假流式配置&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Fake&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Streaming&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Configuration&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否启用假流式输出&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FAKE_STREAM_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;假流式发送空数据的间隔时间&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;秒&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FAKE_STREAM_EMPTY_DATA_INTERVAL_SECONDS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;安全设置&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;字符串格式&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;注意&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span&gt;这里的示例值可能需要根据实际模型支持情况调整&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SAFETY_SETTINGS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt;&quot;category&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HARM_CATEGORY_HARASSMENT&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;OFF&quot;&lt;/span&gt;&lt;span&gt;}, {&lt;/span&gt;&lt;span&gt;&quot;category&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HARM_CATEGORY_HATE_SPEECH&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;OFF&quot;&lt;/span&gt;&lt;span&gt;}, {&lt;/span&gt;&lt;span&gt;&quot;category&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HARM_CATEGORY_SEXUALLY_EXPLICIT&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;OFF&quot;&lt;/span&gt;&lt;span&gt;}, {&lt;/span&gt;&lt;span&gt;&quot;category&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HARM_CATEGORY_DANGEROUS_CONTENT&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;OFF&quot;&lt;/span&gt;&lt;span&gt;}, {&lt;/span&gt;&lt;span&gt;&quot;category&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HARM_CATEGORY_CIVIC_INTEGRITY&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;BLOCK_NONE&quot;&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;URL_NORMALIZATION_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;tts配置&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TTS_MODEL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;gemini&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;2.5&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;flash&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;tts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TTS_VOICE_NAME&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;Zephyr&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TTS_SPEED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;normal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;#########################&lt;/span&gt;&lt;span&gt;Files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;相关配置&lt;/span&gt;&lt;span&gt;########################&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否启用文件过期自动清理&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FILES_CLEANUP_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;文件过期清理间隔&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;小时&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FILES_CLEANUP_INTERVAL_HOURS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;是否启用用户文件隔离&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;每个用户只能看到自己上传的文件&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FILES_USER_ISOLATION_ENABLED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##########################################################################&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;重要：将 &lt;code&gt;YOUR_API_KEY_1​&lt;/code&gt;, &lt;code&gt;YOUR_API_KEY_2​&lt;/code&gt; 等替换成你自己的真实 Gemini API Key。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤 2: 启动服务&lt;a href=&quot;#步骤-2-启动服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在存放这两个文件的文件夹中，打开终端，运行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;等待片刻，Docker 会自动拉取最新的镜像并启动服务。服务将运行在本地的 8000​ 端口上。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;即刻开始&lt;a href=&quot;#即刻开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务启动后，你就可以开始享受它带来的便利了。假设你的服务地址是 &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;​。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1905&quot; height=&quot;1239&quot; src=&quot;/_astro/4.nl-WQDBc_Z6Hvwr.webp&quot; srcset=&quot;/_astro/4.nl-WQDBc_Z2iPuqH.webp 640w, /_astro/4.nl-WQDBc_9Trrx.webp 750w, /_astro/4.nl-WQDBc_vA517.webp 828w, /_astro/4.nl-WQDBc_Z2scuLg.webp 1080w, /_astro/4.nl-WQDBc_12cAJS.webp 1280w, /_astro/4.nl-WQDBc_1p0Fsd.webp 1668w, /_astro/4.nl-WQDBc_Z6Hvwr.webp 1905w&quot; /&gt;&lt;/p&gt;&lt;p&gt;API地址：&lt;code&gt;http://127.0.0.1:8000​&lt;/code&gt;&lt;/p&gt;&lt;p&gt;API KEY：&lt;code&gt;sk-123456​&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;​snailyp/gemini-balance​ 是一个设计精巧、功能强大且极其实用的开源项目。它不仅解决了开发者在使用 Gemini API 时遇到的核心痛点——速率限制和多 Key 管理，更通过其卓越的 OpenAI API 兼容性，极大地拓宽了 Gemini 的应用场景。&lt;/p&gt;&lt;p&gt;它将复杂的负载均衡、格式转换和功能扩展等任务封装在一个简单的 Docker 容器中，让开发者可以专注于业务逻辑和应用创新。如果你正在使用或计划使用 Gemini API，我强烈推荐你花几分钟时间部署和体验一下 gemini-balance​。&lt;/p&gt;&lt;p&gt;去给这个优秀的项目一个 Star 吧，这绝对是你今年在 GitHub 上最值得的发现之一！&lt;/p&gt;&lt;p&gt;GitHub 仓库: &lt;a href=&quot;https://github.com/snailyp/gemini-balance&quot; target=&quot;_blank&quot;&gt;https://github.com/snailyp/gemini-balance&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「Termius」多端同步SSH工具</title><link>https://www.chaxuji.de/posts/termius/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/termius/</guid><description>如果你仍然在纠结移动端的SSH工具，或许你得看看这个。Termius是一款高颜值跨平台SSH工具，通过云同步主机和命令片段，解决了VPS玩家在移动端管理服务器的痛点，是我的终极解决方案。</description><pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;写在前面&lt;a href=&quot;#写在前面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;对于我们这群热爱折腾VPS的 MJJ 来说，一个强大、稳定且顺手的SSH工具至关重要。在PC端，我们有Xshell、MobaXterm等神器。然而，当我们离开电脑，想用手机或平板随时随地管理我们的“小鸡”时，选择似乎就变得捉襟见肘。&lt;/p&gt;&lt;p&gt;不少MJJ可能还在忍受着各种简陋的移动SSH客户端，或是因为功能残缺而不得不在多个App之间来回切换。如果你也有这样的困扰，那么今天介绍的&lt;strong&gt;Termius&lt;/strong&gt;或许能让你眼前一亮，它极有可能是目前移动端SSH工具的终极答案。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2871&quot; height=&quot;1137&quot; src=&quot;/_astro/1.93u7EuMI_1uUyrS.webp&quot; srcset=&quot;/_astro/1.93u7EuMI_bLc5n.webp 640w, /_astro/1.93u7EuMI_Z11pN9d.webp 750w, /_astro/1.93u7EuMI_ZEB5B4.webp 828w, /_astro/1.93u7EuMI_Z4QGAP.webp 1080w, /_astro/1.93u7EuMI_12PJaS.webp 1280w, /_astro/1.93u7EuMI_1oWxOA.webp 1668w, /_astro/1.93u7EuMI_Z2gPGPm.webp 2048w, /_astro/1.93u7EuMI_ZywS5O.webp 2560w, /_astro/1.93u7EuMI_1uUyrS.webp 2871w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;始于颜值，忠于才华&lt;a href=&quot;#始于颜值忠于才华&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;初见Termius，你很可能会被它现代化且精致的UI设计所吸引。与许多功能强大但界面停留在上个世纪的SSH工具不同，Termius的外观无疑是“能打”的。无论是清爽的亮色主题还是极客范的暗色主题，都足以看出开发者在用户体验上的用心。&lt;/p&gt;&lt;p&gt;但对于我们MJJ来说，好看仅仅是加分项，真正让我们折服的，是它深藏不露的强大功能。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3720&quot; height=&quot;2772&quot; src=&quot;/_astro/2.B_r4-YPd_10YPya.webp&quot; srcset=&quot;/_astro/2.B_r4-YPd_v6qqt.webp 640w, /_astro/2.B_r4-YPd_Z27MEew.webp 750w, /_astro/2.B_r4-YPd_2tYv1z.webp 828w, /_astro/2.B_r4-YPd_atjk0.webp 1080w, /_astro/2.B_r4-YPd_Z1thag0.webp 1280w, /_astro/2.B_r4-YPd_Z1VBzw9.webp 1668w, /_astro/2.B_r4-YPd_PQfS4.webp 2048w, /_astro/2.B_r4-YPd_23hMb2.webp 2560w, /_astro/2.B_r4-YPd_10YPya.webp 3720w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;跨平台同步：MJJ的“刚需”&lt;a href=&quot;#跨平台同步mjj的刚需&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这绝对是Termius最核心的 杀手级功能，没有之一！&lt;/p&gt;&lt;p&gt;我们MJJ手上通常都不止一台VPS，在PC上我们可以用Xshell等工具方便地管理，但一旦换到手机或平板，重新输入IP、端口、用户名和密码的痛苦，相信大家都深有体会。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Termius完美地解决了这个痛点。 你只需要注册一个免费账户，就可以在 Windows, macOS, Linux, iOS, Android 全平台上同步你所有的主机信息、连接历史、甚至是后面会提到的命令片段（Snippets）。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这意味着，你在PC上添加了一台新的VPS，打开手机上的Termius，它就已经静静地躺在那里等你了。这种无缝衔接的体验，一旦用上，就再也回不去了。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;703&quot; src=&quot;/_astro/3.CKhu-idv_2fLx1d.webp&quot; srcset=&quot;/_astro/3.CKhu-idv_iT9fF.webp 640w, /_astro/3.CKhu-idv_Z2bsLmc.webp 750w, /_astro/3.CKhu-idv_ZKcHCA.webp 828w, /_astro/3.CKhu-idv_2fLx1d.webp 1066w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Snippets（命令片段）：告别重复输入的烦恼&lt;a href=&quot;#snippets命令片段告别重复输入的烦恼&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们折腾VPS，总免不了要重复输入一些命令，比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;更新系统: &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade -y​&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看系统信息: &lt;code&gt;uname -a​&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试服务器性能: &lt;code&gt;wget -qO- bench.sh | bash​&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Termius的 Snippets 功能，可以让你将这些常用命令保存为一个个“片段”。需要使用时，只需轻轻一点，即可自动输入并执行。对于那些喜欢跑各种一键脚本的MJJ来说，这个功能简直是福音。你可以将常用的脚本命令都存起来，随时随地给你的“小鸡”做个体检或安装新的环境。&lt;/p&gt;&lt;p&gt;更强大的是，Snippets还可以设置为 在连接成功后自动运行，非常适合用来执行一些初始化的环境设置命令。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1843&quot; height=&quot;1239&quot; src=&quot;/_astro/4.CX_Be7Ib_OUVBs.webp&quot; srcset=&quot;/_astro/4.CX_Be7Ib_1bOXNy.webp 640w, /_astro/4.CX_Be7Ib_Z2W08U.webp 750w, /_astro/4.CX_Be7Ib_1IaxSU.webp 828w, /_astro/4.CX_Be7Ib_ZEX55C.webp 1080w, /_astro/4.CX_Be7Ib_fFUNS.webp 1280w, /_astro/4.CX_Be7Ib_Z6xIvR.webp 1668w, /_astro/4.CX_Be7Ib_OUVBs.webp 1843w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;不仅仅是SSH：强大的“瑞士军刀”&lt;a href=&quot;#不仅仅是ssh强大的瑞士军刀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一个优秀的SSH工具，绝不应该仅仅局限于SSH连接。Termius就为我们提供了一个功能丰富的工具箱：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;内置SFTP客户端：在移动端传输文件一直是个麻烦事。Termius内置了功能完善的SFTP客户端，界面直观，可以让你轻松地在手机和VPS之间上传下载文件，修改配置文件等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;端口转发 (Port Forwarding)：对于需要搭建隧道、访问内网服务的MJJ来说，这是一个非常实用的高级功能。Termius提供了向导式的端口转发设置，无论是本地转发还是远程转发，都变得异常简单。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mosh支持：在网络环境不稳定（比如在移动的地铁上）的情况下，SSH连接很容易断开。Termius支持Mosh (Mobile Shell)，可以有效维持连接，防止因网络波动而中断你的操作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一些让MJJ会心一笑的细节&lt;a href=&quot;#一些让mjj会心一笑的细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;桌面级的终端体验：Termius在移动端提供了非常完善的虚拟键盘，包括 Tab​, Ctrl​, Alt​, Esc​ 以及方向键等，让你在手机上也能像在PC上一样高效操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;团队协作：如果你和朋友一起合租或管理服务器，Termius的团队功能（付费）可以让你们安全地共享主机信息和Snippets，大大提升协作效率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安全性：支持通过 Touch ID / Face ID 进行身份验证，并且所有同步数据都经过 端到端加密，安全性有保障。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;免费还是付费？&lt;a href=&quot;#免费还是付费&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Termius提供了免费和付费（Pro）两种方案。&lt;/p&gt;&lt;p&gt;免费版：基础SSH, SFTP, 端口转发, 核心的跨平台同步；绝大多数个人MJJ，日常管理完全够用&lt;/p&gt;&lt;p&gt;付费Pro版：无限设备同步, Snippets云端保存, 云端加密存储, 团队协作等；重度用户, 团队协作, 追求极致效率的玩家&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我的建议是：先从 免费版 开始体验。它的核心功能已经足够强大，足以改变你的移动SSH使用习惯。如果你对Snippets等高级功能有重度依赖，或者需要多端云同步，再考虑升级到Pro版也不迟。另外Github学生包提供了一年的高级会员。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在这个移动为王的时代，我们有理由要求一个同样强大和便捷的移动SSH工具。Termius 凭借其出色的UI设计、革命性的跨平台同步功能、实用的Snippets以及整合的SFTP、端口转发等多种能力，为我们这些热爱折腾VPS的MJJ提供了一个近乎完美的移动端解决方案。&lt;/p&gt;&lt;p&gt;如果你还在为手机上找不到一个称心如意的SSH客户端而烦恼，不妨现在就去下载一个Termius，相信它会给你带来前所未有的流畅体验。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「Sink」基于 Cloudflare 的高颜值短链接服务</title><link>https://www.chaxuji.de/posts/sink/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/sink/</guid><description>Sink是一款开源短链接服务，完全托管于Cloudflare，让你无需服务器，零成本、免维护地拥有专属短链接。</description><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;&lt;strong&gt;为什么依然需要短链接&lt;/strong&gt;&lt;a href=&quot;#为什么依然需要短链接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在互联网内容爆炸的今天，分享信息是我们每天都在做的事情。从一条社交媒体帖子到一封工作邮件，链接（URL）无处不在。然而，你是否曾被那些夹杂着各种追踪参数、长达数行的“天书式”链接所困扰？这正是短链接服务诞生的初衷，但它的价值远不止于“缩短”。&lt;/p&gt;&lt;p&gt;拥有一个属于自己的、可控的短链接服务，是每一个开发者、内容创作者乃至普通用户提升效率和专业度的有力工具。今天，要介绍的开源项目 &lt;strong&gt;Sink&lt;/strong&gt;，就提供了一个完美的现代化解决方案。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;&lt;strong&gt;Sink，无需服务器的短链接服务&lt;/strong&gt;&lt;a href=&quot;#sink无需服务器的短链接服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Sink&lt;/strong&gt; (&lt;a href=&quot;https://github.com/ccbikai/Sink&quot; target=&quot;_blank&quot;&gt;https://github.com/ccbikai/Sink&lt;/a&gt;) 是一个开源、快速、安全的短链接项目，它最大的特色是 &lt;strong&gt;100% 运行在 Cloudflare 的全球网络之上&lt;/strong&gt;。这意味着你无需购买和维护传统的虚拟主机或服务器，就能拥有一个性能卓越、稳定可靠且成本极低的短链接服务。对于绝大多数个人和中小型项目而言，Cloudflare 提供的免费额度足以支撑整个服务的日常运行，真正实现了“零成本”托管。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据分析面板：&lt;/strong&gt; Sink 提供了一个简洁直观的后台，你可以清晰地看到每个链接的总点击次数，以及按时间、来源、国家/地区、设备等维度的详细分析图表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自定义域名：&lt;/strong&gt; 你可以轻松绑定自己的域名，打造专属的品牌短链接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API 支持：&lt;/strong&gt; 对于开发者来说，可以通过 API 将链接缩短和管理功能集成到自己的应用程序中，实现自动化操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;易于部署：&lt;/strong&gt; 部署过程极其简单。你只需将项目 Fork 到自己的 GitHub 账户，然后在 Cloudflare 上进行简单的几次点击，即可将项目与你的账户关联并自动部署上线。整个过程甚至不需要你编写一行代码。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;轻松部署&lt;a href=&quot;#轻松部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork官方仓库到您的 GitHub 帐户。&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1447&quot; height=&quot;1099&quot; src=&quot;/_astro/1.DMfFTdyv_mLPke.webp&quot; srcset=&quot;/_astro/1.DMfFTdyv_Z1hWKar.webp 640w, /_astro/1.DMfFTdyv_Z1ROW0h.webp 750w, /_astro/1.DMfFTdyv_Z129blG.webp 828w, /_astro/1.DMfFTdyv_Z2ola1o.webp 1080w, /_astro/1.DMfFTdyv_Z1vcGEM.webp 1280w, /_astro/1.DMfFTdyv_mLPke.webp 1447w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;a href=&quot;https://developers.cloudflare.com/pages/&quot; target=&quot;_blank&quot;&gt;Cloudflare Pages&lt;/a&gt; 中创建一个项目。&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1843&quot; height=&quot;1107&quot; src=&quot;/_astro/2.TAz3k_Tb_1sOXmb.webp&quot; srcset=&quot;/_astro/2.TAz3k_Tb_Zgv6my.webp 640w, /_astro/2.TAz3k_Tb_Z20idp3.webp 750w, /_astro/2.TAz3k_Tb_Sra5.webp 828w, /_astro/2.TAz3k_Tb_ZcEzsN.webp 1080w, /_astro/2.TAz3k_Tb_Z1Kkj8p.webp 1280w, /_astro/2.TAz3k_Tb_u5TC6.webp 1668w, /_astro/2.TAz3k_Tb_1sOXmb.webp 1843w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 &lt;code&gt;Sink&lt;/code&gt; 存储库，然后选择 &lt;code&gt;Nuxt.js&lt;/code&gt; 预设。&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;1128&quot; src=&quot;/_astro/3.BjiXw4VO_ZgMfKy.webp&quot; srcset=&quot;/_astro/3.BjiXw4VO_Z6so4g.webp 640w, /_astro/3.BjiXw4VO_Z11q3Vu.webp 750w, /_astro/3.BjiXw4VO_ZERvlu.webp 828w, /_astro/3.BjiXw4VO_Z1lSGnQ.webp 1080w, /_astro/3.BjiXw4VO_ZgMfKy.webp 1247w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置以下环境变量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;NUXT_SITE_TOKEN&lt;/code&gt;：长度必须至少为 &lt;strong&gt;8&lt;/strong&gt; 个字符。此令牌授予对仪表板的访问权限。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;NUXT_CF_ACCOUNT_ID&lt;/code&gt;：找到你的&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/&quot; target=&quot;_blank&quot;&gt;账号 ID&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;NUXT_CF_API_TOKEN&lt;/code&gt;：创建至少具有 &lt;code&gt;Account.Account Analytics&lt;/code&gt; 权限的 &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot; target=&quot;_blank&quot;&gt;Cloudflare API 令牌&lt;/a&gt; 。 &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-api/#authentication&quot; target=&quot;_blank&quot;&gt;见参考资料。&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存并部署项目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取消部署，然后转到&lt;strong&gt;设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;绑定&lt;/strong&gt; -&amp;gt; &lt;strong&gt;添加&lt;/strong&gt; ：&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1739&quot; height=&quot;555&quot; src=&quot;/_astro/4.CCuNlzxb_emt7o.webp&quot; srcset=&quot;/_astro/4.CCuNlzxb_ZSn1OH.webp 640w, /_astro/4.CCuNlzxb_ZMT0rP.webp 750w, /_astro/4.CCuNlzxb_Z2hUFre.webp 828w, /_astro/4.CCuNlzxb_IS35G.webp 1080w, /_astro/4.CCuNlzxb_Z21T3zD.webp 1280w, /_astro/4.CCuNlzxb_10BllY.webp 1668w, /_astro/4.CCuNlzxb_emt7o.webp 1739w&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KV 命名空间&lt;/strong&gt; ：将变量名称 &lt;code&gt;KV&lt;/code&gt; 绑定到 &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot; target=&quot;_blank&quot;&gt;KV 命名空间&lt;/a&gt; （在 &lt;strong&gt;Storage &amp;amp; Databases&lt;/strong&gt; -&amp;gt; &lt;strong&gt;KV&lt;/strong&gt; 下创建一个新命名空间）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;（ &lt;em&gt;可选）：&lt;/em&gt; 将变量名称 &lt;code&gt;AI&lt;/code&gt; 绑定到 Workers AI 目录。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分析引擎&lt;/strong&gt; ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; 中，转到右侧面板中的 &lt;strong&gt;Account details&lt;/strong&gt;，找到 &lt;code&gt;Analytics Engine&lt;/code&gt;，然后单击 &lt;code&gt;Set up&lt;/code&gt; 以启用免费套餐。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回&lt;strong&gt;设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Bindings&lt;/strong&gt; -&amp;gt; &lt;strong&gt;添加&lt;/strong&gt; 并选择 &lt;strong&gt;Analytics engine&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将变量名称 &lt;code&gt;ANALYTICS&lt;/code&gt; 绑定到&lt;code&gt;sink&lt;/code&gt;数据集。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加兼容性标志&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;795&quot; src=&quot;/_astro/5.DJHldUpv_1XAwNq.webp&quot; srcset=&quot;/_astro/5.DJHldUpv_XUAx5.webp 640w, /_astro/5.DJHldUpv_2wUCuy.webp 750w, /_astro/5.DJHldUpv_BJUIG.webp 828w, /_astro/5.DJHldUpv_Z1leeUX.webp 1080w, /_astro/5.DJHldUpv_1yo1zU.webp 1280w, /_astro/5.DJHldUpv_y0QGh.webp 1668w, /_astro/5.DJHldUpv_1XAwNq.webp 1708w&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置以下标志 &lt;code&gt;nodejs_compat&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新部署项目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定域名。&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2297&quot; height=&quot;1460&quot; src=&quot;/_astro/6.B3204fVp_Z2i9zRN.webp&quot; srcset=&quot;/_astro/6.B3204fVp_ZuUqdx.webp 640w, /_astro/6.B3204fVp_Z1XjBX0.webp 750w, /_astro/6.B3204fVp_ZszYdc.webp 828w, /_astro/6.B3204fVp_JaNRN.webp 1080w, /_astro/6.B3204fVp_Z1xwDOS.webp 1280w, /_astro/6.B3204fVp_Z1akkbP.webp 1668w, /_astro/6.B3204fVp_ZLFs9e.webp 2048w, /_astro/6.B3204fVp_Z2i9zRN.webp 2297w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;即刻开始&lt;a href=&quot;#即刻开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3447&quot; height=&quot;1925&quot; src=&quot;/_astro/7.BqFUvbjd_g8xfa.webp&quot; srcset=&quot;/_astro/7.BqFUvbjd_Z1v3lhf.webp 640w, /_astro/7.BqFUvbjd_VmLPg.webp 750w, /_astro/7.BqFUvbjd_Z1HDUOC.webp 828w, /_astro/7.BqFUvbjd_27FCiN.webp 1080w, /_astro/7.BqFUvbjd_Z1V9YAW.webp 1280w, /_astro/7.BqFUvbjd_Z2tGr8e.webp 1668w, /_astro/7.BqFUvbjd_ZfUGGs.webp 2048w, /_astro/7.BqFUvbjd_1Wv0E2.webp 2560w, /_astro/7.BqFUvbjd_g8xfa.webp 3447w&quot; /&gt;&lt;/p&gt;&lt;p&gt;你可以在仪表盘中添加短链接。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;560&quot; src=&quot;/_astro/8.CXKCFKFD_OEgn0.webp&quot; srcset=&quot;/_astro/8.CXKCFKFD_ZShdpf.webp 640w, /_astro/8.CXKCFKFD_ZlrDHr.webp 750w, /_astro/8.CXKCFKFD_OEgn0.webp 786w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「旅行 青甘环线」我看见西北大地的色彩</title><link>https://www.chaxuji.de/posts/qing-gan-huan-xian/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/qing-gan-huan-xian/</guid><description>毕业之后，和小伙伴们踏上了前往青甘环线的毕业旅行，第一次前往祖国的西部，我见到了从未设想过的美丽色彩。</description><pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;1. 前言&lt;a href=&quot;#1-前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h3&gt;1.1 毕业旅行的开始&lt;a href=&quot;#11-毕业旅行的开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 旅行团&lt;a href=&quot;#12-旅行团&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 公共交通&lt;a href=&quot;#13-公共交通&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;2. 日月山&lt;a href=&quot;#2-日月山&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;3. 青海湖&lt;a href=&quot;#3-青海湖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;4. 茶卡盐湖&lt;a href=&quot;#4-茶卡盐湖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;5. 315公路&lt;a href=&quot;#5-315公路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;6. 翡翠湖&lt;a href=&quot;#6-翡翠湖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;7. 黑独山&lt;a href=&quot;#7-黑独山&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;8. 鸣沙山月牙泉&lt;a href=&quot;#8-鸣沙山月牙泉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;9. 七彩丹霞&lt;a href=&quot;#9-七彩丹霞&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;10. 祁连山草原&lt;a href=&quot;#10-祁连山草原&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;11. 结语&lt;a href=&quot;#11-结语&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/section&gt;</content:encoded></item><item><title>「测评」68元阿里云香港服务器体验</title><link>https://www.chaxuji.de/posts/aliyunhk/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/aliyunhk/</guid><description>当你蹲到限时活动？阿里云轻量服务器套餐，包含一台2核2G、200M共享带宽的服务器，退证书后2C2G配置年付仅68元，还送超大容量数据盘，性价比极高。</description><pubDate>Thu, 03 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;1.购买&lt;a href=&quot;#1购买&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;阿里云在7月2日晚推出了限时轻量上云证书套餐活动，套餐包含&lt;strong&gt;2C 2G 40G系统盘 200M共享带宽&lt;/strong&gt;的轻量应用服务器+1年DV单域名证书，价格为136一年，部分用户可享。可选区域包括国内和香港、日本、新加坡等海外地区。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1701&quot; height=&quot;478&quot; src=&quot;/_astro/1.uFDnrhR3_24bgxC.webp&quot; srcset=&quot;/_astro/1.uFDnrhR3_Z1FGr9d.webp 640w, /_astro/1.uFDnrhR3_11lzYu.webp 750w, /_astro/1.uFDnrhR3_17tIhG.webp 828w, /_astro/1.uFDnrhR3_Z26nVAx.webp 1080w, /_astro/1.uFDnrhR3_1Htnwq.webp 1280w, /_astro/1.uFDnrhR3_Z1S627s.webp 1668w, /_astro/1.uFDnrhR3_24bgxC.webp 1701w&quot; /&gt;&lt;/p&gt;&lt;p&gt;其中国内区域可以免费添加180G数据盘，海外地区可以免费添加100G数据盘，其中套餐中价值68元的证书可以单独退款，即1年轻量应用服务器价格为68元。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2232&quot; height=&quot;2310&quot; src=&quot;/_astro/2.Cu_W4G3R_1uhhCu.webp&quot; srcset=&quot;/_astro/2.Cu_W4G3R_ZgihW3.webp 640w, /_astro/2.Cu_W4G3R_Z1vlqQF.webp 750w, /_astro/2.Cu_W4G3R_1ne8Dv.webp 828w, /_astro/2.Cu_W4G3R_Z17E7i7.webp 1080w, /_astro/2.Cu_W4G3R_Z18CAdc.webp 1280w, /_astro/2.Cu_W4G3R_1my3QH.webp 1668w, /_astro/2.Cu_W4G3R_Z13hazl.webp 2048w, /_astro/2.Cu_W4G3R_1uhhCu.webp 2232w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;2.测试&lt;a href=&quot;#2测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;使用&lt;a href=&quot;https://www.nodeseek.com/jump?to=https%3A%2F%2Fgithub.com%2FLloydAsp%2FNodeQuality&quot; target=&quot;_blank&quot;&gt;NodeQuality&lt;/a&gt;进行测试。&lt;/p&gt;&lt;p&gt;报告链接：&lt;a href=&quot;https://nodequality.com/r/tBFdmhWpd3MH3Aj6MlJeUgXYKsnuZIPh&quot; target=&quot;_blank&quot;&gt;NodeQuality - Nice Benchmark Script&lt;/a&gt;&lt;/p&gt;&lt;section&gt;&lt;h2&gt;💻基本信息&lt;a href=&quot;#基本信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Basic System Information:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Uptime     : 0 days, 1 hours, 32 minutes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Processor  : Intel(R) Xeon(R) Platinum&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CPU cores  : 2 @ 2499.998 MHz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AES-NI     : ✔ Enabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VM-x/AMD-V : ❌ Disabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RAM        : 1.9 GiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Swap       : 1024.0 MiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk       : 140.0 GiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Distro     : Debian GNU/Linux 12 (bookworm)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Kernel     : 5.10.0-35-cloud-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VM Type    : ALIBABA CLOUD ECS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;IPv4/IPv6  : ✔ Online / ❌ Offline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;IPv4 Network Information:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ISP        : Alibaba.com LLC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ASN        : AS45102 Alibaba (US) Technology Co., Ltd.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host       : Hong Kong&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Location   : Hong Kong, Central and Western District (HCW)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Country    : Hong Kong&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fio Disk Speed Tests (Mixed R/W 50/50) (Partition -):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Block Size | 4k            (IOPS) | 64k           (IOPS)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;------   | ---            ----  | ----           ----&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Read       | 7.81 MB/s     (1.9k) | 74.23 MB/s    (1.1k)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Write      | 7.84 MB/s     (1.9k) | 74.62 MB/s    (1.1k)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Total      | 15.65 MB/s    (3.9k) | 148.86 MB/s   (2.3k)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span&gt;|                      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Block Size | 512k          (IOPS) | 1m            (IOPS)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;------   | ---            ----  | ----           ----&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Read       | 70.68 MB/s     (138) | 70.23 MB/s      (68)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Write      | 74.44 MB/s     (145) | 74.91 MB/s      (73)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Total      | 145.13 MB/s    (283) | 145.15 MB/s    (141)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Geekbench 5 test failed. Run manually to determine cause.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SysBench CPU 测试 (Fast Mode, 1-Pass @ 5sec)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1 线程测试(单核)得分:          1048 Scores&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2 线程测试(多核)得分:          2057 Scores&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SysBench 内存测试 (Fast Mode, 1-Pass @ 5sec)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;单线程读测试:          20743.54 MB/s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;单线程写测试:          17356.78 MB/s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🎬IP质量&lt;a href=&quot;#ip质量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://i.111666.best/image/yyOjBqVEftR8qsEE0Xg1v7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🌐网络质量&lt;a href=&quot;#网络质量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://i.111666.best/image/wfHKlhsOxfWygdNxX5HaP0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;📍回程路由&lt;a href=&quot;#回程路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://i.111666.best/image/EcfB0uC33dBz6lz9MLrJTT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「EXIF Photo Blog」在 Vercel 上部署你的个人摄影相册</title><link>https://www.chaxuji.de/posts/exif-photo-blog/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/exif-photo-blog/</guid><description>它能帮你快速搭建一个专业、可自托管的摄影作品集，不仅能展示高质量原图，还能完整呈现 EXIF 和胶片模拟等详细信息。</description><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;1. 前言&lt;a href=&quot;#1-前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 寻找合适的摄影相册&lt;a href=&quot;#11-寻找合适的摄影相册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当你使用相机拍下了足够多的照片后，你不免产生新的念头，想要一个合适的相册来存放那些珍贵的瞬间，以便于随时随地分享和回味，不至于让它们在硬盘深处蒙上一层灰。我曾经会在微信朋友圈和 500px 上传我的摄影照片，前者更适合小范围的分享且和生活日常会混杂在一起，而后者的用户大多集中在摄影师之间，而且它们共同的缺点就是无法保存高质量的照片，你的照片会被第三方平台随意的压缩。&lt;/p&gt;&lt;p&gt;那么？我的需求逐渐明晰，我需要一个便于分享、能够保存高质量照片、最好还是能够自托管的相册。拥有这样需求的人不在少数，也有十分优秀的项目例如 &lt;a href=&quot;https://github.com/besscroft/PicImpact&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;PicImpact&lt;/strong&gt;&lt;/a&gt; 或是 &lt;a href=&quot;https://github.com/wiidede/exif-gallery-nuxt&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;exif-gallery-nuxt&lt;/strong&gt;&lt;/a&gt;，那么在体验过一段时间后，我最终选择 &lt;a href=&quot;https://github.com/sambecker/exif-photo-blog&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;exif-photo-blog&lt;/strong&gt;&lt;/a&gt; 这个项目。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;exif-photo-blog&quot; loading=&quot;lazy&quot; width=&quot;3249&quot; height=&quot;1926&quot; src=&quot;/_astro/1.BlhFgdE-_Z2c7Gj7.webp&quot; srcset=&quot;/_astro/1.BlhFgdE-_20eaEa.webp 640w, /_astro/1.BlhFgdE-_gr3BF.webp 750w, /_astro/1.BlhFgdE-_XwXYn.webp 828w, /_astro/1.BlhFgdE-_1Cwq34.webp 1080w, /_astro/1.BlhFgdE-_6jA7L.webp 1280w, /_astro/1.BlhFgdE-_Ztsf0g.webp 1668w, /_astro/1.BlhFgdE-_XwGFX.webp 2048w, /_astro/1.BlhFgdE-_BhJzN.webp 2560w, /_astro/1.BlhFgdE-_Z2c7Gj7.webp 3249w&quot; /&gt;&lt;figcaption&gt;exif-photo-blog&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 为什么选择它&lt;a href=&quot;#12-为什么选择它&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;选择 EXIF Photo Blog 这个项目的原因无外乎是它具有独特的内容呈现形式，能够显示 Exif 信息和富士胶片模拟信息，丰富的自定义选项，以及可以使用 Vercel 进行一键部署，不需要依赖服务器，1 个域名，1 个免费的 Cloudflare R2 对象存储，就能帮助你快速的部署属于你的摄影相册。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;官方 Demo：&lt;/strong&gt;&lt;a href=&quot;https://photos.sambecker.com/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;photos.sambecker.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/2.Btj4DCU8_7e1Kd.webp&quot; srcset=&quot;/_astro/2.Btj4DCU8_Z10LDeb.webp 640w, /_astro/2.Btj4DCU8_Z1z3Ql8.webp 750w, /_astro/2.Btj4DCU8_2sOSiq.webp 828w, /_astro/2.Btj4DCU8_vGiNI.webp 1080w, /_astro/2.Btj4DCU8_1zidjE.webp 1280w, /_astro/2.Btj4DCU8_17AlKC.webp 1668w, /_astro/2.Btj4DCU8_Z1EslnB.webp 2048w, /_astro/2.Btj4DCU8_Z19jpTx.webp 2560w, /_astro/2.Btj4DCU8_7e1Kd.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/3.D4waVd9m_Z1p2H1W.webp&quot; srcset=&quot;/_astro/3.D4waVd9m_14hTuM.webp 640w, /_astro/3.D4waVd9m_v0GnP.webp 750w, /_astro/3.D4waVd9m_ZwhGLx.webp 828w, /_astro/3.D4waVd9m_Z10zpXr.webp 1080w, /_astro/3.D4waVd9m_31twu.webp 1280w, /_astro/3.D4waVd9m_ZoFn1x.webp 1668w, /_astro/3.D4waVd9m_1Ss3Da.webp 2048w, /_astro/3.D4waVd9m_2oAY7e.webp 2560w, /_astro/3.D4waVd9m_Z1p2H1W.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 在 Vercel 上部署&lt;a href=&quot;#2-在-vercel-上部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 一键部署&lt;a href=&quot;#21-一键部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;项目主页提供了在 Vercel 上一键部署的按钮，你也可以 fork 项目后在 Vercel 手动部署，&lt;a href=&quot;https://vercel.com/new&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;点此&lt;/strong&gt;&lt;/a&gt;直达 Vercel 新建项目，部署时无需任何改动，在等待大约两分钟后即可部署完毕。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/4.CrkN7qla_1Ucp1b.webp&quot; srcset=&quot;/_astro/4.CrkN7qla_Z1VgAfs.webp 640w, /_astro/4.CrkN7qla_Z2uxNmp.webp 750w, /_astro/4.CrkN7qla_1xkVh9.webp 828w, /_astro/4.CrkN7qla_2jEG4G.webp 1080w, /_astro/4.CrkN7qla_Z1GUxej.webp 1280w, /_astro/4.CrkN7qla_Z29CoMl.webp 1668w, /_astro/4.CrkN7qla_8v1Rm.webp 2048w, /_astro/4.CrkN7qla_DDWlq.webp 2560w, /_astro/4.CrkN7qla_1Ucp1b.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/5.Blx2vuNN_ZyYk2p.webp&quot; srcset=&quot;/_astro/5.Blx2vuNN_AUc6g.webp 640w, /_astro/5.Blx2vuNN_2CXYj.webp 750w, /_astro/5.Blx2vuNN_ZYEpb4.webp 828w, /_astro/5.Blx2vuNN_Zaw2XT.webp 1080w, /_astro/5.Blx2vuNN_S4Qw2.webp 1280w, /_astro/5.Blx2vuNN_qmYX0.webp 1668w, /_astro/5.Blx2vuNN_Z2lFHbe.webp 2048w, /_astro/5.Blx2vuNN_Z1PwLHa.webp 2560w, /_astro/5.Blx2vuNN_ZyYk2p.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 链接数据库&lt;a href=&quot;#22-链接数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;此时你已经可以通过 Vercel 提供的域名访问你的相册了，你大概会进入这样的界面，当你配置完 Storage（数据库和对象存储）、Authentication 后，会在对应的条件前打勾：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1790&quot; height=&quot;1270&quot; src=&quot;/_astro/6.BXIGlMPM_ZVRxW8.webp&quot; srcset=&quot;/_astro/6.BXIGlMPM_1faCts.webp 640w, /_astro/6.BXIGlMPM_TmxaU.webp 750w, /_astro/6.BXIGlMPM_1wr62w.webp 828w, /_astro/6.BXIGlMPM_WFHmG.webp 1080w, /_astro/6.BXIGlMPM_1aJRXq.webp 1280w, /_astro/6.BXIGlMPM_1rQrG5.webp 1668w, /_astro/6.BXIGlMPM_ZVRxW8.webp 1790w&quot; /&gt;&lt;/p&gt;&lt;p&gt;在项目界面中打开 Storage 选项卡，开始创建并链接你的数据库吧。我建议你使用 Vercel 提供的 Neon 或 Supabase，它们都有一定的免费额度，对于一个个人使用的相册而言绰绰有余。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3754&quot; height=&quot;392&quot; src=&quot;/_astro/7.DuAJwSjs_Z1bRT6z.webp&quot; srcset=&quot;/_astro/7.DuAJwSjs_u1VKL.webp 640w, /_astro/7.DuAJwSjs_19354j.webp 750w, /_astro/7.DuAJwSjs_1eGOH4.webp 828w, /_astro/7.DuAJwSjs_2aOj0j.webp 1080w, /_astro/7.DuAJwSjs_Z1nkl5X.webp 1280w, /_astro/7.DuAJwSjs_Z2k0dDx.webp 1668w, /_astro/7.DuAJwSjs_WLI8c.webp 2048w, /_astro/7.DuAJwSjs_20mOyu.webp 2560w, /_astro/7.DuAJwSjs_Z1bRT6z.webp 3754w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/8.D83lNTZC_2mVDOH.webp&quot; srcset=&quot;/_astro/8.D83lNTZC_cH5iS.webp 640w, /_astro/8.D83lNTZC_Zlz7N4.webp 750w, /_astro/8.D83lNTZC_Z1nRvXr.webp 828w, /_astro/8.D83lNTZC_Z2iMcUI.webp 1080w, /_astro/8.D83lNTZC_Z1fbipM.webp 1280w, /_astro/8.D83lNTZC_Z1GS9XO.webp 1668w, /_astro/8.D83lNTZC_AfgFS.webp 2048w, /_astro/8.D83lNTZC_16oc9W.webp 2560w, /_astro/8.D83lNTZC_2mVDOH.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;p&gt;以 Neon 为例，选择合适的地区并创建，完成后，你可以很轻松的将其链接到项目：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1140&quot; height=&quot;1428&quot; src=&quot;/_astro/9.DHdpKazj_Z1EsON6.webp&quot; srcset=&quot;/_astro/9.DHdpKazj_21rj8s.webp 640w, /_astro/9.DHdpKazj_ZVNpw5.webp 750w, /_astro/9.DHdpKazj_1yE7x1.webp 828w, /_astro/9.DHdpKazj_TCkvw.webp 1080w, /_astro/9.DHdpKazj_Z1EsON6.webp 1140w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3826&quot; height=&quot;1893&quot; src=&quot;/_astro/10.D5VDhqhx_ZxiMtQ.webp&quot; srcset=&quot;/_astro/10.D5VDhqhx_Z13IzM0.webp 640w, /_astro/10.D5VDhqhx_ZatKAC.webp 750w, /_astro/10.D5VDhqhx_Z3k8Gw.webp 828w, /_astro/10.D5VDhqhx_A2F1R.webp 1080w, /_astro/10.D5VDhqhx_S3D87.webp 1280w, /_astro/10.D5VDhqhx_Zda3GU.webp 1668w, /_astro/10.D5VDhqhx_1W3lbf.webp 2048w, /_astro/10.D5VDhqhx_Lgv8d.webp 2560w, /_astro/10.D5VDhqhx_ZxiMtQ.webp 3826w&quot; /&gt;&lt;/p&gt;&lt;p&gt;在完成这一步后，记得回头检查相册网站中的检查项!&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;137&quot; src=&quot;/_astro/11.CBh-uv-j_Z1Fq0kJ.webp&quot; srcset=&quot;/_astro/11.CBh-uv-j_IvoIp.webp 640w, /_astro/11.CBh-uv-j_23BAm9.webp 750w, /_astro/11.CBh-uv-j_1RNdrE.webp 828w, /_astro/11.CBh-uv-j_Z1Fq0kJ.webp 1037w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 绑定你的域名&lt;a href=&quot;#23-绑定你的域名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vercel 为你提供的域名难以记忆，且在中国大陆访问受限，建议绑定一个自己的域名，跟随步骤在你域名 DNS 中添加 CNAME 记录：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;3014&quot; height=&quot;1122&quot; src=&quot;/_astro/12.B6z9lbOD_2iLRV5.webp&quot; srcset=&quot;/_astro/12.B6z9lbOD_Z1UQzpu.webp 640w, /_astro/12.B6z9lbOD_1y7y28.webp 750w, /_astro/12.B6z9lbOD_ZOKCkl.webp 828w, /_astro/12.B6z9lbOD_ZJKKvt.webp 1080w, /_astro/12.B6z9lbOD_1wT3zO.webp 1280w, /_astro/12.B6z9lbOD_2izVmm.webp 1668w, /_astro/12.B6z9lbOD_27cxf4.webp 2048w, /_astro/12.B6z9lbOD_ZjKv1v.webp 2560w, /_astro/12.B6z9lbOD_2iLRV5.webp 3014w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1571&quot; height=&quot;611&quot; src=&quot;/_astro/13.B7xatYJT_Z3MUp.webp&quot; srcset=&quot;/_astro/13.B7xatYJT_ZNinB8.webp 640w, /_astro/13.B7xatYJT_1JB0KM.webp 750w, /_astro/13.B7xatYJT_Z2oJTTS.webp 828w, /_astro/13.B7xatYJT_1TXoNB.webp 1080w, /_astro/13.B7xatYJT_1eadNV.webp 1280w, /_astro/13.B7xatYJT_Z3MUp.webp 1571w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 配置对象存储 以 R2 为例&lt;a href=&quot;#3-配置对象存储-以-r2-为例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 建立存储桶&lt;a href=&quot;#31-建立存储桶&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Cloudflare 中创建一个 R2 存储桶，选项皆为默认，无需更改。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;1171&quot; src=&quot;/_astro/14.CaeM8ol-_1GnQHr.webp&quot; srcset=&quot;/_astro/14.CaeM8ol-_Z1cOwa8.webp 640w, /_astro/14.CaeM8ol-_ZotI6Y.webp 750w, /_astro/14.CaeM8ol-_ZlyHsf.webp 828w, /_astro/14.CaeM8ol-_ZAE9rk.webp 1080w, /_astro/14.CaeM8ol-_Z1wME0M.webp 1280w, /_astro/14.CaeM8ol-_1GnQHr.webp 1494w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 修改 CORS 策略&lt;a href=&quot;#32-修改-cors-策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将 R2 的 CORS 策略修改为如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;AllowedHeaders&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;AllowedMethods&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;GET&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;PUT&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;AllowedOrigins&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;http://localhost:3000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;vercel域名&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;&quot;你的域名&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2238&quot; height=&quot;587&quot; src=&quot;/_astro/15.BvCRiIPa_ZqhMv9.webp&quot; srcset=&quot;/_astro/15.BvCRiIPa_1PGrfV.webp 640w, /_astro/15.BvCRiIPa_WzU3J.webp 750w, /_astro/15.BvCRiIPa_ZDASIb.webp 828w, /_astro/15.BvCRiIPa_1eLQ2c.webp 1080w, /_astro/15.BvCRiIPa_Z4H981.webp 1280w, /_astro/15.BvCRiIPa_Z23P6tq.webp 1668w, /_astro/15.BvCRiIPa_cVEeM.webp 2048w, /_astro/15.BvCRiIPa_ZqhMv9.webp 2238w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 启用公共托管&lt;a href=&quot;#33-启用公共托管&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以通过以下两种方式之一设置公有存储桶：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;将您的存储桶公开为受您控制的自定义域（在设置-自定义域中增加自己的域名）&lt;/li&gt;
&lt;li&gt;使用 Cloudflare 托管的 &lt;code&gt;https://r2.dev&lt;/code&gt; 子域为非生产使用案例公开您的存储桶。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.4 创建 API 并配置环境变量&lt;a href=&quot;#34-创建-api-并配置环境变量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过选择“Manage R2 API Tokens”并单击“Create API Token”来创建 API 令牌。&lt;/p&gt;&lt;p&gt;选择“对象读写”，选择“仅应用于特定存储桶”，然后选择创建的存储桶。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2279&quot; height=&quot;2284&quot; src=&quot;/_astro/16._C_RKbg9_ZbU3ES.webp&quot; srcset=&quot;/_astro/16._C_RKbg9_Z1Y6veD.webp 640w, /_astro/16._C_RKbg9_yndlX.webp 750w, /_astro/16._C_RKbg9_Z1YHfcG.webp 828w, /_astro/16._C_RKbg9_Z21USOx.webp 1080w, /_astro/16._C_RKbg9_Z169JTB.webp 1280w, /_astro/16._C_RKbg9_1PAOfs.webp 1668w, /_astro/16._C_RKbg9_1V4ckr.webp 2048w, /_astro/16._C_RKbg9_ZbU3ES.webp 2279w&quot; /&gt;&lt;/p&gt;&lt;p&gt;在 Vercel 中增加对象存储环境变量并重新部署。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AUTH_SECRET&lt;/code&gt;：&lt;a href=&quot;https://generate-secret.vercel.app/32&quot; target=&quot;_blank&quot;&gt;生成 auth secret&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ADMIN_EMAIL&lt;/code&gt;：用户邮箱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;：用户密码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLOUDFLARE_R2_ACCESS_KEY&lt;/code&gt;：API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLOUDFLARE_R2_SECRET_ACCESS_KEY&lt;/code&gt;：API 密匙&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NEXT_PUBLIC_CLOUDFLARE_R2_BUCKET&lt;/code&gt; ：存储桶名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NEXT_PUBLIC_CLOUDFLARE_R2_ACCOUNT_ID&lt;/code&gt; ：账户 ID（位于 R2 概述页面上）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_DOMAIN&lt;/code&gt; ： “your-custom-domain.com” 或 “pub-jf90908…s0d9f8s0s9df.r2.dev”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2244&quot; height=&quot;1583&quot; src=&quot;/_astro/17.3sR7jCB9_23E643.webp&quot; srcset=&quot;/_astro/17.3sR7jCB9_1qtolu.webp 640w, /_astro/17.3sR7jCB9_1yBOFc.webp 750w, /_astro/17.3sR7jCB9_Zd2qg3.webp 828w, /_astro/17.3sR7jCB9_IQPse.webp 1080w, /_astro/17.3sR7jCB9_Z2eN5Ew.webp 1280w, /_astro/17.3sR7jCB9_Zawcgi.webp 1668w, /_astro/17.3sR7jCB9_Z1HNgyW.webp 2048w, /_astro/17.3sR7jCB9_23E643.webp 2244w&quot; /&gt;&lt;/p&gt;&lt;p&gt;随后访问 Vercel 上的项目，导航到“部署”选项卡，单击最近部署旁边的 ••• 按钮，然后选择“重新部署”&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 上传你的第一张照片&lt;a href=&quot;#4-上传你的第一张照片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;登录到相册后台，在 &lt;code&gt;your-domain.com/admin/configuration&lt;/code&gt; 路径中看到如下，恭喜你！你成功部署了 &lt;strong&gt;EXIF Photo Blog&lt;/strong&gt;，上传你的第一张照片吧：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1778&quot; height=&quot;1238&quot; src=&quot;/_astro/18.BNiLFmqf_Z1jfsks.webp&quot; srcset=&quot;/_astro/18.BNiLFmqf_Z27Pkqs.webp 640w, /_astro/18.BNiLFmqf_w8o1g.webp 750w, /_astro/18.BNiLFmqf_1iX3Jv.webp 828w, /_astro/18.BNiLFmqf_ZcBtBG.webp 1080w, /_astro/18.BNiLFmqf_YWOeH.webp 1280w, /_astro/18.BNiLFmqf_ZTFVvQ.webp 1668w, /_astro/18.BNiLFmqf_Z1jfsks.webp 1778w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「旅行 成都」于蓉城的片刻安宁</title><link>https://www.chaxuji.de/posts/chengdu/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/chengdu/</guid><description>去年准备了一年的考研最终还是取得了理想的成功。3月底要去成都面试，也是第一次去成都，写一些随想来珍藏这次旅行！</description><pubDate>Sat, 26 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;1. 旅途的开始&lt;a href=&quot;#1-旅途的开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;3月底要去成都面试，也是第一次去成都&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「SillyTavern」在 VPS 上部署酒馆，与无数虚拟角色对话</title><link>https://www.chaxuji.de/posts/sillytavern/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/sillytavern/</guid><description>SillyTavern 是一个开源的 AI 聊天前端，专为角色扮演（Role-Playing）和故事创作爱好者打造。</description><pubDate>Sun, 16 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;1. 什么是 SillyTavern&lt;a href=&quot;#1-什么是-sillytavern&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;SillyTavern&lt;/strong&gt; 是一个由社区开发的开源项目，旨在为用户提供一个与人工智能语言模型进行交互的聊天界面。它主要用于与各种大型语言模型（例如 OpenAI 的 GPT 系列模型）进行对话，特别是在角色扮演和故事创作等方面。&lt;/p&gt;&lt;p&gt;SillyTavern 的主要特点和功能包括：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;角色扮演&lt;/strong&gt;：用户可以创建或导入自定义的角色设定，与 AI 在特定的情境下进行对话。这对于想要进行故事创作、角色扮演游戏或模拟对话的用户非常有用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;自定义设定&lt;/strong&gt;：提供了丰富的配置选项，允许用户调整 AI 的行为方式，包括语言风格、角色背景、情节发展等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多模型支持&lt;/strong&gt;：除了支持 OpenAI 的模型外，SillyTavern 还兼容其他语言模型，如本地运行的开源模型。这使得用户在选择模型时有更大的灵活性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用户友好的界面&lt;/strong&gt;：提供了直观的网页界面，方便用户与 AI 进行交互，无需复杂的命令行操作。&lt;/p&gt;&lt;p&gt;需要注意的是，SillyTavern 本身并不提供 AI 模型或计算资源。用户在使用时需要自行配置并连接到所选的语言模型，这可能涉及到额外的设置或费用。此外，由于涉及 AI 生成内容，用户应注意遵守相关的法律法规和道德准则，避免生成不适当或有害的内容。&lt;/p&gt;&lt;p&gt;总的来说，SillyTavern 为希望与 AI 模型进行深入互动的用户提供了一个强大而灵活的工具，特别适合于创意写作、角色扮演和对话模拟等应用场景。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;SillyTavern&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;640&quot; src=&quot;/_astro/1.B1vg6Tb6_6q6xd.webp&quot; srcset=&quot;/_astro/1.B1vg6Tb6_DiQ2x.webp 640w, /_astro/1.B1vg6Tb6_Zpg7KO.webp 750w, /_astro/1.B1vg6Tb6_1igtUC.webp 828w, /_astro/1.B1vg6Tb6_znmNe.webp 1080w, /_astro/1.B1vg6Tb6_6q6xd.webp 1280w&quot; /&gt;&lt;figcaption&gt;SillyTavern&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 在 VPS 上部署&lt;a href=&quot;#2-在-vps-上部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 准备工作&lt;a href=&quot;#21-准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 node.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nodejs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 npm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 运行 SillyTavern&lt;a href=&quot;#22-运行-sillytavern&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 拉取 SillyTavern&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/SillyTavern/SillyTavern&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SillyTavern&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 运行酒馆&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 配置 SillyTavern&lt;a href=&quot;#23-配置-sillytavern&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>「LobeChat」部署你的私人AI助手</title><link>https://www.chaxuji.de/posts/lobechat/</link><guid isPermaLink="true">https://www.chaxuji.de/posts/lobechat/</guid><description>LobeChat 是一款高颜值、功能强大的开源 AI 聊天框架，让你能轻松自部署一个集成了 OpenAI、Claude、Ollama 等几乎所有主流大模型的私人 AI 助手。</description><pubDate>Tue, 19 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;1. 前言&lt;a href=&quot;#1-前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 为什么要部署私有化 AI 助手 s&lt;a href=&quot;#11-为什么要部署私有化-ai-助手-s&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在体验了 OpenWebUI、Web LMM 等开源项目后，我最终选择了部署 &lt;strong&gt;LobeChat&lt;/strong&gt; 作为我的私人 AI 助手 Web 界面。原因很实在：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;灵活切换 AI 模型&lt;/strong&gt;：轻松对接 OpenAI、Claude、Gemini、Ollama 等多家服务商的 API。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私无虞&lt;/strong&gt;：敏感对话数据完全掌握在自己或信任的服务器上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络畅通无阻&lt;/strong&gt;：在国内环境下也能顺畅使用海外 AI 服务（前提是 API 可访问）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分享协作便捷&lt;/strong&gt;：服务端版本可以让朋友或团队成员轻松接入使用。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你也追求一个更个性化、更安全、访问更便捷的 AI 对话体验，部署一个独属的 LobeChat 是绝佳选择。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;为什么要部署LobeChat&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;881&quot; src=&quot;/_astro/1.Bi-O5gB9_Z1DbQyf.webp&quot; srcset=&quot;/_astro/1.Bi-O5gB9_SC9JO.webp 640w, /_astro/1.Bi-O5gB9_pOWXM.webp 750w, /_astro/1.Bi-O5gB9_wrtVq.webp 828w, /_astro/1.Bi-O5gB9_12AhlP.webp 1080w, /_astro/1.Bi-O5gB9_Z17XzVd.webp 1280w, /_astro/1.Bi-O5gB9_2mNSnX.webp 1668w, /_astro/1.Bi-O5gB9_Z1DbQyf.webp 1888w&quot; /&gt;&lt;figcaption&gt;为什么要部署LobeChat&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 关于 LobeChat&lt;a href=&quot;#12-关于-lobechat&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://lobehub.com&quot; target=&quot;_blank&quot;&gt;LobeChat&lt;/a&gt; 是由 LobeHub 团队开发的开源 ChatGPT/LLM 用户界面框架。核心亮点如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全能兼容者&lt;/strong&gt;：支持几乎所有主流平台 API (OpenAI, Claude 3, Gemini, Perplexity, Mistral, Ollama 等)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“感官”丰富&lt;/strong&gt;：具备视觉识别 (看图说话) 和语音合成 (TTS) 功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无限可能&lt;/strong&gt;：强大的插件系统拓展功能边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI“应用商店”&lt;/strong&gt;：内置 Agent 市场，可以创建、使用和分享预设助手 (类似 GPTs)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一键即拥&lt;/strong&gt;：提供简洁的 Docker 部署方案，轻松拥有私人 ChatGPT。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;LobeChat的亮点&quot; loading=&quot;lazy&quot; width=&quot;1467&quot; height=&quot;840&quot; src=&quot;/_astro/2.BKHpPI7m_u2fsW.webp&quot; srcset=&quot;/_astro/2.BKHpPI7m_18pRAr.webp 640w, /_astro/2.BKHpPI7m_2p9lA5.webp 750w, /_astro/2.BKHpPI7m_ZdUjzx.webp 828w, /_astro/2.BKHpPI7m_ZxhfjJ.webp 1080w, /_astro/2.BKHpPI7m_1PJTof.webp 1280w, /_astro/2.BKHpPI7m_u2fsW.webp 1467w&quot; /&gt;&lt;figcaption&gt;LobeChat的亮点&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 起步：Docker 部署 LobeChat 客户端（快速尝鲜）&lt;a href=&quot;#2-起步docker-部署-lobechat-客户端快速尝鲜&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你仅仅是自己使用或希望将数据保存在本地，你可以选择部署流程更为简单的 LobeChat 客户端。&lt;/p&gt;&lt;p&gt;官方文档所给出的 docker 部署代码如下，你也可以手动拉取镜像 &lt;code&gt;lobe-chat&lt;/code&gt; 来部署容器。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3210:3210&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e &lt;/span&gt;&lt;span&gt;OPENAI_API_KEY=sk-xxxx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e &lt;/span&gt;&lt;span&gt;ACCESS_CODE=lobe66&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--name &lt;/span&gt;&lt;span&gt;lobe-chat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lobehub/lobe-chat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;-p 3210:3210&lt;/code&gt;: 将容器内部的 3210 端口映射到主机。确保主机 3210 端口空闲，可更换（如 &lt;code&gt;-p 8080:3210&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e ACCESS_CODE=lobe66&lt;/code&gt;: &lt;strong&gt;强烈建议设置访问码&lt;/strong&gt;，防止他人随意访问。将其替换为你自己的强密码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;: **无需在启动命令中填写，**启动后访问 &lt;code&gt;http://localhost:3210&lt;/code&gt; (或你映射的端口)，在 Web UI 设置页面灵活添加/管理任意 API Key。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;访问应用：浏览器打开 &lt;code&gt;http://你的服务器IP:端口&lt;/code&gt; (如 &lt;code&gt;http://localhost:3210&lt;/code&gt;)，输入设置的 &lt;code&gt;ACCESS_CODE&lt;/code&gt; 即可开始使用！&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 单机客户端模式的数据存储在浏览器本地，换设备或清除缓存会丢失历史记录。如需&lt;strong&gt;多端同步、多人共享&lt;/strong&gt;，请继续看服务端部署。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 进阶：Docker Compose 部署 LobeChat 服务端（数据持久化）&lt;a href=&quot;#3-进阶docker-compose-部署-lobechat-服务端数据持久化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 LobeChat 服务端的意义&lt;a href=&quot;#31-lobechat-服务端的意义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;服务端版本利用数据库存储数据，实现了&lt;strong&gt;多端同步、多人协作&lt;/strong&gt;。使用 Docker Compose 能让部署流程更清晰。核心组件包括：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LobeChat (Server)：&lt;/strong&gt; 核心应用（数据库版本）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL (with PGVector)：&lt;/strong&gt; 存放聊天记录和嵌入向量数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(可选) S3 对象存储 (如 MinIO/Cloudflare R2):&lt;/strong&gt; 用于存储图片、文件等附件（纯文本对话可忽略）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(可选) SSO 认证服务 (如 Auth0, Logto)：&lt;/strong&gt; 用于替代简单访问码，提供企业级登录（示例使用 Auth0/Logto）。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 准备配置文件&lt;a href=&quot;#32-准备配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;本次部署仅本地部署 LobeChat 数据库版本及 PostgreSQL 数据库，使用 Cloudflare R2 对象存储服务和 Auth0 登录鉴权服务，&lt;code&gt;docker-compose.yml&lt;/code&gt; 及 &lt;code&gt;环境变量.env&lt;/code&gt; 如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lobe-chat-database&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;postgresql&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pgvector/pgvector:pg16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lobe-postgres&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;5432:5432&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;./data:/var/lib/postgresql/data&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;POSTGRES_DB=lobe&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;POSTGRES_PASSWORD=uWNZugjBqixf8dxC&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&apos;CMD-SHELL&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;pg_isready -U postgres&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retries&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;lobe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lobehub/lobe-chat-database&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lobe-chat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;3210:3210&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;postgresql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;env_file&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;s3_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，LobeChat 域名，用于 tRPC 调用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;APP_URL=https://lobe.example.com/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Postgres 相关，也即 DB 必需的环境变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，用于加密敏感信息的密钥，可以使用 openssl rand -base64 32 生成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，Postgres 数据库连接字符串，用于连接到数据库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 格式：postgresql://username:password@host:port/dbname，如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中，亦可使用容器名作为 host&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/lobe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# NEXT_AUTH 相关，也即鉴权服务必需的环境变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可以使用 auth0、Azure AD、GitHub、Authentik、Zitadel、Logto 等，如有其他接入诉求欢迎提 PR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 目前支持的鉴权服务提供商请参考：https://lobehub.com/zh/docs/self-hosting/advanced/auth#next-auth&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果你有 ACCESS_CODE，请务必清空，我们以 NEXT_AUTH 作为唯一鉴权来源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，用于 NextAuth 的密钥，可以使用 openssl rand -base64 32 生成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，指定鉴权服务提供商，这里以 Logto 为例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NEXT_AUTH_SSO_PROVIDERS=logto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，NextAuth 的 URL，用于 NextAuth 的回调&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NEXTAUTH_URL=https://lobe.example.com/api/auth&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# NextAuth 鉴权服务提供商部分，以 Logto 为例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 其他鉴权服务提供商所需的环境变量，请参考：https://lobehub.com/zh/docs/self-hosting/environment-variables/auth&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_LOGTO_ID=YOUR_LOGTO_ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_LOGTO_SECRET=YOUR_LOGTO_SECRET&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_LOGTO_ISSUER=https://lobe-auth-api.example.com/oidc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 代理相关，如果你需要的话（比如你使用 GitHub 作为鉴权服务提供商）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# HTTP_PROXY=http://localhost:7890&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# HTTPS_PROXY=http://localhost:7890&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# S3 相关，也即非结构化数据（文件、图片等）存储必需的环境变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这里以 MinIO 为例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，S3 的 Access Key ID，对于 MinIO 来说，直到在 MinIO UI 中手动创建之前都是无效的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_ACCESS_KEY_ID=YOUR_S3_ACCESS_KEY_ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，S3 的 Secret Access Key，对于 MinIO 来说，直到在 MinIO UI 中手动创建之前都是无效的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，S3 的 Endpoint，用于服务端/客户端连接到 S3 API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_ENDPOINT=https://lobe-s3-api.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，S3 的 Bucket，直到在 MinIO UI 中手动创建之前都是无效的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_BUCKET=lobe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必填，S3 的 Public Domain，用于客户端通过公开连接访问非结构化数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_PUBLIC_DOMAIN=https://lobe-s3-api.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选填，S3 的 Enable Path Style&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 对于主流 S3 Cloud 服务商，一般填 0 即可；对于自部署的 MinIO，请填 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 请参考：https://lobehub.com/zh/docs/self-hosting/advanced/s3#s-3-enable-path-style&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_ENABLE_PATH_STYLE=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 其他基础环境变量，视需求而定。注意不要有 ACCESS_CODE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 请参考：https://lobehub.com/zh/docs/self-hosting/environment-variables/basic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 请注意，对于服务端版本，其 API 必须支持嵌入（OpenAI text-embedding-3-small）模型，否则无法对上传文件进行处理，但你无需在 OPENAI_MODEL_LIST 中指定此模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENAI_API_KEY=sk-xxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENAI_PROXY_URL=https://api.openai.com/v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENAI_MODEL_LIST=...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;查看 &lt;a href=&quot;https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/auth0&quot; target=&quot;_blank&quot;&gt;LobeChat 官方文档&lt;/a&gt; 以配置 Auth0 登录鉴权服务&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;重要安全提醒：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;务必&lt;/strong&gt;将 &lt;code&gt;KEY_VAULTS_SECRET&lt;/code&gt;, &lt;code&gt;NEXT_AUTH_SECRET&lt;/code&gt;, &lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt;, &lt;code&gt;AUTH_LOGTO_SECRET&lt;/code&gt;, &lt;code&gt;S3_SECRET_ACCESS_KEY&lt;/code&gt; 等替换为&lt;strong&gt;你自己生成的、高强度随机值&lt;/strong&gt;！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保护好&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt; &lt;strong&gt;文件&lt;/strong&gt;！它含有所有敏感信息，切勿提交到公开仓库或泄露。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;配置认证服务 (Critical Step!):&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;根据你选择的 &lt;code&gt;NEXT_AUTH_SSO_PROVIDERS&lt;/code&gt; (如 Auth0, Logto, GitHub 等)，&lt;strong&gt;严格按照&lt;/strong&gt; &lt;a href=&quot;https://lobehub.com/zh/docs/self-hosting/advanced/auth&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;LobeChat 认证文档&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;和你的认证服务商文档进行配置&lt;/strong&gt;。必须确保：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APP_URL&lt;/code&gt; (如 &lt;code&gt;https://your.domain.com&lt;/code&gt;) 已正确添加到你认证服务商的 &lt;strong&gt;应用回调 URL (&lt;/strong&gt;&lt;code&gt;Redirect/Callback URIs&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt; 和 &lt;strong&gt;CORS 允许的来源 (&lt;/strong&gt;&lt;code&gt;Allowed Origins&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;Allowed Web Origins&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;Trusted Origins&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt; 列表中。&lt;/li&gt;
&lt;li&gt;将认证服务商提供的应用程序 ID (&lt;code&gt;Client ID&lt;/code&gt;) 和密钥 (&lt;code&gt;Client Secret&lt;/code&gt;) 正确填入 &lt;code&gt;.env&lt;/code&gt; 文件。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 正式部署&lt;a href=&quot;#33-正式部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;新建一个目录，用于存放你的配置文件和后续的数据库文件，如 &lt;code&gt;lobe-chat-db&lt;/code&gt; 。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat-db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat-db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将修改好配置的 &lt;code&gt;docker-compose.yml&lt;/code&gt; 和 &lt;code&gt;.env&lt;/code&gt; 文件放在目录中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动 Docker&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;code&gt;http://localhost:3210&lt;/code&gt; 访问你的 LobeChat 服务。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 后续&lt;a href=&quot;#4-后续&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;成功部署（无论是客户端或服务端）后：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置 API Key：&lt;/strong&gt; 进入 Web UI 的设置 (&lt;code&gt;Settings&lt;/code&gt;) -&amp;gt; &lt;code&gt;通用设置&lt;/code&gt; -&amp;gt; &lt;code&gt;语言模型服务提供商&lt;/code&gt;。点击 &lt;code&gt;添加服务商&lt;/code&gt;，选择你使用的服务（如 OpenAI, Claude, Ollama 等），填入对应的 API Key 和必要信息（如基础 URL）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(服务端) 探索更多：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;插件/代理/工具:&lt;/strong&gt; 在设置中启用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型市场:&lt;/strong&gt; 可安装使用 Agent Market 中的预设助手。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户管理:&lt;/strong&gt; 通过 SSO 登录的用户会自动创建账户（需配合认证服务商）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(可选) S3 存储:&lt;/strong&gt; 如果配置正确，聊天中的文件上传将被存储到你的 S3 Bucket。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;模型市场&quot; loading=&quot;lazy&quot; width=&quot;1804&quot; height=&quot;867&quot; src=&quot;/_astro/3.CLXLx4Cb_ZCFq56.webp&quot; srcset=&quot;/_astro/3.CLXLx4Cb_Z529o7.webp 640w, /_astro/3.CLXLx4Cb_1tamr2.webp 750w, /_astro/3.CLXLx4Cb_1RwP1W.webp 828w, /_astro/3.CLXLx4Cb_lDkPh.webp 1080w, /_astro/3.CLXLx4Cb_2aM4VI.webp 1280w, /_astro/3.CLXLx4Cb_ljiUF.webp 1668w, /_astro/3.CLXLx4Cb_ZCFq56.webp 1804w&quot; /&gt;&lt;figcaption&gt;模型市场&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>