<?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>9LL.UK</description><link>https://www.9ll.uk/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.10</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月18日 22:24:44</lastBuildDate><item><title>MiniMax H3 工作流分享：不用4步LoRA，速度还快5倍</title><link>https://www.9ll.uk/posts/ai/comfyui/minimax-h3-workflow/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/comfyui/minimax-h3-workflow/</guid><description>分享一个 MiniMax H3 的 ComfyUI 工作流，不用官方4步LoRA，生成速度和质量反而更好</description><pubDate>Tue, 11 Aug 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;MiniMax H3 官方说 3060 能跑，但实际上很多人跑起来还是很吃力。我折腾了好几天，找到了一个工作流，不仅能跑，而且直接提速 500%。&lt;/p&gt;&lt;p&gt;更离谱的是，这个工作流甚至没用官方 4 步 LoRA，但生成速度和质量都比用了 LoRA 的更优秀。&lt;/p&gt;&lt;p&gt;下面把模型下载、插件、配置、实测数据都整理一遍。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Comfyui/Workflow/H3-3.0.json&quot; target=&quot;_blank&quot;&gt;Share/Comfyui/Workflow/H3-3.0.json at main · hy4962/Share&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;工作流截图&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1154&quot; src=&quot;/_astro/image-006.BorLp2mm_Z2bUhzB.webp&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;模型下载&lt;a href=&quot;#模型下载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;来源&lt;/th&gt;&lt;th&gt;地址&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;HuggingFace&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://huggingface.co/Comfy-Org/MiniMax-H3/tree/main&quot; target=&quot;_blank&quot;&gt;Comfy-Org/MiniMax-H3&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;国内源&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.modelscope.cn/models/Comfy-Org/MiniMax-H3/files&quot; target=&quot;_blank&quot;&gt;ModelScope&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;ul&gt;
&lt;li&gt;GPU：RTX 5070 Ti Laptop（12G 显存）&lt;/li&gt;
&lt;li&gt;内存：32G&lt;/li&gt;
&lt;li&gt;虚拟内存：32G-64G&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;下面这套组合实测可以正常运行：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件类型&lt;/th&gt;&lt;th&gt;文件名&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;diffusion_models&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://huggingface.co/Comfy-Org/MiniMax-H3/blob/main/diffusion_models/minimax_h3_fl2va_int8_convrot.safetensors&quot; target=&quot;_blank&quot;&gt;minimax_h3_fl2va_int8_convrot.safetensors&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;text_encoders&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://huggingface.co/Comfy-Org/MiniMax-H3/blob/main/text_encoders/qwen3vl_32b_minimax_h3_int8_convrot.safetensors&quot; target=&quot;_blank&quot;&gt;qwen3vl_32b_minimax_h3_int8_convrot.safetensors&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;vae&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://huggingface.co/Comfy-Org/MiniMax-H3/tree/main/vae&quot; target=&quot;_blank&quot;&gt;MiniMax-H3 VAE&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tl2012tl/comfyUI-llama-TE&quot; target=&quot;_blank&quot;&gt;comfyUI-llama-TE&lt;/a&gt;：qwen3/qwen3.5/qwen3.7/gemma4 图片反推、提示词扩写高速版&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tl2012tl/TE_MAN&quot; target=&quot;_blank&quot;&gt;TE_MAN&lt;/a&gt;：首个为 ComfyUI 打造的漫剧/增强生图/生视频插件&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;补充插件&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;有些插件在 ComfyUI Manager 里可能搜不到，可以直接从 GitHub 安装：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/goohai/Goohaitools-comfyui&quot; target=&quot;_blank&quot;&gt;Goohaitools&lt;/a&gt;：50 多个实用工具，包括批量加载文件夹图片、自动保存指定 DPI、遮罩分析、人脸矫正等&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/NikoDemon80/ComfyUI-H3-Motion-Context&quot; target=&quot;_blank&quot;&gt;H3-Motion-Context&lt;/a&gt;：MiniMax H3 的 clip chaining，运动和音频能真正跨片段衔接&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&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;ol&gt;
&lt;li&gt;把模板复制给 AI&lt;/li&gt;
&lt;li&gt;把你的想法尽可能详细地描述一下&lt;/li&gt;
&lt;li&gt;AI 就能生成标准格式的提示词&lt;/li&gt;
&lt;li&gt;直接用于生成即可&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;关于提示词模型&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;强烈建议本地部署 Qwen 3.5 无审查版本来生成提示词。哪怕是 Grok，也容易遭到拒绝回答。&lt;/p&gt;&lt;/div&gt;&lt;/div&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;h3&gt;8G 显存用户&lt;a href=&quot;#8g-显存用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你是 8G 显存，把红色的节点换成绿色的即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;8G显存节点替换&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;470&quot; src=&quot;/_astro/image-001.3btS3ysE_ZMVDVh.webp&quot; /&gt;&lt;figcaption&gt;8G显存节点替换&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;使用 Max 模式可以保持非常优秀的人物一致性，但速度会慢一倍。一般 Match 模式也够用了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;一致性模式对比&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;865&quot; src=&quot;/_astro/image-002.4D0yKj_S_Z6MVIQ.webp&quot; /&gt;&lt;figcaption&gt;一致性模式对比&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;由于没有使用 4 步 LoRA，所以步数可以自己设置。默认 10 步，速度很快，质量也不错。追求更高质量可以设成 15 步，这个工作流很快，多几步没什么影响。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;采样步数设置&quot; loading=&quot;lazy&quot; width=&quot;1553&quot; height=&quot;996&quot; src=&quot;/_astro/image-003.DsXmzj2D_Z1jO4Lj.webp&quot; /&gt;&lt;figcaption&gt;采样步数设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;跑了好几天，生成了三四十个 10 秒视频，以下是两个典型场景的耗时：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;场景一：0.4 像素，8 秒视频&lt;a href=&quot;#场景一04-像素8-秒视频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;总时长 249 秒，直出 0.4 像素 8 秒视频。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;0.4像素8秒视频耗时&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;827&quot; src=&quot;/_astro/image-004.CyHApJQl_ZXfwGB.webp&quot; /&gt;&lt;figcaption&gt;0.4像素8秒视频耗时&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;场景二：0.9 像素，10 秒视频&lt;a href=&quot;#场景二09-像素10-秒视频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;也可以直出 0.9 像素 10 秒视频，总时长约 1000 秒。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;0.9像素10秒视频耗时&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;725&quot; src=&quot;/_astro/image-005.DBEFjRA4_Z2nnuXh.webp&quot; /&gt;&lt;figcaption&gt;0.9像素10秒视频耗时&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;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;有时候衣服或者部分场景对不上文字描述，这是因为在 Full-Reference Mode（全参考模式）下，AI 的优先级逻辑是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最高优先级&lt;/strong&gt;：&lt;code&gt;&amp;lt;Picture N&amp;gt;&lt;/code&gt;（参考图）中的视觉特征&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;次级优先级&lt;/strong&gt;：&lt;code&gt;&amp;lt;Subject N&amp;gt;&lt;/code&gt; 定义的文字描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最低优先级&lt;/strong&gt;：&lt;code&gt;detailed_description&lt;/code&gt; 中的动态场景描写&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;不过实测更强烈的文字描述可以跨越优先级，所以描述写详细一点是有用的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;提示词 Skill 推荐&lt;a href=&quot;#提示词-skill-推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;目前只推荐官方原版的提示词 Skill。试了很多其他 UP 主的，发现效果都不如官方 Skill。有些 UP 的提示词适用范围太小，有些太短，不太通用。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/MiniMax-AI/MiniMax-H3/tree/main/skills&quot; target=&quot;_blank&quot;&gt;MiniMax-H3/skills at main · MiniMax-AI/MiniMax-H3&lt;/a&gt;&lt;/p&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;这个工作流的核心优势就是：不用官方 4 步 LoRA，速度反而更快，质量也不错。对于显存有限的用户来说，是个比较好的选择。&lt;/p&gt;&lt;p&gt;如果有什么问题或者更好的配置方案，欢迎交流。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Krea2 四视图生成：必备模型与可选 LoRA 分享</title><link>https://www.9ll.uk/posts/ai/comfyui/krea2fourviewshare/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/comfyui/krea2fourviewshare/</guid><description>分享 Krea2 四视图生成的必备模型和可选 LoRA。</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在用 Krea2 生成四视图，整理了一下必备模型和可选 LoRA，方便后续使用。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Comfyui/Workflow/Krea2%E5%9B%9B%E8%A7%86%E5%9B%BE.json&quot; target=&quot;_blank&quot;&gt;Share/Comfyui/Workflow/Krea2四视图.json at main · hy4962/Share&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;p&gt;以下三个模型是 Krea2 四视图生成的基础，缺一不可。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Krea2 模型&lt;/strong&gt;：&lt;a href=&quot;https://huggingface.co/Comfy-Org/Krea-2/blob/main/diffusion_models/krea2_turbo_fp8_scaled.safetensors&quot; target=&quot;_blank&quot;&gt;krea2_turbo_fp8_scaled.safetensors&lt;/a&gt; - 核心扩散模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本编码器&lt;/strong&gt;：&lt;a href=&quot;https://huggingface.co/Comfy-Org/Qwen3-VL/blob/main/text_encoders/qwen3vl_4b_bf16.safetensors&quot; target=&quot;_blank&quot;&gt;qwen3vl_4b_bf16.safetensors&lt;/a&gt; - Qwen3-VL 文本编码器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VAE&lt;/strong&gt;：&lt;a href=&quot;https://huggingface.co/hy4962/Share/blob/main/Comfyui/vae/qwenImage_qwenImageVAE.safetensors&quot; target=&quot;_blank&quot;&gt;qwenImage_qwenImageVAE.safetensors&lt;/a&gt; - QwenImage VAE&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这三个模型都需要下载到 ComfyUI 的对应目录中。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;可选 LoRA&lt;a href=&quot;#可选-lora&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可选的 LoRA 模型来自魔搭社区的作者 &lt;a href=&quot;https://www.modelscope.cn/profile/yan303145427&quot; target=&quot;_blank&quot;&gt;yan303145427&lt;/a&gt;，他分享了多个 Krea2 风格的 LoRA。&lt;/p&gt;&lt;p&gt;我个人目前只用 &lt;a href=&quot;https://www.modelscope.cn/models/yan303145427/krea2-Cc-FQWZ-ArtStyle/file/view/20260716204803/krea2-Cc%E9%A3%8E%E6%83%85%E4%B8%87%E7%A7%8D-%E9%A3%8E%E6%A0%BC.safetensors?status=2&quot; target=&quot;_blank&quot;&gt;krea2-Cc风情万种-风格&lt;/a&gt; 这个 LoRA。这个作者的 krea2 lora 都很不错，可以根据自己的风格选择。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;示例图&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1213&quot; src=&quot;/_astro/cover.DPMog2a5_25efIz.webp&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;使用说明&lt;a href=&quot;#使用说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;下载好模型后，可以参考这个 &lt;a href=&quot;https://www.bilibili.com/video/BV14Zu16YERZ/?share_source=copy_web&amp;amp;vd_source=ed7d1d02f65398903f7bdbaab5c74522&quot; target=&quot;_blank&quot;&gt;Bilibili 视频&lt;/a&gt; 配置工作流。视频里详细介绍了四视图生成的提示词技巧和加速流配置，这里就不重复了。&lt;/p&gt;&lt;p&gt;如果遇到问题，可以参考视频评论区或作者的其他分享。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>压风散热器 Flydigi BS3：主要是为了给硬盘降温和防尘</title><link>https://www.9ll.uk/posts/recommend/flydigbs3/</link><guid isPermaLink="true">https://www.9ll.uk/posts/recommend/flydigbs3/</guid><description>买了飞智 BS3，主要解决 GW7000 2TB 打游戏 62 度的问题，顺带防尘，没下官方软件，用的是开源的 THRM。</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这玩意确实不是智商税，真的有用。不过我买它不是冲着 CPU/GPU 降温去的，主要就两个需求。但是不得不承认他也确实让我的烤鸡温度下降了5到8度(我没用30w的pd头和线跑满血)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一是硬盘降温。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的 GW7000 2TB，打游戏直接 62 度，明明没啥读写。更气的是这不是笔记本的问题——我之前台式机也用这块盘，也是 60 度。台式机上还因为用的是盈通花嫁的 7800XT，matx 主板空间本来就挤，当时也没太好的办法，只能忍。&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;hr /&gt;
&lt;p&gt;看来看去在 BS2 Pro 和 BS3 之间选，看到 BS3 也就 189，还是买新不买旧——虽然 BS2 Pro 比 BS3 散热效果更好，但价格差不多的情况下选新款没什么毛病。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;然后是软件这块。开源社区有人做了第三方控制软件 THRM，智能风扇曲线、硬件监控、RGB、配置文件都有，Windows 和 Linux 都支持。&lt;/p&gt;
&lt;p&gt;我压根没下过官方配套软件……买之前就看到这个项目了，直接用的这个。里面的智能学习功能确实好使，起码我没发现什么坏处。它会根据你的使用习惯自动调整风扇曲线，还有功耗预测前馈——就是 CPU/GPU 功耗突然上来的时候，转速会提前跟上，不会让温度先飙一波再说。&lt;/p&gt;
&lt;p&gt;硬件监控也挺全的，CPU/GPU 温度、功耗、散热器转速都能看到，还能输出到 RTSS 游戏内叠加层，打游戏的时候直接看转速，挺方便的。&lt;/p&gt;
&lt;p&gt;RGB 灯效也能调，亮度、动画速度、灯效模式都能自定义，不过我个人不太在意这个。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/TIANLI0/THRM&quot; target=&quot;_blank&quot;&gt;TIANLI0/THRM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;THRM&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; src=&quot;/_astro/thrm-poster-light.CVzDSse2_Z2kltWn.webp&quot; /&gt;&lt;figcaption&gt;THRM&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20260809235045641&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot; src=&quot;/_astro/image-20260809235045641.CLpHAVHO_ZYnwUw.webp&quot; /&gt;&lt;figcaption&gt;image-20260809235045641&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;截图 1&quot; loading=&quot;lazy&quot; width=&quot;2554&quot; height=&quot;1440&quot; src=&quot;/_astro/screenshot-01.jh3pN7Wo_Z2mNUsW.webp&quot; /&gt;&lt;figcaption&gt;截图 1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;截图 2&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1440&quot; src=&quot;/_astro/screenshot-02.D1xCNc-G_2uD0iK.webp&quot; /&gt;&lt;figcaption&gt;截图 2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;</content:encoded></item><item><title>Anima 局部重绘工作流分享</title><link>https://www.9ll.uk/posts/ai/comfyui/anima-inpainting-workflow/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/comfyui/anima-inpainting-workflow/</guid><description>一个好用的 ComfyUI 局部重绘工作流，用 Anima 模型修复换装/修复手指脚趾也很方便</description><pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在折腾 ComfyUI 的局部重绘，找到了一个挺好用的工作流，分享一下。&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;&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Comfyui/Workflow/Anima%E6%AD%A3%E5%BC%8F%E7%89%88-%E5%B1%80%E9%83%A8%E9%87%8D%E7%BB%98%2B%E9%AB%98%E6%B8%85%E6%94%BE%E5%A4%A7.json&quot; target=&quot;_blank&quot;&gt;Share/Comfyui/Workflow/Anima正式版-局部重绘+高清放大.json at main · hy4962/Share&lt;/a&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;用的是 Anima 这个模型：&lt;a href=&quot;https://civitai.red/models/2458426/anima?modelVersionId=2945208&quot; target=&quot;_blank&quot;&gt;Anima - base-v1.0 | Anima Checkpoint | Civitai&lt;/a&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;1693&quot; height=&quot;966&quot; src=&quot;/_astro/model-select.CADWoTCy_1GpyKh.webp&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;工作流结构&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;figure&gt;&lt;img alt=&quot;工作流预览&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1213&quot; src=&quot;/_astro/workflow-overview.D-ooTgOM_1Pyjyv.webp&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;使用方法&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;figure&gt;&lt;img alt=&quot;打开遮罩&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;1009&quot; src=&quot;/_astro/open-mask.B9VZJR7F_ZCq0iY.webp&quot; /&gt;&lt;figcaption&gt;打开遮罩&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;2294&quot; height=&quot;1049&quot; src=&quot;/_astro/paint-mask.BLkjYtQD_dplbf.webp&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;使用体验&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;。比如想给图里的人换件衣服，圈出衣服区域涂黑，生成出来很自然，和原图融合得很好。&lt;/p&gt;&lt;p&gt;手指、脚趾这些细节修起来也很方便，圈个遮罩就能搞定。Anima 模型本身就不容易出这些部位的错误，但万一有问题，用这个工作流修复也很顺手。&lt;/p&gt;&lt;p&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;ComfyUI 局部重绘工作流，用 Anima 模型，人像修复效果很好，推荐试试。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>ComfyUI 图像放大工作流：从文生图工作流中抽取的独立放大方案</title><link>https://www.9ll.uk/posts/ai/comfyui/upscaleworkflow/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/comfyui/upscaleworkflow/</guid><description>分享我从 ComfyUI 文生图工作流中抽取的独立图像放大工作流，包含模型配置、节点设置和使用心得</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在用 ComfyUI 做图像放大，发现把放大功能从文生图工作流里抽出来单独用，确实方便很多。&lt;/p&gt;
&lt;p&gt;之前文生图工作流里也带放大功能，但每次想单独放大一张图，还得加载整个文生图流程，加载模型多、显存占用大，而且参数混在一起不好调。干脆直接抽出来，做成一个独立的放大工作流。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Comfyui/Workflow/%E6%94%BE%E5%A4%A7.json&quot; target=&quot;_blank&quot;&gt;Share/Comfyui/Workflow/放大.json at main · hy4962/Share&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;p&gt;主要原因就一个：&lt;strong&gt;方便抽卡和管理&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;文生图工作流里，放大参数和生成参数混在一起，想调放大效果还得在一堆节点里找。单独抽出来之后，所有放大相关的配置一目了然，改参数也方便。&lt;/p&gt;&lt;p&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;工作流整体配置&quot; loading=&quot;lazy&quot; width=&quot;2380&quot; height=&quot;1129&quot; src=&quot;/_astro/workflow-overview.CR4cUHzh_Z9rm3G.webp&quot; /&gt;&lt;figcaption&gt;工作流整体配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;主要分几个部分：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;模型加载区&lt;/strong&gt;：加载 UNET、CLIP、VAE 和 LoRA 模型&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;/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;/p&gt;&lt;p&gt;&lt;strong&gt;主模型&lt;/strong&gt;：Flux2-Klein-9B-True-v2-fp8mixed.safetensors&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这是 Klein 系列的主模型，专门针对图像放大优化&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;LoRA 模型&lt;/strong&gt;：Klein_动漫高清放大.safetensors&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这个 LoRA 是专门做动漫风格高清放大的，效果比通用放大好很多&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;CLIP 模型&lt;/strong&gt;：qwen_3_8b_fp8mixed.safetensors&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文本编码器，用 Qwen 3 8B 的 fp8 混合精度版本&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;VAE 模型&lt;/strong&gt;：flux2-vae.safetensors&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Flux2 的 VAE，负责图像的编解码&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;模型下载地址都在 HuggingFace 上，直接搜文件名就能找到：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;主模型：&lt;a href=&quot;https://huggingface.co/buckets/hy4962/Flux2-Klein-9B-True-V2-bucket/tree/Flux2-Klein-9B-True-v2-fp8mixed.safetensors&quot; target=&quot;_blank&quot;&gt;Flux2-Klein-9B-True-v2-fp8mixed.safetensors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LoRA模型：&lt;a href=&quot;https://huggingface.co/buckets/hy4962/Klein_AnimeHDupscaling-bucket/tree/Klein_%E5%8A%A8%E6%BC%AB%E9%AB%98%E6%B8%85%E6%94%BE%E5%A4%A7.safetensors&quot; target=&quot;_blank&quot;&gt;Klein_动漫高清放大.safetensors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CLIP模型：&lt;a href=&quot;https://huggingface.co/buckets/hy4962/qwen_3_8b_fp8mixed-bucket/tree/qwen_3_8b_fp8mixed.safetensors&quot; target=&quot;_blank&quot;&gt;qwen_3_8b_fp8mixed.safetensors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VAE模型：&lt;a href=&quot;https://huggingface.co/buckets/hy4962/flux2-dev-bucket/tree/split_files/vae/flux2-vae.safetensors&quot; target=&quot;_blank&quot;&gt;flux2-vae.safetensors&lt;/a&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;这个工作流里有个很重要的设置，必须注意：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;节点设置要求&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;742&quot; src=&quot;/_astro/node-settings.B2s0epkO_Zw3OqE.webp&quot; /&gt;&lt;figcaption&gt;节点设置要求&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在 PainterFluxImageEdit 节点里，有两个参数必须设置为特定值：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mode&lt;/strong&gt;：必须设置为 &lt;code&gt;1_image&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;batch_size&lt;/strong&gt;：必须设置为 &lt;code&gt;1&lt;/code&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;单独用这个工作流放大图像，确实比在文生图工作流里方便很多：&lt;/p&gt;&lt;ol&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;/ol&gt;&lt;p&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;把这个放大工作流从文生图里抽出来，是我用 ComfyUI 以来做过最正确的决定之一。管理方便、调参方便、显存占用也小。&lt;/p&gt;&lt;p&gt;如果你也在用 ComfyUI 做图像放大，建议也试试单独做一个放大工作流。特别是如果你经常需要放大动漫风格的图像，这个 Klein 系列的模型效果真的不错。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker 一键部署 NewApi API 中转站</title><link>https://www.9ll.uk/posts/deploy/deploynewapi/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deploynewapi/</guid><description>NewApi 是目前大多数 API 中转站都在用的统一网关管理工具，支持几乎所有主流 AI 模型接入，可对外售卖也可个人使用</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;现在市面上绝大多数 API 中转站，后台用的都是 NewApi。&lt;/p&gt;
&lt;p&gt;NewApi 是一个开源的 AI 接口管理与分发系统，基于 One-API 二次开发，功能比原版更丰富。核心作用是把你手上的各种上游 API（OpenAI、Claude、Gemini、各家国产大模型……）统一收进来，然后对外暴露一个标准的 OpenAI 兼容接口。下游不管接的是什么模型，调用方式完全一样，换模型不用改代码。&lt;/p&gt;
&lt;p&gt;用途主要两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对外售卖&lt;/strong&gt;：做中转站，卖 API 额度给用户，有完整的计费、充值、用量统计体系&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人使用&lt;/strong&gt;：统一管理自己的一堆 key，项目里只配一个 NewApi 地址就够了，不用到处存 key&lt;/li&gt;
&lt;/ul&gt;
&lt;section&gt;&lt;h2&gt;NewApi 能做什么&lt;a href=&quot;#newapi-能做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;渠道管理&lt;/strong&gt;：把各家上游 API 添加进来，配置模型映射、优先级、负载均衡。同一个模型名可以对应多个渠道，自动故障转移。支持的模型几乎覆盖全球所有主流官方服务，也可以自定义添加任何 OpenAI 兼容的接口。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;令牌系统&lt;/strong&gt;：对外发放 API Key（令牌），可以设置额度上限、IP 限制、模型白名单、过期时间。每个令牌的用量独立统计，方便管理多个项目或多个用户。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用户管理&lt;/strong&gt;：支持用户注册、充值、配额管理。商业部署的话有完整的前台界面，用户可以自助充值、查看用量、管理自己的令牌。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;计费系统&lt;/strong&gt;：按 token 计费，可以自定义每个模型的倍率。调用日志完整记录，可以按时间、用户、模型、渠道多维度查询。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;监控与告警&lt;/strong&gt;：渠道有健康检查，自动禁用失效的 key，支持邮件告警。&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;这套 Docker Compose 起了三个容器：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;容器&lt;/th&gt;&lt;th&gt;镜像&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;new-api&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;calciumion/new-api:latest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;主服务，提供 Web 界面和 API 端点&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;new-api-redis&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;redis:latest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;缓存层，存储会话、速率限制计数等&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;new-api-postgres&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;postgres:15&lt;/code&gt;&lt;/td&gt;&lt;td&gt;主数据库，存储用户、渠道、日志等所有持久化数据&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Redis 和 PostgreSQL 都配置了持久化，重启不丢数据。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Docker Compose 配置&lt;a href=&quot;#docker-compose-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;创建 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件：&lt;/p&gt;&lt;div&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;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;3.4&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;new-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;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;calciumion/new-api:latest&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;new-api&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;command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;--log-dir /app/logs&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;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;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;&apos;3000:3000&apos;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 如果3000端口冲突，可以改成 &apos;3001:3000&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;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;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;/your/data/path:/data&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;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;/your/logs/path:/app/logs&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;14&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;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# ⚠️ 数据库连接字符串（请确保密码与下方 postgres 的密码一致）&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;SQL_DSN=postgresql://newapi_user:YourStrongPassword123!@postgres:5432/new-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;REDIS_CONN_STRING=redis://redis:6379&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;- &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;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;- &lt;/span&gt;&lt;span&gt;ERROR_LOG_ENABLED=true&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;- &lt;/span&gt;&lt;span&gt;BATCH_UPDATE_ENABLED=true&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;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;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;- &lt;/span&gt;&lt;span&gt;redis&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;postgres&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;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;25&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;&quot;wget -q -O - http://localhost:3000/api/status | grep -o &apos;&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;s*true&apos; || exit 1&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;      &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;30s&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;timeout&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10s&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;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;29&lt;/div&gt;&lt;/div&gt;&lt;div&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;  &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;span&gt;:&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;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;redis:latest&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;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;new-api-redis&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;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;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;redis-server --appendonly yes&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 开启Redis持久化&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;/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;postgres&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;image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&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;    &lt;/span&gt;&lt;span&gt;container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;new-api-postgres&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;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;40&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;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_USER&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;newapi_user&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;POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;YourStrongPassword123!&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;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_DB&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;new-api&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;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;45&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;/your/postgres/data:/var/lib/postgresql/data&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;部署前必改的三处地方&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;new-api&lt;/code&gt; 的两个 &lt;code&gt;volumes&lt;/code&gt; 路径换成你自己机器上的实际目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgres&lt;/code&gt; 的 &lt;code&gt;volumes&lt;/code&gt; 路径同上&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt; 和 &lt;code&gt;SQL_DSN&lt;/code&gt; 里的密码必须保持一致，改一处另一处也要跟着改&lt;/li&gt;
&lt;/ul&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;在 &lt;code&gt;docker-compose.yml&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-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;构建完后就能直接跑。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;服务启动后的登录页面&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;325&quot; src=&quot;/_astro/screenshot-01.DWKEViTh_qYx4M.webp&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;初始化配置&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://localhost:3000&lt;/code&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-02.C183sGBB_t6Jre.webp&quot; /&gt;&lt;figcaption&gt;选择部署模式&lt;/figcaption&gt;&lt;/figure&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;/ul&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-03.BFE7DZTb_Z2qVoLz.webp&quot; /&gt;&lt;figcaption&gt;配置管理员账号&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-04.Dmbeg3vM_v7AvQ.webp&quot; /&gt;&lt;figcaption&gt;初始化完成&lt;/figcaption&gt;&lt;/figure&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-05.BVzUMCMz_ZpNsrI.webp&quot; /&gt;&lt;figcaption&gt;进入系统&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&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;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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-07.BagVGmMN_ZOHL4i.webp&quot; /&gt;&lt;figcaption&gt;用户后台&lt;/figcaption&gt;&lt;/figure&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-08.Dxq0NpX9_m7g9Y.webp&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;接入上游 API&lt;a href=&quot;#接入上游-api&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;渠道配置页面&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/screenshot-06.B7TC86dZ_Z1BJ6Vc.webp&quot; /&gt;&lt;figcaption&gt;渠道配置页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NewApi 内置了几乎全球所有主流官方模型的预设配置，OpenAI、Anthropic、Google、Azure、各家国产大模型都有。添加渠道时选好类型，填入你的 API Key，再配置一下这个渠道支持哪些模型即可。&lt;/p&gt;&lt;p&gt;一个模型可以对应多个渠道，NewApi 会按照你设置的优先级和权重自动做负载均衡，某个渠道挂了会自动切换到下一个。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;添加完渠道后，还需要创建令牌&lt;/strong&gt;：管理后台 → &lt;strong&gt;令牌&lt;/strong&gt; → 新建令牌，生成一个供调用的 API Key。下游项目的 &lt;code&gt;base_url&lt;/code&gt; 填你的 NewApi 地址，&lt;code&gt;api_key&lt;/code&gt; 填这里生成的令牌就行了。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;配置完成后，所有请求统一走 NewApi 转发。额度管理、调用记录、限流规则都在一个地方，不用再到各个项目里单独维护 key 了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>给 Cloudflare Tunnel 后面的 API 开启 CORS</title><link>https://www.9ll.uk/posts/network/cloudflare_cors/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/cloudflare_cors/</guid><description>记录如何通过 Cloudflare 响应头转换规则，为 Tunnel 后面的 Memos API 添加 CORS 配置。</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;给 Cloudflare Tunnel 后面的 API 开启 CORS&lt;a href=&quot;#给-cloudflare-tunnel-后面的-api-开启-cors&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;我的 Memos API 通过 Cloudflare Tunnel 暴露在 &lt;code&gt;memos.9ll.uk&lt;/code&gt;，前端则运行在 &lt;code&gt;9ll.uk&lt;/code&gt;。两个地址的来源不同，浏览器发起 API 请求时就会受到同源策略限制，需要在响应中补上 CORS 相关响应头。&lt;/p&gt;&lt;p&gt;这里没有修改 Memos 本身，而是直接使用 Cloudflare 的响应头转换规则，在响应返回浏览器之前添加所需的 CORS 头。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;先检查 API 地址&lt;a href=&quot;#先检查-api-地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先检查前端填写的 API 地址。域名末尾不要带 &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;https://memos.9ll.uk&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;https://memos.9ll.uk/&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;这里后续的 API 路径会由请求端继续拼接。如果基础地址末尾已经带了 &lt;code&gt;/&lt;/code&gt;，就可能和后面以 &lt;code&gt;/&lt;/code&gt; 开头的路径拼出重复斜杠。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Memos API 地址配置&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;454&quot; src=&quot;/_astro/memos-api-url.CyZvA55L_Zuhomp.webp&quot; /&gt;&lt;figcaption&gt;Memos API 地址配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;进入 Cloudflare 控制台，选择对应域名，然后打开 &lt;strong&gt;规则&lt;/strong&gt; 页面。点击 &lt;strong&gt;创建规则&lt;/strong&gt;，选择 &lt;strong&gt;响应头转换规则&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;在 Cloudflare 中创建响应头转换规则&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;1159&quot; src=&quot;/_astro/cloudflare-create-rule.CC_IvD7s_Z2n6zAc.webp&quot; /&gt;&lt;figcaption&gt;在 Cloudflare 中创建响应头转换规则&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这类规则会在 Cloudflare 边缘修改返回给浏览器的响应头。源站不需要跟着改，比较适合给 Tunnel 后面的服务补充 CORS 配置。&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;为了不让规则影响整个域名，我这里只匹配 Memos 的 API 请求：&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;运算符&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;主机名&lt;/td&gt;&lt;td&gt;等于&lt;/td&gt;&lt;td&gt;&lt;code&gt;memos.9ll.uk&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URI 路径&lt;/td&gt;&lt;td&gt;开头为&lt;/td&gt;&lt;td&gt;&lt;code&gt;/api/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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.host eq &quot;memos.9ll.uk&quot; and starts_with(http.request.uri.path, &quot;/api/&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;code&gt;memos.9ll.uk/api/&lt;/code&gt; 下的请求才会被添加 CORS 响应头，其他页面和路径不会受到影响。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;添加 CORS 响应头&lt;a href=&quot;#添加-cors-响应头&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;操作选择 &lt;strong&gt;修改响应头&lt;/strong&gt;，然后使用 &lt;strong&gt;设置静态&lt;/strong&gt; 添加下面三项：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;响应头&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://9ll.uk&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Access-Control-Allow-Methods&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;GET, OPTIONS&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Access-Control-Allow-Headers&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Content-Type, Authorization&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Cloudflare CORS 响应头规则配置&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;1145&quot; src=&quot;/_astro/cloudflare-cors-rule.B72CrWoq_15tLRx.webp&quot; /&gt;&lt;figcaption&gt;Cloudflare CORS 响应头规则配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这三项分别控制：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;：允许 &lt;code&gt;https://9ll.uk&lt;/code&gt; 这个来源读取响应。这里写的是具体来源，不是对所有网站开放的 &lt;code&gt;*&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Allow-Methods&lt;/code&gt;：允许 &lt;code&gt;GET&lt;/code&gt; 请求和浏览器的 &lt;code&gt;OPTIONS&lt;/code&gt; 预检请求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Allow-Headers&lt;/code&gt;：允许请求携带 &lt;code&gt;Content-Type&lt;/code&gt; 和 &lt;code&gt;Authorization&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&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;code&gt;GET&lt;/code&gt; 和 &lt;code&gt;OPTIONS&lt;/code&gt;。如果你的前端还需要通过 API 创建、修改或删除内容，就要根据实际请求补充 &lt;code&gt;POST&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt;、&lt;code&gt;PATCH&lt;/code&gt; 或 &lt;code&gt;DELETE&lt;/code&gt;，不能直接照抄这一项。&lt;/p&gt;&lt;p&gt;&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; 也要替换成你自己的前端来源，协议、域名和端口都要一致。如果跨域请求需要携带凭据，就不能把这里写成 &lt;code&gt;*&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;配置时先把规则限制在对应的 API 域名和路径，再按真实请求填写允许的来源、方法和请求头。Cloudflare Tunnel 负责暴露服务；响应头转换规则在浏览器收到响应前补上 CORS 配置。&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;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/rules/transform/response-header-modification/&quot; target=&quot;_blank&quot;&gt;Cloudflare：Response Header Transform Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/rules/transform/response-header-modification/create-dashboard/&quot; target=&quot;_blank&quot;&gt;Cloudflare：在控制台创建响应头转换规则&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/CORS&quot; target=&quot;_blank&quot;&gt;MDN：跨源资源共享（CORS）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Anima 文生图工作流分享</title><link>https://www.9ll.uk/posts/ai/comfyui/anima-text-to-image-workflow/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/comfyui/anima-text-to-image-workflow/</guid><description>ComfyUI 跑 Anima 模型的文生图工作流，三个模型文件怎么放、turbo lora 怎么用、提示词在哪找，整理了一下分享出来</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前阵子在 B 站刷到了 &lt;a href=&quot;https://space.bilibili.com/3690999272442168&quot; target=&quot;_blank&quot;&gt;每日提钢小助手5号&lt;/a&gt; 分享的 Anima 工作流，折腾了一下，感觉挺好用的，就想着整理出来分享一下。&lt;/p&gt;
&lt;p&gt;这篇只包含文生图的部分。放大我单独抽出来做了另一套工作流，不喜欢混在一起，下次再发。&lt;/p&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;p&gt;工作流放在 GitHub 上：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Comfyui/Workflow/Anima%E6%AD%A3%E5%BC%8F%E7%89%88-%E6%96%87%E7%94%9F%E5%9B%BE%E5%B7%A5%E4%BD%9C%E6%B5%81%20(1).json&quot; target=&quot;_blank&quot;&gt;Anima 正式版-文生图工作流&lt;/a&gt;&lt;/p&gt;&lt;p&gt;下载下来直接拖进 ComfyUI 就能用。&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;a href=&quot;https://civitai.red/models/2458426/anima?modelVersionId=2945208&quot; target=&quot;_blank&quot;&gt;Anima - base-v1.0 | Civitai&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Civitai 模型页面&quot; loading=&quot;lazy&quot; width=&quot;1669&quot; height=&quot;1077&quot; src=&quot;/_astro/anima-civitai-model-page.BE2QKGiq_rtv7T.webp&quot; /&gt;&lt;figcaption&gt;Civitai 模型页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;页面里有三个文件，&lt;strong&gt;三个都要下&lt;/strong&gt;，放的位置不一样：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;第一个主模型 → &lt;code&gt;ComfyUI\diffusion_models&lt;/code&gt; 或 &lt;code&gt;ComfyUI\Unet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;第二个 text 模型 → &lt;code&gt;ComfyUI\text_encoders&lt;/code&gt; 或 &lt;code&gt;ComfyUI\clip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;第三个 VAE → &lt;code&gt;ComfyUI\vae&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;可选：官方加速 Lora&lt;a href=&quot;#可选官方加速-lora&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个我挺推荐的。官方出的 turbo lora，能把步数压到 6～8 步快速出图，质量损失极低。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://civitai.red/models/2458426/anima?modelVersionId=3108589&quot; target=&quot;_blank&quot;&gt;Anima - turbo-v1.0 | Civitai&lt;/a&gt;&lt;/p&gt;&lt;p&gt;用法上有点区别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不用 turbo lora&lt;/strong&gt;：采样器步数设 30，CFG 5～8&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 turbo lora&lt;/strong&gt;：步数改成 8，CFG 改成 1&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;速度差挺多的，日常出图我基本就用 turbo 了。&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;/p&gt;&lt;figure&gt;&lt;img alt=&quot;工作流提示词设置&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1213&quot; src=&quot;/_astro/anima-workflow-prompt-settings.CREGnAKA_Z2gllac.webp&quot; /&gt;&lt;figcaption&gt;工作流提示词设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果要生成特定动漫角色，可以去这个网站查触发词：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://animadex.net/&quot; target=&quot;_blank&quot;&gt;ANIMADEX — Anime character &amp;amp; artist catalogue for ANIMA&lt;/a&gt;&lt;/p&gt;&lt;p&gt;里面有角色和画师的触发词，找到对应的复制进提示词就行。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;折腾完感觉这套工作流比我之前用的顺多了，尤其是 turbo lora 那块，8 步出图速度很快，质量我觉得够用。放大的部分下次单独发。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Firefly 博客配置指南：从默认到属于你自己的博客</title><link>https://www.9ll.uk/posts/deploy/configsite/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/configsite/</guid><description>详细讲解 Firefly 博客的配置文件，包括站点标题、主题色、页面开关、文章列表等，让你的博客从默认模板变成自己的风格</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇我讲了怎么从零搭建 Firefly 博客，从 Fork 仓库到 Vercel 部署，最后博客上线了。&lt;/p&gt;
&lt;p&gt;但上线只是开始。&lt;/p&gt;
&lt;p&gt;默认的博客标题是”Firefly”，副标题是”Demo site”，主题色是绿色，页面宽度、卡片样式全都是默认值。跟别人的博客长得一模一样，没啥意思。&lt;/p&gt;
&lt;p&gt;所以今天这篇文章，我就来聊聊怎么改配置，让博客变成你自己的风格。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Firefly 博客配置界面&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/cover.Bn35nFNV_Z13Oup9.webp&quot; /&gt;&lt;figcaption&gt;Firefly 博客配置界面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;p&gt;Firefly 的所有配置文件都在 &lt;code&gt;src/config/&lt;/code&gt; 目录下。打开你的项目，找到这个文件夹，里面一堆 &lt;code&gt;.ts&lt;/code&gt; 文件，每个文件管一块功能。&lt;/p&gt;&lt;p&gt;主要的配置文件有这些：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;siteConfig.ts&lt;/code&gt; — 站点基础配置（标题、描述、主题色、页面宽度等）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;profileConfig.ts&lt;/code&gt; — 个人资料（头像、昵称、简介、社交链接）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;navBarConfig.ts&lt;/code&gt; — 顶部导航栏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidebarConfig.ts&lt;/code&gt; — 侧边栏布局&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentConfig.ts&lt;/code&gt; — 评论系统&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fontConfig.ts&lt;/code&gt; — 字体配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;musicConfig.ts&lt;/code&gt; — 音乐播放器&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;看起来挺多的，其实不用一次全改。先把 &lt;code&gt;siteConfig.ts&lt;/code&gt; 搞定，其他的以后慢慢调。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;siteConfig.ts：最核心的配置文件&lt;a href=&quot;#siteconfigts最核心的配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个文件管着整个站点的基本信息。打开 &lt;code&gt;src/config/siteConfig.ts&lt;/code&gt;，你会看到类似这样的结构：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;siteConfig.ts 配置文件&quot; loading=&quot;lazy&quot; width=&quot;1405&quot; height=&quot;1044&quot; src=&quot;/_astro/vscode.C2eTSRrM_Z7WdCh.webp&quot; /&gt;&lt;figcaption&gt;siteConfig.ts 配置文件&lt;/figcaption&gt;&lt;/figure&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;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;siteConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SiteConfig&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;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&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;subtitle&lt;/span&gt;&lt;span&gt;:&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;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;site_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://你的域名&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;description&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;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;/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;h3&gt;站点标题和副标题&lt;a href=&quot;#站点标题和副标题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;title&lt;/code&gt; 是浏览器标签页上显示的名字，也是搜索引擎抓取的标题。&lt;code&gt;subtitle&lt;/code&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;&lt;span&gt;title&lt;/span&gt;&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;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;subtitle&lt;/span&gt;&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;/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;站点 URL&lt;a href=&quot;#站点-url&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;site_url&lt;/code&gt; 这个一定要改。它影响 sitemap 和 RSS 生成的地址。如果你的域名是 &lt;code&gt;blog.example.com&lt;/code&gt;，就填 &lt;code&gt;https://blog.example.com&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;别忘了加 &lt;code&gt;https://&lt;/code&gt;，也别加末尾的 &lt;code&gt;/&lt;/code&gt;。&lt;/p&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;Firefly 支持自定义主题色。&lt;code&gt;themeColor.hue&lt;/code&gt; 是色相值，范围 0-360。&lt;/p&gt;&lt;p&gt;几个常用的：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;红色：0&lt;/li&gt;
&lt;li&gt;绿色：120&lt;/li&gt;
&lt;li&gt;青色：200&lt;/li&gt;
&lt;li&gt;蓝绿色：250&lt;/li&gt;
&lt;li&gt;粉色：345&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我之前试过 165，是个不错的青绿色。现在改成 65，偏黄一点，看起来更温暖。&lt;/p&gt;&lt;p&gt;&lt;code&gt;defaultMode&lt;/code&gt; 控制默认是亮色还是暗色模式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;light&quot;&lt;/code&gt; — 亮色&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;dark&quot;&lt;/code&gt; — 暗色&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;system&quot;&lt;/code&gt; — 跟随系统&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我选了 &lt;code&gt;&quot;system&quot;&lt;/code&gt;，让浏览器自动决定。&lt;/p&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;code&gt;pageWidth&lt;/code&gt; 控制整个页面的最大宽度，单位是 &lt;code&gt;rem&lt;/code&gt;。默认 100，数值越大页面越宽。&lt;/p&gt;&lt;p&gt;如果你觉得内容区域太窄，可以调大一点，比如 120。但太宽了反而不好看，特别是单栏布局的时候。&lt;/p&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;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;card&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;border&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;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;followTheme&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;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;/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;border&lt;/code&gt; 控制卡片有没有边框和阴影。开了之后文章卡片会有点立体感。&lt;/p&gt;&lt;p&gt;&lt;code&gt;followTheme&lt;/code&gt; 让卡片背景在浅色模式下跟随主题色。这个看你喜好，我开了之后觉得还挺协调的。&lt;/p&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;Firefly 有很多页面功能，比如友链、打赏、相册这些。在 &lt;code&gt;siteConfig.ts&lt;/code&gt; 的 &lt;code&gt;pages&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;&lt;span&gt;pages&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;friends&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;sponsor&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;&lt;/span&gt;&lt;span&gt;guestbook&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;bangumi&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;gallery&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;dynamic&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;/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;false&lt;/code&gt; 就会隐藏对应的导航入口，访问那个页面会 404。&lt;/p&gt;&lt;p&gt;我一开始把 &lt;code&gt;guestbook&lt;/code&gt; 关了，因为还没配评论系统。后来配好 Waline 之后又打开了。&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;code&gt;postListLayout&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;&lt;span&gt;postListLayout&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;defaultMode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;list&quot;&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;mobileDefaultMode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;grid&quot;&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;&lt;/span&gt;&lt;span&gt;descriptionLines&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,       &lt;/span&gt;&lt;span&gt;// 摘要显示2行&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;tagsPosition&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;bottom&quot;&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;/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;defaultMode&lt;/code&gt; 有两个选择：&lt;code&gt;&quot;list&quot;&lt;/code&gt; 是单列列表，&lt;code&gt;&quot;grid&quot;&lt;/code&gt; 是多列网格。我用了 &lt;code&gt;&quot;list&quot;&lt;/code&gt;，在桌面端看比较舒服。&lt;/p&gt;&lt;p&gt;&lt;code&gt;mobileDefaultMode&lt;/code&gt; 是移动端的默认布局。我设了 &lt;code&gt;&quot;grid&quot;&lt;/code&gt;，手机上看起来更紧凑。&lt;/p&gt;&lt;p&gt;&lt;code&gt;tagsPosition&lt;/code&gt; 控制标签显示位置。设成 &lt;code&gt;&quot;bottom&quot;&lt;/code&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;p&gt;下面还有 &lt;code&gt;meta&lt;/code&gt; 和 &lt;code&gt;stats&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;&lt;span&gt;meta&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;showPublished&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;showCategory&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;&lt;/span&gt;&lt;span&gt;showTags&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;showWords&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&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;showReadingTime&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&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;/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;showReadingTime&lt;/code&gt;，因为觉得字数已经够了，再显示阅读时间有点冗余。&lt;/p&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;section&gt;&lt;h3&gt;profileConfig.ts：个人资料&lt;a href=&quot;#profileconfigts个人资料&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个文件管你的头像、昵称、简介和社交链接。打开 &lt;code&gt;src/config/profileConfig.ts&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;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profileConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ProfileConfig&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;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;avatar&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./avatar.webp&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;name&lt;/span&gt;&lt;span&gt;:&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;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;bio&lt;/span&gt;&lt;span&gt;:&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;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;socialLinks&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;/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;/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;&lt;code&gt;avatar&lt;/code&gt; 放你的头像图片路径。图片可以放在 &lt;code&gt;public/&lt;/code&gt; 目录下，也可以放在 &lt;code&gt;src/assets/&lt;/code&gt; 下（后者会自动优化）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;navBarConfig.ts：导航栏&lt;a href=&quot;#navbarconfigts导航栏&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;导航栏的配置在这个文件里。可以设置导航链接、Logo、是否全宽等。&lt;/p&gt;&lt;p&gt;我比较喜欢全宽导航栏，所以设了 &lt;code&gt;widthFull: true&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;fontConfig.ts：字体&lt;a href=&quot;#fontconfigts字体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Firefly 支持自定义字体。你可以用 Google Fonts、Fontsource，或者本地字体。&lt;/p&gt;&lt;p&gt;但说实话，默认字体已经挺好看了，我暂时没改。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;commentConfig.ts：评论系统&lt;a href=&quot;#commentconfigts评论系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个文件管评论系统的配置。Firefly 支持 Twikoo、Waline、Giscus、Artalk 等。&lt;/p&gt;&lt;p&gt;我之前写过一篇 &lt;a href=&quot;/posts/deploy/deploywaline/&quot;&gt;搭建 Waline 评论系统&lt;/a&gt; 的文章，里面有详细配置。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;musicConfig.ts：音乐播放器&lt;a href=&quot;#musicconfigts音乐播放器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你想在博客里加背景音乐，可以配置这个文件。支持 Meting API（在线音乐）和本地音乐。&lt;/p&gt;&lt;p&gt;我暂时没开，怕影响加载速度。&lt;/p&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;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;p&gt;浏览器打开 &lt;code&gt;http://localhost:4321&lt;/code&gt;，刷新就能看到新的配置。&lt;/p&gt;&lt;p&gt;改主题色、页面宽度这些，刷新就能看到。改导航栏、侧边栏这些，可能需要重启一下开发服务器。&lt;/p&gt;&lt;p&gt;我一般改完配置会跑一下 &lt;code&gt;pnpm build&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;section&gt;&lt;h3&gt;site_url 没改导致的问题&lt;a href=&quot;#site_url-没改导致的问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我一开始忘了改 &lt;code&gt;site_url&lt;/code&gt;，结果 sitemap 生成的地址是默认的 &lt;code&gt;https://firefly.cuteleaf.cn&lt;/code&gt;。提交给 Google Search Console 的时候，验证一直不通过。&lt;/p&gt;&lt;p&gt;后来才发现是这个配置没改。改完重新构建就好了。&lt;/p&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;Firefly 支持两种图片路径：&lt;code&gt;public/&lt;/code&gt; 目录下的和 &lt;code&gt;src/&lt;/code&gt; 目录下的。&lt;/p&gt;&lt;p&gt;&lt;code&gt;public/&lt;/code&gt; 下的图片不经过优化，直接复制到构建输出。&lt;code&gt;src/&lt;/code&gt; 下的图片会自动压缩、转换格式。&lt;/p&gt;&lt;p&gt;我一开始把头像放在 &lt;code&gt;public/&lt;/code&gt; 下，结果加载比较慢。后来移到 &lt;code&gt;src/assets/&lt;/code&gt; 下，构建时自动压缩了，加载快了不少。&lt;/p&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;code&gt;themeColor.hue&lt;/code&gt;，刷新页面发现没变化。后来发现是浏览器缓存的问题。清一下缓存或者用无痕模式就能看到。&lt;/p&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;a href=&quot;https://docs-firefly.cuteleaf.cn/zh/guide/site.html&quot; target=&quot;_blank&quot;&gt;Firefly 站点配置&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我建议先把 &lt;code&gt;siteConfig.ts&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;配置这个东西，其实不用一次全改完。&lt;/p&gt;&lt;p&gt;先把基本的改了，标题、副标题、主题色这些。其他的用到了再慢慢调。反正改配置又不花钱，多试几次就知道什么好看了。&lt;/p&gt;&lt;p&gt;说实话，折腾配置本身也是种乐趣。看着自己的博客一点点变成想要的样子，还挺有成就感的。&lt;/p&gt;&lt;p&gt;后面我可能会写一篇关于自定义 CSS 样式的文章，让博客变得更不一样。如果你也想折腾，可以关注一下。&lt;/p&gt;&lt;p&gt;有问题的话直接在评论区问，我看到了会回复。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 Firefly 博客配置的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>手机上终于有个像样的 Galgame 管理器了</title><link>https://www.9ll.uk/posts/recommend/rinne-mobile-recommendation/</link><guid isPermaLink="true">https://www.9ll.uk/posts/recommend/rinne-mobile-recommendation/</guid><description>RinneMobile 是一款手机端 Galgame 管理器，支持 KRKR、ONScripter 等多种引擎，统一管理本地游戏和应用，还能通过 WebDAV 云同步数据。</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;手机上终于有个像样的 Galgame 管理器了&lt;a href=&quot;#手机上终于有个像样的-galgame-管理器了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;前几天刷 GitHub 的时候，无意间看到一个叫 RinneMobile 的项目。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Weiss-UltimateSavior/RinneMobile&quot; target=&quot;_blank&quot;&gt;https://github.com/Weiss-UltimateSavior/RinneMobile&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;RinneMobile 界面&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;2750&quot; src=&quot;/_astro/theme1.BdZZggLX_1xF24w.webp&quot; /&gt;&lt;figcaption&gt;RinneMobile 界面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;p&gt;我手机里存了不少 Galgame，但一直没找到好用的管理方式。&lt;/p&gt;&lt;p&gt;以前试过直接用文件管理器找游戏目录，每次想玩的时候都要翻半天。文件管理器这东西吧，找文档还行，找游戏是真的痛苦——游戏目录名乱七八糟，有的是日文，有的是拼音缩写，根本不知道哪个是哪个。&lt;/p&gt;&lt;p&gt;也试过几个启动器。有的只能启动安卓应用，KRKR 引擎的游戏完全不支持。有的倒是能启动，但是每次都要手动选目录，麻烦得要死。&lt;/p&gt;&lt;p&gt;还试过把所有游戏 shortcut 放到一个文件夹里，结果越攒越多，找起来更费劲了。&lt;/p&gt;&lt;p&gt;RinneMobile 说白了就是个”游戏库”——把你的本地游戏、安卓应用、模拟器入口、外部程序快捷方式全放到一个地方管理。&lt;/p&gt;&lt;p&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;我看了下 README，功能还挺全的。&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;p&gt;本地游戏、安卓应用、外部启动入口都能加进去。&lt;/p&gt;&lt;p&gt;这点太重要了。我手机里不光有 KRKR 引擎的游戏，还有一些安卓原生的 Galgame，还有几个通过 Winlator 跑的 PC 游戏。以前要分别用不同的方式启动，现在全放一个地方，方便多了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;游戏库页面&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;2750&quot; src=&quot;/_astro/game-page.CFu2OE7j_1ferFy.webp&quot; /&gt;&lt;figcaption&gt;游戏库页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;选个目录，它会自动识别 KRKR、ONScripter、Tyrano、Artemis 这些引擎的游戏。&lt;/p&gt;&lt;p&gt;不用一个个手动添加，这点很省事。它会根据文件特征来判断引擎类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;KRKR：看有没有 &lt;code&gt;.xp3&lt;/code&gt;、&lt;code&gt;startup.tjs&lt;/code&gt; 这些文件&lt;/li&gt;
&lt;li&gt;ONScripter：看 &lt;code&gt;0.txt&lt;/code&gt;、&lt;code&gt;nscript.dat&lt;/code&gt; 这些&lt;/li&gt;
&lt;li&gt;Tyrano：看 &lt;code&gt;index.html&lt;/code&gt; 和目录特征&lt;/li&gt;
&lt;li&gt;Artemis：看 &lt;code&gt;system.ini&lt;/code&gt; 这些&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;识别出来之后，启动的时候会自动用对应的引擎打开。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;VNDB/Bangumi 数据源&lt;a href=&quot;#vndbbangumi-数据源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以给游戏补充封面和信息。&lt;/p&gt;&lt;p&gt;这个功能挺贴心的。添加游戏之后，可以关联 VNDB 或者 Bangumi 的数据，自动拉取封面图和游戏简介。这样游戏库看起来就整齐多了，不用自己一张张找封面。&lt;/p&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;支持 WebDAV 云同步，换设备不怕丢数据。&lt;/p&gt;&lt;p&gt;我之前最怕的就是换手机。每次换手机，游戏存档、游玩记录全没了。RinneMobile 支持把数据同步到 WebDAV，换设备的时候导进去就行。&lt;/p&gt;&lt;p&gt;它同步的时候会根据 root 路径、本地 ID、游戏标题来匹配，空目录条目会优先按标题匹配。虽然不是 100% 能对上，但大部分情况够用了。&lt;/p&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;/p&gt;&lt;p&gt;这个功能对我来说还挺有用的。我之前一直想统计自己玩 Galgame 花了多少时间，但没有趁手的工具。RinneMobile 自动帮我记，虽然不是特别精确（中途切出去再切回来就不续计了），但大致有个数。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;AI 智能体&lt;a href=&quot;#ai-智能体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最让我意外的是它内置了一个 AI 智能体，可以连自己的 OpenAI 兼容 API。&lt;/p&gt;&lt;p&gt;比如查询游戏库、搜索文件之类的。这个功能我还没深入试，但听起来挺有意思的——以后说不定可以让 AI 帮我找某个台词在哪个游戏里出现过。&lt;/p&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;ul&gt;
&lt;li&gt;手机里存了一堆 Galgame，想统一管理&lt;/li&gt;
&lt;li&gt;用 KRKR、ONScripter 这些引擎的游戏比较多&lt;/li&gt;
&lt;li&gt;想在多设备之间同步游戏数据&lt;/li&gt;
&lt;li&gt;喜欢折腾，愿意自己配置&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你只是偶尔玩一两个安卓版 Galgame，可能用不上这么重的工具。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;设置页面&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;2750&quot; src=&quot;/_astro/settings-page.dtU1MEss_Z139KQh.webp&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;几个细节&lt;a href=&quot;#几个细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;这是基于 YukiHub 二次开发的分支版本，不是从零开始的，站在前人肩膀上。&lt;/p&gt;&lt;p&gt;作者叫 Weiss-UltimateSavior，GitHub 上 97 个 Star，不算多，但说明有人在用。有 QQ 交流群，遇到问题可以问。&lt;/p&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;GPL-3.0 协议，开源，可以自己改。&lt;/p&gt;&lt;p&gt;需要 Android 8.0 以上，老设备可能跑不了。我看了下编译信息，Min SDK 是 26，Target SDK 是 33，用的 Java 17。&lt;/p&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;README 里提到了几个已知问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;KRKR 游戏里有文字输入弹窗的功能不能用，会导致闪退&lt;/li&gt;
&lt;li&gt;TF 卡里的 KRKR 游戏要通过镜像目录启动&lt;/li&gt;
&lt;li&gt;华为设备可能有存储访问兼容性问题，可以试试开启”外部私有存档”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些坑我还没踩到，但提前知道比较好。&lt;/p&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;/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;1236&quot; height=&quot;2750&quot; src=&quot;/_astro/dark-mode.Wz5f51n1_1fYyeO.webp&quot; /&gt;&lt;figcaption&gt;深色模式&lt;/figcaption&gt;&lt;/figure&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;2750&quot; height=&quot;1236&quot; src=&quot;/_astro/landscape-home.DCquokoJ_Z1tgzva.webp&quot; /&gt;&lt;figcaption&gt;横屏模式&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;安卓上能启动 Galgame 的工具其实有不少，但大多数只管”启动”，不管”管理”。&lt;/p&gt;&lt;p&gt;比如 Tyranor，能启动 KRKR 和 Tyrano 引擎的游戏，但没有统一的游戏库，也没有数据同步。每次想玩都要翻文件夹。&lt;/p&gt;&lt;p&gt;再比如一些通用的游戏启动器，倒是能管理，但对 Galgame 引擎的支持不行，KRKR、ONScripter 这些都认不出来。&lt;/p&gt;&lt;p&gt;RinneMobile 的优势就在于”管理+启动+同步”三合一。虽然每个方面都不是最强的，但凑在一起，体验就完整多了。&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;说实话，这个项目解决的问题确实存在——安卓上缺少好用的 Galgame 管理工具。&lt;/p&gt;&lt;p&gt;如果你有这个需求，值得试试。&lt;/p&gt;&lt;p&gt;它不是那种开箱即用的工具，需要自己配置一下。但折腾本来就是乐趣的一部分，对吧？&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>站长实习经历</title><link>https://www.9ll.uk/posts/life/internship/internship/</link><guid isPermaLink="true">https://www.9ll.uk/posts/life/internship/internship/</guid><description>释怀的似了</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;p&gt;去年 12 月中旬，我随便找了一家中介，进入了一家做自动化视觉的小公司，成为了一名视觉调试实习生。&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;从每天 12 小时以上的工作，到 24 小时待机。&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;strong&gt;比起高工资，我其实更喜欢稳定一点的生活。&lt;/strong&gt;&lt;/p&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;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;&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;p&gt;因为太累了。&lt;/p&gt;&lt;p&gt;工作时间长，长期出差，12 小时工作制基本是常态。&lt;/p&gt;&lt;p&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;刚入职的时候，公司先安排了几天培训，主要学习他们基于 VisionMaster 开发的二开软件。&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;我跟着师傅看了两三天流程，结果客户突然没料生产了。&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;然后，真正大的问题来了。&lt;/p&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;我：0 经验实习生&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最后，真正留在现场的只有我一个。&lt;/p&gt;&lt;p&gt;当时的感觉非常简单：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;天黑了。&lt;/strong&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;1 月初，客户开始正式来料生产。&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;一些小问题还能靠培训时学到的东西，再结合自己的理解，一点一点试出来。&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;于是，我基本上变成了一个人在现场孤立无援。&lt;/p&gt;&lt;p&gt;白天解决问题，晚上继续研究。&lt;/p&gt;&lt;p&gt;这一行本来 12 小时工作制就是常态，而我那段时间经常是 &lt;strong&gt;12 小时以上&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;基本属于：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;24 小时待机。&lt;/strong&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;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;&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;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;PLC 的工程师看不下去了&lt;a href=&quot;#plc-的工程师看不下去了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;现场负责 PLC 的工程师，看着我这个样子都绷不住了。&lt;/p&gt;&lt;p&gt;他天天吐槽我们公司：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;怎么会让一个 0 经验的人，一个人负责整个项目？&lt;/p&gt;&lt;/blockquote&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;&lt;p&gt;甚至后来经常一起提前下班，然后去网吧。&lt;/p&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;/p&gt;&lt;p&gt;他们不会轻易吊人。&lt;/p&gt;&lt;p&gt;真正喜欢找茬的，只有他们其中一个领导。&lt;/p&gt;&lt;p&gt;属于那种：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;你没问题，他也能给你找点问题出来吊一顿。&lt;/strong&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;strong&gt;特别不服&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;至于实习证明，反而不是主要原因。&lt;/p&gt;&lt;p&gt;我有几个朋友家里都有公司，如果只是为了盖一个实习章，其实完全不是问题。&lt;/p&gt;&lt;p&gt;也许可能还有所谓的沉没成本？&lt;/p&gt;&lt;p&gt;也可能就是年轻，不服输。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;那段时间我还喜欢玩 Galgame，也补完了《凉宫春日》。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;但每次看到一半，电话突然响起来。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;真的会心脏骤停。&lt;/p&gt;&lt;/blockquote&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;/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;但每次负责人过来也只待一两天。&lt;/p&gt;&lt;p&gt;最后，还是只能靠自己。&lt;/p&gt;&lt;p&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;到了三月，经验终于慢慢积累起来。&lt;/p&gt;&lt;p&gt;我已经能够独立解决不少问题，也能帮客户修改一些简单功能。&lt;/p&gt;&lt;p&gt;和 PLC 工程师的沟通也越来越顺畅。&lt;/p&gt;&lt;p&gt;现场终于没有以前那么压抑了。&lt;/p&gt;&lt;p&gt;后来甚至经常和 PLC 哥们提前下班，一起去网吧。&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;这种时候怎么办？&lt;/p&gt;&lt;p&gt;不用上班。&lt;/p&gt;&lt;p&gt;直接和 PLC 去网吧。&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;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;&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;p&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;p&gt;公司一直催客户验收，客户一直拖，公司也一直拿不到尾款。&lt;/p&gt;&lt;p&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;5 月 17 日，我正式辞职。&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;当时我觉得：&lt;/p&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;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;&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;&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;&lt;p&gt;&lt;strong&gt;比起高工资，我其实更喜欢稳定。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&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;p&gt;有几个工位的相机特别邪门。&lt;/p&gt;&lt;p&gt;只要设备停机一两天以上，再重新开机，就必定掉线。&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;p&gt;但问题是：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么会这样，没人知道。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;软件 Log 全部正常。&lt;/p&gt;&lt;p&gt;线材看起来也不像坏的。&lt;/p&gt;&lt;p&gt;设备如果一直连续生产，又完全不会出问题。&lt;/p&gt;&lt;p&gt;我一开始还以为这是我接手之后才出现的问题。&lt;/p&gt;&lt;p&gt;后来听客户和 PLC 工程师聊天才知道，这个问题在我来之前就已经存在了。&lt;/p&gt;&lt;p&gt;一直没人查出来。&lt;/p&gt;&lt;p&gt;直到我 7 月退客户群的时候，这个问题都还在。&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;/p&gt;&lt;p&gt;真正的剔除工作是在我们这台设备完成的。&lt;/p&gt;&lt;p&gt;视觉检测到以后，再通知 PLC 进行剔除。&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;后来听说是客户的一个机修，直接跟质检说问题已经解决了。&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;已经发货的产品都在讨论要不要半路拦截，甚至考虑整批报废。&lt;/p&gt;&lt;p&gt;当天晚上一直加班到 12 点排查。&lt;/p&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;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;&lt;p&gt;因为这是我第一次独立完成一个新的检测流程。&lt;/p&gt;&lt;p&gt;后来我才知道。&lt;/p&gt;&lt;p&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;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;后来我发现，每次软件卡住的时候，D 盘都会被占满。&lt;/p&gt;&lt;p&gt;奇怪的是，带宽只有十几 MB/s。&lt;/p&gt;&lt;p&gt;看起来根本不像磁盘跑满。&lt;/p&gt;&lt;p&gt;于是我又打开资源监视器。&lt;/p&gt;&lt;p&gt;发现有一个 Windows 系统进程一直在疯狂读取机械硬盘。&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;客户又联系了他们公司的 IT。&lt;/p&gt;&lt;p&gt;IT 第一反应还挺无语：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;就这点带宽，也能把软件卡死？&lt;/p&gt;&lt;/blockquote&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;blockquote&gt;&lt;p&gt;那你觉得限速多少合适？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;我还认真算了一下。&lt;/p&gt;&lt;p&gt;按照一天产生的图片数量，再加上一点冗余，最后建议限制到 &lt;strong&gt;2 MB/s&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;不过后来发现，只要索引过程跑完，软件就会恢复正常。&lt;/p&gt;&lt;p&gt;最后，我直接把软件迁移到了 C 盘 SSD。&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;我排查硬件的时候，发现一块机械硬盘已经出现了坏道。&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;这件事最后也只有我和公司知道。&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;/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;我到客户公司时已经十一点二十。&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;&lt;strong&gt;十二点要和客户开会。&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;真正导致问题的，未必是视觉。&lt;/p&gt;&lt;p&gt;也可能是机构或者其他环节。&lt;/p&gt;&lt;p&gt;经理后来有一句经典名言，我到现在还记得：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;我们视觉只能做检测优劣，不能直接参与产品的好坏。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&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;&lt;p&gt;我回到出租屋的时候，已经五点了。&lt;/p&gt;&lt;p&gt;睡了一会儿。&lt;/p&gt;&lt;p&gt;中午十二点继续上班。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;…&lt;/h2&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;&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;&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;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;/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;于是下午特地开了免打扰，睡了一觉。&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;&lt;strong&gt;“你怎么没来上班？”&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我一脸懵。&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;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;&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;/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;blockquote&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;/blockquote&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;&lt;p&gt;手续费公司报销。&lt;/p&gt;&lt;p&gt;最后，福建没去成。&lt;/p&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;p&gt;&lt;strong&gt;还会不会去做这份实习？&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;只是如果让我继续做这一行。&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;有一点属于自己的时间。&lt;/p&gt;&lt;p&gt;对现在的我来说。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这就够了。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>SillyTavern（酒馆）无限制 AI 角色对话部署指南</title><link>https://www.9ll.uk/posts/recommend/sillytavern/</link><guid isPermaLink="true">https://www.9ll.uk/posts/recommend/sillytavern/</guid><description>开源 AI 角色对话前端 SillyTavern 部署教程，支持 OpenAI、Claude、Gemini 等多种模型，本地运行数据自主，角色扮演和写作辅助都能玩。</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前一直用各种在线平台跑 AI 角色对话，说实话大部分都差点意思——要么限制多，要么数据不在自己手里，折腾起来也不方便。后来在群里看到有人提”酒馆”，说是开源的，自己部署，想怎么玩就怎么玩。我一想，反正也不难搞，就试试呗。&lt;/p&gt;
&lt;p&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;p&gt;SillyTavern，社区里一般叫”酒馆”，是个开源的网页应用。简单来说，它就是一个前端界面，帮你对接各种 AI 模型（OpenAI、Claude、Gemini、本地模型等等），然后你通过浏览器跟 AI 聊天。&lt;/p&gt;&lt;p&gt;它本身不提供 AI 模型，你需要自己有 API Key 或者跑本地模型。但它的好处是：&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;酒馆跑起来之后，浏览器打开 &lt;code&gt;127.0.0.1:8000&lt;/code&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;p&gt;除了基本的聊天，酒馆还能玩不少花样：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;角色卡片&lt;/strong&gt;：导入别人做好的角色卡，或者自己写一个，AI 就会扮演那个角色跟你对话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预设和破限&lt;/strong&gt;：通过预设文件控制 AI 的回复风格，比如更像小说、更口语化，或者突破一些限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;世界书&lt;/strong&gt;：给 AI 补充背景知识，比如角色的设定、世界观什么的&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 的思考过程&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Windows 部署&lt;a href=&quot;#windows-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我在 Windows 11 上部署的，过程其实不复杂。&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;p&gt;先装两个东西：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt;：去 nodejs.org 下最新的 LTS 版本装上就行。这是酒馆运行的底层依赖，必须有。注意 Windows 7 不支持，因为跑不了 Node.js 20。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt;：用来下载酒馆代码。可以装 Git for Windows，也可以用 GitHub Desktop。&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;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;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;p&gt;能看到版本号就说明装好了。&lt;/p&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;strong&gt;不要装到 Program Files 或者 System32 这种系统文件夹里&lt;/strong&gt;。Windows 对这些路径有权限限制，跑起来会出问题。&lt;/p&gt;&lt;p&gt;就找个普通路径放着，比如 &lt;code&gt;D:\SillyTavern&lt;/code&gt; 或者 &lt;code&gt;C:\Tools\SillyTavern&lt;/code&gt;。&lt;/p&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;code&gt;cmd&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;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-Launcher.git&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SillyTavern-Launcher&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;installer.bat&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;code&gt;Launcher.bat&lt;/code&gt;&lt;/strong&gt;，打开输入&lt;code&gt;1&lt;/code&gt;它会自动下载需要的依赖包，然后启动服务。&lt;/p&gt;&lt;p&gt;第一次跑会慢一点，要下载一堆依赖。等命令行窗口里出现类似 &lt;code&gt;SillyTavern is listening on port 8000&lt;/code&gt; 的提示，就说明启动成功了。&lt;/p&gt;&lt;p&gt;启动成功后，浏览器会自动打开酒馆界面。如果没有自动打开，手动访问 &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt; 就行。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;API 连接和配置&lt;a href=&quot;#api-连接和配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;酒馆装好了，下一步就是连上 AI 模型。&lt;/p&gt;&lt;p&gt;酒馆支持好几种模型后端：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;（GPT-4、GPT-3.5 等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt;（Anthropic 的模型）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini&lt;/strong&gt;（Google 的模型）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地模型&lt;/strong&gt;（通过 Ollama，LMstudio 等方式运行）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在酒馆界面的设置里填上你的 API Key 就能连上，操作不复杂。&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;p&gt;打开酒馆后，点上面的”插头”图标（就是那个像电源插头的），进入 API 连接设置。&lt;/p&gt;&lt;p&gt;这里有几个地方要填：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;API 类型&lt;/strong&gt;：选你用的模型，比如 OpenAI、Claude、Gemini&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API URL&lt;/strong&gt;：填对应的 API 地址。如果是官方 API，一般有默认值；如果用反代或者第三方服务，填对应的地址&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Key&lt;/strong&gt;：填你的密钥&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;填完之后点”连接”测试一下，能看到绿色的提示就说明连上了。&lt;/p&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;section&gt;&lt;h3&gt;对接 LM 测试成功但发消息发不出去&lt;a href=&quot;#对接-lm-测试成功但发消息发不出去&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;figure&gt;&lt;img alt=&quot;消息顺序报错&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;409&quot; src=&quot;/_astro/sillytavern-parameters.Dweq0_5R_Z1p2mpF.webp&quot; /&gt;&lt;figcaption&gt;消息顺序报错&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;特别是用 Qwen 之类的模型时，它严格要求消息顺序必须是系统提示词在最前面，然后用户和角色交替发言。如果顺序不对，就会报这种错：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;连接设置与提示词后处理选项&quot; loading=&quot;lazy&quot; width=&quot;1311&quot; height=&quot;1110&quot; src=&quot;/_astro/sillytavern-error.B8z7FIt9_1HU8Jb.webp&quot; /&gt;&lt;figcaption&gt;连接设置与提示词后处理选项&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;解决办法就是在”提示词后处理”那里选”严格（强制对话角色交替、用户最先）”。&lt;/p&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;参数设置面板&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;1259&quot; src=&quot;/_astro/sillytavern-connection.BTgtlMTO_Z2cy23L.webp&quot; /&gt;&lt;figcaption&gt;参数设置面板&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文长度&lt;/strong&gt;：AI 能”记住”多少之前的内容。太短的话 AI 容易忘事，太长的话消耗的 token 多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大回复长度&lt;/strong&gt;：AI 一次回复最多写多少字。设太小的话回复容易被截断，图里这个 8192 对大多数场景够用了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;温度&lt;/strong&gt;：控制回复的随机性。0.70 左右比较平衡，想要更稳定可以调低，想要更有创意可以调高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些参数不用一开始就调到完美，先用默认值跑起来，后面再根据实际体验慢慢改。&lt;/p&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;如果你之前跑过酒馆，或者有其他程序占用了 8000 端口，启动的时候会报错。解决办法：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;关掉之前那个酒馆窗口&lt;/li&gt;
&lt;li&gt;或者改端口号，在启动参数里指定一个别的端口&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;API Key 的成本&lt;a href=&quot;#api-key-的成本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个得说一下。酒馆本身免费，但 API 调用是收费的。不同的模型价格不一样，用之前最好了解一下计费方式，免得月底看到账单吓一跳。&lt;/p&gt;&lt;p&gt;如果预算有限，可以考虑用一些提供免费额度的服务，或者跑本地模型（不过本地模型对显卡有要求）。&lt;/p&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;部署好之后的体验还是不错的，可以自由调整各种参数，玩起来比在线平台灵活多了。缺点就是需要自己有 API Key，这块是有成本的。&lt;/p&gt;&lt;p&gt;如果你也想搞一个自己的 AI 聊天环境，可以试试。有问题的话欢迎交流。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>一个字母的事：让 opencode 像 mimo 一样在资源管理器地址栏启动</title><link>https://www.9ll.uk/posts/windows/opencode-shortcut/</link><guid isPermaLink="true">https://www.9ll.uk/posts/windows/opencode-shortcut/</guid><description>想在文件资源管理器地址栏输入 oc 就启动 opencode？复制 .cmd 不行，得复制 .exe</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我平时用 opencode 每次都要开命令行输入 &lt;code&gt;opencode&lt;/code&gt;，挺烦的。&lt;/p&gt;
&lt;p&gt;mimo 就方便很多，在文件资源管理器地址栏直接输入 &lt;code&gt;mimo&lt;/code&gt; 就能打开终端。我就想着能不能也给 opencode 搞一个短命令。&lt;/p&gt;
&lt;p&gt;最简单的想法：复制一个 &lt;code&gt;oc.cmd&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;Copy-Item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;C:\Users\XOS\AppData\Roaming\npm\opencode.cmd&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;C:\Users\XOS\AppData\Roaming\npm\oc.cmd&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;code&gt;oc&lt;/code&gt; 确实能用。但是文件资源管理器地址栏里输入 &lt;code&gt;oc&lt;/code&gt;，直接跳浏览器了。&lt;/p&gt;
&lt;p&gt;搞了半天才发现，Windows 地址栏只认 &lt;code&gt;.exe&lt;/code&gt;，不认 &lt;code&gt;.cmd&lt;/code&gt;。输入 &lt;code&gt;oc&lt;/code&gt; 找不到对应的 &lt;code&gt;.exe&lt;/code&gt;，就当成网址去搜索了。&lt;/p&gt;
&lt;p&gt;mimo 能用是因为它本身就是个 &lt;code&gt;.exe&lt;/code&gt; 文件，放在 PATH 目录里，地址栏直接能找到。&lt;/p&gt;
&lt;p&gt;所以正确的做法是复制 &lt;code&gt;.exe&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;Copy-Item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;C:\Users\XOS\AppData\Roaming\npm\node_modules\opencode-ai\bin\opencode.exe&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;C:\Users\XOS\AppData\Roaming\npm\oc.exe&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;code&gt;oc&lt;/code&gt; 直接打开，跟 mimo 一样。&lt;/p&gt;
&lt;p&gt;说实话这个坑挺小的，但不查真不知道。我一直以为 &lt;code&gt;.cmd&lt;/code&gt; 和 &lt;code&gt;.exe&lt;/code&gt; 在地址栏里效果一样。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;折腾 opencode 快捷启动的小记录&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>我的游戏性能优化方案：从系统到硬件折腾了一遍</title><link>https://www.9ll.uk/posts/windows/ultimategameperformance/</link><guid isPermaLink="true">https://www.9ll.uk/posts/windows/ultimategameperformance/</guid><description>把 Windows 系统设置、CPU 调优、GPU 超频、鼠标延迟都折腾了一遍，记录一下目前在用的配置</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近 CS2 打得比较多，总觉得帧数不够稳、鼠标有点拖。从系统设置到硬件超频折腾了一遍，现在舒服多了。弄之前平均帧大概 580-600，low 只有 200-210；弄完后平均帧 657，low 250。&lt;/p&gt;
&lt;p&gt;先说我的配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU：9955HX&lt;/li&gt;
&lt;li&gt;GPU：5070Ti 12G Laptop&lt;/li&gt;
&lt;li&gt;内存：16X2=32G( 镁光M8D1 )&lt;/li&gt;
&lt;li&gt;系统：XOS11 25H2 V15&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;CS2设置&quot; loading=&quot;lazy&quot; width=&quot;4096&quot; height=&quot;3072&quot; src=&quot;/_astro/cs2config.CQkpgS37_ZIAcoG.webp&quot; /&gt;&lt;figcaption&gt;CS2设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;下面按折腾顺序来，从 BIOS 到系统设置都讲一遍。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;BIOS 设置&lt;a href=&quot;#bios-设置&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;CPU&lt;a href=&quot;#cpu&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UMAF 分核负压设置&lt;/strong&gt;：如下图所示,&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Windows/ZIP/UMAF_BETA.zip&quot; target=&quot;_blank&quot;&gt;Github/UMAF_BETA.zip &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭 VBS + 内存虚拟化&lt;/strong&gt;：使用&lt;a href=&quot;https://github.com/hy4962/Share/blob/main/Windows/ZIP/%E5%85%B3%E9%97%ADDG%E5%92%8CVBS%E8%87%AA%E5%8A%A8%E5%8C%85.zip&quot; target=&quot;_blank&quot;&gt;Github/关闭DG和VBS自动包&lt;/a&gt;执行重启后疯狂按F3开机即可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频率&lt;/strong&gt;： 4.8 G&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;CPU 负压设置&quot; loading=&quot;lazy&quot; width=&quot;3072&quot; height=&quot;4096&quot; src=&quot;/_astro/cpu-negative-pressure.GDBDGmVl_Z17bKHW.webp&quot; /&gt;&lt;figcaption&gt;CPU 负压设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;尝试禁用CCD1的方案然后跑5.2 G和5.0G，但是温度反而100°C，93°C了，双CCD4.8G倒是最多85°C，都是用同一套负压。奇怪…&lt;/p&gt;&lt;/blockquote&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;strong&gt;镁光 M8D1&lt;/strong&gt;，原生 5600c46，101ns，超到 6000c40，85ns到88ns。我的作业貌似非常保守，这个也是超别人的&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;内存超频参数&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;766&quot; src=&quot;/_astro/memory-overclocking.CaE8UyHH_1OaNGS.webp&quot; /&gt;&lt;figcaption&gt;内存超频参数&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里我把&lt;strong&gt;第一个&lt;/strong&gt;26&lt;strong&gt;改成了28&lt;/strong&gt;，&lt;strong&gt;第五个&lt;/strong&gt;4E&lt;strong&gt;改成了52&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;UMAF_SPD&quot; loading=&quot;lazy&quot; width=&quot;4096&quot; height=&quot;3072&quot; src=&quot;/_astro/umaf_spd.yJ7m9frq_Z2gl0SI.webp&quot; /&gt;&lt;figcaption&gt;UMAF_SPD&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;h2&gt;GPU 超频&lt;a href=&quot;#gpu-超频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;硬件搞定了，再来折腾 N 卡。&lt;/p&gt;&lt;p&gt;安装厂商官方驱动包，但没安装核显、N 卡驱动和 AMD 安全启动。厂商控制台 CPU 全拉满，然后对 N 卡进行超频：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;N卡控制面板1&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;612&quot; src=&quot;/_astro/gpu-settings.CM0VnNkI_12LjwQ.webp&quot; /&gt;&lt;figcaption&gt;N卡控制面板1&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;N卡控制面板2&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;747&quot; src=&quot;/_astro/gpu-settings2.DZ4dc0Gq_Z1s11uj.webp&quot; /&gt;&lt;figcaption&gt;N卡控制面板2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心频率&lt;/strong&gt;：+250 MHz&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显存频率&lt;/strong&gt;：+300 MHz&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GPU 超频设置 1&quot; loading=&quot;lazy&quot; width=&quot;2030&quot; height=&quot;1094&quot; src=&quot;/_astro/gpu-overclock-settings-new.BHH0NVkt_Z2caeas.webp&quot; /&gt;&lt;figcaption&gt;GPU 超频设置 1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GPU 超频设置 2&quot; loading=&quot;lazy&quot; width=&quot;1482&quot; height=&quot;915&quot; src=&quot;/_astro/gpu-overclock-metrics.CeEI2lfL_2smSLt.webp&quot; /&gt;&lt;figcaption&gt;GPU 超频设置 2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;N 卡驱动我自己用 596.36-notebook-win10-win11-64bit-international-dch-whql&lt;/p&gt;&lt;/blockquote&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;section&gt;&lt;h3&gt;Process Lasso Pro 配置&lt;a href=&quot;#process-lasso-pro-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;规则添加游戏进程就完事了：禁用 CPU0 + 提升进程优先级。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Process Lasso 设置&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;308&quot; src=&quot;/_astro/process-lasso-cs2.B4HC7PB6_Z1CAIWn.webp&quot; /&gt;&lt;figcaption&gt;Process Lasso 设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;金银核与禁用 CPU0 的原理&lt;a href=&quot;#金银核与禁用-cpu0-的原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;perf#1&lt;/code&gt; 代表系统会优先将任务分配到该核心上。我的金银核是 Core 0 和 Core 4。&lt;/p&gt;&lt;p&gt;简单来说：如果你的金银核中有一个正好在 CPU0 上（比如我的情况），游戏禁用 CPU0 的收益最高。因为在鼠标、键盘高轮询率的情况下，系统会优先用金银核处理输入事件。禁用 CPU0 后，游戏反而会更流畅——因为输入处理不再抢占游戏核心的资源。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;金银核示意&quot; loading=&quot;lazy&quot; width=&quot;865&quot; height=&quot;829&quot; src=&quot;/_astro/cpu-golden-core.Db1IiIOy_1LsPPH.webp&quot; /&gt;&lt;figcaption&gt;金银核示意&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&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;使用 Booster 快速设置最佳配置，然后手动恢复 WiFi 和蓝牙为正常打开状态。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;提示：这个系统需要在设备管理器里单独手动安装 WiFi 驱动。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Booster WiFi 驱动安装&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;943&quot; src=&quot;/_astro/booster-wifi-driver.DteE7At2_Zx1xxu.webp&quot; /&gt;&lt;figcaption&gt;Booster WiFi 驱动安装&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;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;section&gt;&lt;h3&gt;1. 关闭鼠标加速&lt;a href=&quot;#1-关闭鼠标加速&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;默认状态&lt;/strong&gt;：开启&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;code&gt;Win + R&lt;/code&gt; → 输入 &lt;code&gt;main.cpl&lt;/code&gt; → 确定 → 指针选项 → 取消勾选「提高指针精确度」→ 应用&lt;/p&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：修复鼠标拖不动&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 修改 Win32PrioritySeparation 为 42（十进制）&lt;a href=&quot;#2-修改-win32priorityseparation-为-42十进制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;默认值&lt;/strong&gt;：十进制 2&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;code&gt;Win + R&lt;/code&gt; → 输入 &lt;code&gt;regedit&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;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\PriorityControl&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;Win32PrioritySeparation&lt;/code&gt;，修改为十进制 &lt;code&gt;42&lt;/code&gt;（需重启生效）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：修复鼠标拖不动&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 关闭 USB 选择性暂停&lt;a href=&quot;#3-关闭-usb-选择性暂停&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;默认状态&lt;/strong&gt;：已启用&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;code&gt;Win + R&lt;/code&gt; → 输入 &lt;code&gt;powercfg.cpl&lt;/code&gt; → 确定 → 更改计划设置 → 更改高级电源设置 → USB 设置 → USB 选择性暂停设置 → 改成「已禁用」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;USB 选择性暂停&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;592&quot; src=&quot;/_astro/usbsetting.DUtBxaC5_1rHF96.webp&quot; /&gt;&lt;figcaption&gt;USB 选择性暂停&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：修复鼠标拖不动&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;提示：如果没有 USB 设置选项&lt;/p&gt;&lt;p&gt;则访问注册表&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00&lt;/code&gt;&lt;/p&gt;&lt;p&gt;在右侧找到 &lt;code&gt;Attributes&lt;/code&gt;，双击，将数值从 &lt;code&gt;1&lt;/code&gt; 改为 &lt;code&gt;2&lt;/code&gt;&lt;/p&gt;&lt;p&gt;或者请参考下图操作：&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;USB 电源设置&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;943&quot; src=&quot;/_astro/usb-power-settings.DiQ8pO4c_1PA0KT.webp&quot; /&gt;&lt;figcaption&gt;USB 电源设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 关闭修复应用缩放（仅 Win10）&lt;a href=&quot;#4-关闭修复应用缩放仅-win10&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;默认状态&lt;/strong&gt;：开启&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：桌面右键 → 显示设置 → 高级缩放设置 → 修复应用缩放 → 关&lt;/p&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：修复鼠标掉帧&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;此项仅限 Win10，Win11 不用理会。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 关闭「在打字时隐藏指针」&lt;a href=&quot;#5-关闭在打字时隐藏指针&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;默认状态&lt;/strong&gt;：开启&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;code&gt;Win + R&lt;/code&gt; → 输入 &lt;code&gt;main.cpl&lt;/code&gt; → 确定 → 指针选项 → 取消选中「在打字时隐藏指针」&lt;/p&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&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;AMD最好禁用高精度处理器，特别在老AMD上，一两天会有一次非常剧烈的卡顿，甚至在桌面也有，禁用后即可解决，但其实在新AMD上几乎看不到，反正禁用没坏处…&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;1232&quot; height=&quot;885&quot; src=&quot;/_astro/disable-hpet.D8QrpTnb_1DjqDE.webp&quot; /&gt;&lt;figcaption&gt;禁用高精度事件计时器&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;对于AMD纯大核心的设计，电源计划的调度必须选择全部和异类策略4，否则会出现分配不均的情况，因为默认的是英特尔大小核的调度。&lt;/p&gt;&lt;p&gt;但是如果你说双CCD延迟高，你用上面说到的Process Lasso Pro改需要延迟低的程序，绑定一个CCD亲和性就就行了&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;（很多笔记本默认隐藏了这2个选项，要调整需要更改注册表。 点击”Windows键”+“R键”，输入regedit打开注册表编辑器，在”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00”下找到”93b8b6dc-0698-4d1c-9ee4-0644e900c85d”以及”bae08b81-2d5e-4688-ad6a-13243356654b”，进去后将2个路径下的”Attributes”值由默认0更改为2，重新打开电源计划即可更改异类线程调度策略和异类短运行线程调度策略。）&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;电源计划设置1&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;592&quot; src=&quot;/_astro/power-plan-settings.DOK7vgB__ZORkag.webp&quot; /&gt;&lt;figcaption&gt;电源计划设置1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;电源计划设置2&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;592&quot; src=&quot;/_astro/power-plan-settings-2.CDX5KC3S_ZpOoyU.webp&quot; /&gt;&lt;figcaption&gt;电源计划设置2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&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;折腾完之后 CS2 帧数稳了不少，鼠标也不拖了。说实话挺烦的，但搞完确实舒服。&lt;/p&gt;&lt;p&gt;核心配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;：4.8G + 全核分核负压&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：核心频率 +250Mhz，显存频率 +300Mhz&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：5600C46 → 6000C40&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统&lt;/strong&gt;：XOS11 25H2 + Booster 快速最佳设置 + 鼠标设置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电源&lt;/strong&gt;：解锁电源计划隐藏选项，使用高性能电源计划把异类策略改为4，异类调度改为全部并取消 USB 节能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备管理器&lt;/strong&gt;：取消所有 USB 设备”允许计算机关闭此设备以节约电源”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;接下来打算试试内存能不能再压一下时序，看看有没有提升。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>《俺妹》观后感</title><link>https://www.9ll.uk/posts/acg/review/oreimo/oreimo/</link><guid isPermaLink="true">https://www.9ll.uk/posts/acg/review/oreimo/oreimo/</guid><description>《俺の妹がこんなに可愛いわけがない》观后感，聊聊剧情节奏、角色塑造和结局争议。</description><pubDate>Tue, 21 Jul 2026 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;blockquote&gt;&lt;p&gt;横线以上基本无剧透，没看过的可以放心看。&lt;br /&gt;
下面只是个人观点，也算留给未来自己的一个记录&lt;/p&gt;&lt;/blockquote&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;&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;&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;hr /&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;&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;&lt;p&gt;能够保持自己的兴趣爱好，同时还能把学习、工作、生活全部做好。&lt;/p&gt;&lt;p&gt;这种能力和自律，其实非常夸张。&lt;/p&gt;&lt;hr /&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;&lt;p&gt;如果单纯从理想型来看，我觉得黑猫可能会更符合一点。&lt;/p&gt;&lt;p&gt;她不是那种第一眼特别强烈的角色，但越了解越容易喜欢。&lt;/p&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;p&gt;没看完真的别往下翻。&lt;/p&gt;&lt;p&gt;《俺妹》这种作品，第一次观看体验其实很重要，一点点关键剧情都会影响感受。[笑哭]&lt;/p&gt;&lt;hr /&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;&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;&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;hr /&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;&lt;p&gt;但它确实留下了很深的印象。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>用 Vercel + TiDB 搭建 Waline 评论系统</title><link>https://www.9ll.uk/posts/deploy/deploywaline/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deploywaline/</guid><description>用 Vercel 免费部署 Waline 评论服务端，数据库选 TiDB Cloud（免费 5GB），半小时搞定，数据自己掌控</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有次在别人的博客上看到 Waline，去 GitHub 一查，发现它支持多数据库、能自己部署、还能统计浏览量，功能挺全的。关键是它开源，数据自己掌控，我就想着搞一个试试。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选 TiDB 而不是 Neon&lt;a href=&quot;#为什么选-tidb-而不是-neon&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Waline 官方的 Vercel 部署教程默认用 Neon（PostgreSQL），免费给 512MB。但我查了一下 TiDB Cloud，免费额度有 5GB，差了十倍。对于评论系统来说数据库不会太大，但 5GB 总比 512MB 舒服，以后万一要存点浏览量数据也不用担心。&lt;/p&gt;&lt;p&gt;TiDB 本身是兼容 MySQL 协议的 NewSQL 数据库，Waline 直接支持 TiDB 作为后端，不用额外折腾。所以我就决定用 Vercel + TiDB 这个组合。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一步：部署 Vercel 服务端&lt;a href=&quot;#第一步部署-vercel-服务端&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Waline 官方提供了一键部署的按钮，点一下就行。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwalinejs%2Fwaline%2Ftree%2Fmain%2Fexample&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure&gt;&lt;a href=&quot;https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwalinejs%2Fwaline%2Ftree%2Fmain%2Fexample&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vercel.com/button&quot; alt=&quot;Vercel&quot; /&gt;&lt;figcaption&gt;Vercel&lt;/figcaption&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击上面的按钮，会跳转到 Vercel。如果你还没登录，它会让你用 GitHub 账号注册或登录。&lt;/p&gt;&lt;p&gt;登录之后，给你的项目起个名字，比如 &lt;code&gt;my-waline&lt;/code&gt;，然后点 &lt;code&gt;Create&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;3010&quot; height=&quot;1508&quot; src=&quot;/_astro/vercel-1-D2seYf19.D2seYf19_Z2wVaz5.webp&quot; /&gt;&lt;figcaption&gt;给项目起名&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Vercel 会基于 Waline 模板自动创建一个仓库，大概一两分钟就能部署好。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;自动创建仓库&quot; loading=&quot;lazy&quot; width=&quot;3022&quot; height=&quot;1504&quot; src=&quot;/_astro/vercel-2-BDSPJcTz.BDSPJcTz_1g5dMT.webp&quot; /&gt;&lt;figcaption&gt;自动创建仓库&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;部署成功后会有一屏烟花，点 &lt;code&gt;Go to Dashboard&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;3022&quot; height=&quot;1526&quot; src=&quot;/_astro/vercel-3-MOiZtKqX.MOiZtKqX_Z1Jgbke.webp&quot; /&gt;&lt;figcaption&gt;部署成功&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;到这里服务端代码就部署好了，但还没连数据库，所以先别急着用。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第二步：创建 TiDB 数据库&lt;a href=&quot;#第二步创建-tidb-数据库&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;注册 TiDB Cloud&lt;a href=&quot;#注册-tidb-cloud&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;去 &lt;a href=&quot;https://tidbcloud.com&quot; target=&quot;_blank&quot;&gt;TiDB Cloud&lt;/a&gt; 注册一个账号。注册完之后会自动创建一个 TiDB 实例，不用手动配置。&lt;/p&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;code&gt;cluster0&lt;/code&gt;），左侧选 &lt;code&gt;SQL Editor&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;2726&quot; height=&quot;1208&quot; src=&quot;/_astro/tidb-1-mKqYDk6x.mKqYDk6x_VVfOM.webp&quot; /&gt;&lt;figcaption&gt;进入实例&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接下来要执行建表语句。Waline 官方提供了一个 SQL 文件，但那个是 PostgreSQL 格式的。TiDB 用的是 MySQL 兼容语法，需要用 &lt;a href=&quot;https://github.com/walinejs/waline/blob/main/assets/waline.tidb&quot; target=&quot;_blank&quot;&gt;waline.tidb&lt;/a&gt; 这个文件。&lt;/p&gt;&lt;p&gt;SQL 文件的内容大概是这样的：&lt;/p&gt;&lt;div&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;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATABASE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;waline&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;/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;USE&lt;/span&gt;&lt;span&gt; waline;&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;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;wl_Comment&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;`id`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; unsigned &lt;/span&gt;&lt;span&gt;NOT NULL&lt;/span&gt;&lt;span&gt; AUTO_INCREMENT,&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;`user_id`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`comment`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&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;`insertedAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;`ip`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&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;&apos;&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;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`link`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&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;`mail`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&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;  &lt;/span&gt;&lt;span&gt;`nick`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&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;`pid`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`rid`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&lt;/span&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;span&gt;  &lt;/span&gt;&lt;span&gt;`sticky`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;boolean&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;NULL&lt;/span&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;  &lt;/span&gt;&lt;span&gt;`status`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`like`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`ua`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&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;  &lt;/span&gt;&lt;span&gt;`url`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&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;`createdAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;`updatedAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;PRIMARY KEY&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;`id`&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;) CHARSET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;utf8mb4;&lt;/span&gt;&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;/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;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;wl_Counter&lt;/span&gt;&lt;span&gt;` (&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;`id`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; unsigned &lt;/span&gt;&lt;span&gt;NOT NULL&lt;/span&gt;&lt;span&gt; AUTO_INCREMENT,&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;`time`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&lt;/span&gt;&lt;span&gt;,&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;`reaction0`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`reaction1`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&lt;/span&gt;&lt;span&gt;,&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;`reaction2`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`reaction3`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`reaction4`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;  &lt;/span&gt;&lt;span&gt;`reaction5`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`reaction6`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&lt;/span&gt;&lt;span&gt;,&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;`reaction7`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;`reaction8`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&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;NULL&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;  &lt;/span&gt;&lt;span&gt;`url`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`createdAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;  &lt;/span&gt;&lt;span&gt;`updatedAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;PRIMARY KEY&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;`id`&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;&lt;span&gt;) CHARSET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;utf8mb4;&lt;/span&gt;&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;/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;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;wl_Users&lt;/span&gt;&lt;span&gt;` (&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;span&gt;`id`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; unsigned &lt;/span&gt;&lt;span&gt;NOT NULL&lt;/span&gt;&lt;span&gt; AUTO_INCREMENT,&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;`display_name`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`email`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`password`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;49&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;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;50&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;NOT NULL&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;&apos;&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;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`label`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&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;`url`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&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;  &lt;/span&gt;&lt;span&gt;`avatar`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`github`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`twitter`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`facebook`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`google`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;  &lt;/span&gt;&lt;span&gt;`weibo`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&gt;&lt;span&gt;,&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;span&gt;`qq`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&lt;/span&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;`oidc`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&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;NULL&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;`2fa`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;32&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;NULL&lt;/span&gt;&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;  &lt;/span&gt;&lt;span&gt;`createdAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;`updatedAt`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;  &lt;/span&gt;&lt;span&gt;PRIMARY KEY&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;`id`&lt;/span&gt;&lt;span&gt;)&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;) CHARSET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;utf8mb4;&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;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意一点：TiDB Cloud 的 SQL Editor 每次只能执行一条语句。所以你得按 &lt;code&gt;;&lt;/code&gt; 分隔，一句一句贴进去执行。每贴一句，点右上角的蓝色运行按钮，或者按 &lt;code&gt;Ctrl+Enter&lt;/code&gt;（Mac 上是 &lt;code&gt;Cmd+Enter&lt;/code&gt;）。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;SQL Editor 执行&quot; loading=&quot;lazy&quot; width=&quot;2726&quot; height=&quot;1208&quot; src=&quot;/_astro/tidb-2-B0iuNE4v.B0iuNE4v_FM0Xe.webp&quot; /&gt;&lt;figcaption&gt;SQL Editor 执行&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;三张表都创建好之后，数据库就准备完了。&lt;/p&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;code&gt;Overview&lt;/code&gt; 回到首页，右上角有个 &lt;code&gt;Connect&lt;/code&gt; 按钮，点进去获取连接配置。&lt;/p&gt;&lt;p&gt;Connect with 选 &lt;code&gt;General&lt;/code&gt;，然后点 &lt;code&gt;Reset password&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;2726&quot; height=&quot;1828&quot; src=&quot;/_astro/tidb-7-XwRE4REJ.XwRE4REJ_Zr2swK.webp&quot; /&gt;&lt;figcaption&gt;获取连接配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;你需要记下这几个信息：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;：类似 &lt;code&gt;xxx.ap-southeast-1.tidbcloud.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;：默认 &lt;code&gt;4000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Name&lt;/strong&gt;：一般是 &lt;code&gt;xxx.root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;：刚才生成的那个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database&lt;/strong&gt;：&lt;code&gt;waline&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第三步：给 Vercel 配置数据库&lt;a href=&quot;#第三步给-vercel-配置数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;回到 Vercel 的项目控制台，点顶部的 &lt;code&gt;Settings&lt;/code&gt;，然后找到左侧的 &lt;code&gt;Environment Variables&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;点右上角的 &lt;code&gt;Add Environment Variable&lt;/code&gt;，依次添加以下五个变量：&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量名&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TIDB_HOST&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;xxx.ap-southeast-1.tidbcloud.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TiDB 的 Host 地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TIDB_PORT&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;4000&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TiDB 端口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TIDB_DB&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;waline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;数据库名&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TIDB_USER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;xxx.root&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用户名&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TIDB_PASSWORD&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;你生成的密码&lt;/code&gt;&lt;/td&gt;&lt;td&gt;密码&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;配置环境变量&quot; loading=&quot;lazy&quot; width=&quot;2726&quot; height=&quot;1828&quot; src=&quot;/_astro/tidb-8-AaYLfj0l.AaYLfj0l_1YekLa.webp&quot; /&gt;&lt;figcaption&gt;配置环境变量&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;填完之后，去 &lt;code&gt;Deployments&lt;/code&gt; 页面，点最新一次部署右边的 &lt;code&gt;Redeploy&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;3022&quot; height=&quot;1518&quot; src=&quot;/_astro/vercel-9-Dc-86IYm.Dc-86IYm_Z1RUSrS.webp&quot; /&gt;&lt;figcaption&gt;重新部署&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;等部署状态变成 &lt;code&gt;Ready&lt;/code&gt; 之后，点 &lt;code&gt;Visit&lt;/code&gt; 就能看到你的 Waline 服务了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;访问服务&quot; loading=&quot;lazy&quot; width=&quot;3022&quot; height=&quot;1516&quot; src=&quot;/_astro/vercel-10-BS4ALWuI.BS4ALWuI_2jvtD1.webp&quot; /&gt;&lt;figcaption&gt;访问服务&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&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;如果你不想用 Vercel 默认的域名，可以绑自己的域名。&lt;/p&gt;&lt;p&gt;点 &lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Domains&lt;/code&gt;，输入你想绑定的域名，点 &lt;code&gt;Add&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;1026&quot; height=&quot;369&quot; src=&quot;/_astro/vercel-11-BDTeHH3e.BDTeHH3e_XkQNG.webp&quot; /&gt;&lt;figcaption&gt;添加域名&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后去你的域名服务商那里，添加一条 CNAME 记录：&lt;/p&gt;














&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CNAME&lt;/td&gt;&lt;td&gt;example&lt;/td&gt;&lt;td&gt;cname.vercel-dns.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;example&lt;/code&gt; 是你子域名的部分，比如你想用 &lt;code&gt;comment.yourdomain.com&lt;/code&gt;，就填 &lt;code&gt;comment&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;等 DNS 生效后，你的评论系统地址就变成了 &lt;code&gt;comment.yourdomain.com&lt;/code&gt;，管理后台在 &lt;code&gt;comment.yourdomain.com/ui&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;785&quot; height=&quot;138&quot; src=&quot;/_astro/vercel-12-Df5XGWYy.Df5XGWYy_8h4pD.webp&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;第五步：在网站里接入评论&lt;a href=&quot;#第五步在网站里接入评论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务端搞定了，最后一步是在你的网站里引入 Waline 客户端。&lt;/p&gt;&lt;p&gt;在 HTML 里加上这几行：&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;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;https://unpkg.com/@waline/client@v3/dist/waline.css&quot;&lt;/span&gt;&lt;span&gt; /&amp;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;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;waline&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;module&quot;&lt;/span&gt;&lt;span&gt;&amp;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;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://unpkg.com/@waline/client@v3/dist/waline.js&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;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;init&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;el&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;#waline&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;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;serverURL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;https://你的服务端地址&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;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;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;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;serverURL&lt;/code&gt; 替换成你 Vercel 部署后的地址就行。&lt;/p&gt;&lt;p&gt;如果你用的是 Astro、Hexo 这类静态博客框架，一般都有 Waline 插件，配置起来更简单。&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;h3&gt;自带管理后台，这是 Waline 的一大优势&lt;a href=&quot;#自带管理后台这是-waline-的一大优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;说实话，很多评论系统（比如 Valine、Twikoo）都没有独立的管理后台，你只能去数据库里一条条翻评论，或者在前端一个一个删除。Waline 不一样，它自带一个完整的 Web 管理界面。&lt;/p&gt;&lt;p&gt;访问 &lt;code&gt;&amp;lt;你的服务端地址&amp;gt;/ui/register&lt;/code&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;：可疑的评论可以标记为 spam，系统会自动识别类似的评论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;搜索过滤&lt;/strong&gt;：可以按文章 URL、用户名、邮箱、时间范围筛选评论，找起来方便。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户管理&lt;/strong&gt;：普通用户注册后会出现在管理后台的用户列表里，管理员可以调整用户角色。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;跟那些只能在前端删除评论的方案比起来，这个管理后台体验好太多了。你可以在手机浏览器上直接访问 &lt;code&gt;/ui&lt;/code&gt; 管理评论，不用开电脑。&lt;/p&gt;&lt;p&gt;普通用户也可以通过评论框注册账号，登录后能看到自己的评论记录，修改自己的资料。&lt;/p&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;整个过程其实挺顺利的，从开始折腾到跑通大概花了半小时。主要时间花在了搞清楚 TiDB Cloud 的 SQL Editor 怎么一句一句执行建表语句上。&lt;/p&gt;&lt;p&gt;Vercel 免费版对个人博客来说完全够用，TiDB Cloud 的 5GB 免费空间对于评论数据也绰绰有余。如果你跟我一样，不想把评论数据交给第三方，又不想自己维护服务器，这个组合挺合适的。&lt;/p&gt;&lt;p&gt;唯一要注意的是 TiDB Cloud 的免费版有连接数限制，如果你的博客流量特别大，可能需要考虑升级。不过对于大多数个人博客来说，应该不会碰到这个瓶颈。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 Waline 评论系统的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>优化鼠标跟手性，顺便解决了完美死斗跳 ms 的问题</title><link>https://www.9ll.uk/posts/windows/mouseoptimization/</link><guid isPermaLink="true">https://www.9ll.uk/posts/windows/mouseoptimization/</guid><description>用 BoosterX 解锁 USB 高级选项，调整电源计划和设备管理器设置，解决鼠标延迟高、不跟手的问题</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;优化鼠标跟手性，顺便解决了完美死斗跳 ms 的问题&lt;a href=&quot;#优化鼠标跟手性顺便解决了完美死斗跳-ms-的问题&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;p&gt;最近在用的 ATKU2 老是感觉不跟手，延迟很高，开高 HZ 也没用。忍不住买了新鼠标还没到，想着趁这段时间控制变量，排查一下是不是电脑环境的问题。&lt;/p&gt;&lt;p&gt;无意中想起来 &lt;a href=&quot;https://boosterx.org/zh/&quot; target=&quot;_blank&quot;&gt;BoosterX&lt;/a&gt;，就是 simple 同款的那个优化软件。其实我心里不太喜欢这类软件，感觉细节没那么可控，但为了统一环境还是试了一下。&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;用完 BoosterX 一键优化后，发现它自带了一个电源计划。试了一下，鼠标确实特别跟手了，但电脑帧数明显变低了。&lt;/p&gt;&lt;p&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;h3&gt;1. BoosterX 解锁高级选项&lt;a href=&quot;#1-boosterx-解锁高级选项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先在 BoosterX 里把电源管理的高级选项解锁：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;BoosterX 解锁高级选项&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;943&quot; src=&quot;/_astro/boosterx-unlock-advanced-options.BVepxZip_2qclEh.webp&quot; /&gt;&lt;figcaption&gt;BoosterX 解锁高级选项&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 修改高性能电源计划的 USB 设置&lt;a href=&quot;#2-修改高性能电源计划的-usb-设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;找到高性能电源计划，把 USB 设置里的三项全部改成 Off：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我用的高性能是 Windows 自带的，执行 &lt;code&gt;powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61&lt;/code&gt; 就行。因为 BoosterX 自带的电源计划帧数远不如我的。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;电源计划 USB 设置全部 Off&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;592&quot; src=&quot;/_astro/power-plan-usb-settings-off.DApCNOFu_1x6pjH.webp&quot; /&gt;&lt;figcaption&gt;电源计划 USB 设置全部 Off&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 设备管理器关闭 USB 节电&lt;a href=&quot;#3-设备管理器关闭-usb-节电&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;figure&gt;&lt;img alt=&quot;设备管理器通用串行总线控制器&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;885&quot; src=&quot;/_astro/device-manager-usb-controllers.5QUNRkCP_Z1JfLfA.webp&quot; /&gt;&lt;figcaption&gt;设备管理器通用串行总线控制器&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;USB 集线器电源管理取消勾选&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;687&quot; src=&quot;/_astro/usb-hub-power-management-uncheck.D342NZaI_Z2WSTB.webp&quot; /&gt;&lt;figcaption&gt;USB 集线器电源管理取消勾选&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. （可选）关闭 CS 全屏优化&lt;a href=&quot;#4-可选关闭-cs-全屏优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CS 记得关闭全屏优化。这个我没有认真测试，不敢保证一定要关，但关了没坏处。&lt;/p&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;ol&gt;
&lt;li&gt;打开 BoosterX，快速方法里选”最佳”，点应用&lt;/li&gt;
&lt;li&gt;按上面的步骤改电源计划和设备管理器&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;BoosterX 快速方法选择最佳&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;943&quot; src=&quot;/_astro/boosterx-quick-method-best.CD00vMpN_1y4YDy.webp&quot; /&gt;&lt;figcaption&gt;BoosterX 快速方法选择最佳&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;真的非常见效。起码在我 9955HX + 5070Ti Laptop 装了 XOS11 25H2 的机器上，绝对不可能是什么心理作用，实在是太明显了。&lt;/p&gt;&lt;p&gt;另外这软件还顺带解决了一个问题——我只有完美死斗会跳 ms，突然一下 20ms 多卡手一下，但其他场景都没有，包括完美天梯实战也没有。一开始还以为是完美自己的问题，今天才发现不是。优化完也搞定了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>《零之使魔》观后感</title><link>https://www.9ll.uk/posts/acg/review/zero-no-tsukaima/zero-no-tsukaima/</link><guid isPermaLink="true">https://www.9ll.uk/posts/acg/review/zero-no-tsukaima/zero-no-tsukaima/</guid><description>经典异世界恋爱动画《零之使魔》观后感，聊聊剧情节奏、感情线处理和人物塑造方面的优缺点。</description><pubDate>Sun, 19 Jul 2026 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;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;h3&gt;1. 剧情节奏方面&lt;a href=&quot;#1-剧情节奏方面&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;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 感情线处理方面&lt;a href=&quot;#2-感情线处理方面&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;/p&gt;&lt;blockquote&gt;&lt;p&gt;事情明明没有解决，但编剧说解决了。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 人物塑造方面&lt;a href=&quot;#3-人物塑造方面&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;/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;hr /&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;&lt;p&gt;前期还以为要搞什么贵族斗争、家族恩怨，结果后面大家全变兄弟，多少有点虎头蛇尾。&lt;/p&gt;&lt;hr /&gt;&lt;/section&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;露易丝不愧是四季 ED 都安排角色曲的绝对女主。&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;她不是一个单纯的“傲娇女主模板”，随着剧情推进，她的成长、她和才人之间关系的变化，都让这个角色慢慢有了自己的魅力。&lt;/p&gt;&lt;p&gt;整体来说，《零之使魔》有不少明显的问题，剧情节奏、感情处理、男主塑造都有槽点。&lt;/p&gt;&lt;p&gt;但不可否认的是，它依然塑造出了一个非常经典的女主，也代表了一个时代异世界恋爱动画的风格。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker 部署 SearXNG 完整教程</title><link>https://www.9ll.uk/posts/deploy/deploysearxng/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deploysearxng/</guid><description>Docker快速部署 SearXNG 开源元搜索引擎，聚合多个搜索引擎结果，注重隐私的搜索利器。可以给Ai加skills然后调用</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;🐳 Docker 部署 SearXNG 完整教程&lt;a href=&quot;#-docker-部署-searxng-完整教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;SearXNG&lt;/strong&gt; 是一款开源的元搜索引擎，聚合多个搜索引擎的结果，同时&lt;strong&gt;不追踪用户、不建立用户画像&lt;/strong&gt;，是注重隐私的搜索利器。本文将手把手演示如何通过 Docker Desktop 在 NAS 上快速部署 SearXNG。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、搜索并拉取 SearXNG 镜像&lt;a href=&quot;#一搜索并拉取-searxng-镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;打开 Docker Desktop，进入左侧 &lt;strong&gt;「镜像仓库」&lt;/strong&gt; 选项卡，在搜索框中输入 &lt;code&gt;SearXNG&lt;/code&gt;：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;在 Docker 镜像仓库中搜索 SearXNG&quot; loading=&quot;lazy&quot; width=&quot;1467&quot; height=&quot;876&quot; src=&quot;/_astro/image-20260719205345924.Dh-EFoVL_JU5A7.webp&quot; /&gt;&lt;figcaption&gt;在 Docker 镜像仓库中搜索 SearXNG&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在搜索结果中选择官方镜像 &lt;strong&gt;&lt;code&gt;searxng/searxng&lt;/code&gt;&lt;/strong&gt;（下载量 50M+，⭐ 185），点击右侧的下载按钮拉取镜像。&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;strong&gt;「本地镜像」&lt;/strong&gt; 选项卡，找到 &lt;code&gt;searxng/searxng&lt;/code&gt; 镜像，点击右侧的 &lt;strong&gt;▶ 运行&lt;/strong&gt; 按钮启动创建流程：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;在本地镜像中找到 SearXNG 并点击运行&quot; loading=&quot;lazy&quot; width=&quot;1383&quot; height=&quot;833&quot; src=&quot;/_astro/image-20260719205519028.BkbxDTve_ZDpmkU.webp&quot; /&gt;&lt;figcaption&gt;在本地镜像中找到 SearXNG 并点击运行&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在弹出的 &lt;strong&gt;「创建容器」&lt;/strong&gt; 对话框中，确认以下设置：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置项&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;镜像名称&lt;/td&gt;&lt;td&gt;&lt;code&gt;searxng/searxng:latest&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;容器名称&lt;/td&gt;&lt;td&gt;&lt;code&gt;searxng&lt;/code&gt;（可自定义）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;开机自动开启&lt;/td&gt;&lt;td&gt;✅ 勾选&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;创建容器 - 基本设置&quot; loading=&quot;lazy&quot; width=&quot;1286&quot; height=&quot;878&quot; src=&quot;/_astro/image-20260719205532712.IrP0mo-J_ZSrIO4.webp&quot; /&gt;&lt;figcaption&gt;创建容器 - 基本设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;提示&lt;/strong&gt;：「资源限制」可保持默认（CPU 权重和内存限制均为自动），除非你的 NAS 性能紧张需要手动限制。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;配置完成后，点击 &lt;strong&gt;「下一步」&lt;/strong&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;strong&gt;「高级设置 → 端口设置」&lt;/strong&gt; 中，添加端口映射规则，将容器的 &lt;code&gt;8080&lt;/code&gt; 端口映射到宿主机的 &lt;code&gt;8080&lt;/code&gt; 端口：&lt;/p&gt;














&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;本地端口&lt;/th&gt;&lt;th&gt;容器端口&lt;/th&gt;&lt;th&gt;协议&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;8080&lt;/td&gt;&lt;td&gt;8080&lt;/td&gt;&lt;td&gt;TCP&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;端口映射设置&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;413&quot; src=&quot;/_astro/image-20260719205632751.B7_MIis7_17aB3E.webp&quot; /&gt;&lt;figcaption&gt;端口映射设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;注意&lt;/strong&gt;：如果 &lt;code&gt;8080&lt;/code&gt; 端口已被其他服务占用，请将「本地端口」修改为其他可用端口（如 &lt;code&gt;8081&lt;/code&gt;、&lt;code&gt;8888&lt;/code&gt; 等），后续访问时使用对应端口即可。&lt;/p&gt;&lt;/blockquote&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;strong&gt;「存储位置」&lt;/strong&gt; 部分，添加以下两条路径映射规则，将容器内的配置和缓存目录持久化到 NAS 本地：&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;NAS 宿主机路径&lt;/th&gt;&lt;th&gt;容器内路径&lt;/th&gt;&lt;th&gt;权限&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/vol1/1000/Docker/SearXNG/config&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/etc/searxng&lt;/code&gt;&lt;/td&gt;&lt;td&gt;读写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/vol1/1000/Docker/SearXNG/cache&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/var/cache/searxng&lt;/code&gt;&lt;/td&gt;&lt;td&gt;读写&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;存储路径映射设置&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;320&quot; src=&quot;/_astro/image-20260719205634455.Fy0Fz3at_YpAlJ.webp&quot; /&gt;&lt;figcaption&gt;存储路径映射设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;🔑 &lt;strong&gt;关键提醒&lt;/strong&gt;：&lt;strong&gt;务必映射 &lt;code&gt;/etc/searxng&lt;/code&gt; 目录&lt;/strong&gt;——这一步非常重要，因为我们后续需要覆盖默认的配置文件来自定义 SearXNG 的行为。如果不映射此路径，配置文件将仅存在于容器内部，容器重建后会丢失。&lt;/p&gt;&lt;/blockquote&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;strong&gt;🟢 运行中&lt;/strong&gt;，说明部署成功！此时可以通过 &lt;code&gt;http://&amp;lt;你的NAS-IP&amp;gt;:8080&lt;/code&gt; 访问 SearXNG 搜索页面。&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;section&gt;&lt;h3&gt;6.1 下载优化配置&lt;a href=&quot;#61-下载优化配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;下载我提供的优化配置文件：&lt;/p&gt;&lt;p&gt;🔗 &lt;a href=&quot;https://imgbed.9ll.uk/file/1784479323375_settings.yml&quot; target=&quot;_blank&quot;&gt;settings.yml 下载链接&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 替换配置文件&lt;a href=&quot;#62-替换配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;进入你映射到 &lt;code&gt;/etc/searxng&lt;/code&gt; 的 &lt;strong&gt;NAS 宿主机目录&lt;/strong&gt;（例如 &lt;code&gt;/vol1/1000/Docker/SearXNG/config&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;找到目录中的 &lt;code&gt;settings.yml&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;用下载的文件&lt;strong&gt;覆盖&lt;/strong&gt;原文件&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 重启容器&lt;a href=&quot;#63-重启容器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置文件替换完成后，回到 Docker Desktop &lt;strong&gt;重启 SearXNG 容器&lt;/strong&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;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://&amp;lt;你的NAS-IP&amp;gt;: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;你将看到 SearXNG 的搜索界面，可以直接开始使用了 🎉&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;section&gt;&lt;h3&gt;Q1：端口冲突怎么办？&lt;a href=&quot;#q1端口冲突怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;修改本地端口映射即可，例如将本地端口改为 &lt;code&gt;8081&lt;/code&gt;，然后通过 &lt;code&gt;http://&amp;lt;NAS-IP&amp;gt;:8081&lt;/code&gt; 访问。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：容器启动后访问不了？&lt;a href=&quot;#q2容器启动后访问不了&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;端口映射是否正确&lt;/li&gt;
&lt;li&gt;NAS 防火墙是否放行了对应端口&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：配置文件没有生效？&lt;a href=&quot;#q3配置文件没有生效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;确认配置文件已正确覆盖到映射的宿主机路径，并且&lt;strong&gt;重启了容器&lt;/strong&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Workers 部署一个免费图床</title><link>https://www.9ll.uk/posts/deploy/deployimgbed/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deployimgbed/</guid><description>从 Fork 项目到 D1 建表再到 GitHub Actions 自动部署，一步步搭建跑在 Cloudflare Workers 上的免费图床</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;折腾 CloudFlare ImgBed：用 Workers 部署一个免费图床&lt;a href=&quot;#折腾-cloudflare-imgbed用-workers-部署一个免费图床&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;p&gt;之前我一直用别人搭的图床，偶尔抽风挂了就得换一个，挺烦的。后来想着干脆自己搞一个算了，反正也不需要多大的量，个人博客够用就行。&lt;/p&gt;&lt;p&gt;研究了一圈发现 CloudFlare ImgBed 这个项目挺合适的。它跑在 Cloudflare Workers 上，数据库用 D1，存储可以选 R2 或者 Txxxram Bot，免费额度对个人图床来说完全够用。最关键的是不用自己搞服务器，Cloudflare 的边缘网络速度也不差。&lt;/p&gt;&lt;p&gt;部署方式有两种：Pages 和 Workers。Pages 更简单，Dashboard 里点几下就行。Workers 需要用 GitHub Actions，适合熟悉 CI/CD 流程的用户，支持 push 到 main 分支时自动部署，也可以手动触发。两种方式功能完全一样，我选了 Workers，主要想试试 GitHub Actions 自动部署的感觉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第一步：Fork 项目&lt;a href=&quot;#第一步fork-项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;先去 GitHub 上找到 &lt;a href=&quot;https://github.com/MarSeventh/CloudFlare-ImgBed&quot; target=&quot;_blank&quot;&gt;CloudFlare ImgBed&lt;/a&gt;，点右上角 Fork 到自己的账户下。这一步没什么好说的，应该都会。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第二步：准备 Cloudflare 资源&lt;a href=&quot;#第二步准备-cloudflare-资源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 获取 API Token&lt;a href=&quot;#21-获取-api-token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;登录 &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot;&gt;Cloudflare Dashboard&lt;/a&gt;，点头像进「我的个人资料」，左边栏有个「API 令牌」，点进去，然后点右上角的「创建令牌」。&lt;/p&gt;&lt;p&gt;模板选「编辑 Cloudflare Workers」就行。选完会跳到权限配置页面，这里直接默认就好，不用改什么。权限、账户资源、区域资源都是帮你配好的，往下翻到底提交就行。&lt;/p&gt;&lt;p&gt;创建完之后把 Token 记下来，后面要填到 GitHub Secrets 里。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 获取 Account ID&lt;a href=&quot;#22-获取-account-id&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Account ID 在 Dashboard 首页右侧栏的 Account Details 区域。我一开始没找到，后来发现直接在首页问 Ask AI 就行，它会告诉你在哪。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Dashboard 首页 - 用 Ask AI 查 Account ID&quot; loading=&quot;lazy&quot; width=&quot;2111&quot; height=&quot;1042&quot; src=&quot;/_astro/get-account-id.BZfdgi3K_Z2uR2Vl.webp&quot; /&gt;&lt;figcaption&gt;Dashboard 首页 - 用 Ask AI 查 Account ID&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;复制下来备用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 创建 D1 数据库&lt;a href=&quot;#23-创建-d1-数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;数据库用来存图床的文件元数据，比如文件名、大小、上传时间之类的。KV 和 D1 二选一，我选了 D1，免费额度比 KV 多不少。&lt;/p&gt;&lt;p&gt;进 Dashboard 左侧「存储和数据库」→「D1 SQL 数据库」，点「创建数据库」。名字必须填的 &lt;code&gt;img_d1&lt;/code&gt;，区域选了亚太地区，然后点创建。&lt;/p&gt;&lt;p&gt;创建完之后回到 D1 数据库的概述页面，这里能看到数据库 ID。&lt;strong&gt;点旁边的复制按钮把 ID 复制下来&lt;/strong&gt;，后面配置 GitHub Secrets 要用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;D1 概述页 - 红色箭头指向复制数据库 ID 的按钮&quot; loading=&quot;lazy&quot; width=&quot;2111&quot; height=&quot;1042&quot; src=&quot;/_astro/d1-copy-database-id.BZceWIah_Z1yXtlh.webp&quot; /&gt;&lt;figcaption&gt;D1 概述页 - 红色箭头指向复制数据库 ID 的按钮&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接下来去 D1 的「控制台」选项卡，把初始化 SQL 执行一下。这段 SQL 会建好几个表：&lt;code&gt;files&lt;/code&gt;（存文件信息）、&lt;code&gt;settings&lt;/code&gt;（存配置）、&lt;code&gt;index_operations&lt;/code&gt;（索引操作记录）之类的，还有索引和触发器。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;D1 控制台 - 执行 CREATE TABLE 成功，显示&amp;quot;此查询已成功执行&amp;quot;&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/d1-console-execute-sql.Bfqm4Jst_gVSgD.webp&quot; /&gt;&lt;figcaption&gt;D1 控制台 - 执行 CREATE TABLE 成功，显示&quot;此查询已成功执行&quot;&lt;/figcaption&gt;&lt;/figure&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;div&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;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IF&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NOT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EXISTS&lt;/span&gt;&lt;span&gt; files (&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;id &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PRIMARY KEY&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;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TEXT&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;&lt;/span&gt;&lt;span&gt;metadata &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NOT NULL&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;file_name &lt;/span&gt;&lt;span&gt;TEXT&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;file_type &lt;/span&gt;&lt;span&gt;TEXT&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;file_size &lt;/span&gt;&lt;span&gt;TEXT&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;upload_ip &lt;/span&gt;&lt;span&gt;TEXT&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;upload_address &lt;/span&gt;&lt;span&gt;TEXT&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;list_type &lt;/span&gt;&lt;span&gt;TEXT&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;timestamp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;INTEGER&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;label &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&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;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;directory &lt;/span&gt;&lt;span&gt;TEXT&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;&lt;/span&gt;&lt;span&gt;channel &lt;/span&gt;&lt;span&gt;TEXT&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;channel_name &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&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;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tg_file_id &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&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;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tg_chat_id &lt;/span&gt;&lt;span&gt;TEXT&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;/span&gt;&lt;/span&gt;&lt;span&gt;tg_bot_token &lt;/span&gt;&lt;span&gt;TEXT&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;&lt;/span&gt;&lt;span&gt;is_chunked &lt;/span&gt;&lt;span&gt;BOOLEAN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&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;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;tags &lt;/span&gt;&lt;span&gt;TEXT&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;&lt;/span&gt;&lt;span&gt;created_at &lt;/span&gt;&lt;span&gt;DATETIME&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP,&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;updated_at &lt;/span&gt;&lt;span&gt;DATETIME&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;span&gt; CURRENT_TIMESTAMP&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;/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;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;还有 &lt;code&gt;settings&lt;/code&gt;、&lt;code&gt;index_operations&lt;/code&gt;、&lt;code&gt;index_metadata&lt;/code&gt;、&lt;code&gt;other_data&lt;/code&gt; 几个表，以及一堆索引和触发器。完整的 SQL 在项目的 &lt;a href=&quot;https://github.com/MarSeventh/CloudFlare-ImgBed/blob/main/database/init.sql&quot; target=&quot;_blank&quot;&gt;database/init.sql&lt;/a&gt; 里。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;踩坑提醒：如果你之前已经建过表想重新来，先把 SQL 开头那几行 &lt;code&gt;DROP TABLE&lt;/code&gt; 的注释去掉，执行一遍清掉旧表，再跑建表语句。生产环境慎用这个操作。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.4 创建 R2 存储桶（可选）&lt;a href=&quot;#24-创建-r2-存储桶可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果需要使用 R2 存储渠道，进 Dashboard 左侧「存储和数据库」→「R2 对象存储」，点「创建存储桶」，记下存储桶名称。我暂时没用 R2，先用默认的渠道跑起来再说。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第三步：绑定 D1 数据库&lt;a href=&quot;#第三步绑定-d1-数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在配置 GitHub Secrets 之前，先把 D1 数据库绑定到 Worker 上。进 Dashboard → Workers 和 Pages → 找到你刚创建的 Worker（默认叫 &lt;code&gt;cloudflare-imgbed&lt;/code&gt;），点进去，选「绑定」标签页。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Worker 绑定页面 - 点右上角的「添加绑定」按钮&quot; loading=&quot;lazy&quot; width=&quot;2111&quot; height=&quot;1042&quot; src=&quot;/_astro/worker-bindings-page.BSBRfYev_lq7HS.webp&quot; /&gt;&lt;figcaption&gt;Worker 绑定页面 - 点右上角的「添加绑定」按钮&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点「添加绑定」，选 D1 数据库。变量名称填 &lt;code&gt;img_d1&lt;/code&gt;（跟代码里用的名字一致），D1 数据库选你之前创建的那个。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;添加 D1 绑定 - 变量名称填 img_d1，数据库选 img_d1&quot; loading=&quot;lazy&quot; width=&quot;923&quot; height=&quot;467&quot; src=&quot;/_astro/add-d1-binding-dialog.D2moFlg5_Z1Hlp6L.webp&quot; /&gt;&lt;figcaption&gt;添加 D1 绑定 - 变量名称填 img_d1，数据库选 img_d1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点「添加绑定」就搞定了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第四步：配置 GitHub Secrets&lt;a href=&quot;#第四步配置-github-secrets&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;回到 fork 的仓库，进 &lt;strong&gt;Settings → 机密和变量 → 操作&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;一开始仓库里什么都没有，是空的。&lt;/p&gt;&lt;p&gt;点「New repository secret」把需要的值一个个加上。Secrets 是加密存储的，Actions 日志里不会泄露。别用 Variables，public 仓库的话所有人都能看到你的配置。&lt;/p&gt;&lt;p&gt;如果需要配置部署保护规则（比如环境机密），也可以在 Settings → 环境里设置。&lt;/p&gt;&lt;p&gt;最终需要加的 Secrets 如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GitHub 仓库机密配置完成 - 三个必填项都加好了&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1037&quot; src=&quot;/_astro/github-secrets-configured.B_Toz9s2_1xwFbv.webp&quot; /&gt;&lt;figcaption&gt;GitHub 仓库机密配置完成 - 三个必填项都加好了&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Secret 名称&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;是否必填&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Cloudflare API Token&lt;/td&gt;&lt;td&gt;必填&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CLOUDFLARE_ACCOUNT_ID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Cloudflare Account ID&lt;/td&gt;&lt;td&gt;必填&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;D1_DATABASE_ID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;D1 数据库 ID&lt;/td&gt;&lt;td&gt;和 KV 二选一&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;KV_NAMESPACE_ID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;KV 命名空间 ID&lt;/td&gt;&lt;td&gt;和 D1 二选一&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;R2_BUCKET_NAME&lt;/code&gt;&lt;/td&gt;&lt;td&gt;R2 存储桶名称&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKER_NAME&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Worker 名称&lt;/td&gt;&lt;td&gt;可选，默认 &lt;code&gt;cloudflare-imgbed&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKER_VARS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;业务环境变量（JSON）&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;说实话大部分配置不用在这写。像存储渠道、审查策略什么的，部署完在管理面板里都能改。我一开始把什么都填了，后来发现根本没必要。&lt;code&gt;WORKER_VARS&lt;/code&gt; 只有当你需要配 Telegram Bot 这类特殊渠道的时候才用得上，而且格式要是 JSON：&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;TG_BOT_TOKEN&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;your-bot-token&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;TG_CHAT_ID&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;your-chat-id&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;/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;不过真要用 Telegram 渠道，我建议还是部署完在管理面板里配，比在这填 JSON 方便多了。&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;strong&gt;操作&lt;/strong&gt; 页面，左边选「Deploy to Cloudflare Workers」。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GitHub Actions - 选择 Deploy to Cloudflare Workers 工作流&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1037&quot; src=&quot;/_astro/github-actions-select-deploy.CunjLMPR_Z8vb71.webp&quot; /&gt;&lt;figcaption&gt;GitHub Actions - 选择 Deploy to Cloudflare Workers 工作流&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点「Run workflow」，选 main 分支，开始跑。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GitHub Actions - 部署进行中，deploy 任务正在执行&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1037&quot; src=&quot;/_astro/github-actions-deploy-running.Djme5M5l_Z1k9LyW.webp&quot; /&gt;&lt;figcaption&gt;GitHub Actions - 部署进行中，deploy 任务正在执行&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;部署完成后，可以通过 &lt;code&gt;https://&amp;lt;worker-name&amp;gt;.&amp;lt;account-subdomain&amp;gt;.workers.dev&lt;/code&gt; 访问。第一次跑可能会慢一点，耐心等一下。&lt;strong&gt;可能国内访问不了，可以直接看我的Woker优先IP的文章&lt;/strong&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;部署完绑定好之后，访问你的 Worker 地址，应该能看到图床界面了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;部署完成 - CloudFlare ImgBed 图床界面，支持拖拽上传&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1037&quot; src=&quot;/_astro/imgbed-final-result.GFZYOJjv_Z2bV973.webp&quot; /&gt;&lt;figcaption&gt;部署完成 - CloudFlare ImgBed 图床界面，支持拖拽上传&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;界面还挺好看的，支持拖拽上传、点击上传、Ctrl+V 粘贴上传，底部还有文件管理和统计。默认就能用，挺省心的。&lt;/p&gt;&lt;p&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;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;D1 初始化 SQL 要分段执行&lt;/strong&gt;：一次全贴进去可能会报错，我分了几次才跑成功。控制台会显示每条语句的执行结果，看到「此查询已成功执行」就说明没问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WORKER_VARS 不用急着配&lt;/strong&gt;：大部分业务设置在管理面板都能改，不用一开始就写死在 Secrets 里&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署前记得绑定 D1&lt;/strong&gt;：光配置 Secrets 不够，还得在 Cloudflare 这边把数据库绑到 Worker 上，不然部署完图床打开是白的&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;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 CloudFlare ImgBed 部署的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>网站每天多少人访问你知道吗？用 Vercel 零成本搭了一个 Umami 网站统计系统</title><link>https://www.9ll.uk/posts/deploy/deployumami/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deployumami/</guid><description>用 Vercel + Neon 免费部署 Umami 网站统计系统，从 Fork 项目到上线全流程记录，零成本搞定访客数据</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;网站每天多少人访问你知道吗？用 Vercel 零成本搭了一个 Umami 网站统计系统&lt;a href=&quot;#网站每天多少人访问你知道吗用-vercel-零成本搭了一个-umami-网站统计系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;搭了网站之后，我一直想看看每天到底有多少人来访问。&lt;/p&gt;&lt;p&gt;说实话，之前一直没搞统计，不是不想看数据，就是觉得 Google Analytics 太重了，配一堆东西看着就头大。后来我一想，有没有那种简单点的，能直接看到访客数、来源、热门页面就够了。&lt;/p&gt;&lt;p&gt;搜了一圈发现了 Umami，开源的网站统计工具，界面挺干净的。最关键的是——能直接部署到 Vercel 上，不用买服务器，零成本。&lt;/p&gt;&lt;p&gt;我一想，反正也不花钱，试试呗。&lt;/p&gt;&lt;p&gt;搭好之后用了几天，效果确实不错。先放几张图给你们看看：&lt;/p&gt;&lt;p&gt;这是 Umami 的概览页面，访客来自哪些国家一目了然，世界地图上直接能看到分布：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Umami 概览页面&quot; loading=&quot;lazy&quot; width=&quot;2274&quot; height=&quot;1055&quot; src=&quot;/_astro/01-umami%E6%A6%82%E8%A7%88.H1EewKi0_Z12DuFv.webp&quot; /&gt;&lt;figcaption&gt;Umami 概览页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;访客数、访问次数、浏览量、跳出率、平均访问时长，数据摆在那里：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Umami 实时数据&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;541&quot; src=&quot;/_astro/02-umami%E5%AE%9E%E6%97%B6%E6%95%B0%E6%8D%AE.CXVFBJn3_ZuGwrW.webp&quot; /&gt;&lt;figcaption&gt;Umami 实时数据&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;热门页面排行也很清楚，哪篇文章有人看、哪篇没人看，心里有数：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Umami 热门页面&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;626&quot; src=&quot;/_astro/03-umami%E7%83%AD%E9%97%A8%E9%A1%B5%E9%9D%A2.B2hj9AiP_csGsB.webp&quot; /&gt;&lt;figcaption&gt;Umami 热门页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;还有来源分析，从哪个搜索引擎来的、哪个域名引过来的，都有：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Umami 来源分析&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;642&quot; src=&quot;/_astro/04-umami%E6%9D%A5%E6%BA%90%E5%88%86%E6%9E%90.DaUMAaQg_Zm7dh6.webp&quot; /&gt;&lt;figcaption&gt;Umami 来源分析&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;看到这些数据之后，我才真正知道自己网站的流量情况。以前全靠猜，现在数据就摆在后台里。&lt;/p&gt;&lt;p&gt;下面说说我是怎么搭的。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;为什么选 Umami&lt;a href=&quot;#为什么选-umami&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;其实一开始我不想用 Neon 的，因为它的免费计划远不如 TiDB。TiDB 的免费额度很大，听起来很诱人。&lt;/p&gt;&lt;p&gt;但问题是——TiDB 是 MySQL 的，Umami 用的是 PostgreSQL，不太兼容。整了半天还是放弃了，一直构建失败给我整红了。&lt;/p&gt;&lt;p&gt;后来我一想，算了，换个思路吧。Umami 官方说支持 Vercel 一键部署，Neon 提供免费的 PostgreSQL，那就试试 Neon。&lt;/p&gt;&lt;p&gt;事实证明这个选择是对的。部署过程比我想象的简单很多，而且 Neon 的免费套餐对个人站点来说完全够用——0.5 GB 存储、100 个项目上限，足够了。&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;h3&gt;一、Fork 项目&lt;a href=&quot;#一fork-项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开 Umami 的 GitHub 项目，点右上角的”复刻”，把代码拷到自己账号下。&lt;/p&gt;&lt;p&gt;项目地址：&lt;code&gt;https://github.com/umami-software/umami&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;GitHub 复刻 Umami 项目&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1240&quot; src=&quot;/_astro/05-github%E5%A4%8D%E5%88%BB%E9%A1%B9%E7%9B%AE.C06kqh_E_ldzhi.webp&quot; /&gt;&lt;figcaption&gt;GitHub 复刻 Umami 项目&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;二、在 Vercel 导入项目&lt;a href=&quot;#二在-vercel-导入项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;登录 Vercel 控制台，左侧菜单点”项目”，然后右上角点”添加 New”→“项目”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Vercel 新建项目&quot; loading=&quot;lazy&quot; width=&quot;1153&quot; height=&quot;1115&quot; src=&quot;/_astro/06-vercel%E6%96%B0%E5%BB%BA%E9%A1%B9%E7%9B%AE.CsI1IFUL_Z1I79qL.webp&quot; /&gt;&lt;figcaption&gt;Vercel 新建项目&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在”导入 Git 仓库”下面找到刚复刻的 umami 项目，点”导入”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Vercel 导入 Git 仓库&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;878&quot; src=&quot;/_astro/07-vercel%E5%AF%BC%E5%85%A5%E4%BB%93%E5%BA%93.BVbbQ-Su_Z1Mhd2y.webp&quot; /&gt;&lt;figcaption&gt;Vercel 导入 Git 仓库&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;项目名称可以随便填，我直接用的 “umami”。其他保持默认就行，直接点”部署”。&lt;/p&gt;&lt;p&gt;这一步会部署失败，因为还没配数据库，不用管它。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;三、创建 Neon 数据库&lt;a href=&quot;#三创建-neon-数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;回到 Vercel 控制台，左侧菜单找到”存储”，点进去。然后点右上角的”创建 Database”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Vercel 部署设置&quot; loading=&quot;lazy&quot; width=&quot;2474&quot; height=&quot;1072&quot; src=&quot;/_astro/08-vercel%E9%83%A8%E7%BD%B2%E8%AE%BE%E7%BD%AE.BZbOTKMY_1pfABV.webp&quot; /&gt;&lt;figcaption&gt;Vercel 部署设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Vercel 存储页面&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;1186&quot; src=&quot;/_astro/09-vercel%E5%AD%98%E5%82%A8%E9%A1%B5%E9%9D%A2.DniQFrUO_1qIUHB.webp&quot; /&gt;&lt;figcaption&gt;Vercel 存储页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在弹出的窗口里选 Neon（无服务器 Postgres），然后点”继续”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;选择 Neon 数据库&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;1229&quot; src=&quot;/_astro/10-%E9%80%89%E6%8B%A9neon%E6%95%B0%E6%8D%AE%E5%BA%93.OmaYPpAi_27n6S2.webp&quot; /&gt;&lt;figcaption&gt;选择 Neon 数据库&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;区域选近一点的，我选了 Singapore（Southeast）。其他保持默认，往下拉点”继续”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Neon 区域选择&quot; loading=&quot;lazy&quot; width=&quot;2476&quot; height=&quot;783&quot; src=&quot;/_astro/11-neon%E5%8C%BA%E5%9F%9F%E9%80%89%E6%8B%A9.BmHAblkw_ZQ3oXx.webp&quot; /&gt;&lt;figcaption&gt;Neon 区域选择&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;数据库名字可以随便填，确认一下信息没问题就点安装。&lt;/p&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;数据库创建好之后，点”Connect to Project”，选择你刚才创建的 umami 项目，然后点”Connect Project”。&lt;/p&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;回到 Vercel 的”部署记录”页面，找到刚才失败的那条记录，点右侧三个点，选”重新部署”。&lt;/p&gt;&lt;p&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;2560&quot; height=&quot;766&quot; src=&quot;/_astro/13-%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95%E4%B8%8E%E5%9F%9F%E5%90%8D%E9%85%8D%E7%BD%AE.DLZ9isR3_Za6U8i.webp&quot; /&gt;&lt;figcaption&gt;部署记录——一堆红色错误&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;后来发现是数据库连接的问题，重新关联了一次项目之后就好了。如果你也遇到部署失败，先检查一下数据库有没有关联成功。&lt;/p&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;部署成功后，打开你的 Umami 地址（Vercel 给的那个 .vercel.app 域名），就能看到登录页面。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Umami 登录页面&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;774&quot; src=&quot;/_astro/12-umami%E7%99%BB%E5%BD%95%E9%A1%B5%E9%9D%A2.B81OiKRQ_Z1wcNfN.webp&quot; /&gt;&lt;figcaption&gt;Umami 登录页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;umami&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&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;如果你有自己的域名，可以在 Vercel 的”域名”页面绑定。我绑的是 &lt;code&gt;umami.9ll.uk&lt;/code&gt;，配置好之后状态显示”Valid 配置”就行了。（上面那张部署记录截图底部也能看到域名配置的部分。）&lt;/p&gt;&lt;p&gt;绑完域名之后，你的 Umami 就可以通过自己的域名访问了，看起来也更专业一点。&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;/p&gt;&lt;p&gt;这次搭 Umami 总体来说还行，虽然中间踩了不少坑——TiDB 不兼容、部署反复失败、数据库关联出问题——但折腾完之后用起来确实挺舒服的。数据一目了然，每天打开后台看看访客数、来源、热门页面，心里有数多了。&lt;/p&gt;&lt;p&gt;如果你也搭了网站但一直没关注数据，可以试试 Umami。零成本、部署简单、数据清晰，对个人站长来说够用了。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 Umami 网站统计的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Cloudflare Tunnel Docker部署教程</title><link>https://www.9ll.uk/posts/network/cloudflaretunnel/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/cloudflaretunnel/</guid><description>用Docker部署Cloudflare Tunnel，把内网服务暴露到公网</description><pubDate>Sat, 18 Jul 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;我家里有台 NAS，上面跑了不少服务。平时在家用局域网访问挺方便的，但出门在外就抓瞎了。&lt;/p&gt;&lt;p&gt;之前试过端口转发，但总觉得不太安全，而且公网 IP 还是动态的，每次都要重新连。后来了解到 Cloudflare Tunnel，发现这东西挺合适的——不用开端口，不用公网 IP，也不用折腾 DDNS，流量还走 Cloudflare 的网络加密。&lt;/p&gt;&lt;p&gt;整个过程其实不复杂，跟着 Cloudflare 的界面一步步来就行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一步：进入 Zero Trust 控制台&lt;a href=&quot;#第一步进入-zero-trust-控制台&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;登录 Cloudflare Dashboard，左侧菜单往下翻，找到”保护和连接”里的 &lt;strong&gt;Zero Trust&lt;/strong&gt;，点进去。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;进入Zero Trust&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;1187&quot; src=&quot;/_astro/step01-zero-trust-dashboard.Cgyr-Cef_Z1bhCwa.webp&quot; /&gt;&lt;figcaption&gt;进入Zero Trust&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;连接器页面&quot; loading=&quot;lazy&quot; width=&quot;2531&quot; height=&quot;1237&quot; src=&quot;/_astro/step02-connectors-page.CoZaSSM4_1Lkdz2.webp&quot; /&gt;&lt;figcaption&gt;连接器页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;隧道类型选 &lt;strong&gt;Cloudflared&lt;/strong&gt;，点”选择 Cloudflared”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;选择Cloudflared&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;659&quot; src=&quot;/_astro/step03-select-cloudflared.DN24zcLb_iRcA9.webp&quot; /&gt;&lt;figcaption&gt;选择Cloudflared&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接下来给隧道起个名字，起完之后会到配置页面。这里选 &lt;strong&gt;Docker&lt;/strong&gt;，会给你一段 docker run 命令，直接复制就行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;获取Docker命令&quot; loading=&quot;lazy&quot; width=&quot;1864&quot; height=&quot;954&quot; src=&quot;/_astro/step04-docker-run-command.B9zpit5f_1gIblK.webp&quot; /&gt;&lt;figcaption&gt;获取Docker命令&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;SSH 到你的服务器，把刚才复制的命令粘贴进去。第一次跑会拉取镜像，等一会儿就好。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;拉取Docker镜像&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;1028&quot; src=&quot;/_astro/step05-pull-docker-image.eo24t0-V_Z1REw3B.webp&quot; /&gt;&lt;figcaption&gt;拉取Docker镜像&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;镜像拉完、容器跑起来之后，回到 Cloudflare Dashboard，能看到连接器状态变成”已连接”。确认没问题后点”下一步”。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;连接器已连接&quot; loading=&quot;lazy&quot; width=&quot;2534&quot; height=&quot;1206&quot; src=&quot;/_astro/step06-connector-connected.DK_p8Ttd_RKkMY.webp&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;第四步：配置公网访问&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;code&gt;fnos&lt;/code&gt;，域名选你托管在 Cloudflare 的那个，完整主机名就是 &lt;code&gt;fnos.9ll.us&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;服务类型选 &lt;strong&gt;HTTP&lt;/strong&gt;，URL 填你本地服务的地址和端口。我填的是 &lt;code&gt;localhost:5244&lt;/code&gt;，这是 fnOS 的 Web 端口。&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;2133&quot; height=&quot;1013&quot; src=&quot;/_astro/step07-public-hostname.Ba-oimDU_1cbVHo.webp&quot; /&gt;&lt;figcaption&gt;配置公共主机名&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;到这里正常来说就结束了，通过 &lt;code&gt;fnos.9ll.us&lt;/code&gt; 就能访问你 NAS 上的服务了。&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;但是，如果你的 Docker 宿主机开了代理，而且 tunnel 流量也被代理了，那可能会连不上。&lt;/p&gt;&lt;p&gt;这种情况下需要做两件事：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;把本地地址改成局域网 IP（比如 &lt;code&gt;192.168.x.x&lt;/code&gt;），不要用 &lt;code&gt;localhost&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;代理的 Fake-IP-Filter 里加上这几个域名：&lt;/li&gt;
&lt;/ol&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;+.argotunnel.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;+.v2.argotunnel.com&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;api.cloudflare.com&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;+.cloudflare.com&lt;/code&gt; 看情况加不加都行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Fake-IP-Filter配置&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;602&quot; src=&quot;/_astro/step08-fake-ip-filter.C4dB7GNT_ckgtI.webp&quot; /&gt;&lt;figcaption&gt;Fake-IP-Filter配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这几个域名不加的话，Cloudflare Tunnel 的连接可能会被代理软件劫持或者解析到错误的地址，导致隧道连不上。加上之后让它走直连就正常了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;fnOS 用户的另一个选择&lt;a href=&quot;#fnos-用户的另一个选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你是飞牛 fnOS 用户，应用商店里有个 Cloudflare Tunnel 的 GUI 应用，操作比 Docker 简单不少，界面化配置挺方便的。&lt;/p&gt;&lt;p&gt;不过我试下来感觉没有 Docker 容器那么稳，可控性也差一些。而且这个应用如果连不上报错的话，去设置里把协议改一下——Docker 默认用的是 QUIC，应用默认是 HTTP/2，两个都试试看哪个能通。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;fnOS Tunnel应用设置&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;757&quot; src=&quot;/_astro/step09-fnos-tunnel-app.YCUvFIzR_v5KbP.webp&quot; /&gt;&lt;figcaption&gt;fnOS Tunnel应用设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我个人还是推荐 Docker 方式，毕竟出了问题排查起来更方便，日志也能直接看。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 Cloudflare Tunnel 的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>iStoreOS 安装 OpenClash</title><link>https://www.9ll.uk/posts/network/istoreosinstallopenclash/istoreosinstallopenclash/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/istoreosinstallopenclash/istoreosinstallopenclash/</guid><description>在 iStoreOS 上通过命令行安装 OpenClash 并配置代理的完整流程，包含依赖安装、ipk 部署和首次使用的详细步骤</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇写了怎么在 FNOS 上装 iStoreOS 虚拟机，装完之后总得干点啥吧。iStoreOS 本身就是 OpenWrt 的改版，拿来跑 OpenClash 再合适不过了。&lt;/p&gt;
&lt;p&gt;其实我之前一直用的是软路由方案，后来换了 NAS 就想着能不能把软路由也虚拟化了，省一台设备。装完 iStoreOS 虚拟机之后第一件事，就是把 OpenClash 搞上。&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;iStoreOS 开机之后，输入 &lt;code&gt;quickstart&lt;/code&gt;，然后选第一个回车。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;quickstart 查看 IP&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;1178&quot; src=&quot;/_astro/01-quickstart%E6%9F%A5%E7%9C%8BIP.Clp7HHc2_1PC5xE.webp&quot; /&gt;&lt;figcaption&gt;quickstart 查看 IP&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后就能看到后台管理地址了。我这边显示的是 &lt;code&gt;192.168.31.195&lt;/code&gt;，你的可能不一样，看实际显示的就行。&lt;/p&gt;&lt;p&gt;浏览器打开这个地址，就能进 Web 管理页面。&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;/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;设置 root 密码&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/02-%E8%AE%BE%E7%BD%AEroot%E5%AF%86%E7%A0%81.QCd6Wjur_fa3zi.webp&quot; /&gt;&lt;figcaption&gt;设置 root 密码&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;不改的话默认密码好像挺简单的，后面进终端要用 root 登录，还是改一下比较安心。&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;/p&gt;&lt;p&gt;进 &lt;strong&gt;服务 → 终端&lt;/strong&gt;（TTYD），用户名 &lt;code&gt;root&lt;/code&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;opkg&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;终端 opkg update&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/03-%E7%BB%88%E7%AB%AFopkg-update.B7IH3a-d_Z1APpsz.webp&quot; /&gt;&lt;figcaption&gt;终端 opkg update&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这一步可能会冒出一堆报错，类似 &lt;code&gt;Signature check failed&lt;/code&gt; 或者 &lt;code&gt;returned 8&lt;/code&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;opkg&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;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iptables&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnsmasq-full&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;ca-bundle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ipset&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ip-full&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iptables-mod-tproxy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iptables-mod-extra&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ruby&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ruby-yaml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kmod-tun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kmod-inet-diag&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;luci-compat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;luci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;luci-base&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;figure&gt;&lt;img alt=&quot;安装依赖包&quot; loading=&quot;lazy&quot; width=&quot;2200&quot; height=&quot;630&quot; src=&quot;/_astro/04-%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E5%8C%85.B6UmETGj_Z1xN3RX.webp&quot; /&gt;&lt;figcaption&gt;安装依赖包&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;装的时候会看到一堆输出，不用逐行看，只要最后没报致命错误就行。有些包可能会提示已经装过了，那说明 iStoreOS 自带了一部分，跳过就好。&lt;/p&gt;&lt;p&gt;整个依赖安装大概要等个一两分钟，看你的网络情况。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、下载并安装 OpenClash&lt;a href=&quot;#四下载并安装-openclash&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;依赖装好之后，就可以装 OpenClash 本体了。&lt;/p&gt;&lt;p&gt;去 GitHub 的 &lt;a href=&quot;https://github.com/vernesong/OpenClash/releases&quot; target=&quot;_blank&quot;&gt;OpenClash Releases&lt;/a&gt; 页面，找到最新版本，下载 &lt;code&gt;ipk&lt;/code&gt; 文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;下载 OpenClash&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;289&quot; src=&quot;/_astro/05-%E4%B8%8B%E8%BD%BDOpenClash.BIJ4vdCQ_1xbXsR.webp&quot; /&gt;&lt;figcaption&gt;下载 OpenClash&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下载的时候注意看一下文件名，别下错了。一般下载量最大的那个就是。&lt;/p&gt;&lt;p&gt;然后进 &lt;strong&gt;系统 → 软件包&lt;/strong&gt;，点「上传软件包」，把刚才下载的 ipk 传上去。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;上传软件包&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/06-%E4%B8%8A%E4%BC%A0%E8%BD%AF%E4%BB%B6%E5%8C%85.De285J_q_Zadgo9.webp&quot; /&gt;&lt;figcaption&gt;上传软件包&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&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;strong&gt;服务&lt;/strong&gt; 菜单下面就能看到 OpenClash 了。如果没看到，多刷新几次，或者等一会儿再试。&lt;/p&gt;&lt;p&gt;第一次进去可能会提示你下载内核，还会给你一个已经测速好的 CDN 列表。选个延迟低的点下载就行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Mihomo 管理页面&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/07-Mihomo%E7%AE%A1%E7%90%86%E9%A1%B5%E9%9D%A2.C_QckkYz_Z2vUm9l.webp&quot; /&gt;&lt;figcaption&gt;Mihomo 管理页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&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;ol&gt;
&lt;li&gt;&lt;code&gt;quickstart&lt;/code&gt; → 选第一个 → 拿到后台地址&lt;/li&gt;
&lt;li&gt;系统 → 管理权 → 改密码&lt;/li&gt;
&lt;li&gt;服务 → 终端 → &lt;code&gt;opkg update&lt;/code&gt; → &lt;code&gt;opkg install&lt;/code&gt; 装依赖&lt;/li&gt;
&lt;li&gt;GitHub 下载 OpenClash 的 ipk → 系统 → 软件包 → 上传安装&lt;/li&gt;
&lt;li&gt;刷新 → 服务 → OpenClash → 下载内核 → 导入订阅&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，折腾 iStoreOS 安装 OpenClash 的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>在 FNOS 上装 iStoreOS 虚拟机</title><link>https://www.9ll.uk/posts/network/fnosvmistoreos/fnos-istoreos/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/fnosvmistoreos/fnos-istoreos/</guid><description>通过 FNOS 运行 iStoreOS 虚拟机，涵盖镜像转换、QCOW2 替换和首次启动的完整流程</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;在 FNOS 上装 iStoreOS 虚拟机&lt;a href=&quot;#在-fnos-上装-istoreos-虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;前阵子一直在折腾 NAS，用的是 FNOS。用了一段时间感觉还行，但有些网络方面的功能想折腾一下，就想着在上面跑个 iStoreOS 的虚拟机。&lt;/p&gt;&lt;p&gt;iStoreOS 是基于 OpenWrt 的，软路由功能该有的都有，而且有应用商店，装插件方便。我之前在别的机器上装过，这次想在 FNOS 上跑一个。&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;先去 iStoreOS 官网下了个固件，x86_64 的版本。下载地址是 fw.koolcenter.com/iStoreOS/x86_64/，挑一个合适的版本就行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;01-下载iStoreOS固件&quot; loading=&quot;lazy&quot; width=&quot;2477&quot; height=&quot;1280&quot; src=&quot;/_astro/01-%E4%B8%8B%E8%BD%BDiStoreOS%E5%9B%BA%E4%BB%B6.C3bafWTi_Z22ziin.webp&quot; /&gt;&lt;figcaption&gt;01-下载iStoreOS固件&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后在 FNOS 里先把 OVS 和 SSH 开了。&lt;/p&gt;&lt;p&gt;OVS 在 iStoreOS 后台的网络设置里关掉。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;02-OVS设置&quot; loading=&quot;lazy&quot; width=&quot;1519&quot; height=&quot;801&quot; src=&quot;/_astro/02-OVS%E8%AE%BE%E7%BD%AE.a0PMgbhi_1NbuRe.webp&quot; /&gt;&lt;figcaption&gt;02-OVS设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;SSH 在 FNOS 的系统设置里开启。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;03-SSH设置&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;746&quot; src=&quot;/_astro/03-SSH%E8%AE%BE%E7%BD%AE.CeeQMS3D_IhkbK.webp&quot; /&gt;&lt;figcaption&gt;03-SSH设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;FNOS 的虚拟机管理界面挺直观的，新建一个虚拟机，填好名称，选 Linux 系统。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;04-新建虚拟机&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;801&quot; src=&quot;/_astro/04-%E6%96%B0%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA.mPsNIPNv_58GkP.webp&quot; /&gt;&lt;figcaption&gt;04-新建虚拟机&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;先随便上传一个 ISO 文件到文件管理，后面要用替换镜像的方式装 iStoreOS。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;05-上传ISO文件&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/05-%E4%B8%8A%E4%BC%A0ISO%E6%96%87%E4%BB%B6.4-oZjrxY_Z267EVC.webp&quot; /&gt;&lt;figcaption&gt;05-上传ISO文件&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;配置虚拟机的 CPU、内存、挂载这个 ISO。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;06-硬件配置&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;801&quot; src=&quot;/_astro/06-%E7%A1%AC%E4%BB%B6%E9%85%8D%E7%BD%AE.B2v1uGej_1zpHpk.webp&quot; /&gt;&lt;figcaption&gt;06-硬件配置&lt;/figcaption&gt;&lt;/figure&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;p&gt;存储空间我选了个 SSD，给 16G 其实就够了，富哥可以上 32G 甚至更大，看你自己。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;07-添加存储空间&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;801&quot; src=&quot;/_astro/07-%E6%B7%BB%E5%8A%A0%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4.DnbVtflr_Z1vwTxw.webp&quot; /&gt;&lt;figcaption&gt;07-添加存储空间&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;08-添加网卡&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;801&quot; src=&quot;/_astro/08-%E6%B7%BB%E5%8A%A0%E7%BD%91%E5%8D%A1._2uS3dL2_Z1rqe0t.webp&quot; /&gt;&lt;figcaption&gt;08-添加网卡&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;iStoreOS 官方给的是 .img 格式的镜像，但 FNOS 的虚拟机不认这个格式，它用的是 .qcow2。所以需要转换一下。&lt;/p&gt;&lt;p&gt;我用的工具是 StarWind V2V Converter，免费的，下载地址：
&lt;a href=&quot;https://www.starwindsoftware.com/tmplink/starwindconverter.exe&quot; target=&quot;_blank&quot;&gt;https://www.starwindsoftware.com/tmplink/starwindconverter.exe&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装 V2V。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;09-V2V安装&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;476&quot; src=&quot;/_astro/09-V2V%E5%AE%89%E8%A3%85.DrxbvjfT_27JNoY.webp&quot; /&gt;&lt;figcaption&gt;09-V2V安装&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;打开后选择 Local file，选自己下载的 iStoreOS .img 镜像（记得先解压）。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;10-V2V选择来源&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/10-V2V%E9%80%89%E6%8B%A9%E6%9D%A5%E6%BA%90.1Lsx7pyA_1xTASi.webp&quot; /&gt;&lt;figcaption&gt;10-V2V选择来源&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;11-V2V确认源镜像&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/11-V2V%E7%A1%AE%E8%AE%A4%E6%BA%90%E9%95%9C%E5%83%8F.sHds3ed8_FC2fh.webp&quot; /&gt;&lt;figcaption&gt;11-V2V确认源镜像&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;目标位置选本地文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;12-V2V选择目标位置&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/12-V2V%E9%80%89%E6%8B%A9%E7%9B%AE%E6%A0%87%E4%BD%8D%E7%BD%AE.csZijMAD_ZJBtsD.webp&quot; /&gt;&lt;figcaption&gt;12-V2V选择目标位置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;目标格式选 QCOW2。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;13-V2V选择目标格式&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/13-V2V%E9%80%89%E6%8B%A9%E7%9B%AE%E6%A0%87%E6%A0%BC%E5%BC%8F.DmrMCGEM_1Vlyjy.webp&quot; /&gt;&lt;figcaption&gt;13-V2V选择目标格式&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;版本选 Qcow2 version 3。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;14-V2V选择版本&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/14-V2V%E9%80%89%E6%8B%A9%E7%89%88%E6%9C%AC.DY1oNL10_uhcD9.webp&quot; /&gt;&lt;figcaption&gt;14-V2V选择版本&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;设置输出文件名，然后点 Convert。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;15-V2V开始转换&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/15-V2V%E5%BC%80%E5%A7%8B%E8%BD%AC%E6%8D%A2.BwRNXGpO_Z4ypIP.webp&quot; /&gt;&lt;figcaption&gt;15-V2V开始转换&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;转换完成。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;16-V2V转换完成&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;939&quot; src=&quot;/_astro/16-V2V%E8%BD%AC%E6%8D%A2%E5%AE%8C%E6%88%90.BotoIiL3_Z1T5jrd.webp&quot; /&gt;&lt;figcaption&gt;16-V2V转换完成&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我这边出来的文件名是 &lt;code&gt;istoreos-24.10.7-2026070313-x86-64-squashfs-combined.qcow2&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;这个步骤有点绕，我第一次搞的时候卡了一会儿。&lt;/p&gt;&lt;p&gt;FNOS 新建虚拟机会自动生成一个 .qcow2 文件，但我们要把这个文件替换成自己转换好的那个。&lt;/p&gt;&lt;p&gt;先到虚拟机详情里找到实际存储路径。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;17-虚拟机存储路径&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;801&quot; src=&quot;/_astro/17-%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84.C3uC_UnX_ZE4qKm.webp&quot; /&gt;&lt;figcaption&gt;17-虚拟机存储路径&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;用 SSH 连上 FNOS，找到这个路径下的文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;18-SSH文件管理&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;1030&quot; src=&quot;/_astro/18-SSH%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.CqoAJxMz_13lb6i.webp&quot; /&gt;&lt;figcaption&gt;18-SSH文件管理&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;操作步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;复制 FNOS 自动生成的那个 .qcow2 的文件名（一串 UUID 那种，比如 &lt;code&gt;b4cf05dd-...-q6m2.qcow2&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;删掉 FNOS 自动生成的文件&lt;/li&gt;
&lt;li&gt;把自己上传的镜像重命名为刚才复制的文件名&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;其实就是&lt;strong&gt;偷梁换柱&lt;/strong&gt;——让 FNOS 以为自己生成的文件还在，实际上已经被换成了 iStoreOS 的镜像。&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;替换完之后，回到虚拟机配置页面，把之前挂载的那个 ISO 镜像删掉（点叉号）。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;19-移除ISO镜像&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;1030&quot; src=&quot;/_astro/19-%E7%A7%BB%E9%99%A4ISO%E9%95%9C%E5%83%8F.C90qCjke_Rg6r9.webp&quot; /&gt;&lt;figcaption&gt;19-移除ISO镜像&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;20-确认移除&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;746&quot; src=&quot;/_astro/20-%E7%A1%AE%E8%AE%A4%E7%A7%BB%E9%99%A4.CArnMUcU_2shYRb.webp&quot; /&gt;&lt;figcaption&gt;20-确认移除&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后直接开机。&lt;/p&gt;&lt;p&gt;看到 &lt;code&gt;iStoreOS is ready! Please press Enter to activate this console.&lt;/code&gt; 这行提示，回车即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;21-启动成功&quot; loading=&quot;lazy&quot; width=&quot;2469&quot; height=&quot;1178&quot; src=&quot;/_astro/21-%E5%90%AF%E5%8A%A8%E6%88%90%E5%8A%9F.DS5xaI_s_ZGnlNw.webp&quot; /&gt;&lt;figcaption&gt;21-启动成功&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;说实话，在 FNOS 上装 iStoreOS 不算复杂，就是镜像转换和替换这个环节稍微绕一点。核心思路就是用 V2V 把 .img 转成 .qcow2，然后替换掉 FNOS 自动生成的那个文件。&lt;/p&gt;&lt;p&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;ol&gt;
&lt;li&gt;下载 iStoreOS 固件，FNOS 开启 OVS 和 SSH&lt;/li&gt;
&lt;li&gt;新建虚拟机，配好存储和网卡&lt;/li&gt;
&lt;li&gt;用 StarWind V2V 把 iStoreOS 的 .img 转成 .qcow2&lt;/li&gt;
&lt;li&gt;SSH 连 FNOS，找到虚拟机存储路径，把转换好的 .qcow2 上传&lt;/li&gt;
&lt;li&gt;复制 FNOS 自动生成的 .qcow2 文件名，删掉它，把上传的镜像改名替换&lt;/li&gt;
&lt;li&gt;回到虚拟机，开机，回车&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;写于 2026 年 7 月，在 FNOS 上折腾 iStoreOS 的记录&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>折腾博客的第一步：不用服务器搭建 Firefly 博客</title><link>https://www.9ll.uk/posts/deploy/deployfirefly/</link><guid isPermaLink="true">https://www.9ll.uk/posts/deploy/deployfirefly/</guid><description>不买服务器也能搭一个自己的博客，从 Fork 仓库到博客上线再到日常写文章发布，每一步都写得很细</description><pubDate>Wed, 15 Jul 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;/p&gt;
&lt;p&gt;甚至只是把文章显示出来，都要折腾半天。&lt;/p&gt;
&lt;p&gt;其实现在很多博客已经不需要服务器了。Astro 这类静态博客框架，写完文章后直接生成网页文件，丢到 Vercel、Cloudflare Pages 这类平台上就能跑。不用管服务器，不用装数据库，免费额度对个人博客也够用。&lt;/p&gt;
&lt;p&gt;我选择 Firefly 的原因很简单：它基于 Astro，速度快，而且默认设计已经比较完整。不需要自己从零写主题，稍微改改配置，就能变成一个属于自己的博客。&lt;/p&gt;
&lt;p&gt;今天就记录一下我自己部署 Firefly 博客主题时整理的一套流程。Firefly 是一个基于 Astro 的博客主题，支持暗色模式、评论系统、全文搜索这些功能，样式也挺好看。下面以 Vercel 为例，从零开始讲怎么把它跑起来。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Firefly 博客首页示意&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/cover.Bn35nFNV_Z13Oup9.webp&quot; /&gt;&lt;figcaption&gt;Firefly 博客首页示意&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、Fork 仓库&lt;a href=&quot;#一fork-仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;打开 Firefly 的 GitHub 仓库：&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;CuteLeaf/Firefly&lt;/a&gt;&lt;/p&gt;&lt;p&gt;页面右上角有个 &lt;strong&gt;Fork&lt;/strong&gt; 按钮，点一下。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Fork&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/fork.CMx8xhYq_1okvB0.webp&quot; /&gt;&lt;figcaption&gt;Fork&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;弹出的页面里 &lt;strong&gt;Repository name&lt;/strong&gt; 可以改成你喜欢的名字，比如 &lt;code&gt;my-blog&lt;/code&gt;，然后点 &lt;strong&gt;Create fork&lt;/strong&gt;。等几秒钟仓库就到你账号下了。浏览器地址栏变成 &lt;code&gt;https://github.com/你的用户名/my-blog&lt;/code&gt; 就说明成功了。&lt;/p&gt;&lt;p&gt;Fork 比下载压缩包好的地方在于：后面作者更新了代码，你的仓库页面上会出现 &lt;strong&gt;Sync fork&lt;/strong&gt; 按钮，点一下就能同步最新版本。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、注册 Vercel 并导入项目&lt;a href=&quot;#二注册-vercel-并导入项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;打开 &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot;&gt;vercel.com&lt;/a&gt;，点 &lt;strong&gt;Sign Up&lt;/strong&gt;，选 &lt;strong&gt;Continue with GitHub&lt;/strong&gt;，用 GitHub 账号登录。&lt;/p&gt;&lt;p&gt;登录后进入 Dashboard，右上角点 &lt;strong&gt;Add New…&lt;/strong&gt; → &lt;strong&gt;Project&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;Vercel 会列出你 GitHub 账号下所有的仓库。找到刚才 Fork 的那个，点 &lt;strong&gt;Import&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;如果列表里没看到，点页面上的 &lt;strong&gt;Adjust GitHub App Permissions&lt;/strong&gt;，授权 Vercel 访问那个仓库，回来刷新就有了。&lt;/p&gt;&lt;p&gt;导入之后进入配置页面，Vercel 会自动识别 Astro 框架。确认这几个参数：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build Command&lt;/strong&gt;: &lt;code&gt;pnpm build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output Directory&lt;/strong&gt;: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install Command&lt;/strong&gt;: &lt;code&gt;pnpm install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一般 Vercel 会自动填好，检查一下没问题就点 &lt;strong&gt;Deploy&lt;/strong&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;点完 Deploy，Vercel 开始构建。页面上会显示四个阶段：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cloning&lt;/strong&gt; — 拉代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installing&lt;/strong&gt; — 安装依赖包&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building&lt;/strong&gt; — 编译。这一步最慢，要处理图片、生成搜索索引，大概一两分钟&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finalizing&lt;/strong&gt; — 收尾&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;构建成功后页面会跳转，显示 &lt;strong&gt;Congratulations&lt;/strong&gt;，上面有你的博客地址，格式大概是 &lt;code&gt;https://my-blog-xxxxx.vercel.app&lt;/code&gt;。点开就能看到博客了。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2482&quot; height=&quot;1237&quot; src=&quot;/_astro/vercel.DSJFLX7Z_1kgyOx.webp&quot; /&gt;&lt;/p&gt;&lt;p&gt;如果构建失败了，点 &lt;strong&gt;Building&lt;/strong&gt; 旁边的 &lt;strong&gt;View logs&lt;/strong&gt; 看报错。最常见的是 Node.js 版本太低——Firefly 要求 22 以上。去项目的 &lt;strong&gt;Settings → General → Node.js Version&lt;/strong&gt;，改成 &lt;code&gt;22.x&lt;/code&gt;，保存后回到 &lt;strong&gt;Deployments&lt;/strong&gt; 点 &lt;strong&gt;Redeploy&lt;/strong&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;code&gt;my-blog-xxxxx.vercel.app&lt;/code&gt; 能用，但你多半想用自己的域名。&lt;/p&gt;&lt;p&gt;在项目的 &lt;strong&gt;Settings → Domains&lt;/strong&gt;，输入你的域名（比如 &lt;code&gt;blog.example.com&lt;/code&gt;），点 &lt;strong&gt;Add&lt;/strong&gt;。Vercel 会根据你的域名类型提示对应 DNS 记录，按照页面提示添加即可。&lt;/p&gt;&lt;p&gt;域名在哪里买的就去哪里加。阿里云搜「云解析 DNS」，腾讯云搜「DNSPod」，Cloudflare 在域名的 DNS 设置页。&lt;/p&gt;&lt;p&gt;加完回到 Vercel 等一两分钟，点 &lt;strong&gt;Refresh&lt;/strong&gt;。验证通过后 Vercel 会自动申请 HTTPS 证书。&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;/p&gt;&lt;p&gt;这些在 &lt;code&gt;src/config/siteConfig.ts&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;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;siteConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SiteConfig&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;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&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;subtitle&lt;/span&gt;&lt;span&gt;:&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;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;site_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://你的域名&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;/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;1405&quot; height=&quot;1044&quot; src=&quot;/_astro/vscode.C2eTSRrM_Z7WdCh.webp&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;site_url&lt;/code&gt; 一定要改成你实际的域名，不然 sitemap 和 RSS 生成的地址会是错的。&lt;/p&gt;&lt;p&gt;其他配置文件都在 &lt;code&gt;src/config/&lt;/code&gt; 目录下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;profileConfig.ts&lt;/code&gt; — 头像、简介、社交链接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;navBarConfig.ts&lt;/code&gt; — 顶部导航栏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidebarConfig.ts&lt;/code&gt; — 侧边栏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentConfig.ts&lt;/code&gt; — 评论系统（支持 Twikoo、Waline、Giscus，这个之后我有详细的搭建，也是vercel或者cf workers）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;具体怎么改看 &lt;a href=&quot;https://docs-firefly.cuteleaf.cn/zh/guide/getting-started.html&quot; target=&quot;_blank&quot;&gt;Firefly 官方文档&lt;/a&gt;，写得比较全。&lt;/p&gt;&lt;p&gt;改完怎么生效？往下看。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、写文章，push 就发布&lt;a href=&quot;#六写文章push-就发布&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;方式一：直接在 GitHub 网页上写（不需要装任何东西）&lt;a href=&quot;#方式一直接在-github-网页上写不需要装任何东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;所有操作都在浏览器里完成：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开你的 GitHub 仓库，进入 &lt;code&gt;src/content/posts/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;点 &lt;strong&gt;Add file → Create new file&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文件名填 &lt;code&gt;我的第一篇文章/index.md&lt;/code&gt;（斜杠前面是文件夹名，GitHub 会自动创建）&lt;/li&gt;
&lt;li&gt;写内容：&lt;/li&gt;
&lt;/ol&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;title&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;published&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2026-07-15&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;description&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;tags&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;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;category&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;/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;正文内容。支持 Markdown 语法。&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;ol&gt;
&lt;li&gt;页面底部填个提交信息，点 &lt;strong&gt;Commit changes&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;提交之后回到 Vercel Dashboard，它已经开始自动构建了。等一两分钟，新文章就上线了。&lt;/p&gt;&lt;p&gt;上传配图的话，在同一个文件夹里点 &lt;strong&gt;Add file → Upload files&lt;/strong&gt;，把图片拖进去。在文章里用 &lt;code&gt;![描述](./图片名.png)&lt;/code&gt; 引用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方式二：本地编辑，push 到 GitHub（推荐）&lt;a href=&quot;#方式二本地编辑push-到-github推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;经常写文章的话建议装本地环境，用自己顺手的编辑器写。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;装环境（一次性）：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;装 &lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt; 22.x 版本&lt;/li&gt;
&lt;li&gt;打开终端（Windows 搜 PowerShell，Mac 搜终端），运行 &lt;code&gt;npm install -g pnpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;装 &lt;a href=&quot;https://git-scm.com/&quot; target=&quot;_blank&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;终端里运行 &lt;code&gt;git clone https://github.com/你的用户名/my-blog.git&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;日常流程：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下新建文件夹，写 &lt;code&gt;index.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;想预览效果就跑 &lt;code&gt;pnpm dev&lt;/code&gt;，浏览器打开 &lt;code&gt;http://localhost:4321&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;写好之后：&lt;/li&gt;
&lt;/ol&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;add&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;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&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;3&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;Push 上去，Vercel 自动构建，一两分钟后新文章上线。不需要登录 Vercel，不需要手动触发任何东西。&lt;/p&gt;&lt;p&gt;用 VS Code 的话更方便，左侧栏有 Git 按钮，点一下就能提交推送。&lt;/p&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;你 push 代码到 GitHub，Vercel 怎么知道的？&lt;/p&gt;&lt;p&gt;导入仓库的时候，Vercel 会在你的 GitHub 仓库里装一个 Webhook。每次你 push 代码到主分支，GitHub 通知 Vercel，Vercel 自动拉代码、构建、部署。你什么都不用做。&lt;/p&gt;&lt;p&gt;还有个有用的功能：新建分支 push 上去的话，Vercel 会给这个分支生成一个预览地址（Preview Deployment），主分支不受影响。不确定改动效果的时候，先在分支上试试。&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;/p&gt;&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下写文章&lt;/li&gt;
&lt;li&gt;Push 到 GitHub（或者在 GitHub 网页上直接提交）&lt;/li&gt;
&lt;li&gt;Vercel 自动构建，等一两分钟&lt;/li&gt;
&lt;li&gt;新文章上线&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;买服务器、配 Nginx、搞 HTTPS 这些全不用管。写完推上去就好了。&lt;/p&gt;&lt;p&gt;后面&lt;strong&gt;我还会继续记录 Firefly 的一些配置，比如评论系统、Umami 网站统计、自定义主题修改等&lt;/strong&gt;。如果你也喜欢折腾自己的小网站，可以一起交流。&lt;/p&gt;&lt;p&gt;有不懂的问题&lt;strong&gt;直接在评论区问&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>CloudMail 一个基于Workers无限收发邮箱的开源项目</title><link>https://www.9ll.uk/posts/network/cloudmail/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/cloudmail/</guid><description>只需要一个域名，就可以创建多个不同的邮箱，类似各大邮箱平台，本项目可部署到 Cloudflare Workers ，个人0服务器成本，搭建自己的邮箱服务</description><pubDate>Mon, 13 Jul 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;只需要一个域名，就可以创建无限个的邮箱地址，类似各大邮箱平台的体验。本项目可部署到 Cloudflare Workers，个人 &lt;strong&gt;0 服务器成本&lt;/strong&gt;，搭建属于自己的邮箱服务。&lt;/p&gt;&lt;p&gt;当然，你也能用它来&lt;strong&gt;管理不同平台的账号邮箱&lt;/strong&gt;，把注册邮箱和私人邮箱分开，更加安全，可以&lt;strong&gt;完全隐藏自己的真实邮箱&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;前提条件：&lt;/strong&gt; 你的域名必须已托管至 Cloudflare（即 NS 服务器指向 Cloudflare）。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;（昨天还想着自己用 WPF 做一个调用 Resend API 的项目呢…今天就发现了更好的开源方案）&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一部分：部署 CloudMail 收件服务&lt;a href=&quot;#第一部分部署-cloudmail-收件服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整体流程：&lt;strong&gt;Fork 仓库 → 创建 Worker → 配置环境变量 → 创建存储资源并绑定 → 设置域名邮件路由 → 初始化数据库 → 注册管理员&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. Fork 仓库并创建 Worker&lt;a href=&quot;#1-fork-仓库并创建-worker&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先 Fork 仓库：&lt;a href=&quot;https://github.com/hy4962/cloud-mail&quot; target=&quot;_blank&quot;&gt;cloud-mail&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后在 Cloudflare Dashboard 中创建 Worker，选择&lt;strong&gt;从 GitHub 导入&lt;/strong&gt;。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;点开 &lt;strong&gt;高级设置&lt;/strong&gt;，将路径设置为 &lt;code&gt;/mail-worker&lt;/code&gt;，这一步不要漏掉。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;从Github导入Worker&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;799&quot; src=&quot;/_astro/CreateWorker.3sj0We6__1aWc4n.webp&quot; /&gt;&lt;figcaption&gt;从Github导入Worker&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 配置环境变量&lt;a href=&quot;#2-配置环境变量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Worker 的&lt;strong&gt;设置 → 变量和机密&lt;/strong&gt;中，添加以下环境变量：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量名&lt;/th&gt;&lt;th&gt;必需&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;邮箱域名。多域名用 JSON 数组格式，例如 &lt;code&gt;[&quot;example.com&quot;,&quot;example2.com&quot;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;管理员邮箱地址，例如 &lt;code&gt;admin@example.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;jwt_secret&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;JWT 密钥，随便输入一串字符串即可，&lt;strong&gt;不要包含特殊字符&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;建议：&lt;/strong&gt; 如果你还没有绑定自定义域名到 Worker，推荐先绑定再配置环境变量。绑定域名的方式见优选 IP 文章。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;环境变量配置&quot; loading=&quot;lazy&quot; width=&quot;1979&quot; height=&quot;1209&quot; src=&quot;/_astro/string.mI5-sGBT_1B5Vjl.webp&quot; /&gt;&lt;figcaption&gt;环境变量配置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 创建存储资源（D1 + KV + R2）&lt;a href=&quot;#3-创建存储资源d1--kv--r2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CloudMail 需要三种存储资源，分别用于数据库、缓存和附件存储：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;资源类型&lt;/th&gt;&lt;th&gt;推荐命名&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;D1 数据库&lt;/td&gt;&lt;td&gt;&lt;code&gt;Cloud-mail-DB&lt;/code&gt;&lt;/td&gt;&lt;td&gt;存储邮件数据&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;KV 存储&lt;/td&gt;&lt;td&gt;&lt;code&gt;Cloud-mail-KV&lt;/code&gt;&lt;/td&gt;&lt;td&gt;缓存与配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;R2 存储桶&lt;/td&gt;&lt;td&gt;&lt;code&gt;Cloud-mail-R2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;邮件附件&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;按推荐名称创建即可，当然你也可以用自己的命名。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;创建D1数据库&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/CreateD1db.Dr8WTfK8_Z14DKjb.webp&quot; /&gt;&lt;figcaption&gt;创建D1数据库&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;创建KV存储&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/CreateKV.Cq-_KRjW_Z2dUUS7.webp&quot; /&gt;&lt;figcaption&gt;创建KV存储&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;创建R2存储桶&quot; loading=&quot;lazy&quot; width=&quot;2531&quot; height=&quot;1237&quot; src=&quot;/_astro/CreateR2.DULTy03f_Z1Yn60Q.webp&quot; /&gt;&lt;figcaption&gt;创建R2存储桶&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;创建完成后，回到 Worker 的&lt;strong&gt;设置 → 绑定&lt;/strong&gt;页面，将三个资源全部绑定上去：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;绑定的时候变量名必须严格为&lt;/strong&gt; &lt;code&gt;db&lt;/code&gt;、&lt;code&gt;kv&lt;/code&gt;、&lt;code&gt;r2&lt;/code&gt;，否则 Worker 无法正确读取。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;绑定KV和DB变量&quot; loading=&quot;lazy&quot; width=&quot;1283&quot; height=&quot;870&quot; src=&quot;/_astro/KVDB.d1DzXNm-_Z2cDuaK.webp&quot; /&gt;&lt;figcaption&gt;绑定KV和DB变量&lt;/figcaption&gt;&lt;/figure&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;1979&quot; height=&quot;1209&quot; src=&quot;/_astro/Binding.BIikSpcY_ZQtJBX.webp&quot; /&gt;&lt;figcaption&gt;绑定设置详情&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 配置域名邮件路由&lt;a href=&quot;#4-配置域名邮件路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入 Cloudflare 的 &lt;strong&gt;电子邮件 → 电子邮件路由&lt;/strong&gt; 页面，将收到的邮件转发到刚才创建的 Worker 项目。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;如果你的域名刚托管过来，可能需要先点击启用电子邮件路由，Cloudflare 会自动添加所需的 MX 记录。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;域名邮件路由设置&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/Form.DbemHelX_Z2gkBjE.webp&quot; /&gt;&lt;figcaption&gt;域名邮件路由设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 初始化数据库并注册管理员&lt;a href=&quot;#5-初始化数据库并注册管理员&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;/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;https://你的worker域名/api/init/你的jwt_secret&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;success&lt;/strong&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;https://你的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;在页面上 &lt;strong&gt;注册管理员账号&lt;/strong&gt;。管理员账号就是你在步骤 2 中设置的 &lt;code&gt;admin&lt;/code&gt; 环境变量值。&lt;/p&gt;&lt;p&gt;到这一步，CloudMail 的收件功能就部署完成了 🎉&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;管理员登录界面&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/adminlogin.BMWqzpkS_1U7LLS.webp&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;h2&gt;第二部分：配置 Resend 发件服务&lt;a href=&quot;#第二部分配置-resend-发件服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Cloudflare Workers 本身不支持发邮件（25 端口被封禁），所以我们需要借助第三方发件服务。&lt;strong&gt;Resend&lt;/strong&gt; 提供了免费额度（每月 3000 封），对个人使用来说足够了。&lt;/p&gt;&lt;p&gt;整体流程：&lt;strong&gt;注册 Resend → 添加域名并验证 DNS → 创建 API Key → 配置 Webhook 回调 → 填入 Token&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 注册 Resend 并添加域名&lt;a href=&quot;#1-注册-resend-并添加域名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;前往 &lt;a href=&quot;https://resend.com/login&quot; target=&quot;_blank&quot;&gt;Resend 官网&lt;/a&gt; 注册账号，然后在控制台中添加你的域名。&lt;/p&gt;&lt;p&gt;添加后，Resend 会提供几条 DNS 记录（SPF、DKIM 等），你需要到 Cloudflare 中添加这些记录来完成域名验证。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Resend添加域名&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/resendadd.alHxODCY_ZIvDmH.webp&quot; /&gt;&lt;figcaption&gt;Resend添加域名&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 创建 API Key&lt;a href=&quot;#2-创建-api-key&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Resend 控制台的 &lt;strong&gt;API Keys&lt;/strong&gt; 页面创建一个新的 Key，复制保存好，后面要用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;创建Resend API Key&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/resendapi.D0Yd7dOa_Z2tzUrF.webp&quot; /&gt;&lt;figcaption&gt;创建Resend API Key&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 配置 Webhook 回调&lt;a href=&quot;#3-配置-webhook-回调&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Resend 的 &lt;strong&gt;Webhooks&lt;/strong&gt; 页面，添加一个新的 Webhook，用于接收邮件发送状态的回调通知：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Endpoint URL&lt;/strong&gt; 填写：&lt;code&gt;https://你的worker域名/api/webhooks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events&lt;/strong&gt; 权限选择如下图所示：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;添加Webhook&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/resendaddweb.CeTgHDpD_Z23iIwz.webp&quot; /&gt;&lt;figcaption&gt;添加Webhook&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Webhook权限设置&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;557&quot; src=&quot;/_astro/resendweb.pPyIKOTj_GViLC.webp&quot; /&gt;&lt;figcaption&gt;Webhook权限设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 填入 Resend Token 到 CloudMail&lt;a href=&quot;#4-填入-resend-token-到-cloudmail&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;回到 CloudMail 的管理员后台，在设置页面中填入刚才复制的 Resend API Key：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;填入Resend Token&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/addtoken.DCc9DT76_ZvRDlj.webp&quot; /&gt;&lt;figcaption&gt;填入Resend Token&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;h2&gt;结语&lt;a href=&quot;#结语&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;至此，CloudMail 已经完成全部部署。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;收邮件由 Cloudflare Email Routing + Workers 负责。&lt;/li&gt;
&lt;li&gt;发邮件由 Resend 提供 API 支持。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;整个方案几乎不需要服务器，只需要一个托管到 Cloudflare 的域名，就能拥有自己的邮箱系统。&lt;/p&gt;&lt;p&gt;另外，CloudMail 后台还支持将收到的邮件自动转发到自己的真实邮箱，即使不经常登录后台，也不会错过任何新邮件。&lt;/p&gt;&lt;p&gt;过程中遇到问题可以&lt;strong&gt;直接在评论区留言&lt;/strong&gt;，看到都会回复的&lt;/p&gt;&lt;p&gt;文章是&lt;strong&gt;摆烂技术站&lt;/strong&gt;原创，需要转载等用途请联系&lt;strong&gt;&lt;a href=&quot;#&quot;&gt;WeChatOfficialAccount@9ll.uk&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Cloudflare+Resend域名邮箱</title><link>https://www.9ll.uk/posts/network/cloudflareemailrouting/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/cloudflareemailrouting/</guid><description>域名托管Cloudflare实现无限收邮箱+Resend发邮件</description><pubDate>Sun, 12 Jul 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;/p&gt;&lt;p&gt;本篇文章为此诞生&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;在Cloudflare开启电子路由（收邮件）&lt;a href=&quot;#在cloudflare开启电子路由收邮件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1.先进去自己的控制台，点击电子邮件路由，接入自己的域名&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;routing&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/routing.CT9FooRq_ZnlJc5.webp&quot; /&gt;&lt;figcaption&gt;routing&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2.点击设置，然后点击锁定，貌似点了锁定就好像会自己解析下面的DNS记录？反正没自动解析就自己动手一下吧&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;lock&quot; loading=&quot;lazy&quot; width=&quot;2531&quot; height=&quot;1237&quot; src=&quot;/_astro/lock.C99PIu_I_OsVJN.webp&quot; /&gt;&lt;figcaption&gt;lock&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3.然后去目标地址，增加一下自己真正的邮箱，然后点击添加，我记得会发一封验证邮件，自己去验证一下就好啦&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;添加目标邮箱&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/addemail.DJ5W115K_Z2iXAP4.webp&quot; /&gt;&lt;figcaption&gt;添加目标邮箱&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4.之后就是去路由规则，点击编辑，操作&lt;strong&gt;选择发送到电子邮件&lt;/strong&gt;，目标&lt;strong&gt;填写自己的邮箱&lt;/strong&gt;，点击&lt;strong&gt;保存&lt;/strong&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/emailopt1.mf_m35qH_1V8fzL.webp&quot; /&gt;&lt;figcaption&gt;路由规则编辑&lt;/figcaption&gt;&lt;/figure&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;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/emailopt2.xlgeYZ_5_Z27oBAP.webp&quot; /&gt;&lt;figcaption&gt;选择发送到电子邮件&lt;/figcaption&gt;&lt;/figure&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;1664&quot; height=&quot;208&quot; src=&quot;/_astro/emailopt3.CT6xSFq4_ZfcIHM.webp&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;配置Resend（发送邮件）&lt;a href=&quot;#配置resend发送邮件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1.注册好&lt;a href=&quot;https://resend.com/&quot; target=&quot;_blank&quot;&gt;Resend&lt;/a&gt;后，来到&lt;a href=&quot;https://resend.com/domains&quot; target=&quot;_blank&quot;&gt;Domains · Resend&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Resend添加域名&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/resendadd.4g4lAdcM_Z2klpqT.webp&quot; /&gt;&lt;figcaption&gt;Resend添加域名&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2.然后按信息配置好DNS记录即可(没图)，因为这玩意免费计划只能添加一个域名，懒得删了再弄了，反正也没有难度&lt;/p&gt;&lt;p&gt;3.之后是用Resend发邮件即可(…)&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;Resend只能添加一个域名挺伤的，其实还有一个专门做了一套可以运行在workers的开源项目，这两天我部署一个玩玩&lt;/p&gt;&lt;p&gt;Resend特么的貌似还不能直接在控制台发送邮件，只有一个不好用的广播，但是官方提供了非常详细的Api文档，这几天有时间我写一个客户端开源一下？&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Cloudflare Workers优选IP</title><link>https://www.9ll.uk/posts/network/cloudflareoptimalip/</link><guid isPermaLink="true">https://www.9ll.uk/posts/network/cloudflareoptimalip/</guid><description>CloudFlare优选IP</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&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;用过 Cloudflare 的人应该都有感觉：国内访问 Cloudflare 托管的网站，有时候慢得离谱。明明是全球最大的 CDN 厂商之一，怎么体验还不如一些小厂？&lt;/p&gt;&lt;p&gt;原因出在路由上。&lt;/p&gt;&lt;p&gt;Cloudflare 用的是 anycast 技术——同一个 IP 地址在全球很多地方都有节点，你的请求会被路由到”最近”的那个。问题是这个”最近”是按网络拓扑算的，不是按地理距离。国内三大运营商到 Cloudflare 节点的线路经常绕路，比如电信用户可能被送到美国圣何塞的节点，明明直线距离不到两千公里的事，数据包绕了半个地球才到。&lt;/p&gt;&lt;p&gt;优选IP就是找那些对国内线路”更友好”的 Cloudflare 节点。这些节点可能物理位置不在国内（Cloudflare 在大陆没有免费节点），但经过的网络路径更短、中间跳数更少、延迟更低。&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;p&gt;看你的运营商和地区，差别很大：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;电信用户&lt;/strong&gt;：改善通常最明显。因为电信到 Cloudflare 默认线路特别绕，优选一下可能从 300ms+ 降到 100ms 左右&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;至于下载速度，优选IP能让 Cloudflare 托管的静态资源（图片、CSS、JS）加载更快。但对于 Workers 的计算性能，优选IP帮不上忙——它只优化你到 Cloudflare 这段路，不改变 Cloudflare 内部处理请求的速度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;网站打开更快了，下载更快了，但 Worker 跑代码的速度不变。&lt;/strong&gt;&lt;/p&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;搞优选IP有两种路子，复杂程度不同：&lt;/p&gt;






















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方式&lt;/th&gt;&lt;th&gt;难度&lt;/th&gt;&lt;th&gt;稳定性&lt;/th&gt;&lt;th&gt;适合谁&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CNAME 优选域名&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;td&gt;较高（别人在维护）&lt;/td&gt;&lt;td&gt;大多数人&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A 记录直连 IP&lt;/td&gt;&lt;td&gt;高&lt;/td&gt;&lt;td&gt;低（IP 会过期）&lt;/td&gt;&lt;td&gt;想折腾的人&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;CNAME 方式&lt;/strong&gt;就是你把域名指向一个别人已经配好的优选域名（比如 &lt;code&gt;vip.090227.xyz&lt;/code&gt;），这个域名背后对应的是维护者筛出来的高质量 Cloudflare IP。你不用自己找 IP，改一条 DNS 记录就完事了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A 记录方式&lt;/strong&gt;是你自己去测速、自己找 IP、自己填到 DNS 里。更灵活，但维护成本高——好 IP 今天能用不代表明天还能用。&lt;/p&gt;&lt;p&gt;下面两种都讲。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;方式一：CNAME 优选域名（推荐大多数人）&lt;a href=&quot;#方式一cname-优选域名推荐大多数人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;域名必须在 Cloudflare 上托管。就是你的域名的 nameserver 指向 Cloudflare，不是说域名从 Cloudflare 买的。在阿里云、腾讯云买的域名，只要把 DNS 服务器改成 Cloudflare 提供的那两个地址就行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第一步：给 Workers 添加路由&lt;a href=&quot;#第一步给-workers-添加路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入 Cloudflare Dashboard → Workers 和 Pages → 你的项目 → 设置 → 触发器 → 添加路由。&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;9ll.uk/*&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;*.9ll.uk/*&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;p&gt;注意一个坑：&lt;strong&gt;这个域名必须已经添加到你的 Cloudflare 账号里&lt;/strong&gt;，就是 Dashboard 左侧”网站”列表里要有这个域名。没添加的话路由不会生效。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;添加路由|80&quot; loading=&quot;lazy&quot; width=&quot;2550&quot; height=&quot;1233&quot; src=&quot;/_astro/route.CtPUse81_Z27TrC2.webp&quot; /&gt;&lt;figcaption&gt;添加路由|80&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wetest.vip/page/cloudflare/cname.html&quot; target=&quot;_blank&quot;&gt;微测网 CF 优选 CNAME&lt;/a&gt; — 更新比较勤，域名多&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cf.090227.xyz/&quot; target=&quot;_blank&quot;&gt;CF优选域名汇总&lt;/a&gt; — 界面简单直接&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;上面列出来的域名都是别人维护的优选 CNAME，比如 &lt;code&gt;vip.090227.xyz&lt;/code&gt;、&lt;code&gt;cf.011011.xyz&lt;/code&gt; 之类的。&lt;/p&gt;&lt;p&gt;怎么选？两种方法：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简单粗暴法：&lt;/strong&gt; 直接挑一个 ping 一下，延迟低的就用。&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;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vip.090227.xyz&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; 多 ping 几个，记下延迟，挑最低的两三个。不同运营商的结果可能不一样，有条件的话找个跟你同运营商的朋友帮忙测。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：添加 DNS 解析&lt;a href=&quot;#第三步添加-dns-解析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;回到 Cloudflare → 你的域名 → DNS → 记录。&lt;/p&gt;&lt;p&gt;添加一条 CNAME 记录：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：CNAME&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：&lt;code&gt;@&lt;/code&gt;（代表主域名）或你想要的二级域名比如 &lt;code&gt;www&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：你选的优选域名，比如 &lt;code&gt;vip.090227.xyz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理状态&lt;/strong&gt;：&lt;strong&gt;关掉&lt;/strong&gt;，显示灰色云朵&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;cname|67&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;541&quot; src=&quot;/_astro/cname.DGSuP8Bk_7qf6R.webp&quot; /&gt;&lt;figcaption&gt;cname|67&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代理一定要关掉&lt;/strong&gt;，这是最多人踩的坑。Cloudflare 的代理（橙色云朵）会把你的流量走 Cloudflare 全球网络，等于绕回了默认路由，优选IP就白做了。关掉代理后，DNS 解析会直接返回优选域名对应的 IP，你的流量走的是那条优化过的路径。&lt;/p&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;/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;ping&lt;/span&gt;&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;p&gt;看返回的 IP 是不是跟优选域名的一样。再用 curl 检查一下：&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;-I&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://你的域名&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;server: cloudflare&lt;/code&gt; 和 &lt;code&gt;cf-ray&lt;/code&gt; 字段，说明流量确实走了 Cloudflare。&lt;/p&gt;&lt;p&gt;也可以用 &lt;a href=&quot;https://ping.pe/&quot; target=&quot;_blank&quot;&gt;Ping.pe&lt;/a&gt; 这类工具从多个地区测速，对比优化前后的延迟。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;方式二：A 记录直连优选IP&lt;a href=&quot;#方式二a-记录直连优选ip&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;第一步：找到好用的 Cloudflare IP&lt;a href=&quot;#第一步找到好用的-cloudflare-ip&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;去微测网的 &lt;a href=&quot;https://www.wetest.vip/page/cloudflare/address_v4.html&quot; target=&quot;_blank&quot;&gt;CloudFlare优选IPV4地址&lt;/a&gt;，上面有测速过的一批 IP 列表。&lt;/p&gt;&lt;p&gt;或者自己动手：从 Cloudflare 的 IP 段（公开的，&lt;a href=&quot;https://www.cloudflare.com/ips/&quot; target=&quot;_blank&quot;&gt;官网有列表&lt;/a&gt;）里挑一些，批量 ping 测速。这活挺枯燥的，但真想搞就耐心点。&lt;/p&gt;&lt;p&gt;测速的时候注意几点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;从你实际使用的网络测&lt;/strong&gt;，别用 VPN 测，那测出来的不准&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;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：添加 A 记录&lt;a href=&quot;#第二步添加-a-记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;DNS 设置里添加 A 记录：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：A&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：&lt;code&gt;@&lt;/code&gt; 或你的二级域名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv4 地址&lt;/strong&gt;：你测出来的优选 IP&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;想更稳妥的话，多加几条 A 记录，填不同的优选 IP。DNS 会自动轮询返回，相当于做了个简单的负载均衡。一个 IP 挂了，其他的还能顶上。&lt;/p&gt;&lt;p&gt;不过要注意：&lt;strong&gt;CNAME 和 A 记录不能同时存在&lt;/strong&gt;。同一个域名下如果有 CNAME，就不能再加 A 记录，反过来也一样。想用 A 记录就得先把 CNAME 删了。&lt;/p&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;跟 CNAME 方式一样，ping 看 IP，curl 看响应头。&lt;/p&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;A 记录方式有两个硬伤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IP 会过期&lt;/strong&gt;。Cloudflare 的 IP 归属和路由策略经常调整，今天 30ms 的好 IP，过两个月可能变成 200ms。你得定期重新测速、更新记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作量大&lt;/strong&gt;。手动测速、挑选、填记录、定期维护，对个人博客来说性价比不高。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;CNAME 方式的域名背后，维护者会不定期更新 IP 列表，你不用操心这些。&lt;/p&gt;&lt;hr /&gt;&lt;/section&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;/p&gt;&lt;section&gt;&lt;h3&gt;ping 对比&lt;a href=&quot;#ping-对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;优化前后分别 ping 你的域名，记录延迟。简单但直观：&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;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9ll.uk&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;# 优化后（DNS 传播完）&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;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9ll.uk&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;a href=&quot;#多地区测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用 &lt;a href=&quot;https://ping.pe/&quot; target=&quot;_blank&quot;&gt;Ping.pe&lt;/a&gt; 或 &lt;a href=&quot;https://www.itdog.cn/&quot; target=&quot;_blank&quot;&gt;ITDog&lt;/a&gt; 从全国多个节点测试。你自己的网络测出来好了不代表所有用户都好了，看个全局。&lt;/p&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;浏览器清缓存（Ctrl+Shift+Delete），打开你的网站，感受加载速度。图片多的页面效果对比更明显。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;curl 看细节&lt;a href=&quot;#curl-看细节&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;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;/dev/null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-w&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DNS解析: %{time_namelookup}s\nTCP连接: %{time_connect}s\nTLS握手: %{time_appconnect}s\n首字节: %{time_starttransfer}s\n总时间: %{time_total}s\n&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://你的域名&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;这个命令会输出连接各阶段的耗时，比单纯 ping 更精确。重点看 &lt;code&gt;DNS解析&lt;/code&gt;、&lt;code&gt;TCP连接&lt;/code&gt; 和 &lt;code&gt;首字节&lt;/code&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;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;最常见的坑，没有之一。加了 CNAME 但 Cloudflare 那边代理还是橙色的，等于白加。一定要确认是灰色云朵。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;DNS 缓存&lt;a href=&quot;#dns-缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;改完 DNS 记录后，不是立刻生效的。本地电脑、浏览器、路由器都可能缓存了旧的 DNS 结果。&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;# Windows&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;ipconfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/flushdns&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;# macOS&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;dscacheutil&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-flushcache&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;killall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-HUP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mDNSResponder&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;# Linux（看用的什么 DNS 服务）&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;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemd-resolve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--flush-caches&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;一般 DNS 传播要几分钟到几小时不等，Cloudflare 自己的 DNS 生效最快（因为就是他们家的），其他 DNS 服务商的传播慢一些。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Workers 路由没生效&lt;a href=&quot;#workers-路由没生效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;添加路由后发现请求没走 Workers，检查：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;路由格式对不对（&lt;code&gt;域名/*&lt;/code&gt; 不是 &lt;code&gt;域名/&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;域名是不是已经在 Cloudflare 账号里添加了&lt;/li&gt;
&lt;li&gt;Workers 项目有没有部署成功&lt;/li&gt;
&lt;li&gt;路由规则里域名跟 DNS 记录里的要一致&lt;/li&gt;
&lt;/ul&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;第三方维护的优选域名可能随时停更或失效。如果突然访问不了了，先确认优选域名本身还能 ping 通。ping 不通就换一个域名。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CNAME 和 A 记录冲突&lt;a href=&quot;#cname-和-a-记录冲突&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;同一个域名下不能同时有 CNAME 和 A 记录。报错提示重复的时候，检查是不是之前加了 CNAME 没删。&lt;/p&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;同一个优选IP，电信测出来 80ms，移动测出来 300ms，很正常。不同运营商走的线路完全不同，没有一个 IP 能对所有运营商都好。如果你的用户覆盖三大运营商，可以考虑针对不同运营商用不同的优选IP（需要多个子域名分别解析）。&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;section&gt;&lt;h3&gt;优选IP + Cloudflare Pages&lt;a href=&quot;#优选ip--cloudflare-pages&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Cloudflare Pages 也能用优选IP。原理跟 Workers 一样——Pages 本质上也是跑在 Cloudflare 边缘网络上的，给 Pages 绑定自定义域名后，同样可以 CNAME 指向优选域名。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;跟 Vercel 对比&lt;a href=&quot;#跟-vercel-对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vercel 的 Edge Network 在国内也经常绕路，特别是免费计划。很多人选 Cloudflare Workers + 优选IP 而不是 Vercel，就是图个能优化链路。Vercel 你没法选节点，Cloudflare 至少还有这条路。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;自己维护优选IP列表&lt;a href=&quot;#自己维护优选ip列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你特别在意效果，可以写个脚本定期从 Cloudflare IP 段里测速，自动更新 DNS 记录。Cloudflare API 支持程序化操作 DNS 记录，配合 cron 跑就行。这个比较折腾，但适合有自动化需求的场景。&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;优选IP这事说白了就是在 Cloudflare 的路由上找捷径。CNAME 方式最省事，加一条 DNS 记录，几分钟就搞定了。A 记录方式更灵活但维护成本高，看你需不需要。&lt;/p&gt;&lt;p&gt;效果因人而异——电信用户大概率有明显改善，联通一般般，移动看运气。试一下又不亏，不喜欢改回来就是了。&lt;/p&gt;&lt;p&gt;最后说一句实话：&lt;strong&gt;这种方式本质上是蹭别人优选好的 IP&lt;/strong&gt;。真想从头搞，得自己去测 IP、维护列表、定期更新。大多数人没必要折腾到那一步。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>本地部署Qwen3.5完全指南：从下载到跑起来</title><link>https://www.9ll.uk/posts/ai/qwen35/</link><guid isPermaLink="true">https://www.9ll.uk/posts/ai/qwen35/</guid><description>手把手教你用LM Studio在自己电脑上跑Qwen3.5，量化格式怎么选、显存不够怎么办、GPU卸载设多少，都讲清楚</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为什么要折腾本地大模型？原因其实就几个字：&lt;strong&gt;隐私、免费、离线能用&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;把数据发给第三方 API，总归要担心泄露。本地跑的话，所有对话都留在你自己的硬盘上，谁也看不到。而且不花钱——没有 API 调用费，没有 token 计价，想怎么问就怎么问。断网也能用，出差坐高铁的时候特别香。&lt;/p&gt;
&lt;p&gt;Qwen3.5 是通义千问团队出的开源模型，从 0.6B 到 72B 一堆尺寸可选。小的跑在集显笔记本上，大的需要专业显卡。这篇主要讲怎么在自己电脑上把 Qwen3.5 跑起来，从下载工具、选模型、到调设置，每一步都写明白。&lt;/p&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;p&gt;跑本地模型最吃两样东西：&lt;strong&gt;显存（VRAM）和内存（RAM）&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;模型能塞进显存就全塞进去，速度最快。塞不完的会溢出到内存，速度砍一大截但还能跑。内存也不够？那直接卡死或者根本加载不了。&lt;/p&gt;&lt;p&gt;给你一个大概的参考：&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;显存大小&lt;/th&gt;&lt;th&gt;能跑的模型&lt;/th&gt;&lt;th&gt;能跑的量化精度&lt;/th&gt;&lt;th&gt;体验&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;6GB（比如 GTX 1660、RTX 3060 6G）&lt;/td&gt;&lt;td&gt;Qwen3.5-4B&lt;/td&gt;&lt;td&gt;Q4_K_M 或更低&lt;/td&gt;&lt;td&gt;能用，回复速度还行，复杂推理差点意思&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8GB（RTX 3060 8G、RTX 4060）&lt;/td&gt;&lt;td&gt;Qwen3.5-4B 全精度 或 8B 量化版&lt;/td&gt;&lt;td&gt;4B 跑 Q8，8B 跑 Q4&lt;/td&gt;&lt;td&gt;4B 很流畅，8B 也跑得动&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12GB（RTX 3060 12G、RTX 4070）&lt;/td&gt;&lt;td&gt;Qwen3.5-8B 甚至 14B 的量化版&lt;/td&gt;&lt;td&gt;8B 跑 Q8，14B 跑 Q4&lt;/td&gt;&lt;td&gt;甜点配置，8B 毫无压力&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16GB+（RTX 4080、4090、A4000）&lt;/td&gt;&lt;td&gt;Qwen3.5-14B 或更大&lt;/td&gt;&lt;td&gt;高精度随便选&lt;/td&gt;&lt;td&gt;爽就完事了&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;24GB（RTX 4090、A5000）&lt;/td&gt;&lt;td&gt;Qwen3.5-30B 量化版&lt;/td&gt;&lt;td&gt;Q4 到 Q8&lt;/td&gt;&lt;td&gt;大模型也能本地跑&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;没有独显怎么办？&lt;/strong&gt; 也能跑。纯 CPU 推理会慢很多，但 Qwen3.5-4B 用 Q4 量化在 16GB 内存的笔记本上是可以动的。就是等回复的时候得有点耐心，一秒蹦两三个字的节奏。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内存方面&lt;/strong&gt;，建议至少 16GB。模型文件本身就要占内存，加上推理时的临时开销，8GB 基本没戏。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、下载 LM Studio&lt;a href=&quot;#二下载-lm-studio&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LM Studio 是一个本地大模型的图形化运行工具，支持 Windows、Mac、Linux。不用折腾命令行，不用配 Python 环境，下载就能用。对新手来说是最省心的选择。&lt;/p&gt;&lt;p&gt;到官网 &lt;a href=&quot;https://www.lm-studio.me/&quot; target=&quot;_blank&quot;&gt;lm-studio.me&lt;/a&gt; 下载对应系统的安装包，装好就行。&lt;/p&gt;&lt;p&gt;装完第一次打开，界面是英文的，不过用起来很简单。后面的操作基本就是一个流程：&lt;strong&gt;下载模型 → 加载模型 → 开聊&lt;/strong&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;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;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.modelscope.cn/&quot; target=&quot;_blank&quot;&gt;魔搭社区&lt;/a&gt;（国内直连，速度快）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/&quot; target=&quot;_blank&quot;&gt;Hugging Face&lt;/a&gt;（要魔法，但模型最全）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;两个站的模型是一样的，哪个方便用哪个。&lt;/p&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;LM Studio 只认 &lt;strong&gt;GGUF&lt;/strong&gt; 格式的模型。去下载站搜 Qwen3.5 的时候，认准文件名里带 &lt;code&gt;.gguf&lt;/code&gt; 后缀的。&lt;/p&gt;&lt;p&gt;推荐看看 &lt;a href=&quot;https://www.modelscope.cn/organization/unsloth&quot; target=&quot;_blank&quot;&gt;Unsloth AI&lt;/a&gt; 团队发的版本。他们搞了一种叫 &lt;strong&gt;UD（Unsloth Dynamic）&lt;/strong&gt; 的高级量化，比普通量化聪明——不是所有层都压成同一个精度，而是关键层保留高精度，不那么重要的层压狠一点。同样的文件大小，UD 版本比普通版本聪明一丢丢。&lt;/p&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;strong&gt;精度越高越聪明，但文件越大、越吃显存。精度越低越省资源，但模型会变”笨”。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;常见的量化格式从高到低排：&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;量化格式&lt;/th&gt;&lt;th&gt;位数&lt;/th&gt;&lt;th&gt;大概多大（4B 模型）&lt;/th&gt;&lt;th&gt;质量&lt;/th&gt;&lt;th&gt;适合谁&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;FP16&lt;/td&gt;&lt;td&gt;16-bit&lt;/td&gt;&lt;td&gt;~8GB&lt;/td&gt;&lt;td&gt;原版质量&lt;/td&gt;&lt;td&gt;显存充足的土豪&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Q8_0&lt;/td&gt;&lt;td&gt;8-bit&lt;/td&gt;&lt;td&gt;~4.5GB&lt;/td&gt;&lt;td&gt;接近原版&lt;/td&gt;&lt;td&gt;日常用已经很好了&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Q6_K&lt;/td&gt;&lt;td&gt;6-bit&lt;/td&gt;&lt;td&gt;~3.5GB&lt;/td&gt;&lt;td&gt;略有下降&lt;/td&gt;&lt;td&gt;显存紧一点的折中方案&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Q4_K_M&lt;/td&gt;&lt;td&gt;4-bit（中档）&lt;/td&gt;&lt;td&gt;~2.8GB&lt;/td&gt;&lt;td&gt;能用&lt;/td&gt;&lt;td&gt;显存紧张的首选&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Q4_K_S&lt;/td&gt;&lt;td&gt;4-bit（低档）&lt;/td&gt;&lt;td&gt;~2.5GB&lt;/td&gt;&lt;td&gt;勉强能用&lt;/td&gt;&lt;td&gt;实在没显存才考虑&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Q3 以下&lt;/td&gt;&lt;td&gt;3-bit&lt;/td&gt;&lt;td&gt;更小&lt;/td&gt;&lt;td&gt;明显变傻&lt;/td&gt;&lt;td&gt;别折腾了&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;我个人的建议&lt;/strong&gt;：日常使用选 &lt;strong&gt;Q4_K_M&lt;/strong&gt;，性价比最高。显存富裕的话上 Q8。低于 Q4 就别折腾了，模型明显变傻，回答质量下降得厉害。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Unsloth 的 UD 版本和普通版有什么区别？&lt;a href=&quot;#unsloth-的-ud-版本和普通版有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用表格说清楚：&lt;/p&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;/th&gt;&lt;th&gt;Qwen3.5-4B-Q8_0.gguf&lt;/th&gt;&lt;th&gt;Qwen3.5-4B-UD-Q8_K_XL.gguf&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;量化类型&lt;/td&gt;&lt;td&gt;标准量化&lt;/td&gt;&lt;td&gt;高级混合量化（UD + K-quants）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;精度策略&lt;/td&gt;&lt;td&gt;所有权重统一压成 8-bit&lt;/td&gt;&lt;td&gt;关键层高精度（16-bit），普通层 8-bit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;文件后缀含义&lt;/td&gt;&lt;td&gt;Q8_0：传统 8-bit 量化&lt;/td&gt;&lt;td&gt;UD：Unsloth Dynamic 动态混合精度；XL：Extra Large 高精度；K：K-quant 分组量化策略&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;推理速度&lt;/td&gt;&lt;td&gt;较快（计算逻辑统一，硬件友好）&lt;/td&gt;&lt;td&gt;稍慢（高精度层计算量大一点）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;智能程度&lt;/td&gt;&lt;td&gt;高（接近原版 FP16）&lt;/td&gt;&lt;td&gt;极高（理论上比 Q8_0 更接近原版）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;适用场景&lt;/td&gt;&lt;td&gt;日常对话、代码编写、追求速度&lt;/td&gt;&lt;td&gt;复杂推理、高精度任务、不差那点显存&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;简单说，UD 版本就是”花了更多的显存换更高的智能”。如果你显存够用，优先选 UD 版。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;视觉模型的 mmproj 文件&lt;a href=&quot;#视觉模型的-mmproj-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Qwen3.5 有些版本支持看图（视觉能力）。但光下模型文件还不够，&lt;strong&gt;还得下一个叫 mmproj 的文件&lt;/strong&gt;，和模型放在同一个文件夹里才行。&lt;/p&gt;&lt;p&gt;mmproj 也有精度区分，推荐下 &lt;strong&gt;F32&lt;/strong&gt; 的。F16 和 F32 的视觉效果差距肉眼可见，F32 识别准确率明显高一些。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Qwen3.5模型列表&quot; loading=&quot;lazy&quot; width=&quot;2262&quot; height=&quot;1105&quot; src=&quot;/_astro/models.D-H4-sgI_1HTAKV.webp&quot; /&gt;&lt;figcaption&gt;Qwen3.5模型列表&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;h2&gt;四、在 LM Studio 里配置模型路径&lt;a href=&quot;#四在-lm-studio-里配置模型路径&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;打开 LM Studio，第一件事是告诉它你把模型存在哪了。&lt;/p&gt;&lt;p&gt;点左边栏的文件夹图标（或者 Settings 里的 Models Directory），改成你存放 gguf 文件的路径。比如：&lt;/p&gt;&lt;p&gt;&lt;code&gt;D:\AI\models\qwen3.5\Qwen3.5-9B-UD-Q4_K_XL&lt;/code&gt;&lt;/p&gt;&lt;p&gt;有个坑要注意：&lt;strong&gt;LM Studio 读取模型的时候，路径得有两级以上的文件夹嵌套&lt;/strong&gt;。你直接把 gguf 文件丢在 &lt;code&gt;D:\AI\models\&lt;/code&gt; 根目录下，它可能识别不到。建个子文件夹把模型放进去就好了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;修改LM读取大模型的路径&quot; loading=&quot;lazy&quot; width=&quot;2541&quot; height=&quot;1475&quot; src=&quot;/_astro/models_file_path.BnnVLyYT_Z1d8LXw.webp&quot; /&gt;&lt;figcaption&gt;修改LM读取大模型的路径&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;配好路径后，左边栏应该能看到你的模型列出来了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、加载模型和 GPU 设置&lt;a href=&quot;#五加载模型和-gpu-设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;找到模型后，点右边的加载按钮。加载之前可以调参数，最重要的一项是 &lt;strong&gt;GPU Offload（GPU 卸载）&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;GPU Offload 是什么？&lt;a href=&quot;#gpu-offload-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大模型的运行靠”层”（layers）。GPU Offload 就是控制&lt;strong&gt;有多少层跑在显卡上，多少层跑在 CPU 和内存上&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;全部卸载到 GPU = 全层跑显卡，速度最快，但得有足够显存&lt;/li&gt;
&lt;li&gt;卸载一部分 = 显存装不下的层退回 CPU，速度变慢但能跑&lt;/li&gt;
&lt;li&gt;不卸载 = 纯 CPU 推理，最慢&lt;/li&gt;
&lt;/ul&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;strong&gt;原则：显存能装下多少层，就卸载多少层。&lt;/strong&gt; 不确定的话，先把 GPU Offload 拉满，如果加载时报错或者显存爆了，再往回调。&lt;/p&gt;&lt;p&gt;LM Studio 界面右上角会显示预计占用多少显存/内存，看着那个数字来调就行。目标是&lt;strong&gt;模型全部装进显存&lt;/strong&gt;，如果装不下，就尽量多塞几层到 GPU。&lt;/p&gt;&lt;p&gt;举几个例子帮你理解：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情况&lt;/th&gt;&lt;th&gt;GPU Offload 建议&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;12GB 显存跑 4B Q8（需要约 5GB）&lt;/td&gt;&lt;td&gt;全部拉满&lt;/td&gt;&lt;td&gt;绰绰有余，全塞 GPU&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8GB 显存跑 8B Q4（需要约 5.5GB）&lt;/td&gt;&lt;td&gt;全部或接近全部&lt;/td&gt;&lt;td&gt;能塞下，注意别开太多后台程序&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6GB 显存跑 4B Q8（需要约 5GB）&lt;/td&gt;&lt;td&gt;大部分卸载到 GPU&lt;/td&gt;&lt;td&gt;留一点空间给系统，卸载个 25-28 层左右&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;纯集显 / 无独显&lt;/td&gt;&lt;td&gt;0 或 1&lt;/td&gt;&lt;td&gt;只能走 CPU 推理，慢但能用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;模型设置&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; src=&quot;/_astro/models_setting.LsbO3C-O_xX2KS.webp&quot; /&gt;&lt;figcaption&gt;模型设置&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&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;Qwen3.5 有很多尺寸：0.6B、1.7B、4B、8B、14B、30B、72B。不是越大越好，适合你硬件的才是最好的。&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;6GB 以下显存&lt;/strong&gt;：老实选 4B。别贪心上 8B，跑不动硬跑体验极差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8-12GB 显存&lt;/strong&gt;：4B 全精度或者 8B 量化版，看你对质量的要求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;12-16GB 显存&lt;/strong&gt;：8B 全精度首选，14B 量化版也行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24GB 以上&lt;/strong&gt;：14B 全精度甚至 30B 量化版都可以试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;笔记本没独显&lt;/strong&gt;：4B Q4 量化，纯 CPU 慢慢跑。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;说实话，4B 模型日常聊天、写代码辅助已经够用了。没必要一味追求大模型——跑不动的大模型还不如跑得飞快的小模型好用。&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;ol&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;：给个需要多步推理的问题，比如”一个房间里有3个杀手，你杀了一个，还剩几个？”。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果回复速度慢到一秒蹦一两个字，那说明你的显存没装下模型，大量计算跑在 CPU 上了。回去调 GPU Offload，或者换个更小的量化版本。&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;&lt;strong&gt;Q：加载模型的时候报错，提示内存不够？&lt;/strong&gt;
要么你的模型太大了，换个小点的量化版本。要么你电脑后台开着太多东西，关掉一些再试。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：模型回复特别慢，一秒才蹦几个字？&lt;/strong&gt;
检查 GPU Offload 是不是没设对，模型大概率跑在 CPU 上了。把更多层卸载到 GPU。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：模型下载下来了但 LM Studio 里看不到？&lt;/strong&gt;
检查路径对不对，确保有两级以上的文件夹嵌套。gguf 文件名别乱改。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Q4 和 Q8 到底差多少？&lt;/strong&gt;
日常聊天差别不大。写代码、做数学题、复杂逻辑推理的时候，Q8 明显更靠谱。显存够就上 Q8，不够就 Q4_K_M。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：能同时跑两个模型吗？&lt;/strong&gt;
理论上可以，但需要双倍显存/内存。一般没这个必要，除非你在做对比测试。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：CPU 推理是不是完全不能用？&lt;/strong&gt;
也不是。Qwen3.5-4B Q4 在 16GB 内存的电脑上，纯 CPU 大概一秒能出 2-5 个 token，聊天勉强能用，写长文就别指望了。&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;本地部署大模型这事，说难不难，说简单也得折腾一下。LM Studio 已经把门槛拉到很低了——不用写代码，不用配环境，图形界面点几下就能跑。&lt;/p&gt;&lt;p&gt;真正折腾的地方在于&lt;strong&gt;选模型和调设置&lt;/strong&gt;。模型太大跑不动，太小不够聪明；量化太高压缩太多，太低又吃不消显存。多试几次，找到自己硬件的甜点就好了。&lt;/p&gt;&lt;p&gt;Qwen3.5 整体质量不错，4B 在同级别里算是能打的。日常用用完全没问题，写代码辅助、翻译、问答都挺好。真要搞复杂任务，上 8B 或者 14B。&lt;/p&gt;&lt;p&gt;别纠结了，先跑起来。有问题再调，比对着参数表发呆强。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>