<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>by三生の博客</title><description> (∠・ω&lt; )⌒☆</description><link>https://bysansheng.cn/</link><language>zh_CN</language><item><title>搜图教程</title><link>https://bysansheng.cn/posts/%E6%90%9C%E5%9B%BE%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E6%90%9C%E5%9B%BE%E6%95%99%E7%A8%8B/</guid><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1、正文&lt;/h2&gt;
&lt;p&gt;在互联网上，有许多人可以仅仅通过一张图片，就帮人找到出处和来源，他们被大家称为 —— hero。想要成为一名 hero，就得学会如何&lt;strong&gt;以图搜图&lt;/strong&gt;（以下简称“搜图”），提升自己的战斗力。&lt;/p&gt;
&lt;p&gt;本文会介绍有关搜图的大体思路，以及列举一些我所收集到的相关工具。其实，搜图的本质，是借助不同的互联网工具，去串联起一条条互联网信息，并向上追溯其源头。所以搜图本身并不是多么高深的技术，其根本也不过是对于工具的运用罢了。就像远古社会使用石制工具，奴隶社会使用青铜工具一样，都是平平无奇的事情，只是工具的优劣有所不同。&lt;/p&gt;
&lt;p&gt;搜图本身并没有什么好写的，不过是把图片丢进搜图工具里就行了，要强调的，无非是注意使用时的不同情况而已。图片分为完整与残缺两种状态。&lt;strong&gt;完整&lt;/strong&gt;的图片不必多说，根据类别丢进相应的工具里，普通图片可以使用 &lt;a href=&quot;#21google&quot;&gt;Google&lt;/a&gt; 进行搜索，二次元图片使用 &lt;a href=&quot;#23saucenao&quot;&gt;Saucenao&lt;/a&gt; 或 &lt;a href=&quot;#24tracemoe&quot;&gt;trace.moe&lt;/a&gt; 来搜索。而&lt;strong&gt;残缺&lt;/strong&gt;的图片就麻烦一点了，要先尝试不同的工具去获取原图，这里推荐使用 &lt;a href=&quot;#22yandex&quot;&gt;Yandex&lt;/a&gt; 来搜索原图，然后再根据「搜索完整图片的方法」去走一遍搜索流程。最后，如果还是搜索不到，只能将我列举出来的相关工具挨个试一遍了。实在走投无路的话，也可以试试百度和必应，或许有奇效也说不定。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%B5%81%E7%A8%8B%E5%9B%BE.png&quot; alt=&quot;流程图&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、相关工具&lt;/h2&gt;
&lt;h3&gt;2.1、Google&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://www.google.com&quot;&gt;https://www.google.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google 作为全球知名的互联网公司之一，其产品并不需要过多介绍，本身就是行业内的佼佼者。大多数公司的搜索引擎都有搜图功能，例如百度、必应一类的，但都不如 Google 搜图来得好用，虽然经过斯诺登事件后，其能力大大不如从前，但依旧可以在矮子里面拔高个。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看如何开启 Google 搜图的完全体&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;打开 Google，进入 &lt;code&gt;Settings &amp;gt; Search settings&lt;/code&gt;，点击 &lt;code&gt;SafeSearch&lt;/code&gt;，然后选择 &lt;code&gt;Off&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Google-%E5%BC%80%E5%90%AF%E5%AE%8C%E5%85%A8%E4%BD%93-1.png&quot; alt=&quot;Google-开启完全体-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Google-%E5%BC%80%E5%90%AF%E5%AE%8C%E5%85%A8%E4%BD%93-2.png&quot; alt=&quot;Google-开启完全体-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Google-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;Google-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Google-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;Google-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、Yandex&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://yandex.com&quot;&gt;https://yandex.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果要说有什么工具，可以和 Google 搜图进行互补，那应该就只有 Yandex 了。作为一款来自俄罗斯的搜索引擎，它也是非常优秀的，哪怕不是用来搜图，也是一款很好用的搜索工具。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看如何开启 Yandex 搜图的完全体&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;打开 Yandex，进入 &lt;code&gt;Settings &amp;gt; Location&lt;/code&gt;，更改地址为中国大陆以外的地区，如 &lt;code&gt;Tokyo&lt;/code&gt;，再点击 &lt;code&gt;Save&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Yandex-%E5%BC%80%E5%90%AF%E5%AE%8C%E5%85%A8%E4%BD%93-1.png&quot; alt=&quot;Yandex-开启完全体-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后进入 &lt;code&gt;Settings &amp;gt; Search&lt;/code&gt;，修改 &lt;code&gt;Filter search results&lt;/code&gt; 为 &lt;code&gt;No filter&lt;/code&gt;，再点击 &lt;code&gt;Save&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Yandex-%E5%BC%80%E5%90%AF%E5%AE%8C%E5%85%A8%E4%BD%93-2.png&quot; alt=&quot;Yandex-开启完全体-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Yandex-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;Yandex-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Yandex-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;Yandex-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、Saucenao&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://saucenao.com&quot;&gt;https://saucenao.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saucenao 是针对&lt;strong&gt;二次元&lt;/strong&gt;图片的搜索工具，可以搜索例如漫画、插画、动漫等相关图片，但是对于图片完整性有一定要求，如果有残缺的话可能无法精准识别。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Saucenao-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;Saucenao-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Saucenao-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;Saucenao-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、trace.moe&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://trace.moe&quot;&gt;https://trace.moe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;trace.moe 的战斗力跟 Saucenao 大差不差，也是针对&lt;strong&gt;二次元&lt;/strong&gt;的，不过多了一个独特的功能，就是可以定位动漫画面出现的时间点，甚至精确到秒，而且包括刚上映的剧场版和刚发售的 OVA。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/trace.moe-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;trace.moe-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/trace.moe-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;trace.moe-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、Ascii2d&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://ascii2d.net&quot;&gt;https://ascii2d.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ascii2d 适用于搜索各种场合的漫画、插画等，包括残缺的图片也可以使用，主要用来搜索 pixiv、twitter 的作品，可作为 &lt;a href=&quot;#23saucenao&quot;&gt;Saucenao&lt;/a&gt; 和 &lt;a href=&quot;#24tracemoe&quot;&gt;trace.moe&lt;/a&gt; 的备选&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Ascii2d-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;Ascii2d-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Ascii2d-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;Ascii2d-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.6、搜图 Bot&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://soutubot.moe&quot;&gt;https://soutubot.moe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个工具适合搜索各种残缺的漫画，主要是针对 NHentai、EHentai 的作品，不过无法搜索到 pixiv、twitter 的作品，比较适合特定情况。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/soutubot-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;soutubot-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/soutubot-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;soutubot-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.7、IQDB&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://iqdb.org&quot;&gt;https://iqdb.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是多个搜图工具的聚合，虽然应该说是「集百家之长于一身」，不过就我实际体验来说并不是很好。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/iqdb-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;iqdb-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/iqdb-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;iqdb-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.8、TinEye&lt;/h3&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://tineye.com&quot;&gt;https://tineye.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TinEye 是老牌的以图搜图工具，不过也并不算过时，适合用来查找图片的早期发布记录。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;&amp;lt;u&amp;gt;点击查看示例图片&amp;lt;/u&amp;gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/TinEye-%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;TinEye-示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/TinEye-%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;TinEye-示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Homepage 部署教程：个性化导航页</title><link>https://bysansheng.cn/posts/homepage-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/homepage-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Homepage 是一款高度个性化的用于自建导航页的工具，特别是对于 NAS 而言尤其好用，不仅可以避免被迫去记住各项服务的端口，就算只是充当网页书签也是很方便的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Homepage&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/homepage/{icons,images}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/homepage/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - 54300:3000
    volumes:
      - ./:/app/config
      - ./icons:/app/public/icons
      - ./images:/app/public/images
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - PUID=0
      - PGID=0
      - HOMEPAGE_ALLOWED_HOSTS=*
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Homepage&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 54300
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:54300&lt;/code&gt; 访问 Homepage 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Homepage&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改配置&lt;/h2&gt;
&lt;h3&gt;3.1、配置介绍&lt;/h3&gt;
&lt;p&gt;第一次打开 Homepage 的 Web 页面，会自动生成如下的目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;path&amp;gt;/homepage/
├── logs
│   └── homepage.log
├── bookmarks.yaml
├── custom.css
├── custom.js
├── services.yaml
├── settings.yaml
└── widgets.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bookmarks.yaml&lt;/code&gt; &lt;a href=&quot;#35%E4%B9%A6%E7%AD%BE%E9%85%8D%E7%BD%AE&quot;&gt;书签配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;custom.css&lt;/code&gt; 自定义 CSS&lt;/li&gt;
&lt;li&gt;&lt;code&gt;custom.js&lt;/code&gt; &lt;a href=&quot;#36%E8%87%AA%E5%AE%9A%E4%B9%89-js&quot;&gt;自定义 JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;services.yaml&lt;/code&gt; &lt;a href=&quot;#33%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE&quot;&gt;服务配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;settings.yaml&lt;/code&gt; &lt;a href=&quot;#32%E5%85%A8%E5%B1%80%E8%AE%BE%E7%BD%AE&quot;&gt;全局设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;widgets.yaml&lt;/code&gt; &lt;a href=&quot;#34%E9%83%A8%E4%BB%B6%E9%85%8D%E7%BD%AE&quot;&gt;部件配置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、全局设置&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;settings.yaml&lt;/code&gt; 是用来控制页面的整体外观和行为的，可配置主题、背景和布局样式等。&lt;/p&gt;
&lt;p&gt;具体可以前往 &lt;a href=&quot;https://gethomepage.dev/configs/settings&quot;&gt;https://gethomepage.dev/configs/settings&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano settings.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 请自行替换成个人实际的网站标题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;title: &amp;lt;name&amp;gt; # 网站标题
language: zh-CN # 网站语言
hideVersion: true # 隐藏版本号
background:
  image: /images/background.png # 背景图片
  blur: xs  # 模糊程度（xs, sm, md, lg, xl, 2xl, 3xl, none）
  saturate: 100  # 饱和度
  brightness: 50  # 亮度
  opacity: 20  # 不透明度
headerStyle: clean # 头部样式
color: neutral # 颜色
theme: dark # 主题
useEqualHeights: true # 使用等高卡片

layout:
  NAS-SERVER:
    style: row
    columns: 3
  NAS-OTHER:
    style: row
    columns: 5
  BOOKMARKS:
    style: row
    columns: 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h3&gt;* 3.2.1、layout&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;layout&lt;/code&gt; 是用来处理各项服务的布局的，如 &lt;code&gt;style: row&lt;/code&gt; 是行布局，&lt;code&gt;style: column&lt;/code&gt; 是列布局，而 &lt;code&gt;columns&lt;/code&gt; 则可以控制行或列的服务数量。&lt;/p&gt;
&lt;p&gt;例如以下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;layout:
  NAS-SERVER:
    style: row
    columns: 3
  NAS-OTHER:
    style: row
    columns: 5
  BOOKMARKS:
    style: row
    columns: 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示效果为：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/layout.png&quot; alt=&quot;layout&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、服务配置&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;services.yaml&lt;/code&gt; 是用来定义要监控的各项服务的，每个服务可配置图标、链接、描述和小部件等。&lt;/p&gt;
&lt;p&gt;具体格式可以前往 &lt;a href=&quot;https://gethomepage.dev/configs/services&quot;&gt;https://gethomepage.dev/configs/services&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;p&gt;配置服务组件可以前往 &lt;a href=&quot;https://gethomepage.dev/widgets&quot;&gt;https://gethomepage.dev/widgets&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano services.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中可以自行添加或修改各项服务&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- NAS-SERVER:
    - Emby:
        icon: /icons/emby.png
        href: http://&amp;lt;location&amp;gt;:48096
        description: 媒体服务器
        widget:
            type: emby
            url: http://172.17.0.1:48096
            key: &amp;lt;key&amp;gt;
            enableBlocks: true
            enableNowPlaying: false
            expandOneStreamToTwoRows: false

- NAS-OTHER:
    - openlist:
        icon: /icons/openlist.png
        href: https://&amp;lt;safe_location&amp;gt;:45244
        description: 文件列表工具

    - pairdrop:
        icon: /icons/pairdrop.png
        href: http://&amp;lt;location&amp;gt;:43049
        description: 文件互传工具

- BOOKMARKS:
    - github:
        icon: /icons/github.png
        href: https://github.com

    - bilibili:
        icon: /icons/bilibili.ico
        href: https://www.bilibili.com

    - youtube:
        icon: /icons/youtube.png
        href: https://www.youtube.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;* 3.3.1、icons&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;icon&lt;/code&gt; 是用来配置图标的，不仅可以使用相对路径，也可以使用图片链接。&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- Group A:
    - Service A:
        icon: /icons/xxx.png

    - Service B:
        icon: https://xxx.com/favicon.ico
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而且 Home­page 还内置了 &lt;a href=&quot;https://github.com/homarr-labs/dashboard-icons&quot;&gt;Dashboard Icons&lt;/a&gt; 项目，可以直接使用该项目提供的图标&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- Group A:
    - Emby:
        icon: emby.png
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4、部件配置&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;widgets.yaml&lt;/code&gt; 主要是用来修改一些页面部件的，比如系统状况、搜索框、天气和时间等。&lt;/p&gt;
&lt;p&gt;具体可以前往 &lt;a href=&quot;https://gethomepage.dev/configs/info-widgets&quot;&gt;https://gethomepage.dev/configs/info-widgets&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano widgets.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- resources:
    cpu: true
    memory: true

- search:
    provider: google
    target: _blank
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5、书签配置&lt;/h3&gt;
&lt;p&gt;说实话，我并不是很建议使用 Homepage 的书签，因为不好看，不如在&lt;a href=&quot;#33%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE&quot;&gt;服务配置&lt;/a&gt;里进行修改与添加，所以还是直接清空了的好。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &apos;&amp;gt; bookmarks.yaml&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.6、自定义 JS&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;custom.js&lt;/code&gt; 主要是用来扩展功能的，满足不同用户的个性化需求。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano custom.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const currentDomain = window.location.hostname;
const safeDomain = /^(\d{1,3}\.){3}\d{1,3}$/.test(currentDomain) ? currentDomain : `safe.${currentDomain}`;

document.querySelectorAll(&apos;a[rel=&quot;noreferrer&quot;]&apos;).forEach(link =&amp;gt; {
    const href = link.href;
    
    if (href.includes(&apos;&amp;lt;location&amp;gt;&apos;)) {
        link.href = href.replace(&apos;&amp;lt;location&amp;gt;&apos;, currentDomain);
    } else if (href.includes(&apos;&amp;lt;safe_location&amp;gt;&apos;)) {
        link.href = href.replace(&apos;&amp;lt;safe_location&amp;gt;&apos;, safeDomain);
    }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段 js 代码可以实现，自适应「&lt;strong&gt;公网域名&lt;/strong&gt;」和「&lt;strong&gt;内网IP&lt;/strong&gt;」访问 NAS 不同端口的服务。&lt;/p&gt;
&lt;p&gt;假如，你有一台 NAS，它 DDNS 后的「&lt;strong&gt;公网域名&lt;/strong&gt;」是 &lt;code&gt;example.com&lt;/code&gt;，它的「&lt;strong&gt;内网IP&lt;/strong&gt;」是 &lt;code&gt;192.168.1.151&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;当你使用 &lt;code&gt;example.com:54300&lt;/code&gt; 访问 Homepage 时，服务配置里的 &lt;code&gt;&amp;lt;location&amp;gt;&lt;/code&gt; 就会解析成 &lt;code&gt;example.com&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://&amp;lt;location&amp;gt;:43049
=&amp;gt; http://example.com:43049

https://&amp;lt;safe_location&amp;gt;:45244
=&amp;gt; https://safe.example.com:45244
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当你使用 &lt;code&gt;192.168.1.151:54300&lt;/code&gt; 访问 Homepage 时，服务配置里的 &lt;code&gt;&amp;lt;location&amp;gt;&lt;/code&gt; 就会解析成 &lt;code&gt;192.168.1.151&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://&amp;lt;location&amp;gt;:43049
=&amp;gt; http://192.168.1.151:43049

https://&amp;lt;safe_location&amp;gt;:45244
=&amp;gt; https://192.168.1.151:45244
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Emby 部署教程：拥有属于自己的媒体库</title><link>https://bysansheng.cn/posts/emby-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/emby-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;对于 NAS 玩家而言，主流的自建媒体库项目大概有三个：Emby，Plex，Jel­lyfin。这三个项目都各有优缺点，也各有不同，不过总体来说都是很好的项目。&lt;/p&gt;
&lt;p&gt;我个人的选择是 Emby，倒不是因为它有什么特别的，只不过它是我第一个接触到的而已，而且它也很能满足我目前的需求。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Emby&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/emby/config/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/emby/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;media_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;媒体库&lt;/strong&gt;路径&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;media_mount&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;媒体库&lt;/strong&gt;挂载点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  emby:
    image: emby/embyserver:latest
    container_name: emby
    ports:
      - 48096:8096
    environment:
      - UID=0
      - GID=0
      - UMASK=000
    volumes:
      - ./config:/config
      - &amp;lt;media_path&amp;gt;:&amp;lt;media_mount&amp;gt;
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  emby:
    image: emby/embyserver:latest
    container_name: emby
    ports:
      - 48096:8096
    environment:
      - UID=0
      - GID=0
      - UMASK=000
      - HTTP_PROXY=http://172.17.0.1:8118
      - HTTPS_PROXY=http://172.17.0.1:8118
      - NO_PROXY=localhost,127.0.0.1
    volumes:
      - ./config:/config
      - &amp;lt;media_path&amp;gt;:&amp;lt;media_mount&amp;gt;
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Emby&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 48096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:48096&lt;/code&gt; 访问 Emby 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Emby&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、媒体库的添加&lt;/h2&gt;
&lt;p&gt;要进行媒体库的添加，请打开 Emby 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 媒体库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;新增媒体库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A01.png&quot; alt=&quot;媒体库的添加1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后根据自己的喜好进行配置&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A02.png&quot; alt=&quot;媒体库的添加2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A03.png&quot; alt=&quot;媒体库的添加3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A04.png&quot; alt=&quot;媒体库的添加4&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
个人建议关闭字幕的刮削&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A05.png&quot; alt=&quot;媒体库的添加5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、Premiere 的开启&lt;/h2&gt;
&lt;p&gt;关于 Emby 的 Premiere，我个人觉得没有必要去原价购买，太不划算了，所以我是在闲鱼上跟人拼了五人车，算下来大概一百来块。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果你也选择拼车，请先擦亮眼睛，防止被骗。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要进行 Premiere 的开启，请打开 Emby 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; Emby Premiere&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;Emby Premiere 秘钥&lt;/code&gt; 填入你的 key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Premiere-%E7%9A%84%E5%BC%80%E5%90%AF.png&quot; alt=&quot;Premiere-的开启&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、硬件解码的配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
想要开启硬件解码，需要先获取 &lt;a href=&quot;#3premiere-%E7%9A%84%E5%BC%80%E5%90%AF&quot;&gt;Premiere&lt;/a&gt;，并且确保当前设备可以正常使用核显或独显。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要进行硬件解码的配置，请打开 Emby 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 正在转码&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;启用硬件加速（如果可用）&lt;/code&gt; 中选择 &lt;code&gt;高级&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81%E7%9A%84%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;硬件解码的配置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6、CSS 自定义&lt;/h2&gt;
&lt;p&gt;我个人对于 Emby 的 UI 接受度还行，反正也不丑，之所以要自定义 CSS，还是因为 Emby 那该死的推荐机制。&lt;/p&gt;
&lt;p&gt;我的 Emby 中存在两个媒体库，一个是电影，一个是里番，它们存储的元数据都是单独影片的格式。Emby 有个推荐功能（没有关闭选项），当我打开电影分区时，下面的推荐竟然出现了里番的影片（不要问我经历了什么），天知道它为什么会跨媒体库进行影片推荐，既然 Emby 当前不支持修改推荐功能，只好从 CSS 方面下手给它全关了。&lt;/p&gt;
&lt;p&gt;要进行 CSS 自定义，请打开 Emby 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 通用&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;自定义 CSS&lt;/code&gt; 中添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.suggestions {
    display: none !important;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image/CSS-%E8%87%AA%E5%AE%9A%E4%B9%89.png&quot; alt=&quot;CSS-自定义&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>SillyTavern 部署教程：自建 AI 角色扮演平台</title><link>https://bysansheng.cn/posts/sillytavern-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/sillytavern-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;SillyTavern（简称 ST，也称傻酒馆）是一个可接入众多 LLM API 的角色扮演平台，它有着图像生成集成、TTS、世界书、自动翻译和可自定义的 UI 等一系列功能，并且可以借助丰富的第三方扩展，实现无限的功能延展与进化。它以 Node.js 20 作为底层，对于硬件的要求极低，同时有着庞大的社区支持，对于 AI 爱好者而言，是一款极为强大且优秀的工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;前言示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;前言示例-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 SillyTavern&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/silly_tavern/{config,data,plugins,extensions} &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/silly_tavern/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  sillytavern:
    container_name: sillytavern
    image: ghcr.io/sillytavern/sillytavern:latest
    environment:
      - NODE_ENV=production
      - FORCE_COLOR=1
      - SILLYTAVERN_HEARTBEATINTERVAL=30
      - TZ=Asia/Shanghai
    ports:
      - &quot;41595:8000&quot;
    volumes:
      - &quot;./config:/home/node/app/config&quot;
      - &quot;./data:/home/node/app/data&quot;
      - &quot;./plugins:/home/node/app/plugins&quot;
      - &quot;./extensions:/home/node/app/public/scripts/extensions/third-party&quot;
    healthcheck:
      test: [&quot;CMD&quot;, &quot;node&quot;, &quot;src/healthcheck.js&quot;]
      interval: 30s
      timeout: 10s
      start_period: 20s
      retries: 3
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、修改 config 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 请自行替换成个人实际用户名&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际密码&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;proxy_url&amp;gt;&lt;/code&gt; 请自行替换成实际代理接口&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d &amp;amp;&amp;amp; sudo nano ./config/config.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;listen: true

whitelistMode: false
enableForwardedWhitelist: false
whitelistDockerHosts: false

basicAuthMode: true
basicAuthUser:
  username: &quot;&amp;lt;username&amp;gt;&quot;
  password: &quot;&amp;lt;password&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;requestProxy:
  enabled: true
  url: &quot;&amp;lt;proxy_url&amp;gt;&quot; # 例如 &quot;socks5://172.17.0.1:1080&quot;
  bypass:
    - localhost
    - 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、重启 SillyTavern&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 41595
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:41595&lt;/code&gt; 访问 SillyTavern 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、关闭 SillyTavern&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、初始配置&lt;/h2&gt;
&lt;h3&gt;3.1、设置「语言」和「用户名」&lt;/h3&gt;
&lt;p&gt;第一次打开 SillyTavern 的 Web 页面时，可以立即设置 &lt;code&gt;语言&lt;/code&gt; 与 &lt;code&gt;用户名&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE-1.png&quot; alt=&quot;初始配置-1&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、接入模型API&lt;/h3&gt;
&lt;p&gt;打开 SillyTavern 的 Web 页面，进入 &lt;code&gt;主页 &amp;gt; API 连接&lt;/code&gt;，自行填入相关信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE-2.png&quot; alt=&quot;初始配置-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、开启自动翻译&lt;/h3&gt;
&lt;p&gt;在使用 SillyTavern 时，可能会遇到 &lt;strong&gt;角色卡&lt;/strong&gt; 或 &lt;strong&gt;模型&lt;/strong&gt; 是以英文为主的，这时候就需要开启自动翻译，为自己营造更好的使用体验。&lt;/p&gt;
&lt;p&gt;请注意，有些翻译服务的提供商可能需要网络代理才能成功连接，可以&lt;a href=&quot;#23%E4%BF%AE%E6%94%B9-config-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&quot;&gt;参照上文&lt;/a&gt;自行添加代理。&lt;/p&gt;
&lt;p&gt;打开 SillyTavern 的 Web 页面，进入 &lt;code&gt;主页 &amp;gt; 扩展程序 &amp;gt; 聊天翻译&lt;/code&gt;，自行填入相关信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE-3.png&quot; alt=&quot;初始配置-3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、获取与导入「角色卡」&lt;/h2&gt;
&lt;p&gt;要获取角色卡，可以使用下面的 &lt;a href=&quot;#%E8%A7%92%E8%89%B2%E5%8D%A1%E8%B5%84%E6%BA%90%E7%AB%99%E7%82%B9&quot;&gt;&lt;strong&gt;角色卡资源站点&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后打开 SillyTavern 的 Web 页面，进入 &lt;code&gt;主页 &amp;gt; 角色管理&lt;/code&gt;，自行导入相关文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E8%A7%92%E8%89%B2%E5%8D%A1.png&quot; alt=&quot;导入角色卡&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4.1、角色卡 json 结构&lt;/h3&gt;
&lt;p&gt;如果寻找不到自己喜欢的角色卡，也可以将下面的 &lt;strong&gt;角色卡 json 结构&lt;/strong&gt; 喂给 AI，让 AI 根据自己的需求去生成一张角色卡&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;spec&quot;: &quot;chara_card_v2&quot;,
  &quot;spec_version&quot;: &quot;2.0&quot;,
  &quot;data&quot;: {
    &quot;name&quot;: &quot;角色名称&quot;,
    &quot;description&quot;: &quot;角色描述&quot;,
    &quot;personality&quot;: &quot;个性特征&quot;,
    &quot;scenario&quot;: &quot;场景设定&quot;,
    &quot;first_mes&quot;: &quot;首条消息&quot;,
    &quot;mes_example&quot;: &quot;对话示例&quot;,
    &quot;creator_notes&quot;: &quot;创作者注释&quot;,
    &quot;system_prompt&quot;: &quot;系统提示&quot;,
    &quot;post_history_instructions&quot;: &quot;历史处理指令&quot;,
    &quot;alternate_greetings&quot;: [&quot;替代问候语&quot;],
    &quot;tags&quot;: [&quot;标签&quot;]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、修改 UI 主题&lt;/h2&gt;
&lt;p&gt;在我看来，原生的 SillyTavern 主题并不够现代化，甚至可以说有些许丑陋。&lt;/p&gt;
&lt;p&gt;这时候，一个优雅、美观的 UI 主题，就可以很好地提升使用体验。&lt;/p&gt;
&lt;p&gt;在此，我推荐 &lt;strong&gt;MoonlitEchoesTheme&lt;/strong&gt; 这个主题，它扁平，简约，又极为现代化，至少在我看来还不错。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;RivelleDays/SillyTavern-MoonlitEchoesTheme&quot;}&lt;/p&gt;
&lt;p&gt;另外，还有一个官方扩展，名字叫 &lt;strong&gt;TopInfoBar&lt;/strong&gt;，可以在聊天窗口顶部添加一个快捷栏，以&lt;em&gt;支持快速切换聊天&lt;/em&gt;、&lt;em&gt;搜索消息关键字&lt;/em&gt;等功能，在这里一并推荐。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;SillyTavern/Extension-TopInfoBar&quot;}&lt;/p&gt;
&lt;h3&gt;5.1、安装 UI 扩展&lt;/h3&gt;
&lt;p&gt;打开 SillyTavern 的 Web 页面，进入 &lt;code&gt;主页 &amp;gt; 扩展程序&lt;/code&gt;，选择 &lt;code&gt;安装扩展程序&lt;/code&gt;，然后填入以下 &lt;strong&gt;Git URL&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/RivelleDays/SillyTavern-MoonlitEchoesTheme
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/SillyTavern/Extension-TopInfoBar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后点击 &lt;code&gt;给所有人安装&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9UI%E4%B8%BB%E9%A2%98-1.png&quot; alt=&quot;修改UI主题-1&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.2、修改 config 的缩图设置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./config/config.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;thumbnails:
  enabled: true
  format: png
  quality: 100
  dimensions:
    bg:
      - 240
      - 135
    avatar:
      - 864
      - 1280
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改后重启 SillyTavern&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -rf ./data/default-user/thumbnails &amp;amp;&amp;amp; docker compose restart
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;5.3、导入主题文件&lt;/h3&gt;
&lt;p&gt;最后进入 &lt;code&gt;主页 &amp;gt; 用户设置&lt;/code&gt;，导入下面的两个 &lt;strong&gt;主题文件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RivelleDays/SillyTavern-MoonlitEchoesTheme/blob/main/theme/Glimmer%20-%20by%20Rivelle.json&quot;&gt;Glimmer - by Rivelle.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RivelleDays/SillyTavern-MoonlitEchoesTheme/blob/main/theme/%5BMoonlit%5D%20Glimmer%20-%20by%20Rivelle.json&quot;&gt;[Moonlit] Glimmer - by Rivelle.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9UI%E4%B8%BB%E9%A2%98-2.png&quot; alt=&quot;修改UI主题-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.4、主题设定&lt;/h3&gt;
&lt;p&gt;做完以上的准备，还需要根据自己的喜好，去完成最后主题的设定，这里我放上个人的 &lt;strong&gt;主题设定&lt;/strong&gt; 以供参考。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9UI%E4%B8%BB%E9%A2%98-3.png&quot; alt=&quot;修改UI主题-3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;角色卡资源站点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chub.ai/&quot;&gt;chub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aicharactercards.com/&quot;&gt;ai-character-cards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://character-tavern.com/&quot;&gt;character-tavern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>VERT 部署教程：自建文件格式转换工具</title><link>https://bysansheng.cn/posts/vert-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/vert-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在日常生活中，我们常常需要进行文件格式的转换。大多数人会直接搜索并使用在线工具网站，但这些网站往往广告繁多，且对私密文件的安全性缺乏保障。&lt;/p&gt;
&lt;p&gt;而 VERT 则是一个不错的解决方案。作为新一代开源文件转换器，它支持完全本地化部署在私人服务器上，让用户可以随时随地进行高效安全的文件格式转换。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 VERT&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/vert/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/vert/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  vert:
    image: ghcr.io/vert-sh/vert:latest
    container_name: vert
    ports:
      - 43279:80
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 VERT&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43279
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43279&lt;/code&gt; 访问 VERT 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 VERT&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改样式&lt;/h2&gt;
&lt;p&gt;修改样式的目的是为了删除 VERT 的 about 页面，以及修改一些我认为没那么好的中文适配。&lt;/p&gt;
&lt;p&gt;原版：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F-1.png&quot; alt=&quot;修改样式-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;修改：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F-2.png&quot; alt=&quot;修改样式-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;获取 CSS 文件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it vert find / -type f -name &quot;0*.css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;提取 CSS 文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;css_filename&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取的 CSS 文件名，例如 &lt;code&gt;0.CbWlcZGF.css&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;docker cp vert:/usr/share/nginx/html/_app/immutable/assets/&amp;lt;css_filename&amp;gt; ./0.css
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;修改 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano 0.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

footer, .justify-end:has(&amp;gt; .bg-accent-pink), a[href=&quot;/about/&quot;] { display: none !important; }
.md\:max-w-\[6\.5rem\] { max-width: 15rem !important; }
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;注入 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  vert:
    image: ghcr.io/vert-sh/vert:latest
    container_name: vert
    ports:
      - 43279:80
    volumes:
      - ./0.css:/usr/share/nginx/html/_app/immutable/assets/&amp;lt;css_filename&amp;gt;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;重启 VERT&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>PanSou 部署教程：自建网盘资源搜索工具</title><link>https://bysansheng.cn/posts/pansou-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/pansou-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;PanSou 是一款高性能的「网盘资源」搜索工具，支持 &lt;strong&gt;TG频道&lt;/strong&gt; 和 &lt;strong&gt;插件搜索&lt;/strong&gt;。系统设计以性能和可扩展性为核心，并且支持多频道多插件并发搜索，以及结果的智能排序和网盘类型分类。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 PanSou&lt;/h2&gt;
&lt;p&gt;考虑到 PanSou 的 &lt;strong&gt;环境变量&lt;/strong&gt; 过多，所以在此放出原项目地址，有需要的可以自行查看&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;fish2018/pansou&quot;}&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/pansou/data/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/pansou/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 config.env 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano config.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 插件配置
ENABLED_PLUGINS=labi,zhizhen,shandian,duoduo,muou,wanou,hunhepan,jikepan,panwiki,pansearch,panta,qupansou,hdr4k,pan666,susu,thepiratebay,xuexizhinan,panyq,ouge,huban,cyg,erxiao,miaoso,fox4k,pianku,clmao,wuji,cldi,xiaozhang,libvio,leijing,xb6v,xys,ddys,hdmoli,clxiong,jutoushe,sdso,xiaoji,xdyh,haisou,bixin,djgou,nyaa,xinjuc,aikanzy,qupanshe,xdpan,discourse,yunsou,ahhhhfs,nsgame,quark4k,quarksoo,sousou,ash,feikuai,kkmao,alupan,ypfxw,mikuclub,daishudj,dyyj,meitizy,jsnoteclub,mizixing,lou1,yiove,zxzj,qingying,kkv

# Telegram频道配置
CHANNELS=tgsearchers4,Aliyun_4K_Movies,bdbdndn11,yunpanx,bsbdbfjfjff,yp123pan,sbsbsnsqq,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,PanjClub,kkxlzy,baicaoZY,MCPH01,MCPH02,MCPH03,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,ucwpzy,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,ydypzyfx,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,qixingzhenren,taoxgzy,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,leoziyuan,Q_dongman,yoyokuakeduanju,TG654TG,WFYSFX02,QukanMovie,yeqingjie_GJG666,movielover8888_film3,Baidu_netdisk,D_wusun,FLMdongtianfudi,KaiPanshare,QQZYDAPP,rjyxfx,PikPak_Share_Channel,btzhi,newproductsourcing,cctv1211,duan_ju,QuarkFree,yunpanNB,kkdj001,xxzlzn,pxyunpanxunlei,jxwpzy,kuakedongman,liangxingzhinan,xiangnikanj,solidsexydoll,guoman4K,zdqxm,kduanju,cilidianying,CBduanju,SharePanFilms,dzsgx,BooksRealm,Oscar_4Kmovies,douerpan,baidu_yppan,Q_jilupian,Netdisk_Movies,yunpanquark,ammmziyuan,ciliziyuanku,cili8888,jzmm_123pan,Q_dianying,domgmingapk,dianying4k,q_dianshiju,tgbokee,ucshare,godupan,gokuapan
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 请自行替换成个人实际用户名&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  pansou:
    image: ghcr.io/fish2018/pansou-web:latest
    container_name: pansou
    ports:
      - &quot;34654:80&quot;
    env_file:
      - config.env
    environment:
      # 基础配置
      - DOMAIN=localhost
      - PANSOU_PORT=8888
      - PANSOU_HOST=127.0.0.1

      # 数据目录配置
      - CACHE_PATH=/app/data/cache
      - LOG_PATH=/app/data/logs

      # 高级配置
      - CACHE_MAX_SIZE=100
      - CACHE_ENABLED=true
      - CACHE_TTL=60
      - MAX_CONCURRENCY=200
      - MAX_PAGES=30
      - ASYNC_PLUGIN_ENABLED=true
      - ASYNC_RESPONSE_TIMEOUT=60
      - ASYNC_MAX_BACKGROUND_WORKERS=20
      - ASYNC_MAX_BACKGROUND_TASKS=100
      - ASYNC_CACHE_TTL_HOURS=1

      # 认证配置
      - AUTH_ENABLED=true
      - AUTH_USERS=&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;
      - AUTH_TOKEN_EXPIRY=24
    volumes:
      - ./data:/app/data
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  pansou:
    image: ghcr.io/fish2018/pansou-web:latest
    container_name: pansou
    ports:
      - &quot;34654:80&quot;
    env_file:
      - config.env
    environment:
      # 基础配置
      - DOMAIN=localhost
      - PANSOU_PORT=8888
      - PANSOU_HOST=127.0.0.1

      # 数据目录配置
      - CACHE_PATH=/app/data/cache
      - LOG_PATH=/app/data/logs

      # 高级配置
      - CACHE_MAX_SIZE=100
      - CACHE_ENABLED=true
      - CACHE_TTL=60
      - MAX_CONCURRENCY=200
      - MAX_PAGES=30
      - ASYNC_PLUGIN_ENABLED=true
      - ASYNC_RESPONSE_TIMEOUT=60
      - ASYNC_MAX_BACKGROUND_WORKERS=20
      - ASYNC_MAX_BACKGROUND_TASKS=100
      - ASYNC_CACHE_TTL_HOURS=1

      # 代理配置
      - PROXY=http://172.17.0.1:8118
      
      # 认证配置
      - AUTH_ENABLED=true
      - AUTH_USERS=&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;
      - AUTH_TOKEN_EXPIRY=24
    volumes:
      - ./data:/app/data
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、启动 PanSou&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 34654
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:34654&lt;/code&gt; 访问 PanSou 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、关闭 PanSou&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改样式&lt;/h2&gt;
&lt;p&gt;修改样式的目的是为了删除 PanSou 的页脚，当然，这纯属我个人的喜好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F.png&quot; alt=&quot;修改样式&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;获取 CSS 文件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it pansou find / -type f -name &quot;index*.css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;提取 CSS 文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;index_filename&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取的 CSS 文件名，例如 &lt;code&gt;index-CTkyXEFf.css&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;docker cp pansou:/app/frontend/dist/assets/&amp;lt;index_filename&amp;gt; ./index.css
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;修改 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano index.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

footer { display: none !important; }
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;注入 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  pansou:
    image: ghcr.io/fish2018/pansou-web:latest
    container_name: pansou
    ports:
      - &quot;34654:80&quot;
    env_file:
      - config.env
    environment:
      # 基础配置
      - DOMAIN=localhost
      - PANSOU_PORT=8888
      - PANSOU_HOST=127.0.0.1

      # 数据目录配置
      - CACHE_PATH=/app/data/cache
      - LOG_PATH=/app/data/logs

      # 高级配置
      - CACHE_MAX_SIZE=100
      - CACHE_ENABLED=true
      - CACHE_TTL=60
      - MAX_CONCURRENCY=200
      - MAX_PAGES=30
      - ASYNC_PLUGIN_ENABLED=true
      - ASYNC_RESPONSE_TIMEOUT=60
      - ASYNC_MAX_BACKGROUND_WORKERS=20
      - ASYNC_MAX_BACKGROUND_TASKS=100
      - ASYNC_CACHE_TTL_HOURS=1

      # 认证配置
      - AUTH_ENABLED=true
      - AUTH_USERS=&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;
      - AUTH_TOKEN_EXPIRY=24
    volumes:
      - ./data:/app/data
      - ./index.css:/app/frontend/dist/assets/&amp;lt;index_filename&amp;gt;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;重启 PanSou&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Jellyfin 部署教程：拥有属于自己的媒体库 E2</title><link>https://bysansheng.cn/posts/jellyfin-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/jellyfin-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我之前曾写过有关 Emby 的&lt;a href=&quot;/posts/emby-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;部署教程&lt;/a&gt;，而 Emby 也确实是一个非常优秀的媒体库项目，但毕竟「金无足赤，人无完人」，在我看来 Emby 也并不能完全满足我的要求。所以，我选择使用 Jellyfin 这个项目来作为我的第二个选择，用以补全我对于媒体库的需求。&lt;/p&gt;
&lt;p&gt;而且在 Emby，Plex，Jel­lyfin 这三个项目中，只有 Jellyfin 是完全免费且开源的，作为曾经 Emby 的一个分支，它的背后站着无数个开源创作者。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Jellyfin&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/jellyfin/{config,cache}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/jellyfin/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;media_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;媒体库&lt;/strong&gt;路径&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;media_mount&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;媒体库&lt;/strong&gt;挂载点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  jellyfin:
    image: nyanmisaka/jellyfin:latest
    container_name: jellyfin
    ports:
      - 33612:8096
    environment:
      - UID=0
      - GID=0
      - UMASK=000
    volumes:
      - ./config:/config
      - ./cache:/cache
      - &amp;lt;media_path&amp;gt;:&amp;lt;media_mount&amp;gt;
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  jellyfin:
    image: nyanmisaka/jellyfin:latest
    container_name: jellyfin
    ports:
      - 33612:8096
    environment:
      - UID=0
      - GID=0
      - UMASK=000
      - HTTP_PROXY=http://172.17.0.1:8118
      - HTTPS_PROXY=http://172.17.0.1:8118
      - NO_PROXY=localhost,127.0.0.1
    volumes:
      - ./config:/config
      - ./cache:/cache
      - &amp;lt;media_path&amp;gt;:&amp;lt;media_mount&amp;gt;
    devices:
      - /dev/dri:/dev/dri
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Jellyfin&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 33612
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:33612&lt;/code&gt; 访问 Jellyfin 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Jellyfin&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、媒体库的添加&lt;/h2&gt;
&lt;p&gt;要进行媒体库的添加，请打开 Jellyfin 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 媒体库 &amp;gt; 媒体库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;添加媒体库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A01.png&quot; alt=&quot;媒体库的添加1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后根据自己的喜好进行配置&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A02.png&quot; alt=&quot;媒体库的添加2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A03.png&quot; alt=&quot;媒体库的添加3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A04.png&quot; alt=&quot;媒体库的添加4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A05.png&quot; alt=&quot;媒体库的添加5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、硬件解码的配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
请确保当前设备可以正常使用核显或独显。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要进行硬件解码的配置，请打开 Jellyfin 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 播放 &amp;gt; 转码&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;硬件加速&lt;/code&gt; 中选择 &lt;code&gt;In­tel QuickSync (QSV)&lt;/code&gt;，然后勾选其它需要的选项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81%E7%9A%84%E9%85%8D%E7%BD%AE1.png&quot; alt=&quot;硬件解码的配置1&quot; /&gt;
&lt;img src=&quot;./image/%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81%E7%9A%84%E9%85%8D%E7%BD%AE2.png&quot; alt=&quot;硬件解码的配置2&quot; /&gt;
&lt;img src=&quot;./image/%E7%A1%AC%E4%BB%B6%E8%A7%A3%E7%A0%81%E7%9A%84%E9%85%8D%E7%BD%AE3.png&quot; alt=&quot;硬件解码的配置3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、CSS 自定义&lt;/h2&gt;
&lt;p&gt;与 Emby 相比，Jellyfin 在我眼里算是丑陋了很多的，所以我便上手写了 CSS 进行修改，当然也是以 Emby 作为参考的。&lt;/p&gt;
&lt;p&gt;要进行 CSS 自定义，请打开 Jellyfin 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 常规&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;自定义 CSS 代码&lt;/code&gt; 中添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.emby-input, .emby-textarea, .emby-select, .emby-button, .checkboxList, .cardBox, .cardContent, .paperList {
    border-radius: .5em !important;
}

.emby-select {
    padding-inline-start: .8rem !important;
}

.content-primary {
    padding-inline-start: 2.7rem !important;
}

.checkboxList, .skinHeader {
    background-color: #2B2B2B !important;
}

.backgroundContainer, .noBackdropTransparency .detailPageSecondaryContainer {
    background-color: #1E1E1E !important;
}

.mainDrawer, .drawer-open, .MuiDrawer-paper {
    background-color: #282828 !important;
}

.sectionTitle, .cardText-first {
    color: #ffffff !important;
}


.backgroundContainer.withBackdrop {
    background-color: rgba(0, 0, 0, 0.86) !important;
}

.detailPageSecondaryContainer.padded-bottom-page, .detailPagePrimaryContainer, .skinHeader.osdHeader {
    background-color: transparent !important;
}

.skinHeader.semiTransparent {
    backdrop-filter: blur(10px) !important;
    background-color: rgba(43, 43, 43, 0.4) !important;
}


.recommendations, .selectContainer:has(label[for=&quot;selectTheme&quot;]) {
    display: none !important;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image/CSS-%E8%87%AA%E5%AE%9A%E4%B9%89.png&quot; alt=&quot;CSS-自定义&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Music-Tag-Web 部署教程</title><link>https://bysansheng.cn/posts/music-tag-web-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/music-tag-web-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Music-Tag-Web 是一款可以自动编辑歌曲的标题、专辑、艺术家、歌词、封面等信息的音乐标签编辑器工具，支持 FLAC、APE、WAV、AIFF、WV、TTA、MP3、M4A、OGG、MPC、OPUS、WMA、DSF、MP4 等音频格式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Music-Tag-Web&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/music_tag_web/data/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/music_tag_web/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;music_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;音乐库&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  music-tag:
    image: xhongc/music_tag_web:latest
    container_name: music-tag-web
    ports:
      - 48001:8001
    volumes:
      - ./data:/app/data
      - &amp;lt;music_path&amp;gt;:/app/media:rw
    command: /start
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Music-Tag-Web&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 48001
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:48001&lt;/code&gt; 访问 Music-Tag-Web 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Music-Tag-Web&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、后台配置&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;http://localhost:48001/admin&lt;/code&gt; 可以访问 Music-Tag-Web 的管理后台&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;默认用户名&lt;/strong&gt;：&lt;code&gt;admin&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;默认密码&lt;/strong&gt;：&lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.1、修改后台管理员&lt;/h3&gt;
&lt;p&gt;打开 Music-Tag-Web 的管理后台，进入 &lt;code&gt;用户管理 &amp;gt; Subsonic 用户&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击「用户ID」为 1 的用户，进行相应的配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E5%90%8E%E5%8F%B0%E7%AE%A1%E7%90%86%E5%91%98.png&quot; alt=&quot;修改后台管理员&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、修改初始用户&lt;/h3&gt;
&lt;p&gt;打开 Music-Tag-Web 的管理后台，进入 &lt;code&gt;用户管理 &amp;gt; 用户&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击「用户ID」为 1 的用户，进行相应的配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E5%88%9D%E5%A7%8B%E7%94%A8%E6%88%B7.png&quot; alt=&quot;修改初始用户&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ---&lt;/p&gt;
&lt;h2&gt;4、破解 V2&lt;/h2&gt;
&lt;p&gt;Music Tag Web V2 具有 V1 的所有功能，并且进行了全方位的进化，是集合&lt;strong&gt;音乐标签刮削&lt;/strong&gt;和&lt;strong&gt;音乐播放&lt;/strong&gt;一体的个人音乐库解决方案。&lt;/p&gt;
&lt;p&gt;虽然我研究出了破解方法，但还是希望大家能多多支持开发者，赞助开发者的 &lt;a href=&quot;https://afdian.com/a/music-tag-web&quot;&gt;爱发电&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%A0%B4%E8%A7%A3-V2.png&quot; alt=&quot;破解-V2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;提取 &lt;code&gt;middleware.py&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker cp music-tag-web:/app/component/drf/middleware.py ./middleware.py
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;修改 &lt;code&gt;middleware.py&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano middleware.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def get_user():
    from applications.task.models import SysSettings

    code_obj = SysSettings.objects.filter(key=&quot;code&quot;).first()
    version = &quot;V1&quot;
    if not code_obj:
        return version
    lisense_code = code_obj.value
    try:
        is_validate = validate_lisense_code(lisense_code)
    except Exception:
        is_validate = False
    if is_validate:
        version = &quot;V2&quot;
    return version
    return &quot;V2&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;注入 &lt;code&gt;middleware.py&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  music-tag:
    image: xhongc/music_tag_web:latest
    container_name: music-tag-web
    ports:
      - 48001:8001
      - 48001:8002
    volumes:
      - ./data:/app/data
      - &amp;lt;music_path&amp;gt;:/app/media:rw
      - ./middleware.py:/app/component/drf/middleware.py
    command: /start
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;重启 Music-Tag-Web&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
``` --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>关于移动光猫的操作记录</title><link>https://bysansheng.cn/posts/%E5%85%B3%E4%BA%8E%E7%A7%BB%E5%8A%A8%E5%85%89%E7%8C%AB%E7%9A%84%E6%93%8D%E4%BD%9C%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E5%85%B3%E4%BA%8E%E7%A7%BB%E5%8A%A8%E5%85%89%E7%8C%AB%E7%9A%84%E6%93%8D%E4%BD%9C%E8%AE%B0%E5%BD%95/</guid><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于最近 PT 上传太多，导致我的网络环境被运营商调成了 NAT4，同时 IPv6 也被回收了。虽然问题目前还没解决（申诉后 2026.1.19 已解决），但由于一直在折腾光猫，于是便决定记录一些有关&lt;strong&gt;移动光猫&lt;/strong&gt;的相关操作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、重置光猫&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
重置光猫前，请先使用光猫背后标签的 user 账号登录光猫，并且进入 &lt;code&gt;网络 &amp;gt; 远程管理 &amp;gt; PASSWORD 认证&lt;/code&gt;，记录下 &lt;code&gt;password&lt;/code&gt; 值，这将用于光猫重置后的设备注册。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%87%8D%E7%BD%AE%E5%85%89%E7%8C%AB-1.png&quot; alt=&quot;重置光猫-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;每一台光猫都有一个 reset 孔，可用牙签或类似物品捅进去并等待。重置时要注意光猫的指示灯，有的光猫的指示灯全亮一次，就代表开始重置，当然，也有的是全亮两次或者三次。我个人建议，等待 30 秒后再松开。&lt;/p&gt;
&lt;p&gt;重置完光猫后，就可以打开光猫的登录页面，点击 &lt;code&gt;设备注册&lt;/code&gt;，填入一开始记录的 &lt;code&gt;password&lt;/code&gt; 值，开始下发数据进行注册，注册完成之后光猫才可以正常上网。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%87%8D%E7%BD%AE%E5%85%89%E7%8C%AB-2.png&quot; alt=&quot;重置光猫-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在「重置光猫」和 &lt;code&gt;设备注册&lt;/code&gt; 后的「数据下发」中间，可以进行光猫的配置，但事实上，有一部分配置在数据下发后，会被运营商的配置覆盖掉，并且数据下发之后，&lt;strong&gt;默认超密&lt;/strong&gt;也会被替换掉。&lt;/p&gt;
&lt;p&gt;于是，我就琢磨出了一个办法，不通过 &lt;code&gt;设备注册&lt;/code&gt; 来完成数据下发，而是删除&lt;a href=&quot;#3%E5%AE%BD%E5%B8%A6%E8%AE%BE%E7%BD%AE&quot;&gt;宽带设置&lt;/a&gt;中的 TR069 之后，自己填写 INTERNET 连接的配置，或者直接编写桥接的配置，然后进入 &lt;code&gt;网络 &amp;gt; 远程管理&lt;/code&gt; 中，在 &lt;code&gt;LOID 认证&lt;/code&gt; 和 &lt;code&gt;PASSWORD 认证&lt;/code&gt; 中，填入一开始记录的 &lt;code&gt;password&lt;/code&gt; 值。通过这个办法，既可以保障能通过光猫来连接互联网，也能保障默认超密不会被替换掉。有关 INTERNET 和桥接的配置，在后文中会提到。&lt;/p&gt;
&lt;p&gt;但是这个办法的局限性很大，需要你略微了解光猫的宽带设置，同时又知道自己宽带的账号，密码和 VLAN ID 之类的信息，所以并不是很推荐使用这个办法。&lt;/p&gt;
&lt;p&gt;这里也顺带补充一下移动光猫的默认超密，其它运营商的默认超密请自行搜索。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;账号&lt;/strong&gt;：CMCCAdmin&lt;br /&gt;
&lt;strong&gt;密码&lt;/strong&gt;：aDm8H%MdA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2、Telnet&lt;/h2&gt;
&lt;p&gt;Telnet 是一个简单的协议，可以通过命令行来远程操控服务器。不过它是明文传输的，相比 SSH 的加密来说，它的安全性极低，但对于光猫这种局域网的设备来说，却又是极为方便的。并且通过 Telnet 可以实现很多高级操作，如修改光猫的超密，防火墙，以及注册地址。&lt;/p&gt;
&lt;p&gt;1、首先需要做的是，想办法开启光猫的 Telnet。&lt;br /&gt;
2、然后 Windows 打开命令行，执行 &lt;code&gt;telnet 192.168.1.1&lt;/code&gt;，使用 &lt;code&gt;Username: CMCCAdmin; Password: aDm8H%MdA&lt;/code&gt; 进行登录。&lt;br /&gt;
3、最后执行 &lt;code&gt;su&lt;/code&gt;，使用 &lt;code&gt;Password: aDm8H%MdA&lt;/code&gt; 来获取光猫的 root 权限。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;目前我搜集到了几种开启光猫 Telnet 的办法，需要挨个尝试&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; 直接在光猫中找到配置并启用，不过概率很小。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[2]&lt;/strong&gt; 登录 user 账号后，再打开 &lt;code&gt;http://192.168.1.1/getpage.gch?pid=1002&amp;amp;nextpage=tele_sec_tserver_t.gch&lt;/code&gt; 或 &lt;code&gt;http://192.168.1.1/usr=CMCCAdmin&amp;amp;psw=aDm8H%25MdA&amp;amp;cmd=1&amp;amp;telnet.gch&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[3]&lt;/strong&gt; 使用 &lt;a href=&quot;https://github.com/Septrum101/zteOnu&quot;&gt;zteOnu&lt;/a&gt; 这个项目，将电脑的 MAC 地址修改成 &lt;code&gt;00-07-29-55-35-57&lt;/code&gt;，然后通过 &lt;code&gt;.\zteOnu.exe --ip &quot;192.168.1.1&quot; --new --user &quot;CMCCAdmin&quot; --pass &quot;aDm8H%MdA&quot; --port 80 --tp 23 --telnet&lt;/code&gt; 这个命令来开启光猫的 Telnet，如果是非移动的光猫，需要将 &lt;code&gt;user&lt;/code&gt; 和 &lt;code&gt;aDm8H%MdA&lt;/code&gt; 的内容，换成对应运营商的超密。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里补充一下 Windows 如何通过 PowerShell 来修改 MAC 地址，记得使用 &amp;lt;kbd&amp;gt;Win&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;X&amp;lt;/kbd&amp;gt; 选择 &lt;strong&gt;Windows PowerShell（管理员）&lt;/strong&gt; 来运行终端，同时也得记得保存对应网络适配器的&lt;strong&gt;原始 MAC 地址&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前网络适配器
Get-NetAdapter

# 修改对应网络适配器的 MAC 地址
Set-NetAdapter -Name &quot;&amp;lt;name&amp;gt;&quot; -MacAddress &quot;&amp;lt;mac&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
如果以上方法都失败了，只能说明天意如此，还是趁早放弃吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;大部分 Windows 需要手动开启 Telnet 开关&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;控制面板&lt;/code&gt;，进入 &lt;code&gt;控制面板 &amp;gt; 程序&lt;/code&gt;，点击 &lt;code&gt;启用或关闭 Windows 功能&lt;/code&gt;，在其中找到 &lt;code&gt;Telnet Client&lt;/code&gt; 并勾选，最后点击确定。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Telnet.png&quot; alt=&quot;Telnet&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;操作完上面的内容，就可以通过 &lt;code&gt;sidbg 1 DB p DevAuthInfo&lt;/code&gt; 来查看用户表，如果其中包括 user、CMCCAdmin，则代表目前为止的操作是成功的，最后再执行下面这几行命令，就可以重新设置光猫的超密。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sidbg 1 DB set DevAuthInfo 0 User CMCCAdmin
sidbg 1 DB set DevAuthInfo 0 Pass aDm8H%MdA
sidbg 1 DB save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开光猫的登录页面，使用默认超密来登录光猫了。&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;此外再补充一些其它的 Telnet 命令&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前超密
sidbg 1 DB p DevAuthInfo

# 查看配置文件
vi /etc/config/network

# 查找宽带密码
cd / &amp;amp;&amp;amp; find -type f -name &apos;*&apos;|xargs grep &apos;你的宽带账号&apos;

# 禁用 TR069 连接
sidbg 1 DB set WANC 0 Enable 0

# 修改 ACS 报告 URL
sidbg 1 DB set MgtServer 0 URL http://0.0.0.0

# 禁用定时报表
sidbg 1 DB set MgtServer 0 PeriodicInformEnable 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、宽带设置&lt;/h2&gt;
&lt;p&gt;将光猫改成桥接模式，应该是大部分人折腾软路由最主要的目标。因为开启桥接之后，&lt;s&gt;大概率可以获取 &lt;strong&gt;公网 IP&lt;/strong&gt; 以及更好的 &lt;strong&gt;NAT&lt;/strong&gt; 体验&lt;/s&gt;。&lt;/p&gt;
&lt;p&gt;要想开启桥接模式，就得打开光猫的 Web UI，进入 &lt;code&gt;网络 &amp;gt; 宽带设置 &amp;gt; Internet 连接&lt;/code&gt;，不同版本的光猫可能略有出入，需要自行调整。&lt;/p&gt;
&lt;p&gt;然后点击 &lt;code&gt;连接名称&lt;/code&gt;，就能在下拉栏里看到光猫自带的连接配置，大概分为以下几类：&lt;/p&gt;
&lt;p&gt;1、&lt;strong&gt;TR069&lt;/strong&gt;：运营商用来对光猫进行远程管理和控制的&lt;br /&gt;
2、&lt;strong&gt;OTHER&lt;/strong&gt;：一般是用来观看运营商的 iptv 服务&lt;br /&gt;
3、&lt;strong&gt;VOIP&lt;/strong&gt;：这个连接是用来打网络电话的，普通用户不用管&lt;br /&gt;
4、&lt;strong&gt;INTERNET&lt;/strong&gt;：这是最重要的，用于光猫和互联网的连接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AE%BD%E5%B8%A6%E8%AE%BE%E7%BD%AE-1.png&quot; alt=&quot;宽带设置-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于我个人而言，实在是无法接受，光猫的管理权被运营商时刻掌控着，所以我会直接删除 TR069。当然，如果觉得无所谓的话，也可以保留着。&lt;/p&gt;
&lt;p&gt;要改桥接的话，就得涉及到 INTERNET 的配置，但大部分光猫是不支持修改已经应用的配置的，那就得删除重建。删除前，&amp;lt;u&amp;gt;&lt;strong&gt;请截图保存光猫自带的配置进行备份&lt;/strong&gt;&amp;lt;/u&amp;gt;，方便后续的复原。&lt;/p&gt;
&lt;p&gt;要提一句的是，有关宽带&lt;strong&gt;账号&lt;/strong&gt;和&lt;strong&gt;密码&lt;/strong&gt;的获取，这两个都可以在 INTERNET 的配置中查看。账号一般就是对应的手机号码，而密码基本都是不显示的。对于大部分光猫来说，可以通过 &amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt; 审查元素，将密码栏的 &lt;code&gt;type=&quot;password&quot;&lt;/code&gt; 改成 &lt;code&gt;type=&quot;text&quot;&lt;/code&gt; 来强制显示，如果还是获取不到的话，可以通过上文补充的 Telnet 命令进行获取，或者直接询问装宽带的师傅。&lt;/p&gt;
&lt;p&gt;准备好后，就可以 &lt;code&gt;新建连接&lt;/code&gt; 用于桥接：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IP 协议版本&lt;/strong&gt;：&lt;code&gt;IPv4/v6&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;模式&lt;/strong&gt;：&lt;code&gt;Bridge&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;端口绑定&lt;/strong&gt;：一般是选择 &lt;code&gt;LAN1&lt;/code&gt;，大部分光猫只有这个网口的传输速率是最大的&lt;br /&gt;
&lt;strong&gt;VLAN 模式&lt;/strong&gt;：&lt;code&gt;改写&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;VLAN ID&lt;/strong&gt;：需要查看原 INTERNET 的连接名称，如 &lt;code&gt;INTERNET_R_VID_400&lt;/code&gt; 对应的就是 &lt;code&gt;400&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;802.1p&lt;/strong&gt;：与原 INTERNET 的一样就行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AE%BD%E5%B8%A6%E8%AE%BE%E7%BD%AE-2.png&quot; alt=&quot;宽带设置-2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>VueTorrent 使用教程：现代化 qBittorrent 主题</title><link>https://bysansheng.cn/posts/vuetorrent-%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/vuetorrent-%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;众所周知，qBittorrent 是一款非常好用的 p2p 下载工具，不过它的功能虽然强大，但界面却称不上美观。而 VueTorrent 就是一个专门为 qBittorrent 设计的现代化主题，不仅有华丽的外表，也有细节上的小巧思。比如原生的 qBittorrent 并没有分页功能，当保存的种子过多时，加载就会产生卡顿，但这些小问题在 VueTorrent 上都得到了很好的处理。&lt;/p&gt;
&lt;p&gt;值得一提的是，VueTorrent 也为移动端进行了适配，可以通过 PWA 安装在手机上使用。说真的，原生的 qBittorrent 在移动端的体验感真的很差，让人没有丝毫使用的欲望。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;前言示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;前言示例-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有关 qBittorrent 的相关内容可以查看 &lt;a href=&quot;/posts/qbittorrent-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;qBittorrent 部署教程&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、进入文件夹&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;lt;path&amp;gt;/qbittorrent/config/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、下载 VueTorrent&lt;/h2&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/VueTorrent/VueTorrent&quot;&gt;https://github.com/VueTorrent/VueTorrent&lt;/a&gt; 选择合适的版本&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;VueTorrent/VueTorrent&quot;}&lt;/p&gt;
&lt;p&gt;然后下载相应的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O vuetorrent.zip &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O vuetorrent.zip https://github.com/VueTorrent/VueTorrent/releases/download/v2.31.2/vuetorrent.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget -O vuetorrent.zip https://github.com/VueTorrent/VueTorrent/releases/download/v2.31.2/vuetorrent.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unzip vuetorrent.zip -d vuetorrent &amp;amp;&amp;amp; rm -rf vuetorrent.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、应用 VueTorrent&lt;/h2&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; WebUI&lt;/code&gt;，开启 &lt;code&gt;使用备选 WebUI&lt;/code&gt;，在 &lt;code&gt;文件路径&lt;/code&gt; 中填入 &lt;code&gt;/config/vuetorrent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8-VueTorrent.png&quot; alt=&quot;应用-VueTorrent&quot; /&gt;&lt;/p&gt;
&lt;p&gt;应用 VueTorrent 后，页面会自动切换成英文，需要手动在 &lt;code&gt;设置&lt;/code&gt; 里面进行切换中文&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%88%87%E6%8D%A2%E4%B8%AD%E6%96%87.png&quot; alt=&quot;切换中文&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>MoviePilot 部署教程：PT 媒体聚合工具</title><link>https://bysansheng.cn/posts/moviepilot-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/moviepilot-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在 PT 这个圈子里，除了一些刷流工具以外，最为出名的，当是 NASTool 和 MoviePilot 这类实际应用工具了。可 NASTool 也已经略显落后，比不上 MoviePilot 这个后继者，更不用说 MoviePilot 本身已从 v1 跨越到了 v2。MoviePilot 可以聚合多个 PT 站点的影视资源，实现搜索与下载，同时也能实现自动订阅与整理，是 PT 玩家的观影必备工具。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
注：本文默认读者拥有一定的 PT 常识，并且已部署了&lt;a href=&quot;/posts/qbittorrent-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;下载器&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;前言示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;前言示例-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 MoviePilot&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/moviepilot/{config,core,redis,postgresql}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/moviepilot/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;p&gt;具体配置可以前往 &lt;a href=&quot;https://wiki.movie-pilot.org/zh/install&quot;&gt;https://wiki.movie-pilot.org/zh/install&lt;/a&gt; 查看文档&lt;br /&gt;
关于环境变量可以前往 &lt;a href=&quot;https://wiki.movie-pilot.org/zh/configuration&quot;&gt;https://wiki.movie-pilot.org/zh/configuration&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;.*_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的&lt;strong&gt;路径&lt;/strong&gt;&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;.*_mount&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的&lt;strong&gt;挂载点&lt;/strong&gt;&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;admin_password&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的&lt;strong&gt;管理员密码&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  moviepilot:
    image: jxxghp/moviepilot-v2:latest
    container_name: moviepilot_v2
    hostname: moviepilot_v2
    ports:
      - 43000:3000
      - 43001:3001
    volumes:
      - ./config:/config
      - ./core:/moviepilot/.cache/ms-playwright
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - &amp;lt;moviepilot_path&amp;gt;:&amp;lt;moviepilot_mount&amp;gt;
      - &amp;lt;qbittorrent_path&amp;gt;:&amp;lt;qbittorrent_mount&amp;gt;
      - &amp;lt;transmission_path&amp;gt;:&amp;lt;transmission_mount&amp;gt;
    environment:
      - NGINX_PORT=3000
      - PORT=3001
      - PUID=0
      - PGID=0
      - UMASK=000
      - TZ=Asia/Shanghai
      - SUPERUSER=&amp;lt;admin_name&amp;gt;
      - SUPERUSER_PASSWORD=&amp;lt;admin_password&amp;gt;
      - MOVIEPILOT_AUTO_UPDATE=false
      - DB_TYPE=postgresql
      - DB_POSTGRESQL_HOST=postgresql
      - DB_POSTGRESQL_PORT=5432
      - DB_POSTGRESQL_DATABASE=moviepilot
      - DB_POSTGRESQL_USERNAME=moviepilot
      - DB_POSTGRESQL_PASSWORD=password4postgres
      - CACHE_BACKEND_TYPE=redis
      - CACHE_BACKEND_URL=redis://:password4redis@redis:6379
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
    stdin_open: true
    tty: true
    restart: always
    
  redis:
    image: redis
    volumes:
      - ./redis:/data
    command: redis-server --save 600 1 --requirepass password4redis
    healthcheck:
      test: [&quot;CMD&quot;, &quot;redis-cli&quot;, &quot;--raw&quot;, &quot;incr&quot;, &quot;ping&quot;]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always

  postgresql:
    image: postgres:17-alpine
    volumes:
      - ./postgresql:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=moviepilot
      - POSTGRES_USER=moviepilot
      - POSTGRES_PASSWORD=password4postgres
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U moviepilot -d moviepilot&quot;]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  moviepilot:
    image: jxxghp/moviepilot-v2:latest
    container_name: moviepilot_v2
    hostname: moviepilot_v2
    ports:
      - 43000:3000
      - 43001:3001
    volumes:
      - ./config:/config
      - ./core:/moviepilot/.cache/ms-playwright
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - &amp;lt;moviepilot_path&amp;gt;:&amp;lt;moviepilot_mount&amp;gt;
      - &amp;lt;qbittorrent_path&amp;gt;:&amp;lt;qbittorrent_mount&amp;gt;
      - &amp;lt;transmission_path&amp;gt;:&amp;lt;transmission_mount&amp;gt;
    environment:
      - NGINX_PORT=3000
      - PORT=3001
      - PUID=0
      - PGID=0
      - UMASK=000
      - TZ=Asia/Shanghai
      - SUPERUSER=&amp;lt;admin_name&amp;gt;
      - SUPERUSER_PASSWORD=&amp;lt;admin_password&amp;gt;
      - MOVIEPILOT_AUTO_UPDATE=false
      - PROXY_HOST=socks5h://172.17.0.1:1080
      - DB_TYPE=postgresql
      - DB_POSTGRESQL_HOST=postgresql
      - DB_POSTGRESQL_PORT=5432
      - DB_POSTGRESQL_DATABASE=moviepilot
      - DB_POSTGRESQL_USERNAME=moviepilot
      - DB_POSTGRESQL_PASSWORD=password4postgres
      - CACHE_BACKEND_TYPE=redis
      - CACHE_BACKEND_URL=redis://:password4redis@redis:6379
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
    stdin_open: true
    tty: true
    restart: always
    
  redis:
    image: redis
    volumes:
      - ./redis:/data
    command: redis-server --save 600 1 --requirepass password4redis
    healthcheck:
      test: [&quot;CMD&quot;, &quot;redis-cli&quot;, &quot;--raw&quot;, &quot;incr&quot;, &quot;ping&quot;]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always

  postgresql:
    image: postgres:17-alpine
    volumes:
      - ./postgresql:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=moviepilot
      - POSTGRES_USER=moviepilot
      - POSTGRES_PASSWORD=password4postgres
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U moviepilot -d moviepilot&quot;]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 MoviePilot&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43000&lt;/code&gt; 访问 MoviePilot 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 MoviePilot&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、设定&lt;/h2&gt;
&lt;h3&gt;3.1、系统&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 系统&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;* 3.1.1、基础设置&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;基础设置&lt;/strong&gt;里最重要的是 &lt;code&gt;Github Token&lt;/code&gt; 的设置，需要前往 &lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;https://github.com/settings/tokens&lt;/a&gt; 自行获取&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%9F%BA%E7%A1%80%E8%AE%BE%E7%BD%AE.png&quot; alt=&quot;基础设置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.1.2、下载器&lt;/h3&gt;
&lt;p&gt;点击 &lt;code&gt;+&lt;/code&gt;，自行选择对应的下载器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%B8%8B%E8%BD%BD%E5%99%A8-1.png&quot; alt=&quot;下载器-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击相应的下载器，修改相关信息，最后点击 &lt;code&gt;确认&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%B8%8B%E8%BD%BD%E5%99%A8-2.png&quot; alt=&quot;下载器-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.1.3、媒体服务器&lt;/h3&gt;
&lt;p&gt;点击 &lt;code&gt;+&lt;/code&gt;，自行选择对应的媒体服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8-1.png&quot; alt=&quot;媒体服务器-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击相应的媒体服务器，修改相关信息，最后点击 &lt;code&gt;确认&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8-2.png&quot; alt=&quot;媒体服务器-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、存储&amp;amp;目录&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 存储&amp;amp;目录&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;* 3.2.1、存储&lt;/h3&gt;
&lt;p&gt;点击 &lt;code&gt;+&lt;/code&gt;，自行选择对应的存储，默认使用的是&lt;strong&gt;本地&lt;/strong&gt;存储&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AD%98%E5%82%A8.png&quot; alt=&quot;存储&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.2.2、目录&lt;/h3&gt;
&lt;p&gt;点击 &lt;code&gt;+&lt;/code&gt; 添加目录，然后进行相应的修改&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%9B%AE%E5%BD%95-1.png&quot; alt=&quot;目录-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&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;img src=&quot;./image/%E7%9B%AE%E5%BD%95-2.png&quot; alt=&quot;目录-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、站点管理&lt;/h2&gt;
&lt;h3&gt;4.1、添加站点&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;站点管理&lt;/code&gt;，点击右下角的按钮添加站点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%AB%99%E7%82%B9%E7%AE%A1%E7%90%86-1.png&quot; alt=&quot;站点管理-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入站点的相关信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E7%AB%99%E7%82%B9%E7%AE%A1%E7%90%86-2.png&quot; alt=&quot;站点管理-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、应用站点&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 搜索&amp;amp;下载&lt;/code&gt;，启用相关站点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E7%AB%99%E7%82%B9-1.png&quot; alt=&quot;应用站点-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 订阅&lt;/code&gt;，启用相关站点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E7%AB%99%E7%82%B9-2.png&quot; alt=&quot;应用站点-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、插件&lt;/h2&gt;
&lt;h3&gt;5.1、获取插件&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;插件 &amp;gt; 插件市场&lt;/code&gt;，点击右下角的按钮，搜索相关插件，这里推荐 &lt;code&gt;媒体库封面生成&lt;/code&gt; 和 &lt;code&gt;聚合消息通知&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%8E%B7%E5%8F%96%E6%8F%92%E4%BB%B6.png&quot; alt=&quot;获取插件&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.2、修改插件&lt;/h3&gt;
&lt;p&gt;打开 MoviePilot 的 Web 页面，进入 &lt;code&gt;插件 &amp;gt; 修改插件&lt;/code&gt;，点击相应的插件，修改相关信息&lt;/p&gt;
&lt;p&gt;媒体库封面生成：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%8F%92%E4%BB%B6-1.png&quot; alt=&quot;修改插件-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;聚合消息通知：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%8F%92%E4%BB%B6-2.png&quot; alt=&quot;修改插件-2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>OpenWebUI 部署教程：自建私有化 AI 平台</title><link>https://bysansheng.cn/posts/openwebui-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openwebui-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在这个 AI 模型爆发式成长的时代里，学习与了解 AI 已经成为每个人必不可少的准备。所以我也买了一些平台的 API 接口，但其实用的情况也并不多，大多时候都是去官方 chat 平台使用的，但总不能放着不用浪费掉，我就打算自己也搭一个 chat 平台。而 OpenWebUI，就是一个私有化的 AI 应用平台，它可以很方便地聚合各家的模型，也能轻松地调用 MCP 工具去扩展模型的功能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-1.png&quot; alt=&quot;前言示例-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B-2.png&quot; alt=&quot;前言示例-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 OpenWebUI&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/open_webui/{data,mcpo}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/open_webui/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open_webui
    ports:
      - &quot;45685:8080&quot;
    volumes:
      - ./data:/app/backend/data
    environment:
      - TZ=Asia/Shanghai
      - AIOHTTP_CLIENT_TIMEOUT=1800
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open_webui
    ports:
      - &quot;45685:8080&quot;
    volumes:
      - ./data:/app/backend/data
    environment:
      - TZ=Asia/Shanghai
      - AIOHTTP_CLIENT_TIMEOUT=1800
      - HTTP_PROXY=http://172.17.0.1:8118
      - HTTPS_PROXY=http://172.17.0.1:8118
      - NO_PROXY=localhost,127.0.0.1
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 OpenWebUI&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 45685
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:45685&lt;/code&gt; 访问 OpenWebUI 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 OpenWebUI&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、配置 https 反向代理&lt;/h2&gt;
&lt;p&gt;本文以 letsencrypt 证书为演示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取证书的域名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/open_webui.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 45658 ssl;
    listen [::]:45658 ssl;
    server_name bysansheng.top;

    ssl_certificate /etc/letsencrypt/live/bysansheng.top/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bysansheng.top/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers &apos;TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256&apos;;
    ssl_prefer_server_ciphers off;

    location ~* ^/(auth|api|oauth|admin|signin|signup|signout|login|logout|sso)/ {
        proxy_pass http://localhost:45685;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 10m;
        proxy_buffering off;
        proxy_cache off;
        client_max_body_size 20M;

        proxy_no_cache 1;
        proxy_cache_bypass 1;
        add_header Cache-Control &quot;no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0&quot; always;
        add_header Pragma &quot;no-cache&quot; always;
        expires -1;
    }

    # Profile and model images - cached for performance
    location ~ ^/api/v1/(users/[^/]+/profile/image|models/model/profile/image)$ {
        proxy_pass http://localhost:45685;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Cache images for 1 day
        expires 1d;
        add_header Cache-Control &quot;public, max-age=86400&quot;;
    }

    location ~* \.(css|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
        proxy_pass http://localhost:45685;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Cache static assets for 7 days
        expires 7d;
        add_header Cache-Control &quot;public, immutable&quot;;
    }

    location / {
        proxy_pass http://localhost:45685;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Extended timeout for long LLM completions (30 minutes)
        proxy_read_timeout 1800;
        proxy_send_timeout 1800;
        proxy_connect_timeout 1800;
        
        proxy_buffering off;
        proxy_cache off;
        client_max_body_size 20M;

        add_header Cache-Control &quot;public, max-age=300, must-revalidate&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/open_webui.conf /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw delete allow 45685
sudo ufw allow 45658
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;https://localhost:45658&lt;/code&gt; 访问 OpenWebUI 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、MCPO&lt;/h2&gt;
&lt;p&gt;MCP 是一个开放标准和协议，旨在标准化 AI 应用程序与各种数据源之间的连接方式，你可以把它想象成 AI 领域的「USB-C接口」或「驱动程序通用标准」。&lt;/p&gt;
&lt;p&gt;而 MCPO 则是一个框架或系统，负责对通过「MCP协议」获取的，并经过处理后的输出结果，进行进一步的整理、格式化、验证和分发。&lt;/p&gt;
&lt;h3&gt;4.1、镜像的构建&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;mcpo_key&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的密钥&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./mcpo/Dockerfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM python:3.11-slim
WORKDIR /app

RUN apt-get update &amp;amp;&amp;amp; \
    apt-get install -y npm &amp;amp;&amp;amp; \
    rm -rf /var/lib/apt/lists/*

RUN pip install mcpo uv

CMD [&quot;sh&quot;, &quot;-c&quot;, &quot;uvx mcpo --port 8000 --api-key \&quot;${API_KEY}\&quot; --config /app/config.json&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建镜像&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker build -t mcpo ./mcpo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker build \
  --build-arg HTTP_PROXY=http://172.17.0.1:8118 \
  --build-arg HTTPS_PROXY=http://172.17.0.1:8118 \
  --build-arg NO_PROXY=localhost,127.0.0.1 \
  -t mcpo ./mcpo
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、寻找 MCP&lt;/h3&gt;
&lt;p&gt;首先，前往 &lt;a href=&quot;https://smithery.ai/server&quot;&gt;https://smithery.ai/server&lt;/a&gt; 选择合适的 MCP，这里以 exa 为例&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BB%E6%89%BE-MCP-1.png&quot; alt=&quot;寻找-MCP-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下滑找到 Github 项目地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BB%E6%89%BE-MCP-2.png&quot; alt=&quot;寻找-MCP-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;仔细阅读文档，并找到相应 json 格式的配置内容，复制备用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BB%E6%89%BE-MCP-3.png&quot; alt=&quot;寻找-MCP-3&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
使用 exa 前需要前往 &lt;a href=&quot;https://dashboard.exa.ai/api-keys&quot;&gt;https://dashboard.exa.ai/api-keys&lt;/a&gt; 注册 &lt;code&gt;&amp;lt;exa_api_key&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;4.3、编写 config 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./mcpo/config.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改 mcpo 配置内容，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;time-mcp&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;time-mcp&quot;]
    },
    &quot;exa&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [
        &quot;-y&quot;,
        &quot;exa-mcp-server&quot;,
        &quot;tools=get_code_context_exa,web_search_exa,company_research_exa,crawling_exa,linkedin_search_exa,deep_researcher_start,deep_researcher_check&quot;
      ],
      &quot;env&quot;: {
        &quot;EXA_API_KEY&quot;: &quot;&amp;lt;exa_api_key&amp;gt;&quot;
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.4、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open_webui
    ports:
      - &quot;45685:8080&quot;
    volumes:
      - ./data:/app/backend/data
    environment:
      - TZ=Asia/Shanghai
    networks:
      - open-webui-network
    restart: always

  mcpo:
    image: mcpo
    container_name: mcpo
    ports:
      - &quot;49334:8000&quot;
    volumes:
      - ./mcpo/config.json:/app/config.json
      - ./mcpo/cache:/root/.cache/
    environment:
      - TZ=Asia/Shanghai
      - API_KEY=&amp;lt;mcpo_key&amp;gt;
    networks:
      - open-webui-network
    restart: always

networks:
  open-webui-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.5、重启 OpenWebUI&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 49334
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:49334/docs&lt;/code&gt; 访问 MCPO 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.6、应用到 OpenWebUI&lt;/h3&gt;
&lt;p&gt;打开 OpenWebUI 的 Web 页面，进入 &lt;code&gt;管理员面板 &amp;gt; 设置 &amp;gt; 外部工具&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E5%88%B0-OpenWebUI-1.png&quot; alt=&quot;应用到-OpenWebUI-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E5%88%B0-OpenWebUI-2.png&quot; alt=&quot;应用到-OpenWebUI-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击右上角的 &lt;code&gt;+&lt;/code&gt; 添加链接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E5%88%B0-OpenWebUI-3.png&quot; alt=&quot;应用到-OpenWebUI-3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入相应的信息，这里以 exa 为例&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E5%88%B0-OpenWebUI-4.png&quot; alt=&quot;应用到-OpenWebUI-4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后就可以成功使用添加的 MCP 工具了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BA%94%E7%94%A8%E5%88%B0-OpenWebUI-5.png&quot; alt=&quot;应用到-OpenWebUI-5&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Scrutiny 部署教程：硬盘监控面板</title><link>https://bysansheng.cn/posts/scrutiny-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/scrutiny-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;对于 NAS 玩家而言，时刻掌握硬盘的各项数据是很有必要的。Scrutiny 正是这样一个轻量、现代化的硬盘监控面板，它可以获取硬盘的 S.M.A.R.T. 信息，并实现自动监控和异常通知。在像我这种没有精力去定期检查硬盘的人眼中，它无疑是很好的利器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Scrutiny&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/scrutiny/{config,influxdb}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/scrutiny/config/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、下载 yaml 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -o ./config/scrutiny.yaml https://raw.githubusercontent.com/AnalogJ/scrutiny/master/example.scrutiny.yaml
curl -o ./config/collector.yaml https://raw.githubusercontent.com/AnalogJ/scrutiny/master/example.collector.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(
    export http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118
    
    curl -o ./config/scrutiny.yaml https://raw.githubusercontent.com/AnalogJ/scrutiny/master/example.scrutiny.yaml
    curl -o ./config/collector.yaml https://raw.githubusercontent.com/AnalogJ/scrutiny/master/example.collector.yaml
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
需根据个人实际情况在 &lt;code&gt;devices&lt;/code&gt; 中挂载相应硬盘&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  scrutiny:
    image: ghcr.io/analogj/scrutiny:master-omnibus
    container_name: scrutiny
    ports:
      - 48085:8080
    volumes:
      - /run/udev:/run/udev:ro
      - ./influxdb:/opt/scrutiny/influxdb
      - ./config:/opt/scrutiny/config
    devices:
      - &quot;/dev/sda&quot;
      - &quot;/dev/sdb&quot;
      - &quot;/dev/sdc&quot;
    cap_add:
      - SYS_ADMIN
      - SYS_RAWIO
    tty: true
    stdin_open: true
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、启动 Scrutiny&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 48085
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:48085&lt;/code&gt; 访问 Scrutiny 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、关闭 Scrutiny&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、设置通知&lt;/h2&gt;
&lt;p&gt;Scrutiny 支持多种通知方式&lt;/p&gt;
&lt;p&gt;具体配置可以前往 &lt;a href=&quot;https://github.com/AnalogJ/scrutiny#notifications&quot;&gt;https://github.com/AnalogJ/scrutiny#notifications&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;p&gt;这里以调用&lt;strong&gt;本地脚本&lt;/strong&gt;为例&lt;/p&gt;
&lt;h3&gt;3.1、编写脚本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mkdir script &amp;amp;&amp;amp; sudo nano ./script/custom_notify.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改相关的脚本内容&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;我个人对接的是 OneBot&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;.*&amp;gt;&lt;/code&gt; 请自行替换成个人实际内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

URL=&quot;http://127.0.0.1:&amp;lt;port&amp;gt;/send_private_msg&quot;
AUTH_TOKEN=&quot;&amp;lt;token&amp;gt;&quot;
USER_ID=&quot;&amp;lt;user_id&amp;gt;&quot;

curl -X POST &quot;$URL&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -H &quot;Authorization: Bearer $AUTH_TOKEN&quot; \
  -d &quot;{\&quot;user_id\&quot;: \&quot;$USER_ID\&quot;, \&quot;message\&quot;: \&quot;【scrutiny】$SCRUTINY_FAILURE_TYPE\n$SCRUTINY_SUBJECT\&quot;}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x ./script/custom_notify.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  scrutiny:
    image: ghcr.io/analogj/scrutiny:master-omnibus
    container_name: scrutiny
    ports:
      - 48085:8080
    volumes:
      - /run/udev:/run/udev:ro
      - ./influxdb:/opt/scrutiny/influxdb
      - ./config:/opt/scrutiny/config
      - ./script:/opt/scrutiny/script
    devices:
      - &quot;/dev/sda&quot;
      - &quot;/dev/sdb&quot;
      - &quot;/dev/sdc&quot;
    cap_add:
      - SYS_ADMIN
      - SYS_RAWIO
    tty: true
    stdin_open: true
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、编写 scrutiny 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./config/scrutiny.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notify:
  urls:
    - &quot;script:///opt/scrutiny/script/custom_notify.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4、重启 Scrutiny&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5、测试通知&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST http://localhost:48085/api/health/notify
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows 暂停自动更新</title><link>https://bysansheng.cn/posts/windows-%E6%9A%82%E5%81%9C%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/</link><guid isPermaLink="true">https://bysansheng.cn/posts/windows-%E6%9A%82%E5%81%9C%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;世人苦「Windows 自动更新」已久，试想当某个寂静的夜晚，你在电脑上挂着服务与脚本，准备美美睡一觉，可谁知，第二天迎接你的却是「Windows 已更新」，以及未保存的文档和中断的服务与脚本。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、清理更新服务&lt;/h2&gt;
&lt;p&gt;按 &amp;lt;kbd&amp;gt;win&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; 并输入 &lt;code&gt;services.msc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%B8%85%E7%90%86%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1-1.png&quot; alt=&quot;清理更新服务-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;找到 Windows Update 禁用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%B8%85%E7%90%86%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1-2.png&quot; alt=&quot;清理更新服务-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;C:\Windows\SoftwareDistribution&lt;/code&gt; 并清空文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%B8%85%E7%90%86%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1-3.png&quot; alt=&quot;清理更新服务-3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重启 Windows Update 服务&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%B8%85%E7%90%86%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1-4.png&quot; alt=&quot;清理更新服务-4&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、修改暂停期限&lt;/h2&gt;
&lt;p&gt;按 &amp;lt;kbd&amp;gt;win&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; 并输入 &lt;code&gt;regedit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%9A%82%E5%81%9C%E6%9C%9F%E9%99%90-1.png&quot; alt=&quot;修改暂停期限-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;定位到 &lt;code&gt;\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后新建 &lt;code&gt;DWORD 32位值（十进制）&lt;/code&gt; 的键值，并将这个键值命名为 &lt;code&gt;FlightSettingsMaxPauseDays&lt;/code&gt;，数值改成 &lt;code&gt;3650&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%9A%82%E5%81%9C%E6%9C%9F%E9%99%90-2.png&quot; alt=&quot;修改暂停期限-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、延长更新&lt;/h2&gt;
&lt;p&gt;打开 Windows 设置中的更新页面，在下载更新的时候点击 &lt;code&gt;延长 1 周&lt;/code&gt;，然后再改成 &lt;code&gt;延长 500 周&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BB%B6%E9%95%BF%E6%9B%B4%E6%96%B0.png&quot; alt=&quot;延长更新&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Immich 部署教程：自托管照片和视频的管理工具</title><link>https://bysansheng.cn/posts/immich-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/immich-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Immich 是一款高效隐私的，自托管照片和视频的管理工具。但讲真的，我并不认为 Immich 符合我的使用要求，可其它的类似工具，要么就是不如 Immich；要么就是如 MT Photos 一样需要收费。所以，最终我只能勉强选择 Immich 进行使用，不过好在我并不怎么拍照和存储图片与视频，所以大体上也能接受。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;br /&gt;
&lt;code&gt;Git LFS&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、安装 Git LFS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y git-lfs
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Immich&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/immich/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/immich/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、下载配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
wget -O hwaccel.transcoding.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml
wget -O hwaccel.ml.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(
    export http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118
    
    wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
    wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
    wget -O hwaccel.transcoding.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml
    wget -O hwaccel.ml.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、修改配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    extends:
      file: hwaccel.transcoding.yml
      service: quicksync
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - &apos;42283:2283&apos;
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
    extends:
      file: hwaccel.ml.yml
      service: openvino
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    healthcheck:
      disable: false

...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、修改环境变量&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;db_password&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的数据库密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano .env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DB_PASSWORD=&amp;lt;db_password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、启动 Immich&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 42283
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:42283&lt;/code&gt; 访问 Immich 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.6、关闭 Immich&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、机器学习模型&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
想要使用机器学习，需要先确保当前设备可以正常使用核显或独显。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.1、准备阶段&lt;/h3&gt;
&lt;p&gt;创建 CLIP 模型目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/lib/docker/volumes/immich_model-cache/_data/clip/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建人脸识别模型目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/lib/docker/volumes/immich_model-cache/_data/facial-recognition/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化 Git LFS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git lfs install
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、下载模型&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;model_url&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的模型下载地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以先前往 &lt;a href=&quot;https://huggingface.co/immich-app&quot;&gt;https://huggingface.co/immich-app&lt;/a&gt; 选择要下载的模型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone &amp;lt;model_url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://huggingface.co/immich-app/XLM-Roberta-Large-Vit-B-16Plus \
    /var/lib/docker/volumes/immich_model-cache/_data/clip/

git clone https://huggingface.co/immich-app/buffalo_l \
    /var/lib/docker/volumes/immich_model-cache/_data/facial-recognition/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(
    export http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118
    
    git clone https://huggingface.co/immich-app/XLM-Roberta-Large-Vit-B-16Plus \
        /var/lib/docker/volumes/immich_model-cache/_data/clip/

    git clone https://huggingface.co/immich-app/buffalo_l \
        /var/lib/docker/volumes/immich_model-cache/_data/facial-recognition/
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、开启机器学习&lt;/h3&gt;
&lt;p&gt;打开 Immich 的 Web 页面，进入 &lt;code&gt;系统管理 &amp;gt; 设置&lt;/code&gt;，展开 &lt;code&gt;机器学习设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后展开 &lt;code&gt;智能搜索&lt;/code&gt;，选择相应模型，点击 &lt;code&gt;启用智能搜索&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BC%80%E5%90%AF%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-1.png&quot; alt=&quot;开启机器学习-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着展开 &lt;code&gt;人脸识别&lt;/code&gt;，选择相应模型，点击 &lt;code&gt;启用人脸识别&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BC%80%E5%90%AF%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-2.png&quot; alt=&quot;开启机器学习-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、外部图库&lt;/h2&gt;
&lt;h3&gt;4.1、挂载外部图库&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;library_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;外部图库&lt;/strong&gt;路径&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;library_mount&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;外部图库&lt;/strong&gt;挂载点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    extends:
      file: hwaccel.transcoding.yml
      service: quicksync
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
      - &amp;lt;library_path&amp;gt;:&amp;lt;library_mount&amp;gt;
    env_file:
      - .env
    ports:

...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Immich&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、导入外部图库&lt;/h3&gt;
&lt;p&gt;打开 Immich 的 Web 页面，进入 &lt;code&gt;系统管理 &amp;gt; 外部图库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;创建图库&lt;/code&gt;，然后选择图库所有者，点击 &lt;code&gt;创建&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E5%A4%96%E9%83%A8%E5%9B%BE%E5%BA%93-1.png&quot; alt=&quot;导入外部图库-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再填入图库路径，点击 &lt;code&gt;添加&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E5%A4%96%E9%83%A8%E5%9B%BE%E5%BA%93-2.png&quot; alt=&quot;导入外部图库-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后找到新添加的图库，开启 &lt;code&gt;扫描&lt;/code&gt;，就可以让外部图库的内容加入到你的 Immich 图库里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E5%A4%96%E9%83%A8%E5%9B%BE%E5%BA%93-3.png&quot; alt=&quot;导入外部图库-3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、客户端&lt;/h2&gt;
&lt;p&gt;Immich 不仅提供了&lt;a href=&quot;https://github.com/immich-app/immich/releases/&quot;&gt;安卓客户端&lt;/a&gt;，也可以通过在 App Store 搜索 &lt;code&gt;immich&lt;/code&gt; 来安装 iOS 客户端。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AE%A2%E6%88%B7%E7%AB%AF.png&quot; alt=&quot;客户端&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Kikoeru 部署教程：自建 ASMR 服务器</title><link>https://bysansheng.cn/posts/kikoeru-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/kikoeru-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Kikoeru 是我目前唯一见到的，一款专门为 ASMR 设计的服务器项目，虽然有多个底层架构不同的分支，但总归都是叫这个名字，都是一套接近的 UI。我当前使用的是 number178 所编写和构建的 Kikoeru。并且我自己也写了个程序，可以通过 &lt;a href=&quot;/posts/aria2-%E5%92%8C-aria-ng-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;Aria2&lt;/a&gt; 去下载 &lt;a href=&quot;https://www.asmr.one/&quot;&gt;AsmrOne&lt;/a&gt; 的资源。当然，这一套折腾下来，我更多的是享受折腾本身的乐趣，反而 ASMR 倒是不怎么听的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Kikoeru&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/kikoeru/{sqlite,covers,config}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/kikoeru/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;voice_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际「&lt;strong&gt;ASMR库&lt;/strong&gt;」路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  kikoeru:
    image: number17/kikoeru:latest
    container_name: kikoeru
    ports:
      - 48488:8888
    volumes:
      - ./sqlite:/usr/src/kikoeru/sqlite
      - ./covers:/usr/src/kikoeru/covers
      - ./config:/usr/src/kikoeru/config
      - &amp;lt;voice_path&amp;gt;:/usr/src/kikoeru/VoiceWork
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Kikoeru&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 48488
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:48488&lt;/code&gt; 访问 Kikoeru 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Kikoeru&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改样式&lt;/h2&gt;
&lt;p&gt;修改样式的目的是为了美化 Kikoeru 的页面，当然，是以我的审美为主的。&lt;/p&gt;
&lt;p&gt;原版：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F.png&quot; alt=&quot;修改样式&quot; /&gt;&lt;/p&gt;
&lt;p&gt;修改：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;获取 CSS 文件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it kikoeru find / -type f -name &quot;index.*.css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;提取 CSS 文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;app_filename&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取的 CSS 文件名，例如 &lt;code&gt;app.892d7287.css&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;docker cp kikoeru:/usr/src/kikoeru/dist/css/&amp;lt;app_filename&amp;gt; ./app.css
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;修改 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano app.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

.q-layout__section--marginal { background-color: #000000; }
aside.q-drawer div.q-scrollarea&amp;gt;div.scroll&amp;gt;div { height: 0; }
.q-mx-sm { margin-left: 18px;margin-right: 18px;margin-top: 8px; }
.q-drawer--left.q-drawer--bordered { border-right: 0; }
.q-field--outlined .q-field__control:before { border-width: 2px; }
.scroll { overflow: hidden; }
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;注入 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  kikoeru:
    image: number17/kikoeru:latest
    container_name: kikoeru
    ports:
      - 48488:8888
    volumes:
      - ./sqlite:/usr/src/kikoeru/sqlite
      - ./covers:/usr/src/kikoeru/covers
      - ./config:/usr/src/kikoeru/config
      - ./app.css:/usr/src/kikoeru/dist/css/&amp;lt;app_filename&amp;gt;
      - &amp;lt;voice_path&amp;gt;:/usr/src/kikoeru/VoiceWork
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;重启 Kikoeru&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、导入「ASMR库」&lt;/h2&gt;
&lt;p&gt;打开 Komga 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 音色库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-1.png&quot; alt=&quot;导入ASMR库-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-2.png&quot; alt=&quot;导入ASMR库-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;添加新文件夹&lt;/code&gt; 的 &lt;code&gt;绝对路径&lt;/code&gt; 里填入 &lt;code&gt;/usr/src/kikoeru/VoiceWork&lt;/code&gt;，然后点击 &lt;code&gt;添加&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-3.png&quot; alt=&quot;导入ASMR库-3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、扫描「ASMR库」&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
Kikoeru 貌似并不支持自动扫描文件夹，每次导入新的专辑，都需要手动开启一次扫描。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开 Komga 的 Web 页面，进入 &lt;code&gt;设定 &amp;gt; 扫描&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-1.png&quot; alt=&quot;导入ASMR库-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-4.png&quot; alt=&quot;导入ASMR库-4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击 &lt;code&gt;扫描本地音色库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5ASMR%E5%BA%93-5.png&quot; alt=&quot;导入ASMR库-5&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、iOS 客户端&lt;/h2&gt;
&lt;p&gt;Kikoeru 专门推出了一个 iOS 客户端，具体可以前往 &lt;a href=&quot;https://number17.online/docs/kikoeru-app&quot;&gt;https://number17.online/docs/kikoeru-app&lt;/a&gt; 查看，相关流程和使用教程都在里面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/iOS-%E5%AE%A2%E6%88%B7%E7%AB%AF.png&quot; alt=&quot;iOS-客户端&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Audiobookshelf 部署教程：自建有声书服务器</title><link>https://bysansheng.cn/posts/audiobookshelf-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/audiobookshelf-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Audiobookshelf 是少见的，为有声书和播客专门设计的服务器项目。我个人是从不听播客的，倒是比较常听有声书。关于有声书的获取方案，我目前是从喜马拉雅上下载加密音频文件，然后再解码成 MP3 / M4A 文件，整理导入 Audiobookshelf 中收听。这样其实是有点麻烦的，因为喜马拉雅有一定下载限制，可能下一部一千多集的有声书，就要花费十五分钟守在电脑前。当然，我是觉得无所谓的，毕竟折腾本身就是一种乐趣。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Audiobookshelf&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/audiobookshelf/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/audiobookshelf/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;audiobooks_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;有声书库&lt;/strong&gt;路径&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;podcasts_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;播客库&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  audiobookshelf:
    image: ghcr.io/advplyr/audiobookshelf:latest
    container_name: audiobookshelf
    ports:
      - 43378:80
    volumes:
      - ./config:/config
      - ./metadata:/metadata
      - &amp;lt;audiobooks_path&amp;gt;:/audiobooks
      - &amp;lt;podcasts_path&amp;gt;:/podcasts
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Audiobookshelf&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43378
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43378&lt;/code&gt; 访问 Audiobookshelf 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Audiobookshelf&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、媒体库的添加&lt;/h2&gt;
&lt;p&gt;要进行媒体库的添加，请打开 Emby 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 媒体库&lt;/code&gt;，点击 &lt;code&gt;添加库&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A01.png&quot; alt=&quot;媒体库的添加1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后根据自己的喜好进行配置，最后点击 &lt;code&gt;创建&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A02.png&quot; alt=&quot;媒体库的添加2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AA%92%E4%BD%93%E5%BA%93%E7%9A%84%E6%B7%BB%E5%8A%A03.png&quot; alt=&quot;媒体库的添加3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、关于封面&lt;/h2&gt;
&lt;p&gt;Audiobookshelf 支持识别文件夹中的 &lt;code&gt;cover&lt;/code&gt; 作为专辑封面&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;超级惊悚直播_有声的紫襟/
├── 第1章 女孩的委托.m4a
├── 第2章 阴间秀场.m4a
├── 第3章 惊悚面试.m4a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入封面后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;超级惊悚直播_有声的紫襟/
├── cover.jpg
├── 第1章 女孩的委托.m4a
├── 第2章 阴间秀场.m4a
├── 第3章 惊悚面试.m4a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你是导入喜马拉雅的有声书，那么你可以前往 &lt;a href=&quot;https://www.ximalaya.com&quot;&gt;https://www.ximalaya.com&lt;/a&gt;，搜索你导入的专辑，点进去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%85%B3%E4%BA%8E%E5%B0%81%E9%9D%A21.png&quot; alt=&quot;关于封面1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按 &amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt;，找到封面元素，然后就可以根据链接进行图片的保存&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%85%B3%E4%BA%8E%E5%B0%81%E9%9D%A22.png&quot; alt=&quot;关于封面2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、客户端&lt;/h2&gt;
&lt;p&gt;Audiobookshelf 专门推出了一个 Android &amp;amp; iOS 客户端，具体可以前往 https://github.com/advplyr/audiobookshelf-app 查看，相关流程和使用教程都在里面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AE%A2%E6%88%B7%E7%AB%AF.png&quot; alt=&quot;客户端&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>it-tools 部署教程：程序员的瑞士军刀</title><link>https://bysansheng.cn/posts/it-tools-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/it-tools-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;it-tools 是一款专门为程序员设计的工具箱，也被称作是程序员的瑞士军刀。我个人常用的功能有：随机端口生成，docker run 转换 docker compose，json 格式化等。&lt;/p&gt;
&lt;p&gt;唯一要吐槽的是，它的「docker run 转换 docker compose」的 Tab 是 4 格的，而我的 docker-compose.yml 常用的 Tab 是 2 格的，我见到的大多数人和 AI 基本也都是以 2 格为主。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 it-tools&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/it_tools/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/it_tools/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  it-tools:
    image: corentinth/it-tools:latest
    container_name: it_tools
    ports:
      - 42151:80
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 it-tools&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 42151
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:42151&lt;/code&gt; 访问 it-tools 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 it-tools&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改样式&lt;/h2&gt;
&lt;p&gt;修改样式的目的主要是为了去除例如「赞助」、「Twitter 账号」这样的多余元素&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F.png&quot; alt=&quot;修改样式&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;获取 CSS 文件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it it_tools find /usr/share/nginx/html/assets/ -name &quot;index*.css&quot; -exec basename {} \; | head -1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;提取 CSS 文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;index_filename&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取的 CSS 文件名，例如 &lt;code&gt;index-f0f4dd3b.css&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;docker cp it_tools:/usr/share/nginx/html/assets/&amp;lt;index_filename&amp;gt; ./index.css
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;修改 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano index.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

button.c-button.circle svg:has(path[d=&quot;m12 21.35l-1.45-1.32C5.4 15.36 2 12.27 2 8.5C2 5.41 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.08C13.09 3.81 14.76 3 16.5 3C19.58 3 22 5.41 22 8.5c0 3.77-3.4 6.86-8.55 11.53L12 21.35Z&quot;]),
a.c-button.round.support-button,
a.c-button.circle[aria-label=&quot;UI 库&quot;],
a.c-button.circle[aria-label=&quot;Twitter 账号&quot;] {
    display: none !important;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;注入 CSS 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  it-tools:
    image: corentinth/it-tools:latest
    container_name: it_tools
    ports:
      - 42151:80
    volumes:
      - ./index.css:/usr/share/nginx/html/assets/&amp;lt;index_filename&amp;gt;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;重启 it-tools&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>FlareSolverr 部署教程：绕过 Cloudflare 的反爬虫保护</title><link>https://bysansheng.cn/posts/flaresolverr-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/flaresolverr-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;FlareSolverr 是一个用于绕过 Cloudflare 反爬虫保护的工具。其核心工作原理是模拟一个真实的浏览器，当你向它发送请求后，它会在后台启动一个基于 Chrome 的浏览器实例，访问你指定的目标 URL，并自动完成 Cloudflare 设置的验证挑战。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 FlareSolverr&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/flaresolverr/config &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/flaresolverr/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    ports:
      - 8191:8191
    environment:
      - LOG_LEVEL=info
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    ports:
      - 8191:8191
    environment:
      - LOG_LEVEL=info
      - TZ=Asia/Shanghai
      - HTTP_PROXY=http://172.17.0.1:8118
      - HTTPS_PROXY=http://172.17.0.1:8118
      - NO_PROXY=localhost,127.0.0.1
    volumes:
      - ./config:/config
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 FlareSolverr&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 FlareSolverr&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、使用示例&lt;/h2&gt;
&lt;h3&gt;3.1、直接使用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://127.0.0.1:8191/v1&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d &apos;{
    &quot;cmd&quot;: &quot;request.get&quot;,
    &quot;url&quot;: &quot;https://www.google.com/&quot;,
    &quot;maxTimeout&quot;: 180000
  }&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、通过会话来使用&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;session_id&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的「会话ID」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;创建会话&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://127.0.0.1:8191/v1&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d &apos;{
    &quot;cmd&quot;: &quot;sessions.create&quot;,
    &quot;session&quot;: &quot;&amp;lt;session_id&amp;gt;&quot;,
  }&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用会话&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://127.0.0.1:8191/v1&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d &apos;{
    &quot;cmd&quot;: &quot;request.get&quot;,
    &quot;url&quot;: &quot;https://www.google.com/&quot;,
    &quot;session&quot;: &quot;&amp;lt;session_id&amp;gt;&quot;,
    &quot;maxTimeout&quot;: 180000
  }&apos; \
  --max-time 180
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除会话&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://127.0.0.1:8191/v1&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d &apos;{
    &quot;cmd&quot;: &quot;sessions.destroy&quot;,
    &quot;session&quot;: &quot;&amp;lt;session_id&amp;gt;&quot;,
  }&apos;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>HomeBox 部署教程：内网测速工具</title><link>https://bysansheng.cn/posts/homebox-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/homebox-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;HomeBox 是一个内网测速工具，常用于组建家庭局域网时，对网络进行持续压测，支持自定义发包大小、指定线程数量等。相关的测速工具很多，比如 iperf3、Speedtest，但是我个人更喜欢 HomeBox，它上手简单，UI 界面也十分直观。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 HomeBox&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/homebox/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/homebox/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  homebox:
    image: xgheaven/homebox
    container_name: homebox
    ports:
      - 43300:3300
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 HomeBox&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43300
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43300&lt;/code&gt; 访问 HomeBox 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 HomeBox&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、自定义选项&lt;/h2&gt;
&lt;h3&gt;3.1、单位&lt;/h3&gt;
&lt;p&gt;HomeBox 的测速单位分为 &lt;code&gt;B/s&lt;/code&gt; 和 &lt;code&gt;b/s&lt;/code&gt;，而 1B/s = 8b/s。像我们日常所说的宽带 1000M，500M，100M，其实就是 &lt;code&gt;b/s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%8D%95%E4%BD%8D.png&quot; alt=&quot;单位&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、传输配置&lt;/h3&gt;
&lt;p&gt;HomeBox 支持自定义发包大小、指定线程数量，其中 &lt;code&gt;Pack Count&lt;/code&gt; 就是传输包的大小，&lt;code&gt;Parallel&lt;/code&gt; 就是传输线程数量&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BC%A0%E8%BE%93%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;传输配置&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Komga 部署教程：自建漫画服务器</title><link>https://bysansheng.cn/posts/komga-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/komga-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Komga 是一款免费和开源的漫画服务器项目，可以管理本地 CBZ、CBR、PDF 和 EPUB 格式的漫画文件，支持在线阅读和编辑书籍的元数据，也有对系列漫画归档的设计。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持 OPDS v1 和 v2 协议&lt;/li&gt;
&lt;li&gt;可与 Kobo 阅读器同步，也支持 KOReader 同步&lt;/li&gt;
&lt;li&gt;提供 REST API，方便工具和脚本与之交互&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Komga&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/komga/config/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/komga/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;comic_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;漫画库&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  komga:
    image: gotson/komga:latest
    container_name: komga
    ports:
      - 45600:25600
    environment:
      - UID=0
      - GID=0
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
      - &amp;lt;comic_path&amp;gt;:/comic
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Komga&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 45600
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:45600&lt;/code&gt; 访问 Komga 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Komga&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、导入漫画库&lt;/h2&gt;
&lt;p&gt;打开 Komga 的 Web 页面，点击 &lt;code&gt;库&lt;/code&gt; 旁边的 &lt;code&gt;+&lt;/code&gt;，然后根据自己的喜好进行配置，最后 &lt;code&gt;添加&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E6%BC%AB%E7%94%BB%E5%BA%931.png&quot; alt=&quot;导入漫画库1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E6%BC%AB%E7%94%BB%E5%BA%932.png&quot; alt=&quot;导入漫画库2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E6%BC%AB%E7%94%BB%E5%BA%933.png&quot; alt=&quot;导入漫画库3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E6%BC%AB%E7%94%BB%E5%BA%934.png&quot; alt=&quot;导入漫画库4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AF%BC%E5%85%A5%E6%BC%AB%E7%94%BB%E5%BA%935.png&quot; alt=&quot;导入漫画库5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>LANraragi 部署教程：自建本子服务器</title><link>https://bysansheng.cn/posts/lanraragi-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/lanraragi-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;LANraragi 是一款多平台开源的漫画服务器项目，和 &lt;a href=&quot;/posts/komga-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;Komga&lt;/a&gt; 相比，它更加轻量与迅捷。只不过其本身并没有对系列漫画归档的设计，所以对于普通漫画来说不太友好。但想必你也能从它的 UI 看出，它是模仿 Ehentai 而设计的，更偏向于本子的存储与展示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 LANraragi&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/lanraragi/{thumb,database,plugin}/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/lanraragi/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;comic_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;漫画库&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  lanraragi:
    image: difegue/lanraragi
    container_name: lanraragi
    ports:
      - 43434:3000
    volumes:
      - ./thumb:/home/koyomi/lanraragi/thumb
      - ./database:/home/koyomi/lanraragi/database
      - ./plugin:/home/koyomi/lanraragi/lib/LANraragi/Plugin/Sideloaded
      - &amp;lt;comic_path&amp;gt;:/home/koyomi/lanraragi/content
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 LANraragi&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43434
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43434&lt;/code&gt; 访问 LANraragi 的 Web 页面&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;默认密码&lt;/strong&gt;：&lt;code&gt;kamimamita&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 LANraragi&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改默认语言&lt;/h2&gt;
&lt;p&gt;LANraragi 是不支持修改默认语言的，它会根据浏览器的 Accept-Language 自动切换语言。我个人感觉中文版页面做的并不太好，所以需要通过 Nginx 来实现设置英语为强制语言。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/lanraragi.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 43430;
    listen [::]:43430;
    server_name _;

    location / {
        proxy_pass http://localhost:43434;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        
        proxy_set_header Accept-Language &quot;en-US,en;q=0.9&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/lanraragi.conf /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw delete allow 43434
sudo ufw allow 43430
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43430&lt;/code&gt; 访问 LANraragi 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、插件配置&lt;/h2&gt;
&lt;p&gt;打开 LANraragi 的 Web 页面，进入 &lt;code&gt;Settings &amp;gt; Plugin Configuration&lt;/code&gt;，即可修改 LANraragi 的插件配置&lt;/p&gt;
&lt;h3&gt;4.1、启用 ComicInfo 插件&lt;/h3&gt;
&lt;p&gt;LANraragi 并不像 &lt;a href=&quot;/posts/komga-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/&quot;&gt;Komga&lt;/a&gt; 那样，默认可以直接读取漫画文件内的 &lt;code&gt;ComicInfo.xml&lt;/code&gt;，想要使用这个功能，需要在插件配置中手动开启。&lt;/p&gt;
&lt;p&gt;打开 LANraragi 的插件配置页面，展开 &lt;code&gt;Metadata Plugins&lt;/code&gt;，找到 &lt;code&gt;ComicInfo&lt;/code&gt; 并启用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%90%AF%E7%94%A8-ComicInfo-%E6%8F%92%E4%BB%B6.png&quot; alt=&quot;启用-ComicInfo-插件&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Navidrome 部署教程：自建音乐服务器</title><link>https://bysansheng.cn/posts/navidrome-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/navidrome-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Navidrome 是一个开源的基于 Web 的音乐收藏服务器项目和流媒体播放器，它让人可以随时随地通过任意浏览器或移动设备畅听个人音乐库，宛如专属的私人 Spotify / Apple Music。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Navidrome&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/navidrome/data/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/navidrome/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;music_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;音乐库&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    ports:
      - 44533:4533
    environment:
      - ND_SCANINTERVAL=1m
      - ND_LOGLEVEL=info
    volumes:
      - ./data:/data
      - &amp;lt;music_path&amp;gt;:/music
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 Navidrome&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 44533
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:44533&lt;/code&gt; 访问 Navidrome 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 Navidrome&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>PairDrop 部署教程：通过浏览器实现点对点的文件传输</title><link>https://bysansheng.cn/posts/paridrop-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/paridrop-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;PairDrop 支持通过浏览器实现局域网或互联网环境下的点对点文件传输，是基于 Snapdrop 二次开发的工具，灵感源自苹果的 AirDrop。&lt;/p&gt;
&lt;p&gt;堪称文件传输的瑞士军刀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;家庭共享：手机平板电脑互传全家桶&lt;/li&gt;
&lt;li&gt;会议救场：现场演示资料秒发全场&lt;/li&gt;
&lt;li&gt;运维利器：服务器日志直传手机查看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 PairDrop&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/pairdrop/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/pairdrop/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  pairdrop:
    image: linuxserver/pairdrop:latest
    container_name: pairdrop
    ports:
      - 43049:3000
    environment:
      - PUID=0
      - PGID=0
      - WS_FALLBACK=false
      - RATE_LIMIT=false
      - RTC_CONFIG=false
      - DEBUG_MODE=false
      - TZ=Asia/Shanghai
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 PairDrop&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 43049
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:43049&lt;/code&gt; 访问 PairDrop 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 PairDrop&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ddns-go 部署教程：动态域名解析工具</title><link>https://bysansheng.cn/posts/ddns-go-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/ddns-go-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;ddns-go 是一款简单好用的动态域名解析工具，它可以帮助你自动将域名解析到「公网IP」。比如你希望在本地部署网站，但是因为「公网IP」是动态的，一直前往 DNS 控制台更改 DNS 解析就会很繁琐。而 ddns-go 就能很好的解决这一难题，帮助你自动修改 DNS 解析。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 ddns-go&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/ddns_go/data/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/ddns_go/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  ddns-go:
    image: jeessy/ddns-go:latest
    container_name: ddns-go
    network_mode: host
    volumes:
      - ./data:/root
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 ddns-go&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 9876
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:9876&lt;/code&gt; 访问 ddns-go 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、关闭 ddns-go&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、基础配置&lt;/h2&gt;
&lt;p&gt;首先，选择你的 DNS 服务商，并填写相关密钥。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE1.png&quot; alt=&quot;基础配置1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后，自行选择 IPv4 和 IPv6 的启用，以及获取 IP 的方式，并在 &lt;code&gt;Domains&lt;/code&gt; 里填写你需要解析到此服务器的域名。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE2.png&quot; alt=&quot;基础配置2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其他配置里面，一般不建议开启公共访问，如需开启，请做好防护准备。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE3.png&quot; alt=&quot;基础配置3&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>通过 s3fs 挂载对象存储到本地</title><link>https://bysansheng.cn/posts/%E9%80%9A%E8%BF%87-s3fs-%E6%8C%82%E8%BD%BD%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%88%B0%E6%9C%AC%E5%9C%B0/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E9%80%9A%E8%BF%87-s3fs-%E6%8C%82%E8%BD%BD%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E5%88%B0%E6%9C%AC%E5%9C%B0/</guid><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我始终认为对象存储和网盘相比，是更适合存储文件的一种形式。刚好我从朋友那白嫖了 15TB 的对象存储，遂记录下如何通过 s3fs 把对象存储挂载到本地。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装 s3fs&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;apt install -y s3fs
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、配置密钥&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;ak&amp;gt;&lt;/code&gt; 请自行替换成个人实际 Access Key&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;sk&amp;gt;&lt;/code&gt; 请自行替换成个人实际 Secret Key&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;lt;ak&amp;gt;:&amp;lt;sk&amp;gt; &amp;gt; /root/.cache/.passwd
chmod 600 /root/.cache/.passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、创建挂载点&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;s3fs_name&amp;gt;&lt;/code&gt; 请自行替换成个人实际的本地挂载名称&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir /mnt/&amp;lt;s3fs_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、启动 s3fs&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;bucket_name&amp;gt;&lt;/code&gt; 请自行替换成个人实际要挂载的桶名称&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;url&amp;gt;&lt;/code&gt; 请自行替换成个人实际的文件网关&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/&amp;lt;s3fs_name&amp;gt;.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=S3FS Service
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/s3fs &amp;lt;bucket_name&amp;gt; /mnt/&amp;lt;s3fs_name&amp;gt;/ \
    -o passwd_file=/root/.cache/.passwd \
    -o url=&amp;lt;url&amp;gt; \
    -o use_path_request_style
ExecStop=/bin/fusermount -u /mnt/&amp;lt;s3fs_name&amp;gt;/
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now &amp;lt;s3fs_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>通过 ssh 打通云服务器 socks 通道进行代理</title><link>https://bysansheng.cn/posts/%E9%80%9A%E8%BF%87-ssh-%E6%89%93%E9%80%9A%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8-socks-%E9%80%9A%E9%81%93%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%90%86/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E9%80%9A%E8%BF%87-ssh-%E6%89%93%E9%80%9A%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8-socks-%E9%80%9A%E9%81%93%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%90%86/</guid><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E8%87%AA%E5%BB%BA%E6%9C%BA%E5%9C%BA%E8%8A%82%E7%82%B9&quot;&gt;前文说到&lt;/a&gt;，大部分 IDC 的云服务器对于自建代理节点有着严格限制，但也不是没有备选方案，比如通过 ssh 的连接打通 socks 通道进行代理，只不过这样的速度会慢很多，但也聊胜于无。本文将介绍如何通过 autossh 自动创建 socks5 通道，以及通过 privoxy 转换成 http 通道。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、部署 autossh&lt;/h2&gt;
&lt;h3&gt;1.1、安装 autossh&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y autossh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、将公钥上传到云服务器&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际的云服务器 IP&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519
ssh-copy-id root@&amp;lt;ip&amp;gt; # 除了要输入密码的时候，其它都按回车
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、启动 autossh&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/autossh.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=AutoSSH Service
After=network.target

[Service]
User=root
ExecStart=/usr/bin/autossh -M 0 -D 0.0.0.0:1080 -N root@&amp;lt;ip&amp;gt; -p 22 \
  -o ExitOnForwardFailure=yes -o &quot;ServerAliveInterval 30&quot; -o &quot;ServerAliveCountMax 3&quot;
Restart=always

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 1080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now autossh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4、设置定时重启&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo sh -c &apos;echo &quot;0 */4 * * * root /bin/systemctl restart autossh&quot; &amp;gt;&amp;gt; /etc/crontab&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证任务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep autossh /etc/crontab
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 privoxy&lt;/h2&gt;
&lt;h3&gt;2.1、安装 privoxy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y privoxy
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、配置 privoxy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/privoxy/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启用监听地址
listen-address  0.0.0.0:8118

# 在文件末尾添加转发规则
forward-socks5t / 127.0.0.1:1080 .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 8118
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、重启 privoxy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart privoxy
sudo systemctl enable privoxy
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、使用示例&lt;/h2&gt;
&lt;h3&gt;3.1、使用 socks 代理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -x socks5h://127.0.0.1:1080 https://www.google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;import requests

requests.get(
    url=&quot;https://www.google.com&quot;,
    proxies={
        &quot;http&quot;: &quot;socks5h://127.0.0.1:1080&quot;, 
        &quot;https&quot;: &quot;socks5h://127.0.0.1:1080&quot;
    },
    timeout=60
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、使用 http 代理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -x http://127.0.0.1:8118 https://www.google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget https://github.com/fluidicon.png
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Ubuntu 配置 DNS</title><link>https://bysansheng.cn/posts/ubuntu-%E9%85%8D%E7%BD%AE-dns/</link><guid isPermaLink="true">https://bysansheng.cn/posts/ubuntu-%E9%85%8D%E7%BD%AE-dns/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;虽然我家已经通过软路由实现了使用自建 DNS 的统一网络代理，但是由于种种考量，我的 NAS 并没有接入。这就导致在 NAS 进行某些程序单独配置代理时，有时会遇到 DNS 污染，所以需要自行修改 DNS，本文是关于我配置 DNS 的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装 resolvconf&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y resolvconf
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、配置 DNS&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的 DNS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/resolvconf/resolv.conf.d/head
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加以下几行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nameserver &amp;lt;ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nameserver 8.8.8.8
nameserver 2001:4860:4860::8888
nameserver 8.8.4.4
nameserver 2001:4860:4860::8844
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、应用 DNS&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart resolvconf
sudo resolvconf -u
sudo systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;!-- ```bash
sudo apt purge resolvconf
sudo apt autoremove
sudo systemctl restart systemd-resolved&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Ubuntu 挂载新硬盘</title><link>https://bysansheng.cn/posts/ubuntu-%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/</link><guid isPermaLink="true">https://bysansheng.cn/posts/ubuntu-%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在闲鱼上淘了一块 2TB 的「镁光1100」固态硬盘，虽然是几年前的老古董了，但是价格只要 550，所以我准备给它挂到我的 NAS 上跑 PT，本文是对于我个人挂载新硬盘的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、挂载&lt;/h2&gt;
&lt;h3&gt;1.1、确认硬盘的设备名称&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo fdisk -l
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、清除硬盘&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;sdX&amp;gt;&lt;/code&gt; 请自行替换成个人实际的&amp;lt;u&amp;gt;&lt;strong&gt;硬盘设备名称&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo wipefs -a /dev/&amp;lt;sdX&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、格式化硬盘&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mkfs.ext4 /dev/&amp;lt;sdX&amp;gt;  # 可选其他文件系统（如 ntfs、xfs）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4、创建挂载点&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 请自行替换成个人实际的&amp;lt;u&amp;gt;&lt;strong&gt;硬盘挂载名称&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir /mnt/&amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.5、系统挂载&lt;/h3&gt;
&lt;p&gt;获取硬盘 uuid&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo blkid /dev/&amp;lt;sdX&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 fstab 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件末尾添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UUID=&amp;lt;uuid&amp;gt; /mnt/&amp;lt;name&amp;gt; ext4 defaults 0 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UUID=1498ac8c-20f9-41a7-a0e9-4cb4c6f1cd2a /mnt/870evo ext4 defaults 0 2
UUID=82cdc352-36ce-491a-bf4d-eee10418d35f /mnt/sc001xt_1 ext4 defaults 0 2
UUID=dac7aff6-7cf6-4cdb-a069-935a658b3b87 /mnt/sc001xt_2 ext4 defaults 0 2
UUID=39432d77-f57d-420c-9dc6-0c96acb38c43 /mnt/micron1100 ext4 defaults 0 2
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.6、测试挂载配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mount -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有报错，则表示配置正确&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、卸载&lt;/h2&gt;
&lt;p&gt;在 fstab 文件中删除挂载信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后卸除挂载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo umount /mnt/&amp;lt;name&amp;gt;
sudo rmdir /mnt/&amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>使用 frp 进行内网穿透</title><link>https://bysansheng.cn/posts/%E4%BD%BF%E7%94%A8-frp-%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E4%BD%BF%E7%94%A8-frp-%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;要让自己的局域网设备实现内网穿透，首先得有一台带公网 IP 的云服务器，这里推荐&lt;a href=&quot;https://www.rainyun.com/MTIzMDg4_&quot;&gt;雨云&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、新建文件夹&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/frp/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/frp/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、下载 frp&lt;/h2&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/fatedier/frp/releases&quot;&gt;https://github.com/fatedier/frp/releases&lt;/a&gt; 选择合适的版本&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;fatedier/frp&quot;}&lt;/p&gt;
&lt;p&gt;然后下载相应的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O frp.tar.gz &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O frp.tar.gz https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget -O frp.tar.gz https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -zxvf frp.tar.gz --one-top-level=frp --strip-components=1 &amp;amp;&amp;amp; rm -rf frp.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、配置服务端&lt;/h2&gt;
&lt;h3&gt;3.1、修改配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;token&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的密钥&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano frps.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加以下几行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[common]
bind_port = 7000
token = &amp;lt;token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 7000
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、运行 frps&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/frps.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加以下几行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Frp Server
After=network.target

[Service]
User=root
ExecStart=&amp;lt;path&amp;gt;/frp/frps -c &amp;lt;path&amp;gt;/frp/frps.toml
Restart=always

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x frps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now frps
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、配置客户端&lt;/h2&gt;
&lt;h3&gt;4.1、修改配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际的服务器 ip&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;token&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的密钥&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;local_port&amp;gt;&lt;/code&gt; 请自行替换成个人实际本地端口&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;remote_port&amp;gt;&lt;/code&gt; 请自行替换成个人实际穿透端口&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano frpc.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[common]
server_addr = &amp;lt;ip&amp;gt;
server_port = 7000
token = &amp;lt;token&amp;gt;

[&amp;lt;name&amp;gt;]
type = tcp
local_ip = 127.0.0.1
local_port = &amp;lt;local_port&amp;gt;
remote_port = &amp;lt;remote_port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、运行 frpc&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/frpc.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Frp Server
After=network.target

[Service]
User=root
ExecStart=&amp;lt;path&amp;gt;/frp/frpc -c &amp;lt;path&amp;gt;/frp/frpc.toml
Restart=always

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x frpc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now frpc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>使用 NUT 连接 UPS：保护 NAS 的硬盘</title><link>https://bysansheng.cn/posts/%E4%BD%BF%E7%94%A8-nut-%E8%BF%9E%E6%8E%A5-ups/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E4%BD%BF%E7%94%A8-nut-%E8%BF%9E%E6%8E%A5-ups/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我的 NAS 使用的 UPS 是 BK650M2，说实话，用了这么久，也就碰上过一次跳匝，所以只派上过用场一次。但是硬盘保护这种事，有一次闪失便会有不可逆的损伤，也算是提前做好应对风险的准备。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、检查 ups 连接&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
首先，要确保 UPS 的通讯线连接到 NAS 的 usb 数据口上。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;lsusb | grep &quot;American Power Conversion&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、安装 NUT&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y nut
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改配置文件&lt;/h2&gt;
&lt;h3&gt;3.1、配置 NUT 运行模式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/nut.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MODE=standalone
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、配置 UPS 驱动&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/ups.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容，这里以 BK650M2 为主：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[bk650m2]
    driver = usbhid-ups
    port = auto
    pollinterval = 10
    pollfreq = 15
    desc = &quot;BK650M2 UPS&quot;

    ignorelb

    # 电量小于 30% 时强制关机
    override.battery.charge.low = 30
    
    # 剩余运行时间小于 10 分钟时关机
    override.battery.runtime.low = 600
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试驱动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo upsdrvctl start
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、配置用户&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/upsd.users
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[upsmon]
    password = &amp;lt;password&amp;gt;
    upsmon master
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4、配置监听网络接口&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/upsd.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LISTEN 0.0.0.0 3493
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5、配置本地监控&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/upsmon.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MONITOR bk650m2@localhost 1 upsmon &amp;lt;password&amp;gt; master
NOTIFYCMD /usr/sbin/upssched
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加设备访问权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -a -G nut $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.6、配置自定义事件&lt;/h3&gt;
&lt;h3&gt;* 3.6.1、编写处理脚本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/upssched-cmd.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

case $1 in
  power-off)
    logger -t upssched-cmd &quot;UPS on battery for 180s, forcing shutdown&quot;
    /usr/sbin/upsmon -c fsd
    ;;
  *)
    logger -t upssched-cmd &quot;Unrecognized upssched command: $1&quot;
    ;;
esac
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/nut/upssched-cmd.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.6.2、修改相关配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nut/upssched.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CMDSCRIPT /etc/nut/upssched-cmd.sh
PIPEFN /run/nut/upssched.pipe
LOCKFN /run/nut/upssched.lock
AT ONBATT * START-TIMER power-off 180
AT ONLINE * CANCEL-TIMER power-off
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.7 修改 systemd 配置&lt;/h3&gt;
&lt;h3&gt;* 3.7.1 修改 nut-server 配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/systemd/system/nut-server.service.d/
sudo nano /etc/systemd/system/nut-server.service.d/override.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Network UPS Tools - power devices information server
After=network.target nut-driver.service
Before=nut-monitor.service

[Service]
Restart=always
RestartSec=10
StartLimitInterval=200
StartLimitBurst=5

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.7.2 修改 nut-monitor 配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/systemd/system/nut-monitor.service.d/
sudo nano /etc/systemd/system/nut-monitor.service.d/override.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Network UPS Tools - power device monitor and shutdown controller
After=network.target nut-server.service

[Service]
Restart=always
RestartSec=10
StartLimitInterval=200
StartLimitBurst=5
ExecStartPre=/bin/sleep 5

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、启动 NUT&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl restart nut-driver nut-server nut-monitor
sudo systemctl enable nut-driver nut-server nut-monitor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upsc bk650m2@localhost
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、设置定时重启&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo sh -c &apos;echo &quot;0 */3 * * * root /bin/systemctl restart nut-driver&quot; &amp;gt;&amp;gt; /etc/crontab&apos;
sudo sh -c &apos;echo &quot;0 */3 * * * root /bin/systemctl restart nut-server&quot; &amp;gt;&amp;gt; /etc/crontab&apos;
sudo sh -c &apos;echo &quot;0 3 * * * root /bin/systemctl restart nut-monitor&quot; &amp;gt;&amp;gt; /etc/crontab&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证任务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep nut /etc/crontab
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6、断电测试&lt;/h2&gt;
&lt;p&gt;查看日志&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo journalctl -f -u nut-monitor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模拟断电，先拔掉 UPS 电源插头，然后观察日志&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;确认行为&lt;/strong&gt;：&lt;br /&gt;
1、延迟几秒后状态切换为电池供电&lt;br /&gt;
2、电量或时间阈值触发后，系统应自动关机&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Openlist 搭建教程：一款优秀的文件列表工具</title><link>https://bysansheng.cn/posts/openlist-%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openlist-%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Openlist 是一个支持多种存储的文件列表工具，可用于更好地管理文件和资源。我本人并没有那么多网盘需要聚合，部署 Openlist 也就是看看本地文件和对象存储了，但不可否认的是，Openlist 确实很好用，也很方便。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、部署 Openlist&lt;/h2&gt;
&lt;h3&gt;1.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/openlist/{data} &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/openlist/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、下载 Openlist&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/OpenListTeam/OpenList/releases&quot;&gt;https://github.com/OpenListTeam/OpenList/releases&lt;/a&gt; 选择合适的版本&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;OpenListTeam/OpenList&quot;}&lt;/p&gt;
&lt;p&gt;然后下载相应的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O openlist.tar.gz &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O openlist.tar.gz https://github.com/OpenListTeam/OpenList/releases/download/beta/openlist-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget -O openlist.tar.gz https://github.com/OpenListTeam/OpenList/releases/download/beta/openlist-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -zxvf openlist.tar.gz --one-top-level=openlist --strip-components=1 &amp;amp;&amp;amp; rm -rf openlist.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x openlist
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、启动 Openlist&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/openlist.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=OpenList Service
After=network.target

[Service]
User=root
WorkingDirectory=&amp;lt;path&amp;gt;/openlist/
ExecStart=&amp;lt;path&amp;gt;/openlist server
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=OpenList Service
After=network.target

[Service]
User=root
WorkingDirectory=&amp;lt;path&amp;gt;/openlist/
Environment=&quot;HTTP_PROXY=http://127.0.0.1:8118&quot;
Environment=&quot;HTTPS_PROXY=http://127.0.0.1:8118&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1&quot;
ExecStart=&amp;lt;path&amp;gt;/openlist server
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now openlist
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4、链接 SSL 证书&lt;/h3&gt;
&lt;p&gt;本文以 letsencrypt 证书为演示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 请自行替换成个人实际获取证书的域名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ln -s /etc/letsencrypt/live/&amp;lt;domain&amp;gt;/fullchain.pem ./data/
ln -s /etc/letsencrypt/live/&amp;lt;domain&amp;gt;/privkey.pem ./data/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.5、修改配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./data/config.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &quot;api_key&quot;: &quot;&quot;,
    &quot;index&quot;: &quot;openlist&quot;
  },
  &quot;scheme&quot;: {
    &quot;address&quot;: &quot;0.0.0.0&quot;,
    &quot;http_port&quot;: -1,
    &quot;https_port&quot;: 45244,
    &quot;force_https&quot;: true,
    &quot;cert_file&quot;: &quot;data/fullchain.pem&quot;,
    &quot;key_file&quot;: &quot;data/privkey.pem&quot;,
    &quot;unix_file&quot;: &quot;&quot;,
    &quot;unix_file_perm&quot;: &quot;&quot;,
    &quot;enable_h2c&quot;: false,
    &quot;enable_h3&quot;: false
  },
  &quot;temp_dir&quot;: &quot;data/temp&quot;,
  &quot;bleve_dir&quot;: &quot;data/bleve&quot;,
  &quot;dist_dir&quot;: &quot;&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart openlist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 45244
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;https://localhost:45244&lt;/code&gt; 访问 Openlist 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.6、查看管理员账号&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;journalctl -u openlist | grep -E &quot;username|password&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、添加存储&lt;/h2&gt;
&lt;p&gt;打开 Openlist 的 Web 页面，进入 &lt;code&gt;管理 &amp;gt; 存储&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;添加&lt;/code&gt;，然后配置相关内容&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是我本人的常用配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;.*&amp;gt;&lt;/code&gt; 请自行替换成个人实际内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;添加「本机存储」&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;驱动&lt;/strong&gt;：&lt;code&gt;本机存储&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;挂载路径&lt;/strong&gt;：&amp;lt;target_path&amp;gt;&lt;br /&gt;
&lt;strong&gt;排序依据&lt;/strong&gt;：&lt;code&gt;名称&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;排序方式&lt;/strong&gt;：&lt;code&gt;升序&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;文件夹排序方式&lt;/strong&gt;：&lt;code&gt;文件夹置顶&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;根文件夹路径&lt;/strong&gt;：&amp;lt;source_path&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;添加「对象存储」&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;驱动&lt;/strong&gt;：&lt;code&gt;对象存储&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;挂载路径&lt;/strong&gt;：&amp;lt;target_path&amp;gt;&lt;br /&gt;
&lt;strong&gt;缓存过期时间&lt;/strong&gt;：&lt;code&gt;1&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;排序依据&lt;/strong&gt;：&lt;code&gt;名称&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;排序方式&lt;/strong&gt;：&lt;code&gt;升序&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;文件夹排序方式&lt;/strong&gt;：&lt;code&gt;文件夹置顶&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;启用签名&lt;/strong&gt;：&lt;code&gt;开启&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;根文件夹路径&lt;/strong&gt;：&lt;code&gt;/&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;存储桶&lt;/strong&gt;：&amp;lt;backup&amp;gt;&lt;br /&gt;
&lt;strong&gt;端点&lt;/strong&gt;：&amp;lt;url&amp;gt;&lt;br /&gt;
&lt;strong&gt;访问密钥 ID&lt;/strong&gt;：&amp;lt;ak&amp;gt;&lt;br /&gt;
&lt;strong&gt;访问密钥&lt;/strong&gt;：&amp;lt;sk&amp;gt;&lt;br /&gt;
&lt;strong&gt;强制路径样式&lt;/strong&gt;：&lt;code&gt;开启&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;列出对象版本&lt;/strong&gt;：&lt;code&gt;V2&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;添加「OpenList」&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;驱动&lt;/strong&gt;：&lt;code&gt;OpenList&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;挂载路径&lt;/strong&gt;：&amp;lt;target_path&amp;gt;&lt;br /&gt;
&lt;strong&gt;缓存过期时间&lt;/strong&gt;：&lt;code&gt;1&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;排序依据&lt;/strong&gt;：&lt;code&gt;名称&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;排序方式&lt;/strong&gt;：&lt;code&gt;升序&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;文件夹排序方式&lt;/strong&gt;：&lt;code&gt;文件夹置顶&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;根文件夹路径&lt;/strong&gt;：&lt;code&gt;/&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;链接&lt;/strong&gt;：&amp;lt;url&amp;gt;&lt;br /&gt;
&lt;strong&gt;用户名&lt;/strong&gt;：&amp;lt;username&amp;gt;&lt;br /&gt;
&lt;strong&gt;密码&lt;/strong&gt;：&amp;lt;password&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、修改样式&lt;/h2&gt;
&lt;p&gt;打开 Openlist 的 Web 页面，进入 &lt;code&gt;管理 &amp;gt; 设置 &amp;gt; 全局&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;自定义内容&lt;/code&gt; 中可以修改样式&lt;/p&gt;
&lt;p&gt;以下是我个人的常用样式，包括 txt 预览默认自动换行，Markdown 预览美化等&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
const observer = new MutationObserver((mutations) =&amp;gt; {
    mutations.forEach(() =&amp;gt; {
        const buttons = document.querySelectorAll(&apos;div.obj-box.hope-stack button.hope-select__trigger&apos;);
        if (buttons[0] &amp;amp;&amp;amp; buttons[1]) {
            if (!buttons[0].classList.contains(&apos;global-first-listbox-btn&apos;)) {
                buttons[0].classList.add(&apos;global-first-listbox-btn&apos;);
            }
            if (!buttons[1].classList.contains(&apos;global-second-listbox-btn&apos;)) {
                buttons[1].classList.add(&apos;global-second-listbox-btn&apos;);
            }
        }
    });
});

observer.observe(document.body, {
    childList: true,
    subtree: true
});
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
.markdown-body pre code[class*=&quot;language-txt&quot; i] {
    display: block !important;
    width: 100% !important;
    white-space: pre-wrap !important;
    overflow-wrap: break-word !important;
    word-break: break-all !important;
    line-height: 2 !important;
    font-family: 
        &quot;Source Han Serif SC&quot;,
        &quot;Noto Serif CJK SC&quot;,
        &quot;Source Han Serif CN&quot;,
        &quot;Noto Serif CJK&quot;,
        &quot;source-han-serif-sc&quot;,
        serif !important; 
    font-size: 16px !important;
}

.markdown-body :is(h1,h2,h3,h4,h5,h6,p){
    padding-inline: var(--hope-space-2) !important;
}
.markdown-body blockquote{
    margin-inline: var(--hope-space-2) !important;
    padding: 0 0.25em !important;
}
.markdown-body&amp;gt;:first-child {
    margin-top: 10px !important;
}
.markdown-body&amp;gt;:last-child {
    margin-bottom: 10px !important;
}

.global-first-listbox-btn {
    width: calc(var(--hope-sizes-full) - var(--hope-sizes-32) - 5px) !important;
}
div:has(&amp;gt; .global-second-listbox-btn) {
    width: var(--hope-sizes-32) !important;
    opacity: 1 !important;
}
.global-second-listbox-btn {
    position: relative !important;
    top: -48px !important;
    border-color: var(--hope-colors-info5) !important;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Ubuntu 配置 Samba</title><link>https://bysansheng.cn/posts/ubuntu-%E9%85%8D%E7%BD%AE-samba/</link><guid isPermaLink="true">https://bysansheng.cn/posts/ubuntu-%E9%85%8D%E7%BD%AE-samba/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;关于 NAS 文件的管理方式多种多样，而使用 Samba 作为广为流传的一种方式，虽然我个人认为它并不太好，但它无疑是极为方便、简单的。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装 Samba&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y samba
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、创建 Samba 用户&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo smbpasswd -a root
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、修改配置文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 请自行替换成个人实际挂载名称&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt; 请自行替换成个人实际用户名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/samba/smb.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件末尾添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&amp;lt;name&amp;gt;]
path = &amp;lt;path&amp;gt;
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = &amp;lt;user&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root]
path = /root/
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = root

[870evo]
path = /mnt/870evo/
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = root

[sc001xt_1]
path = /mnt/sc001xt_1/
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = root

[sc001xt_2]
path = /mnt/sc001xt_2/
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = root

[micron1100]
path = /mnt/micron1100/
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = root
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、重启 Samba&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart smbd nmbd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow Samba
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、Windows 连接到 Samba&lt;/h2&gt;
&lt;p&gt;首先进入 &lt;code&gt;文件资源管理器&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;找到此电脑并右键，点击 &lt;code&gt;映射网络驱动器&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Windows-%E8%BF%9E%E6%8E%A5%E5%88%B0-Samba-1.png&quot; alt=&quot;Windows-连接到-Samba_1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入相应的信息，然后点击 &lt;code&gt;完成&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/Windows-%E8%BF%9E%E6%8E%A5%E5%88%B0-Samba-2.png&quot; alt=&quot;Windows-连接到-Samba_2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>aria2 和 aria-ng 部署教程：多协议下载工具</title><link>https://bysansheng.cn/posts/aria2-%E5%92%8C-aria-ng-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/aria2-%E5%92%8C-aria-ng-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;aria2 是一个多协议下载工具，aria-ng 是相应的 Web 管理工具。二者结合，就是一个管理方便，高效迅速的网页下载工具。我写的一些爬虫程序，也都会连接 aria2 去下载资源。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;nginx&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Nginx&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装并启动 Nginx
sudo apt update &amp;amp;&amp;amp; sudo apt install -y nginx
sudo systemctl --now enable nginx

# 验证
nginx -v

# 删除默认配置
rm -rf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 aria2&lt;/h2&gt;
&lt;h3&gt;2.1、安装 aria2&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y aria2
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、创建配置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p &amp;lt;path&amp;gt;/aria/aria2/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/aria2/
touch ./aria2/aria2.conf
touch ./aria2/aria2.session
nano ./aria2/aria2.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载目录
dir=&amp;lt;path&amp;gt;/aria2/Downloads

# 自动重命名
auto-file-renaming=true

# RPC 设置
enable-rpc=true
rpc-listen-all=true
rpc-allow-origin-all=true
rpc-secret=&amp;lt;password&amp;gt;

# 断点续传
input-file=&amp;lt;path&amp;gt;/aria/aria2/aria2.session
save-session=&amp;lt;path&amp;gt;/aria/aria2/aria2.session

# 并发和连接
max-concurrent-downloads=5
split=10
max-connection-per-server=10

# 忽略安全证书问题
check-certificate=false

# 设置重试请求
max-tries=10
retry-wait=30
auto-file-renaming=false
connect-timeout=60
timeout=60

# 日志
log=&amp;lt;path&amp;gt;/aria/aria2/aria2.log
log-level=warn
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、运行 aria2&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/aria2.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Aria2c Download Manager
After=network.target

[Service]
User=root
ExecStart=/usr/bin/aria2c --conf-path=&amp;lt;path&amp;gt;/aria/aria2/aria2.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 6800
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl daemon-reload
sudo systemctl enable --now aria2
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、设置定时重启&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo sh -c &apos;echo &quot;0 3 * * * root /bin/systemctl restart aria2&quot; &amp;gt;&amp;gt; /etc/crontab&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证任务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep aria2 /etc/crontab
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、部署 aria-ng&lt;/h2&gt;
&lt;h3&gt;3.1、下载 aria-ng&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/mayswind/AriaNg/releases&quot;&gt;https://github.com/mayswind/AriaNg/releases&lt;/a&gt; 选择合适的版本&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;mayswind/AriaNg&quot;}&lt;/p&gt;
&lt;p&gt;然后下载相应的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O ariang.zip &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O ariang.zip https://github.com/mayswind/AriaNg/releases/download/1.3.11/AriaNg-1.3.11.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget -O ariang.zip https://github.com/mayswind/AriaNg/releases/download/1.3.11/AriaNg-1.3.11.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo unzip ariang.zip -d aria-ng &amp;amp;&amp;amp; rm -rf ariang.zip
sudo chmod -R 777 aria-ng
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、配置 Nginx&lt;/h3&gt;
&lt;p&gt;配置 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/aria-ng.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加以下几行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 45245;
    listen [::]:45245;
    server_name _;

    root &amp;lt;path&amp;gt;/aria2/aria-ng/;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/aria-ng.conf /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 45245
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:45245&lt;/code&gt; 访问 aria2-ng 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、连接 aria2&lt;/h3&gt;
&lt;p&gt;打开 aria2-ng 的 Web 页面，进入 &lt;code&gt;AriaNG 设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击左上角加号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%BF%9E%E6%8E%A5-aria2-1.png&quot; alt=&quot;连接-aria2-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入 aria2 相关信息，然后刷新页面就可以了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%BF%9E%E6%8E%A5-aria2-2.png&quot; alt=&quot;连接-aria2-2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>N100 在 Ubuntu 上安装核显驱动</title><link>https://bysansheng.cn/posts/n100-%E5%9C%A8-ubuntu-%E4%B8%8A%E5%AE%89%E8%A3%85%E6%A0%B8%E6%98%BE%E9%A9%B1%E5%8A%A8/</link><guid isPermaLink="true">https://bysansheng.cn/posts/n100-%E5%9C%A8-ubuntu-%E4%B8%8A%E5%AE%89%E8%A3%85%E6%A0%B8%E6%98%BE%E9%A9%B1%E5%8A%A8/</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我目前的主力 NAS 是基于畅网 N100 开发板组装的，系统使用的是 Ubuntu 22.04.5 LTS。在这台 NAS 上需要用到核显的情况现在也就两个，一个是 Emby 的硬件解码，另一个就是 Immich 的 AI 识别，本文是对于我个人安装核显驱动的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、准备环境&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y gpg-agent wget
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、添加 Intel 软件源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;. /etc/os-release
if [[ ! &quot; jammy &quot; =~ &quot; ${VERSION_CODENAME} &quot; ]]; then
  echo &quot;Ubuntu version ${VERSION_CODENAME} not supported&quot;
else
  wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | \
    sudo gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg
  echo &quot;deb [arch=amd64 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu ${VERSION_CODENAME}/lts/2350 unified&quot; | \
    sudo tee /etc/apt/sources.list.d/intel-gpu-${VERSION_CODENAME}.list
  sudo apt update
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、安装核心驱动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y \
  linux-headers-$(uname -r) \
  linux-modules-extra-$(uname -r) \
  flex bison \
  intel-fw-gpu intel-i915-dkms xpu-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启系统&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、安装计算和媒体中心&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y \
  intel-opencl-icd intel-level-zero-gpu level-zero \
  intel-media-va-driver-non-free libmfx1 libmfxgen1 libvpl2 \
  libigdgmm12 vainfo hwinfo clinfo intel-gpu-tools
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、验证安装&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 验证 i915 驱动
hwinfo --display

# 查看 GPU 硬件信息
sudo xpu-smi discovery -d 0

# 查看 GPU 使用情况
intel_gpu_top
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.hellowood.dev/posts/ubuntu-22-%E5%AE%89%E8%A3%85-intel-n100-%E6%98%BE%E5%8D%A1%E9%A9%B1%E5%8A%A8/&quot;&gt;Ubuntu 22 安装 Intel N100 显卡驱动&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>自建代理节点：Xray、Shadowsocks</title><link>https://bysansheng.cn/posts/%E8%87%AA%E5%BB%BA%E6%9C%BA%E5%9C%BA%E8%8A%82%E7%82%B9/</link><guid isPermaLink="true">https://bysansheng.cn/posts/%E8%87%AA%E5%BB%BA%E6%9C%BA%E5%9C%BA%E8%8A%82%E7%82%B9/</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;事先声明，本人对于网络技术的了解还比较薄弱，本文也只是写了如何搭建代理节点，但代理是什么，以及节点如何使用，我一概不知，也没有这方面的兴趣和精力去了解。&lt;/p&gt;
&lt;p&gt;言归正传，如果想要自建代理节点，首先得有一台云服务器，大部分 IDC 的云服务器对于 Xray、Shadowsocks 这一类的工具都有自动检查，不建议在明确不支持自建代理节点的 IDC 的云服务器上去这么做，如果你的 IDC 不支持自建代理节点，那我只能建议你去使用 &lt;a href=&quot;/posts/%E9%80%9A%E8%BF%87-ssh-%E6%89%93%E9%80%9A%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8-socks-%E9%80%9A%E9%81%93%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%90%86&quot;&gt;socks&lt;/a&gt; 连接了，只不过这样子速度会慢很多。&lt;/p&gt;
&lt;p&gt;支持自建代理节点的 IDC 也有挺多的，但我对这一方面的了解不多，如果你有好用的 IDC 推荐，也可以告诉我，让我贴在文章结尾。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、Xray&lt;/h2&gt;
&lt;h3&gt;1.1、安装 Xray&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo bash -c &quot;$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)&quot; @ install
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、启动 Xray&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;port&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的端口&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;uuid&amp;gt;&lt;/code&gt; 请自行替换成个人实际生成的 uuid&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先要生成 uuid 作为连接密钥&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uuidgen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/local/etc/xray/config.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;inbounds&quot;: [{
    &quot;port&quot;: &amp;lt;port&amp;gt;,
    &quot;protocol&quot;: &quot;vmess&quot;,
    &quot;settings&quot;: {
      &quot;clients&quot;: [{
        &quot;id&quot;: &quot;&amp;lt;uuid&amp;gt;&quot;,
        &quot;alterId&quot;: 0
      }]
    },
    &quot;streamSettings&quot;: {
      &quot;network&quot;: &quot;ws&quot;,
      &quot;security&quot;: &quot;none&quot;
    }
  }],
  &quot;outbounds&quot;: [{&quot;protocol&quot;: &quot;freedom&quot;}]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now xray
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、编写 Clash 配置文件的节点&lt;/h3&gt;
&lt;p&gt;不同内核的节点格式是不同的，请自行查看相关信息并修改。&lt;/p&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是 Meta / Mihomo 内核的节点格式&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;具体配置请前往 &lt;a href=&quot;https://wiki.metacubex.one/config/proxies&quot;&gt;https://wiki.metacubex.one/config/proxies&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的节点名称&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际的服务器 ip&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: &quot;&amp;lt;name&amp;gt;&quot;
    type: vmess
    server: &amp;lt;ip&amp;gt;
    port: &amp;lt;port&amp;gt;
    uuid: &quot;&amp;lt;uuid&amp;gt;&quot;
    alterId: 0
    cipher: auto
    network: ws
    tls: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4、删除 Xray&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt purge xray &amp;amp;&amp;amp; sudo apt autoremove
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、Shadowsocks&lt;/h2&gt;
&lt;h3&gt;2.1、安装 Shadowsocks&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y shadowsocks-libev
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、启动 Shadowsocks&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;port&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的端口&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;编辑配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/shadowsocks-libev/config.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;server&quot;: &quot;0.0.0.0&quot;,
    &quot;server_port&quot;: &amp;lt;port&amp;gt;,
    &quot;password&quot;: &quot;&amp;lt;password&amp;gt;&quot;,
    &quot;method&quot;: &quot;chacha20-ietf-poly1305&quot;,
    &quot;timeout&quot;: 60,
    &quot;fast_open&quot;: true,
    &quot;mode&quot;: &quot;tcp_and_udp&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now shadowsocks-libev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、编写 Clash 配置文件的节点&lt;/h3&gt;
&lt;p&gt;不同内核的节点格式是不同的，请自行查看相关信息并修改。&lt;/p&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这是 Meta / Mihomo 内核的节点格式&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;具体配置请前往 &lt;a href=&quot;https://wiki.metacubex.one/config/proxies&quot;&gt;https://wiki.metacubex.one/config/proxies&lt;/a&gt; 查看文档&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 请自行替换成个人实际选择的节点名称&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际的服务器 ip&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;proxies:
  - name: &quot;&amp;lt;name&amp;gt;&quot;
    type: ss
    server: &amp;lt;ip&amp;gt;
    port: &amp;lt;port&amp;gt;
    cipher: chacha20-ietf-poly1305
    password: &quot;&amp;lt;password&amp;gt;&quot;
    udp: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、删除 Shadowsocks&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt purge shadowsocks-libev &amp;amp;&amp;amp; sudo apt autoremove
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>qBittorrent 部署教程：p2p 下载工具</title><link>https://bysansheng.cn/posts/qbittorrent-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/qbittorrent-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;人人为我，我为人人，这就是 p2p ( Peer-to-Peer ) 技术诞生的根本。作为不完全依赖服务端的，去中心化的文件分享技术，它可以有效地摆脱第三方监控，让人们在互联网上随心所欲地分享资源。&lt;/p&gt;
&lt;p&gt;qBittorrent 就是众多 p2p 下载工具中较为出众的一个，本文会简略地写出 qBittorrent 的部署步骤和优化方式，以及在结尾贴出一些常用的资源站点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%89%8D%E8%A8%80%E7%A4%BA%E4%BE%8B.png&quot; alt=&quot;前言示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Docker&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，则可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Docker&lt;/h3&gt;
&lt;p&gt;具体安装方法可以查看 &lt;a href=&quot;/posts/docker-%E6%95%99%E7%A8%8B&quot;&gt;Docker 教程&lt;/a&gt; 的说明&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 qBittorrent&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/qbittorrent/config/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/qbittorrent/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、编写 docker-compose 配置文件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;downloads_path&amp;gt;&lt;/code&gt; 请自行替换成个人实际&lt;strong&gt;下载保存&lt;/strong&gt;路径&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  qbittorrent:
    image: linuxserver/qbittorrent:latest
    container_name: qbittorrent
    ports:
      - 48081:48081
      - 46881:46881
    environment:
      - WEBUI_PORT=48081
      - TORRENTING_PORT=46881
      - PUID=0
      - PGID=0
      - UMASK=000
    volumes:
      - ./config:/config
      - &amp;lt;downloads_path&amp;gt;:&amp;lt;downloads_path&amp;gt;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、启动 qBittorrent&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 48081
sudo ufw allow 46881
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:48081&lt;/code&gt; 访问 qBittorrent 的 Web 页面&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;默认用户名&lt;/strong&gt;：&lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、查看密码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker logs qbittorrent 2&amp;gt;&amp;amp;1 | grep -E &quot;password&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、关闭 qBittorrent&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、通用配置&lt;/h2&gt;
&lt;h3&gt;3.1、开启 UPnP&lt;/h3&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 连接&lt;/code&gt;，开启 UPnP&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%BC%80%E5%90%AF-UPnP.png&quot; alt=&quot;开启-UPnP&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、关闭 Torrent 排队&lt;/h3&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; BitTorrent&lt;/code&gt;，关闭 Torrent 排队&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%85%B3%E9%97%AD-Torrent-%E6%8E%92%E9%98%9F.png&quot; alt=&quot;关闭-Torrent-排队&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、BT 配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
BT ( BitTorrent ) 是一种公开的、去中心化的文件共享协议，p2p 中的代表，所有人都可以自由加入和下载。它可以将文件分片存储于多个参与者的设备中，&amp;lt;u&amp;gt;&lt;strong&gt;让每个人既可以是下载者，也可以是分享者&lt;/strong&gt;&amp;lt;/u&amp;gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.1、配置热门 Tracker&lt;/h3&gt;
&lt;p&gt;BT 下载速度来源于其他用户的上传速度，而 Tracker 就是 BT 下载中相当重要的一个角色，它可以帮助你连接更多的用户，提升整体下载速度，提前配置一些热门的 Tracker，可以很好地提升你的 p2p 体验。&lt;/p&gt;
&lt;p&gt;这是一个热门 Tracker 的整合项目&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;XIU2/TrackersListCollection&quot;}&lt;/p&gt;
&lt;p&gt;我们需要在这个项目里选择一个合适的 Tracker 列表，如：https://cf.trackerslist.com/best.txt&lt;/p&gt;
&lt;p&gt;然后打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; BitTorrent&lt;/code&gt;，填入 URl 并开启自动更新&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%85%8D%E7%BD%AE%E7%83%AD%E9%97%A8-Tracker-1.png&quot; alt=&quot;配置热门-Tracker-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果无法成功获取，大概率是 CF 问题，可以先跳到下面的 &lt;a href=&quot;#311%E8%8E%B7%E5%8F%96%E4%BC%98%E9%80%89-ip&quot;&gt;获取优选 IP&lt;/a&gt; 看看&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;过多的 Tracker 会引起大量的网络请求，如 DNS 查询、建立连接、发送请求和解析响应，所以我建议将「总是向所有等级的 Tracker 汇报」关闭。&lt;/p&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 高级&lt;/code&gt;，关闭这个选项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%85%8D%E7%BD%AE%E7%83%AD%E9%97%A8-Tracker-2.png&quot; alt=&quot;配置热门-Tracker-2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、做种限制&lt;/h3&gt;
&lt;p&gt;现如今的 BT 环境并不太好，特别是之前还有玩 PCDN 的拿 BT 资源无限刷下载率。BT 不像 PT 那样有严格的审查，所以我还是建议做一些自行限制的，比如限制分享率为 1~2，做到有拿有还就好。&lt;/p&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; BitTorrent&lt;/code&gt;，自行修改做种限制&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%81%9A%E7%A7%8D%E9%99%90%E5%88%B6.png&quot; alt=&quot;做种限制&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、PT 配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
PT ( Private Tracker ) 是建立在 BT 技术之上的私有社区，大部分必须通过邀请码注册才能进入，对下载和上传有一定限制和要求。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5.1、使用 CloudflareST 自选 IP 解决 Tracker 连接问题&lt;/h3&gt;
&lt;p&gt;PT 本身就是小众的东西，一些小的站点更是脆弱无比，所以这些站点基本都会套上 CF，由于 CF 没有在国内架设免费节点且因国内网络特殊性可能导致 qBittorrent 下载、做种时出现 Tracker 未工作或待机的情况，这时候就需要设置优选 IP 来保证连接。&lt;/p&gt;
&lt;h3&gt;* 5.1.1、获取优选 IP&lt;/h3&gt;
&lt;h4&gt;创建目录&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/cfst/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/cfst/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;下载 CloudflareST&lt;/h4&gt;
&lt;p&gt;请先前往 &lt;a href=&quot;https://github.com/XIU2/CloudflareSpeedTest/releases&quot;&gt;https://github.com/XIU2/CloudflareSpeedTest/releases&lt;/a&gt; 选择适合的版本&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;XIU2/CloudflareSpeedTest&quot;}&lt;/p&gt;
&lt;p&gt;然后下载相应的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O cfst.tar.gz &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O cfst.tar.gz https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 \
  wget -O cfst.tar.gz https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.3.4/cfst_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -zxvf cfst.tar.gz --one-top-level=cfst --strip-components=1 &amp;amp;&amp;amp; rm -rf cfst.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置运行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x cfst
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;获取优选 IP&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;./cfst -dd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以自行挑选一个合适的优选 IP&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 5.1.2、设置优选 IP&lt;/h3&gt;
&lt;h4&gt;返回 qBittorrent 目录&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;lt;path&amp;gt;/qbittorrent/
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;编写 docker-compose 配置文件&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 请自行替换成目标 PT 站点的 Tracker 地址&lt;br /&gt;
&lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人选择的优选 IP&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;services:
  qbittorrent:
    image: linuxserver/qbittorrent:latest
    container_name: qbittorrent
    ports:
      - 48081:48081
      - 46881:46881
    environment:
      - WEBUI_PORT=48081
      - PEER_PORT=46881
      - PUID=0
      - PGID=0
      - UMASK=000
    volumes:
      - &amp;lt;path&amp;gt;/qbittorrent:/config
      - &amp;lt;downloads_path&amp;gt;:&amp;lt;downloads_mount&amp;gt;
    extra_hosts:
      - &amp;lt;domain&amp;gt;:&amp;lt;ip&amp;gt;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;重新启动 qBittorrent&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;docker compose down &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;5.2、限制下载速度&lt;/h3&gt;
&lt;p&gt;相比于 BT 而言，PT 的大部分资源下载速度都很快。这是好事，但太快了也不好，特别是对一些性能较弱的小主机，很难带动长时间的高速下载。这时候，就需要对下载速度进行一定的限制。&lt;/p&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 速度&lt;/code&gt;，自行修改全局速度限制&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%99%90%E5%88%B6%E4%B8%8B%E8%BD%BD%E9%80%9F%E5%BA%A6.png&quot; alt=&quot;限制下载速度&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.3、预分配磁盘空间&lt;/h3&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 下载&lt;/code&gt;，开启预分配磁盘空间&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%A2%84%E5%88%86%E9%85%8D%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4.png&quot; alt=&quot;预分配磁盘空间&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.4、关闭 DHT / PEX / LSD&lt;/h3&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; BitTorrent&lt;/code&gt;，关闭 DHT / PEX / LSD&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%85%B3%E9%97%AD-DHT-PEX-LSD.png&quot; alt=&quot;关闭-DHT-PEX-LSD&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.5、取消连接限制&lt;/h3&gt;
&lt;p&gt;打开 qBittorrent 的 Web 页面，进入 &lt;code&gt;设置 &amp;gt; 连接&lt;/code&gt;，取消连接限制&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%8F%96%E6%B6%88%E8%BF%9E%E6%8E%A5%E9%99%90%E5%88%B6.png&quot; alt=&quot;取消连接限制&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;常用站点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nyaa.si/&quot;&gt;nyaa 表站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sukebei.nyaa.si/&quot;&gt;nyaa 里站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mikanani.me/&quot;&gt;蜜柑计划&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://share.dmhy.org/&quot;&gt;动漫花园&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>OpenWRT 配置 AdGuardHome</title><link>https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-adguardhome/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-adguardhome/</guid><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;AdGuardHome 是 OpenWRT 上的一个免费开源，功能强大的自建 DNS 服务器工具，本文是对于我个人常用设置的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装 AdGuaedHome&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;系统 &amp;gt; 软件包&lt;/code&gt;&lt;br /&gt;
搜索并安装 &lt;code&gt;luci-app-adguardhome&lt;/code&gt;&lt;br /&gt;
或者手动上传安装包&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、安装核心&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; AdGuardHome&lt;/code&gt;
点击更新核心版本&lt;/p&gt;
&lt;p&gt;也可自行下载并上传核心，替换 &lt;code&gt;/usr/bin/AdGuardHome/AdGuardHome&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;然后给予该文件&lt;strong&gt;执行权限&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 755 /usr/bin/AdGuardHome/AdGuardHome
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、初始配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; AdGuardHome&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击网页管理端口下面的按钮，即可打开 AdGuaedHome 的 Web 页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;初始配置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一次应该是网页管理界面，需要配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;网页管理界面端口&lt;/strong&gt;：&lt;code&gt;3000&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;DNS 服务器端口&lt;/strong&gt;：&lt;code&gt;5353&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4、DNS 设置&lt;/h2&gt;
&lt;p&gt;打开 AdGuaedHome 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;设置 &amp;gt; DNS 设置 &amp;gt; 上游 DNS 服务器&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;填入多个 DNS 服务器，换行区分&lt;/p&gt;
&lt;p&gt;推荐：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;119.29.29.29
223.5.5.5
8.8.8.8
1.1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并且配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;并行请求&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/DNS_%E8%AE%BE%E7%BD%AE1.png&quot; alt=&quot;DNS_设置1&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;进入 &lt;code&gt;设置 &amp;gt; DNS 设置 &amp;gt; DNS 服务配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;速度限制&lt;/strong&gt;：&lt;code&gt;0&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/DNS_%E8%AE%BE%E7%BD%AE2.png&quot; alt=&quot;DNS_设置2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;进入 &lt;code&gt;设置 &amp;gt; DNS 设置 &amp;gt; DNS 缓存配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启用缓存&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;缓存大小&lt;/strong&gt;：&lt;code&gt;1024&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/DNS_%E8%AE%BE%E7%BD%AE3.png&quot; alt=&quot;DNS_设置3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、设置定时重启&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;系统 &amp;gt; 计划任务&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在其中添加：&lt;code&gt;0 3 * * * /etc/init.d/AdGuardHome restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E9%87%8D%E5%90%AF.png&quot; alt=&quot;设置定时重启&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6、修复开机不自动启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;/etc/init.d/AdGuardHome disable
/etc/init.d/AdGuardHome enable
reboot
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>OpenWRT 配置 Nikki</title><link>https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-nikki/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-nikki/</guid><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Nikki 是 OpenWRT 上的一个网络代理工具，功能精简专一，本文是对于我个人常用设置的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、全局配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; 全局配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IPv6&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;统一延迟&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;TCP 并发&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;禁用 TCP Keep Alive&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;TCP Keep Alive 空闲&lt;/strong&gt;：&lt;code&gt;600&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;TCP Keep Alive 间隔&lt;/strong&gt;：&lt;code&gt;15&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;全局配置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2、外部控制&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; 外部控制&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;保存节点/策略组选择&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;勾选自己想使用的面板，并修改 API 密钥&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%A4%96%E9%83%A8%E6%8E%A7%E5%88%B6.png&quot; alt=&quot;外部控制&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、TUN 配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; TUN 配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;栈&lt;/strong&gt;：&lt;code&gt;Mixed&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/TUN-%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;TUN-配置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、GeoX 配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; GeoX 配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GeoIP 格式&lt;/strong&gt;：&lt;code&gt;MMDB&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;GeoData 加载器&lt;/strong&gt;：&lt;code&gt;标准加载器&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;定时更新 GeoX 文件&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;GeoX 文件更新间隔&lt;/strong&gt;：&lt;code&gt;72&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果需要自定义数据库下载地址，可以前往 &lt;a href=&quot;https://github.com/MetaCubeX/meta-rules-dat&quot;&gt;https://github.com/MetaCubeX/meta-rules-dat&lt;/a&gt; 选择合适的数据库&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;MetaCubeX/meta-rules-dat&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/GeoX-%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;GeoX-配置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也可自行下载并上传 GeoX 文件，放入 &lt;code&gt;/etc/nikki/run/&lt;/code&gt; 文件夹&lt;/p&gt;
&lt;p&gt;然后给予这些文件&lt;strong&gt;执行权限&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 755 /etc/nikki/run/GeoSite.dat
chmod 755 /etc/nikki/run/geoip.metadb
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、DNS 配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; DHCP/DNS &amp;gt; 常规&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DNS 重定向&lt;/strong&gt;：&lt;code&gt;不勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/DNS-%E9%85%8D%E7%BD%AE1.png&quot; alt=&quot;DNS-配置1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; DNS 配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DNS 模式&lt;/strong&gt;：&lt;code&gt;Fake-IP&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/DNS-%E9%85%8D%E7%BD%AE2.png&quot; alt=&quot;DNS-配置2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6、嗅探器配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 混入配置 &amp;gt; 嗅探器配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启用&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%97%85%E6%8E%A2%E5%99%A8%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;嗅探器配置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7、代理配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 代理配置 &amp;gt; 代理配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IPv4 DNS 劫持&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;IPv6  DNS 劫持&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE1.png&quot; alt=&quot;代理配置1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 代理配置 &amp;gt; 路由器代理&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启用&lt;/strong&gt;：&lt;code&gt;不勾选&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE2.png&quot; alt=&quot;代理配置2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8、插件配置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; Nikki &amp;gt; 插件配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启用&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;启动延迟&lt;/strong&gt;：&lt;code&gt;60&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;定时重启&lt;/strong&gt;：&lt;code&gt;勾选&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Cron 表达式&lt;/strong&gt;：&lt;code&gt;0 4 * * *&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上传自己的配置文件并选择&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE.png&quot; alt=&quot;插件配置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也可自行下载并上传 Meta 核心，替换 &lt;code&gt;/usr/bin/mihomo&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;然后给予该文件&lt;strong&gt;执行权限&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod 755 /usr/bin/mihomo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后重新启动 Nikki&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9、设置定时重启&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;系统 &amp;gt; 计划任务&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在其中添加：&lt;code&gt;0 3 * * * /etc/init.d/nikki restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E9%87%8D%E5%90%AF.png&quot; alt=&quot;设置定时重启&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>OpenWRT 配置 OpenClash</title><link>https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-openclash/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openwrt-%E9%85%8D%E7%BD%AE-openclash/</guid><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;OpenClash 是 OpenWRT 上的一个网络代理工具，功能强大多样，本文是对于我个人常用设置的记录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装插件&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;系统 &amp;gt; 软件包&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;搜索并安装 &lt;code&gt;openclash&lt;/code&gt; 和 &lt;code&gt;ipset&lt;/code&gt;&lt;br /&gt;
或者手动上传安装包&lt;/p&gt;
&lt;p&gt;然后下载相关依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opkg update
opkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full \
  iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun \
  kmod-inet-diag unzip luci-compat luci luci-base
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、配置内核&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; 版本更新&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;找到 Meta 内核进行下载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%85%8D%E7%BD%AE%E5%86%85%E6%A0%B81.png&quot; alt=&quot;配置内核1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 配置管理&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;上传文件类型&lt;/strong&gt;：&lt;code&gt;内核文件&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之后选择 Meta 内核文件进行上传&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%85%8D%E7%BD%AE%E5%86%85%E6%A0%B82.png&quot; alt=&quot;配置内核2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、设置运行模式&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; 模式设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;运行模式&lt;/strong&gt;：&lt;code&gt;Fake-IP (TUN-混合) 模式&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;网络栈协议&lt;/strong&gt;：&lt;code&gt;Mixed&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;代理模式&lt;/strong&gt;：&lt;code&gt;Rule&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;延迟启动（秒）&lt;/strong&gt;：&lt;code&gt;60&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE%E8%BF%90%E8%A1%8C%E6%A8%A1%E5%BC%8F.png&quot; alt=&quot;设置运行模式&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4、设置 DNS&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; DHCP/DNS &amp;gt; 限制&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DNS 查询缓存的大小&lt;/strong&gt;：&lt;code&gt;0&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE-DNS1.png&quot; alt=&quot;设置-DNS1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; DNS 设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本地 DNS 劫持&lt;/strong&gt;：&lt;code&gt;使用防火墙转发&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE-DNS2.png&quot; alt=&quot;设置-DNS2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 覆写设置 &amp;gt; DNS 设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自定义上游 DNS 服务器&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Fake-IP 持久化&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Fake-IP-Fitter&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;设置自定义上游 DNS 服务器&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NameServer&lt;/strong&gt;：自行勾选&lt;br /&gt;
&lt;strong&gt;FallBack&lt;/strong&gt;：自行勾选&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE-DNS3.png&quot; alt=&quot;设置-DNS3&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5、设置数据库&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; GEO 数据库订阅&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自动更新 GeoIP MMDB 数据库&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;自动更新 GeoSite 数据库&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自行选择更新模式&lt;/p&gt;
&lt;p&gt;保存后点击 &lt;code&gt;检查并更新&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%AE%BE%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93.png&quot; alt=&quot;设置数据库&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6、Meta 设置&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 覆写设置 &amp;gt; Meta 设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启用 TCP 并发&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;启用统一延迟&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Geodata 数据加载方式&lt;/strong&gt;：&lt;code&gt;标准模式&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/Meta-%E8%AE%BE%E7%BD%AE.png&quot; alt=&quot;Meta-设置&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7、自定义规则&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 覆写设置 &amp;gt; 规则设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自定义规则&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;具体配置请前往 &lt;a href=&quot;https://wiki.metacubex.one/config/rules&quot;&gt;https://wiki.metacubex.one/config/rules&lt;/a&gt; 查看&lt;/p&gt;
&lt;p&gt;开启后可自定义规则，例如想让局域网某个设备只走直连，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- SRC-IP-CIDR,&amp;lt;ip&amp;gt;/32,DIRECT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%A7%84%E5%88%99.png&quot; alt=&quot;自定义规则&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8、处理 IPv6&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; IPv6 设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;允许 IPv6 类型 DNS 解析&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%A4%84%E7%90%86-IPv6.png&quot; alt=&quot;处理-IPv6&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9、黑白名单&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; 黑白名单&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;局域网访问控制模式&lt;/strong&gt;：&lt;code&gt;黑名单模式&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自行选择不走代理的局域网设备&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E9%BB%91%E7%99%BD%E5%90%8D%E5%8D%95.png&quot; alt=&quot;黑白名单&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10、定时重启&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 插件设置 &amp;gt; 定时重启&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;定时重启&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;重启时间(每周)&lt;/strong&gt;：&lt;code&gt;每天&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;重启时间(每天)&lt;/strong&gt;：&lt;code&gt;5:00&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E5%AE%9A%E6%97%B6%E9%87%8D%E5%90%AF.png&quot; alt=&quot;定时重启&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;11、上传订阅信息&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 配置订阅&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;添加订阅信息，填入机场名称和订阅地址，然后配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自动更新&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后自行选择更新模式&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;或者进入 &lt;code&gt;服务 &amp;gt; OpenClash &amp;gt; 配置管理&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;上传文件类型&lt;/strong&gt;：&lt;code&gt;配置文件&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后选择配置文件进行上传&lt;/p&gt;
</content:encoded></item><item><title>OpenWRT 基础配置</title><link>https://bysansheng.cn/posts/openwrt-%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE/</link><guid isPermaLink="true">https://bysansheng.cn/posts/openwrt-%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE/</guid><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;之前折腾软路由的时候，我的 N5105 天天崩溃，所以我曾一天装了好几次 OpenWRT，以及不同分支的不同版本。每次装完，都需要凭记忆去重新配置一遍，虽然最后排查出来是我廉价内存条的问题，但还是想写下这篇备忘录，以备不时之需。&lt;/p&gt;
&lt;p&gt;不过由于各分支不同版本之间存在差异，所以部分配置的选项所处的位置，名称都可能有所不同，需自行修改适应，本文以 ImmortalWRT 为主，且默认为主路由拨号上网，不考虑旁路由的情况。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、接口设置&lt;/h2&gt;
&lt;h3&gt;1.1、WAN 配置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 请自行替换成个人实际用户名&lt;br /&gt;
所有 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 请自行替换成个人实际密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; 接口&lt;/code&gt;，配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; wan &amp;gt; 编辑 &amp;gt; 常规设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;协议&lt;/strong&gt;：&lt;code&gt;PPPoE&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;设备&lt;/strong&gt;：&lt;code&gt;eth0&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;PAP/CHAP 用户名&lt;/strong&gt;：&amp;lt;username&amp;gt;&lt;br /&gt;
&lt;strong&gt;PAP/CHAP 密码&lt;/strong&gt;：&amp;lt;password&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; wan &amp;gt; 编辑 &amp;gt; 高级设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;LCP 响应故障阈值&lt;/strong&gt;：&lt;code&gt;10&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;LCP 响应间隔&lt;/strong&gt;：&lt;code&gt;5&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; wan &amp;gt; 编辑 &amp;gt; 防火墙设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;创建/分配防火墙区域&lt;/strong&gt;：&lt;code&gt;wan&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、LAN 配置&lt;/h3&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; 接口&lt;/code&gt;，配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; lan &amp;gt; 编辑 &amp;gt; 高级设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;IPv6 分配长度&lt;/strong&gt;：&lt;code&gt;64&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; lan &amp;gt; 编辑 &amp;gt; 防火墙设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;创建/分配防火墙区域&lt;/strong&gt;：&lt;code&gt;lan&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; lan &amp;gt; 编辑 &amp;gt; DHCP 服务器 &amp;gt; IPv6 设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;RA 服务&lt;/strong&gt;：&lt;code&gt;服务器模式&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;DHCPv6 服务&lt;/strong&gt;：&lt;code&gt;服务器模式&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;NDP 代理&lt;/strong&gt;：&lt;code&gt;已禁用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; lan &amp;gt; 编辑 &amp;gt; DHCP 服务器 &amp;gt; IPv6 RA 设置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;默认路由器&lt;/strong&gt;：&lt;code&gt;自动&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;启用 SLAAC&lt;/strong&gt;：&lt;code&gt;启用&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;RA 标记&lt;/strong&gt;：&lt;code&gt;受管配置、其它配置&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;网络 &amp;gt; 接口 &amp;gt; 设备 &amp;gt; br-lan &amp;gt; 配置&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;网桥端口&lt;/strong&gt;：勾选除了 eth0 以外的端口&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2、防火墙设置&lt;/h2&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; 防火墙 &amp;gt; 常规设置 &amp;gt; 常规设置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;入站数据&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;出站数据&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;转发&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;进入 &lt;code&gt;网络 &amp;gt; 防火墙 &amp;gt; 常规设置 &amp;gt; 区域 &amp;gt; lan =&amp;gt; wan &amp;gt; 编辑&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;入站数据&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;出站数据&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;转发&lt;/strong&gt;：&lt;code&gt;接受&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;3、扩容&lt;/h2&gt;
&lt;h3&gt;3.1、找到系统磁盘&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;fdisk -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中找到提供扩容的硬盘&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
后续的 &lt;code&gt;&amp;lt;sdX&amp;gt;&lt;/code&gt; 请自行替换成提供扩容的硬盘&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、创建新分区&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;fdisk /dev/&amp;lt;sdX&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入 &lt;code&gt;p&lt;/code&gt; 打印当前分区表&lt;br /&gt;
输入 &lt;code&gt;n&lt;/code&gt; 创建新分区&lt;br /&gt;
输入 &lt;code&gt;w&lt;/code&gt; 保存并退出&lt;/p&gt;
&lt;p&gt;然后重新查看系统磁盘分区&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fdisk -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中找到新创建的分区&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
后续的 &lt;code&gt;&amp;lt;sdXd&amp;gt;&lt;/code&gt; 请自行替换成新创建的分区&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、格式化新分区&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mkfs.ext4 /dev/&amp;lt;sdXd&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4、挂载新分区&lt;/h3&gt;
&lt;p&gt;打开 OpenWRT 的 Web 页面&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;openwrt &amp;gt; 系统 &amp;gt; 挂载点 &amp;gt; 添加&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置相关内容&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UUID&lt;/strong&gt;：&lt;code&gt;根据大小判断新创建的分区&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;挂载点&lt;/strong&gt;：&lt;code&gt;作为根文件系统使用&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5、根目录准备&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/&amp;lt;sdXd&amp;gt; /tmp/extroot
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.6、重启软路由&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;常用 OpenWRT 软件&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;&amp;lt;span style=&quot;white-space: nowrap;&quot;&amp;gt;类型&amp;lt;/span&amp;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;a href=&quot;/posts/openwrt-%E9%85%8D%E7%BD%AE-adguardhome&quot;&gt;adguardhome&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;自建 DNS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;luci-app-adguardhome&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argon&lt;/td&gt;
&lt;td&gt;主题&lt;/td&gt;
&lt;td&gt;&lt;code&gt;luci-theme-argon&lt;/code&gt;, &lt;code&gt;luci-app-argon-config&lt;/code&gt;, &lt;code&gt;luci-i18n-argon-config-zh-cn&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ddns-go&lt;/td&gt;
&lt;td&gt;动态 DNS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ddns-go&lt;/code&gt;, &lt;code&gt;luci-app-ddns-go&lt;/code&gt;, &lt;code&gt;luci-i18n-ddns-go-zh-cn&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lucky&lt;/td&gt;
&lt;td&gt;网络工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lucky&lt;/code&gt;, &lt;code&gt;luci-app-lucky&lt;/code&gt;, &lt;code&gt;luci-i18n-lucky-zh-cn&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;/posts/openwrt-%E9%85%8D%E7%BD%AE-nikki/&quot;&gt;nikki&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代理工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nikki&lt;/code&gt;, &lt;code&gt;luci-app-nikki&lt;/code&gt;, &lt;code&gt;luci-i18n-nikki-zh-cn&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;/posts/openwrt-%E9%85%8D%E7%BD%AE-openclash/&quot;&gt;openclash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;代理工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;luci-app-openclash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>Docker 教程</title><link>https://bysansheng.cn/posts/docker-%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/docker-%E6%95%99%E7%A8%8B/</guid><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Docker 是一种轻量级容器技术，可将应用及其依赖打包成标准化单元。它能实现跨平台一致运行，极大简化了开发、测试和部署流程。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、安装 Docker&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新 apt 包索引
sudo apt-get update

# 安装 apt 依赖包
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# 使用以下指令设置稳定版仓库
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
 $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;$VERSION_CODENAME&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# 更新 apt 包索引
sudo apt-get update

# 安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、基础命令&lt;/h2&gt;
&lt;h3&gt;2.1、下载镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker pull [选项] &amp;lt;镜像名&amp;gt;[:标签]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-a&lt;/code&gt; 下载镜像的所有标签版本&lt;br /&gt;
&lt;code&gt;-q&lt;/code&gt; 安静模式，不输出详细信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载最新版 Ubuntu 镜像
docker pull ubuntu

# 下载指定标签的 Nginx 镜像 (版本为 1.25.3)
docker pull nginx:1.25.3
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、查看信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 过滤查看 nginx 相关信息
docker images | grep nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、删除镜像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 删除指定镜像
docker rmi &amp;lt;镜像ID/镜像名:标签&amp;gt;

# 删除所有悬空镜像 (未被任何镜像引用的层)
docker image prune

# 删除所有未被容器使用的镜像
docker image prune -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 删除指定标签的镜像
docker rmi nginx:1.25.3

# 通过镜像ID前几位删除
docker rmi d23adb...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、查看容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 查看运行中的容器
docker ps

# 查看所有容器（包括已停止的）
docker ps -a

# 获取所有容器的 ID
docker ps -aq
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、停止或删除容器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 停止运行中的容器
docker stop &amp;lt;容器ID/容器名&amp;gt;

# 删除已停止的容器
docker rm &amp;lt;容器ID/容器名&amp;gt;

# 强制删除运行中的容器
docker rm -f &amp;lt;容器ID/容器名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.6、查看卷&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker volume ls
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.7、删除卷&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 删除指定卷
docker volume rm &amp;lt;卷名&amp;gt;

# 删除所有未被容器使用的卷
docker volume prune
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.8、其他常用基础命令&lt;/h3&gt;
&lt;h4&gt;运行容器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;docker run [选项] &amp;lt;镜像名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-d&lt;/code&gt; 后台运行&lt;br /&gt;
&lt;code&gt;-p &amp;lt;主机端口&amp;gt;:&amp;lt;容器端口&amp;gt;&lt;/code&gt; 端口映射&lt;br /&gt;
&lt;code&gt;-v &amp;lt;主机路径&amp;gt;:&amp;lt;容器路径&amp;gt;&lt;/code&gt; 数据卷挂载&lt;br /&gt;
&lt;code&gt;--name &amp;lt;容器名称&amp;gt;&lt;/code&gt; 为容器指定一个名称&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;进入运行中的容器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 使用/bin/bash
docker exec -it &amp;lt;容器ID&amp;gt; /bin/bash

# 使用/bin/sh
docker exec -it &amp;lt;容器ID&amp;gt; /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;查看容器资源使用&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;docker stats
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;查看镜像或容器的详细信息&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;docker inspect &amp;lt;镜像ID/容器ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、Docker-Compose&lt;/h2&gt;
&lt;p&gt;请确保当前目录包含 &lt;code&gt;docker-compose.yml&lt;/code&gt; 或 &lt;code&gt;Dockerfile&lt;/code&gt; 之类的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker compose up -d&lt;/code&gt; 构建并后台启动所有服务。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose stop&lt;/code&gt; 停止正在运行的服务，可以通过 docker-compose start 再次启动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose start&lt;/code&gt; 启动已停止的服务。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose down&lt;/code&gt; 停止项目并移除容器、网络、卷、镜像。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose ps&lt;/code&gt; 列出项目中目前的所有容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose logs -f&lt;/code&gt; 查看实时日志。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose build&lt;/code&gt; 构建（重新构建）项目中的服务容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose pull&lt;/code&gt; 拉取服务依赖的镜像。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose restart&lt;/code&gt; 用于重新启动项目中的服务容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose rm&lt;/code&gt; 删除所有（停止状态的）服务容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose create&lt;/code&gt; 用于创建在 Docker Compose 文件中定义的服务的容器，但不会启动这些容器。它主要用于预先创建容器，以便稍后通过 docker compose start 或 docker compose up 命令启动这些容器。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4、配置镜像站&lt;/h2&gt;
&lt;h3&gt;4.1、创建配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/docker/daemon.json
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、添加镜像站&lt;/h3&gt;
&lt;p&gt;先寻找合适的镜像站&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;dongyubin/DockerHub&quot;}&lt;/p&gt;
&lt;p&gt;打开配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/docker/daemon.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;registry-mirrors&lt;/code&gt; 列表内的站点请自行替换成合适的站点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.1ms.run&quot;,
    &quot;https://docker.xpg666.xyz&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4.3、重启 Docker 并验证&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 重启 Docker
sudo systemctl restart docker

# 验证
docker info | grep -i &quot;registry mirrors&quot; -A 6
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5、配置代理&lt;/h2&gt;
&lt;h3&gt;5.1、创建配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;5.2、添加代理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改以下内容：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;&amp;lt;ip&amp;gt;&lt;/code&gt; 请自行替换成个人实际代理地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[Service]
Environment=&quot;HTTP_PROXY=&amp;lt;ip&amp;gt;&quot;
Environment=&quot;HTTPS_PROXY=&amp;lt;ip&amp;gt;&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;5.3、重启 Docker 并验证&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证
sudo systemctl show --property=Environment docker
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/docker/ubuntu-docker-install.html&quot;&gt;Ubuntu Docker 安装 - 菜鸟教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/docker/docker-compose.html&quot;&gt;Docker Compose - 菜鸟教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Linux 命令备忘录</title><link>https://bysansheng.cn/posts/linux-%E5%91%BD%E4%BB%A4%E5%A4%87%E5%BF%98%E5%BD%95/</link><guid isPermaLink="true">https://bysansheng.cn/posts/linux-%E5%91%BD%E4%BB%A4%E5%A4%87%E5%BF%98%E5%BD%95/</guid><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我曾经在知乎刷到过一个问题，是探讨如何才算真正掌握 Linux 的，底下的回答各有不同。其中有一个回答说他先前面试的公司，是通过让人默写十个 Linux 命令来评判的。这种评判标准肯定是不够好的，但也令我有感写下这篇备忘录。&lt;/p&gt;
&lt;p&gt;由于我个人是长期的 Ubuntu 用户，所以这篇备忘录的内容以 Ubuntu 为主。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、cd 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cd [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入用户主目录
cd ~
cd

# 返回上一级目录
cd ..

# 进入根目录
cd /

# 返回之前所在的目录
cd -

# 使用绝对路径
cd /usr/local/bin

# 使用相对路径
cd ./folder/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、ls 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ls &amp;lt;选项&amp;gt; [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-l&lt;/code&gt; 详细列表显示&lt;br /&gt;
&lt;code&gt;-a&lt;/code&gt; 显示所有文件（包括隐藏文件）&lt;br /&gt;
&lt;code&gt;-h&lt;/code&gt; 显示人类可读的文件大小&lt;br /&gt;
&lt;code&gt;-t&lt;/code&gt; 按修改时间排序&lt;br /&gt;
&lt;code&gt;-r&lt;/code&gt; 反向排序&lt;br /&gt;
&lt;code&gt;-R&lt;/code&gt; 递归显示子目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 列出 /root/ 的文件
ls /root/

# 详细列出 /root/ 的所有文件
ls -la /root/

# 按时间排序显示 /root/ 的文件
ls -lt /root/

# 以人类可读的形式显示 /root/ 的文件大小
ls -lh /root/

# 递归列出 /root/ 的子目录
ls -R /root/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3、mkdir 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mkdir &amp;lt;选项&amp;gt; [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-p&lt;/code&gt; 递归创建目录&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 显示创建过程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建单个目录
mkdir ./new_folder/

# 递归创建多级目录
mkdir -p /path/to/folder/

# 创建多个目录
mkdir dir1 dir2 dir3

# 显示创建过程
mkdir -pv ./project/{src,bin,doc}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、rm 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rm &amp;lt;选项&amp;gt; [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-r&lt;/code&gt; 或 &lt;code&gt;-R&lt;/code&gt; 递归删除&lt;br /&gt;
&lt;code&gt;-f&lt;/code&gt; 强制删除，不提示&lt;br /&gt;
&lt;code&gt;-i&lt;/code&gt; 交互式删除，删除前确认&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 显示删除过程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 删除文件
rm file.txt

# 交互式删除
rm -i file.txt

# 递归删除目录
rm -r /path/to/folder/

# 强制递归删除
rm -rf /path/to/folder/
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;code&gt;rm -rf /&lt;/code&gt; 或 &lt;code&gt;rm -rf /*&lt;/code&gt; 会删除系统所有文件，切勿尝试&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;5、chown 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;chown &amp;lt;选项&amp;gt; [用户]&amp;lt;:用户组&amp;gt; [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-c&lt;/code&gt; 或 &lt;code&gt;--changes&lt;/code&gt; 仅在发生更改时显示详细输出&lt;br /&gt;
&lt;code&gt;-f&lt;/code&gt; 或 &lt;code&gt;--silent&lt;/code&gt; 静默模式，抑制大多数错误消息&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 或 &lt;code&gt;--verbose&lt;/code&gt; 显示每个文件的处理过程&lt;br /&gt;
&lt;code&gt;-R&lt;/code&gt; 或 &lt;code&gt;--recursive&lt;/code&gt; 递归更改文件和目录&lt;br /&gt;
&lt;code&gt;--reference=RFILE&lt;/code&gt; 使用参考文件的模式而不是指定值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 将文件所有者改为 user1
chown user1 file.txt

# 递归修改目录及其内容的所有者
chown -R user1 /path/to/folder/

# 同时修改所有者和用户组
chown user1:group1 file.txt

# 只修改用户组
chown :group1 file.txt

# 修改所有者并保持组不变
chown user1: file.txt

# 修改符号链接指向文件的所有者
chown -h user1 symlink
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;6、chmod 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;chmod &amp;lt;选项&amp;gt; [权限模式] [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-c&lt;/code&gt; 或 &lt;code&gt;--changes&lt;/code&gt; 仅在发生更改时显示详细输出&lt;br /&gt;
&lt;code&gt;-f&lt;/code&gt; 或 &lt;code&gt;--silent&lt;/code&gt; 静默模式，抑制大多数错误消息&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 或 &lt;code&gt;--verbose&lt;/code&gt; 显示每个文件的处理过程&lt;br /&gt;
&lt;code&gt;-R&lt;/code&gt; 或 &lt;code&gt;--recursive&lt;/code&gt; 递归更改文件和目录&lt;br /&gt;
&lt;code&gt;--reference=RFILE&lt;/code&gt; 使用参考文件的模式而不是指定值&lt;br /&gt;
&lt;code&gt;--from=[用户]&amp;lt;:用户组&amp;gt;&lt;/code&gt; 仅当当前所有者和组匹配时才更改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 数字模式设置权限
chmod 755 file.sh          # rwxr-xr-x
chmod 644 file.txt         # rw-r--r--
chmod 600 private.key      # rw-------

# 符号模式设置权限
chmod u+x script.sh        # 给所有者添加执行权限
chmod g-w file.txt         # 移除所属组的写权限
chmod o=r file.txt         # 设置其他用户只有读权限
chmod a+w logfile.log      # 所有用户添加写权限

# 递归修改目录权限
chmod -R 755 /var/www/html

# 同时设置多种权限
chmod u=rw,g=r,o= file.txt # 所有者读写，所属组读，其他用户无权限

# 复制其他用户的权限
chmod g=u file.txt         # 让组权限与所有者权限相同
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;7、find 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;find [目标] [选项] [操作]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-name&lt;/code&gt;：按文件名查找&lt;br /&gt;
&lt;code&gt;-type&lt;/code&gt;：按文件类型查找（f=文件，d=目录）&lt;br /&gt;
&lt;code&gt;-size&lt;/code&gt;：按文件大小查找&lt;br /&gt;
&lt;code&gt;-mtime&lt;/code&gt;：按修改时间查找&lt;br /&gt;
&lt;code&gt;-exec&lt;/code&gt;：对找到的文件执行命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在当前目录查找 *.txt 文件
find . -name &quot;*.txt&quot;

# 按文件类型查找
find /home -type f -name &quot;*.conf&quot;
find /var -type d -name &quot;log*&quot;

# 按大小查找
find / -size +100M    # 大于 100MB 的文件
find . -size -10k     # 小于 10KB 的文件

# 按时间查找
find . -mtime -7      # 7 天内修改的文件
find . -mtime +30     # 30 天前修改的文件

# 查找并删除
find /tmp -name &quot;*.tmp&quot; -delete
find . -name &quot;*.log&quot; -exec rm {} \;

# 查找并显示详细信息
find . -name &quot;*.sh&quot; -exec ls -l {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;8、du 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;du &amp;lt;选项&amp;gt; [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-h&lt;/code&gt;：显示人类可读的格式&lt;br /&gt;
&lt;code&gt;-s&lt;/code&gt;：只显示总大小&lt;br /&gt;
&lt;code&gt;-a&lt;/code&gt;：显示所有文件大小&lt;br /&gt;
&lt;code&gt;--max-depth=N&lt;/code&gt;：显示指定深度的目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 显示当前目录大小
du -sh

# 显示 /var/log/ 的文件详细大小
du -h /var/log/

# 显示 /var/log/ 指定深度的文件详细大小
du -h --max-depth=1 /var/log/

# 按大小排序显示 /var/log/ 的文件
du -h /var/log/ | sort -hr

# 查找 /var/log/ 的大文件
du -ah /var/log/ | sort -rh | head -20
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;9、lsof 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;lsof &amp;lt;选项&amp;gt; [文件名或进程名]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-i&lt;/code&gt; 显示网络连接&lt;br /&gt;
&lt;code&gt;-p&lt;/code&gt; 指定进程 ID&lt;br /&gt;
&lt;code&gt;-c&lt;/code&gt; 指定进程名&lt;br /&gt;
&lt;code&gt;-u&lt;/code&gt; 指定用户&lt;br /&gt;
&lt;code&gt;+D&lt;/code&gt; 递归显示目录下被打开的文件&lt;br /&gt;
&lt;code&gt;-n&lt;/code&gt; 不解析主机名&lt;br /&gt;
&lt;code&gt;-P&lt;/code&gt; 不解析端口名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 显示所有打开的文件
lsof

# 显示指定用户打开的文件
lsof -u root

# 显示网络连接
lsof -i

# 显示指定端口的连接
lsof -i :80

# 显示指定进程打开的文件
lsof -p 1234

# 显示指定命令打开的文件
lsof -c nginx

# 显示目录下被打开的文件
lsof +D /var/log/

# 显示 TCP 连接
lsof -i tcp

# 显示 UDP 连接  
lsof -i udp

# 显示指定用户和网络连接
lsof -u www-data -i

# 恢复被删除但仍在使用的文件
lsof | grep deleted
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;10、curl 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;curl &amp;lt;选项&amp;gt; [URL]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-o&lt;/code&gt; 将输出保存到指定文件&lt;br /&gt;
&lt;code&gt;-O&lt;/code&gt; 使用远程文件名保存到当前目录&lt;br /&gt;
&lt;code&gt;-L&lt;/code&gt; 跟随重定向&lt;br /&gt;
&lt;code&gt;-H&lt;/code&gt; 添加 HTTP 请求头&lt;br /&gt;
&lt;code&gt;-X&lt;/code&gt; 指定请求方法（GET/POST等）&lt;br /&gt;
&lt;code&gt;-d&lt;/code&gt; 发送 POST 数据&lt;br /&gt;
&lt;code&gt;-F&lt;/code&gt; 发送表单数据&lt;br /&gt;
&lt;code&gt;-u&lt;/code&gt; 设置认证信息&lt;br /&gt;
&lt;code&gt;-A&lt;/code&gt; 设置 User-Agent&lt;br /&gt;
&lt;code&gt;-x&lt;/code&gt; 使用代理&lt;br /&gt;
&lt;code&gt;-I&lt;/code&gt; 只获取响应头&lt;br /&gt;
&lt;code&gt;-s&lt;/code&gt; 静默模式&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 详细输出&lt;br /&gt;
&lt;code&gt;--limit-rate&lt;/code&gt; 限制传输速率&lt;br /&gt;
&lt;code&gt;-C&lt;/code&gt; - 断点续传&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载文件
curl -O https://example.com/file.zip
curl -o custom_name.zip https://example.com/file.zip

# 跟随重定向并保存
curl -L -o page.html https://example.com

# 发送POST请求
curl -X POST -d &quot;name=value&quot; https://api.example.com/submit
curl -X POST -H &quot;Content-Type: application/json&quot; -d &apos;{&quot;key&quot;:&quot;value&quot;}&apos; https://api.example.com/data

# 使用认证
curl -u username:password https://api.example.com/protected

# 上传文件
curl -F &quot;file=@localfile.txt&quot; https://example.com/upload

# 只查看头部信息
curl -I https://example.com

# 限制下载速度
curl --limit-rate 1M -O https://example.com/largefile.iso

# 断点续传
curl -C - -O https://example.com/largefile.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;11、wget 说明&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;wget &amp;lt;选项&amp;gt; [URL]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-O&lt;/code&gt; 指定输出文件名&lt;br /&gt;
&lt;code&gt;-P&lt;/code&gt; 指定下载目录&lt;br /&gt;
&lt;code&gt;-c&lt;/code&gt; 断点续传&lt;br /&gt;
&lt;code&gt;-r&lt;/code&gt; 递归下载&lt;br /&gt;
&lt;code&gt;-np&lt;/code&gt; 不追溯到父目录&lt;br /&gt;
&lt;code&gt;-l&lt;/code&gt; 设置递归深度&lt;br /&gt;
&lt;code&gt;-k&lt;/code&gt; 转换链接为本地链接&lt;br /&gt;
&lt;code&gt;-p&lt;/code&gt; 下载页面所需所有资源&lt;br /&gt;
&lt;code&gt;-q&lt;/code&gt; 静默模式&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 详细输出&lt;br /&gt;
&lt;code&gt;--limit-rate&lt;/code&gt; 限制下载速度&lt;br /&gt;
&lt;code&gt;-b&lt;/code&gt; 后台下载&lt;br /&gt;
&lt;code&gt;-i&lt;/code&gt; 从文件读取 URL 列表&lt;br /&gt;
&lt;code&gt;-U&lt;/code&gt; 设置 User-Agent&lt;br /&gt;
&lt;code&gt;--header&lt;/code&gt; 添加 HTTP 头&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载单个文件
wget https://example.com/file.zip

# 指定保存文件名和目录
wget -O custom_name.zip -P /home/user/downloads https://example.com/file.zip

# 断点续传
wget -c https://example.com/largefile.iso

# 递归下载整个网站
wget -r -l 5 -k -p https://example.com

# 限制下载速度
wget --limit-rate=500k https://example.com/largefile.zip

# 后台下载
wget -b https://example.com/largefile.zip

# 从文件读取URL列表下载
wget -i url_list.txt

# 设置 User-Agent
wget -U &quot;Mozilla/5.0&quot; https://example.com

# 添加请求头
wget --header=&quot;Authorization: Bearer token&quot; https://api.example.com/data
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;12、ufw&lt;/h2&gt;
&lt;h3&gt;12.1、查看 ufw 状态&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw status
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;12.2、开启/关闭防火墙&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 开启防火墙
sudo ufw enable
# 关闭防火墙
sudo ufw disable
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;12.3、完全开放/关闭某个端口&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 开放端口
sudo ufw allow &amp;lt;port&amp;gt;
# 关闭端口
sudo ufw delete allow &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开放 443 端口
sudo ufw allow 443
# 关闭 443 端口
sudo ufw delete allow 443
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;12.4、对于某个网段开放/关闭某个端口&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow from &amp;lt;network&amp;gt; to any port &amp;lt;port&amp;gt;
sudo ufw delete allow from &amp;lt;network&amp;gt; to any port &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 对 192.168.1.0/24 开放 443 端口
sudo ufw allow from 192.168.1.0/24 to any port 443
# 对 192.168.1.0/24 关闭 443 端口
sudo ufw delete allow from 192.168.1.0/24 to any port 443
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;13、rsync&lt;/h2&gt;
&lt;h3&gt;13.1、安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y rsync
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;13.2、说明&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rsync &amp;lt;参数&amp;gt; [源路径] [目标路径]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
路径结尾的 &lt;code&gt;/&lt;/code&gt; 表示目录内容，省略 &lt;code&gt;/&lt;/code&gt; 表示则整个目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;参数说明&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-r&lt;/code&gt; 递归复制&lt;br /&gt;
&lt;code&gt;-a&lt;/code&gt; 归档模式（保留权限、属性、递归目录）&lt;br /&gt;
&lt;code&gt;-v&lt;/code&gt; 显示详细过程&lt;br /&gt;
&lt;code&gt;-h&lt;/code&gt; 显示人类可读的文件大小&lt;br /&gt;
&lt;code&gt;-n&lt;/code&gt; 模拟运行（不实际同步）&lt;br /&gt;
&lt;code&gt;-z&lt;/code&gt; 在文件传输过程中进行压缩&lt;br /&gt;
&lt;code&gt;--progress&lt;/code&gt; 显示传输进度&lt;br /&gt;
&lt;code&gt;--delete&lt;/code&gt; 同步时删除目标目录中多余的文件&lt;br /&gt;
&lt;code&gt;--exclude&lt;/code&gt; 排除不需要同步的目录（例如 *.tmp 或 /folder1/folder2）&lt;br /&gt;
&lt;code&gt;--include&lt;/code&gt; 选择需要同步的目录（例如 *.tmp 或 /folder1/folder2）&lt;br /&gt;
&lt;code&gt;--checksum&lt;/code&gt; 严格校验内容&lt;br /&gt;
&lt;code&gt;--inplace&lt;/code&gt; 跳过临时文件创建&lt;br /&gt;
&lt;code&gt;--ignore-existing&lt;/code&gt;：跳过目标端已存在的文件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rsync -rvh --progress --inplace --delete \
  --include=&apos;/aria2/***&apos; \
  --include=&apos;/homepage/***&apos; \
  --include=&apos;/openlist/***&apos; \
  --include=&apos;/outline/***&apos; \
  --exclude=&apos;*&apos; \
  /mnt/sc001xt_1/.project/ /mnt/s3fs/backup1/.project/

rsync -rvh --progress --inplace --delete \
  --exclude=&apos;/.project/&apos; \
  /mnt/sc001xt_1/ /mnt/s3fs/backup1/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;14、unzip&lt;/h2&gt;
&lt;h3&gt;14.1、安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y unzip
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;14.2、说明&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 解压到当前目录
unzip &amp;lt;zip_path&amp;gt;

# 解压到指定目录
unzip &amp;lt;zip_path&amp;gt; -d &amp;lt;target_directory&amp;gt;

# 列出压缩包内容
unzip -l &amp;lt;zip_path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 解压 example.zip 到当前目录
unzip example.zip

# 解压 example.zip 到 ./folder/
unzip example.zip -d ./folder/

# 列出 example.zip 的内容
unzip -l example.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;15、7zip-full&lt;/h2&gt;
&lt;h3&gt;15.1、安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y 7zip-full
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;15.2、说明&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 解压到当前目录
7z x &amp;lt;7z_path&amp;gt;

# 解压到指定目录
7z x &amp;lt;7z_path&amp;gt; -o&amp;lt;target_directory&amp;gt;

# 列出压缩包内容
7z l &amp;lt;7z_path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 解压 example.7z 到当前目录
7z x example.7z

# 解压 example.7z 到 ./folder/
7z x example.7z -o./folder/

# 列出 example.7z 的内容
7z l example.7z
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;16、screen&lt;/h2&gt;
&lt;h3&gt;16.1、安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y screen
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;16.2、说明&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;screen &amp;lt;选项&amp;gt; [会话名或命令]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;常用选项&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;-S&lt;/code&gt; 创建新会话&lt;br /&gt;
&lt;code&gt;-ls&lt;/code&gt; 列出所有会话&lt;br /&gt;
&lt;code&gt;-r&lt;/code&gt; 重新连接已分离的会话&lt;br /&gt;
&lt;code&gt;-R&lt;/code&gt; 尝试恢复会话，不存在则新建&lt;br /&gt;
&lt;code&gt;-d&lt;/code&gt; 分离其他已连接的会话&lt;br /&gt;
&lt;code&gt;-D&lt;/code&gt; 强制断开并分离会话&lt;br /&gt;
&lt;code&gt;-x&lt;/code&gt; 连接到已连接的会话（多人共享屏幕）&lt;br /&gt;
&lt;code&gt;-X &amp;lt;command&amp;gt;&lt;/code&gt; 在指定会话中执行 screen 命令&lt;br /&gt;
&lt;code&gt;-dmS &amp;lt;name&amp;gt; &amp;lt;command&amp;gt;&lt;/code&gt; 创建后台守护会话并运行命令&lt;br /&gt;
&lt;code&gt;-wipe&lt;/code&gt; 清除死去的会话&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建会话
screen -S myserver

# 删除会话
screen -S myserver -X quit

# 列出所有会话
screen -ls

# 重新连接到会话
screen -r myserver

# 强制重新连接到会话
screen -D -r myserver

# 创建后台会话运行脚本
screen -dmS myserver ./start_server.sh

# 连接到已连接的会话（多人共享查看）
screen -x myserver

# 清除死去的会话  
screen -wipe  
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
在会话内按 &amp;lt;kbd&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;A&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;D&amp;lt;/kbd&amp;gt; 可退出当前会话&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Markdown 教程</title><link>https://bysansheng.cn/posts/markdown-%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/markdown-%E6%95%99%E7%A8%8B/</guid><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;虽说这篇文章的标题是「Markdown 教程」，但我本人实际上并不常用 Markdown 进行写作，对 Markdown 的了解并不深入，所以这篇文章理论上更应该是我自己的「Markdonw 备忘录」，如有不足，欢迎补充。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、通用语法&lt;/h2&gt;
&lt;h3&gt;1.1、文本格式&lt;/h3&gt;
&lt;p&gt;Markdown 段落的换行是使用两个以上 &lt;code&gt;空格&lt;/code&gt; 加上 &lt;code&gt;回车&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%96%87%E6%9C%AC%E6%A0%BC%E5%BC%8F1.png&quot; alt=&quot;文本格式1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;段落后面使用一个空行来表示重新开始一个段落&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/%E6%96%87%E6%9C%AC%E6%A0%BC%E5%BC%8F2.png&quot; alt=&quot;文本格式2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、标题&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;注意事项&lt;/strong&gt;：&lt;br /&gt;
1、&lt;code&gt;#&lt;/code&gt; 和 &lt;code&gt;标题文本&lt;/code&gt; 之间必须有一个空格&lt;br /&gt;
2、&lt;code&gt;#&lt;/code&gt; 必须在行首，前面不能有其他字符&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、字体&lt;/h3&gt;
&lt;p&gt;斜体语法：使用 &lt;code&gt;*&lt;/code&gt; 或 &lt;code&gt;_&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;em&gt;斜体文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;粗体语法：使用 &lt;code&gt;**&lt;/code&gt; 或 &lt;code&gt;__&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;strong&gt;粗体文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;粗斜体组合：使用 &lt;code&gt;***&lt;/code&gt; 或 &lt;code&gt;___&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;em&gt;&lt;strong&gt;粗斜体文本&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4、分割线&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;***
* * *
*****
- - -
----------
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.5、删除线&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;~~&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;s&gt;删除线文本&lt;/s&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.6、下划线&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;&amp;lt;u&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;/u&amp;gt;&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&amp;lt;u&amp;gt;下划线文本&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.7、脚注&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;这是一个脚注 [^Footnote]

[^Footnote]: 如你所见，这确实是一个脚注
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.8、行内代码标记&lt;/h3&gt;
&lt;p&gt;通常使用 &lt;code&gt;`&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;code&gt;git commit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当包含反引号时，适用 &lt;code&gt;``&lt;/code&gt; 包围文字&lt;br /&gt;
例如：&lt;code&gt;This is a `text enclosed in backticks`&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.9、列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;* 第一项
* 第二项
* 第三项

+ 第一项
+ 第二项
+ 第三项

- 第一项
- 第二项
- 第三项

1. 第一项
2. 第二项
3. 第三项
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;注意事项&lt;/strong&gt;：&lt;br /&gt;
1、&lt;code&gt;*&lt;/code&gt; &lt;code&gt;+&lt;/code&gt; &lt;code&gt;-&lt;/code&gt; &lt;code&gt;1.&lt;/code&gt; &lt;code&gt;2.&lt;/code&gt; ... 和 &lt;code&gt;列表文本&lt;/code&gt; 之间必须有一个空格&lt;br /&gt;
2、&lt;code&gt;*&lt;/code&gt; &lt;code&gt;+&lt;/code&gt; &lt;code&gt;-&lt;/code&gt; &lt;code&gt;1.&lt;/code&gt; &lt;code&gt;2.&lt;/code&gt; ... 必须在行首，前面不能有其他字符&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.10、引用块&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 第一行  
&amp;gt; 第二行  
&amp;gt; 第三行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 第一行  
第二行  
第三行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;第一行&lt;br /&gt;
第二行&lt;br /&gt;
第三行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;注意事项&lt;/strong&gt;：&lt;br /&gt;
1、&lt;code&gt;&amp;gt;&lt;/code&gt; 和 &lt;code&gt;引用内容&lt;/code&gt; 之间必须有一个空格&lt;br /&gt;
2、&lt;code&gt;&amp;gt;&lt;/code&gt; 必须在行首，前面不能有其他字符&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.11、代码区块&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;```&lt;/code&gt; 包裹一段代码，并指定一种语言，也可以不指定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```python
print(&quot;Hello World&quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello World&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;常用语言标识符列表&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;javascript / js&lt;/li&gt;
&lt;li&gt;python / py&lt;/li&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;li&gt;css&lt;/li&gt;
&lt;li&gt;sql&lt;/li&gt;
&lt;li&gt;json&lt;/li&gt;
&lt;li&gt;xml&lt;/li&gt;
&lt;li&gt;yaml / yml&lt;/li&gt;
&lt;li&gt;bash / shell&lt;/li&gt;
&lt;li&gt;java&lt;/li&gt;
&lt;li&gt;cpp / c++&lt;/li&gt;
&lt;li&gt;csharp / c#&lt;/li&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;ruby / rb&lt;/li&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;rust&lt;/li&gt;
&lt;li&gt;typescript / ts&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.12、链接&lt;/h3&gt;
&lt;h3&gt;* 1.12.1、基础链接&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[text1](url)  
[text2](url &quot;title&quot;)  
&amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;url&quot;&gt;text1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;url&quot;&gt;text2&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.google.com&quot;&gt;http://www.google.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.12.2、参考链接&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;参考链接&lt;/strong&gt; 将链接定义与使用分离，适合需要多次引用相同链接的情况&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[text1][label]
[text2][label]

[label]: url &quot;title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;url&quot;&gt;text1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;url&quot;&gt;text2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.12.3、锚点链接&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;锚点链接&lt;/strong&gt; 用于在同一文档内跳转，特别适合长文档的导航&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 目录
- [第一章：介绍](#第一章介绍)
- [第二章：安装](#第二章安装)
- [第三章：使用方法](#第三章使用方法)

# 第一章：介绍
这里是介绍内容...

# 第二章：安装
这里是安装说明...

# 第三章：使用方法
这里是使用说明...
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a id=&quot;custom-anchor&quot;&amp;gt;&amp;lt;/a&amp;gt;

[跳转到自定义位置](#custom-anchor)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[回到顶部](#)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.13、图片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 使用图片链接
![text1](url)
![text2](url &quot;title&quot;)

# 使用图片路径 (相对路径或绝对路径)
![text1](path)
![text2](path &quot;title&quot;)

# 图片链接组合
[![text1](image_url)](link_url)

# HTML 方式
&amp;lt;img src=&quot;image.jpg&quot; alt=&quot;text1&quot; width=&quot;300&quot; height=&quot;200&quot;&amp;gt;
&amp;lt;img src=&quot;image.jpg&quot; alt=&quot;text2&quot; width=&quot;50%&quot;&amp;gt;
&amp;lt;img src=&quot;image.jpg&quot; alt=&quot;text3&quot; style=&quot;width: 300px; height: auto;&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.14、表格&lt;/h3&gt;
&lt;h3&gt;* 1.14.1、表格基础语法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;| 表头 | 表头 | 表头 |
| --- | --- | --- |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |
&lt;/code&gt;&lt;/pre&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;/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;/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;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;语法要点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;表头&lt;/code&gt; 和 &lt;code&gt;单元格&lt;/code&gt; 之间必须有 &lt;code&gt;分隔线&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;分隔线&lt;/code&gt; 至少需要三个连字符 &lt;code&gt;---&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;两端的竖线 &lt;code&gt;|&lt;/code&gt; 是可选的，但建议保留以提高可读性&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.14.2、表格扩展语法&lt;/h3&gt;
&lt;p&gt;修改 &lt;code&gt;分割线&lt;/code&gt; 可以设置表格的对齐方式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| 表头 | 表头 | 表头 |
| --- | :---: | ---: |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;对齐方式&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;---:&lt;/code&gt; 设置 &lt;code&gt;表头&lt;/code&gt; 和 &lt;code&gt;单元格&lt;/code&gt; 居右对齐&lt;br /&gt;
&lt;code&gt;:---&lt;/code&gt; 设置 &lt;code&gt;表头&lt;/code&gt; 和&lt;code&gt;单元格&lt;/code&gt; 居左对齐&lt;br /&gt;
&lt;code&gt;:---:&lt;/code&gt; 设置 &lt;code&gt;表头&lt;/code&gt; 和&lt;code&gt;单元格&lt;/code&gt; 居中对齐&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;1.15、LaTeX 数学公式&lt;/h3&gt;
&lt;p&gt;在 Markdown 中，数学公式通过 LaTeX 语法来表示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;基本语法结构&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;命令&lt;/strong&gt;：以反斜杠 &lt;code&gt;\&lt;/code&gt; 开头，如 &lt;code&gt;\alpha&lt;/code&gt;、&lt;code&gt;\sum&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;参数&lt;/strong&gt;：用花括号 &lt;code&gt;{}&lt;/code&gt; 包围，如 &lt;code&gt;\frac{a}{b}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;下标&lt;/strong&gt;：使用 &lt;code&gt;_&lt;/code&gt;，如 &lt;code&gt;x_1&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;上标&lt;/strong&gt;：使用 &lt;code&gt;^&lt;/code&gt;，如 &lt;code&gt;x^2&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;分组&lt;/strong&gt;：用花括号将多个字符组合，如 &lt;code&gt;x_{i+1}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;常用 LaTeX 命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\alpha, \beta, \gamma  # 希腊字母
\sum, \prod, \int      # 求和、乘积、积分
\frac{分子}{分母}      # 分数
\sqrt{表达式}          # 平方根
\sqrt[n]{表达式}       # n次根
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;* 1.15.1、行内公式&lt;/h3&gt;
&lt;p&gt;行内公式使用单个 &lt;code&gt;$&lt;/code&gt; 包围，公式会嵌入到文本中&lt;br /&gt;
例如：&lt;code&gt;文本中的变量 $x = 5$ 和函数 $f(x) = x^2 + 2x + 1$&lt;/code&gt;&lt;br /&gt;
显示：文本中的变量 $x = 5$ 和函数 $f(x) = x^2 + 2x + 1$。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.15.2、块级公式&lt;/h3&gt;
&lt;p&gt;块级公式使用双美元符号 &lt;code&gt;$$&lt;/code&gt; 包围，公式会独立成行并居中显示&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$$E = mc^2$$

$$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示：&lt;/p&gt;
&lt;p&gt;$$E = mc^2$$&lt;/p&gt;
&lt;p&gt;$$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.15.3、扩展公式&lt;/h3&gt;
&lt;p&gt;使用 align 环境可以创建多行公式&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$$
    \begin{align}
    f(x) &amp;amp;= ax^2 + bx + c \\
    f&apos;(x)  &amp;amp;= 2ax + b \\
    f&apos;&apos;(x)  &amp;amp;= 2a
    \end{align}
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示：&lt;/p&gt;
&lt;p&gt;$$
\begin{align}
f(x) &amp;amp;= ax^2 + bx + c \
f&apos;(x)  &amp;amp;= 2ax + b \
f&apos;&apos;(x)  &amp;amp;= 2a
\end{align}
$$&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;使用 matrix 环境可以创建矩阵&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$$
    \begin{pmatrix}
    a &amp;amp; b \\
    c &amp;amp; d
    \end{pmatrix}
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示：&lt;/p&gt;
&lt;p&gt;$$
\begin{pmatrix}
a &amp;amp; b \
c &amp;amp; d
\end{pmatrix}
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;不同括号类型的矩阵&lt;/strong&gt;：&lt;br /&gt;
&lt;code&gt;pmatrix&lt;/code&gt; 圆括号 $\begin{pmatrix} a &amp;amp; b \ c &amp;amp; d \end{pmatrix}$&lt;br /&gt;
&lt;code&gt;bmatrix&lt;/code&gt; 方括号 $\begin{bmatrix} a &amp;amp; b \ c &amp;amp; d \end{bmatrix}$&lt;br /&gt;
&lt;code&gt;vmatrix&lt;/code&gt; 行列式 $\begin{vmatrix} a &amp;amp; b \ c &amp;amp; d \end{vmatrix}$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;* 1.15.4、常用数学符号&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;基本运算符号&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;加减乘除&lt;/strong&gt;：&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;\times&lt;/code&gt;, &lt;code&gt;\div&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;分数&lt;/strong&gt;：&lt;code&gt;\frac{a}{b}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;根号&lt;/strong&gt;：&lt;code&gt;\sqrt{x}&lt;/code&gt;, &lt;code&gt;\sqrt[n]{x}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;指数&lt;/strong&gt;：&lt;code&gt;x^2&lt;/code&gt;, &lt;code&gt;e^{i\pi}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;比较符号&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;等于&lt;/strong&gt;：&lt;code&gt;=&lt;/code&gt;, &lt;code&gt;\neq&lt;/code&gt;, &lt;code&gt;\equiv&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;大小&lt;/strong&gt;：&lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;\leq&lt;/code&gt;, &lt;code&gt;\geq&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;约等于&lt;/strong&gt;：&lt;code&gt;\approx&lt;/code&gt;, &lt;code&gt;\sim&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;集合符号&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;属于&lt;/strong&gt;：&lt;code&gt;\in&lt;/code&gt;, &lt;code&gt;\notin&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;包含&lt;/strong&gt;：&lt;code&gt;\subset&lt;/code&gt;, &lt;code&gt;\supset&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;交并&lt;/strong&gt;：&lt;code&gt;\cap&lt;/code&gt;, &lt;code&gt;\cup&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;空集&lt;/strong&gt;：&lt;code&gt;\emptyset&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;特殊函数和符号&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;三角函数&lt;/strong&gt;：\sin, \cos, \tan&lt;br /&gt;
&lt;strong&gt;对数&lt;/strong&gt;：&lt;code&gt;\log&lt;/code&gt;, &lt;code&gt;\ln&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;极限&lt;/strong&gt;：&lt;code&gt;\lim_{x \to 0}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;求和&lt;/strong&gt;：&lt;code&gt;\sum_{i=1}^{n}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;积分&lt;/strong&gt;：&lt;code&gt;\int_{a}^{b}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;无穷&lt;/strong&gt;：&lt;code&gt;\infty&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;希腊字母&lt;/h4&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;LaTeX&lt;/th&gt;
&lt;th&gt;小写&lt;/th&gt;
&lt;th&gt;大写&lt;/th&gt;
&lt;th&gt;LaTeX&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;\alpha&lt;/td&gt;
&lt;td&gt;ν&lt;/td&gt;
&lt;td&gt;Ν&lt;/td&gt;
&lt;td&gt;\nu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;β&lt;/td&gt;
&lt;td&gt;Β&lt;/td&gt;
&lt;td&gt;\beta&lt;/td&gt;
&lt;td&gt;ο&lt;/td&gt;
&lt;td&gt;Ο&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;γ&lt;/td&gt;
&lt;td&gt;Γ&lt;/td&gt;
&lt;td&gt;\gamma&lt;/td&gt;
&lt;td&gt;π&lt;/td&gt;
&lt;td&gt;Π&lt;/td&gt;
&lt;td&gt;\pi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;δ&lt;/td&gt;
&lt;td&gt;Δ&lt;/td&gt;
&lt;td&gt;\delta&lt;/td&gt;
&lt;td&gt;ρ&lt;/td&gt;
&lt;td&gt;Ρ&lt;/td&gt;
&lt;td&gt;\rho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ε&lt;/td&gt;
&lt;td&gt;Ε&lt;/td&gt;
&lt;td&gt;\epsilon&lt;/td&gt;
&lt;td&gt;σ&lt;/td&gt;
&lt;td&gt;Σ&lt;/td&gt;
&lt;td&gt;\sigma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;θ&lt;/td&gt;
&lt;td&gt;Θ&lt;/td&gt;
&lt;td&gt;\theta&lt;/td&gt;
&lt;td&gt;τ&lt;/td&gt;
&lt;td&gt;Τ&lt;/td&gt;
&lt;td&gt;\tau&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;λ&lt;/td&gt;
&lt;td&gt;Λ&lt;/td&gt;
&lt;td&gt;\lambda&lt;/td&gt;
&lt;td&gt;φ&lt;/td&gt;
&lt;td&gt;Φ&lt;/td&gt;
&lt;td&gt;\phi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;μ&lt;/td&gt;
&lt;td&gt;Μ&lt;/td&gt;
&lt;td&gt;\mu&lt;/td&gt;
&lt;td&gt;ω&lt;/td&gt;
&lt;td&gt;Ω&lt;/td&gt;
&lt;td&gt;\omega&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;1.16、使用 HTML 元素&lt;/h3&gt;
&lt;p&gt;不在 Markdown 涵盖范围之内的标签，可以用 HTML 撰写&lt;/p&gt;
&lt;p&gt;例如：&lt;code&gt;使用 &amp;lt;kbd&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;Alt&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;Del&amp;lt;/kbd&amp;gt; 可以重启电脑&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;显示：使用 &amp;lt;kbd&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;Alt&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;Del&amp;lt;/kbd&amp;gt; 可以重启电脑&lt;/p&gt;
&lt;p&gt;例如：&lt;code&gt;&amp;lt;mark&amp;gt;这是一段高亮文本&amp;lt;/mark&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;显示：&amp;lt;mark&amp;gt;这是一段高亮文本&amp;lt;/mark&amp;gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;details&amp;gt;
  &amp;lt;summary&amp;gt;这是一个折叠内容&amp;lt;/summary&amp;gt;
  &amp;lt;p&amp;gt;不过里面没有任何信息&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;

&amp;lt;details open&amp;gt;
  &amp;lt;summary&amp;gt;这个板块默认是展开的&amp;lt;/summary&amp;gt;
  &amp;lt;p&amp;gt;不过里面也没有任何信息&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示：&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;这是一个折叠内容&amp;lt;/summary&amp;gt;
&amp;lt;p&amp;gt;不过里面没有任何信息&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details open&amp;gt;
&amp;lt;summary&amp;gt;这个板块默认是展开的&amp;lt;/summary&amp;gt;
&amp;lt;p&amp;gt;不过里面也没有任何信息&amp;lt;/p&amp;gt;
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1.17、转义&lt;/h3&gt;
&lt;p&gt;Markdown 使用了很多特殊的符号来表示特定的意义，如果需要显示特殊的符号则需要使用转义字符&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**文本加粗** 
\*\*正常显示星号\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文本加粗&lt;/strong&gt;&lt;br /&gt;
**正常显示星号**&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Markdown 支持以下这些符号前面加上 &lt;code&gt;\&lt;/code&gt; 来作为普通的符号插入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\   反斜线
`   反引号
*   星号
_   下划线
{}  花括号
[]  方括号
()  小括号
#   井字号
+   加号
-   减号
.   英文句点
!   感叹号
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.18、视频&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Youtube
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;

# Bilibili
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、扩展语法&lt;/h2&gt;
&lt;p&gt;随着时间的推进，创作者的开发，现如今，不同的 Markdown 扩展已经支持了各种各样的扩展语法&lt;br /&gt;
而 Fuwari 使用的就是 &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;2.1、内容隐藏&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;这个内容 :spoiler[隐藏了]!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;这个内容 :spoiler[隐藏了]!&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、Github 卡片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;bysansheng/AniSort&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;bysansheng/AniSort&quot;}&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、扩展引用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; This is a note

&amp;gt; [!TIP]
&amp;gt; This is a tip

&amp;gt; [!WARNING]
&amp;gt; This is a warning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
This is a note&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
This is a tip&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
This is a warning&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、扩展代码区块&lt;/h3&gt;
&lt;h3&gt;* 2.4.1、标题&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;```py title=&quot;this is a py&quot;
print(&quot;Hello World!&quot;)
```

```bash title=&quot;this is a bash&quot;
du -h /var/log/
```

```bash frame=&quot;code&quot; title=&quot;this is a bash&quot;
du -h /var/log/
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello World!&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;du -h /var/log/
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;du -h /var/log/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 2.4.2、行号&lt;/h3&gt;
&lt;h4&gt;显示行号&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```py showLineNumbers
print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;隐藏行号&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```py showLineNumbers=false
print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;修改起始行号&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```py showLineNumbers startLineNumber=5
print(&quot;Greetings from line 5&quot;)
print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Greetings from line 5&quot;)
print(&quot;Hello World!&quot;)
print(&quot;Truth is 114514&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 2.4.3、折叠&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;```js collapse={2-3, 5-8}
// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 2.4.4、自动换行&lt;/h3&gt;
&lt;h4&gt;开启自动换行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```py wrap
print(&quot;114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514&quot;)
```

```js wrap preserveIndent
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```

```js wrap preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;关闭自动换行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```py wrap=false
print(&quot;114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514&quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514114514&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 2.4.5、行标记&lt;/h3&gt;
&lt;h4&gt;标记指定行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```js {1, 4-6, 8} 
// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;选择标记类型 (make, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```js {2} del={4} ins={6-7}
// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;为标记添加标签&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```js {&quot;1&quot;: 2} del={&quot;2&quot;: 5-6} ins={&quot;This is a ins&quot;: 8}
// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Line 1
// Line 2
// Line 3
// Line 4
// Line 5
// Line 6
// Line 7
// Line 8
// Line 9
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;类似 diff 的语法&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```diff
+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 2.4.6、文本标记&lt;/h3&gt;
&lt;h4&gt;标记指定文本&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```js &quot;given text&quot;
function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;正则表达式&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```ts /ye[sp]/
console.log(&apos;The words yes and yep will be marked.&apos;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;选择标记类型 (make, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```js &quot;return true;&quot; ins=&quot;inserted&quot; del=&quot;deleted&quot;
function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/markdown/md-tutorial.html&quot;&gt;Markdown 教程 - 菜鸟教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Fuwari 搭建教程：我的第一个轻量级静态博客</title><link>https://bysansheng.cn/posts/fuwari-%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bysansheng.cn/posts/fuwari-%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</guid><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;对于大多数人而言，《如何搭建一个博客》可能既是他们的第一篇博文，也是他们的最后一篇博文。在此落笔，我也不免有类似的担忧，以前我不愿搭建博客，不是因为我没有相应的理论知识和实操能力，而是我向来不乐意写东西来表达自己。这次搭建博客，只希望能有所坚持，哪怕是月更、年更也好。&lt;/p&gt;
&lt;p&gt;回归正题，如果你对搭建 Fuwari 感兴趣，可以先看看 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;官方项目地址&lt;/a&gt; 和 &lt;a href=&quot;https://fuwari.vercel.app/&quot;&gt;官方演示站&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1、环境配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;code&gt;Node.js&lt;/code&gt; &amp;lt;= 22&lt;br /&gt;
&lt;code&gt;pnpm&lt;/code&gt; &amp;lt;= 9&lt;br /&gt;
&lt;code&gt;Nginx&lt;/code&gt; == *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你已经有了相应的环境，可以跳过该部分&lt;/p&gt;
&lt;h3&gt;1.1、安装 Nginx&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装并启动 Nginx
sudo apt update &amp;amp;&amp;amp; sudo apt install -y nginx
sudo systemctl --now enable nginx

# 验证
nginx -v

# 删除默认配置
rm -rf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.2、安装 Node.js&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装 Node.js 相关
sudo apt update
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
npm install -g pnpm

# 配置 pnpm 包存储路径
pnpm config set store-dir &quot;/root/pnpm-store&quot;

# 验证
node -v
npm -v
pnpm -v
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;1.3、安装 rsync&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y rsync
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2、部署 Fuwari&lt;/h2&gt;
&lt;h3&gt;2.1、新建文件夹&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; 请自行替换成个人实际目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;/fuwari/ &amp;amp;&amp;amp; cd &amp;lt;path&amp;gt;/fuwari/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2、下载 Fuwari&lt;/h3&gt;
&lt;p&gt;获取 Fuwari 源码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/saicaca/fuwari.git .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可自行添加&lt;a href=&quot;/archive/?tag=Proxy&quot;&gt;代理&lt;/a&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git -c http.proxy=&quot;http://127.0.0.1:8118&quot; \
  clone https://github.com/saicaca/fuwari.git .
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3、安装环境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.4、构建网站&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod -R 777 ./dist/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.5、配置 Nginx 反代&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/fuwari.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中添加或修改自己的配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 41482;
    listen [::]:41482;
    server_name _;

    root &amp;lt;path&amp;gt;/fuwari/dist/;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;summary&amp;gt;这里附上我本人使用的配置&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 请自行替换成个人实际域名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    return 403;
}

server {
    listen 80;
    listen [::]:80;
    server_name &amp;lt;domain&amp;gt;;

    root &amp;lt;path&amp;gt;/fuwari/dist/;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;链接 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/fuwari.conf /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴露端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 41482
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以打开 &lt;code&gt;http://localhost:41482&lt;/code&gt; 访问 fuwari 的 Web 页面&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3、自定义&lt;/h2&gt;
&lt;h3&gt;3.1、修改主页面&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/config.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以根据自己的喜好和需求进行修改&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; 博客主标题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subtitle&lt;/code&gt; 博客副标题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lang&lt;/code&gt; 博客语言。注释已经列出了一些常用的值，如：en, zh_CN, zh_TW, ja, ko&lt;/li&gt;
&lt;li&gt;&lt;code&gt;themeColor&lt;/code&gt; 博客主题色，可以在你的博客右上角的画板图标确定喜欢的颜色再填写&lt;/li&gt;
&lt;li&gt;&lt;code&gt;banner &amp;gt; src&lt;/code&gt; 即 banner 图片，支持 http/https URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;favicon &amp;gt; src&lt;/code&gt; 即网站图标，支持 http/https URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avatar&lt;/code&gt; 即你的头像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; 即你的名字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bio&lt;/code&gt; 即你的个性签名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt; 图标。可以前往 &lt;a href=&quot;https://icones.js.org/&quot;&gt;icones.js&lt;/a&gt; 去搜索想要的图标，比如 QQ，则填写 &lt;code&gt;fa6-brands:qq&lt;/code&gt;，Fuwari 默认支持这几种类型：&lt;code&gt;fa6-brands&lt;/code&gt;, &lt;code&gt;fa6-regular&lt;/code&gt;, &lt;code&gt;fa6-solid&lt;/code&gt;, &lt;code&gt;material-symbols&lt;/code&gt;。可以在 &lt;code&gt;./astro.config.mjs&lt;/code&gt; 中搜索关键字进行配置&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2、修改文章末尾的博客域名&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;domain&amp;gt;&lt;/code&gt; 请自行替换成个人实际域名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fuwari 会在每篇文章的末尾，放上相关信息，例如当前文章的标题、链接、作者、许可协议之类的。其中文章链接所使用的域名默认为 &lt;code&gt;fuwari.vercel.app&lt;/code&gt;，需要自行修改。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano astro.config.mjs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其中修改文章末尾的博客域名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default defineConfig({
	site: &quot;https://fuwari.vercel.app/&quot;,
	site: &quot;https://&amp;lt;domain&amp;gt;/&quot;,
	base: &quot;/&quot;,
	trailingSlash: &quot;always&quot;,
	integrations: [
		tailwind({
			nesting: true,
		}),
		swup({
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3、添加导航栏页面&lt;/h3&gt;
&lt;p&gt;如果你看过其他人基于 Fuwari 搭建的博客，会发现他们的导航栏有很多原生并没有的页面，这就是通过自行添加导航栏页面实现的。&lt;/p&gt;
&lt;h3&gt;* 3.3.1、添加页面&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;page_file_name&amp;gt;&lt;/code&gt; 请自行替换成个人实际的&amp;lt;u&amp;gt;&lt;strong&gt;页面文件名&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/pages/&amp;lt;page_file_name&amp;gt;.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以根据 Astro 的组件模板进行页面的编写&lt;/p&gt;
&lt;p&gt;具体可以前往 &lt;a href=&quot;https://docs.astro.build/zh-cn/basics/astro-components&quot;&gt;https://docs.astro.build/zh-cn/basics/astro-components&lt;/a&gt; 进行查看&lt;/p&gt;
&lt;p&gt;同时，Astro 也支持使用 TailwindCSS 进行样式编辑&lt;/p&gt;
&lt;p&gt;具体可以前往 &lt;a href=&quot;https://www.tailwindcss.cn/docs/installation&quot;&gt;https://www.tailwindcss.cn/docs/installation&lt;/a&gt; 进行查看&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.3.2、应用页面&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
所有 &lt;code&gt;&amp;lt;page_display_name&amp;gt;&lt;/code&gt; 请自行替换成个人实际的&amp;lt;u&amp;gt;&lt;strong&gt;页面展示名&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/config.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;links&lt;/code&gt; 中可以自行应用页面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const navBarConfig: NavBarConfig = {
	links: [
		LinkPreset.Home,
		LinkPreset.Archive,
		LinkPreset.About,
		{
			name: &quot;&amp;lt;page_display_name&amp;gt;&quot;,
			url: &quot;/&amp;lt;page_file_name&amp;gt;/&quot;,
			external: false,
		},
	],
};
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4、添加置顶功能&lt;/h3&gt;
&lt;p&gt;Fuwari 原生并不支持文章的置顶，需要手动修改相应文件。&lt;/p&gt;
&lt;h3&gt;* 3.4.1、修改排序逻辑&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/utils/content-utils.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;getRawSortedPosts&lt;/code&gt; 函数中的排序逻辑修改为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;async function getRawSortedPosts() {
	const allBlogPosts = await getCollection(&quot;posts&quot;, ({ data }) =&amp;gt; {
		return import.meta.env.PROD ? data.draft !== true : true;
	});

	const sorted = allBlogPosts.sort((a, b) =&amp;gt; {
    if (a.data.pinned !== b.data.pinned) {
      return a.data.pinned ? -1 : 1;
    }
		const dateA = new Date(a.data.published);
		const dateB = new Date(b.data.published);
		return dateA &amp;gt; dateB ? -1 : 1;
	});
	return sorted;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.4.2、修改文章配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/content/config.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;lang&lt;/code&gt; 字段后增加 &lt;code&gt;pinned&lt;/code&gt; 字段&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;		tags: z.array(z.string()).optional().default([]),
		category: z.string().optional().nullable().default(&quot;&quot;),
		lang: z.string().optional().default(&quot;&quot;),
		pinned: z.boolean().optional().default(false),

		/* For internal use */
		prevTitle: z.string().default(&quot;&quot;),
		prevSlug: z.string().default(&quot;&quot;),
		nextTitle: z.string().default(&quot;&quot;),
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.4.3、修改置顶显示标签&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/components/PostCard.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此文件需要修改两处&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const { remarkPluginFrontmatter } = await entry.render();

const isPinned = entry.data.pinned === true;
---
&amp;lt;div class:list={[&quot;card-base flex flex-col-reverse md:flex-col w-full rounded-[var(--radius-large)] overflow-hidden relative&quot;, className]} style={style}&amp;gt;
    &amp;lt;div class:list={[&quot;pl-6 md:pl-9 pr-6 md:pr-2 pt-6 md:pt-7 pb-6 relative&quot;, {&quot;w-full md:w-[calc(100%_-_52px_-_12px)]&quot;: !hasCover, &quot;w-full md:w-[calc(100%_-_var(--coverWidth)_-_12px)]&quot;: hasCover}]}&amp;gt;
        {isPinned &amp;amp;&amp;amp; (
            &amp;lt;div class=&quot;absolute top-4 right-3 text-[var(--primary)]&quot;&amp;gt;
                &amp;lt;Icon name=&quot;material-symbols:push-pin&quot; class=&quot;w-5 h-5&quot; /&amp;gt;
            &amp;lt;/div&amp;gt;
        )}
        &amp;lt;a href={url}
           class=&quot;transition group w-full block font-bold mb-3 text-3xl text-90
        hover:text-[var(--primary)] dark:hover:text-[var(--primary)]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5、添加 astro-seo&lt;/h3&gt;
&lt;p&gt;Fuwari 原生的搜索功能并不太好用，使用 astro-seo 可以在一定程度上优化博客的搜索功能。&lt;/p&gt;
&lt;h3&gt;* 3.5.1、安装 astro-seo&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm install astro-seo
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;* 3.5.2、应用 astro-seo&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano ./src/layouts/Layout.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导入 &lt;code&gt;astro-seo&lt;/code&gt;，然后在 HTML 的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 部分中使用该组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const bannerOffset =
	bannerOffsetByPosition[siteConfig.banner.position || &quot;center&quot;];

import { SEO } from &quot;astro-seo&quot;;
---

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang={siteLang} class=&quot;bg-[var(--page-bg)] transition text-[14px] md:text-[16px]&quot;
	  data-overlayscrollbars-initialize
&amp;gt;
	&amp;lt;head&amp;gt;

		&amp;lt;SEO
			title={pageTitle}
			description={description || pageTitle}
		/&amp;gt;

		&amp;lt;title&amp;gt;{pageTitle}&amp;lt;/title&amp;gt;

		&amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
		&amp;lt;meta name=&quot;description&quot; content={description || pageTitle}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以前往 &lt;a href=&quot;https://github.com/jonasmerlin/astro-seo&quot;&gt;https://github.com/jonasmerlin/astro-seo&lt;/a&gt; 查看其它自定义内容&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;jonasmerlin/astro-seo&quot;}&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.6、重新构建网站&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
每次修改完自定义内容后都要进行一次网站的构建。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;4、文章编写&lt;/h2&gt;
&lt;p&gt;Fuwari 作为一个静态博客，虽然轻量美观，但是文章的编写还是有一定的麻烦的，以下作为 &lt;strong&gt;文章编写&lt;/strong&gt; 的后续补充&lt;/p&gt;
&lt;h3&gt;4.1、新建文章&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-post &amp;lt;filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后可以在 &lt;code&gt;src/content/posts/&lt;/code&gt; 目录中编辑相应的 Markdown 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Default Example
published: 1919-08-10
description: &apos;&apos;
image: &apos;&apos;
tags: []
category: &apos;&apos;
draft: true 
lang: &apos;&apos;
pinned: false
---

...
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; 文章标题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;published&lt;/code&gt; 文章创建时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt; 文章描述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt; 文章封面图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt; 文章标签&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category&lt;/code&gt; 文章分类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;draft&lt;/code&gt; 是否为草稿&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lang&lt;/code&gt; 文章语言&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pinned&lt;/code&gt; 是否置顶&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2、重新构建网站&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
每次编写完文章后都要进行一次网站的构建。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jk.sb/posts/fuwari-pinned/&quot;&gt;给 fuwari 主题添加置顶功能 - 业余玩家&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imxizhen.asia/posts/%E6%95%99%E7%A8%8B/fuwari%E4%B8%BB%E9%A2%98%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E7%BD%AE%E9%A1%B6%E5%B8%96%E5%AD%90%E5%8A%9F%E8%83%BD/&quot;&gt;Fuwari 主题博客添加置顶帖子功能 - imxizhen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.2b2x.cn/posts/fuwari&quot;&gt;Fuwari 静态博客搭建教程 - 二叉树树&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>