<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Docker on Square Uncle</title>
    <link>https://squareuncle.com/tags/docker/</link>
    <description>Recent content in Docker on Square Uncle</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 02 Apr 2026 21:15:00 +0800</lastBuildDate>
    <atom:link href="https://squareuncle.com/tags/docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>主权级下载器：在 YouTube 的 n-sig 迷雾中开工</title>
      <link>https://squareuncle.com/posts/2026-04-02-sovereign-youtube-downloader-architecture/</link>
      <pubDate>Thu, 02 Apr 2026 21:15:00 +0800</pubDate>
      <guid>https://squareuncle.com/posts/2026-04-02-sovereign-youtube-downloader-architecture/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;YouTube 下载器架构封面&#34; loading=&#34;lazy&#34; src=&#34;https://squareuncle.com/images/youtube_downloader_architecture.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;受众&lt;/strong&gt;：对自托管工具感兴趣、经常与各种“限制”博弈的开发者。
&lt;strong&gt;核心目标&lt;/strong&gt;：构建一个完全受控的 YouTube 媒体采集系统，解决 &lt;code&gt;n challenge&lt;/code&gt; 签名挑战。
&lt;strong&gt;问题-方案映射&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登录墙/Cookie $\rightarrow$ Manifest v3 浏览器插件同步&lt;/li&gt;
&lt;li&gt;动态签名 (n-sig) $\rightarrow$ Docker 内置 External JS Solver (node)&lt;/li&gt;
&lt;li&gt;实时观测 $\rightarrow$ Socket.io 流式转发 stdout&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;最近在折腾自己的“数字主权”基础设施，其中一个刚需就是 YouTube 下载。市面上的工具很多，但随着 YouTube 对 &lt;code&gt;n-sig&lt;/code&gt;（一种通过混淆 JS 动态生成的签名）的限制加码，很多开源项目开始在大音轨下载上“翻车”。&lt;/p&gt;
&lt;p&gt;作为一个写了 20 年代码的老兵，我最受不了的就是“工具不可控”。于是，我把这套老伙计重新打磨了一下，做了一个“主权级”的架构。&lt;/p&gt;
&lt;h2 id=&#34;1-架构为什么非要搞这么复杂&#34;&gt;1. 架构：为什么非要搞这么复杂？&lt;/h2&gt;
&lt;p&gt;很多人觉得 &lt;code&gt;yt-dlp&lt;/code&gt; 一行命令能解决的事，为什么要搞插件、Docker 和后端？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;骨感现实&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cookie 维护&lt;/strong&gt;：手动导 &lt;code&gt;cookies.txt&lt;/code&gt; 太脏。我写了一个 Manifest v3 插件，点一下直接同步到云端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境隔离&lt;/strong&gt;：我的开发机是 Windows，但下载器必须部署在 Linux Docker 里，且需要精准控制 &lt;code&gt;ffmpeg&lt;/code&gt; 和 &lt;code&gt;yt-dlp&lt;/code&gt; 的版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是我们的“三足鼎立”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;插件 (Bridge)&lt;/strong&gt;：负责打通浏览器会话。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端 (Engine)&lt;/strong&gt;：Node.js + Socket.io，负责进程管理和实时日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器 (Infra)&lt;/strong&gt;：解决一切环境依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-泥地打滚解决-n-sig-的深层逻辑&#34;&gt;2. 泥地打滚：解决 n-sig 的深层逻辑&lt;/h2&gt;
&lt;p&gt;前阵子，我的下载器突然报错：&lt;code&gt;n challenge solving failed&lt;/code&gt;。这是 YouTube 升级了混淆逻辑，&lt;code&gt;yt-dlp&lt;/code&gt; 默认的 Python 模拟器解不动了。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
