<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.guanshaowei.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.guanshaowei.com/" rel="alternate" type="text/html" /><updated>2025-09-05T21:55:35+00:00</updated><id>https://www.guanshaowei.com/feed.xml</id><title type="html">老官的自留地</title><subtitle>Webber的自留地</subtitle><entry><title type="html">如何使用 GitHub Pages 和 Jekyll 搭建免费个人博客</title><link href="https://www.guanshaowei.com/tutorial/tech/2025/09/05/github-blog-tutorial.html" rel="alternate" type="text/html" title="如何使用 GitHub Pages 和 Jekyll 搭建免费个人博客" /><published>2025-09-05T14:00:00+00:00</published><updated>2025-09-05T14:00:00+00:00</updated><id>https://www.guanshaowei.com/tutorial/tech/2025/09/05/github-blog-tutorial</id><content type="html" xml:base="https://www.guanshaowei.com/tutorial/tech/2025/09/05/github-blog-tutorial.html"><![CDATA[<h1 id="如何使用-github-pages-和-jekyll-搭建免费个人博客">如何使用 GitHub Pages 和 Jekyll 搭建免费个人博客</h1>

<p>本教程将指导您完成从零开始，使用 Jekyll 和 GitHub Pages 搭建一个完全免费、功能强大且易于维护的个人静态博客的完整过程。</p>

<h2 id="为什么选择-jekyll--github-pages">为什么选择 Jekyll + GitHub Pages？</h2>

<ul>
  <li><strong>完全免费</strong>: 托管在 GitHub Pages 上，无需任何服务器费用。</li>
  <li><strong>简单高效</strong>: 您只需要用 Markdown 格式写作，Jekyll 会自动生成整个网站。</li>
  <li><strong>无缝集成</strong>: GitHub Pages 原生支持 Jekyll，您只需将代码推送到仓库，网站就会自动更新，无需复杂的部署流程。</li>
  <li><strong>高度可定制</strong>: 您可以轻松更换主题、修改样式，完全掌控您的博客外观。</li>
</ul>

<hr />

<h2 id="第一步准备本地开发环境">第一步：准备本地开发环境</h2>

<p>为了能在发布前在自己电脑上预览效果，我们需要安装必要的工具。对于 macOS 用户，强烈建议使用版本管理器 <code class="language-plaintext highlighter-rouge">rbenv</code> 来安装一个现代化的 Ruby，以避免与系统自带的旧版 Ruby 产生冲突。</p>

<h3 id="1-安装-rbenv-ruby-版本管理器">1. 安装 rbenv (Ruby 版本管理器)</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>rbenv
</code></pre></div></div>

<h3 id="2-配置-rbenv">2. 配置 rbenv</h3>

<p>将 <code class="language-plaintext highlighter-rouge">rbenv</code> 的初始化脚本添加到您的终端配置中，这样每次打开终端它都能正常工作。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'eval "$(rbenv init -)"'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
</code></pre></div></div>

<p>然后，<strong>关闭并重新打开一个新的终端窗口</strong>以让配置生效。</p>

<h3 id="3-安装新版-ruby">3. 安装新版 Ruby</h3>

<p>我们将安装一个现代、稳定的 Ruby 版本（例如 3.3.0）。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 安装 Ruby 3.3.0 (此过程会从源码编译，可能需要几分钟)</span>
rbenv <span class="nb">install </span>3.3.0

<span class="c"># 将 3.3.0 设置为全局默认版本</span>
rbenv global 3.3.0
</code></pre></div></div>

<p>验证一下是否成功，运行 <code class="language-plaintext highlighter-rouge">ruby -v</code>，应该会显示 <code class="language-plaintext highlighter-rouge">ruby 3.3.0</code>。</p>

<h3 id="4-安装-jekyll-和-bundler">4. 安装 Jekyll 和 Bundler</h3>

<p>在全新的 Ruby 环境中，安装 Jekyll 和它的依赖管理器 Bundler。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem <span class="nb">install </span>bundler jekyll
</code></pre></div></div>

<p>至此，您的本地环境已准备就绪。</p>

<hr />

<h2 id="第二步创建并预览您的博客">第二步：创建并预览您的博客</h2>

<h3 id="1-创建一个新的-jekyll-站点">1. 创建一个新的 Jekyll 站点</h3>

<p>进入您想存放博客代码的目录，运行以下命令。它会创建一个名为 <code class="language-plaintext highlighter-rouge">my-blog</code> 的文件夹，并包含博客所需的所有模板文件。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jekyll new my-blog
</code></pre></div></div>

<h3 id="2-进入项目目录">2. 进入项目目录</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>my-blog
</code></pre></div></div>

<h3 id="3-本地预览">3. 本地预览</h3>

<p>在发布到网上前，先在本地启动一个服务器来实时预览效果。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<p>命令运行后，打开您的浏览器，访问 <code class="language-plaintext highlighter-rouge">http://localhost:4000</code>。您应该能看到一个默认主题的博客网站。</p>

<hr />

<h2 id="第三步撰写第一篇文章">第三步：撰写第一篇文章</h2>

<ol>
  <li><strong>找到文章目录</strong>: 您的所有博文都存放在 <code class="language-plaintext highlighter-rouge">_posts</code> 文件夹中。</li>
  <li><strong>创建文章文件</strong>: 在 <code class="language-plaintext highlighter-rouge">_posts</code> 目录下创建一个新的 Markdown 文件。<strong>文件名必须遵循 <code class="language-plaintext highlighter-rouge">年-月-日-文章标题.md</code> 的格式</strong>。
    <ul>
      <li>例如: <code class="language-plaintext highlighter-rouge">2025-09-05-how-to-build-a-blog.md</code></li>
    </ul>
  </li>
  <li>
    <p><strong>添加头信息 (Front Matter)</strong>: 每篇文章的开头，都必须有一个 YAML 格式的“头信息”，用来告诉 Jekyll 这篇文章的标题、布局、日期等元数据。请务必将其放在文件的最顶端。</p>

    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span>  <span class="s2">"</span><span class="s">这是我的第一篇文章"</span>
<span class="na">date</span><span class="pi">:</span>   <span class="s">2025-09-05 20:30:00 +0800</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">tech life</span>
<span class="nn">---</span>

<span class="s">(从这里开始，用 Markdown 格式写您的正文...)</span>

<span class="c1"># 这是一个一级标题</span>

<span class="s">这是段落内容。</span>
</code></pre></div>    </div>
  </li>
</ol>

<hr />

<h2 id="第四步部署到-github-pages">第四步：部署到 GitHub Pages</h2>

<p>这是最后一步，将您的博客发布到全世界。</p>

<h3 id="1-创建-github-仓库">1. 创建 GitHub 仓库</h3>

<ul>
  <li>登录您的 GitHub 账户。</li>
  <li>创建一个 <strong>新的、公开的 (Public)</strong> 仓库。</li>
  <li><strong>仓库的名称必须使用一个特殊的格式</strong>：<code class="language-plaintext highlighter-rouge">&lt;your-github-username&gt;.github.io</code>
    <ul>
      <li>例如，如果您的 GitHub 用户名是 <code class="language-plaintext highlighter-rouge">octocat</code>，那么仓库名就必须是 <code class="language-plaintext highlighter-rouge">octocat.github.io</code>。</li>
    </ul>
  </li>
</ul>

<h3 id="2-关联并推送代码">2. 关联并推送代码</h3>

<p>回到您本地的 <code class="language-plaintext highlighter-rouge">my-blog</code> 文件夹，在终端里依次执行以下 <code class="language-plaintext highlighter-rouge">git</code> 命令，将您的博客代码推送到刚刚创建的 GitHub 仓库。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 初始化 Git</span>
git init <span class="nt">-b</span> main

<span class="c"># 添加所有文件到暂存区</span>
git add <span class="nb">.</span>

<span class="c"># 创建第一次提交</span>
git commit <span class="nt">-m</span> <span class="s2">"Initial blog setup"</span>

<span class="c"># 关联到您的远程 GitHub 仓库 (请将地址替换为您自己的)</span>
git remote add origin https://github.com/your-github-username/your-github-username.github.io.git

<span class="c"># 推送到 GitHub</span>
git push <span class="nt">-u</span> origin main
</code></pre></div></div>

<h3 id="3-访问您的线上博客">3. 访问您的线上博客</h3>

<p>代码推送成功后，请耐心等待一两分钟。GitHub Pages 会在后台自动构建您的网站。</p>

<p>之后，您就可以通过 <code class="language-plaintext highlighter-rouge">https://&lt;your-github-username&gt;.github.io</code> 这个网址，看到您线上部署好的博客了。</p>

<hr />

<h2 id="第五步如何更新博客">第五步：如何更新博客</h2>

<p>您的博客已经上线了！之后更新网站的流程非常简单：</p>

<ol>
  <li>在本地的 <code class="language-plaintext highlighter-rouge">_posts</code> 文件夹里，创建一个新的 Markdown 文件来写新文章。</li>
  <li>写完后，在 <code class="language-plaintext highlighter-rouge">my-blog</code> 目录下，依次运行三条命令：
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s2">"Post a new article"</span>
git push
</code></pre></div>    </div>
  </li>
  <li>等待几分钟，您的线上博客就会自动出现新文章。</li>
</ol>]]></content><author><name></name></author><category term="tutorial" /><category term="tech" /><summary type="html"><![CDATA[如何使用 GitHub Pages 和 Jekyll 搭建免费个人博客]]></summary></entry><entry><title type="html">实战记录：从零构建一个稳定、高效的私有在线内容抓取器</title><link href="https://www.guanshaowei.com/tech/project/2025/09/05/online-downloader-log.html" rel="alternate" type="text/html" title="实战记录：从零构建一个稳定、高效的私有在线内容抓取器" /><published>2025-09-05T12:00:00+00:00</published><updated>2025-09-05T12:00:00+00:00</updated><id>https://www.guanshaowei.com/tech/project/2025/09/05/online-downloader-log</id><content type="html" xml:base="https://www.guanshaowei.com/tech/project/2025/09/05/online-downloader-log.html"><![CDATA[<h1 id="实战记录从零构建一个稳定高效的私有在线内容抓取器">实战记录：从零构建一个稳定、高效的私有在线内容抓取器</h1>

<p>本文记录了一个从零开始，通过 Web 界面下载在线视频内容的工具的完整构建过程。项目从一个简单的想法出发，经历了一系列真实世界中常见的技术挑战，并通过不断的迭代和优化，最终演变成一个稳定、高效、安全且可部署在云端的私有应用。</p>

<h2 id="一最终成品">一、最终成品</h2>

<p>一个部署在云端的、受密码保护的 Web 应用。用户只需在前端页面粘贴目标内容的链接和访问密码，即可触发后端下载，并通过流式接口将文件下载到本地。文件在用户下载完成后会自动从服务器删除，不占用云端磁盘空间。</p>

<h2 id="二技术栈">二、技术栈</h2>

<ul>
  <li><strong>前端 (Frontend)</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">HTML5</code></li>
      <li><code class="language-plaintext highlighter-rouge">CSS3</code> (无特定框架)</li>
      <li><code class="language-plaintext highlighter-rouge">JavaScript (ES6+)</code> (无特定框架)</li>
    </ul>
  </li>
  <li><strong>后端 (Backend)</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Node.js</code>: JavaScript 服务器端运行环境。</li>
      <li><code class="language-plaintext highlighter-rouge">Express.js</code>: 轻量级 Node.js Web 框架，用于搭建 API 服务器。</li>
    </ul>
  </li>
  <li><strong>核心工具 (Core Tool)</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">yt-dlp</code>: 业界领先的命令行视频下载工具，负责解析、下载和合并。</li>
      <li><code class="language-plaintext highlighter-rouge">FFmpeg</code>: <code class="language-plaintext highlighter-rouge">yt-dlp</code> 的底层依赖，用于处理音视频的合并与转换。</li>
    </ul>
  </li>
  <li><strong>部署 (Deployment)</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Docker</code>: 将应用及所有依赖（Node.js, Python, yt-dlp, FFmpeg）打包成一个可移植的容器。</li>
      <li><code class="language-plaintext highlighter-rouge">ClawCloud Run</code> (或任何支持 Docker 的 PaaS 平台): 运行和托管我们的 Docker 容器。</li>
    </ul>
  </li>
</ul>

<h2 id="三核心设计思路">三、核心设计思路</h2>

<p>项目的核心是 <strong>“专业工具原则”</strong>。我们不重新发明轮子，而是将复杂、专业的任务（如解析和下载）交给领域内最强大的工具 <code class="language-plaintext highlighter-rouge">yt-dlp</code>。我们的 Node.js 后端只扮演一个“胶水层”和“安全外壳”的角色：</p>

<ol>
  <li><strong>接收请求</strong>: 通过 Express.js 提供一个简单的 API 接口。</li>
  <li><strong>安全验证</strong>: 对前端传来的访问密码进行验证。</li>
  <li><strong>任务调度</strong>: 在验证通过后，安全地构建并执行 <code class="language-plaintext highlighter-rouge">yt-dlp</code> 命令行指令。</li>
  <li><strong>结果反馈</strong>: 将 <code class="language-plaintext highlighter-rouge">yt-dlp</code> 的执行结果（成功或失败）返回给前端。</li>
  <li><strong>流式下载与清理</strong>: 创建一个专用的下载接口，将文件以“流”的形式传给用户，并在传输完成后自动删除源文件，实现“阅后即焚”，节约磁盘空间。</li>
</ol>

<h2 id="四部署指南">四、部署指南</h2>

<h3 id="1-dockerfile">1. Dockerfile</h3>

<p>这是我们最终优化后的 <code class="language-plaintext highlighter-rouge">Dockerfile</code>，它通过使用轻量的 <code class="language-plaintext highlighter-rouge">Alpine</code> 系统和静态 <code class="language-plaintext highlighter-rouge">ffmpeg</code>，将镜像体积控制在了理想的大小。</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Stage 1: Use a lightweight Alpine-based Node.js image</span>
<span class="k">FROM</span><span class="s"> node:18-alpine</span>

<span class="c"># Set the working directory</span>
<span class="k">WORKDIR</span><span class="s"> /usr/src/app</span>

<span class="c"># Install dependencies. We need wget and xz to download and extract ffmpeg.</span>
<span class="c"># We still need python and pip for yt-dlp.</span>
<span class="k">RUN </span>apk add <span class="nt">--no-cache</span> <span class="se">\
</span>    wget <span class="se">\
</span>    xz <span class="se">\
</span>    python3

<span class="c"># Download and install a static build of ffmpeg, which is much smaller</span>
<span class="k">RUN </span>wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz <span class="o">&amp;&amp;</span> <span class="se">\
</span>    <span class="nb">tar</span> <span class="nt">-xf</span> ffmpeg-release-amd64-static.tar.xz <span class="o">&amp;&amp;</span> <span class="se">\
</span>    <span class="nb">mv </span>ffmpeg-<span class="k">*</span><span class="nt">-static</span>/ffmpeg /usr/local/bin/ <span class="o">&amp;&amp;</span> <span class="se">\
</span>    <span class="nb">rm</span> <span class="nt">-rf</span> ffmpeg-release-amd64-static.tar.xz ffmpeg-<span class="k">*</span><span class="nt">-static</span>

<span class="c"># Install pip, build dependencies for yt-dlp, then install yt-dlp and remove build deps.</span>
<span class="k">RUN </span>apk add <span class="nt">--no-cache</span> <span class="nt">--virtual</span> .build-deps gcc musl-dev python3-dev <span class="o">&amp;&amp;</span> <span class="se">\
</span>    apk add <span class="nt">--no-cache</span> py3-pip <span class="o">&amp;&amp;</span> <span class="se">\
</span>    pip3 <span class="nb">install</span> <span class="nt">--upgrade</span> pip <span class="nt">--break-system-packages</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span>    pip3 <span class="nb">install </span>yt-dlp <span class="nt">--break-system-packages</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span>    apk del .build-deps

<span class="c"># Copy package.json and package-lock.json</span>
<span class="k">COPY</span><span class="s"> package*.json ./ </span>

<span class="c"># Install Node.js application dependencies</span>
<span class="k">RUN </span>npm <span class="nb">install</span> <span class="nt">--production</span>

<span class="c"># Copy the rest of the application files</span>
<span class="k">COPY</span><span class="s"> . .</span>

<span class="c"># Make the downloads directory</span>
<span class="k">RUN </span><span class="nb">mkdir</span> <span class="nt">-p</span> downloads

<span class="c"># Expose port 3000</span>
<span class="k">EXPOSE</span><span class="s"> 3000</span>

<span class="c"># Define the command to run your app</span>
<span class="k">CMD</span><span class="s"> [ "node", "server.js" ]</span>
</code></pre></div></div>

<h3 id="2-环境变量">2. 环境变量</h3>

<p>在项目根目录创建 <code class="language-plaintext highlighter-rouge">.env</code> 文件，并根据 <code class="language-plaintext highlighter-rouge">.env.example</code> 的格式填入你的配置。在云端部署时，这些变量需要配置在平台的“环境变量”或“密钥”设置中。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>AUTH_TOKEN=your_auth_token
CT0=your_ct0_token
APP_PASSWORD=your_secret_password
</code></pre></div></div>

<h3 id="3-构建与部署">3. 构建与部署</h3>

<p>构建一个支持云端服务器 (AMD64) 和本地 Mac (ARM64) 的跨平台镜像是最佳实践。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. (仅首次需要) 创建并使用一个新的 builder</span>
docker buildx create <span class="nt">--name</span> mybuilder <span class="nt">--use</span>

<span class="c"># 2. 构建并直接推送到 Docker Hub</span>
docker buildx build <span class="nt">--platform</span> linux/amd64,linux/arm64 <span class="nt">-t</span> your-docker-username/x-downloader <span class="nt">--push</span> <span class="nb">.</span>
</code></pre></div></div>

<p>在 ClawCloud Run 等平台上部署时，指向这个镜像地址，配置好端口 (<code class="language-plaintext highlighter-rouge">3000</code>) 和环境变量，并<strong>挂载一个持久化存储卷</strong>到容器的 <code class="language-plaintext highlighter-rouge">/usr/src/app/downloads</code> 目录。</p>

<h2 id="五实战踩坑记录">五、实战踩坑记录</h2>

<p>这个项目的真正价值在于解决了一系列从开发到部署的真实问题。</p>

<ul>
  <li><strong>问题一：Puppeteer 导航超时</strong>
    <ul>
      <li><strong>现象</strong>: 最初尝试用 Puppeteer 模拟浏览器抓取，但因反爬虫机制而超时。</li>
      <li><strong>解决</strong>: 尝试增加超时、伪装 User-Agent 等，但效果不佳，且方案过于脆弱。</li>
    </ul>
  </li>
  <li><strong>问题二：长视频下载失败</strong>
    <ul>
      <li><strong>现象</strong>: Node.js 下载方案在处理长视频时，因一次性发起过多并发请求而导致早期请求超时。</li>
      <li><strong>解决</strong>: 在 Node.js 中实现了一个并发下载队列来控制请求数量。</li>
    </ul>
  </li>
  <li><strong>问题三：下载速度被服务器限流</strong>
    <ul>
      <li><strong>现象</strong>: 即便并发下载，速度依然被限制在和视频播放速度几乎一致。</li>
      <li><strong>解决</strong>: <strong>第一次重大技术转向</strong>。放弃在 Node.js 中造轮子，承认 <code class="language-plaintext highlighter-rouge">ffmpeg</code> 也被限流的事实，转而采用更专业的命令行工具 <code class="language-plaintext highlighter-rouge">yt-dlp</code>，它内置了更成熟的反限速策略。</li>
    </ul>
  </li>
  <li><strong>问题四：Docker 镜像体积过大 (1GB - 3.4GB)</strong>
    <ul>
      <li><strong>现象</strong>: 简单的 <code class="language-plaintext highlighter-rouge">Dockerfile</code> 构建出的镜像异常庞大。</li>
      <li><strong>原因</strong>: 经过层层排查，先后发现了两个原因：1. <code class="language-plaintext highlighter-rouge">COPY . .</code> 指令错误地将本地下载的视频文件打包了进去；2. 系统包管理器 <code class="language-plaintext highlighter-rouge">apk</code> 安装 <code class="language-plaintext highlighter-rouge">ffmpeg</code> 时，附带了极其庞大的依赖库。</li>
      <li><strong>解决</strong>: 1. 将 <code class="language-plaintext highlighter-rouge">downloads/</code> 目录添加到 <code class="language-plaintext highlighter-rouge">.dockerignore</code> 文件中；2. <strong>第二次重大技术转向</strong>，放弃从系统源安装 <code class="language-plaintext highlighter-rouge">ffmpeg</code>，改为直接下载和使用体积小巧的静态编译版本。</li>
    </ul>
  </li>
  <li><strong>问题五：跨平台部署失败</strong>
    <ul>
      <li><strong>现象</strong>: 在 Mac (ARM 架构) 上构建的镜像，无法在云端服务器 (AMD64 架构) 上运行，报错 <code class="language-plaintext highlighter-rouge">no match for platform in manifest</code>。</li>
      <li><strong>解决</strong>: 使用 <code class="language-plaintext highlighter-rouge">docker buildx</code> 构建支持多CPU架构的跨平台镜像。</li>
    </ul>
  </li>
  <li><strong>问题六：云端文件丢失</strong>
    <ul>
      <li><strong>现象</strong>: 下载成功后，去取文件时却提示“文件不存在”。</li>
      <li><strong>原因</strong>: 云平台使用的是“临时文件系统”，两次请求之间，容器的文件系统可能已被重置。</li>
      <li><strong>解决</strong>: 在云平台为应用配置并<strong>挂载持久化存储卷</strong>，确保文件能够永久保存。</li>
    </ul>
  </li>
  <li><strong>问题七：云端资源不足</strong>
    <ul>
      <li><strong>现象</strong>: 在最低配置的实例上，长视频下载任务会莫名失败。</li>
      <li><strong>原因</strong>: 256MB 内存过低，长视频处理时内容超出上限，导致进程被系统强制杀死 (OOMKill)。</li>
      <li><strong>解决</strong>: 将实例内存提升到更稳定的 512MB。</li>
    </ul>
  </li>
</ul>

<h2 id="六总结">六、总结</h2>

<p>这个项目完美地诠释了现代软件开发的常见模式：用一个轻量级的后端（Node.js）作为“外壳”，去驱动一个或多个强大的、专业的底层工具（yt-dlp），并将它们通过 Docker 容器化，最终部署到一个现代化的云平台。整个过程中的排错经历，尤其是在 Docker 镜像优化和云原生环境适应（如临时文件系统、跨平台构建）方面，是非常宝贵的实战经验。</p>]]></content><author><name></name></author><category term="tech" /><category term="project" /><summary type="html"><![CDATA[实战记录：从零构建一个稳定、高效的私有在线内容抓取器]]></summary></entry></feed>