<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://llxx.cc/</id>
  <title type="text">七号研习社</title>
  <subtitle type="text">记录技术、生活与思考</subtitle>
  <updated>2026-11-05T10:00:00.000Z</updated>
  <author><name>777</name></author>
  <link rel="alternate" href="https://llxx.cc/"/>
  <link rel="self" href="https://llxx.cc/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.9</generator>
    <entry>
      <id>https://llxx.cc/posts/2026/11/vps-commands-backup/</id>
      <title type="text">VPS 命令脚本备份</title>
      <published>2026-11-04T10:00:00.000Z</published>
      <updated>2026-11-04T10:00:00.000Z</updated>
      <author><name>777</name></author>
      <link rel="alternate" href="https://llxx.cc/posts/2026/11/vps-commands-backup/"/>
      <summary type="text">常用的 VPS 命令和脚本备份，包括系统配置、防火墙、BBR、面板安装等。</summary>
      <content type="html"><![CDATA[<section><h2>常用命令<a href="#常用命令"><span>#</span></a></h2><section><h3>切换到 root 用户<a href="#切换到-root-用户"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>-i</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>更新系统和依赖<a href="#更新系统和依赖"><span>#</span></a></h3><p>Debian / Ubuntu：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>update</span><span> </span><span>-y</span></div></div><div><div><div>2</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>curl</span><span> </span><span>socat</span><span> </span><span>wget</span></div></div><div><div><div>3</div></div><div><span>apt-get</span><span> </span><span>install</span><span> </span><span>sudo</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>CentOS：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>update</span><span> </span><span>-y</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>curl</span><span> </span><span>socat</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>防火墙相关<a href="#防火墙相关"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>firewall-cmd</span><span> </span><span>--state</span><span>                   </span><span># 查看防火墙状态</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>firewalld.service</span><span>       </span><span># 停止防火墙</span></div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>disable</span><span> </span><span>firewalld.service</span><span>    </span><span># 禁止防火墙开机自启</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Debian 开启原生 BBR<a href="#debian-开启原生-bbr"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"net.core.default_qdisc=fq"</span><span> &gt;&gt; </span><span>/etc/sysctl.conf</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"net.ipv4.tcp_congestion_control=bbr"</span><span> &gt;&gt; </span><span>/etc/sysctl.conf</span></div></div><div><div><div>3</div></div><div><span>sysctl</span><span> </span><span>-p</span></div></div><div><div><div>4</div></div><div><span>sysctl</span><span> </span><span>net.ipv4.tcp_available_congestion_control</span></div></div><div><div><div>5</div></div><div><span>lsmod</span><span> | </span><span>grep</span><span> </span><span>bbr</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>查看系统信息<a href="#查看系统信息"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>-qO-</span><span> </span><span>bench.sh</span><span> | </span><span>bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>修改密码<a href="#修改密码"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>passwd</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>常用脚本<a href="#常用脚本"><span>#</span></a></h2><section><h3>VPS 测速<a href="#vps-测速"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>-qO-</span><span> </span><span>--no-check-certificate</span><span> </span><span>https://raw.githubusercontent.com/oooldking/script/master/superbench.sh</span><span> | </span><span>bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>回程测试<a href="#回程测试"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>https://raw.githubusercontent.com/zhucaidan/mtr_trace/main/mtr_trace.sh</span><span> | </span><span>bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>ServerStatus<a href="#serverstatus"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 国外机</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://raw.githubusercontent.com/cokemine/ServerStatus-Hotaru/master/status.sh</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 国内机</span></div></div><div><div><div>5</div></div><div><span>wget</span><span> </span><span>https://cokemine.coding.net/p/hotarunet/d/ServerStatus-Hotaru/git/raw/master/status.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>面板安装<a href="#面板安装"><span>#</span></a></h2><section><h3>1Panel<a href="#1panel"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-sSL</span><span> </span><span>https://resource.fit2cloud.com/1panel/package/quick_start.sh</span><span> </span><span>-o</span><span> </span><span>quick_start.sh</span><span> &amp;&amp; </span><span>bash</span><span> </span><span>quick_start.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>宝塔面板（Debian）<a href="#宝塔面板debian"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>-O</span><span> </span><span>install.sh</span><span> </span><span>http://download.moetas.com/install/install-ubuntu_6.0.sh</span><span> &amp;&amp; </span><span>sudo</span><span> </span><span>bash</span><span> </span><span>install.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>X-UI<a href="#x-ui"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>bash</span><span> </span><span>&lt;(</span><span>curl</span><span> </span><span>-Ls</span><span> https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>DD 系统重装<a href="#dd-系统重装"><span>#</span></a></h2><section><h3>甲骨文 ARM DD<a href="#甲骨文-arm-dd"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-fLO</span><span> </span><span>https://raw.githubusercontent.com/bohanyang/debi/master/debi.sh</span></div></div><div><div><div>2</div></div><div><span>chmod</span><span> </span><span>a+rx</span><span> </span><span>debi.sh</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>./debi.sh</span><span> </span><span>--architecture</span><span> </span><span>arm64</span><span> </span><span>--user</span><span> </span><span>root</span><span> </span><span>--password</span><span> </span><span>password</span></div></div><div><div><div>4</div></div><div><span>sudo</span><span> </span><span>shutdown</span><span> </span><span>-r</span><span> </span><span>now</span></div></div><div><div><div>5</div></div><div><span># 默认密码：password</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>DD Debian 10（64 位）<a href="#dd-debian-1064-位"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>bash</span><span> </span><span>&lt;(</span><span>wget</span><span> </span><span>--no-check-certificate</span><span> </span><span>-qO-</span><span> 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh')</span><span> </span><span>-d</span><span> </span><span>10</span><span> </span><span>-v</span><span> </span><span>64</span><span> </span><span>-a</span></div></div><div><div><div>2</div></div><div><span># 默认密码：MoeClub.org</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>国内 VPS DD Debian 11<a href="#国内-vps-dd-debian-11"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>bash</span><span> </span><span>&lt;(</span><span>wget</span><span> </span><span>--no-check-certificate</span><span> </span><span>-qO-</span><span> 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh')</span><span> </span><span>-d</span><span> </span><span>11</span><span> </span><span>-v</span><span> </span><span>64</span><span> </span><span>-a</span><span> </span><span>--mirror</span><span> </span><span>'https://mirrors.huaweicloud.com/debian/'</span><span> </span><span>-p</span><span> </span><span>password</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>Docker 应用<a href="#docker-应用"><span>#</span></a></h2><section><h3>青龙面板<a href="#青龙面板"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-dit</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>QL</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--hostname</span><span> </span><span>QL</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--restart</span><span> </span><span>always</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>-p</span><span> </span><span>5777:5777</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>-v</span><span> </span><span>$PWD</span><span>/QL/config:/ql/config</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-v</span><span> </span><span>$PWD</span><span>/QL/log:/ql/log</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>-v</span><span> </span><span>$PWD</span><span>/QL/db:/ql/db</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-v</span><span> </span><span>$PWD</span><span>/QL/scripts:/ql/scripts</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-v</span><span> </span><span>$PWD</span><span>/QL/jbot:/ql/jbot</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>  </span><span>whyour/qinglong:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>其他<a href="#其他"><span>#</span></a></h2><section><h3>腾讯云去监控<a href="#腾讯云去监控"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>-i</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>tat_agent</span></div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>disable</span><span> </span><span>tat_agent</span></div></div><div><div><div>4</div></div><div><span>/usr/local/qcloud/stargate/admin/uninstall.sh</span></div></div><div><div><div>5</div></div><div><span>/usr/local/qcloud/YunJing/uninst.sh</span></div></div><div><div><div>6</div></div><div><span>/usr/local/qcloud/monitor/barad/admin/uninstall.sh</span></div></div><div><div><div>7</div></div><div><span>rm</span><span> </span><span>-f</span><span> </span><span>/etc/systemd/system/tat_agent.service</span></div></div><div><div><div>8</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>/usr/local/qcloud</span></div></div><div><div><div>9</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>/usr/local/sa</span></div></div><div><div><div>10</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>/usr/local/agenttools</span></div></div><div><div><div>11</div></div><div><span>process</span><span><span>=</span><span>(</span></span><span>sap100</span><span> </span><span>secu-tcs-agent</span><span> </span><span>sgagent64</span><span> </span><span>barad_agent</span><span> </span><span>agent</span><span> </span><span>agentPlugInD</span><span> </span><span>pvdriver</span><span>)</span></div></div><div><div><div>12</div></div><div><span>for</span><span> </span><span>i</span><span> </span><span>in</span><span> </span><span><span>${</span><span>process</span></span><span>[@]</span><span>}</span></div></div><div><div><div>13</div></div><div><span>do</span></div></div><div><div><div>14</div></div><div><span>  </span><span>for</span><span> </span><span>A</span><span> </span><span>in</span><span> $(</span><span>ps</span><span> </span><span>aux</span><span> | </span><span>grep</span><span> </span><span>$i</span><span> | </span><span>grep</span><span> </span><span>-v</span><span> </span><span>grep</span><span> | </span><span>awk</span><span> </span><span>'{print $2}'</span><span>)</span></div></div><div><div><div>15</div></div><div><span>  </span><span>do</span></div></div><div><div><div>16</div></div><div><span>    </span><span>kill</span><span> </span><span>-9</span><span> </span><span>$A</span></div></div><div><div><div>17</div></div><div><span>  </span><span>done</span></div></div><div><div><div>18</div></div><div><span>done</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://llxx.cc/posts/2026/11/cleanyourtv-android-tv-debloat/</id>
      <title type="text">CleanYourTV：让 AI 助手帮你清理安卓电视的广告和预装应用</title>
      <published>2026-11-05T10:00:00.000Z</published>
      <updated>2026-11-05T10:00:00.000Z</updated>
      <author><name>777</name></author>
      <link rel="alternate" href="https://llxx.cc/posts/2026/11/cleanyourtv-android-tv-debloat/"/>
      <summary type="text">开源项目 CleanYourTV 通过局域网 ADB 停用安卓电视的广告、推荐和预装应用，再换一个干净的桌面。这篇讲它怎么做、支持哪些机型、怎么上手，以及哪里要小心。</summary>
      <content type="html"><![CDATA[<p>开机先看一段广告，主页一半位置是推荐的影视剧，设置里还有一堆叫不出名字的后台服务。用过国产安卓电视的人，大概都对这个界面不陌生。</p>
<p><a href="https://github.com/Gathin23/cleanyourtv" target="_blank">CleanYourTV</a> 就是冲着这个来的。它通过局域网连上电视，把广告、推荐内容、数据上报服务和用不到的预装应用停掉，再装一个只放常用应用的桌面。整个过程不用 root，也不用刷机，电脑和电视在同一个 Wi-Fi 下就行。</p>
<a href="https://github.com/Gathin23/cleanyourtv" target="_blank"><div><div><div><div></div><div>Gathin23</div></div><div>/</div><div>cleanyourtv</div></div><div></div></div><div>Debloat any Android or Google TV over Wi-Fi and get an Apple TV-style home.</div><div><div>—</div><div>—</div><div>NOASSERTION</div><span>Python</span></div></a>
<section><h2>它到底做了什么<a href="#它到底做了什么"><span>#</span></a></h2><p>流程很简单：先把电视上每个应用的状态和默认桌面记下来，然后用 <code>pm disable-user</code> 停掉列表里的应用，最后编译安装它自己的桌面，设成默认主屏幕。</p><p>我觉得最关键的是第二步用”停用”而没用”卸载”。系统应用还在，只是不跑了，想要回来随时能启用。项目自带的 <code>tools/restore.sh</code> 会照着第一步的记录，把应用一个个恢复。</p><p>停用列表是按机型整理的纯文本。拿小米电视 4A 那份来看，一共 42 行，按用途分了组：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># Xiaomi telemetry</span></div></div><div><div><div>2</div></div><div><span>com.miui.tv.analytics</span></div></div><div><div><div>3</div></div><div><span>com.xiaomi.statistic</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># PatchWall and Mi content rows / promos</span></div></div><div><div><div>6</div></div><div><span>com.mitv.tvhome.atv</span></div></div><div><div><div>7</div></div><div><span>com.mitv.tvhome.michannel</span></div></div><div><div><div>8</div></div><div><span>...</span></div></div><div><div><div>9</div></div><div><span>com.xiaomi.mitv.updateservice          # re-enable to check for firmware updates</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>开头两行是小米的数据统计，接着是 PatchWall 桌面的推荐内容。系统更新服务也在里面，注释写着想检查固件更新时再打开。哪一行不想停，前面加个 <code>#</code> 就行。</p></section>
<section><h2>最特别的地方：让 AI 助手来操作<a href="#最特别的地方让-ai-助手来操作"><span>#</span></a></h2><p>这个项目推荐的用法，是把活交给 Claude Code、Codex、Gemini CLI 这类能跑终端命令的编程助手。</p><p>仓库里有一份 <code>PROMPT.md</code>，是写给 AI 助手的完整操作说明。你把它发给助手，填上电视型号，助手会先在局域网里找到电视、用 ADB 连上，动手前备份应用列表和系统设置。然后它会问你平时看哪些应用、要不要留着语音助手和投屏，再照你的回答去停用，每做一步都从电视上截一张图确认。最后编译桌面、装上、设成默认。</p><p>仓库根目录还放着 <code>CLAUDE.md</code>、<code>AGENTS.md</code>、<code>GEMINI.md</code>，分别写给不同的助手。可以看出作者一开始就打算让人只管回答问题，具体操作交给 AI。</p><p>我觉得这个思路挺对路。每台电视的预装应用都不一样，同一个牌子换个固件，包名也会变，很难写出一个通吃的脚本。让助手现场看、现场判断，反而更靠谱。说明里还专门交代助手优先用仓库里的 <code>tools/disable.sh</code>，别自己另写，因为备份和保护默认桌面的逻辑都在这个脚本里。</p><p>不过让 AI 在电视上执行命令，我还是会盯着它每一步在干什么，尤其是它要停用一个你没听说过的系统组件时。</p></section>
<section><h2>支持哪些电视<a href="#支持哪些电视"><span>#</span></a></h2><p>只支持 Android TV 和 Google TV。三星 Tizen、LG webOS、Roku 都不是安卓，用不了。Fire TV 只能参考它的清单自己手动弄。</p><p><code>examples/</code> 目录里有 443 个机型的停用列表，都是社区拿真机验证后提交的。我数了一下国内常见的牌子：</p>

<table><thead><tr><th>品牌</th><th>收录机型数</th></tr></thead><tbody><tr><td>TCL</td><td>80</td></tr><tr><td>小米</td><td>42</td></tr><tr><td>海信</td><td>16</td></tr><tr><td>创维</td><td>14</td></tr><tr><td>海尔</td><td>6</td></tr><tr><td>酷开</td><td>2</td></tr><tr><td>长虹、康佳</td><td>0</td></tr></tbody></table><p>收录得多，不代表一定能用。README 特意提醒，部分国行电视会拒绝装第三方 APK，或者不让换默认桌面，TCL 就有这样的型号。这种电视还能停掉广告和预装应用，新桌面就未必装得上了。具体要看型号和固件，光看牌子判断不了。</p><p>另外，桌面要求 Android 8.0 以上。有些老电视在清单里，系统版本却不够，桌面一样装不了。</p></section>
<section><h2>换上的桌面长什么样<a href="#换上的桌面长什么样"><span>#</span></a></h2><p>深色背景，底部一排常用应用，默认 4 个。焦点移到哪个应用上，就显示它的名字，背景颜色也跟着这个应用的横幅或图标变。往下按是更多应用，每行可以放 4 到 7 个。</p><p>用遥控器就能调整顺序：长按设置按钮进入排序模式，方向键挪位置。仓库里有 21 套主题，换颜色、壁纸、列数都不用重新编译。还有 30 多个扩展卡片，天气、世界时钟、睡眠定时、蓝牙开关都有，别的应用想往桌面上放卡片，得你点头才会出现。电视的屏保设置里也能选它自带的时钟屏保。</p><p>界面有简体中文，跟着系统语言走。</p><p>门槛在于仓库没有现成的 APK，桌面得在自己电脑上编译，要装 JDK 17 和 Android SDK。用 AI 助手的话，这一步也可以让它代劳。</p></section>
<section><h2>动手前要注意什么<a href="#动手前要注意什么"><span>#</span></a></h2><p>用完一定要把调试关掉。这个项目走的是网络 ADB，默认 5555 端口，连接是明文的，有些电视固件甚至不检查授权。调试一直开着，同一个网络里的任何设备都可能控制你的电视。</p><div><div><div></div><div>Warning</div></div><div><p>别为了远程操作，在路由器上把电视的 5555 端口映射到公网。要远程帮家里人弄，README 推荐用 Tailscale 这类私有网络。</p></div></div><p>停用也可能停出问题。东西虽然没删，停错了照样出故障。README 里记了一个例子：Google TV 停掉原桌面后，系统的设置向导可能会占掉主屏幕。稳妥的做法是分批停，每停一批就重启看看，遥控器、输入源切换、常用应用都正常再继续。</p><p>很多停用列表会关掉厂商的系统更新服务，所以之后想升级固件，得先把它重新打开。</p><p>还有个容易踩的坑：<code>PROMPT.md</code> 里提到，有些电视盒子开了 USB 调试会切断 USB 口供电，插在上面的 U 盘、音箱、USB 网卡都会失灵。如果你的电视靠 USB 网卡上网，最好一口气做完，别分两次。</p></section>
<section><h2>上手步骤<a href="#上手步骤"><span>#</span></a></h2><p>有两种用法，交给 AI 助手，或者自己敲命令。电视这边的准备工作是一样的。</p><section><h3>第一步：电视上打开调试<a href="#第一步电视上打开调试"><span>#</span></a></h3><ol>
<li>打开「设置 → 设备偏好设置 → 关于」，在「版本号」（有的叫 Build）上连按七次确定，会提示已进入开发者模式</li>
<li>返回上一级，进「开发者选项」，打开「USB 调试」。如果还有「网络调试」或「ADB 调试」开关，也一起打开</li>
<li>到网络设置里记下电视的局域网 IP，比如 <code>192.168.1.50</code></li>
</ol><p>每个牌子的菜单名称都不太一样，找不到就在设置里搜”开发者”。</p><div><div><div></div><div>Tip</div></div><div><p>有些 Google TV 只有「无线调试」，要先用配对码配对，才能走 5555 端口。用 AI 助手的话它会处理；自己操作的话，看仓库 <code>PROMPT.md</code> 里连接那一节。</p></div></div></section><section><h3>第二步（方式一）：交给 AI 助手<a href="#第二步方式一交给-ai-助手"><span>#</span></a></h3><p>我更推荐这种。电脑和电视连同一个网络，然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://github.com/Gathin23/cleanyourtv</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>cleanyourtv</span></div></div><div><div><div>3</div></div><div><span>claude</span><span>   </span><span># 或者 codex、gemini</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>一定要在仓库目录里启动助手。这样它会直接用仓库里的 <code>tools/disable.sh</code> 和 <code>launcher/build-and-install.sh</code>，备份、保护默认桌面、恢复的逻辑都在里面，它就不会自己另写一套。</p><p>接着把 <code>PROMPT.md</code> 整段发给它，把里面的 <code>&lt;MODEL NAME HERE&gt;</code> 换成你的电视型号。之后助手会一步步往下走，你只需要做几件事：</p><ul>
<li>电视弹出「允许 USB 调试吗」时点允许，助手会提前告诉你什么时候弹</li>
<li>回答它的问题：平时看哪些应用、底部快捷栏放哪几个、语音助手和投屏要不要留、还要不要收系统更新</li>
<li>最后自己检查一遍，常用应用能不能打开，遥控器每个键是否正常，HDMI 等输入源能不能切</li>
</ul></section><section><h3>第二步（方式二）：自己敲命令<a href="#第二步方式二自己敲命令"><span>#</span></a></h3><p>需要 Python 3。下面的命令都在仓库根目录里跑，IP 换成你电视的。</p><section><h4>准备连接工具，看看电视的信息<a href="#准备连接工具看看电视的信息"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>python3</span><span> </span><span>-m</span><span> </span><span>venv</span><span> </span><span>tools/venv</span></div></div><div><div><div>2</div></div><div><span>tools/venv/bin/pip</span><span> </span><span>install</span><span> </span><span>-r</span><span> </span><span>tools/requirements.txt</span></div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>TV_HOST</span><span>=</span><span>192.168.1.50</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 读取型号、Android 版本和固件</span></div></div><div><div><div>6</div></div><div><span>tools/venv/bin/python</span><span> </span><span>-I</span><span> </span><span>tools/tv.py</span><span> </span><span>--probe</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 列出已安装的应用</span></div></div><div><div><div>9</div></div><div><span>tools/venv/bin/python</span><span> </span><span>-I</span><span> </span><span>tools/tv.py</span><span> </span><span>'pm list packages'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>停用应用<a href="#停用应用"><span>#</span></a></h4><p>先在 <code>examples/</code> 里找到型号和固件都对得上的目录，读一下里面的 README，再执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>tools/disable.sh</span><span> </span><span>examples/你的机型/debloat.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>别直接拿其他机型的列表来用。不想停的应用，在那一行前面加 <code>#</code>。脚本会把停用前的状态记到电脑上的 <code>~/.cleanyourtv/</code> 目录里，之后恢复要靠它。</p></section><section><h4>编译并安装桌面<a href="#编译并安装桌面"><span>#</span></a></h4><p>需要 JDK 17、Android SDK Platform 34 和 Build Tools 34.0.0。macOS 上可以这样装：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>brew</span><span> </span><span>install</span><span> </span><span>openjdk@17</span><span> </span><span>android-commandlinetools</span></div></div><div><div><div>2</div></div><div><span>sdkmanager</span><span> </span><span>"platforms;android-34"</span><span> </span><span>"build-tools;34.0.0"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后一条命令编译、安装、切换默认桌面：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>TV_HOST</span><span>=</span><span>192.168.1.50</span><span> </span><span>launcher/build-and-install.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>脚本会先确认新桌面能启动，再把它设成默认，同时停掉原来的桌面。想留着原桌面，就加上 <code>STOCK_LAUNCHER=none</code>。注意这只是不停用原桌面，默认桌面照样会换成新的：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>TV_HOST</span><span>=</span><span>192.168.1.50</span><span> </span><span>STOCK_LAUNCHER</span><span>=</span><span>none</span><span> </span><span>launcher/build-and-install.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>换个主题（可选）<a href="#换个主题可选"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>TV_HOST</span><span>=</span><span>192.168.1.50</span><span> </span><span>tools/theme.sh</span><span> </span><span>themes/aurora</span><span>    </span><span># 换主题</span></div></div><div><div><div>2</div></div><div><span>TV_HOST</span><span>=</span><span>192.168.1.50</span><span> </span><span>tools/theme.sh</span><span> </span><span>--reset</span><span>          </span><span># 恢复默认</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Windows 用户用仓库里对应的 <code>.ps1</code> 脚本，用法见 README 的 Windows 一节。</p></section></section><section><h3>第三步：关掉调试<a href="#第三步关掉调试"><span>#</span></a></h3><p>全部弄完后，回到「开发者选项」，关掉 USB 调试和网络调试，再撤销已经授权过的电脑。5555 端口的连接是明文的，一直开着不安全。</p></section><section><h3>后悔了怎么恢复<a href="#后悔了怎么恢复"><span>#</span></a></h3><p>用停用时的同一份列表：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>TV_HOST</span><span>=</span><span>192.168.1.50</span><span> </span><span>tools/restore.sh</span><span> </span><span>examples/你的机型/debloat.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>脚本会照着 <code>~/.cleanyourtv/</code> 里的记录，把应用和原来的默认桌面恢复回去。停用之前本来就关着的应用，恢复后还是关着。</p><p>新桌面不会被恢复脚本卸载，要删就去电视的「设置 → 应用」里删。连不上 ADB 的时候，也可以直接在电视的应用设置里，把停掉的应用一个个重新启用。</p></section></section>
<section><h2>最后<a href="#最后"><span>#</span></a></h2><p>如果你的电视是安卓系统，开机广告和推荐内容让你烦，又不想刷机，可以先去 <code>examples/</code> 里搜一下自己的型号。有收录的话，读完那个目录里的说明和已知问题再动手。没收录也能用，助手会现场检查你的电视，只是要多花点时间确认哪些能停、哪些不能停。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://llxx.cc/posts/2026/11/astro-blog-setup-guide/</id>
      <title type="text">Astro 博客搭建全过程：从零到上线</title>
      <published>2026-11-04T12:00:00.000Z</published>
      <updated>2026-11-04T12:00:00.000Z</updated>
      <author><name>777</name></author>
      <link rel="alternate" href="https://llxx.cc/posts/2026/11/astro-blog-setup-guide/"/>
      <summary type="text">用 Astro 和 Firefly 主题搭一个个人博客：环境准备、改配置、写文章、Markdown 扩展、部署上线，以及我从 AstroPaper 迁移过来时踩到的坑。</summary>
      <content type="html"><![CDATA[<p>这个博客一开始用的是 AstroPaper，后来换成了 <a href="https://github.com/CuteLeaf/Firefly" target="_blank">Firefly</a>。这篇按现在的搭法重新写了一遍，命令和路径都是我自己跑通过的。</p>
<p>搭完你会有一个这样的博客：</p>
<ul>
<li>静态站点，构建完就是一堆 HTML，放哪都能跑</li>
<li>自带暗色模式、全文搜索、RSS、站点地图</li>
<li>文章用 Markdown 写，frontmatter 写错了构建时直接报错</li>
<li>可以部署到 Vercel、Cloudflare Pages，也可以自己用 Docker 跑</li>
</ul>
<p>需要会一点命令行，Node.js 用过就行。</p>
<section><h2>一、环境准备<a href="#一环境准备"><span>#</span></a></h2><p>Firefly 基于 Astro 7，对版本要求比较新：</p><ul>
<li><strong>Node.js 22 或更高</strong>（准确地说是 22.23 以上）</li>
<li><strong>pnpm 11 或更高</strong>，项目里有脚本强制只能用 pnpm 装依赖</li>
<li>Git</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>node</span><span> </span><span>-v</span><span>      </span><span># 低于 v22 需要升级</span></div></div><div><div><div>2</div></div><div><span>pnpm</span><span> </span><span>-v</span><span>      </span><span># 没装就 npm install -g pnpm</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>macOS 可以用 Homebrew 装 Node：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>brew</span><span> </span><span>install</span><span> </span><span>node</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>编辑器推荐 VS Code，装上 <a href="https://marketplace.visualstudio.com/items?itemName=astro-build.astro-vscode" target="_blank">Astro 官方扩展</a>，<code>.astro</code> 文件才有高亮和提示。</p></section>
<section><h2>二、创建项目<a href="#二创建项目"><span>#</span></a></h2><p>Firefly 不走 <code>pnpm create astro</code>，直接克隆仓库。建议先在 GitHub 上 Fork 一份到自己账号下，再克隆自己的那份，以后部署和同步更新都方便：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://github.com/&lt;你的用户名&gt;/Firefly.git</span><span> </span><span>my-blog</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>my-blog</span></div></div><div><div><div>3</div></div><div><span>pnpm</span><span> </span><span>install</span></div></div><div><div><div>4</div></div><div><span>pnpm</span><span> </span><span>dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>打开 <code>http://localhost:4321</code> 就能看到演示站了。</p><div><div><div></div><div>Tip</div></div><div><p><code>pnpm install</code> 会下载几个平台相关的二进制包，比如搜索用的 Pagefind，单个就有几十 MB。网络不稳的时候可能下了一半就断，pnpm 还会显示安装成功，等到 <code>pnpm build</code> 最后一步才报 <code>Failed to install either of [pagefind_extended, pagefind]</code>。遇到这种情况，删掉 <code>node_modules</code> 重装一次，或者换个网络环境再装。</p></div></div></section>
<section><h2>三、项目结构<a href="#三项目结构"><span>#</span></a></h2><p>只列出平时会动到的部分：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>my-blog/</span></div></div><div><div><div>2</div></div><div><span>├── astro.config.mjs        # Astro 配置：插件、Markdown、sitemap 等</span></div></div><div><div><div>3</div></div><div><span>├── src/</span></div></div><div><div><div>4</div></div><div><span>│   ├── config/             # 站点配置，按功能拆成很多个文件</span></div></div><div><div><div>5</div></div><div><span>│   ├── content/</span></div></div><div><div><div>6</div></div><div><span>│   │   ├── posts/          # 文章</span></div></div><div><div><div>7</div></div><div><span>│   │   └── spec/           # 关于页、友链页、留言板的正文</span></div></div><div><div><div>8</div></div><div><span>│   ├── assets/images/      # 头像、壁纸等，构建时会自动压缩</span></div></div><div><div><div>9</div></div><div><span>│   └── layouts/            # 页面布局，加统计代码、站长验证在这里</span></div></div><div><div><div>10</div></div><div><span>└── public/                 # 原样复制的静态文件，favicon 放这里</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Firefly 的配置没有塞进一个大文件，而是拆在 <code>src/config/</code> 下，最常改的几个：</p>

<table><thead><tr><th>文件</th><th>管什么</th></tr></thead><tbody><tr><td><code>siteConfig.ts</code></td><td>站点标题、域名、主题色、页面开关、文章列表样式</td></tr><tr><td><code>profileConfig.ts</code></td><td>侧边栏头像、昵称、简介、社交链接</td></tr><tr><td><code>navBarConfig.ts</code></td><td>顶部导航菜单</td></tr><tr><td><code>backgroundWallpaper.ts</code></td><td>首页横幅的壁纸、标题、副标题</td></tr><tr><td><code>sidebarConfig.ts</code></td><td>侧边栏放哪些小组件</td></tr><tr><td><code>commentConfig.ts</code></td><td>评论系统</td></tr><tr><td><code>friendsConfig.ts</code></td><td>友链列表</td></tr></tbody></table></section>
<section><h2>四、改成你自己的站<a href="#四改成你自己的站"><span>#</span></a></h2><section><h3>站点信息<a href="#站点信息"><span>#</span></a></h3><p>打开 <code>src/config/siteConfig.ts</code>，至少改这几项：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>siteConfig</span><span>:</span><span> </span><span>SiteConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>title</span><span>:</span><span> </span><span>"七号研习社"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>subtitle</span><span>:</span><span> </span><span>"记录技术、生活与思考"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>site_url</span><span>:</span><span> </span><span>"https://llxx.cc"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>description</span><span>:</span><span> </span><span>"777 的个人博客，记录技术、生活与思考。"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>timezone</span><span>:</span><span> </span><span>"Asia/Bangkok"</span><span>,</span></div></div><div><div><div>7</div></div><div><span>  </span><span>// ...</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>site_url</code> 一定要改成你的域名，RSS、sitemap 和分享卡片里的链接都靠它生成。</p><p>同一个文件顶部有个 <code>pages</code> 开关表，演示站开了一堆页面：动态、项目、相册、书签、打赏、追番等等。用不上的设成 <code>false</code>，对应的页面会返回 404，导航栏里的入口也会自动隐藏：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>pages</span><span> </span><span>=</span><span> </span><span>resolvePageToggles</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>friends</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>guestbook</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>dynamic</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>projects</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>gallery</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>7</div></div><div><span>  </span><span>booknav</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>8</div></div><div><span>  </span><span>sponsor</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>9</div></div><div><span>  </span><span>// ...</span></div></div><div><div><div>10</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>头像、图标和横幅<a href="#头像图标和横幅"><span>#</span></a></h3><ul>
<li><strong>头像</strong>：图片放到 <code>src/assets/images/</code>，在 <code>profileConfig.ts</code> 里改 <code>avatar</code></li>
<li><strong>网站图标</strong>：PNG 放到 <code>public/favicon/</code>，在 <code>siteConfig.ts</code> 的 <code>favicon</code> 里列出来。建议放一张 180×180 的，iPhone 添加到主屏幕时会用它</li>
<li><strong>首页横幅</strong>：标题、副标题和下面那排图标链接都在 <code>backgroundWallpaper.ts</code> 的 <code>homeText</code> 里</li>
</ul><p>演示站的横幅标题、社交链接、友链、关于页都是作者自己的内容，记得逐个换掉。偷懒的办法是全局搜一下 <code>cuteleaf</code> 和 <code>xiaye</code>，搜到的基本都要改。</p></section><section><h3>评论<a href="#评论"><span>#</span></a></h3><p><code>commentConfig.ts</code> 里的 <code>type</code> 默认是 <code>"none"</code>，即不开评论。支持 Twikoo、Waline、Giscus、Artalk、Disqus，想开哪个就把 <code>type</code> 改成对应的名字，再填好下面那一段配置。我这里没开。</p></section></section>
<section><h2>五、写文章<a href="#五写文章"><span>#</span></a></h2><p>文章放在 <code>src/content/posts/</code> 下，子目录会原样变成网址的一部分。我按年月放：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>src/content/posts/</span></div></div><div><div><div>2</div></div><div><span>└── 2026/</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>└── 11/</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>├── astro-blog-setup-guide.md</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>└── img/</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>└── screenshot.png</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这篇文章的地址就是 <code>/posts/2026/11/astro-blog-setup-guide/</code>。图片放在旁边的 <code>img/</code> 里，正文用相对路径 <code>![说明](./img/screenshot.png)</code> 引用，构建时会自动转成 WebP。</p><p>frontmatter 长这样：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>title</span><span>: </span><span>Hello World</span></div></div><div><div><div>3</div></div><div><span>published</span><span>: </span><span>2026-11-04T12:00:00.000Z</span></div></div><div><div><div>4</div></div><div><span>description</span><span>: </span><span>我的第一篇博客文章。</span></div></div><div><div><div>5</div></div><div><span>category</span><span>: </span><span>技术</span></div></div><div><div><div>6</div></div><div><span>tags</span><span>:</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>- </span><span>Astro</span></div></div><div><div><div>8</div></div><div><span>author</span><span>: </span><span>"777"</span></div></div><div><div><div>9</div></div><div><span>pinned</span><span>: </span><span>false</span></div></div><div><div><div>10</div></div><div><span>draft</span><span>: </span><span>false</span></div></div><div><div><div>11</div></div><div><span>---</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>几个字段说明：</p><ul>
<li><code>category</code> 只能填一个，<code>tags</code> 可以填多个。首页顶部的分类栏就是按 <code>category</code> 统计的</li>
<li><code>pinned: true</code> 会把文章置顶</li>
<li><code>draft: true</code> 是草稿，本地 <code>pnpm dev</code> 能看到，正式构建时会被排除</li>
<li><code>updated</code> 填最后修改时间，超过一定天数文章底部会提示”上次编辑于……”</li>
</ul><div><div><div></div><div>Warning</div></div><div><p>字段值是纯数字时要加引号。比如我的昵称是 777，写成 <code>author: 777</code> 会被 YAML 当成数字，构建直接报错，必须写 <code>author: "777"</code>。</p></div></div><p>也可以用脚本建文章，它会帮你生成 frontmatter：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>new-post</span><span> </span><span>2026/11/hello-world</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>六、Markdown 扩展<a href="#六markdown-扩展"><span>#</span></a></h2><p>除了标准 Markdown，Firefly 还多了几样常用的。</p><p><strong>提醒块</strong>，用的是 GitHub 的写法：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span></div></div><div><div><div>2</div></div><div><span>&gt; 普通提示。</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&gt; </span><span>[</span><span>!WARNING</span><span>]</span></div></div><div><div><div>5</div></div><div><span>&gt; 需要注意的地方。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可选的还有 <code>TIP</code>、<code>IMPORTANT</code>、<code>CAUTION</code>。上面那两个黄框就是这么写出来的。</p><p><strong>GitHub 仓库卡片</strong>，一行就能插入一个带 Star 数的卡片：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>::github{repo="CuteLeaf/Firefly"}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>代码块</strong>用的是 Expressive Code，自带复制按钮和语言标识，超过 15 行的代码默认折叠。代码块里要再嵌一个代码块时，外层改用 <code>~~~</code> 包起来就行：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>```bash</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"Hello from my blog!"</span></div></div><div><div><div>3</div></div><div><span>```</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>七、搜索、RSS 和 sitemap<a href="#七搜索rss-和-sitemap"><span>#</span></a></h2><p>这三样 Firefly 都配好了，不用另外装：</p><ul>
<li><strong>搜索</strong>：Pagefind。<code>pnpm build</code> 的最后一步会扫描生成好的 HTML，在 <code>dist/pagefind/</code> 里生成索引，搜索完全在浏览器里完成，不需要服务器</li>
<li><strong>RSS / Atom</strong>：<code>/rss.xml</code> 和 <code>/atom.xml</code></li>
<li><strong>sitemap</strong>：<code>/sitemap-index.xml</code>。在 <code>pages</code> 里关掉的页面会自动排除，其他想排除的页面可以在 <code>astro.config.mjs</code> 的 <code>sitemap({ filter })</code> 里加规则</li>
</ul></section>
<section><h2>八、加统计和站长验证<a href="#八加统计和站长验证"><span>#</span></a></h2><p>Google Analytics、Umami、Microsoft Clarity 在 <code>src/config/analyticsConfig.ts</code> 里填 ID 就行。</p><p>不在列表里的代码，比如 Google AdSense 的站点验证，直接加到 <code>src/layouts/Layout.astro</code> 的 <code>&lt;head&gt;</code> 里：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>meta</span><span> </span><span>charset</span><span>=</span><span>"UTF-8"</span><span> /&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>meta</span><span> </span><span>name</span><span>=</span><span>"google-adsense-account"</span><span> </span><span>content</span><span>=</span><span>"ca-pub-xxxxxxxxxxxxxxxx"</span><span> /&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>...</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>head</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>九、部署上线<a href="#九部署上线"><span>#</span></a></h2><p>先在本地完整构建一次，确认没有报错：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>build</span><span>     </span><span># 输出到 dist/</span></div></div><div><div><div>2</div></div><div><span>pnpm</span><span> </span><span>preview</span><span>   </span><span># 在 localhost:4321 预览构建结果</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>方案一：Vercel / Netlify / Cloudflare Pages<a href="#方案一vercel--netlify--cloudflare-pages"><span>#</span></a></h3><p>最省事。代码推到 GitHub，在平台上导入仓库，填两个命令：</p><ul>
<li>安装命令：<code>pnpm install</code></li>
<li>构建命令：<code>pnpm build</code></li>
<li>输出目录：<code>dist</code></li>
</ul><p>之后每次 push 都会自动重新部署。Firefly 自带了 <code>vercel.json</code>，用 Vercel 的话连这几项都不用填。</p></section><section><h3>方案二：Docker + Nginx<a href="#方案二docker--nginx"><span>#</span></a></h3><p>有自己的服务器的话，用多阶段构建：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>FROM</span><span> node:lts </span><span>AS</span><span> base</span></div></div><div><div><div>2</div></div><div><span>WORKDIR</span><span> /app</span></div></div><div><div><div>3</div></div><div><span>RUN</span><span> corepack enable &amp;&amp; corepack prepare pnpm@latest --activate</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>COPY</span><span> package.json pnpm-lock.yaml ./</span></div></div><div><div><div>6</div></div><div><span>RUN</span><span> pnpm install --frozen-lockfile</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>COPY</span><span> . .</span></div></div><div><div><div>9</div></div><div><span>RUN</span><span> pnpm run build</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>FROM</span><span> nginx:mainline-alpine-slim</span></div></div><div><div><div>12</div></div><div><span>COPY</span><span> --from=base /app/dist /usr/share/nginx/html</span></div></div><div><div><div>13</div></div><div><span>EXPOSE</span><span> 80</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>build</span><span> </span><span>-t</span><span> </span><span>my-blog</span><span> </span><span>.</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>-p</span><span> </span><span>80:80</span><span> </span><span>--restart</span><span> </span><span>unless-stopped</span><span> </span><span>my-blog</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>十、从 AstroPaper 迁移过来要注意什么<a href="#十从-astropaper-迁移过来要注意什么"><span>#</span></a></h2><p>如果你和我一样是从别的 Astro 主题换过来的，这几件事要留意：</p><ol>
<li><strong>frontmatter 字段名不一样</strong>。AstroPaper 的 <code>pubDatetime</code>、<code>modDatetime</code>、<code>featured</code>、<code>ogImage</code>，在 Firefly 里分别是 <code>published</code>、<code>updated</code>、<code>pinned</code>、<code>image</code>，另外多了一个 <code>category</code>。文章多的话写个小脚本批量替换，正文不要动</li>
<li><strong>文章目录换了</strong>。从 <code>src/data/blog/</code> 挪到 <code>src/content/posts/</code>，子目录结构保持不变的话，文章网址也不会变，搜索引擎收录和别人引用的链接都不会失效</li>
<li><strong>演示内容很多</strong>。看板娘模型、音乐播放器、示例公告、作者自己的友链和打赏链接，都要手动关掉或删掉。光 <code>public/pio/</code> 里的看板娘模型就有 15 MB，不用的话直接删</li>
<li><strong>评论数据和路径绑定</strong>。Twikoo 这类评论系统按页面路径存评论，路径一变，旧评论就对不上了</li>
</ol></section>
<section><h2>日常写作流程<a href="#日常写作流程"><span>#</span></a></h2><p>搭好以后，平时写文章就是：</p><ol>
<li><code>pnpm new-post 2026/11/文章名</code> 新建文件</li>
<li>填好 frontmatter，写正文</li>
<li><code>pnpm dev</code> 本地看效果</li>
<li>提交、push，等自动部署</li>
</ol><p>搭博客本身花不了多少时间，花时间的是把演示站的东西一点点换成自己的，还有之后能不能坚持写下去。</p></section>]]></content>
    </entry>
</feed>
