<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Bingxin Blog</title>
  
  
  <link href="https://blog.byteloid.one/atom.xml" rel="self"/>
  
  <link href="https://blog.byteloid.one/"/>
  <updated>2026-05-05T17:23:34.090Z</updated>
  <id>https://blog.byteloid.one/</id>
  
  <author>
    <name>bingxin666</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>追番新体验：ANI-RSS、Jellyfin 与 Fontinass 的集成</title>
    <link href="https://blog.byteloid.one/2026/03/03/ani-rss-and-jellyfin-with-fontinass/"/>
    <id>https://blog.byteloid.one/2026/03/03/ani-rss-and-jellyfin-with-fontinass/</id>
    <published>2026-03-03T16:01:39.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>在我<a href="https://blog.byteloid.one/2025/03/23/emby-all-in-one-solution/">往期的文章里</a>，我曾经介绍过我们是使用 Emby 作为媒体服务器的，但随着时间的增长，我们的媒体库目标从存量完结番转向了实时追番，因此开源的 Jellyfin 成为了我们的新选择。</p><span id="more"></span><p>在本期文章里，我将讨论番剧订阅、扫描入库、以及一些有趣的美化功能。</p><h1 id="番剧订阅"><a href="#番剧订阅" class="headerlink" title="番剧订阅"></a>番剧订阅</h1><p>ANI-RSS 是基于 RSS 自动追番、订阅、下载、刮削的全自动下载工具。</p><h2 id="通过-Docker-部署"><a href="#通过-Docker-部署" class="headerlink" title="通过 Docker 部署"></a>通过 Docker 部署</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs docker-compose.yml">services:<br>  qb:<br>    image: superng6/qbittorrentee:latest<br>    container_name: qb<br>    environment:<br>      - PUID=0<br>      - PGID=0<br>      - WEBUIPORT=8989<br>      - TZ=Asia/Shanghai<br>    volumes:<br>      - ./qb:/config<br>      - /mnt/data/bangumi:/bangumi #番剧挂载路径<br>    restart: unless-stopped<br>    network_mode: host<br><br>  ani-rss:<br>    image: wushuo894/ani-rss:latest<br>    container_name: ani-rss<br>    ports:<br>      - 7789:7789<br>    environment:<br>      - PORT=7789<br>      - CONFIG=/config<br>      - TZ=Asia/Shanghai<br>    volumes:<br>      - ./ani-rss:/config<br>      - /mnt/data/bangumi:/bangumi #番剧挂载路径<br>    restart: unless-stopped<br>    networks:<br>      - ani-rss<br>    extra_hosts:<br>      - &quot;host.docker.internal:host-gateway&quot;<br><br>networks:<br>  ani-rss:<br></code></pre></td></tr></table></figure><p>其中，<code>qb</code> 是 qBittorrent 的 Docker 镜像，<code>ani-rss</code> 是 ANI-RSS 的 Docker 镜像。</p><p><code>/mnt/data/bangumi</code> 是我们挂载番剧的路径，你应当根据自己的实际情况进行调整。</p><p>如果你有注意到的话，会发现我在 <code>ani-rss</code> 的 <code>extra_hosts</code> 配置了 <code>host.docker.internal:host-gateway</code>，这是因为我的网络环境较为特殊，我希望 qBittorrent 可以通过 IPv6 下载种子，然而 Docker 的默认网络配置并不支持 IPv6，因此在手动指定 <code>qBittorrent</code> 的网络模式为 <code>host</code> 后，我还额外配置了 <code>ani-rss</code> 的 <code>extra_hosts</code> ，以便 <code>ani-rss</code> 访问到 <code>qBittorrent</code>。</p><h2 id="配置-qBittorrent"><a href="#配置-qBittorrent" class="headerlink" title="配置 qBittorrent"></a>配置 qBittorrent</h2><p>在 <code>docker compose up -d</code> 后，执行 <code>docker compose logs -f</code> 查看 qBittorrent 的日志，找到其生成的账户密码。</p><p>在修改完 <code>qBittorrent</code> 的账户密码后，打开 qBittorrent 的 Web UI，进入设置，找到 <code>下载</code>，勾上 <code>为不完整的文件添加扩展名 .!qB</code>，并且设置 <code>默认保存路径</code> 为 <code>/bangumi</code>。</p><h2 id="配置-ANI-RSS"><a href="#配置-ANI-RSS" class="headerlink" title="配置 ANI-RSS"></a>配置 ANI-RSS</h2><p>使用默认账户 <code>admin</code> 和密码 <code>admin</code> 登录到 ANI-RSS。</p><p>登录后，不要忘记在 <code>设置</code> - <code>登录设置</code> 中修改账户密码。</p><h3 id="下载设置"><a href="#下载设置" class="headerlink" title="下载设置"></a>下载设置</h3><p>地址填写 <code>http://host.docker.internal:8989</code>，用户名和密码填写你在上一步中设置的 qBittorrent 的账户密码。</p><p>为了配合洗版，<code>自动删除</code> 需要打开。</p><p>保存位置填写为容器内的路径 <code>/bangumi</code>，保存后点击测试连接，如果一切正常的话应该会显示 <code>连接成功</code>。</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-1.png" alt="下载设置（这里我改了下地址来适配我自己的环境）"></p><h3 id="其他设置"><a href="#其他设置" class="headerlink" title="其他设置"></a>其他设置</h3><p>大多数设置项都可以保持默认。</p><p><code>添加订阅</code> 部分中，<code>标题添加年份</code> 和 <code>自动剧集偏移</code> 推荐开启，其他的可以根据自己的喜好进行调整。</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-2.png" alt="基本设置-添加订阅"></p><p><code>RSS设置</code> 中，<code>RSS开关</code> 肯定是要启用的，此外 <code>自动跳过</code> 建议关闭，否则在 <code>备用 RSS</code> 下载完后就不会洗版更新成 <code>主 RSS</code> 的了。</p><p>当然 <code>RSS 设置</code> 中的 <code>备用RSS</code> 也不要忘记开启</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-3.png" alt="基本设置-RSS设置-1"><br><img src="https://pic.r2.byteloid.one/2026-3-4-4.png" alt="基本设置-RSS设置-2"></p><h3 id="添加订阅"><a href="#添加订阅" class="headerlink" title="添加订阅"></a>添加订阅</h3><p>终于到了添加订阅的环节了！</p><p>点击右上角的 <code>添加订阅</code> - <code>Mikan</code>，搜索自己想要订阅的番剧，随后选择心意的字幕组进行订阅！</p><p>但请注意，对于较早的番剧可能存在死种的情况，因此不建议订阅过早的番剧。</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-5.png" alt="添加订阅-1"></p><p>以《我推的孩子》第三季为例，我的 <code>主 RSS</code> 是 <code>LoliHouse</code>，他们的命名方式是 <code>S3 - xx</code> 的格式，但不是每个字幕组都会这样提前做好剧集偏移的，因此在添加备用源的时候，我选择了 <code>ANi</code> 作为我的 <code>备用 RSS</code> 之一，此时我就要手动设置 <code>剧集偏移</code> 为 <code>-21</code>，这样下下来的剧集才会正确地命名为 <code>S3Exx</code> 的格式。</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-6.png" alt="添加订阅-2"></p><h1 id="扫描入库和美化功能"><a href="#扫描入库和美化功能" class="headerlink" title="扫描入库和美化功能"></a>扫描入库和美化功能</h1><p>我使用 Jellyfin 作为媒体服务器，同时搭配 Fontinass 解决大部分可能遇到的字体缺失问题。</p><h2 id="通过-Docker-部署-1"><a href="#通过-Docker-部署-1" class="headerlink" title="通过 Docker 部署"></a>通过 Docker 部署</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs docker-compose.yml">services:<br>  jellyfin:<br>    image: jellyfin/jellyfin<br>    container_name: jellyfin<br>    volumes:<br>      - ./config:/config<br>      - ./cache:/cache<br>      - /mnt/data/bangumi:/bangumi<br>    restart: &#x27;unless-stopped&#x27;<br>    environment:<br>      - JELLYFIN_PublishedServerUrl=https://jellyfin.example.com<br>    entrypoint: sh -c &quot;sed -i &#x27;s#&lt;/div&gt;&lt;/body&gt;#&lt;/div&gt;&lt;script src=\&quot;https://cdn.jsdelivr.net/gh/Izumiko/jellyfin-danmaku@gh-pages/ede.user.js\&quot; defer&gt;&lt;/script&gt;&lt;/body&gt;#&#x27; /jellyfin/jellyfin-web/index.html &amp;&amp; exec /jellyfin/jellyfin&quot;<br><br>  fontinass:<br>    image: riderlty/fontinass:latest<br>    container_name: fontinass<br>    ports:<br>      - 8012:8012<br>    volumes:<br>      - ./fontinass_data:/data<br>      - ./fontinass_fonts:/fonts<br>    environment:<br>      - EMBY_SERVER_URL=http://jellyfin:8096<br></code></pre></td></tr></table></figure><p>其中，<code>jellyfin</code> 是 Jellyfin 的 Docker 镜像，<code>fontinass</code> 是 Fontinass 的 Docker 镜像。</p><p><code>/mnt/data/bangumi</code> 是我们挂载番剧的路径，你应当根据自己的实际情况进行调整。</p><p>我修改了 <code>jellyfin</code> 的 <code>entrypoint</code>，在其 Web UI 中注入了弹幕插件，如果你不需要这个功能的话，可以直接注释掉 <code>entrypoint</code> 这一行。</p><p><code>fontinass</code> 是一个实时将字体子集化后嵌入 ass 的小工具，有助于我们在未安装字体的设备上显示具有字体的字幕。</p><h2 id="安装和配置插件"><a href="#安装和配置插件" class="headerlink" title="安装和配置插件"></a>安装和配置插件</h2><h3 id="添加插件源"><a href="#添加插件源" class="headerlink" title="添加插件源"></a>添加插件源</h3><p>在打开 <code>控制台</code> - <code>插件</code> - <code>管理库</code> 中，添加 Bangumi 插件源，地址为 <code>https://jellyfin-plugin-bangumi.pages.dev/repository.json</code>，随后安装 <code>Bangumi 插件</code>。</p><h3 id="配置刮削"><a href="#配置刮削" class="headerlink" title="配置刮削"></a>配置刮削</h3><p>选择 <code>添加媒体库</code>，选择完内容类型和文件夹后，配置媒体库设置，你可以直接参考我下面的配置。</p><p><img src="https://pic.r2.byteloid.one/2026-3-4-7.png" alt="媒体库设置"></p><p>对于 <code>元数据下载器</code>，我推荐优先使用 <code>TheMovieDB</code> 作为数据来源（尽管对于多季番剧的支持似乎不是很好，有的会被塞到一季里面，都是日本人害的.jpg），<code>Bangumi</code> 只是作为补充。</p><p>剩下的事情，就是去泡杯咖啡（笑，然后等待刮削完享受番剧就可以了！</p><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>这次搭建的比我想象中顺利很多，但还是有一些小问题（比如日本人不分季导致 <code>TheMovieDB</code> 和 <code>Bangumi</code> 都可能获取不到多季番剧的标题），希望后续能够得到改善。</p><p>实际上，<code>fontinass</code> 还有很多没有说的，比如说如果你动手能力强可以不用它内置的反代之类的……</p><p>但总之，该先享受追番时刻了（笑</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.himiku.com/archives/ani-rss.html">ANI-RSS：自动追番新姿势！ - 初之音 </a></li><li><a href="https://github.com/RiderLty/fontInAss">RiderLty&#x2F;fontInAss: 实时将字体子集化后嵌入ass的小工具，用于在未安装对应字体的系统上正确显示字幕。 </a></li><li><a href="https://docs.wushuo.top/">首页 - ANI-RSS 基于RSS自动追番、订阅、下载、刮削 </a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;在我&lt;a href=&quot;https://blog.byteloid.one/2025/03/23/emby-all-in-one-solution/&quot;&gt;往期的文章里&lt;/a&gt;，我曾经介绍过我们是使用 Emby 作为媒体服务器的，但随着时间的增长，我们的媒体库目标从存量完结番转向了实时追番，因此开源的 Jellyfin 成为了我们的新选择。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="ANI-RSS" scheme="https://blog.byteloid.one/tags/ANI-RSS/"/>
    
    <category term="Jellyfin" scheme="https://blog.byteloid.one/tags/Jellyfin/"/>
    
    <category term="Fontinass" scheme="https://blog.byteloid.one/tags/Fontinass/"/>
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Cloudflare" scheme="https://blog.byteloid.one/tags/Cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>从零开始的 DN42（Day 1）：IGP Babel 与 IBGP RR 路由反射器</title>
    <link href="https://blog.byteloid.one/2026/01/01/dn42-day1-igp-babel-and-ibgp-rr/"/>
    <id>https://blog.byteloid.one/2026/01/01/dn42-day1-igp-babel-and-ibgp-rr/</id>
    <published>2026-01-01T16:30:00.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 DN42 网络中使用 Babel 作为 IGP，并配置 IBGP 的 Route Reflector（RR）以简化路由管理。</p><span id="more"></span><h1 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h1><p>我（AS4242423374）开始搭建 DN42 网络时，选择了 Babel 作为内部网关协议（IGP），因为它在动态环境中表现良好且易于配置。同时，为了简化 iBGP 的路由管理，我决定使用 Route Reflector（RR）架构。</p><p>此外，由于我的网络节点分布在多个位置，我使用 ZeroTier 作为底层的连接方式<del>（并不是因为我懒的起 WireGuard Tunnel）</del>。</p><h1 id="Babel-作为-IGP-的配置"><a href="#Babel-作为-IGP-的配置" class="headerlink" title="Babel 作为 IGP 的配置"></a>Babel 作为 IGP 的配置</h1><h2 id="安装-ZeroTier"><a href="#安装-ZeroTier" class="headerlink" title="安装 ZeroTier"></a>安装 ZeroTier</h2><p>需要注意的是，并不需要在 ZeroTier 中配置 DN42 IPv4 和 IPv6 ULA 地址，而是由 ZeroTier 分配私有 IPv6 地址用于节点间的连接。</p><p>由于一些原因，我额外分配了 <code>198.18.0.0/15</code> 作为 ZeroTier 网络的 IPv4 地址段，以避免与 DN42 的地址冲突。</p><h2 id="配置-Bird2-使用-Babel"><a href="#配置-Bird2-使用-Babel" class="headerlink" title="配置 Bird2 使用 Babel"></a>配置 Bird2 使用 Babel</h2><p>在 Bird2 的配置文件中，添加 Babel 协议的配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs babel.conf">protocol direct &#123;<br>        ipv4;<br>        ipv6;<br>        interface &quot;dummy&quot;; # dummy 网卡上应当已经配置了 DN42 的 IPv4 和 IPv6 地址<br>&#125;;<br><br>protocol babel int_babel &#123;<br>        ipv4 &#123;<br>                import all;<br>                export where source != RTS_BGP &amp;&amp; is_babel_net();<br>        &#125;;<br>        ipv6 &#123;<br>                import all;<br>                export where source != RTS_BGP &amp;&amp; is_babel_net_v6();<br>        &#125;;<br>        interface &quot;ztqu3gq4gl&quot; &#123;<br>                rtt cost 200;<br>                rtt min 10 ms;<br>                rtt max 300 ms;<br>                rtt decay 200;<br>        &#125;;<br>&#125;;<br></code></pre></td></tr></table></figure><p><code>interface &quot;ztqu3gq4gl&quot;</code> 需要替换为实际的 ZeroTier 虚拟网卡名称。</p><p>此处的 <code>rtt cost</code>、<code>rtt min</code>、<code>rtt max</code> 和 <code>rtt decay</code> 参数应当根据实际网络情况进行调整，以优化路由选择，参考 <a href="https://mk16.de/blog/babel-rtt-options-en/">Babel’s RTT options</a>，这些参数在 <code>2.14</code> 及以上版本的 Bird2 支持。</p><h1 id="IBGP-Route-Reflector-的配置"><a href="#IBGP-Route-Reflector-的配置" class="headerlink" title="IBGP Route Reflector 的配置"></a>IBGP Route Reflector 的配置</h1><p>Route Reflector 的配置参考如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs ibgp.conf">template bgp ibgp_rr &#123;<br>    local as OWNAS;<br>    rr cluster id 172.20.154.227;<br>    ipv4 &#123;<br>        import all;<br>        export where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();<br>        next hop keep ibgp;<br>        next hop self ebgp;<br>    &#125;;<br>    ipv6 &#123;<br>        import all;<br>        export where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();<br>        next hop keep ibgp;<br>        next hop self ebgp;<br>    &#125;;<br>    graceful restart;<br>    multihop;<br>&#125;<br><br># RR 之间连接<br><br>protocol bgp dn42_node2_rr from ibgp_rr &#123;<br>    neighbor 172.20.0.2 internal;<br>    rr client;<br>&#125;<br><br># 客户端连接<br><br>protocol bgp dn42_node_03 from ibgp_rr &#123;<br>    neighbor 172.20.0.3 internal;<br>    rr client;<br>&#125;<br></code></pre></td></tr></table></figure><p>客户端节点的配置类似，参考如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs ibgp.conf">template bgp ibgp_rr &#123;<br>    local as OWNAS;<br>    ipv4 &#123;<br>        import all;<br>        export where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();<br>        next hop self ebgp;<br>    &#125;;<br>    ipv6 &#123;<br>        import all;<br>        export where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();<br>        next hop self ebgp;<br>    &#125;;<br>    graceful restart;<br>    multihop;<br>&#125;<br><br>protocol bgp dn42_node_01 from ibgp_rr &#123;<br>    neighbor 172.20.0.1 internal;<br>&#125;<br><br>protocol bgp dn42_node_02 from ibgp_rr &#123;<br>    neighbor 172.20.0.2 internal;<br>&#125;<br></code></pre></td></tr></table></figure><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>通过上述配置，我成功地在 DN42 网络中使用 Babel 作为 IGP，并配置了 IBGP 的 Route Reflector（RR），实现了高效的路由管理和动态路由更新。这种架构不仅简化了配置，还提高了网络的可扩展性和稳定性。</p><p>此外，感谢 DN42 社群的成员们提供的帮助和建议，使我能够顺利完成这一配置过程。</p><p>由于我对于 Bird 和 BGP 的了解还较为浅显，若有错误或改进建议，欢迎在评论区提出。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 DN42 网络中使用 Babel 作为 IGP，并配置 IBGP 的 Route Reflector（RR）以简化路由管理。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="DN42" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/DN42/"/>
    
    
    <category term="DN42" scheme="https://blog.byteloid.one/tags/DN42/"/>
    
    <category term="BGP" scheme="https://blog.byteloid.one/tags/BGP/"/>
    
    <category term="Bird2" scheme="https://blog.byteloid.one/tags/Bird2/"/>
    
    <category term="Babel" scheme="https://blog.byteloid.one/tags/Babel/"/>
    
    <category term="IGP" scheme="https://blog.byteloid.one/tags/IGP/"/>
    
    <category term="IBGP" scheme="https://blog.byteloid.one/tags/IBGP/"/>
    
    <category term="Route Reflector" scheme="https://blog.byteloid.one/tags/Route-Reflector/"/>
    
    <category term="ZeroTier" scheme="https://blog.byteloid.one/tags/ZeroTier/"/>
    
  </entry>
  
  <entry>
    <title>将 Casdoor 作为 PVE 的 OAuth 单点登录提供商</title>
    <link href="https://blog.byteloid.one/2025/07/22/using-casdoor-as-pve-oauth/"/>
    <id>https://blog.byteloid.one/2025/07/22/using-casdoor-as-pve-oauth/</id>
    <published>2025-07-22T09:52:31.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>最近将 PVE 的单点登录提供商从 Authentik 更换为了 Casdoor，却踩到了意想不到的坑，这篇文章用于记录如何将 Casdoor 作为 PVE 的单点登录方式。</p><span id="more"></span><h1 id="需要准备的"><a href="#需要准备的" class="headerlink" title="需要准备的"></a>需要准备的</h1><p>Casdoor 和 PVE 实例，相关搭建教程互联网上应该有不少。</p><p><strong>注意：如果你使用的是 1Panel 的一键反代功能设置的 Casdoor 反代，请一定要检查 OpenResty 的配置文件，1Panel 会默认把 <code>.well-known</code> 反代到其他目录下，请手动移除它，并确保 <code>/.well-known</code> 正确反代至 Casdoor！</strong></p><h1 id="配置-Casdoor-应用"><a href="#配置-Casdoor-应用" class="headerlink" title="配置 Casdoor 应用"></a>配置 Casdoor 应用</h1><p>尽管可以直接使用现成的应用，但我更推荐新建一个新应用专门用于 PVE 验证。</p><p>新建应用后，修改 <strong>Access Token格式</strong> 为 <strong>JWT-Empty</strong>，并确保 <strong>证书</strong> 和 <strong>Token签名算法</strong> 为 <strong>RS256</strong>（理论上其他 RSA 算法也可以用，但是我没有测试）。</p><div class="note note-warning">            <p><strong>Access Token 格式一定要设置为 JWT-Empty，否则会遇到无法登入 PVE 的问题！</strong></p>          </div> <p>添加重定向 URL 为你的 PVE 地址，带 http&#x2F;https 头（如 <a href="https://pve.example.com:8006/">https://pve.example.com:8006</a> ）。</p><p>复制下客户端ID和客户端密钥用于后续步骤，其中，客户端密钥可以设置为空。</p><h1 id="配置-PVE-OpenID-领域"><a href="#配置-PVE-OpenID-领域" class="headerlink" title="配置 PVE OpenID 领域"></a>配置 PVE OpenID 领域</h1><p>转到数据中心 - 权限 - 领域，点击添加 - OpenID 连接服务器，填写以下内容：</p><ul><li><strong>发行人URL</strong>：填写你的 Casdoor 地址，需带上 http&#x2F;https 协议头（如 <a href="https://casdoor.example.com/">https://casdoor.example.com</a> ），地址后面不需要带斜杠。</li><li><strong>领域</strong>：填写你想设定的领域名称，会显示为类似 <user>@领域 这种格式（如 casdoor）。</li><li><strong>客户端 ID</strong>：填写 Casdoor 应用的客户端ID。</li><li><strong>客户端秘钥</strong>：填写 Casdoor 应用的客户端密钥（可以留空）。</li><li><strong>范围</strong>：填写 <code>openid profile email</code>。</li><li><strong>自动创建用户</strong>：可选，会在首次登录的时候自动在 PVE 创建对应的账户。</li><li><strong>用户名声明</strong>：填写 <code>name</code>。</li></ul><p>随后确认并保存即可，此时可以测试是否可以登入 PVE。</p><h1 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h1><h2 id="未添加证书到-PVE-上"><a href="#未添加证书到-PVE-上" class="headerlink" title="未添加证书到 PVE 上"></a>未添加证书到 PVE 上</h2><p>具体表现为登入时报错 500。</p><p>打开 Casdoor，转到身份验证 - 证书，下载证书后添加到 PVE 上，重启 PVE 即可解决。</p><h2 id="未修改-Access-Token-格式"><a href="#未修改-Access-Token-格式" class="headerlink" title="未修改 Access Token 格式"></a>未修改 Access Token 格式</h2><p>具体表现为登入时报错 401，日志如下：</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">pvedaemon[214662]: openid authentication failure; <span class="hljs-attribute">rhost</span>=&lt;ip&gt; <span class="hljs-attribute">msg</span>=Failed <span class="hljs-keyword">to</span> contact token endpoint: Failed <span class="hljs-keyword">to</span> parse<span class="hljs-built_in"> server </span>response<br></code></pre></td></tr></table></figure><p>这种情况请向上翻至配置 Casdoor 部分，修改 <strong>Access Token格式</strong> 为 <strong>JWT-Empty</strong> 即可。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近将 PVE 的单点登录提供商从 Authentik 更换为了 Casdoor，却踩到了意想不到的坑，这篇文章用于记录如何将 Casdoor 作为 PVE 的单点登录方式。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Casdoor" scheme="https://blog.byteloid.one/tags/Casdoor/"/>
    
    <category term="OAuth" scheme="https://blog.byteloid.one/tags/OAuth/"/>
    
    <category term="PVE" scheme="https://blog.byteloid.one/tags/PVE/"/>
    
  </entry>
  
  <entry>
    <title>使用 WireGuard + Babald(Bird2) 快速组网</title>
    <link href="https://blog.byteloid.one/2025/06/02/babeld-over-wireguard/"/>
    <id>https://blog.byteloid.one/2025/06/02/babeld-over-wireguard/</id>
    <published>2025-06-02T06:28:37.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>发现还是 Babeld(Bird2) + WireGuard 的组网方式更适合我，之前的 OSPF 有点复杂，配不明白（</p><span id="more"></span><hr><h1 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h1><h2 id="非常重要的系统设置"><a href="#非常重要的系统设置" class="headerlink" title="非常重要的系统设置"></a>非常重要的系统设置</h2><ul><li>首先，<strong>千万 一定 绝对</strong> 要打开 Linux 内核的数据包转发功能，即 ip_forwarding</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs shell">echo &quot;net.ipv4.ip_forward=1&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv6.conf.default.forwarding=1&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv6.conf.all.forwarding=1&quot; &gt;&gt; /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><ul><li>然后，<strong>千万 一定 绝对</strong> 要关闭 Linux 内核 rp_filter 的严格模式</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">echo &quot;net.ipv4.conf.default.rp_filter=0&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv4.conf.all.rp_filter=0&quot; &gt;&gt; /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><ul><li>最后，检查一下自己的系统是不是<strong>预装</strong>了 <code>iptables</code>，我自己就因为这个问题翻过车，如果没有装上，请自行安装。</li></ul><h2 id="软件前期安装"><a href="#软件前期安装" class="headerlink" title="软件前期安装"></a>软件前期安装</h2><p>必装：<code>bird2</code>、<code>wireguard</code></p><p>强烈建议：<code>wireguard-tools</code>，装上这个才能愉快的用 <code>wg-quick</code>，如果你的系统不支持（如 OpenWrt），请自行抉择。</p><p>我们这里使用了 <code>bird2</code> 提供的 <code>babeld</code> 协议进行组网，<del>不用 <code>babeld</code> 主要是因为我太菜了。</del></p><h1 id="内网组网"><a href="#内网组网" class="headerlink" title="内网组网"></a>内网组网</h1><h2 id="WireGuard-VPN"><a href="#WireGuard-VPN" class="headerlink" title="WireGuard VPN"></a>WireGuard VPN</h2><p>把你需要配置的服务器通过 WireGuard 直接或间接的连接到一起。</p><p>你可以参考我的 WireGuard 配置：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[Interface]</span><br><span class="hljs-attr">Table</span> = <span class="hljs-literal">off</span><br><span class="hljs-attr">ListenPort</span> = &lt;your_listen_port&gt;<br><span class="hljs-attr">PrivateKey</span> = &lt;your_private_key&gt;<br><span class="hljs-attr">Address</span> = fe80::<span class="hljs-number">9000</span>:<span class="hljs-number">225</span>/<span class="hljs-number">64</span> <span class="hljs-comment"># 使用 IPv6 link-local 地址</span><br><span class="hljs-attr">Address</span> = <span class="hljs-number">198.18</span>.<span class="hljs-number">0.225</span> <span class="hljs-comment"># 使用保留的 IPv4 地址</span><br><br><span class="hljs-section">[Peer]</span><br><span class="hljs-attr">PublicKey</span> = &lt;your_peer_public_key&gt;<br><span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">10.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">8</span>, <span class="hljs-number">172.20</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">14</span>, <span class="hljs-number">172.31</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">16</span>, <span class="hljs-number">198.18</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">15</span>, fd00::/<span class="hljs-number">8</span>, fe80::/<span class="hljs-number">64</span>, ff00::/<span class="hljs-number">8</span><br><span class="hljs-attr">Endpoint</span> = &lt;your_peer_endpoint&gt;<br></code></pre></td></tr></table></figure><p>似乎 <code>bird2</code> 的 <code>babeld</code> 要求一定要存在 IPv4 地址，为了满足这个要求，我在 WireGuard 的配置里添加了一个保留的 IPv4 地址 (198.18.0.0&#x2F;15)。</p><h1 id="配置-Bird"><a href="#配置-Bird" class="headerlink" title="配置 Bird"></a>配置 Bird</h1><p>为了方便管理，这里主要把 bird.conf 作为入口文件，然后逐一细分到其他配置文件。</p><h2 id="bird-conf"><a href="#bird-conf" class="headerlink" title="bird.conf"></a>bird.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br></pre></td><td class="code"><pre><code class="hljs conf">################################################<br>#               Variable header                #<br>################################################<br><br># 不要忘了修改以下变量为你自己的配置<br><br>define OWNAS =  4242423374;                    <br>define OWNIP =  172.20.154.225;               <br>define OWNIPv6 = fddf:3681:e80::225;           <br>define OWNNET = 172.20.154.224/27;             <br>define OWNNETv6 = fddf:3681:e80::/48;          <br>define OWNNETSET = [172.20.154.224/27+];       <br>define OWNNETSETv6 = [fddf:3681:e80::/48+];    <br><br>################################################<br>#                 Header end                   #<br>################################################<br><br>router id OWNIP;<br><br>protocol device &#123;<br>    scan time 10;<br>&#125;<br><br>/*<br> *  Utility functions<br> */<br><br>function is_self_net() &#123;<br>    return net ~ OWNNETSET;<br>&#125;<br><br>function is_self_net_v6() &#123;<br>    return net ~ OWNNETSETv6;<br>&#125;<br><br>function is_valid_network() &#123;<br>    return net ~ [<br>        172.20.0.0/14&#123;21,29&#125;, # dn42<br>        172.20.0.0/24&#123;28,32&#125;, # dn42 Anycast<br>        172.21.0.0/24&#123;28,32&#125;, # dn42 Anycast<br>        172.22.0.0/24&#123;28,32&#125;, # dn42 Anycast<br>        172.23.0.0/24&#123;28,32&#125;, # dn42 Anycast<br>        172.31.0.0/16+,       # ChaosVPN<br>        10.100.0.0/14+,       # ChaosVPN<br>        10.127.0.0/16+,       # neonetwork<br>        10.0.0.0/8&#123;15,24&#125;     # Freifunk.net<br>    ];<br>&#125;<br><br>function is_valid_network_v6() &#123;<br>    return net ~ [<br>        fd00::/8&#123;44,64&#125; # ULA address space as per RFC 4193<br>    ];<br>&#125;<br><br>protocol kernel &#123;<br>    scan time 20;<br><br>    ipv6 &#123;<br>        import none;<br>        export filter &#123;<br>            if source = RTS_STATIC then reject;<br>            krt_prefsrc = OWNIPv6;<br>            accept;<br>        &#125;;<br>    &#125;;<br>&#125;;<br><br>protocol kernel &#123;<br>    scan time 20;<br><br>    ipv4 &#123;<br>        import none;<br>        export filter &#123;<br>            if source = RTS_STATIC then reject;<br>            krt_prefsrc = OWNIP;<br>            accept;<br>        &#125;;<br>    &#125;;<br>&#125;<br><br>protocol static &#123;<br>    route OWNNET reject;<br>    ipv4 &#123;<br>        import all;<br>        export none;<br>    &#125;;<br>&#125;<br><br>protocol static &#123;<br>    route OWNNETv6 reject;<br>    ipv6 &#123;<br>        import all;<br>        export none;<br>    &#125;;<br>&#125;<br><br>include &quot;/etc/bird/rpki.conf&quot;;<br>include &quot;/etc/bird/babeld.conf&quot;;<br>include &quot;/etc/bird/bgp.conf&quot;;<br>include &quot;/etc/bird/ibgp.conf&quot;;<br>include &quot;/etc/bird/peers/*&quot;;<br></code></pre></td></tr></table></figure><p>简单介绍一下：</p><ul><li>定义了我们内网的 IP 和 ASN</li><li>引入了 RPKI、Babeld、BGP 和 iBGP 的配置文件</li></ul><h2 id="rpki-conf"><a href="#rpki-conf" class="headerlink" title="rpki.conf"></a>rpki.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs conf">roa4 table dn42_roa;<br>roa6 table dn42_roa_v6;<br><br>protocol rpki rpki_akix &#123;<br>    roa4 &#123; table dn42_roa; &#125;;<br>        roa6 &#123; table dn42_roa_v6; &#125;;<br>    remote &quot;&lt;your_rpki_server&gt;&quot; port 8082; # change it<br>           refresh 30;<br>           retry 5;<br>           expire 600;<br>&#125;<br></code></pre></td></tr></table></figure><p>没什么好说的，RPKI 的配置文件。</p><p>不要忘了修改 <code>&lt;your_rpki_server&gt;</code> 为你自己的 RPKI 服务器地址。</p><h2 id="babeld-conf"><a href="#babeld-conf" class="headerlink" title="babeld.conf"></a>babeld.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><code class="hljs conf">protocol direct &#123;<br>        ipv4;<br>        ipv6;<br>        interface &quot;dummy&quot;;<br>&#125;;<br><br>protocol babel int_babel &#123;<br>        ipv4 &#123;<br>                import where source != RTS_BGP &amp;&amp; is_self_net();<br>                export where source != RTS_BGP &amp;&amp; is_self_net();<br>        &#125;;<br>        ipv6 &#123;<br>                import where source != RTS_BGP &amp;&amp; is_self_net_v6();<br>                export where source != RTS_BGP &amp;&amp; is_self_net_v6();<br>        &#125;;<br><br>        interface &quot;dn42-jp01&quot; &#123;<br>                # 注意：Babel 的成本度量与 BGP 和 OSPF 略有不同<br>                # rxcost 指定的是邻居向我们发送流量的成本，而不是向邻居发送流量的成本<br>                # 当然，如果两端的成本保持一致，这不会产生任何影响<br>                # 我这里使用了延迟作为成本度量<br>                rxcost 57;<br>        &#125;;<br>        interface &quot;dn42-sg01&quot; &#123;<br>                rxcost 173;<br>        &#125;;<br>        interface &quot;dn42-cn02&quot; &#123;<br>                rxcost 376;<br>        &#125;;<br>&#125;;<br></code></pre></td></tr></table></figure><p>这里的 <code>dummy</code> 网卡应当绑定了你的 DN42 IPv4 和 IPv6 地址。</p><p>可以参考 <a href="https://blog.udon.eu.org/archives/dbf21067.html#%E5%88%9B%E5%BB%BA-Dummy-%E7%BD%91%E5%8D%A1">玩一玩 DN42 - カレーうどん屋</a>。</p><p><code>Babeld</code> 的配置文件是参考 <a href="https://jlu5.com/blog/dn42-multiple-servers-ibgp-igps">Multiple servers on dn42: iBGP and IGPs | jlu5</a> 配的，中文翻译位于 <a href="https://blog.liuzhen932.top/posts/dn42-multiple-servers-ibgp-igps/">[译] dn42 多服务器环境中的 iBGP 与 IGP 配置 | liuzhen932 的小窝</a>。</p><h2 id="bgp-conf"><a href="#bgp-conf" class="headerlink" title="bgp.conf"></a>bgp.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs conf">template bgp dnpeers &#123;<br>    local as OWNAS;<br>    path metric 1;<br><br>    ipv4 &#123;<br>        import filter &#123;<br>            if is_valid_network() &amp;&amp; !is_self_net() then &#123;<br>                if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then &#123;<br>                    # Reject when unknown or invalid according to ROA<br>                    print &quot;[dn42] ROA check failed for &quot;, net, &quot; ASN &quot;, bgp_path.last;<br>                    reject;<br>                &#125; else accept;<br>            &#125; else reject;<br>        &#125;;<br><br>        export filter &#123; if is_valid_network() &amp;&amp; source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; &#125;;<br>            next hop self;<br>        import limit 9000 action block;<br>    &#125;;<br><br>    ipv6 &#123;   <br>        import filter &#123;<br>            if is_valid_network_v6() &amp;&amp; !is_self_net_v6() then &#123;<br>                if (roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID) then &#123;<br>                    # Reject when unknown or invalid according to ROA<br>                    print &quot;[dn42] ROA check failed for &quot;, net, &quot; ASN &quot;, bgp_path.last;<br>                    reject;<br>                &#125; else accept;<br>            &#125; else reject;<br>        &#125;;<br>        export filter &#123; if is_valid_network_v6() &amp;&amp; source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; &#125;;<br>            next hop self;<br>        import limit 9000 action block; <br>    &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><p>是非常标准的 BGP 配置。</p><h2 id="ibgp-conf"><a href="#ibgp-conf" class="headerlink" title="ibgp.conf"></a>ibgp.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs conf">template bgp ibgpeers &#123;<br>    local as OWNAS;<br>    ipv4 &#123;<br>        import where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();<br>        export where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();<br>        next hop self;<br>    &#125;;<br>    ipv6 &#123;<br>        import where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();<br>        export where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();<br>        next hop self;<br>    &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><p>是标准的 IBGP 配置，同样是参考 <a href="https://jlu5.com/blog/dn42-multiple-servers-ibgp-igps">Multiple servers on dn42: iBGP and IGPs | jlu5</a> 配的，中文翻译位于 <a href="https://blog.liuzhen932.top/posts/dn42-multiple-servers-ibgp-igps/">[译] dn42 多服务器环境中的 iBGP 与 IGP 配置 | liuzhen932 的小窝</a>。</p><h1 id="继续增加节点"><a href="#继续增加节点" class="headerlink" title="继续增加节点"></a>继续增加节点</h1><p>增加节点就容易多了，只需要记得修改 <code>babeld</code> 和添加 <code>IBGP Peer</code> 即可。</p><h1 id="疑难解答"><a href="#疑难解答" class="headerlink" title="疑难解答"></a>疑难解答</h1><h2 id="Babeld-没连上"><a href="#Babeld-没连上" class="headerlink" title="Babeld 没连上"></a>Babeld 没连上</h2><p><code>ip addr</code> 看看你的 wg 接口是不是同时绑定了 IPv4 和 IPv6 link-local 地址，同时检查 <code>babeld.conf</code> 里是否填写了正确的接口名称。</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://blog.udon.eu.org/archives/dbf21067.html#%E5%88%9B%E5%BB%BA-Dummy-%E7%BD%91%E5%8D%A1">玩一玩 DN42 - カレーうどん屋</a></li><li><a href="https://jlu5.com/blog/dn42-multiple-servers-ibgp-igps">Multiple servers on dn42: iBGP and IGPs | jlu5</a></li><li><a href="https://blog.liuzhen932.top/posts/dn42-multiple-servers-ibgp-igps/">[译] dn42 多服务器环境中的 iBGP 与 IGP 配置 | liuzhen932 的小窝</a></li><li><a href="https://dn42.dev/howto/Bird2">Bird2 - DN42 Wiki</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;发现还是 Babeld(Bird2) + WireGuard 的组网方式更适合我，之前的 OSPF 有点复杂，配不明白（&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="DN42" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/DN42/"/>
    
    
    <category term="服务器" scheme="https://blog.byteloid.one/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="异地组网" scheme="https://blog.byteloid.one/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    
    <category term="WireGuard" scheme="https://blog.byteloid.one/tags/WireGuard/"/>
    
    <category term="Babeld" scheme="https://blog.byteloid.one/tags/Babeld/"/>
    
    <category term="DN42" scheme="https://blog.byteloid.one/tags/DN42/"/>
    
  </entry>
  
  <entry>
    <title>Emby N+1（自动入库新番、直链、AList、单点认证......) 最终解决方案</title>
    <link href="https://blog.byteloid.one/2025/03/23/emby-all-in-one-solution/"/>
    <id>https://blog.byteloid.one/2025/03/23/emby-all-in-one-solution/</id>
    <published>2025-03-23T10:38:31.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>最近给某个群内搭建了 Emby 媒体服务器作为群服务提供，中间因为各种原因踩了大大小小的坑，最后才有了这篇文章。</p><div class="note note-warning">            <p>注意：此文章随时可能更新，文中用到的软件可能随时更新，因此配置文件可能过时。</p>          </div><span id="more"></span><h1 id="为什么是-Emby"><a href="#为什么是-Emby" class="headerlink" title="为什么是 Emby"></a>为什么是 Emby</h1><p>原因很简单：相较于 Jellyfin 和其竞品、Emby 的界面和体验都处于第一梯队的水平，且也有相当多的相关插件 &#x2F; 第三方客户端。</p><p>但是其也不可避免的存在以下缺陷：</p><ul><li>价格偏贵：尽管存在开心版，但也只能<strong>解锁一部分功能</strong>，一些<strong>插件相关的功能（如 PodCast、TVLive 等）仍然无法使用</strong>。月付 4.99 USD，年付 54 USD，永久 119（黑五期间 99）USD。</li><li>闭源问题：Emby 和 Jellyfin 早期有说不清道不明的关系，但是在后来分道扬镳，转为了闭源软件。</li><li>功能偏少：Emby 的插件丰富度不如 Jellyfin。</li></ul><p>但即便如此，由于 Emby 在多用户管理等多个方面仍然好于其他软件，因此最终敲定了 Emby 作为媒体库的系统。</p><h1 id="搭建目标"><a href="#搭建目标" class="headerlink" title="搭建目标"></a>搭建目标</h1><p>由于目标较多，因此文章会分为以下几个部分</p><ul><li>AList + 网盘挂载</li><li>ANI-RSS 实现自动入库新番</li><li>AutoFilm 自动生成 strm 文件供 Emby 刮削</li><li>部署 Emby 服务端</li><li>MediaWarp + Emby 向客户端返回网盘直链作为播放链接</li><li>Bangumi 插件刮削番剧和多季番剧的元数据设置</li><li>Authentik + LDAP 插件实现统一身份认证</li></ul><p><img src="https://pic.r2.byteloid.one/2025-3-23-7.webp" alt="大致流程"></p><h1 id="AList-网盘挂载"><a href="#AList-网盘挂载" class="headerlink" title="AList + 网盘挂载"></a>AList + 网盘挂载</h1><p><img src="https://pic.r2.byteloid.one/2025-3-23-2.webp" alt="实现流程图"></p><h2 id="部署-AList"><a href="#部署-AList" class="headerlink" title="部署 AList"></a>部署 AList</h2><p>参考 <a href="https://alist.nn.ci/zh/guide/install/manual.html">AList 官方文档</a>自行部署。</p><p>Docker Compose 文件参考如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3.3&#x27;</span><br><span class="hljs-attr">services:</span><br>  <span class="hljs-attr">alist:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">&#x27;xhofe/alist:beta&#x27;</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">alist</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;/etc/alist:/opt/alist/data&#x27;</span><br>    <span class="hljs-attr">ports:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;5244:5244&#x27;</span><br>    <span class="hljs-attr">environment:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">PUID=0</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">PGID=0</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">UMASK=022</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br></code></pre></td></tr></table></figure><h2 id="挂载网盘"><a href="#挂载网盘" class="headerlink" title="挂载网盘"></a>挂载网盘</h2><p>假设我已经分别挂载了天翼云盘和 OneDrive，且他们都有 <code>bangumi</code> 这个文件夹。</p><p>那么我们可以使用<strong>别名</strong>功能，选择添加存储 - 别名，设置挂载路径为 <code>/bangumi</code>、<strong>开启启用签名、关闭保护重名</strong>。</p><p>在路径中填写：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs text">/天翼云盘/bangumi<br>/OneDrive/bangumi<br></code></pre></td></tr></table></figure><p>随后，这两个文件夹中的内容都会显示在 <code>/bangumi</code> 目录下。</p><div class="note note-info">            <p><strong>为什么要用别名</strong><br>假设我在不同网盘都存放了视频，但是一个个分别挂载太过麻烦，这时候别名功能就能让你把多个网盘的文件汇总在同一个文件夹下。</p>          </div><h1 id="ANI-RSS-实现自动入库新番"><a href="#ANI-RSS-实现自动入库新番" class="headerlink" title="ANI-RSS 实现自动入库新番"></a>ANI-RSS 实现自动入库新番</h1><p><img src="https://pic.r2.byteloid.one/2025-3-23-3.webp" alt="实现流程图"></p><h2 id="部署-ANI-RSS-和-qBittorrent"><a href="#部署-ANI-RSS-和-qBittorrent" class="headerlink" title="部署 ANI-RSS 和 qBittorrent"></a>部署 ANI-RSS 和 qBittorrent</h2><p>参考 <a href="https://docs.wushuo.top/deploy/docker">ANI-RSS 官方文档</a> 和 <a href="https://www.himiku.com/archives/ani-rss.html">ANI-RSS：自动追番新姿势！ - 初之音 </a> 部署。</p><p>Docker Compose 文件参考如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&quot;3&quot;</span><br><span class="hljs-attr">services:</span><br>  <span class="hljs-attr">ani-rss:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">wushuo894/ani-rss</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">ani-rss</span><br>    <span class="hljs-attr">environment:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">PORT=7789</span> <span class="hljs-comment"># ani-rss 端口</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">CONFIG=/config</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">TZ=Asia/Shanghai</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">/volume1/docker/ani-rss/config:/config</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">/volume2/wushuo/Media:/Media</span> <span class="hljs-comment"># 番剧挂载路径两侧须一致</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">always</span><br>    <span class="hljs-attr">network_mode:</span> <span class="hljs-string">host</span><br>  <span class="hljs-attr">qBittorrent:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">linuxserver/qbittorrent</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">qBittorrent</span><br>    <span class="hljs-attr">environment:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">PUID=0</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">PGID=0</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">WEBUI_PORT=8080</span> <span class="hljs-comment"># qBittorrent 端口</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">TZ=Asia/Shanghai</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">/volume1/docker/qBittorrent/config:/config</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">/volume2/wushuo/downloads:/downloads</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">/volume2/wushuo/Media:/Media</span> <span class="hljs-comment"># 番剧挂载路径两侧须一致</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">always</span><br>    <span class="hljs-attr">network_mode:</span> <span class="hljs-string">host</span><br></code></pre></td></tr></table></figure><p>ASS 的默认账户密码均为 admin，初次启动时 qBittorrent 会为 admin 用户生成一个随机密码，请查看日志获取初始密码。</p><h2 id="配置自动上传至-AList"><a href="#配置自动上传至-AList" class="headerlink" title="配置自动上传至 AList"></a>配置自动上传至 AList</h2><p>打开 ANI-RSS，选择设置 - 下载设置 - Alist，分别填入 <code>AlistHost</code>、<code>AlistToken</code> 和 <code>AlistPath</code>，并且将开关打开。</p><p><code>AlistHost</code>：AList 的访问链接（建议内网，HTTPS 端口请填写 alist.example:443）。<br><code>AlistToken</code>：打开 AList 管理界面，选择设置 - 其他，填入令牌。<br><code>AlistPath</code>：你的上传目录（不能是别名！只能填写真实目录！）。</p><p>随后，订阅的番剧都会自动上传一份至网盘，你只需要<strong>定期清理 ANI-RSS 下载到硬盘的番剧即可（删除订阅不会删除已经上传的文件）</strong>。</p><h1 id="AutoFilm-自动生成-strm-文件供-Emby-刮削"><a href="#AutoFilm-自动生成-strm-文件供-Emby-刮削" class="headerlink" title="AutoFilm 自动生成 strm 文件供 Emby 刮削"></a>AutoFilm 自动生成 strm 文件供 Emby 刮削</h1><p><img src="https://pic.r2.byteloid.one/2025-3-23-1.webp" alt="实现流程图"></p><h2 id="部署-AutoFilm"><a href="#部署-AutoFilm" class="headerlink" title="部署 AutoFilm"></a>部署 AutoFilm</h2><p>参考 <a href="https://blog.akimio.top/posts/1031/">AutoFilm说明文档 | 秋澪的博客 </a> 部署。</p><p>Docker Compose 文件参考如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3.1&#x27;</span><br><span class="hljs-attr">services:</span><br>  <span class="hljs-attr">autofilm:</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">always</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./autofilm_config:/config</span> <span class="hljs-comment"># AutoFilm 配置文件存放位置</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./media:/media</span>            <span class="hljs-comment"># .strm 文件存放位置</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./autofilm_logs:/logs</span>     <span class="hljs-comment"># AutoFilm 日志存放位置</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">autofilm</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">akimio/autofilm:latest</span><br></code></pre></td></tr></table></figure><p>在 <code>./autofilm_config/config.yaml</code> 写入以下配置文件：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">Settings:</span><br>  <span class="hljs-attr">DEV:</span> <span class="hljs-literal">False</span>                          <span class="hljs-comment"># 开发者模式(可选，默认 False)</span><br><br><span class="hljs-attr">Alist2StrmList:</span><br>  <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">动漫</span>                          <span class="hljs-comment"># 标识 ID</span><br>    <span class="hljs-attr">cron:</span> <span class="hljs-number">0</span> <span class="hljs-string">*</span> <span class="hljs-string">*</span> <span class="hljs-string">*</span> <span class="hljs-string">*</span>                <span class="hljs-comment"># 后台定时任务 Crontable 表达式</span><br>    <span class="hljs-attr">url:</span> <span class="hljs-string">http://alist:5244</span>     <span class="hljs-comment"># Alist 服务器地址</span><br>    <span class="hljs-attr">username:</span> <span class="hljs-string">alist</span>                   <span class="hljs-comment"># Alist 用户名</span><br>    <span class="hljs-attr">password:</span> <span class="hljs-string">alist</span>           <span class="hljs-comment"># Alist 密码</span><br><span class="hljs-comment">#   token: alist-d22d23ddf42fvv2      # Alist Token 永久令牌（可选，使用永久令牌则无需设置账号密码）</span><br>    <span class="hljs-attr">source_dir:</span> <span class="hljs-string">/bangumi/</span>                 <span class="hljs-comment"># Alist 服务器上文件夹路径</span><br>    <span class="hljs-attr">target_dir:</span> <span class="hljs-string">/media/bangumi/</span>          <span class="hljs-comment"># 输出路径</span><br>    <span class="hljs-attr">flatten_mode:</span> <span class="hljs-literal">False</span>               <span class="hljs-comment"># 平铺模式，开启后 subtitle、image、nfo 强制关闭(可选，默认 False)</span><br>    <span class="hljs-attr">subtitle:</span> <span class="hljs-literal">True</span>                   <span class="hljs-comment"># 是否下载字幕文件（可选，默认 False）</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-literal">False</span>                      <span class="hljs-comment"># 是否下载图片文件（可选，默认 False）</span><br>    <span class="hljs-attr">nfo:</span> <span class="hljs-literal">False</span>                        <span class="hljs-comment"># 是否下载 .nfo 文件（可选，默认 False）</span><br>    <span class="hljs-attr">raw_url:</span> <span class="hljs-literal">False</span>                    <span class="hljs-comment"># 是否使用原始地址替换 Alist 服务器下载地址（可选，默认 False）</span><br>    <span class="hljs-attr">overwrite:</span> <span class="hljs-literal">False</span>                 <span class="hljs-comment"># 覆盖模式，本地路径存在同名文件时是否重新生成/下载该文件（可选，默认 False）</span><br>    <span class="hljs-attr">sync_server:</span> <span class="hljs-literal">True</span>                 <span class="hljs-comment"># 是否同步服务器（可选，默认为 True）</span><br>    <span class="hljs-attr">sync_ignore:</span> <span class="hljs-string">\.(nfo|jpg)$</span>         <span class="hljs-comment"># 同步时忽略的文件正则表达式（可选，默认为空，仅对文件名及拓展名有效，对路径无效）</span><br>    <span class="hljs-attr">max_workers:</span> <span class="hljs-number">2</span>                    <span class="hljs-comment"># 下载文件最大并发数（可选，默认 5）</span><br>    <span class="hljs-attr">max_downloaders:</span> <span class="hljs-number">2</span>                <span class="hljs-comment"># 下载文件最大并发数（可选，默认 5）</span><br>    <span class="hljs-attr">mode:</span> <span class="hljs-string">AlistPath</span>                   <span class="hljs-comment"># 下载模式（可选项：AlistPath、AlistFile、AlistList，默认 AlistPath）</span><br></code></pre></td></tr></table></figure><p>需要注意的点：</p><ul><li><code>mode</code> 请填写 <code>AlistPath</code>，因为可以<strong>配合下面的 MediaWarp 使用</strong>。</li><li><code>cron</code> 不能填写 <code>* * * * *</code>，所以你不能一分钟刷新一次。</li></ul><p>随后，定时任务执行后，<code>./media</code> 文件夹下应当已经生成了 <code>.strm</code> 文件。</p><h1 id="部署-Emby-服务端"><a href="#部署-Emby-服务端" class="headerlink" title="部署 Emby 服务端"></a>部署 Emby 服务端</h1><p>没什么好废话的，Docker Compose 一把梭：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3.1&#x27;</span><br> <span class="hljs-attr">emby:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">emby/embyserver:beta</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">emby</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./data:/config</span>  <span class="hljs-comment"># 持久化配置文件</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./media:/media</span>  <span class="hljs-comment"># 持久化媒体文件</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span>  <span class="hljs-comment"># 当容器停止时除非手动停止，自动重启</span><br>    <span class="hljs-attr">ports:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-number">8096</span><span class="hljs-string">:8096</span> <span class="hljs-comment"># Emby 默认端口</span><br></code></pre></td></tr></table></figure><p>需要注意，这里<strong>镜像需要选择 <code>beta</code> 版</strong>，因为下面的 Bangumi 插件和最新稳定版不兼容。</p><h1 id="MediaWarp-向客户端返回网盘直链作为播放链接"><a href="#MediaWarp-向客户端返回网盘直链作为播放链接" class="headerlink" title="MediaWarp 向客户端返回网盘直链作为播放链接"></a>MediaWarp 向客户端返回网盘直链作为播放链接</h1><p>MediaWarp 是<strong>前置于 EmbyServer 的 反向代理服务器</strong>，修改了原版 EmbyServer 的 API 返回内容以实现特殊功能。</p><p><img src="https://pic.r2.byteloid.one/2025-3-23-4.webp" alt="实现流程图"></p><h2 id="部署-MediaWarp"><a href="#部署-MediaWarp" class="headerlink" title="部署 MediaWarp"></a>部署 MediaWarp</h2><p>参考 <a href="https://blog.akimio.top/posts/1041/">MediaWarp说明文档 | 秋澪的博客 </a> 部署。</p><p>Docker Compose 文件参考如下：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3.1&#x27;</span><br><span class="hljs-attr">services:</span><br>  <span class="hljs-attr">mediawarp:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">akimio/mediawarp:latest</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">mediawarp</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./mediawarp_config:/config</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./mediawarp_logs:/logs</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">./static:/static</span><br>    <span class="hljs-attr">ports:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-number">9000</span><span class="hljs-string">:9000</span><br></code></pre></td></tr></table></figure><p>在 <code>./autofilm_config/config.yaml</code> 写入以下配置文件：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-attr">Port:</span> <span class="hljs-number">9000</span>                                  <span class="hljs-comment"># MideWarp监听端口</span><br><br><span class="hljs-attr">MediaServer:</span>                                <span class="hljs-comment"># 媒体服务器相关设置</span><br>  <span class="hljs-attr">Type:</span> <span class="hljs-string">Emby</span>                                <span class="hljs-comment"># 媒体服务器类型（可选选项：Emby）</span><br>  <span class="hljs-attr">ADDR:</span> <span class="hljs-string">http://emby:8096</span>                    <span class="hljs-comment"># 媒体服务器地址</span><br>  <span class="hljs-attr">AUTH:</span> <span class="hljs-string">authkey</span>                             <span class="hljs-comment"># 媒体服务器认证方式</span><br><br><span class="hljs-attr">Cache:</span>                                      <span class="hljs-comment"># 缓存设置</span><br>  <span class="hljs-attr">Type:</span> <span class="hljs-string">Memory</span>                              <span class="hljs-comment"># 缓存类型（可选项：Memory内存缓存）</span><br>  <span class="hljs-attr">WebCache:</span> <span class="hljs-literal">False</span>                           <span class="hljs-comment"># 是否启用Web缓存中间件（若MdiaWarp离上游服务距离较近则不建议启用）</span><br><br><span class="hljs-attr">Logger:</span>                                     <span class="hljs-comment"># 日志设定</span><br>  <span class="hljs-attr">AccessLogger:</span>                             <span class="hljs-comment"># 访问日志设定</span><br>    <span class="hljs-attr">Console:</span> <span class="hljs-literal">True</span>                           <span class="hljs-comment"># 是否将访问日志文件输出到终端中</span><br>    <span class="hljs-attr">File:</span> <span class="hljs-literal">False</span>                             <span class="hljs-comment"># 是否将访问日志文件记录到文件中</span><br>  <span class="hljs-attr">ServiceLogger:</span>                            <span class="hljs-comment"># 服务日志设定</span><br>    <span class="hljs-attr">Console:</span> <span class="hljs-literal">True</span>                           <span class="hljs-comment"># 是否将服务日志文件输出到终端中</span><br>    <span class="hljs-attr">File:</span> <span class="hljs-literal">True</span>                              <span class="hljs-comment"># 是否将服务日志文件记录到文件中</span><br><br><span class="hljs-attr">Web:</span>                                        <span class="hljs-comment"># Web页面修改相关设置</span><br>  <span class="hljs-attr">Enable:</span> <span class="hljs-literal">True</span>                              <span class="hljs-comment"># 总开关</span><br>  <span class="hljs-attr">Custom:</span> <span class="hljs-literal">True</span>                              <span class="hljs-comment"># 是否加载自定义静态资源</span><br>  <span class="hljs-attr">Index:</span> <span class="hljs-literal">false</span>                               <span class="hljs-comment"># 是否从static目录读取index.html文件 </span><br>  <span class="hljs-attr">Head:</span> <span class="hljs-string">|</span>                                   <span class="hljs-comment"># 是否添加自定义字段到index.html的HEAD中</span><br>    <span class="hljs-string">&lt;script</span> <span class="hljs-string">src=&quot;/MediaWarp/static/custom/emby-front-end-mod/actor-plus.js&quot;&gt;&lt;/script&gt;</span><br>    <span class="hljs-string">&lt;script</span> <span class="hljs-string">src=&quot;/MediaWarp/static/custom/emby-front-end-mod/emby-swiper.js&quot;&gt;&lt;/script&gt;</span><br>    <span class="hljs-string">&lt;script</span> <span class="hljs-string">src=&quot;/MediaWarp/static/custom/emby-front-end-mod/emby-tab.js&quot;&gt;&lt;/script&gt;</span><br>    <span class="hljs-string">&lt;script</span> <span class="hljs-string">src=&quot;/MediaWarp/static/custom/emby-front-end-mod/fanart-show.js&quot;&gt;&lt;/script&gt;</span><br>    <span class="hljs-string">&lt;script</span> <span class="hljs-string">src=&quot;/MediaWarp/static/custom/emby-front-end-mod/playbackRate.js&quot;&gt;&lt;/script&gt;</span><br><br>  <span class="hljs-attr">ExternalPlayerUrl:</span> <span class="hljs-literal">True</span>                   <span class="hljs-comment"># 是否开启外置播放器</span><br>  <span class="hljs-attr">ActorPlus:</span> <span class="hljs-literal">false</span>                           <span class="hljs-comment"># 过滤没有头像的演员和制作人员</span><br>  <span class="hljs-attr">FanartShow:</span> <span class="hljs-literal">True</span>                          <span class="hljs-comment"># 显示同人图（fanart图）</span><br>  <span class="hljs-attr">Danmaku:</span> <span class="hljs-literal">True</span>                             <span class="hljs-comment"># Web显示弹幕</span><br>  <span class="hljs-attr">VideoTogether:</span> <span class="hljs-literal">False</span>                       <span class="hljs-comment"># 共同观影，详情见 https://videotogether.github.io/</span><br>  <span class="hljs-attr">BeautifyCSS:</span> <span class="hljs-literal">True</span>                         <span class="hljs-comment"># Emby美化CSS样式</span><br><br><span class="hljs-attr">ClientFilter:</span>                               <span class="hljs-comment"># 客户端过滤器</span><br>  <span class="hljs-attr">Enable:</span> <span class="hljs-literal">False</span>                             <span class="hljs-comment"># 是否启用客户端过滤器</span><br>  <span class="hljs-attr">Mode:</span> <span class="hljs-string">BlackList</span> <span class="hljs-comment"># WhileList / BlackList   # 黑白名单模式</span><br>  <span class="hljs-attr">ClientList:</span>                               <span class="hljs-comment"># 名单列表</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">Fileball</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">Infuse</span><br><br><span class="hljs-comment"># 302重定向相关配置</span><br><br><span class="hljs-attr">HTTPStrm:</span> <br>  <span class="hljs-attr">Enable:</span> <span class="hljs-literal">False</span>                            <span class="hljs-comment"># 是否开启HttpStrm重定向</span><br>  <span class="hljs-attr">TransCode:</span> <span class="hljs-literal">True</span>                          <span class="hljs-comment"># False：强制关闭转码 True：保持原有转码设置</span><br>  <span class="hljs-attr">PrefixList:</span>                               <span class="hljs-comment"># EmbyServer中Strm文件的前缀（符合该前缀的Strm文件且被正确识别为http协议都会路由到该规则下）</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">/media/strm/http</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">/media/strm/https</span><br><br><span class="hljs-attr">AlistStrm:</span>                                  <span class="hljs-comment"># AlistStrm相关配置（Strm文件内容是Alist上文件的路径，目前仅支持适配Alist V3）</span><br>  <span class="hljs-attr">Enable:</span> <span class="hljs-literal">True</span>                              <span class="hljs-comment"># 是否启用AlistStrm重定向</span><br>  <span class="hljs-attr">TransCode:</span> <span class="hljs-literal">False</span>                           <span class="hljs-comment"># False：强制关闭转码 True：保持原有转码设置</span><br>  <span class="hljs-attr">RawURL:</span> <span class="hljs-literal">True</span>                             <span class="hljs-comment"># Fasle：直接响应 Alist 上游的真实链接 True：响应 Alist 服务器的直链（要求客户端可以访问到 Alist）</span><br>  <span class="hljs-attr">List:</span>                                     <span class="hljs-comment"># Alist服务关配置列表</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">ADDR:</span> <span class="hljs-string">http://1Panel-alist-fvbK:5244</span>      <span class="hljs-comment"># Alist服务器地址</span><br>      <span class="hljs-attr">Token:</span> <span class="hljs-string">AlistToken</span>  <span class="hljs-comment"># Alist Token</span><br>      <span class="hljs-attr">PrefixList:</span>                           <span class="hljs-comment"># EmbyServer中Strm文件的前缀（符合该前缀的Strm文件都会路由到该规则下）</span><br>        <span class="hljs-bullet">-</span> <span class="hljs-string">/media/bangumi</span>                   <span class="hljs-comment"># 同一个Alist可以有多个前缀规则</span><br>        <span class="hljs-bullet">-</span> <span class="hljs-string">/media/movies</span><br>        <span class="hljs-bullet">-</span> <span class="hljs-string">/media/dramas</span><br><br><span class="hljs-attr">Subtitle:</span>                                   <span class="hljs-comment"># 字体相关设置</span><br>  <span class="hljs-attr">Enable:</span> <span class="hljs-literal">True</span>                              <span class="hljs-comment"># 启用</span><br>  <span class="hljs-attr">SRT2ASS:</span> <span class="hljs-literal">False</span>                             <span class="hljs-comment"># SRT 字幕转 ASS 字幕</span><br>  <span class="hljs-attr">ASSStyle:</span>                                 <span class="hljs-comment"># SRT 字幕转 ASS 字幕使用的样式</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding&quot;</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;Style: Default,楷体,20,&amp;H03FFFFFF,&amp;H00FFFFFF,&amp;H00000000,&amp;H02000000,-1,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1&quot;</span><br></code></pre></td></tr></table></figure><p>其中，<code>MediaServer</code> 的 <code>authkey</code> 可以在 <strong>Emby 管理后台 - 高级 - API 密钥</strong> 获取。</p><h1 id="Bangumi-插件刮削番剧和多季番剧的元数据设置"><a href="#Bangumi-插件刮削番剧和多季番剧的元数据设置" class="headerlink" title="Bangumi 插件刮削番剧和多季番剧的元数据设置"></a>Bangumi 插件刮削番剧和多季番剧的元数据设置</h1><h2 id="添加-Bangumi-插件"><a href="#添加-Bangumi-插件" class="headerlink" title="添加 Bangumi 插件"></a>添加 Bangumi 插件</h2><p>从 <a href="https://github.com/kookxiang/jellyfin-plugin-bangumi/releases">Releases</a> 界面下载 <code>Emby.Plugin.Bangumi.dll</code>，随后将其复制到 <code>./data/plugins/</code> 下，重启 Emby 服务器。</p><h2 id="Bangumi-插件的设置"><a href="#Bangumi-插件的设置" class="headerlink" title="Bangumi 插件的设置"></a>Bangumi 插件的设置</h2><p>打开 <strong>Emby 管理后台 - Bangumi Lite</strong>，登录自己的 Bangumi 账号。</p><p>你可以参考我的 Bangumi 插件设置：</p><p><img src="https://pic.r2.byteloid.one/2025-3-23-5.png" alt="Bangumi 插件设置"></p><h2 id="多季番剧元数据设置"><a href="#多季番剧元数据设置" class="headerlink" title="多季番剧元数据设置"></a>多季番剧元数据设置</h2><p>参考官方 WIKI：</p><blockquote><p><strong>多季动漫</strong><br>使用 Season X 的文件夹存放每季的视频，jellyfin 会自动显示为 第 n 季<br>注意此时无法自动关联在 bangumi 上的 id，需要手动编辑该季的元数据，在 Bangumi 季 ID 中填写手动关联<br>关联后重新刷新元数据即可</p><p><strong>分割放送的动漫</strong><br>对于分割放松的剧集，用 Season x Part y 的方式命名文件夹<br>此时 jellyfin 会在两个 Season x 的文件夹下分开存储元数据，但由于季号相同，界面上只会显示成一季<br>关联时需要点击单集动画，通过名称下方的 第 x 季 按钮返回，此时编辑元数据可以修改单个文件夹下的 ID<br>填写后通过同样的方式修改其他文件夹的 id，最后分别刷新元数据（或者直接在系列中刷新元数据）</p></blockquote><p>因此，打开元数据管理器，找到多季放送的番剧，展开后<strong>分别填写每一季的 Bangumi ID</strong>，随后点击<strong>保存 - 右侧三个点 - 刷新元数据 - 替换所有元数据</strong>，即可显示正确的元数据。</p><h1 id="Authentik-LDAP-插件实现统一身份认证"><a href="#Authentik-LDAP-插件实现统一身份认证" class="headerlink" title="Authentik + LDAP 插件实现统一身份认证"></a>Authentik + LDAP 插件实现统一身份认证</h1><div class="note note-warning">            <p>LDAP 插件需要 Emby Premiere 订阅才能工作，开心版无法绕过此限制。</p>          </div><p><img src="https://pic.r2.byteloid.one/2025-3-23-6.webp" alt="实现流程图"></p><h2 id="配置-Authentik"><a href="#配置-Authentik" class="headerlink" title="配置 Authentik"></a>配置 Authentik</h2><p>按照正常流程配置 LDAP 和和前哨即可<del>才不是我懒得写了（</del></p><h2 id="配置-LDAP-插件"><a href="#配置-LDAP-插件" class="headerlink" title="配置 LDAP 插件"></a>配置 LDAP 插件</h2><p>打开 <strong>Emby 管理后台 - 高级 - 插件 - LDAP</strong>，随后填写以下参数：</p><p><code>LDAP server address</code>：LDAP 服务器地址，只需要填写 IP 或者是域名即可，<strong>不需要带协议头</strong>。<br><code>LDAP server Port number</code>：LDAP 服务器端口，启用 SSL 根据实际情况填写。</p><p><code>Bind DN</code>：填写 Authentik 提示的 <code>Bind DN</code> 内容。<br><code>Bind credentials</code>：填写 Authentik 提示的 <code>Bind 密码</code> 内容。</p><p><code>User search base</code>：填写为 <code>OU=users,DC=ldap,DC=goauthentik,DC=io</code>。<br><code>User search filter</code>：填写为：<code>(cn=&#123;0&#125;)</code></p><p>如果一切顺利的话，这个时候 Emby 已经可以通过 LDAP 认证了。</p><h1 id="已知问题"><a href="#已知问题" class="headerlink" title="已知问题"></a>已知问题</h1><h2 id="AutoFilm"><a href="#AutoFilm" class="headerlink" title="AutoFilm"></a>AutoFilm</h2><ul><li><del>长时间运行任务时导致崩溃（<a href="https://github.com/Akimio521/AutoFilm/issues/89">#89</a>）</del> 已在新版解决</li><li>不支持音乐文件</li></ul><h2 id="MediaWarp"><a href="#MediaWarp" class="headerlink" title="MediaWarp"></a>MediaWarp</h2><ul><li>影响到 Emby 播放电视直播（<a href="https://github.com/Akimio521/MediaWarp/issues/26">#26</a>）</li><li>不支持音乐文件</li></ul><h2 id="Bangumi-插件"><a href="#Bangumi-插件" class="headerlink" title="Bangumi 插件"></a>Bangumi 插件</h2><ul><li>SP 内容无法正常刮削（<a href="https://github.com/kookxiang/jellyfin-plugin-bangumi/issues/198">#198</a>）</li><li>标题含有 <code>-</code> 无法正常刮削（<a href="https://github.com/kookxiang/jellyfin-plugin-bangumi/issues/186">#186</a>）</li><li>（2025&#x2F;5&#x2F;11 更新）实测在 Emby 4.9.0.40 后某个版本 Bangumi 插件失效</li></ul><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>说实话尽管发展了这么久，实际上整套系统还是不怎么成熟的。</p><p>如果有条件的话，我还是建议本地大硬盘会更好，也没必要这么折腾。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近给某个群内搭建了 Emby 媒体服务器作为群服务提供，中间因为各种原因踩了大大小小的坑，最后才有了这篇文章。&lt;/p&gt;
&lt;div class=&quot;note note-warning&quot;&gt;
            &lt;p&gt;注意：此文章随时可能更新，文中用到的软件可能随时更新，因此配置文件可能过时。&lt;/p&gt;
          &lt;/div&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="ANI-RSS" scheme="https://blog.byteloid.one/tags/ANI-RSS/"/>
    
    <category term="Emby" scheme="https://blog.byteloid.one/tags/Emby/"/>
    
    <category term="AutoFilm" scheme="https://blog.byteloid.one/tags/AutoFilm/"/>
    
    <category term="MediaWarp" scheme="https://blog.byteloid.one/tags/MediaWarp/"/>
    
    <category term="Bangumi" scheme="https://blog.byteloid.one/tags/Bangumi/"/>
    
    <category term="AList" scheme="https://blog.byteloid.one/tags/AList/"/>
    
    <category term="LDAP" scheme="https://blog.byteloid.one/tags/LDAP/"/>
    
    <category term="天翼云盘" scheme="https://blog.byteloid.one/tags/%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98/"/>
    
    <category term="OneDrive" scheme="https://blog.byteloid.one/tags/OneDrive/"/>
    
    <category term="Authentik" scheme="https://blog.byteloid.one/tags/Authentik/"/>
    
  </entry>
  
  <entry>
    <title>让不支持的手机用上中国广电 4G/5G</title>
    <link href="https://blog.byteloid.one/2025/02/16/let-old-phones-using-china-broadnet/"/>
    <id>https://blog.byteloid.one/2025/02/16/let-old-phones-using-china-broadnet/</id>
    <published>2025-02-16T06:14:37.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>最近尝试让吃灰的备用机用上中国广电，但是因为广电是这几年才开始发展的运营商，几年前的手机默认都不支持。</p><p>但是通过一些神奇的技巧，可以轻松让旧手机用上中国广电 4G&#x2F;5G。</p><span id="more"></span><h1 id="iPhone-系"><a href="#iPhone-系" class="headerlink" title="iPhone 系"></a>iPhone 系</h1><p>让旧 iPhone 用上广电 4G&#x2F;5G 应该是最简单的了。</p><p>需要的工具：爱思助手（或者其他可以刷入 IPCC 文件的工具）</p><h2 id="下载中国广电的-IPCC-文件"><a href="#下载中国广电的-IPCC-文件" class="headerlink" title="下载中国广电的 IPCC 文件"></a>下载中国广电的 IPCC 文件</h2><p>从以下链接下载并解压出 IPCC 文件：</p><blockquote><p>链接:<a href="https://wwxh.lanzoup.com/b00l1nleqd">https://wwxh.lanzoup.com/b00l1nleqd</a><br>密码:dd1r</p></blockquote><h2 id="刷入-IPCC-文件"><a href="#刷入-IPCC-文件" class="headerlink" title="刷入 IPCC 文件"></a>刷入 IPCC 文件</h2><p>打开爱思助手（或者其他可以刷入 IPCC 文件的工具），连接上你的 iPhone。</p><p>打开工具箱 - 更新 IPCC 文件，选择下载的 IPCC 文件，选择一个并且刷入。</p><p>随后，如果顺利的话，这时候 iPhone 上左上角应该已经出现了中国广电的<strong>非空信号</strong>，并且可以<strong>正常使用 4G&#x2F;5G、VoLTE、短信等功能</strong>。</p><p>如果没有，可以尝试切换至<strong>飞行模式一到两次</strong>，仍然不工作的话则尝试轮流刷入剩下的 IPCC 文件。</p><p>如果顺利的话，打开设置 - 蜂窝移动网络，应该会显示网络选择为<strong>中国广电（460-15）</strong>，且能正常上网。</p><h2 id="重启-切换网络选择后失效？"><a href="#重启-切换网络选择后失效？" class="headerlink" title="重启 &#x2F; 切换网络选择后失效？"></a>重启 &#x2F; 切换网络选择后失效？</h2><p>开关飞行模式即可。</p><h1 id="Android-系"><a href="#Android-系" class="headerlink" title="Android 系"></a>Android 系</h1><p>让 Android 系手机用上中国广电是相当灵车的，您可能会遇到以下情况</p><ul><li>无法上网</li><li>无法发送 &#x2F; 接收短信</li><li>无法使用 VoLTE &#x2F; VoNR，导致无法拨打 &#x2F; 接听电话</li></ul><h2 id="选择网络"><a href="#选择网络" class="headerlink" title="选择网络"></a>选择网络</h2><p>选择网络为中国广电（46015），一般来说会显示<strong>已在此网络上注册</strong>。</p><h2 id="设置-APN-接入点"><a href="#设置-APN-接入点" class="headerlink" title="设置 APN 接入点"></a>设置 APN 接入点</h2><p>新建一个接入点，名称和 APN 均填写 cbnet，其他不用管。</p><p>随后选择接入点，如果顺利的话就可以正常使用了，如果不顺利的话请按照以下步骤尝试：</p><h2 id="手动选择网络"><a href="#手动选择网络" class="headerlink" title="手动选择网络"></a>手动选择网络</h2><p>在拨号界面输入 <code>*#*#4636*#*#</code>，选择信息，手动切换网络到 <code>LTE Only</code> 或是 <code>NR / LTE</code>。</p><p>如果顺利的话应该可以上网了。</p><h2 id="开启-VoLTE"><a href="#开启-VoLTE" class="headerlink" title="开启 VoLTE"></a>开启 VoLTE</h2><p>在设置里开启 VoLTE，或是在拨号界面输入 <code>*#*#4636*#*#</code>，选择信息，选择启用 VoLTE。</p><p><strong>可能不工作。</strong></p><h2 id="实现收发短信"><a href="#实现收发短信" class="headerlink" title="实现收发短信"></a>实现收发短信</h2><p>不知道，这个似乎无法修复？</p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>总的来说，在旧 iPhone 上使用中国广电的难度约等于零，而在 Android 手机上实现的话难度极大，且很可能只能实现上网。</p><p>所以我还是推荐购入旧 iPhone <del>但是内存是真小啊，Telegram 都跑不动。</del></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近尝试让吃灰的备用机用上中国广电，但是因为广电是这几年才开始发展的运营商，几年前的手机默认都不支持。&lt;/p&gt;
&lt;p&gt;但是通过一些神奇的技巧，可以轻松让旧手机用上中国广电 4G&amp;#x2F;5G。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="中国广电" scheme="https://blog.byteloid.one/tags/%E4%B8%AD%E5%9B%BD%E5%B9%BF%E7%94%B5/"/>
    
    <category term="iOS" scheme="https://blog.byteloid.one/tags/iOS/"/>
    
    <category term="Android" scheme="https://blog.byteloid.one/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>使用 Cloudflare WARP 保护 Mastodon 源站</title>
    <link href="https://blog.byteloid.one/2025/02/11/using-warp-to-protect-mastodon-origin-server/"/>
    <id>https://blog.byteloid.one/2025/02/11/using-warp-to-protect-mastodon-origin-server/</id>
    <published>2025-02-11T06:17:16.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>Cloudflare CDN 能保证实例免遭 DDoS 和 CC 攻击，但是基于 Mastodon 和 Fediverse 互联的特性，攻击者完全可以通过特定联合来锁定源站，这篇文章是为了记录让 Mastodon 实例和其他实例通信时通过 Cloudflare WARP 代理流量以防止源站泄露。</p><span id="more"></span><div class="note note-warning">            <p><strong>联合问题警告</strong><br>Mastodon 和其他实例通信时走代理能很好的保护源站，但如果您的代理提供商所提供的 IP 不干净，可能会导致在与其他实例通信时被对方的 WAF 阻拦。</p>          </div> <h1 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h1><h2 id="修改-docker-compose-yml"><a href="#修改-docker-compose-yml" class="headerlink" title="修改 docker-compose.yml"></a>修改 docker-compose.yml</h2><p>在 <code>services</code> 项下添加以下内容：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">warproxy:</span><br>  <span class="hljs-attr">image:</span> <span class="hljs-string">ghcr.io/tunmax/canal:latest</span><br>  <span class="hljs-attr">restart:</span> <span class="hljs-string">always</span><br>  <span class="hljs-attr">networks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">mastodon-network</span><br></code></pre></td></tr></table></figure><p><em>理论上，这里可以换成任何一个代理，本文在此处使用了 <a href="https://github.com/tunmax/canal">canel 项目</a>，这是已经打包好的 Cloudflare WARP 镜像。</em></p><h2 id="修改环境变量"><a href="#修改环境变量" class="headerlink" title="修改环境变量"></a>修改环境变量</h2><p>在 <code>.env.production </code> 文件添加以下内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs .env">http_proxy=http://warproxy:1080<br>no_proxy=&quot;127.0.0.1,1Panel*,es,es*,172.18.0.0/24&quot;<br></code></pre></td></tr></table></figure><p><strong>这里的 <code>no_proxy</code> 需要换成你不需要走代理的地址，防止在启用代理后 <a href="https://baka.ink/@baka/113980141731552091">无法连接至 Elasticsearch</a>。</strong></p><h1 id="启用-Cloudflare-WARP-代理"><a href="#启用-Cloudflare-WARP-代理" class="headerlink" title="启用 Cloudflare WARP 代理"></a>启用 Cloudflare WARP 代理</h1><p>执行以下指令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker compose down<br>docker compose up -d<br></code></pre></td></tr></table></figure><p>随后，Mastodon 的<a href="https://baka.ink/@bingxin/113980233691262815">几乎所有网络操作</a>都会通过代理进行。</p><h1 id="额外的配置-License"><a href="#额外的配置-License" class="headerlink" title="额外的配置 License"></a>额外的配置 License</h1><p>Cloudflare WARP 可能存在流量上限，因此我建议额外配置这一步。</p><p>参考 <a href="https://github.com/tunmax/canal">canal</a> 的 README，使用 WARP+ 需要以下额外步骤：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 容器部署后，输入以下命令进入容器</span><br>docker <span class="hljs-built_in">exec</span> -it canal bash<br><br><span class="hljs-comment"># 设置 WARP+ 的 license</span><br>warp-cli registration license &lt;license <span class="hljs-built_in">id</span>&gt;<br><br><span class="hljs-comment"># 退出容器</span><br><span class="hljs-built_in">exit</span><br><br><span class="hljs-comment"># 重启容器</span><br>docker restart canal<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Cloudflare CDN 能保证实例免遭 DDoS 和 CC 攻击，但是基于 Mastodon 和 Fediverse 互联的特性，攻击者完全可以通过特定联合来锁定源站，这篇文章是为了记录让 Mastodon 实例和其他实例通信时通过 Cloudflare WARP 代理流量以防止源站泄露。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Cloudflare" scheme="https://blog.byteloid.one/tags/Cloudflare/"/>
    
    <category term="Mastodon" scheme="https://blog.byteloid.one/tags/Mastodon/"/>
    
  </entry>
  
  <entry>
    <title>通过 Docker 和 Clouflare Workers 搭建 Matrix Synapse 实例</title>
    <link href="https://blog.byteloid.one/2025/01/18/selfhost-matrix-server/"/>
    <id>https://blog.byteloid.one/2025/01/18/selfhost-matrix-server/</id>
    <published>2025-01-18T18:14:37.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>这篇文章主要是为了记录搭建 Matrix Synapse，部署在子域名方法，希望能对你有所帮助。</p><span id="more"></span><h1 id="准备工具"><a href="#准备工具" class="headerlink" title="准备工具"></a>准备工具</h1><p>一台至少 2H4G 的服务器，建议 4H8G 且服务器位于境外，否则可能对互联有些影响……</p><p>（建议，推荐）提前准备好 PostgreSQL 数据库。</p><p>这里我们会说到两个域名，<code>matrix.example.com</code> 为实际的 Matrix 服务器地址，<code>example.com</code> 为显示的 Matrix 服务器地址。</p><blockquote><p>广告位招租</p></blockquote><h1 id="通过-Docker-Compose-部署-Synapse"><a href="#通过-Docker-Compose-部署-Synapse" class="headerlink" title="通过 Docker Compose 部署 Synapse"></a>通过 Docker Compose 部署 Synapse</h1><p>Docker Compose 文件示例如下，你应该自行修改成符合自己要求的配置：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">version:</span> <span class="hljs-string">&quot;3.3&quot;</span><br><br><span class="hljs-attr">networks:</span><br>    <span class="hljs-attr">matrix-network:</span><br>        <span class="hljs-attr">external:</span> <span class="hljs-literal">true</span><br><br><span class="hljs-attr">services:</span><br>  <span class="hljs-attr">synapse:</span><br>    <span class="hljs-attr">image:</span> <span class="hljs-string">&quot;matrixdotorg/synapse:latest&quot;</span><br>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">&quot;matrix_example_synapse&quot;</span><br>    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span><br>    <span class="hljs-attr">ports:</span><br>     <span class="hljs-bullet">-</span> <span class="hljs-number">8008</span><span class="hljs-string">:8008</span><br>    <span class="hljs-attr">volumes:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;./data:/data&quot;</span><br>    <span class="hljs-attr">environment:</span><br>      <span class="hljs-attr">VIRTUAL_HOST:</span> <span class="hljs-string">&quot;example.com&quot;</span><br>      <span class="hljs-attr">VIRTUAL_PORT:</span> <span class="hljs-number">8008</span><br>      <span class="hljs-attr">SYNAPSE_SERVER_NAME:</span> <span class="hljs-string">&quot;example.com&quot;</span><br>      <span class="hljs-attr">SYNAPSE_REPORT_STATS:</span> <span class="hljs-string">&quot;yes&quot;</span><br>    <span class="hljs-attr">networks:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">matrix-network</span><br></code></pre></td></tr></table></figure><p>然后，相同目录下，运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker run -it --<span class="hljs-built_in">rm</span> -v ./data/:/data/ -e SYNAPSE_SERVER_NAME=example.com -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate<br></code></pre></td></tr></table></figure><p>接着，进入 <code>./data</code> 目录，自行修改你需要的配置于 <code>homeserver.yaml</code>。</p><p>这里说几个非常关键的点：</p><ul><li>如果实例部署在子域，但是实例标识符在主域，务必<strong>在配置文件中写入 <code>public_baseurl: https://matrix.example.com/</code> 为你的实际域名</strong>。</li><li>Synapse 对数据库有<strong>特殊的要求</strong>，请参照<a href="https://element-hq.github.io/synapse/latest/postgres.html">官方文档</a>手动创建数据库。</li></ul><h1 id="部署-Cloudflare-Workers-以实现联合发现"><a href="#部署-Cloudflare-Workers-以实现联合发现" class="headerlink" title="部署 Cloudflare Workers 以实现联合发现"></a>部署 Cloudflare Workers 以实现联合发现</h1><p>如果你把 Matrix 部署在了子域名下，但是标识符又是主域名，那么这一步<strong>非常关键</strong>。</p><p><a href="https://gist.github.com/bingxin666/05def6dd12a706b79609acd5aec8e047">worker.js</a> 文件如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><code class="hljs js"><span class="hljs-keyword">const</span> <span class="hljs-variable constant_">HOMESERVER_URL</span> = <span class="hljs-string">&quot;https://matrix.example.com&quot;</span>;<br><span class="hljs-keyword">const</span> <span class="hljs-variable constant_">IDENTITY_SERVER_URL</span> = <span class="hljs-string">&quot;https://vector.im&quot;</span>;<br><span class="hljs-keyword">const</span> <span class="hljs-variable constant_">FEDERATION_SERVER</span> = <span class="hljs-string">&quot;matrix.example.com:443&quot;</span>;<br><br><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> &#123;<br>  <span class="hljs-keyword">async</span> <span class="hljs-title function_">fetch</span>(<span class="hljs-params">request</span>) &#123;<br>    <span class="hljs-keyword">const</span> path = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(request.<span class="hljs-property">url</span>).<span class="hljs-property">pathname</span>;<br>    <span class="hljs-keyword">switch</span> (path) &#123;<br>      <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;/.well-known/matrix/client&quot;</span>:<br>        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<br>          <span class="hljs-string">`&#123;&quot;m.homeserver&quot;: &#123;&quot;base_url&quot;: &quot;<span class="hljs-subst">$&#123;HOMESERVER_URL&#125;</span>&quot;&#125;,&quot;m.identity_server&quot;: &#123;&quot;base_url&quot;: &quot;<span class="hljs-subst">$&#123;IDENTITY_SERVER_URL&#125;</span>&quot;&#125;&#125;`</span>,<br>          &#123;<br>            <span class="hljs-attr">status</span>: <span class="hljs-number">200</span>,<br>            <span class="hljs-attr">headers</span>: &#123;<br>              <span class="hljs-string">&quot;Access-Control-Allow-Origin&quot;</span>: <span class="hljs-string">&quot;*&quot;</span>,<br>              <span class="hljs-string">&quot;Content-Type&quot;</span>: <span class="hljs-string">&quot;application/json&quot;</span>,<br>            &#125;,<br>          &#125;<br>        );<br>      <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;/.well-known/matrix/server&quot;</span>:<br>        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">`&#123;&quot;m.server&quot;: &quot;<span class="hljs-subst">$&#123;FEDERATION_SERVER&#125;</span>&quot;&#125;`</span>, &#123;<br>          <span class="hljs-attr">status</span>: <span class="hljs-number">200</span>,<br>          <span class="hljs-attr">headers</span>: &#123;<br>            <span class="hljs-string">&quot;Access-Control-Allow-Origin&quot;</span>: <span class="hljs-string">&quot;*&quot;</span>,<br>            <span class="hljs-string">&quot;Content-Type&quot;</span>: <span class="hljs-string">&quot;application/json&quot;</span>,<br>          &#125;,<br>        &#125;);<br>      <span class="hljs-attr">default</span>:<br>        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Response</span>(<span class="hljs-string">&quot;Invalid request&quot;</span>, &#123;<br>          <span class="hljs-attr">status</span>: <span class="hljs-number">400</span>,<br>          <span class="hljs-attr">headers</span>: &#123;<br>            <span class="hljs-string">&quot;Access-Control-Allow-Origin&quot;</span>: <span class="hljs-string">&quot;*&quot;</span>,<br>            <span class="hljs-string">&quot;Content-Type&quot;</span>: <span class="hljs-string">&quot;text/plain&quot;</span>,<br>          &#125;,<br>        &#125;);<br>    &#125;<br>    &#125;,<br>&#125;;<br></code></pre></td></tr></table></figure><p>部署到 Cloudflare 后，转到 设置 - 域和路由，添加路由为 <code>example.com/.well-known/matrix/*</code>。</p><p><strong>请确保你的主域名开启了 Cloudflare CDN，否则 Workers 不会生效！</strong></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;这篇文章主要是为了记录搭建 Matrix Synapse，部署在子域名方法，希望能对你有所帮助。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Cloudflare" scheme="https://blog.byteloid.one/tags/Cloudflare/"/>
    
    <category term="Matrix" scheme="https://blog.byteloid.one/tags/Matrix/"/>
    
    <category term="Synapse" scheme="https://blog.byteloid.one/tags/Synapse/"/>
    
  </entry>
  
  <entry>
    <title>在 Fediverse 上关注博客的最新动态！</title>
    <link href="https://blog.byteloid.one/2025/01/11/%E5%9C%A8Fediverse%E4%B8%8A%E5%AE%9E%E6%97%B6%E5%85%B3%E6%B3%A8%E6%88%91%E4%BB%AC/"/>
    <id>https://blog.byteloid.one/2025/01/11/%E5%9C%A8Fediverse%E4%B8%8A%E5%AE%9E%E6%97%B6%E5%85%B3%E6%B3%A8%E6%88%91%E4%BB%AC/</id>
    <published>2025-01-11T13:55:23.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>现在，您可以在 Fediverse 上关注我的博客都发了些什么。</p><span id="more"></span><p><a href="https://baka.ink/@bingxin_blog">在 Baka.Ink 上</a> 或是关注我们的 <strong>Fediverse 账号</strong> <code>@bingxin_blog@baka.ink</code> 了解最新博文！</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;现在，您可以在 Fediverse 上关注我的博客都发了些什么。&lt;/p&gt;</summary>
    
    
    
    <category term="博客" scheme="https://blog.byteloid.one/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="Blog" scheme="https://blog.byteloid.one/tags/Blog/"/>
    
  </entry>
  
  <entry>
    <title>2024 年度总结</title>
    <link href="https://blog.byteloid.one/2024/12/29/2024%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    <id>https://blog.byteloid.one/2024/12/29/2024%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/</id>
    <published>2024-12-29T12:02:20.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>2024 年，有了一些不一样的。</p><span id="more"></span><h2 id="「我」"><a href="#「我」" class="headerlink" title="「我」"></a>「我」</h2><p>2024 年相较于 2023 年，对于我自己相较于去年没有更加看重了，但我毕竟是「我」，我总得为「我自己」想些什么。</p><h3 id="逐渐陷入混沌"><a href="#逐渐陷入混沌" class="headerlink" title="逐渐陷入混沌"></a>逐渐陷入混沌</h3><blockquote><p>与其选择逃避，不如选择接受。</p></blockquote><p>2024 年是对我更重要的一年，远超 2023 年的变化也让我难以承受。</p><p>一方面是学业由于各种意外的发生逐渐跟不上其他人，另一方面是因为交到了新的朋友，又同样产生了新的矛盾。</p><p>有喜有悲，但我不在尝试逃避，而是选择去面对那些早已存在许久的问题，即使会更加难以承受。</p><h3 id="一个人的旅行"><a href="#一个人的旅行" class="headerlink" title="一个人的旅行"></a>一个人的旅行</h3><p>今年应该是我离开家最远的一次了。</p><p>第一次是在五月初的小长假选择一个人去长沙逛了一圈，虽然不是很久，但却是我第一次尝试独自出去旅行。</p><p>第二次是暑假，我一个人出去了差不多三周多，先是在重庆玩了好几天，然后又去武汉和网友面基，最后去杭州简单参观了下（其实是因为一到杭州就发烧了，结果哪都没去orz）。</p><p>算是很放松的体验，远离熟悉的人，去到陌生的地方游玩，总是有着很新奇的感受。</p><h3 id="新朋友"><a href="#新朋友" class="headerlink" title="新朋友"></a>新朋友</h3><p>今年通过网络又认识了许多有趣的人！</p><p>虽然交到的朋友和朋友之间可能存在矛盾，但总体而言还是不错的感受！</p><h3 id="个人信息的泄露"><a href="#个人信息的泄露" class="headerlink" title="个人信息的泄露"></a>个人信息的泄露</h3><p>这个应该是今年遇到最大的问题，我的部分信息已经被泄露了。</p><p>但是我不可能去尝试堵住泄漏源（实际上也不可能），但却是很好的提醒了我，网络上并不全是正常人。</p><h2 id="「我的」"><a href="#「我的」" class="headerlink" title="「我的」"></a>「我的」</h2><p>接下来是一些有关我的东西的总结，也算是梳理一下吧。</p><h3 id="更频繁的博客更新"><a href="#更频繁的博客更新" class="headerlink" title="更频繁的博客更新"></a>更频繁的博客更新</h3><p>今年，我一共更新了 16 篇文章，这远超我一开始定下的每月一篇的目标！</p><p>虽然中间出现过断更，但还是圆满完成了今年的任务。</p><h3 id="从「多而杂」转向「小而强」"><a href="#从「多而杂」转向「小而强」" class="headerlink" title="从「多而杂」转向「小而强」"></a>从「多而杂」转向「小而强」</h3><p>这算是我玩服务器生涯最大的转向了。</p><p>原本我的服务器是相当多而杂的，这就导致虽然看起来服务器总数量和性能相当的不错，但实际上根本跑不了什么大型服务。</p><p>因此今年最大的变化就是将原本分散在多台服务器上面的服务集中了起来，目前的架构是国内两台服务器和海外一台服务器用于服务用途。</p><p>虽然这可能会导致单点故障问题，但受限于资金也只能如此了。</p><h3 id="域名变更"><a href="#域名变更" class="headerlink" title="域名变更"></a>域名变更</h3><p>虽然我在去年就完成了全部服务的转移，但总体而言，大多数服务在今年才重新在新域名重新上线。</p><p>此外，我又购入了 <code>baka.ink</code> 作为 <a href="https://baka.ink/">Mastodon</a> 服务的主域名。</p><p>基本上变化不大，但 DNS 记录确实更多了。</p><h3 id="自托管"><a href="#自托管" class="headerlink" title="自托管"></a>自托管</h3><blockquote><p>数据应当掌握在自己手中。</p></blockquote><p>今年应该是我对于自托管和去中心化技术最感兴趣的一年。</p><p>几乎所有能够自托管的服务都被我选择了自托管，另外我也更乐意接受去中心化而不是中心化的平台。</p><h2 id="「朋友的」"><a href="#「朋友的」" class="headerlink" title="「朋友的」"></a>「朋友的」</h2><p>今年在很多平台都交了许多新朋友！</p><p>在这里写的话可能会影响阅读体验，所以就把他放在末尾的致谢吧！</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>尽管 2024 年确实有很多不如人意的事情，但总体还是在变好的嘛，总得向前看。</p><p>再见 2024，你好 2025。</p>    <div class="fold">      <div class="fold-title fold-info collapsed" data-toggle="collapse" href="#collapse-384b87d8" role="button" aria-expanded="false" aria-controls="collapse-384b87d8">        <div class="fold-arrow">▶</div>致谢      </div>      <div class="fold-collapse collapse" id="collapse-384b87d8">        <div class="fold-content">          <p>这里列出了今年的感谢的人和团体，友链部分则是致谢了博客至今的所有友链，部分可能存在遗漏。</p><p>没有你们的支持，我不可能走到现在！</p><h3 id="三次元"><a href="#三次元" class="headerlink" title="三次元"></a>三次元</h3><p>我的父母，家人，还有几位同学！</p><p>出于安全原因，这里就不写他们的名字了，但今年同样十分感谢你们！</p><p>如果你感觉我说的是你，那么我感谢的就是你！</p><h3 id="群聊和频道"><a href="#群聊和频道" class="headerlink" title="群聊和频道"></a>群聊和频道</h3><ul><li>戦姫絶唱 ! シンフォギア</li><li>烟墨の闲聊组</li><li>已废弃的内部网络交流</li><li>PCL2 x2</li><li>三月七研究院</li><li>思遥方的小家</li><li>欢愉令使交流群</li><li>每日沙雕墙</li><li>笨蛋三月七的日常</li><li>笨蛋三月七的 Chat Room</li><li>璃夜的频道｜DC1｜看此频道吃饭无需加🍬</li><li>小金有点神兹乌兹</li></ul><h3 id="网站友链"><a href="#网站友链" class="headerlink" title="网站友链"></a>网站友链</h3><ul><li><a href="https://www.233355607.xyz/">23335507的生草小站</a></li><li><a href="https://www.xiexilin.com/">XieXiLin 的小站</a></li><li><a href="https://ymbit.cn/">Yanmo Blog</a></li><li><a href="https://about.qilunuo.cloud/">Bakabaka_9</a></li><li><a href="https://rong6.cn/">荣6的博客</a></li><li><a href="https://blog.yisrime.xyz/">湙凇の一隅之地</a></li><li><a href="https://blog.1kyr.top/">思遥方的小家</a></li><li><a href="https://lihaoyu.cn/">晓雨杂记</a></li><li><a href="https://www.mailset.top/">mail_set 的铺子</a></li><li><a href="https://ick.moe/">IcyBlog</a></li><li><a href="https://1l1.icu/">夏沫花火zzz🌙 (Muska_Ami)のLife</a></li><li><a href="https://wynnzeng.tech/">Wynn Zeng</a></li><li><a href="https://www.akio.top/">御坂秋生の小窝</a></li><li><a href="https://koto.cc/">koto’s site</a></li><li><a href="https://blog.csv.kim/">PHの博客</a></li><li><a href="https://blog.sdbit.net.cn/">沙雕的Blog</a></li><li><a href="http://khyan.top/">Clover Yan 的小屋</a></li><li><a href="https://rainsky.xyz/">随笔空雨</a></li><li><a href="https://certstone.top/">确石如此</a></li><li><a href="https://alikia2x.com/">寒寒</a></li><li><a href="https://www.gxres.net/">Restent Ou</a></li><li><a href="https://cynosura.one/">Cynosura</a></li><li><a href="http://worable.cncloud.cloud/">worable’s blog</a></li></ul>        </div>      </div>    </div>]]></content>
    
    
    <summary type="html">&lt;p&gt;2024 年，有了一些不一样的。&lt;/p&gt;</summary>
    
    
    
    <category term="博客" scheme="https://blog.byteloid.one/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="2024" scheme="https://blog.byteloid.one/tags/2024/"/>
    
    <category term="年度总结" scheme="https://blog.byteloid.one/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
    <category term="Blog" scheme="https://blog.byteloid.one/tags/Blog/"/>
    
  </entry>
  
  <entry>
    <title>Mastodon 进阶搭建教程（二）：全文搜索与 Cloudflare Tunnel</title>
    <link href="https://blog.byteloid.one/2024/12/27/mastodon%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86/"/>
    <id>https://blog.byteloid.one/2024/12/27/mastodon%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86/</id>
    <published>2024-12-27T16:14:36.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>开启 Mastodon 的搜索功能，以及结合 Cloudflare CDN 与 Tunnel 保护源服务器。</p><span id="more"></span><h1 id="开启搜索功能"><a href="#开启搜索功能" class="headerlink" title="开启搜索功能"></a>开启搜索功能</h1><p>修改 <code>docker-compose.yml</code>，修改以下被注释的地方：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><code class="hljs docker-compose.yml">es:<br>  restart: always<br>  image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4<br>  environment:<br>    - &quot;ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true&quot;<br>    - &quot;xpack.license.self_generated.type=basic&quot;<br>    - &quot;xpack.security.enabled=false&quot;<br>    - &quot;xpack.watcher.enabled=false&quot;<br>    - &quot;xpack.graph.enabled=false&quot;<br>    - &quot;xpack.ml.enabled=false&quot;<br>    - &quot;bootstrap.memory_lock=true&quot;<br>    - &quot;cluster.name=es-mastodon&quot;<br>    - &quot;discovery.type=single-node&quot;<br>    - &quot;thread_pool.write.queue_size=1000&quot;<br>  networks:<br>     - external_network<br>     - internal_network<br>  healthcheck:<br>     test: [&quot;CMD-SHELL&quot;, &quot;curl --silent --fail localhost:9200/_cluster/health || exit 1&quot;]<br>  volumes:<br>     - ./elasticsearch:/usr/share/elasticsearch/data<br>  ulimits:<br>    memlock:<br>      soft: -1<br>      hard: -1<br>    nofile:<br>      soft: 65536<br>      hard: 65536<br>  ports:<br>    - &#x27;127.0.0.1:9200:9200&#x27;<br></code></pre></td></tr></table></figure><p>编辑 <code>.env.production</code>，在最后加上：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs .env.production">ES_ENABLED=true<br>ES_HOST=es<br>ES_PORT=9200<br></code></pre></td></tr></table></figure><p>重启 Docker 实例：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker-compose down<br>docker-compose up -d<br></code></pre></td></tr></table></figure><p>出现 <code>elasticsearch</code> 文件夹后，赋权：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">chown 1000:1000 -R elasticsearch<br></code></pre></td></tr></table></figure><p>再次重启：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker-compose down<br>docker-compose up -d<br></code></pre></td></tr></table></figure><p>建立搜索索引：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker-compose run --rm web bin/tootctl search deploy<br></code></pre></td></tr></table></figure><h2 id="可能遇到的问题"><a href="#可能遇到的问题" class="headerlink" title="可能遇到的问题"></a>可能遇到的问题</h2><h3 id="虚拟内存问题"><a href="#虚拟内存问题" class="headerlink" title="虚拟内存问题"></a>虚拟内存问题</h3><p>部分错误信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs log">max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]<br></code></pre></td></tr></table></figure><p>查询资料后发现是由于虚拟内存导致的，<a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.0/vm-max-map-count.html#vm-max-map-count">参见文档</a>。</p><p>解决方法是在宿主机执行以下指令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">echo &quot;vm.max_map_count=262144&quot; &gt;&gt; /etc/sysctl.conf<br>sysctl -w vm.max_map_count=262144<br></code></pre></td></tr></table></figure><h3 id="Java-内存分配问题"><a href="#Java-内存分配问题" class="headerlink" title="Java 内存分配问题"></a>Java 内存分配问题</h3><p>示例错误信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs log">initial heap size [134217728] not equal to maximum heap size [536870912]; this can cause resize pauses and prevents mlockall from locking the entire heap<br></code></pre></td></tr></table></figure><p>打开 <code>docker-compose.yml</code>，修改以下行的 <code>Xms</code> 和 <code>Xmx</code> 为同一数值：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs docker-compose.yml">es:<br>  restart: always<br>  image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4<br>  environment:<br>    - &quot;ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true&quot;<br>......<br></code></pre></td></tr></table></figure><h1 id="设置-Cloudflare-防护"><a href="#设置-Cloudflare-防护" class="headerlink" title="设置 Cloudflare 防护"></a>设置 Cloudflare 防护</h1><h2 id="基本：使用-Cloudflare-CDN-保护原站"><a href="#基本：使用-Cloudflare-CDN-保护原站" class="headerlink" title="基本：使用 Cloudflare CDN 保护原站"></a>基本：使用 Cloudflare CDN 保护原站</h2><p>很简单，把 Cloudflare 的小云朵打开就行。</p><h2 id="进阶：使用-Cloudflare-Tunnel-保护原站"><a href="#进阶：使用-Cloudflare-Tunnel-保护原站" class="headerlink" title="进阶：使用 Cloudflare Tunnel 保护原站"></a>进阶：使用 Cloudflare Tunnel 保护原站</h2><p>修改 <code>docker-compose.yml</code>，在 <code>service</code> 项最下面加上：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs docker-compose.yml">services:<br>......<br>  tunnel:<br>    image: cloudflare/cloudflared<br>    restart: always<br>    command: tunnel --no-autoupdate run --token &lt;token&gt;<br>    depends_on:<br>      - mastodon-web<br>    networks:<br>      - mastodon-network<br>......<br></code></pre></td></tr></table></figure><p>打开 Cloudflare One 面板，找到你的 Tunnel，添加以下两个<strong>公共主机名</strong>：</p><ul><li>域为你部署 Mastodon 的域，类型选择 HTTP，URL 填写 <code>mastodon-web:3000</code>，HTTP 设置中设置 HTTP 主机头为你的域。</li><li>域为你部署 Mastodon 的域，路径填写 <code>api/v1/streaming</code>，类型选择 HTTP，URL 填写 <code>mastodon-streaming:4000</code>，HTTP 设置中设置 HTTP 主机头为你的域。</li></ul><p>然后将服务为 <code>http://mastodon-streaming:4000</code> 的移到最上面，因为 公共主机名 是有顺序的。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;开启 Mastodon 的搜索功能，以及结合 Cloudflare CDN 与 Tunnel 保护源服务器。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Cloudflare" scheme="https://blog.byteloid.one/tags/Cloudflare/"/>
    
    <category term="Mastodon" scheme="https://blog.byteloid.one/tags/Mastodon/"/>
    
  </entry>
  
  <entry>
    <title>使用 Github Action 自动化部署 Hexo 博客</title>
    <link href="https://blog.byteloid.one/2024/11/16/%E4%BD%BF%E7%94%A8%20Github%20Action%20%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%20Hexo%20%E5%8D%9A%E5%AE%A2/"/>
    <id>https://blog.byteloid.one/2024/11/16/%E4%BD%BF%E7%94%A8%20Github%20Action%20%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%20Hexo%20%E5%8D%9A%E5%AE%A2/</id>
    <published>2024-11-16T17:24:13.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>恰巧发现我的博客是基于我自己写的 Action 流部署后推送到另一个仓库的，虽然现在已经有了更好的替代品，但还是分享出来作为参考。</p><span id="more"></span><h1 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h1><h2 id="建立新仓库"><a href="#建立新仓库" class="headerlink" title="建立新仓库"></a>建立新仓库</h2><p>额外建立一个 Github 仓库，用来存放生成的静态资源。</p><h2 id="生成-Github-Token"><a href="#生成-Github-Token" class="headerlink" title="生成 Github Token"></a>生成 Github Token</h2><p>打开我们自己的 <strong>Github Settings</strong>，选择 <strong>Developer settings</strong> –&gt; <strong>Personal access tokens</strong>。</p><p>生成的 Token 确保要给 <strong>repo</strong> 和 <strong>action</strong> 的读&#x2F;写权限。</p><h2 id="填入-Github-Token"><a href="#填入-Github-Token" class="headerlink" title="填入 Github Token"></a>填入 Github Token</h2><p>在博客源代码仓库里转到 <strong>Settings</strong>，点击 <strong>Secrets and variables</strong> –&gt; <strong>Actions</strong> –&gt; <strong>Secrets</strong>。</p><p>新建 Secrets，命名为 HEXO_DEPLOY，内容填入上一步获取的 Token。</p><h1 id="编写-Workflows"><a href="#编写-Workflows" class="headerlink" title="编写 Workflows"></a>编写 Workflows</h1><p>往仓库的 <code>.github/workflows/deploy.yml</code> 写入以下内容，部分按照你的实际情况修改：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">name:</span> <span class="hljs-string">deploying</span> <span class="hljs-string">Hexo</span> <span class="hljs-string">project</span> <span class="hljs-string">to</span> <span class="hljs-string">GitHub</span> <span class="hljs-string">pages</span><br><span class="hljs-attr">on:</span><br>  <span class="hljs-attr">push:</span><br>    <span class="hljs-attr">branches:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">main</span> <span class="hljs-comment"># master 分支有 push 行为时就触发这个 action</span><br><br><span class="hljs-attr">jobs:</span><br>  <span class="hljs-attr">build-and-deploy:</span><br>    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span><br>    <span class="hljs-attr">steps:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span><br>        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@master</span><br><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">Deploy</span><br>        <span class="hljs-attr">uses:</span> <span class="hljs-string">theme-keep/hexo-deploy-github-pages-action@master</span> <span class="hljs-comment"># 使用专门部署 Hexo 到 GitHub pages 的 action</span><br>        <span class="hljs-attr">env:</span><br>          <span class="hljs-attr">PERSONAL_TOKEN:</span> <span class="hljs-string">$&#123;&#123;</span> <span class="hljs-string">secrets.HEXO_DEPLOY</span> <span class="hljs-string">&#125;&#125;</span> <span class="hljs-comment"># secret 名</span><br>          <span class="hljs-attr">PUBLISH_REPOSITORY:</span> <span class="hljs-string">YOUR_USER_NAME/YOUR_DIST</span> <span class="hljs-comment"># 公共仓库，格式：GitHub 用户名/仓库名</span><br>          <span class="hljs-attr">BRANCH:</span> <span class="hljs-string">gh-pages</span> <span class="hljs-comment"># 分支，填 gh-pages 就行</span><br>          <span class="hljs-attr">PUBLISH_DIR:</span> <span class="hljs-string">./public</span> <span class="hljs-comment"># 部署 public 目录下的文件</span><br></code></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>如果不出意外的话，已经可以正常工作了！</p><p>试试提交一次新 commit，如果顺利的话，那么 Actions 会自动运行。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;恰巧发现我的博客是基于我自己写的 Action 流部署后推送到另一个仓库的，虽然现在已经有了更好的替代品，但还是分享出来作为参考。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Github" scheme="https://blog.byteloid.one/tags/Github/"/>
    
    <category term="Github Action" scheme="https://blog.byteloid.one/tags/Github-Action/"/>
    
    <category term="Hexo" scheme="https://blog.byteloid.one/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Mastodon 快速搭建教程（一）</title>
    <link href="https://blog.byteloid.one/2024/11/01/docker%E9%83%A8%E7%BD%B2mastodon/"/>
    <id>https://blog.byteloid.one/2024/11/01/docker%E9%83%A8%E7%BD%B2mastodon/</id>
    <published>2024-11-01T17:57:38.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>X(Twitter) 最近公布的新政策让我逐步迁移到了其他社交平台，恰巧在朋友那里了解到了 Mastodon 这个去中心化的社交平台，于是决定自建一个。</p><span id="more"></span><p>我一开始打算是直接从源码构建部署，但后来发现太麻烦且不方便维护，于是选择了使用 Docker Compose 快速部署。</p><h1 id="0-前期准备"><a href="#0-前期准备" class="headerlink" title="0.前期准备"></a>0.前期准备</h1><ul><li>一台性能过得去的服务器</li><li>安装了 Docker 和 Docker-Compose</li><li>(可选，推荐) 提前配置 Postgres 数据库</li><li>(可选) 提前配置 Redis</li></ul><h1 id="1-获取和配置-Mastodon"><a href="#1-获取和配置-Mastodon" class="headerlink" title="1.获取和配置 Mastodon"></a>1.获取和配置 Mastodon</h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">mkdir mastodon<br>cd mastodon<br>wget https://raw.githubusercontent.com/mastodon/mastodon/refs/heads/main/docker-compose.yml<br></code></pre></td></tr></table></figure><p>然后打开 <code>docker-compose.yml</code> 文件，主要修改以下部分：</p><ul><li>修改 <code>image: ghcr.io/mastodon/mastodon:</code> 后面的版本号，改为 <code>latest</code> 或是你想要的版本即可</li><li><strong>4.3.0 的镜像可能存在部署问题，建议使用 4.3.1 的镜像（站长亲自踩坑）</strong></li><li>如果你已经有了自建的 Postgres 和 Redis 实例，那么请注释掉 <code>db</code> 和 <code>redis</code> 部分</li><li>剩下的可以根据自身情况修改 (比如我就删掉了 <code>internal_network</code>)</li></ul><p>然后执行：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs shell">touch .env.production<br>docker-compose run --rm web bundle exec rake mastodon:setup<br></code></pre></td></tr></table></figure><p>接着会进入到配置生成流程，</p><p>如果你没有把 Postgres 和 Redis 分离部署，则PostgreSQL的默认用户名是postgres，密码直接回车，Redis 部分直接回车。</p><p>否则请根据你实际情况填写。</p><p>邮件服务器 SMTP 请根据实际情况填写。</p><p>流程参考如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><code class="hljs shell">[+] Creating 2/0<br> ✔ Container mastodon-db-1     Running                                                                                   0.0s <br> ✔ Container mastodon-redis-1  Running                                                                                   0.0s <br>Your instance is identified by its domain name. Changing it afterward will break things.<br>Domain name: baka.ink<br><br>Single user mode disables registrations and redirects the landing page to your public profile.<br>Do you want to enable single user mode? yes<br><br>Are you using Docker to run Mastodon? Yes<br><br>PostgreSQL host: db<br>PostgreSQL port: 5432<br>Name of PostgreSQL database: postgres<br>Name of PostgreSQL user: postgres<br>Password of PostgreSQL user: <br>Database configuration works! 🎆<br><br>Redis host: redis<br>Redis port: 6379<br>Redis password: <br>Redis configuration works! 🎆<br><br>Do you want to store uploaded files on the cloud? No<br><br>Do you want to send e-mails from localhost? No<br>SMTP server: smtp.example.com<br>SMTP port: 587<br>SMTP username: Admin<br>SMTP password: 123456<br>SMTP authentication: plain<br>SMTP OpenSSL verify mode: peer<br>Enable STARTTLS: always<br>E-mail address to send e-mails &quot;from&quot;: Mastodon &lt;notifications@baka.ink&gt;<br>Send a test e-mail with this configuration right now? no<br><br>Do you want Mastodon to periodically check for important updates and notify you? (Recommended) Yes<br><br>This configuration will be written to .env.production<br>Save configuration? Yes<br>Below is your configuration, save it to an .env.production file outside Docker:<br></code></pre></td></tr></table></figure><p>配置文件可能会自动写入到 <code>.env.production</code>，但也可能不会写，因此请手动编辑 <code>.env.production</code> 写入输出的配置。</p><h1 id="2-运行-Mastodon"><a href="#2-运行-Mastodon" class="headerlink" title="2.运行 Mastodon"></a>2.运行 Mastodon</h1><p>启动 Mastodon：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker-compose up -d<br></code></pre></td></tr></table></figure><p>为相应文件夹赋权：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs shell">chown 991:991 -R ./public<br>chown -R 70:70 ./postgres14<br>docker-compose down<br>docker-compose up -d<br></code></pre></td></tr></table></figure><h1 id="3-配置反向代理"><a href="#3-配置反向代理" class="headerlink" title="3.配置反向代理"></a>3.配置反向代理</h1><p>如果你使用的是 Nginx，请直接参考官方配置 <a href="https://github.com/mastodon/mastodon/blob/main/dist/nginx.conf">Github</a>，需要把所有的 <code>try_files $uri =404;</code> 替换为 <code>try_files $uri @proxy</code>。</p><p>如果你使用的是 OpenResty，则可以参考我的配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><code class="hljs conf">map $http_upgrade $connection_upgrade &#123;<br>  default upgrade;<br>  &#x27;&#x27;      close;<br>&#125;<br><br>upstream backend &#123;<br>    server 127.0.0.1:3000 fail_timeout=0;<br>&#125;<br><br>upstream streaming &#123;<br>    # Instruct nginx to send connections to the server with the least number of connections<br>    # to ensure load is distributed evenly.<br>    least_conn;<br><br>    server 127.0.0.1:4000 fail_timeout=0;<br>    # Uncomment these lines for load-balancing multiple instances of streaming for scaling,<br>    # this assumes your running the streaming server on ports 4000, 4001, and 4002:<br>    # server 127.0.0.1:4001 fail_timeout=0;<br>    # server 127.0.0.1:4002 fail_timeout=0;<br>&#125;<br><br>proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;<br><br>server &#123;<br>  listen 80;<br>  listen [::]:80;<br>  server_name baka.ink *.baka.ink; # 修改成你自己的网站<br>  root /root/mastodon/public; # May Change<br>  location /.well-known/acme-challenge/ &#123; allow all; &#125;<br>  location / &#123; return 301 https://$host$request_uri; &#125;<br>&#125;<br><br><br>server &#123;<br>  listen 443 ssl http2;<br>  listen [::]:443 ssl http2;<br>  server_name baka.ink *.baka.ink; # 修改成你自己的网站<br>  ssl_certificate /www/sites/baka.ink/ssl/fullchain.pem;  # 修改成你自己的网站 SSL<br>  ssl_certificate_key /www/sites/baka.ink/ssl/privkey.pem; # 修改成你自己的网站 SSL<br>  ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; <br>  ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; <br>  ssl_prefer_server_ciphers on; <br>  ssl_session_cache shared:SSL:10m; <br>  ssl_session_timeout 10m; <br><br>  keepalive_timeout    70;<br>  sendfile             on;<br>  client_max_body_size 99m;<br><br>  root /root/mastodon/public; # May Change<br><br>  gzip on;<br>  gzip_disable &quot;msie6&quot;;<br>  gzip_vary on;<br>  gzip_proxied any;<br>  gzip_comp_level 6;<br>  gzip_buffers 16 8k;<br>  gzip_http_version 1.1;<br>  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon;<br><br>  location / &#123;<br>    try_files $uri @proxy;<br>    add_header Access-Control-Allow-Origin *;<br>    add_header Access-Control-Allow-Methods &#x27;GET, POST, OPTIONS&#x27;;<br>    add_header Access-Control-Allow-Headers &#x27;DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization&#x27;;<br>        <br>    if ($request_method = &#x27;OPTIONS&#x27;) &#123;<br>         return 204;<br>    &#125;<br>  &#125;<br><br><br>  # If Docker is used for deployment and Rails serves static files,<br>  # then needed must replace line `try_files $uri @proxy;` with `try_files $uri @proxy;`<br><br>  location ~ ^/assets/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/avatars/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/emoji/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/headers/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/packs/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/shortcuts/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/sounds/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, must-revalidate&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ~ ^/system/ &#123;<br>    add_header Cache-Control &quot;public, max-age=2419200, immutable&quot;;<br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br>    add_header X-Content-Type-Options nosniff;<br>    add_header Content-Security-Policy &quot;default-src &#x27;none&#x27;; form-action &#x27;none&#x27;&quot;;<br>    try_files $uri @proxy;<br>  &#125;<br><br>  location ^~ /api/v1/streaming &#123;<br>    proxy_set_header Host $host;<br>    proxy_set_header X-Real-IP $remote_addr;<br>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>    proxy_set_header X-Forwarded-Proto $scheme;<br>    proxy_set_header Proxy &quot;&quot;;<br><br>    proxy_pass http://streaming;<br>    proxy_buffering off;<br>    proxy_redirect off;<br>    proxy_http_version 1.1;<br>    proxy_set_header Upgrade $http_upgrade;<br>    proxy_set_header Connection $connection_upgrade;<br><br>    add_header Strict-Transport-Security &quot;max-age=63072000; includeSubDomains&quot;;<br><br>    tcp_nodelay on;<br>  &#125;<br><br>  location @proxy &#123;<br>    proxy_set_header Host $host;<br>    proxy_set_header X-Real-IP $remote_addr;<br>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>    proxy_set_header X-Forwarded-Proto $scheme;<br>    proxy_set_header Proxy &quot;&quot;;<br>    proxy_pass_header Server;<br><br>    proxy_pass http://backend;<br>    proxy_buffering on;<br>    proxy_redirect off;<br>    proxy_http_version 1.1;<br>    proxy_set_header Upgrade $http_upgrade;<br>    proxy_set_header Connection $connection_upgrade;<br><br>    proxy_cache CACHE;<br>    proxy_cache_valid 200 7d;<br>    proxy_cache_valid 410 24h;<br>    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;<br>    add_header X-Cached $upstream_cache_status;<br><br>    tcp_nodelay on;<br>  &#125;<br>  error_page 404 500 501 502 503 504 /500.html;<br>&#125;<br></code></pre></td></tr></table></figure><p>如果你的 OpenResty 跑在 Docker 里，别忘了把主机中 <code>Your_Path/mastodon/public</code> 映射到容器的 <code>/root/mastodon/public</code> 或是其他地方，<strong>并一并修改配置文件</strong>。</p><h1 id="4-其他"><a href="#4-其他" class="headerlink" title="4.其他"></a>4.其他</h1><p>上面步骤应该能完成全部配置，如果你遇到问题不妨在评论区交流。</p><h1 id="5-参考资料"><a href="#5-参考资料" class="headerlink" title="5.参考资料"></a>5.参考资料</h1><ul><li><a href="https://blog.tantalum.life/posts/how-to-run-your-mastodon-by-docker/">Mastodon | 采用docker建站后的使用与维护 – Zoe’s Dumpster.</a></li><li><a href="https://pullopen.github.io/%E5%9F%BA%E7%A1%80%E6%90%AD%E5%BB%BA/2020/10/19/Mastodon-on-Docker.html">如何利用Docker搭建Mastodon实例（一）：基础搭建篇 - 技术小白搭建Mastodon站点指南</a></li><li><a href="https://blog.abyss.moe/posts/Mastodon-Docker-Setup/#%E9%85%8D%E7%BD%AE-Nginx">用 Docker 搭建 Mastodon 实例 | 雨き声残響</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;X(Twitter) 最近公布的新政策让我逐步迁移到了其他社交平台，恰巧在朋友那里了解到了 Mastodon 这个去中心化的社交平台，于是决定自建一个。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Docker" scheme="https://blog.byteloid.one/tags/Docker/"/>
    
    <category term="Mastodon" scheme="https://blog.byteloid.one/tags/Mastodon/"/>
    
  </entry>
  
  <entry>
    <title>使用 WireGuard + OSPF 快速组网</title>
    <link href="https://blog.byteloid.one/2024/10/19/%E4%BD%BF%E7%94%A8%20WireGuard%20+%20OSPF%20%E5%BF%AB%E9%80%9F%E7%BB%84%E7%BD%91/"/>
    <id>https://blog.byteloid.one/2024/10/19/%E4%BD%BF%E7%94%A8%20WireGuard%20+%20OSPF%20%E5%BF%AB%E9%80%9F%E7%BB%84%E7%BD%91/</id>
    <published>2024-10-19T08:28:37.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>折腾了半天，兜兜转转还是回到了 OSPF 组网，不过这次充分吸取了之前的教训，应该不会再出现意外了。</p><span id="more"></span><hr><div class="note note-warning">            <p><strong>内容过时 &#x2F; 错误警告</strong><br>这是我的早期技术文章，其中可能存在过时 &#x2F; 错误的内容，请谨慎参考。<br>此外，我更新了我的组网方式，使用了 Bird2 + WireGuard + Babeld(Bird2) 的方式来组网，具体可以参考 <a href="/2025/06/02/babeld-over-wireguard/">使用 WireGuard + Babald(Bird2) 快速组网 - Bingxin Blog</a>。</p>          </div> <h1 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h1><h2 id="非常重要的系统设置"><a href="#非常重要的系统设置" class="headerlink" title="非常重要的系统设置"></a>非常重要的系统设置</h2><ul><li>首先，<strong>千万 一定 绝对</strong> 要打开 Linux 内核的数据包转发功能，即 ip_forwarding</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs shell">echo &quot;net.ipv4.ip_forward=1&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv6.conf.default.forwarding=1&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv6.conf.all.forwarding=1&quot; &gt;&gt; /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><ul><li>然后，<strong>千万 一定 绝对</strong> 要关闭 Linux 内核 rp_filter 的严格模式</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">echo &quot;net.ipv4.conf.default.rp_filter=0&quot; &gt;&gt; /etc/sysctl.conf<br>echo &quot;net.ipv4.conf.all.rp_filter=0&quot; &gt;&gt; /etc/sysctl.conf<br>sysctl -p<br></code></pre></td></tr></table></figure><ul><li>最后，检查一下自己的系统是不是<strong>预装</strong>了 <code>iptables</code>，我自己就因为这个问题翻过车，如果没有装上，请自行安装。</li></ul><h2 id="软件前期安装"><a href="#软件前期安装" class="headerlink" title="软件前期安装"></a>软件前期安装</h2><p>必装：<code>bird2</code>、<code>wireguard</code></p><p>强烈建议：<code>wireguard-tools</code>，装上这个才能愉快的用 <code>wg-quick</code>，如果你的系统不支持（如 OpenWrt），请自行抉择。</p><p>可选：其他组网软件（如 <code>zerotier</code>）</p><h1 id="内网组网"><a href="#内网组网" class="headerlink" title="内网组网"></a>内网组网</h1><h2 id="WireGuard-VPN"><a href="#WireGuard-VPN" class="headerlink" title="WireGuard VPN"></a>WireGuard VPN</h2><p>把你需要配置的服务器通过 WireGuard 直接或间接的连接到一起。</p><p>你可以参考我的 WireGuard 配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs conf">[Interface]<br>PrivateKey = &lt;PrivateKey&gt;<br>ListenPort = &lt;Ports&gt;<br>Table = off # 非常重要！<br>PostUp = ip addr add &lt;YourIP&gt; peer &lt;PeerIP&gt; dev %i<br><br>[Peer]<br>PublicKey = &lt;Peer_PublicKey&gt;<br>Endpoint = &lt;Peer_Endpoint&gt;<br>AllowedIPs = 0.0.0.0/0,::/0<br>PersistentKeepalive = 25<br></code></pre></td></tr></table></figure><h2 id="Zerotier（可选）"><a href="#Zerotier（可选）" class="headerlink" title="Zerotier（可选）"></a>Zerotier（可选）</h2><p>把你需要配置的服务器通过 Zerotier 组成 Full Mesh 网络。</p><h1 id="配置-Bird"><a href="#配置-Bird" class="headerlink" title="配置 Bird"></a>配置 Bird</h1><p>为了方便管理，这里主要把 bird.conf 作为入口文件，然后逐一细分到其他配置文件。</p><h2 id="bird-conf"><a href="#bird-conf" class="headerlink" title="bird.conf"></a>bird.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><code class="hljs conf">################################################<br>#               Variable header                #<br>################################################<br><br>define OWNAS =  4237377373; # change it<br>define OWNIP =  10.50.211.1; # change it<br><br>################################################<br>#                 Header end                   #<br>################################################<br><br>log syslog all;<br>debug protocols all;<br><br>router id OWNIP;<br><br>protocol device&#123;<br>  scan time 10;<br>&#125;<br><br>protocol kernel&#123;<br>    ipv4 &#123;<br>        import none;<br>        export all;<br>    &#125;;<br>&#125;<br><br>protocol bfd&#123;<br>&#125;<br><br>ipv4 table OSPF_table;<br>ipv4 table BGP_table;<br><br>roa4 table roa4_fwnet;<br>roa6 table roa6_fwnet;<br><br>protocol rpki rpki_fwnet &#123;<br>        roa4 &#123; table roa4_fwnet; &#125;;<br>        roa6 &#123; table roa6_fwnet; &#125;;<br>        remote &quot;example.com&quot; port 8237; # change it<br>        refresh 30;<br>        retry 5;<br>        expire 600;<br>&#125;<br><br>include &quot;/etc/bird/ospf.conf&quot;;<br>include &quot;/etc/bird/bgp.conf&quot;;<br>include &quot;/etc/bird/ibgp.conf&quot;;<br><br>protocol pipe pipe_ospf_table&#123;<br>    table master4;<br>    peer table OSPF_table;<br>    import filter &#123;<br>        krt_prefsrc=OWNIP;<br>        accept;<br>    &#125;;<br>    export none;<br>&#125;<br><br>protocol pipe pipe_bgp_table &#123;<br>    table master4;<br>    peer table BGP_table;<br>    import filter &#123;<br>        if source != RTS_BGP then reject;<br>        krt_prefsrc=OWNIP;<br>        accept;<br>    &#125;;<br>    export none;<br>&#125;<br><br>include &quot;/etc/bird/peers/*&quot;;<br>include &quot;/etc/bird/bxnets/*&quot;;<br></code></pre></td></tr></table></figure><p>简单介绍一下：</p><ul><li>一开始先是定义了我们内网的 IP 和 ASN</li><li>然后是 ROA 这里，这里我引入了一个 RPKI，你应该根据自己的需要修改</li><li>中间使用了三个 <code>include</code>，这里是引用了三个文件，即一会 OSPF、IBGP、EBGP 都会在这三个文件内实现</li><li>最后的两个 <code>include</code> 则是引用了我分别放 EBGP 和 IBGP Peer 文件的地方</li></ul><h2 id="ospf-conf"><a href="#ospf-conf" class="headerlink" title="ospf.conf"></a>ospf.conf</h2><p>下面使用 OSPF 来确保 AS 内部的连通性</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs conf">protocol ospf v2 bxnets &#123;<br>        ipv4 &#123;<br>                table OSPF_table;<br>                export all;<br>                import all;<br>        &#125;;<br>        area 0.0.0.0 &#123;<br>                # change it<br>                interface &quot;wg-*&quot; &#123;<br>                        cost 5;<br>                        type ptp;<br>                &#125;;<br>                # change it<br>                interface &quot;zt*&quot; &#123;<br>                        cost 7;<br>                &#125;;<br>                # may change it<br>                interface &quot;lo&quot; &#123;<br>                        type bcast;<br>                &#125;;<br>                <br>        &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><p>同时手动在 lo 接口配置一个 ip 并通过广播 lo 接口的 ip 的方式把你的设备广播在你的 OSPF 里。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">ip addr add 10.50.211.1 dev lo<br></code></pre></td></tr></table></figure><p>为了让这个添加到 lo 的 ip 永久生效，你需要看看你的系统下的网络是怎么管理的。</p><p>下面分别展示 netplan 和 interfaces 的配置方法：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs conf"># netplan<br>network:<br>  ethernets:<br>    lo:<br>      addresses: [10.50.211.1/32]<br>  version: 2<br></code></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs conf"># interfaces<br>auto lo<br>iface lo inet loopback<br>    dns-nameservers 114.114.114.114 2400:3200::1<br>    dns-search inwang.net<br><br>iface lo inet static<br>    address 10.50.211.1<br>    netmask 255.255.255.255<br></code></pre></td></tr></table></figure><p>ospf 的 cost 随你喜欢，我个人一般综合判断带宽和延时决定大概给多少 cost。</p><p>如果你在调试 bird 的时候发现日志里有提到 MTU 问题，请添加 <code>MTU = 1420</code> 在两边的 <code>[Interface]</code> 下。还是有问题的话尝试继续减小 MTU。</p><h2 id="ibgp-conf"><a href="#ibgp-conf" class="headerlink" title="ibgp.conf"></a>ibgp.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs conf">template bgp bxnet &#123;<br>    local as OWNAS;<br>    source address OWNIP;<br>    ipv4 &#123;<br>        next hop self;<br>        igp table OSPF_table;<br>        table BGP_table;<br>        import all;<br>        export filter &#123;<br>            if source = RTS_STATIC then reject;<br>            accept;<br>        &#125;;<br>    &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="bgp-conf"><a href="#bgp-conf" class="headerlink" title="bgp.conf"></a>bgp.conf</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs conf">protocol static &#123;<br>    ipv4 &#123;<br>        table BGP_table;<br>        import all;<br>        export none;<br>    &#125;;<br>    # change it<br>    route 10.50.211.0/24 reject;<br>&#125;<br><br>template bgp fwnet &#123;<br>    local OWNIP as OWNAS;<br>    ipv4 &#123;<br>        table BGP_table;<br>        import filter &#123;<br>            if (roa_check(roa4_fwnet, net, bgp_path.last) != ROA_VALID) then &#123;<br>              print &quot;[fwnet] ROA check failed for &quot;, net, &quot; ASN &quot;, bgp_path.last;<br>              reject;<br>            &#125; else accept;<br>        &#125;;<br>        export filter &#123;<br>            if source ~ [RTS_STATIC, RTS_BGP] then accept;<br>            reject;<br>        &#125;;<br>    &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><p>这里的过滤器引入了之前提到过的 ROA，如果你用不上应该自行删除。</p><h1 id="继续增加节点"><a href="#继续增加节点" class="headerlink" title="继续增加节点"></a>继续增加节点</h1><p>这里涉及三个协议，OSPF IBGP EBGP。</p><p>对于 OSPF 增加节点只要有一条隧道通上就好了，不过有条件的还是做 WireGuard Fullmesh，这会大幅度提升你的网络稳定性。</p><p>EBGP 照样配就是，尽可能就近 peer。</p><p>IBGP，你每增加一个节点，这个节点要和现存的所有节点 peer，也就是说 IBGP 需要 fullmesh。</p><h1 id="疑难解答"><a href="#疑难解答" class="headerlink" title="疑难解答"></a>疑难解答</h1><h2 id="OSPF-没连上"><a href="#OSPF-没连上" class="headerlink" title="OSPF 没连上"></a>OSPF 没连上</h2><p><code>ip addr</code> 看看你的 wg 接口绑定了几个 IP 上去，多于一个那就重写 WireGuard 配置文件。如果你在 PostUp 里绑 IP 了那就不要 Address 字段了。</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a href="https://baimeow.cn/posts/dn11/configureibgp/">IBGP FullMesh 实现多节点自治域 | bs’ realm </a></p><p><a href="https://dn42.dev/howto/Bird2">Bird2 - DN42 Wiki</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;折腾了半天，兜兜转转还是回到了 OSPF 组网，不过这次充分吸取了之前的教训，应该不会再出现意外了。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="FWNET" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/FWNET/"/>
    
    
    <category term="服务器" scheme="https://blog.byteloid.one/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="异地组网" scheme="https://blog.byteloid.one/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    
    <category term="WireGuard" scheme="https://blog.byteloid.one/tags/WireGuard/"/>
    
    <category term="DN42" scheme="https://blog.byteloid.one/tags/DN42/"/>
    
    <category term="Zerotier" scheme="https://blog.byteloid.one/tags/Zerotier/"/>
    
    <category term="OSPF" scheme="https://blog.byteloid.one/tags/OSPF/"/>
    
  </entry>
  
  <entry>
    <title>使用 IPv6 连接到 Cloudflare Tunnel 的边缘节点</title>
    <link href="https://blog.byteloid.one/2024/09/28/%E4%BD%BF%E7%94%A8IPv6%E8%BF%9E%E6%8E%A5%E5%88%B0Cloudflare%20Tunnel%E7%9A%84%E8%BE%B9%E7%BC%98%E8%8A%82%E7%82%B9/"/>
    <id>https://blog.byteloid.one/2024/09/28/%E4%BD%BF%E7%94%A8IPv6%E8%BF%9E%E6%8E%A5%E5%88%B0Cloudflare%20Tunnel%E7%9A%84%E8%BE%B9%E7%BC%98%E8%8A%82%E7%82%B9/</id>
    <published>2024-09-28T13:51:47.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>这几天调试服务器，偶然发现国内的主要服务器被服务商给屏蔽了几乎所有的 IPv4 海外流量，但又有业务依赖 Cloudflare Tunnel 来实现，于是尝试强制连接到 Cloudflare Tunnel 的 IPv6 边缘节点来解决这一问题。</p><span id="more"></span><h1 id="1-正常安装-Cloudflare-Tunnel-服务"><a href="#1-正常安装-Cloudflare-Tunnel-服务" class="headerlink" title="1.正常安装 Cloudflare Tunnel 服务"></a>1.正常安装 Cloudflare Tunnel 服务</h1><p>这里只需要按照 Cloudflare 原本的教程进行安装就可以了。</p><p>如果你不幸在把 Cloudflare Tunnel 安装为服务时卡在了初始化，不必担心，按下 <code>Ctrl+C</code> 强制结束进程。</p><h1 id="2-修改-cloudflared-service"><a href="#2-修改-cloudflared-service" class="headerlink" title="2.修改 cloudflared.service"></a>2.修改 cloudflared.service</h1><p>使用你喜欢的文本编辑器打开 <code>/etc/systemd/system/cloudflared.service</code>，不出意外的话，它应该长下面这样：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs INI"><span class="hljs-section">[Unit]</span><br><span class="hljs-attr">Description</span>=cloudflared<br><span class="hljs-attr">After</span>=network-<span class="hljs-literal">on</span>line.target<br><span class="hljs-attr">Wants</span>=network-<span class="hljs-literal">on</span>line.target<br><br><span class="hljs-section">[Service]</span><br><span class="hljs-attr">TimeoutStartSec</span>=<span class="hljs-number">0</span><br><span class="hljs-attr">Type</span>=notify<br><span class="hljs-attr">ExecStart</span>=/usr/bin/cloudflared --<span class="hljs-literal">no</span>-autoupdate tunnel run --token &lt;TOKEN&gt;<br><span class="hljs-attr">Restart</span>=<span class="hljs-literal">on</span>-failure<br><span class="hljs-attr">RestartSec</span>=<span class="hljs-number">5</span>s<br><br><span class="hljs-section">[Install]</span><br><span class="hljs-attr">WantedBy</span>=multi-user.target<br></code></pre></td></tr></table></figure><p>我们修改 <code>ExecStart</code> 这一项，把它改成下面这个样子：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs INI"><span class="hljs-attr">ExecStart</span>=/usr/bin/cloudflared --<span class="hljs-literal">no</span>-autoupdate --edge-ip-version <span class="hljs-number">6</span> tunnel run --token &lt;TOKEN&gt;<br></code></pre></td></tr></table></figure><p>退出，保存。</p><h1 id="3-重启-Cloudflared"><a href="#3-重启-Cloudflared" class="headerlink" title="3.重启 Cloudflared"></a>3.重启 Cloudflared</h1><p>依次运行 <code>sudo systemctl daemon-reload</code>，<code>sudo systemctl restart cloudflared</code>。</p><p>不出意外，我们已经成功通过 IPv6 连接到 Cloudflare Tunnel 的边缘节点了。</p><p>你可以使用 <code>sudo systemctl status cloudflared</code> 看看服务状态。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;这几天调试服务器，偶然发现国内的主要服务器被服务商给屏蔽了几乎所有的 IPv4 海外流量，但又有业务依赖 Cloudflare Tunnel 来实现，于是尝试强制连接到 Cloudflare Tunnel 的 IPv6 边缘节点来解决这一问题。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Cloudflare" scheme="https://blog.byteloid.one/tags/Cloudflare/"/>
    
    <category term="服务器" scheme="https://blog.byteloid.one/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="IPv6" scheme="https://blog.byteloid.one/tags/IPv6/"/>
    
  </entry>
  
  <entry>
    <title>广发Lucky借记卡：好用，也许是不错的选择</title>
    <link href="https://blog.byteloid.one/2024/09/21/%E5%B9%BF%E5%8F%91Lucky%E5%80%9F%E8%AE%B0%E5%8D%A1%EF%BC%9A%E5%A5%BD%E7%94%A8%EF%BC%8C%E4%B9%9F%E8%AE%B8%E6%98%AF%E4%B8%8D%E9%94%99%E7%9A%84%E9%80%89%E6%8B%A9/"/>
    <id>https://blog.byteloid.one/2024/09/21/%E5%B9%BF%E5%8F%91Lucky%E5%80%9F%E8%AE%B0%E5%8D%A1%EF%BC%9A%E5%A5%BD%E7%94%A8%EF%BC%8C%E4%B9%9F%E8%AE%B8%E6%98%AF%E4%B8%8D%E9%94%99%E7%9A%84%E9%80%89%E6%8B%A9/</id>
    <published>2024-09-21T07:52:17.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>在<a href="https://blog.byteloid.one/2024/01/19/%E6%9C%AA%E6%88%90%E5%B9%B4%E7%94%B3%E8%AF%B7%E4%B8%AD%E4%BF%A1%E9%93%B6%E8%A1%8CVisa%E5%92%8CMasterCard%E5%80%9F%E8%AE%B0%E5%8D%A1/">之前的文章里</a>，我曾经向各位介绍过 Visa 和 MasterCard 的借记卡，但其实国内还有 AMEX 发行的借记卡，趁着刚激活完没多久来给各位介绍下。</p><span id="more"></span><hr><h1 id="0-为什么是AMEX（美国运通）"><a href="#0-为什么是AMEX（美国运通）" class="headerlink" title="0.为什么是AMEX（美国运通）"></a>0.为什么是AMEX（美国运通）</h1><h2 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h2><p>AMEX（美国运通）相比于 Visa 和 MasterCard 在国内的最大优势就是其持有<strong>人民币结算牌照</strong>，这意味着持有该卡你可以直接用<strong>人民币</strong>来进行海外付款，省去了较为麻烦的 购汇-转账 流程。</p><p>这也意味着，你可以<strong>无障碍</strong>将其绑定到微信和支付宝等平台（只要平台支持），且微信和支付宝可以直接将零钱提现至卡内进行海外消费，<strong>无需像 Visa 和 MasterCard 卡一样要在手机银行上转账</strong>。</p><h2 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h2><p>AMEX 在国际上不像 Visa 和 MasterCard 那样通用。</p><p>AMEX 没有 3DS，这意味着盗刷的风险会显著提高。</p><p>据传 跨境支付 时会预冻结 150%（120%），博主由于一些原因无法开通网银，无法核实这条消息。</p><h1 id="1-申请及一些注意事项"><a href="#1-申请及一些注意事项" class="headerlink" title="1.申请及一些注意事项"></a>1.申请及一些注意事项</h1><p>目前国内发行了 美国运通借记卡 的银行有兴业银行、中信银行和广发银行，先申请广发银行的 美国运通借记卡 主要原因是不需要工本费，且 Lucky 卡的卡面会好看很多。</p><p>这张卡可以网申或者线下申请，网申的话只需要打开 广发银行 APP - 搜索“美国运通” - 选择 - 按流程申请 就可以了。</p><p>一般三到五天便能邮寄到家里（走 EMS）。</p><p><strong>由于该卡存在人民币账户，受“一人四卡”要求限制，如果你在 广发银行 已经开立过一类卡账户，那么这张卡可能会为二类卡账户。</strong></p><h1 id="2-线下激活"><a href="#2-线下激活" class="headerlink" title="2.线下激活"></a>2.线下激活</h1><p>我自己是周六在某网点线下激活，按照流程填表后只需要耐心等待便可激活完成。</p><p><em>（有意思的插曲：中间有柜员问我怎么这么多高中生来办这张卡）</em></p><p><img src="https://pic.r2.byteloid.one/2024-9-21-1.jpg" alt="卡面展示"></p><h1 id="3-实际使用"><a href="#3-实际使用" class="headerlink" title="3.实际使用"></a>3.实际使用</h1><p>由于博主本人还没满十八岁，开不了网银，所以只能通过 广发银行公众号 绑定自己的账户后，每次消费公众号都会发提示给你。</p><p><em>小声BB：隔壁中信和农行十六就能开了</em></p><p>实际测试中，微信和支付宝都能正常绑定，会自动识别成广发银行的借记卡，可以直接提现到银行卡内。</p><p>云闪付可以正常绑定，且可以看到卡内余额和实际可用余额，无法查看账单。</p><p><img src="https://pic.r2.byteloid.one/2024-9-21-2.jpg" alt="下面那一张，详情页截不了图"></p><p>Google Play 港区可以直接付款，Google Pay 还是依旧无法绑定。</p><p>测试拿来充值 AIS 的手机卡，可以直接支付，微信公众号提示扣款 2.14 元，跨境付款似乎不能查看明细。</p><p><img src="https://pic.r2.byteloid.one/2024-9-21-3.jpg" alt="AIS 扣款截图（10 THB）"></p><p><img src="https://pic.r2.byteloid.one/2024-9-21-4.jpg" alt="公众号发来的付款提示（上面是美团付的，下面是 AIS 付的）"></p><p>PayPal 外区可以正常绑定消费。</p><h1 id="4-总结"><a href="#4-总结" class="headerlink" title="4.总结"></a>4.总结</h1><p>总体来说，这张卡在国内完全可以作为普通卡绑微信支付宝使用，同时在境外付款时也能很方便的付款（可能汇率较高）。</p><p>但由于 AMEX 并不像 Visa 和 MasterCard 那么普及，所以也可能遇到无法付款的情况。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在&lt;a href=&quot;https://blog.byteloid.one/2024/01/19/%E6%9C%AA%E6%88%90%E5%B9%B4%E7%94%B3%E8%AF%B7%E4%B8%AD%E4%BF%A1%E9%93%B6%E8%A1%8CVisa%E5%92%8CMasterCard%E5%80%9F%E8%AE%B0%E5%8D%A1/&quot;&gt;之前的文章里&lt;/a&gt;，我曾经向各位介绍过 Visa 和 MasterCard 的借记卡，但其实国内还有 AMEX 发行的借记卡，趁着刚激活完没多久来给各位介绍下。&lt;/p&gt;</summary>
    
    
    
    <category term="实践" scheme="https://blog.byteloid.one/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="AMEX" scheme="https://blog.byteloid.one/tags/AMEX/"/>
    
    <category term="借记卡" scheme="https://blog.byteloid.one/tags/%E5%80%9F%E8%AE%B0%E5%8D%A1/"/>
    
  </entry>
  
  <entry>
    <title>午夜浅思：九月份与高二</title>
    <link href="https://blog.byteloid.one/2024/09/07/%E5%8D%88%E5%A4%9C%E6%B5%85%E6%80%9D%EF%BC%9A%E4%B9%9D%E6%9C%88%E4%BB%BD%E4%B8%8E%E9%AB%98%E4%BA%8C/"/>
    <id>https://blog.byteloid.one/2024/09/07/%E5%8D%88%E5%A4%9C%E6%B5%85%E6%80%9D%EF%BC%9A%E4%B9%9D%E6%9C%88%E4%BB%BD%E4%B8%8E%E9%AB%98%E4%BA%8C/</id>
    <published>2024-09-07T16:04:34.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>虽说开学已经有了一周了，但总想着写点什么，却无从动笔。</p><span id="more"></span><hr><blockquote><p>文章的部分或全部可能是作者无意义的情感发泄，请谨慎阅读。<br>文章不构成医疗建议。</p></blockquote><hr><p>一月不见，如隔几秋。</p><p>现在是凌晨的4点36分，独自一人，坐在电脑前面敲下了这几行字。</p><p>这几天也算是调整回了稍微正常的作息，但还是请原谅我在如此时辰敲下这几段话。</p><hr><p>最近总感觉诸事不顺，整个人似乎失去了什么精气神，但到底是为什么又无从寻起。</p><p>于是放弃挣扎，把一切都怪罪到了是自己的作息不规律导致的。</p><p>即便如此，等明天的这个时候，我照样得从床上爬起来，赶着B11路的早班车晃晃荡荡的前往学校。</p><p>以往开学时我还能保持那么几周的活力，但如今不过区区几天便已经完全想放弃了。</p><p>是什么呢？</p><hr><p>有时候会一个人躺在床上，面朝天。</p><p>思考着有关着生与死的话题。</p><p>但想到最后，不是恐惧占据了大脑，不安的睡着。</p><p>就是想到了令人伤心的话题，半夜独自一人泪下。</p><p>但这几年已经好久没想到了。</p><p>可能是沉重的学业压力和如今充斥着“快餐”的网络环境，让我无法在静下心来思考这个问题吧。</p><hr><p>我不是一个好的写手。</p><p>写到这一段的时候突然觉得前面的自己写的蛮矫情的。</p><p>可能有朋友知道我在某网站闲着无聊写过小说。</p><p>但不过堪堪3.2万字便完全没有动力写下去了，是不热爱还是太累了？</p><p>思考了半天，是我早已没有耐心去投入到专一的创作了。</p><p>我不是一个好的写手。</p><hr><p>高二，曾经陌生，如今熟悉的词语。</p><p>仿佛不久前我还坐在初中的课室里，憧憬着美好的高中生活。</p><p>在那个时候，未来是彩色的，是美好的。</p><p>是始终充满希望的。</p><p>但如今，成为了高二的一员，我却不怎么能感受到这种希望。</p><p>周围的人————无论老师，同学。</p><p>大家都像是充满着气的气球，只需要一点外力便足以爆炸。</p><hr><p>我曾经看到过一个很有趣的理论：为什么总是感觉时间越来越快了？</p><p>因为每一次年龄的增长，那一年在我们生命中的占比都越来越小了。</p><p>在我们两三岁的时候，那时候的一年就是我们人生的三分之一。</p><p>而在现在，一年也只是人生中的百分之六罢了。</p><p>但时间仍在继续，总是得往前走。</p><hr><p>很高兴你看到了这里。</p><p>这些无意义的片段不过是为了缓解下内心无处释放的东西。</p><p>是什么呢？</p><hr><p>无论如何。</p><p>在明天，我们还得去上学，去上班。</p><p>总得有人活在当下，我们终在未来相见。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;虽说开学已经有了一周了，但总想着写点什么，却无从动笔。&lt;/p&gt;</summary>
    
    
    
    <category term="杂谈" scheme="https://blog.byteloid.one/categories/%E6%9D%82%E8%B0%88/"/>
    
    
    <category term="思考" scheme="https://blog.byteloid.one/tags/%E6%80%9D%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>我是如何管理自己的云服务器的？</title>
    <link href="https://blog.byteloid.one/2024/08/02/%E6%88%91%E6%98%AF%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84/"/>
    <id>https://blog.byteloid.one/2024/08/02/%E6%88%91%E6%98%AF%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84/</id>
    <published>2024-08-02T15:38:57.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>同时拥有多台云服务器，如何管理是好？</p><span id="more"></span><hr><p>好久不见！</p><p>最近发现好久没有写博客了，刚刚旅游回来啥都不想写，结果过了好几天才又重新动笔了www。</p><p>先简单介绍一下我有的服务器吧：5台位于国内的云服务器，2台位于美国的云服务器，以及位于其他地方的几台云服务器和小鸡。</p><p>这个时候，管理这些服务器就成了一件很重要的事情。</p><h1 id="0-命名！命名！命名！"><a href="#0-命名！命名！命名！" class="headerlink" title="0.命名！命名！命名！"></a>0.命名！命名！命名！</h1><p>给服务器起名字是常常被忽视但也最重要的一步，你可以参考一下我的起名方式。</p><p>假设我有一台位于国内的云服务器，配置<strong>大于1H1G</strong>，是我持有的第五台（位于国内的）服务器，那么我会这样给其命名：</p><p><strong>CN-VPS-05</strong></p><p>其中，<strong>CN</strong> 代表 <strong>中国大陆</strong> 地区，<strong>VPS</strong> 代表这个是 <strong>云服务器</strong>，<strong>05</strong> 代表这是这台服务器在 CN 地区，VPS 范围内的 <strong>第五台服务器</strong>。</p><p>也就是说，我的服务器命名参照以下格式：</p><p><strong>国家或地区的代号-类型-编号</strong></p><p>这样，无论是哪台服务器，都不会搞混了！</p><h1 id="1-统一管理-状态监测"><a href="#1-统一管理-状态监测" class="headerlink" title="1.统一管理&amp;状态监测"></a>1.统一管理&amp;状态监测</h1><p>那么，我要怎么记住这么多服务器呢？</p><p>这里我可以推荐<a href="https://nezha.wiki/">哪吒面板</a>，几乎就是开箱即用的级别，而且在被控端都可以一键部署。</p><p><img src="https://pic.r2.byteloid.one/2024-8-2-1.png" alt="哪吒面板 最终实现效果"></p><p>同时也能做到对于每台服务器的状态监测。</p><p>当然，如果你有更深入的需求（例如监测 Docker 实例状态 或者 Web 服务），那么我则推荐<a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a>，能解决绝大多数人的需求了。</p><p><img src="https://pic.r2.byteloid.one/2024-8-2-2.jpg" alt="Uptime Kuma Demo"></p><h1 id="2-SSH-连接管理"><a href="#2-SSH-连接管理" class="headerlink" title="2.SSH 连接管理"></a>2.SSH 连接管理</h1><p>对于 SSH 连接，我的第一推荐是 <a href="https://termius.com/">Termius</a>，除了免费计划可能功能较少以外，几乎没有任何缺点，而且还能做到全平台同步！</p><p>此外，如果你有 Github Students Pack，还可以免费领取 Education 版本！</p><p><img src="https://pic.r2.byteloid.one/2024-8-2-3.png" alt="Termius 电脑版界面"></p><h1 id="3-异地组网"><a href="#3-异地组网" class="headerlink" title="3.异地组网"></a>3.异地组网</h1><p>这篇会在未来有关 Tailscale + DERP 实现异地组网 中详细讲解</p><hr><p>总之，这大概就是我目前的管理方法啦！</p><p>也欢迎你在评论区分享你的管理方法，我们下次见。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;同时拥有多台云服务器，如何管理是好？&lt;/p&gt;</summary>
    
    
    
    <category term="杂谈" scheme="https://blog.byteloid.one/categories/%E6%9D%82%E8%B0%88/"/>
    
    
    <category term="服务器" scheme="https://blog.byteloid.one/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="管理" scheme="https://blog.byteloid.one/tags/%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Github 学生包全指南</title>
    <link href="https://blog.byteloid.one/2024/04/11/Github%E5%AD%A6%E7%94%9F%E5%8C%85%E5%85%A8%E6%8C%87%E5%8D%97/"/>
    <id>https://blog.byteloid.one/2024/04/11/Github%E5%AD%A6%E7%94%9F%E5%8C%85%E5%85%A8%E6%8C%87%E5%8D%97/</id>
    <published>2024-04-11T12:52:32.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>可能是全网最简洁的申请指南了（笑）。</p><span id="more"></span><h1 id="什么是-Github-学生包"><a href="#什么是-Github-学生包" class="headerlink" title="什么是 Github 学生包"></a>什么是 Github 学生包</h1><p><strong>学习像专业人士一样发布软件。</strong>实践经验是无可替代的。但对于大多数学生来说，现实世界的工具可能成本高昂。 因此，GitHub 与一些合作伙伴和朋友一起创建了 GitHub Student Developer Pack。</p><h1 id="申请前的准备条件"><a href="#申请前的准备条件" class="headerlink" title="申请前的准备条件"></a>申请前的准备条件</h1><p>大多数情况下需要的：</p><ul><li>学生证或其他可以用于证明你的学生身份的证明文档（建议使用学生证进行验证，机器审核秒过）。</li><li>你的位置在学校附近。</li><li>你的学校的地址。</li></ul><p><strong>注意</strong>，以下规则一定要遵守，否则可能机器秒拒：</p><ul><li>尽量不要使用代理</li><li>录取通知书现在不会被认可了</li><li>做好多次申请的心理准备</li></ul><h1 id="申请流程"><a href="#申请流程" class="headerlink" title="申请流程"></a>申请流程</h1><h2 id="基本信息填写"><a href="#基本信息填写" class="headerlink" title="基本信息填写"></a>基本信息填写</h2><ol><li>前往 <a href="https://education.github.com/">GitHub Education</a> 然后单击顶部导航栏中的 <code>Benefits</code></li><li>选择 <code>Get student benefits</code> 和 <code>Student</code> </li><li>添加邮箱，使用教育邮箱申请能一定程度上提高通过概率</li><li>输入你的学校的英文名称并且在列表中选择你的学校（有就选，没有接着看）</li><li>描述您如何使用 GitHub</li></ol><h2 id="上传学术证明"><a href="#上传学术证明" class="headerlink" title="上传学术证明"></a>上传学术证明</h2><ul><li>单击“拍照”，使用计算机的相机上传证明</li></ul><p><img src="https://pic.r2.byteloid.one/2024-4-27-1.webp" alt="证明上传界面"></p><ul><li>（可选）如果有多个可用相机，请使用相机下拉菜单更改要使用的相机。</li><li>将您的有效学生身份证或其他当前学生身份证明放入框内，然后单击“拍照”。</li><li>在“证明类型”下，使用下拉列表选择要提供的证明类型。</li></ul><h2 id="填写学校具体信息"><a href="#填写学校具体信息" class="headerlink" title="填写学校具体信息"></a>填写学校具体信息</h2><ul><li>在 <code>What is your school&#39;s website</code> 中填入你学校的网址（不一定需要官网，百度百科之类的也可以）</li><li>在 <code>How would you describe your school?</code> 中选择你学校的办学性质（大学及大学学院选 <code>Higher-education</code>，高中选择 <code>High School</code>）</li><li>在 <code>How many students are enrolled at your school</code> 中选择你所在年级的招生人数（非必填但建议选择）</li></ul><p>然后具体填写学校地址（中英文皆可，建议英文）</p><h2 id="在地图上寻找自己的学校"><a href="#在地图上寻找自己的学校" class="headerlink" title="在地图上寻找自己的学校"></a>在地图上寻找自己的学校</h2><p>在特定情况下（如 Github 上没有列出自己的学校），那么你会需要额外填写这一步</p><p><strong>注意：Github所使用的地图为 Bing 地图，在国内会自动跳转至 <a href="https://cn.bing.com/">https://cn.bing.com</a> 导致地图无法加载出来。</strong></p><p><img src="https://pic.r2.byteloid.one/2024-4-27-2.png" alt="地图"></p><p>当地图加载出来后按照以下步骤操作：</p><ol><li>在 <code>Type of School</code> 选择对应的学校类型</li><li>在地图左下角的搜索框内输入学校全名（中文即可）</li><li>点击 <code>Search</code></li><li>选择带地址的结果</li></ol><p>如果很不幸，你的学校没有被记录在地图上，那么请按照以下步骤操作</p><ol><li>填写你学校的街道地址（如北京路 300 号）</li><li>选择最相似的</li><li>等待通过或驳回，选择与工作人员对线或者重复申请</li></ol><p>一般情况下，多次申请后你的学校就会被记录在 Github 的系统中，此时 Github 就不会要求你在地图上找到自己的学校</p><h1 id="提交申请"><a href="#提交申请" class="headerlink" title="提交申请"></a>提交申请</h1><p>一切就绪，按下 <code>Process my application</code>，此时回到申请首页，查看申请的状态</p><ul><li>如果直接显示绿色的 <code>Approved</code>，说明你的材料直接通过了机器审核（如选择学生证作为证明材料），此时绝大多数情况下只需要耐心等待，直到变为紫色的 <code>Approved</code> 或是邮箱内收到欢迎邮件就代表申请成功了</li><li>如果直接显示红色的 <code>Rejected</code>，但是给出了理由，大概率是 Github 账号有些资料没有补充完，补充后重新申请即可</li><li>如果直接显示红色的 <code>Rejected</code>，并且没有给出理由，大概率是你开了代理或是不在学校附近，此时只能选择重试</li></ul><p>如果以上两种情况都没有遇到，说明你的材料正在进行人工审核，此时只需要注意以下两点即可</p><ul><li>被拒了不要着急，检查拒绝原因，一般都给出了详细的理由</li><li>有一些材料已经不再被认可（如入学通知单），此时可以尝试更换材料重试</li></ul><h1 id="小技巧"><a href="#小技巧" class="headerlink" title="小技巧"></a>小技巧</h1><ul><li>材料类型选择 <code>Student ID Card</code> 一般都是机器秒过</li><li>灵活尝试</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;可能是全网最简洁的申请指南了（笑）。&lt;/p&gt;</summary>
    
    
    
    <category term="指南" scheme="https://blog.byteloid.one/categories/%E6%8C%87%E5%8D%97/"/>
    
    
    <category term="Github" scheme="https://blog.byteloid.one/tags/Github/"/>
    
    <category term="学生优惠" scheme="https://blog.byteloid.one/tags/%E5%AD%A6%E7%94%9F%E4%BC%98%E6%83%A0/"/>
    
  </entry>
  
  <entry>
    <title>《崩坏3》，再一次站到了十字路口</title>
    <link href="https://blog.byteloid.one/2024/04/03/%E3%80%8A%E5%B4%A9%E5%9D%8F3%E3%80%8B%E5%86%8D%E4%B8%80%E6%AC%A1%E7%AB%99%E5%88%B0%E4%BA%86%E5%8D%81%E5%AD%97%E8%B7%AF%E5%8F%A3/"/>
    <id>https://blog.byteloid.one/2024/04/03/%E3%80%8A%E5%B4%A9%E5%9D%8F3%E3%80%8B%E5%86%8D%E4%B8%80%E6%AC%A1%E7%AB%99%E5%88%B0%E4%BA%86%E5%8D%81%E5%AD%97%E8%B7%AF%E5%8F%A3/</id>
    <published>2024-04-03T12:56:57.000Z</published>
    <updated>2026-05-05T17:23:34.090Z</updated>
    
    <content type="html"><![CDATA[<p>米哈游，成也《崩坏3》，败也《崩坏3》</p><span id="more"></span><p>2024 年，《崩坏3》迎来了自己的第 8 个年头。<br>作为米哈游家族的大姐之一，《崩坏3》的节奏从未消停过，但随着 2023 年 跨越终焉之日 章节的结束，《崩坏3》迎来了自己的第一次大结局。<br>而今，冒险重新起航，在饱受争议的第二部被搬上舞台后，《崩坏3》又将何去何从？</p><hr><h1 id="主角团-与-“主角团”"><a href="#主角团-与-“主角团”" class="headerlink" title="主角团 与 “主角团”"></a>主角团 与 “主角团”</h1><p>《原神》《崩坏：星穹铁道》讲的是不同人之间的故事，但《崩坏3》不一样，《崩坏3》一开始便是专注讲一群人的故事。《在坠落的天空下》中琪亚娜与空之律者的斗争，《自深海而来》了解希儿的故事，《太虚梦华录》讲述符华的过往…《崩坏3》始终专注于讲述一个人或者是几个人的故事，这使得玩家会对游戏中的角色有着很深的感情。</p><p>玩家对游戏角色的感情，实际上是《崩坏3》成功的主要部分之一，正是有着这份感情，使得《崩坏3》玩家对游戏有着极高的粘性。但随着《崩坏3》终章的落幕，这份感情，又该何去何从？</p><p><img src="https://pic.r2.byteloid.one/2024-4-3-1.webp" alt="琪亚娜"></p><h1 id="争议初现"><a href="#争议初现" class="headerlink" title="争议初现"></a>争议初现</h1><p>2023 年 9 月 22 日，崩坏3第一偶像爱酱 发布了第一个有关于《崩坏3》第二部的预告，截止到完稿，视频有着 449.6 万的播放量。对于一个运营了长达 7 年，在主线剧情经历过一次完结的游戏来说，这份数据可谓是十分亮眼的。但随后的一系列改动，却使《崩坏3》又一次陷入了争议的漩涡。</p><h2 id="UI-改动"><a href="#UI-改动" class="headerlink" title="UI 改动"></a>UI 改动</h2><p>在随后的几个版本中，《崩坏3》再一次改动了自己的 UI，尽管在历史上这并不是《崩坏3》第一次改动 UI，但是这次的改动却伴随这极大的争议，在第二部正式上线后达到了顶峰。甚至出现了玩家吐槽“手机里有一款用手机玩最难受的手游”。</p><p><img src="https://pic.r2.byteloid.one/2024-4-3-2.jpg" alt="群友对新UI的评论"></p><h2 id="补给改动"><a href="#补给改动" class="headerlink" title="补给改动"></a>补给改动</h2><p>第二部发布后，《崩坏3》迎来了自己的一次补给保底调整。但在此次改动后，互联网上出现了大量硬吃 90 发保底的游戏玩家。<br>虽然《崩坏3》的出货概率不止一次被人吐槽，但如此多的硬吃大保底还是值得令人怀疑。<br>（笔者注：我自己也抽了下，大约 70-80 发左右出货）</p><h2 id="新剧情争议"><a href="#新剧情争议" class="headerlink" title="新剧情争议"></a>新剧情争议</h2><p>第二部剧情上线后，关于剧情的争议便从未停止。<br>从文笔来看很明显是帆船老师的文风，但其堪比谜语人的剧情和一些意义不明的强调符号仍然不出意外的引起了玩家之间的争议。</p><h1 id="当下情况"><a href="#当下情况" class="headerlink" title="当下情况"></a>当下情况</h1><p>截止到目前，《崩坏3》7.4版本宣传PV 也仅仅只有 39.9 万的播放量，甚至不及之前发布的角色PV。<br>在 7.3 版本更新保受争议后，《崩坏3》吸取了教训，但似乎并不多，其在 7.4 版本的数据仍然处于颓势，周围和网络上也不乏有“活动好肝”“没有动力过第二部剧情”等声音。</p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>作为一个运营长达 7 年的游戏，《崩坏3》无疑是值得令人敬佩的，其选择在主线第一部剧情结束后仍旧继续书写这个宇宙的故事，这种决定和勇气也同样是值得令人肯定的。<br>但是对于在琪亚娜和主角团上投入了太多感情的玩家，如何让他们接受第二部新的主角团成员，也同样是一个值得思考的问题。<br>《崩坏3》，再一次站到了十字路口。左侧，是休伯利安号上的舰长，右侧，是在火星的寻梦者。《崩坏3》又该如何在这两者之间寻找到一个新的平衡点？</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;米哈游，成也《崩坏3》，败也《崩坏3》&lt;/p&gt;</summary>
    
    
    
    <category term="杂谈" scheme="https://blog.byteloid.one/categories/%E6%9D%82%E8%B0%88/"/>
    
    
    <category term="米哈游" scheme="https://blog.byteloid.one/tags/%E7%B1%B3%E5%93%88%E6%B8%B8/"/>
    
    <category term="崩坏IP" scheme="https://blog.byteloid.one/tags/%E5%B4%A9%E5%9D%8FIP/"/>
    
    <category term="崩坏3" scheme="https://blog.byteloid.one/tags/%E5%B4%A9%E5%9D%8F3/"/>
    
  </entry>
  
</feed>
