<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>小明同学 - 实用教程</title>
  
  <subtitle>分类：实用教程</subtitle>
  <link href="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/atom.xml" rel="self"/>
  
  <link href="https://xiaomingclassmate.com/"/>
  <updated>2026-11-08T12:56:40.775Z</updated>
  <id>https://xiaomingclassmate.com/</id>
  
  <author>
    <name>小明同学</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2026年如何注册谷歌邮箱——绕过手机号验证（超简单！）</title>
    <link href="https://xiaomingclassmate.com/posts/52218/"/>
    <id>https://xiaomingclassmate.com/posts/52218/</id>
    <published>2026-01-25T08:07:55.000Z</published>
    <updated>2026-11-08T12:56:40.775Z</updated>
    
    <content type="html"><![CDATA[<p>大家好，我是小明同学。</p><p>你是不是谷歌浏览器注册谷歌邮箱也卡在手机发送验证码，但是国内手机验证码发送不了，陷入了死循环？<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260111223105619.png" alt="image.png"><br>你们卡在哪里呢？最大的难题就是需要手机号进行验证，那有没有可能直接跳过手机号的扫码验证呢？答案是：有的</p><p>最近在尝试注册谷歌邮箱，试了很多方法，发现一个比较容易的方法，下面就介绍给大家。废话不多说，直接上教程！</p><h2 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h2><ul><li>手机（安卓）</li><li>华为体系建议就放弃吧</li><li>手机可以<strong>科学上网</strong>，梯子最好是美国的梯子</li></ul><h2 id="具体教程"><a href="#具体教程" class="headerlink" title="具体教程"></a>具体教程</h2><p>1.打开科学上网，进入特殊环境状态，节点建议选择美国。<br>这个自己想办法，这里不提供2.需要下载google gmail手机应用<br>这个看我之前的文章，安装谷歌三件套，然后下载Gmail，这里不再赘述3.下载打开Gmail，选择<strong>添加账号</strong>–&gt;<strong>Google</strong>–&gt;<strong>创建账号</strong>–&gt;<strong>个人用途</strong><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260112201928418.png" alt="image.png"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260112201807558.png" alt="image.png"></p><p>4.填写基本信息，姓和名千万不要填写中文，生日年份一定要填2000年之前，因为如果是未成年人基本会被拒绝。其他的随便填写<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260112202020154.png" alt="image.png"></p><p>5.创建一个邮箱，一定要选择一个自己容易熟记的账号，建议是创建您自己的Gmail邮箱，账号名称使用<strong>自己姓名全拼+数字</strong>。账号名后面确定了之后就不能更改了，所以注册的时候一定要谨记。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260125004515592.png" alt="image.png"></p><p>6.根据提示设置密码，如果遇到验证手机号码，不用担心，正常验证就行，可以使用国内手机号。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260125113742947.png" alt="image.png"></p><p>7.到这里就基本注册好了。剩下的就是绑定你的邮箱和手机号，支持国内手机号。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260125004922325.png" alt="image.png"><br>地址设置请设置和你梯子所在位置的地址，网上搜索美国地址生成器去设置，这里不再赘述。</p><p><font color="#ff0000">申请成功后，未来一周内，不要登出！不要修改梯子节点！（重要的事情说3遍）</font><br><font color="#ff0000">申请成功后，未来一周内，不要登出！不要修改梯子节点！（重要的事情说3遍）</font><br><font color="#ff0000">申请成功后，未来一周内，不要登出！不要修改梯子节点！（重要的事情说3遍）</font></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>为了感谢各位好久以来的关注，我将发起抽奖送2个谷歌账号。</p><p>好了，以上就是今天给大家分享的内容，我是爱分享的小明同学，如果今天的内容对你有帮助请记得收藏，顺便点点关注，咱们下期再见！谢谢大家~</p>]]></content>
    
    
    <summary type="html">注册 Gmail 邮箱时绕过手机号验证的安卓端图文操作教程。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Gmail" scheme="https://xiaomingclassmate.com/tags/Gmail/"/>
    
    <category term="Google" scheme="https://xiaomingclassmate.com/tags/Google/"/>
    
    <category term="账号注册" scheme="https://xiaomingclassmate.com/tags/%E8%B4%A6%E5%8F%B7%E6%B3%A8%E5%86%8C/"/>
    
  </entry>
  
  <entry>
    <title>【好消息！】余额又回来了 ！ 接码平台 SMS-Activate 余额可以转移到新平台使用</title>
    <link href="https://xiaomingclassmate.com/posts/35016/"/>
    <id>https://xiaomingclassmate.com/posts/35016/</id>
    <published>2026-01-19T12:54:31.000Z</published>
    <updated>2026-11-08T12:57:10.047Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118230902842.png" alt="image.png"></p><p>之前SMS-Activate宣布自 12 月 29 日起，将停止运行，本来以为上面的钱会打水漂，没想到SMS-Activate 终于支持将旧余额无门槛转移到新平台了！虽然官方没有邮件通知，且官网存在 404 跳转 Bug，但我实测已经成功找回余额。文章中我将手把手教大家如何开启双因素验证、破解网页报错并提取“复活代码”，请大家务必赶在 1 月 29 日截止前操作，挽回损失！</p><p>废话不多说，下面开始操作。</p><h2 id="开启双因素验证"><a href="#开启双因素验证" class="headerlink" title="开启双因素验证"></a>开启双因素验证</h2><p>SMS-Activate目前的网址：<br><a href="https://sms-activate.ru/">https://sms-activate.ru/</a><br><a href="https://sms-activate.org/">https://sms-activate.org/</a><br><a href="https://sms-activate.guru/">https://sms-activate.guru/</a><br><a href="https://sms-activate.page/">https://sms-activate.page/</a><br><a href="https://sms-activate.world/">https://sms-activate.world/</a></p><p>进入网站，会出现一个弹出框，提示我们可以转移资金到新的平台，按照上面的提示操作。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118231438004.png" alt="image.png"></p><p>仅在启用双重身份验证的情况下才可进行提现。如未启用，请前往个人资料页面。</p><p>点击“获取促销代码”按钮后，将为您生成一个一次性代码。在 <a href="https://hero-sms.com/">HeroSMS</a> 网站上输入它以转移您的余额。</p><p>点击右上角的头像，点击总览。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118231931110.png" alt="image.png"><br>这个时候会报错<strong>Error 404 - Not Found</strong>，大家不要慌<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118232005479.png" alt="image.png"></p><p>将链接中的cn删掉后，地址为<code>https://sms-activate.ru/profile</code>，这个时候就可以看到我们的个人资料页面，点击下面的<strong>启用双因素验证</strong><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118233206205.png" alt="image.png"><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118233639417.png" alt="image.png"></p><p>这个时候需要我们下载谷歌身份验证器，然后登录谷歌身份验证器<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118233501491.png" alt="image.png"><br>点击有右下角的+，有2种方式大家任选其中一种方式即可<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118233747133.png" alt="image.png"><br>设置密钥就是下面的秘密密钥。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118234109829.png" alt="image.png"><br>接着往下翻，点击<strong>把代码发送到邮箱</strong>，这个邮件有可能会在垃圾邮件中，大家注意一下<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118234607478.png" alt="image.png"><br>输入谷歌身份验证器中的代码，点击<strong>添加双因素验证</strong>，然后会提示你已开启<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118235127317.png" alt="image.png"></p><h2 id="转移余额"><a href="#转移余额" class="headerlink" title="转移余额"></a>转移余额</h2><p>我们再到主页面，点击<strong>通过电子邮件接收代码</strong>，填入收到的验证码，接着输入谷歌身份验证器中的代码，最后点击<strong>获取促销代码</strong>，记住这个促销代码只会生成一次，记得及时保存。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260118235808401.png" alt="image.png"></p><p>接着登录<code>https://hero-sms.com/</code>，点击右上角的<strong>login</strong><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119000239981.png" alt="image.png"><br>选择注册Register，新注册一个账号<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119000520040.png" alt="image.png"><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119000725963.png" alt="image.png"></p><p>然后用新账号进行登录，这个时候可以看到我们的余额是0<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119000907395.png" alt="image.png"></p><p>点击有上角的头像，选择<strong>RedeeM Promocode</strong><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119001231776.png" alt="image.png"><br>输入我们上一步获取的促销代码，进行人机验证，点击Redeem<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119001508665.png" alt="image.png"><br>这样我们的余额就转移到新的平台了。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20260119001657276.png" alt="image.png"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>好了，以上就是今天给大家分享的内容，我是爱分享的小明同学，如果今天的内容对你有帮助请记得收藏，顺便点点关注，咱们下期再见！谢谢大家~</p>]]></content>
    
    
    <summary type="html">SMS-Activate 旧余额迁移到新平台的操作步骤与网页报错处理方法。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="SMS-Activate" scheme="https://xiaomingclassmate.com/tags/SMS-Activate/"/>
    
    <category term="接码平台" scheme="https://xiaomingclassmate.com/tags/%E6%8E%A5%E7%A0%81%E5%B9%B3%E5%8F%B0/"/>
    
    <category term="账号安全" scheme="https://xiaomingclassmate.com/tags/%E8%B4%A6%E5%8F%B7%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>别再本地 docker build 了！教你用 GitHub Actions 搭建全自动流水线，真香</title>
    <link href="https://xiaomingclassmate.com/posts/48128/"/>
    <id>https://xiaomingclassmate.com/posts/48128/</id>
    <published>2025-12-17T15:17:25.000Z</published>
    <updated>2026-11-08T13:33:32.126Z</updated>
    
    <content type="html"><![CDATA[<p>说实话，你是不是也经历过这种“垃圾时间”：</p><p>代码终于写完了，兴冲冲地在本地终端敲下 <code>docker build</code>，然后……</p><p>电脑风扇开始狂转，CPU 温度飙升，你甚至不敢切出去看视频，生怕卡顿。好不容易构建完了，还要 <code>docker push</code>，盯着那个慢吞吞的进度条，祈祷网络别断。</p><p>这一套流程下来，少说十几二十分钟没了。如果中间发现有个标点符号写错了？好家伙，推倒重来。</p><p><strong>这就叫“被工具玩了”，而不是“玩工具”。</strong></p><p>今天我要给大家安利一个我用了很久、相见恨晚的神器组合：<strong>GitHub Actions + Docker Hub</strong>。</p><p>简单说，就是把“构建”和“上传”这两件费时费力的事，从你的本地电脑，转移到 GitHub 的服务器上去做。</p><p>Github Action 是 Github 推出的一个<a href="https://so.csdn.net/so/search?q=%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90&spm=1001.2101.3001.7020">持续集成</a>和持续交付的平台，能够让你自动化你的编译、测试和部署流程。</p><p><strong>重点是：它完全免费，速度飞快，而且全自动。</strong></p><p>这就好比你写好菜谱（代码），不用自己进厨房（本地构建），直接把菜谱扔给微软请的免费大厨（GitHub Actions），他做好了直接端上桌（发布到 Docker Hub）。</p><p>怎么搞？我不整那些虚头巴脑的概念，直接上实操，保姆级教程，包教包会。</p><h4 id="第一步：准备好你的“菜谱”和“厨房”"><a href="#第一步：准备好你的“菜谱”和“厨房”" class="headerlink" title="第一步：准备好你的“菜谱”和“厨房”"></a>第一步：准备好你的“菜谱”和“厨房”</h4><p>首先，你得有个 GitHub 账号，和一个 Docker Hub 账号（存镜像的地方）。</p><p>在你的 GitHub 项目里，必须得有一个 <code>Dockerfile</code>。这个大家都懂，就是告诉机器怎么打包你的程序。</p><h4 id="第二步：把“钥匙”交给-GitHub（关键！）"><a href="#第二步：把“钥匙”交给-GitHub（关键！）" class="headerlink" title="第二步：把“钥匙”交给 GitHub（关键！）"></a>第二步：把“钥匙”交给 GitHub（关键！）</h4><p>这是很多新手最容易卡住的地方。</p><p>你要让 GitHub 帮你上传镜像，你得给它权限，但你肯定不能把密码直接写在代码里吧？那样全世界都看见了。</p><p><strong>正确做法是这样：</strong></p><p>1.打开你的 GitHub 仓库，点击 <code>Settings</code>（设置）。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217205434283.png" alt="image.png"></p><p>2.找到左侧的 <code>Secrets and variables</code> -&gt; <code>Actions</code>。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217205717234.png" alt="image.png"></p><p>3.点击 <code>New repository secret</code>。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217205817330.png" alt="image.png"></p><p>我们需要添加两个“暗号”：</p><ul><li><strong>DOCKER_USERNAME</strong>：填你的 Docker Hub 用户名。</li><li><strong>DOCKER_PASSWORD</strong>：填你的 Docker Hub 密码（或者 Access Token，建议用 Token 更安全）。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217210014953.png" alt="image.png"></p><p>这样，GitHub 就在后台悄悄记住了你的身份，别人看代码是绝对看不到的。</p><h4 id="第三步：告诉保姆“该干活了”"><a href="#第三步：告诉保姆“该干活了”" class="headerlink" title="第三步：告诉保姆“该干活了”"></a>第三步：告诉保姆“该干活了”</h4><p>接下来，我们要写一个脚本，告诉 GitHub：<strong>“嘿，只要我更新了代码，你就立刻帮我干活！”</strong></p><p>在你的项目根目录下，建立一个文件夹：<code>.github/workflows</code>（注意前面的点）。 在里面新建一个文件，名字随便取，比如 <code>docker-publish.yml</code>。</p><p>复制下面这段代码进去（虽然是代码，但很好懂，我加了人话注释）：</p><p>YAML</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></pre></td><td class="code"><pre><span class="line">name: Build and Push Docker Image</span><br><span class="line"></span><br><span class="line">on:</span><br><span class="line">  push:</span><br><span class="line">    branches: [ master ] # 构建的分支，可以根据需要修改</span><br><span class="line">  pull_request:</span><br><span class="line">    branches: [ master ] # 触发构建的分支，可以根据需要修改</span><br><span class="line">  workflow_dispatch: # 添加 workflow_dispatch 事件，支持手动触发</span><br><span class="line"></span><br><span class="line">jobs:</span><br><span class="line">  build:</span><br><span class="line">    name: Push Docker image to multiple registries</span><br><span class="line">    runs-on: ubuntu-latest</span><br><span class="line">    # 显式声明权限，遵循最小权限原则</span><br><span class="line">    permissions:</span><br><span class="line">      packages: write # 推送镜像到 GHCR</span><br><span class="line">      contents: read  # 读取源码</span><br><span class="line">      attestations: write # 写入构建证明</span><br><span class="line">      id-token: write # OIDC 认证，用于签名</span><br><span class="line">    steps:</span><br><span class="line">      # 1. 检出代码</span><br><span class="line">      - name: Check out the repo</span><br><span class="line">        uses: actions/checkout@v4</span><br><span class="line">  # 2. 安装 QEMU (支持 ARM64 等多架构)</span><br><span class="line">      - name: Set up QEMU</span><br><span class="line">        uses: docker/setup-qemu-action@v3</span><br><span class="line">      # 3. 初始化 Buildx (使用 docker-container 驱动)</span><br><span class="line">      - name: Set up Docker Buildx</span><br><span class="line">        uses: docker/setup-buildx-action@v3</span><br><span class="line">  # 4. 登录 Docker Hub</span><br><span class="line">      - name: Log in to Docker Hub</span><br><span class="line">        uses: docker/login-action@v3</span><br><span class="line">        with:</span><br><span class="line">          username: $&#123;&#123; secrets.DOCKER_USERNAME &#125;&#125;</span><br><span class="line">          password: $&#123;&#123; secrets.DOCKER_PASSWORD &#125;&#125;</span><br><span class="line">      # 5. 登录 Registry</span><br><span class="line">      - name: Log in to the Container registry</span><br><span class="line">        uses: docker/login-action@v3</span><br><span class="line">        with:</span><br><span class="line">          registry: ghcr.io</span><br><span class="line">          username: $&#123;&#123; github.actor &#125;&#125;</span><br><span class="line">          password: $&#123;&#123; secrets.GITHUB_TOKEN &#125;&#125;</span><br><span class="line">      # 6. 生成元数据 (Tags &amp; Labels)</span><br><span class="line">      - name: Extract metadata (tags, labels) for Docker</span><br><span class="line">        id: meta</span><br><span class="line">        uses: docker/metadata-action@v5</span><br><span class="line">        with:</span><br><span class="line">          images: |</span><br><span class="line">            jumploop/webssh # Docker Hub仓库名称</span><br><span class="line">            ghcr.io/$&#123;&#123; github.repository &#125;&#125;</span><br><span class="line">          tags: |</span><br><span class="line">            latest</span><br><span class="line">            $&#123;&#123; github.sha &#125;&#125;</span><br><span class="line">      # 7. 构建并推送 (核心步骤)</span><br><span class="line">      - name: Build and push Docker images</span><br><span class="line">        id: push</span><br><span class="line">        uses: docker/build-push-action@v6</span><br><span class="line">        with:</span><br><span class="line">          context: .</span><br><span class="line">          file: ./Dockerfile</span><br><span class="line">          push: true</span><br><span class="line">          platforms: linux/amd64,linux/arm64</span><br><span class="line">          tags: $&#123;&#123; steps.meta.outputs.tags &#125;&#125;</span><br><span class="line">          labels: $&#123;&#123; steps.meta.outputs.labels &#125;&#125;</span><br><span class="line">      # 8. 镜像签名与证明 (增强安全性)</span><br><span class="line">      - name: Generate artifact attestation</span><br><span class="line">        uses: actions/attest-build-provenance@v2</span><br><span class="line">        with:</span><br><span class="line">          subject-name: ghcr.io/$&#123;&#123; github.repository &#125;&#125;</span><br><span class="line">          subject-digest: $&#123;&#123; steps.push.outputs.digest &#125;&#125;</span><br><span class="line">          push-to-registry: true</span><br></pre></td></tr></table></figure><h4 id="第四步：见证奇迹"><a href="#第四步：见证奇迹" class="headerlink" title="第四步：见证奇迹"></a>第四步：见证奇迹</h4><p>保存，提交代码，Push 到 GitHub。</p><p>现在，你可以关掉终端，去倒杯咖啡，或者刷刷手机。</p><p>打开 GitHub 仓库的 <code>Actions</code> 标签页，你会看到一个小绿点在转圈。点进去，你会发现 GitHub 的服务器正在疯狂为你通过云端宽带拉取依赖、编译代码。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217210832747.png" alt="image.png"><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217210923413.png" alt="image.png"></p><p><strong>通常几分钟后，那个圈圈变成绿色的对号。</strong><br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217211015336.png" alt="image.png"></p><p>这时候你去 Docker Hub 刷新一下，崭新的镜像已经躺在那儿了。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20251217211126292.png" alt="image.png"></p><h4 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h4><p>为什么要折腾这个？</p><p>除了省电省网费，更重要的是它能让你<strong>养成“自动化”的思维</strong>。</p><p>以后无论你在哪里，用着多烂的电脑，甚至是用 iPad 写代码，只要你把代码往 GitHub 一推，云端的流水线就开始自动运转。</p><p>等哪天服务器挂了，你只需要一条拉取命令就能恢复，而不是满头大汗地在本地重新打包。</p><p><strong>把重复的工作交给机器，把时间留给自己。</strong> 这才是程序员该有的“偷懒”方式。</p><p>趁热打铁，现在就去给你的项目加个 Actions 吧，那种看着绿灯自动亮起的感觉，真的很爽。</p>]]></content>
    
    
    <summary type="html">GitHub Actions + Docker Hub 自动化构建与推送教程：配置 Secrets、多架构 Buildx、GHCR、镜像签名和触发规则。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Docker" scheme="https://xiaomingclassmate.com/tags/Docker/"/>
    
    <category term="GitHub Actions" scheme="https://xiaomingclassmate.com/tags/GitHub-Actions/"/>
    
    <category term="Docker Hub" scheme="https://xiaomingclassmate.com/tags/Docker-Hub/"/>
    
    <category term="CI/CD" scheme="https://xiaomingclassmate.com/tags/CI-CD/"/>
    
    <category term="自动化" scheme="https://xiaomingclassmate.com/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Python开发者看过来！还在为“龟速”安装包抓狂？这个“定制版”神器让你飞起来！</title>
    <link href="https://xiaomingclassmate.com/posts/16661/"/>
    <id>https://xiaomingclassmate.com/posts/16661/</id>
    <published>2025-08-24T04:45:21.000Z</published>
    <updated>2026-11-08T12:57:17.707Z</updated>
    
    <content type="html"><![CDATA[<p>如果你已经用过 <code>uv</code>，应该体会过它带来的包管理速度提升。但对国内用户来说，安装 <code>uv</code> 本体、下载 Python 或访问 PyPI 时仍可能被网络链路拖慢。</p><p><strong>uv-custom</strong> 是一个为国内用户准备的 <code>uv</code> 加速镜像项目，提供安装脚本，并可配置下载代理、PyPI 镜像和 Python 构建镜像。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250822001814601.png" alt="uv-custom"></p><p>项目地址：</p><ul><li>Gitee：<a href="https://gitee.com/jumploop/uv-custom">https://gitee.com/jumploop/uv-custom</a></li><li>GitHub：<a href="https://github.com/jumploop/uv-custom">https://github.com/jumploop/uv-custom</a></li></ul><blockquote><p><strong>版本提示：</strong> 本文截图、安装脚本和示例版本来自 2025 年 8 月。使用前请查看项目最新 Release 和 README，确认脚本地址、镜像地址和受支持的 uv 版本。</p></blockquote><h2 id="一、uv-custom-解决什么问题"><a href="#一、uv-custom-解决什么问题" class="headerlink" title="一、uv-custom 解决什么问题"></a>一、uv-custom 解决什么问题</h2><p>官方 <code>uv</code> 很快，但国内网络可能遇到三类瓶颈：</p><ol><li>从 GitHub 下载 <code>uv</code> 安装包较慢；</li><li>下载 Python 解释器较慢；</li><li>访问官方 PyPI 源不稳定。</li></ol><p><code>uv-custom</code> 提供国内可访问的安装入口，并可自动配置镜像，减少网络问题。</p><h2 id="二、快速安装"><a href="#二、快速安装" class="headerlink" title="二、快速安装"></a>二、快速安装</h2><p>进入 Gitee Release 页面：</p><p><a href="https://gitee.com/jumploop/uv-custom/releases">https://gitee.com/jumploop/uv-custom/releases</a></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250822001645573.png" alt="uv-custom Release"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250822001708764.png" alt="选择安装脚本"></p><h3 id="macOS-Linux"><a href="#macOS-Linux" class="headerlink" title="macOS &#x2F; Linux"></a>macOS &#x2F; Linux</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -LsSf https://gitee.com/jumploop/uv-custom/releases/download/latest/uv-installer-custom.sh | sh</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250824012405468.png" alt="安装 uv-custom"></p><h3 id="Windows-PowerShell"><a href="#Windows-PowerShell" class="headerlink" title="Windows PowerShell"></a>Windows PowerShell</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell <span class="literal">-ExecutionPolicy</span> Bypass <span class="literal">-c</span> <span class="string">&quot;irm https://gitee.com/jumploop/uv-custom/releases/download/latest/uv-installer-custom.ps1 | iex&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250824121256820.png" alt="PowerShell 安装 uv-custom"></p><p>安装前建议先打开脚本地址查看内容，确认地址可信。</p><h2 id="三、自定义镜像和版本"><a href="#三、自定义镜像和版本" class="headerlink" title="三、自定义镜像和版本"></a>三、自定义镜像和版本</h2><p>可以在运行安装命令前设置环境变量：</p><table><thead><tr><th>变量</th><th>用途</th><th>示例</th></tr></thead><tbody><tr><td><code>UV_DOWNLOAD_PROXY</code></td><td>下载代理</td><td><code>https://gh-proxy.com</code></td></tr><tr><td><code>UV_PYPI_MIRROR</code></td><td>PyPI 镜像</td><td><code>https://mirrors.aliyun.com/pypi/simple/</code></td></tr><tr><td><code>UV_VERSION</code></td><td>指定 uv 版本</td><td><code>0.7.19</code></td></tr></tbody></table><h3 id="macOS-Linux-示例"><a href="#macOS-Linux-示例" class="headerlink" title="macOS &#x2F; Linux 示例"></a>macOS &#x2F; Linux 示例</h3><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></pre></td><td class="code"><pre><span class="line">export UV_DOWNLOAD_PROXY=&quot;https://gh-proxy.com&quot;</span><br><span class="line">export UV_PYPI_MIRROR=&quot;https://mirrors.aliyun.com/pypi/simple/&quot;</span><br><span class="line">export UV_VERSION=&quot;0.7.19&quot;</span><br><span class="line"></span><br><span class="line">curl -LsSf https://gitee.com/jumploop/uv-custom/releases/download/latest/uv-installer-custom.sh | sh</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250824011041014.png" alt="自定义镜像安装"></p><h3 id="Windows-PowerShell-示例"><a href="#Windows-PowerShell-示例" class="headerlink" title="Windows PowerShell 示例"></a>Windows PowerShell 示例</h3><figure class="highlight powershell"><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><span class="line"><span class="variable">$env:UV_DOWNLOAD_PROXY</span>=<span class="string">&quot;https://gh-proxy.com&quot;</span></span><br><span class="line"><span class="variable">$env:UV_PYPI_MIRROR</span>=<span class="string">&quot;https://mirrors.aliyun.com/pypi/simple/&quot;</span></span><br><span class="line"><span class="variable">$env:UV_VERSION</span>=<span class="string">&quot;0.7.19&quot;</span></span><br><span class="line"></span><br><span class="line">powershell <span class="literal">-ExecutionPolicy</span> Bypass <span class="literal">-c</span> <span class="string">&quot;irm https://gitee.com/jumploop/uv-custom/releases/download/latest/uv-installer-custom.ps1 | iex&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250824011553412.png" alt="PowerShell 自定义镜像安装"></p><h2 id="四、验证安装"><a href="#四、验证安装" class="headerlink" title="四、验证安装"></a>四、验证安装</h2><p>安装后重新打开终端，执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv --version</span><br></pre></td></tr></table></figure><p>如果输出版本号，说明安装成功。之后可以继续使用 <code>uv pip install</code>、<code>uv venv</code>、<code>uv python install</code> 等命令。</p><h2 id="五、供应链安全提醒"><a href="#五、供应链安全提醒" class="headerlink" title="五、供应链安全提醒"></a>五、供应链安全提醒</h2><p>安装脚本和镜像会改变下载来源，请注意：</p><ol><li>只使用你信任的 Gitee、GitHub、学校或企业镜像；</li><li>不要把陌生代理地址写进全局配置；</li><li>敏感项目建议在隔离环境中测试；</li><li>如果公司有统一网络策略，先确认镜像和代理是否允许使用。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><code>uv-custom</code> 适合被国内网络环境卡住的用户。它能加速 <code>uv</code> 和 Python 的安装，并简化 PyPI 镜像配置。使用前请查看项目最新说明，避免用过时的脚本地址或版本参数。</p>]]></content>
    
    
    <summary type="html">uv-custom 国内加速安装教程：使用 Gitee 安装脚本下载 uv，自定义下载代理、PyPI 镜像和 uv 版本，并说明供应链安全注意事项。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="开发效率" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    <category term="uv" scheme="https://xiaomingclassmate.com/tags/uv/"/>
    
    <category term="Python" scheme="https://xiaomingclassmate.com/tags/Python/"/>
    
    <category term="镜像源" scheme="https://xiaomingclassmate.com/tags/%E9%95%9C%E5%83%8F%E6%BA%90/"/>
    
    <category term="uv-custom" scheme="https://xiaomingclassmate.com/tags/uv-custom/"/>
    
  </entry>
  
  <entry>
    <title>别再忍了！uv 下载慢如龟速？一招配置国内镜像，让你的 Python 体验坐上火箭！</title>
    <link href="https://xiaomingclassmate.com/posts/35791/"/>
    <id>https://xiaomingclassmate.com/posts/35791/</id>
    <published>2025-07-16T13:05:49.000Z</published>
    <updated>2026-11-08T12:57:16.203Z</updated>
    
    <content type="html"><![CDATA[<p>最近很多 Python 开发者都在试用 <code>uv</code>。它用 Rust 编写，依赖解析和缓存很快，但如果你直接执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip install pandas</span><br></pre></td></tr></table></figure><p>仍可能看到下载进度缓慢。问题通常不在 <code>uv</code>，而在默认 PyPI 源到本地网络之间的链路。</p><blockquote><p><strong>版本提示：</strong> 本文截图和命令来自 2025 年 7 月。uv 的配置项可能随版本调整，操作前请先查看当前版本文档。</p></blockquote><h2 id="慢在哪里？"><a href="#慢在哪里？" class="headerlink" title="慢在哪里？"></a>慢在哪里？</h2><p><code>uv</code> 的优势主要体现在依赖解析、并行下载、缓存和本地安装流程。但它下载包时依然要走网络。</p><p>默认情况下，<code>uv</code> 与 <code>pip</code> 一样从官方 PyPI 下载包。国内访问官方源时可能较慢，这时 uv 再快，也会被网络链路拖住。</p><p>解决思路很简单：把包索引切换到国内镜像，例如清华 TUNA、阿里云等。</p><h2 id="方式一：临时指定镜像"><a href="#方式一：临时指定镜像" class="headerlink" title="方式一：临时指定镜像"></a>方式一：临时指定镜像</h2><p>适合偶尔使用或测试镜像效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip install numpy --default-index https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716192806876.png" alt="临时使用镜像安装"></p><p><code>--default-index</code> 指定默认包索引。它只影响当前命令，适合验证镜像是否可用。</p><h2 id="方式二：配置环境变量"><a href="#方式二：配置环境变量" class="headerlink" title="方式二：配置环境变量"></a>方式二：配置环境变量</h2><p>这是个人环境中最省事的方式：设置 <code>UV_DEFAULT_INDEX</code>，让后续命令默认使用镜像。</p><h3 id="macOS-Linux"><a href="#macOS-Linux" class="headerlink" title="macOS &#x2F; Linux"></a>macOS &#x2F; Linux</h3><p>以 Bash 为例：</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><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export UV_DEFAULT_INDEX=&quot;https://pypi.tuna.tsinghua.edu.cn/simple&quot;&#x27;</span> &gt;&gt; ~/.bashrc</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><p>如果使用 zsh，请把配置写入 <code>~/.zshrc</code>。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716194546906.png" alt="配置 shell 环境变量"></p><h3 id="Windows-PowerShell"><a href="#Windows-PowerShell" class="headerlink" title="Windows PowerShell"></a>Windows PowerShell</h3><p>只在当前窗口生效：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$env:UV_DEFAULT_INDEX</span> = <span class="string">&quot;https://pypi.tuna.tsinghua.edu.cn/simple&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716195913631.png" alt="PowerShell 临时设置环境变量"></p><p>永久生效可以添加用户环境变量：</p><ol><li>右键“此电脑”，进入 <strong>属性 → 高级系统设置 → 环境变量</strong>；</li><li>新建用户变量；</li><li>变量名：<code>UV_DEFAULT_INDEX</code>；</li><li>变量值：<code>https://pypi.tuna.tsinghua.edu.cn/simple</code>；</li><li>保存后重新打开终端。</li></ol><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716195052379.png" alt="Windows 环境变量设置"></p><p>也可以在 PowerShell 中执行：</p><figure class="highlight powershell"><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><span class="line">[<span class="type">Environment</span>]::SetEnvironmentVariable(</span><br><span class="line">  <span class="string">&quot;UV_DEFAULT_INDEX&quot;</span>,</span><br><span class="line">  <span class="string">&quot;https://pypi.tuna.tsinghua.edu.cn/simple&quot;</span>,</span><br><span class="line">  <span class="string">&quot;User&quot;</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>执行后重新打开终端即可。</p><h2 id="方式三：项目级配置"><a href="#方式三：项目级配置" class="headerlink" title="方式三：项目级配置"></a>方式三：项目级配置</h2><p>如果希望整个团队使用同一个索引，可以把配置写入项目根目录的 <code>pyproject.toml</code>：</p><figure class="highlight toml"><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><span class="line"><span class="section">[[tool.uv.index]]</span></span><br><span class="line"><span class="attr">url</span> = <span class="string">&quot;https://pypi.tuna.tsinghua.edu.cn/simple&quot;</span></span><br><span class="line"><span class="attr">default</span> = <span class="literal">true</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716200948998.png" alt="pyproject.toml 配置 uv 镜像"></p><p>项目级配置便于统一团队环境，也适合私有索引或特定发行版源。</p><h2 id="验证是否生效"><a href="#验证是否生效" class="headerlink" title="验证是否生效"></a>验证是否生效</h2><p>安装任意包并打开详细日志：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip install -v requests</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250716201103705.png" alt="查看 uv 详细下载日志"></p><p>如果日志里出现 <code>pypi.tuna.tsinghua.edu.cn</code>，而不是 <code>pypi.org</code>，说明镜像配置已生效。</p><h2 id="镜像选择和安全提示"><a href="#镜像选择和安全提示" class="headerlink" title="镜像选择和安全提示"></a>镜像选择和安全提示</h2><ul><li>清华源：<code>https://pypi.tuna.tsinghua.edu.cn/simple</code></li><li>阿里源：<code>https://mirrors.aliyun.com/pypi/simple/</code></li></ul><p>镜像源会同步 PyPI 包，但同步可能存在延迟。如果某个包刚发布，官方源可能比镜像更早可用。</p><p>不要随意使用来历不明的镜像。包索引是供应链安全的关键入口，个人环境也建议只使用学校、企业或云厂商等可信镜像。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li>临时使用：命令行加 <code>--default-index</code>；</li><li>个人默认：配置 <code>UV_DEFAULT_INDEX</code>；</li><li>团队统一：写入 <code>pyproject.toml</code>；</li><li>配好后用 <code>uv pip install -v requests</code> 检查实际下载源。</li></ul><p>把网络这一环解决掉，uv 的速度优势才能真正发挥出来。</p>]]></content>
    
    
    <summary type="html">UV 国内镜像配置教程：使用 --default-index、UV_DEFAULT_INDEX 环境变量和 pyproject.toml 配置清华源，并验证 uv 实际下载地址。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="开发效率" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    <category term="uv" scheme="https://xiaomingclassmate.com/tags/uv/"/>
    
    <category term="Python" scheme="https://xiaomingclassmate.com/tags/Python/"/>
    
    <category term="pip" scheme="https://xiaomingclassmate.com/tags/pip/"/>
    
    <category term="镜像源" scheme="https://xiaomingclassmate.com/tags/%E9%95%9C%E5%83%8F%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>告别 Pip 痛点！UV：新一代 Python 包管理神器，速度快到飞起！</title>
    <link href="https://xiaomingclassmate.com/posts/24680/"/>
    <id>https://xiaomingclassmate.com/posts/24680/</id>
    <published>2025-07-12T05:34:20.000Z</published>
    <updated>2026-11-08T12:57:19.639Z</updated>
    
    <content type="html"><![CDATA[<p>你是否也被 Pip 的慢速安装、复杂依赖和频繁报错折磨过？在 Python 开发中，包管理绕不开，但传统工具链经常让人爱恨交加。</p><p><strong>UV</strong> 是 Astral 推出的新一代 Python 包管理工具。它用 Rust 编写，主打更快的安装速度、更可靠的依赖解析，以及覆盖虚拟环境、Python 版本和项目管理的完整工作流。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250610121153052.png" alt="UV 项目介绍"></p><blockquote><p><strong>版本提示：</strong> 本文截图和命令来自 2025 年 7 月，uv 功能迭代较快。请使用官方最新稳定版，并以官方文档为准。</p></blockquote><h2 id="什么是-UV？"><a href="#什么是-UV？" class="headerlink" title="什么是 UV？"></a>什么是 UV？</h2><p>UV 由 Astral 团队开发，目标是为 Python 提供 <strong>更快、更可靠、更易用</strong> 的包管理体验。</p><p>它不是简单包装 Pip，而是重新实现了包解析、下载、缓存和虚拟环境管理等核心流程。官方宣传在常见场景中可比传统工具快 10 到 100 倍，并试图用 <code>uv</code> 覆盖 <code>pip</code>、<code>pip-tools</code>、<code>pipx</code>、<code>poetry</code>、<code>pyenv</code>、<code>virtualenv</code> 等工具的常见使用场景。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250610121706397.png" alt="UV 性能对比"></p><p>项目地址：<a href="https://github.com/astral-sh/uv">https://github.com/astral-sh/uv</a></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712124430165.png" alt="UV GitHub 仓库"></p><p>官方文档：<a href="https://docs.astral.sh/uv">https://docs.astral.sh/uv</a></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712125244039.png" alt="UV 官方文档"></p><p>中文文档：<a href="https://hellowac.github.io/uv-zh-cn/">https://hellowac.github.io/uv-zh-cn/</a></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712125546937.png" alt="UV 中文文档"></p><h2 id="为什么选择-UV？"><a href="#为什么选择-UV？" class="headerlink" title="为什么选择 UV？"></a>为什么选择 UV？</h2><ol><li><p><strong>速度快</strong></p><ul><li>并行下载、全局缓存和 Rust 实现让依赖安装明显提速；</li><li>项目越大、依赖越复杂，收益通常越明显。</li></ul></li><li><p><strong>上手成本低</strong></p><ul><li><code>uv pip</code> 命令与 <code>pip</code> 大致相似；</li><li>现有 <code>requirements.txt</code> 可以直接迁移。</li></ul></li><li><p><strong>依赖解析更强</strong></p><ul><li>提供确定性锁定和同步能力，减少版本冲突；</li><li>支持项目级 <code>pyproject.toml</code> 和锁文件。</li></ul></li><li><p><strong>工具链整合</strong></p><ul><li>一个命令即可管理虚拟环境、Python 版本、项目依赖、脚本运行和构建发布。</li></ul></li><li><p><strong>跨平台</strong></p><ul><li>支持 macOS、Linux 和 Windows。</li></ul></li></ol><h2 id="安装-UV"><a href="#安装-UV" class="headerlink" title="安装 UV"></a>安装 UV</h2><h3 id="方式一：官方安装脚本"><a href="#方式一：官方安装脚本" class="headerlink" title="方式一：官方安装脚本"></a>方式一：官方安装脚本</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">macOS / Linux</span></span><br><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Windows PowerShell</span></span><br><span class="line">powershell -ExecutionPolicy ByPass -c &quot;irm https://astral.sh/uv/install.ps1 | iex&quot;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250610234214000.png" alt="使用官方脚本安装 UV"></p><h3 id="方式二：从-PyPI-安装"><a href="#方式二：从-PyPI-安装" class="headerlink" title="方式二：从 PyPI 安装"></a>方式二：从 PyPI 安装</h3><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><span class="line">pip install uv</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">或</span></span><br><span class="line">pipx install uv</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250610123528134.png" alt="从 PyPI 安装 UV"></p><p>官方安装脚本安装的 uv 可以自更新：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv self update</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250610123549420.png" alt="更新 UV"></p><h2 id="快速上手"><a href="#快速上手" class="headerlink" title="快速上手"></a>快速上手</h2><h3 id="创建虚拟环境"><a href="#创建虚拟环境" class="headerlink" title="创建虚拟环境"></a>创建虚拟环境</h3><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><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 默认创建 .venv</span></span><br><span class="line">uv venv</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定 Python 版本</span></span><br><span class="line">uv venv -p 3.10</span><br><span class="line"></span><br><span class="line"><span class="comment"># macOS / Linux 激活</span></span><br><span class="line"><span class="built_in">source</span> .venv/bin/activate</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows 激活</span></span><br><span class="line">.venv\Scripts\activate</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">uv pip install fastapi <span class="string">&quot;uvicorn[standard]&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712122233193.png" alt="创建虚拟环境并安装依赖"></p><h3 id="使用-uv-pip"><a href="#使用-uv-pip" class="headerlink" title="使用 uv pip"></a>使用 uv pip</h3><p><code>uv pip</code> 提供与 pip 相似的使用方式：</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><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">uv pip install fastapi</span><br><span class="line">uv pip install <span class="string">&quot;uvicorn[standard]&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 升级包</span></span><br><span class="line">uv pip install -U requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从 requirements.txt 安装</span></span><br><span class="line">uv pip install -r requirements.txt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载包</span></span><br><span class="line">uv pip uninstall fastapi</span><br></pre></td></tr></table></figure><h2 id="依赖锁定与同步"><a href="#依赖锁定与同步" class="headerlink" title="依赖锁定与同步"></a>依赖锁定与同步</h2><p>UV 也整合了 pip-tools 常用的依赖编译能力。</p><p>创建 <code>requirements.in</code>：</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><span class="line">requests</span><br><span class="line">httpx</span><br></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><span class="line">uv pip compile requirements.in -o requirements.txt</span><br></pre></td></tr></table></figure><p>常用参数：</p><ul><li><code>--upgrade</code>：尽量升级到最新可用版本；</li><li><code>--resolution=lowest</code>：锁定最低兼容版本。</li></ul><p>同步环境：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip <span class="built_in">sync</span> requirements.txt</span><br></pre></td></tr></table></figure><p><code>sync</code> 会按锁定文件安装依赖，并卸载环境中多余的包，适合需要严格一致环境的场景。</p><h2 id="管理-Python-版本"><a href="#管理-Python-版本" class="headerlink" title="管理 Python 版本"></a>管理 Python 版本</h2><p>常用命令：</p><ul><li><code>uv python install</code>：安装 Python 版本；</li><li><code>uv python list</code>：查看可用版本；</li><li><code>uv python find</code>：查找已安装版本；</li><li><code>uv python pin</code>：为项目固定 Python 版本；</li><li><code>uv python uninstall</code>：卸载版本。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712130957684.png" alt="UV 管理 Python 版本"></p><h2 id="运行脚本和管理项目"><a href="#运行脚本和管理项目" class="headerlink" title="运行脚本和管理项目"></a>运行脚本和管理项目</h2><p>脚本相关命令：</p><ul><li><code>uv run</code>：在对应环境中运行脚本；</li><li><code>uv add --script</code>：为脚本添加依赖；</li><li><code>uv remove --script</code>：移除脚本依赖。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712131049904.png" alt="UV 脚本依赖"></p><p>项目相关命令：</p><ul><li><code>uv init</code>：创建项目；</li><li><code>uv add</code>：添加依赖；</li><li><code>uv remove</code>：移除依赖；</li><li><code>uv sync</code>：同步项目环境；</li><li><code>uv lock</code>：更新锁文件；</li><li><code>uv tree</code>：查看依赖树；</li><li><code>uv build</code>：构建分发包；</li><li><code>uv publish</code>：发布到包索引。</li></ul><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><span class="line">uv init hello-world</span><br><span class="line"><span class="built_in">cd</span> hello-world</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712131452832.png" alt="uv init 生成的项目文件"></p><p>运行示例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv run</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712131636323.png" alt="运行 Hello World"></p><p>生成的 <code>pyproject.toml</code> 类似如下：</p><figure class="highlight toml"><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></pre></td><td class="code"><pre><span class="line"><span class="section">[project]</span></span><br><span class="line"><span class="attr">name</span> = <span class="string">&quot;hello-world&quot;</span></span><br><span class="line"><span class="attr">version</span> = <span class="string">&quot;0.1.0&quot;</span></span><br><span class="line"><span class="attr">description</span> = <span class="string">&quot;Add your description here&quot;</span></span><br><span class="line"><span class="attr">readme</span> = <span class="string">&quot;README.md&quot;</span></span><br><span class="line"><span class="attr">requires-python</span> = <span class="string">&quot;&gt;=3.10&quot;</span></span><br><span class="line"><span class="attr">dependencies</span> = []</span><br></pre></td></tr></table></figure><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><span class="line">uv add requests</span><br><span class="line">uv remove requests</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250712132732421.png" alt="uv add 管理项目依赖"></p><h2 id="迁移建议"><a href="#迁移建议" class="headerlink" title="迁移建议"></a>迁移建议</h2><ul><li>先在普通项目中试用 <code>uv pip install -r requirements.txt</code>，确认依赖能正常解析；</li><li>团队项目建议逐步迁移到 <code>pyproject.toml</code> 和锁文件；</li><li>不要在未验证的情况下直接替换生产环境构建脚本；</li><li>如果依赖私有索引，先确认 uv 的索引配置与认证方式。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>UV 把速度、依赖解析、虚拟环境、Python 版本管理和项目工作流整合到一个工具中，确实能减少 Python 项目日常管理的摩擦。</p><p>如果你还在忍受 Pip 的慢速安装和复杂依赖，建议先在个人项目里试一试 UV。</p>]]></content>
    
    
    <summary type="html">UV Python 包管理器入门：安装 uv、创建虚拟环境、使用 uv pip、锁定依赖、管理 Python 版本和项目工作流，并说明迁移注意事项。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="开发效率" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    <category term="uv" scheme="https://xiaomingclassmate.com/tags/uv/"/>
    
    <category term="Python" scheme="https://xiaomingclassmate.com/tags/Python/"/>
    
    <category term="pip" scheme="https://xiaomingclassmate.com/tags/pip/"/>
    
    <category term="包管理" scheme="https://xiaomingclassmate.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>it-tools：程序员的瑞士军刀，你的在线工具箱！</title>
    <link href="https://xiaomingclassmate.com/posts/42618/"/>
    <id>https://xiaomingclassmate.com/posts/42618/</id>
    <published>2025-05-22T03:49:37.000Z</published>
    <updated>2026-11-08T12:56:44.727Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250521211814163.png" alt="it-tools 在线工具箱"></p><p>写代码时经常需要临时处理 JSON、Base64、URL 编码、时间戳或哈希值。如果每次都打开不同网站，不仅麻烦，还可能把敏感数据交给不可信的在线服务。</p><p><strong>it-tools</strong> 把大量常用开发工具集中在一个界面中，既可以直接访问公开站点，也可以用自己的服务器或 NAS 部署。它就像一个程序员专用的“瑞士军刀”。</p><blockquote><p>**版本提示：**文中截图和 Docker 示例来自 2025 年 5 月，软件界面和镜像版本可能已经变化。请使用官方最新稳定版，并以项目文档和实际界面为准。生产环境不建议长期使用 <code>latest</code>，应固定具体版本并定期升级。</p></blockquote><p>项目地址：<a href="https://github.com/CorentinTh/it-tools">https://github.com/CorentinTh/it-tools</a></p><h2 id="一、it-tools-的核心功能"><a href="#一、it-tools-的核心功能" class="headerlink" title="一、it-tools 的核心功能"></a>一、it-tools 的核心功能</h2><ul><li><strong>JSON 格式化</strong>：格式化、压缩和校验 JSON；</li><li><strong>Base64 编码&#x2F;解码</strong>：处理接口参数和文本数据；</li><li><strong>URL 编码&#x2F;解码</strong>：处理中文、空格和特殊字符；</li><li><strong>时间戳转换</strong>：在 Unix 时间戳和日期时间之间转换；</li><li><strong>哈希计算</strong>：生成 MD5、SHA-1、SHA-256 等摘要；</li><li><strong>UUID 生成</strong>：生成测试数据或唯一标识；</li><li><strong>文本比较</strong>：查看两段文本的差异；</li><li><strong>二维码生成</strong>：把 URL 或文本生成二维码；</li><li><strong>颜色转换</strong>：查看 RGB、HEX 等颜色值；</li><li><strong>Markdown 预览</strong>：在线编辑和预览 Markdown；</li><li><strong>网络与开发辅助</strong>：IPv4 子网计算、Crontab 表达式、HTML 编码等。</li></ul><p>哈希值主要用于数据校验和内容摘要，不是加密，也不能用来保护密码或敏感数据。</p><h2 id="二、it-tools-的优势"><a href="#二、it-tools-的优势" class="headerlink" title="二、it-tools 的优势"></a>二、it-tools 的优势</h2><ul><li><strong>工具集中</strong>：不用在多个小网站之间来回切换；</li><li><strong>开源可自建</strong>：可以部署在自己的服务器或 NAS；</li><li><strong>界面简洁</strong>：功能分类清楚，搜索后直接使用；</li><li><strong>跨平台</strong>：有浏览器即可，不依赖特定操作系统；</li><li><strong>适合内网</strong>：自建后可在局域网中使用，减少外网依赖。</li></ul><p>公开在线版适合普通格式转换和临时测试。涉及密钥、客户资料、内部配置或未公开代码时，优先使用自建实例，并确认服务是否在本地处理数据。</p><h2 id="三、直接使用在线版"><a href="#三、直接使用在线版" class="headerlink" title="三、直接使用在线版"></a>三、直接使用在线版</h2><p>打开：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://it-tools.tech/</span><br></pre></td></tr></table></figure><p>选择需要的工具，输入或粘贴内容，即可查看处理结果。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250521213817378.png" alt="it-tools 工具列表"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250521213932311.png" alt="it-tools JSON 格式化工具"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250521214152317.png" alt="it-tools 时间戳转换工具"></p><p>如果公开站点访问慢、无法访问，或者不希望数据经过外部网站，可以自行部署。</p><h2 id="四、使用-Docker-部署"><a href="#四、使用-Docker-部署" class="headerlink" title="四、使用 Docker 部署"></a>四、使用 Docker 部署</h2><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></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line">  --name it-tools \</span><br><span class="line">  --restart unless-stopped \</span><br><span class="line">  -p 8080:80 \</span><br><span class="line">  corentinth/it-tools:latest</span><br></pre></td></tr></table></figure><p>然后访问：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://服务器IP:8080</span><br></pre></td></tr></table></figure><p>这只是快速测试命令。长期使用时，建议到项目的 Releases 或镜像页面查找具体版本号，把 <code>latest</code> 替换成固定版本，避免某次自动更新后界面或功能发生变化。</p><h2 id="五、使用-Docker-Compose-部署"><a href="#五、使用-Docker-Compose-部署" class="headerlink" title="五、使用 Docker Compose 部署"></a>五、使用 Docker Compose 部署</h2><p>创建 <code>docker-compose.yml</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></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">it-tools:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">corentinth/it-tools:latest</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;8082:80&quot;</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">it-tools</span></span><br></pre></td></tr></table></figure><p>如果 <code>8082</code> 已被占用，改成其他未使用端口即可。</p><p>在 NAS 或 Docker 管理工具中新建 Compose 项目，把上面的内容粘贴进去并启动。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250522101124264.png" alt="在 NAS 中创建 it-tools Compose 项目"></p><p>启动后，在浏览器访问：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://NAS的局域网IP:8082</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250522102243527.png" alt="it-tools 部署完成后的界面"></p><h2 id="六、公开访问时的安全建议"><a href="#六、公开访问时的安全建议" class="headerlink" title="六、公开访问时的安全建议"></a>六、公开访问时的安全建议</h2><p>如果只是在家里的局域网使用，直接通过 NAS IP 访问通常就够了。若要把 it-tools 暴露到公网，至少应做好：</p><ol><li>使用 HTTPS；</li><li>增加登录认证或访问控制；</li><li>不要把管理端口直接暴露在公网；</li><li>定期更新镜像和反向代理；</li><li>不在公开实例中处理密码、Token 和客户隐私数据。</li></ol><p>it-tools 本身是工具集合，不会替你决定数据是否敏感。部署方式和使用场景才是安全边界。</p><h2 id="七、适用人群"><a href="#七、适用人群" class="headerlink" title="七、适用人群"></a>七、适用人群</h2><ul><li><strong>程序员</strong>：处理 JSON、编码、哈希和测试数据；</li><li><strong>网页设计师</strong>：转换颜色、生成二维码和预览 Markdown；</li><li><strong>系统管理员</strong>：计算子网、生成 Crontab 表达式；</li><li><strong>NAS 用户</strong>：在内网部署一个随开随用的工具箱；</li><li><strong>经常处理文本和接口数据的人</strong>：减少临时找工具的时间。</li></ul><h2 id="八、总结"><a href="#八、总结" class="headerlink" title="八、总结"></a>八、总结</h2><p>it-tools 的价值在于把高频、零散的小工具集中到一个页面中。临时使用可以直接打开在线版；重视隐私和稳定性，可以用 Docker 部署在自己的 NAS 或服务器上。</p><p>建议收藏官方项目地址，部署时固定版本、保留备份，并为公网访问增加认证和 HTTPS。这样既能享受在线工具箱的便利，也不会把敏感数据交给不可信的服务。</p>]]></content>
    
    
    <summary type="html">it-tools 在线工具箱介绍与 Docker 部署教程，涵盖 JSON、Base64、URL、时间戳、哈希、UUID 等常用开发工具，附自建方法与安全注意事项。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Docker" scheme="https://xiaomingclassmate.com/tags/Docker/"/>
    
    <category term="it-tools" scheme="https://xiaomingclassmate.com/tags/it-tools/"/>
    
    <category term="在线工具" scheme="https://xiaomingclassmate.com/tags/%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7/"/>
    
    <category term="开发效率" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    <category term="开源" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>Nginx Proxy Manager：告别繁琐配置，轻松管理你的反向代理！</title>
    <link href="https://xiaomingclassmate.com/posts/57124/"/>
    <id>https://xiaomingclassmate.com/posts/57124/</id>
    <published>2025-05-10T05:02:36.000Z</published>
    <updated>2026-11-08T12:56:58.279Z</updated>
    
    <content type="html"><![CDATA[<p>还在手动修改 Nginx 配置文件，为每个网站和应用设置反向代理而头疼吗？是时候试试 <strong>Nginx Proxy Manager（NPM）</strong> 了。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250508230737962.png" alt="Nginx Proxy Manager"></p><p>NPM 提供基于 Web 的图形化管理界面，让你无需手写 Nginx 配置，就能管理反向代理、SSL 证书、访问控制和重定向规则。它简单易用，适合个人开发者、家庭实验室和小型团队。</p><blockquote><p><strong>版本提示：</strong> 本文截图和示例来自 2025 年 5 月，软件界面和镜像版本可能已经更新。请以官方最新稳定版为准。生产环境不建议长期使用 <code>latest</code>，应固定具体版本并定期升级。</p></blockquote><p>项目地址：<a href="https://github.com/NginxProxyManager/nginx-proxy-manager">https://github.com/NginxProxyManager/nginx-proxy-manager</a></p><h2 id="一、Nginx-Proxy-Manager-的优势"><a href="#一、Nginx-Proxy-Manager-的优势" class="headerlink" title="一、Nginx Proxy Manager 的优势"></a>一、Nginx Proxy Manager 的优势</h2><ul><li><strong>可视化管理：</strong> 通过 Web 界面管理反向代理、SSL 证书和重定向；</li><li><strong>简化配置：</strong> 填写表单即可完成常见代理配置；</li><li><strong>自动 SSL 证书：</strong> 集成 Let’s Encrypt，支持申请和续期证书；</li><li><strong>访问控制：</strong> 可为内部服务添加用户认证或 IP 限制；</li><li><strong>Docker 部署：</strong> 一条 Compose 命令即可启动；</li><li><strong>免费开源：</strong> 可以自行部署和维护。</li></ul><h2 id="二、使用-Docker-部署"><a href="#二、使用-Docker-部署" class="headerlink" title="二、使用 Docker 部署"></a>二、使用 Docker 部署</h2><h3 id="1-准备环境"><a href="#1-准备环境" class="headerlink" title="1. 准备环境"></a>1. 准备环境</h3><p>开始前需要准备：</p><ul><li>一台已经安装 Docker 和 Docker Compose 的服务器；</li><li>服务器防火墙允许访问 <code>80</code> 和 <code>443</code> 端口；</li><li>一个已经解析到服务器公网 IP 的域名。</li></ul><p>如果还没有安装 Docker，可以参考：</p><p><a href="https://mp.weixin.qq.com/s/HzUj9Aue3SFLQmpJCrn57g">一步到位！Docker 全家桶一键安装，省时省力，马上上手</a></p><p>本文使用雨云服务器演示，注册可获得首月优惠券：<a href="https://www.rainyun.com/xiaoming_">https://www.rainyun.com/xiaoming_</a>。已有服务器的话可以跳过这一步；本文包含推广链接，不影响实际价格。</p><h3 id="2-创建-Compose-文件"><a href="#2-创建-Compose-文件" class="headerlink" title="2. 创建 Compose 文件"></a>2. 创建 Compose 文件</h3><p>新建目录并创建 <code>docker-compose.yml</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></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">app:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">jc21/nginx-proxy-manager:latest</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;80:80&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;443:443&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;8181:81&quot;</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./data:/data</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./letsencrypt:/etc/letsencrypt</span></span><br></pre></td></tr></table></figure><p>端口映射中，冒号左边的端口可以在宿主机上修改。例如把 <code>8181:81</code> 改成 <code>8080:81</code>，之后通过 <code>8080</code> 端口访问管理界面。</p><blockquote><p><strong>注意：</strong> 如果宿主机上的 <code>80</code> 或 <code>443</code> 已被其他 Web 服务占用，NPM 会启动失败。请先停止冲突服务，或调整端口并重新规划入口。</p></blockquote><h3 id="3-启动服务"><a href="#3-启动服务" class="headerlink" title="3. 启动服务"></a>3. 启动服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose up -d</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509214256545.png" alt="启动 Nginx Proxy Manager"></p><h3 id="4-登录管理界面"><a href="#4-登录管理界面" class="headerlink" title="4. 登录管理界面"></a>4. 登录管理界面</h3><p>在浏览器打开：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://你的服务器IP:8181</span><br></pre></td></tr></table></figure><ul><li>默认用户名：<code>admin@example.com</code></li><li>默认密码：<code>changeme</code></li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509214518182.png" alt="NPM 登录界面"></p><p>首次登录后，系统会要求修改邮箱和密码。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509214737783.png" alt="修改管理员信息"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509214854269.png" alt="设置新密码"></p><blockquote><p><strong>安全提示：</strong> 默认密码必须立即修改。管理端口 <code>8181</code> 不建议直接暴露到公网，优先使用防火墙白名单、VPN 或 Cloudflare Access 等方式限制访问。</p></blockquote><h2 id="三、配置第一个反向代理"><a href="#三、配置第一个反向代理" class="headerlink" title="三、配置第一个反向代理"></a>三、配置第一个反向代理</h2><h3 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h3><ol><li>安装并启动 NPM；</li><li>准备一个域名，例如 <code>example.com</code>；</li><li>将域名的 A 记录解析到 NPM 所在服务器的公网 IP。</li></ol><h3 id="添加-Proxy-Host"><a href="#添加-Proxy-Host" class="headerlink" title="添加 Proxy Host"></a>添加 Proxy Host</h3><p>登录 NPM，依次点击 <strong>Hosts → Proxy Host → Add Proxy Host</strong>。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509230430677.png" alt="进入 Proxy Host"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250509230753197.png" alt="添加 Proxy Host"></p><p>填写代理信息：</p><ul><li><strong>Domain Names：</strong> 例如 <code>app.example.com</code>；</li><li><strong>Scheme：</strong> 根据后端服务选择 <code>http</code> 或 <code>https</code>；</li><li><strong>Forward Hostname &#x2F; IP：</strong> 后端服务地址；</li><li><strong>Forward Port：</strong> 后端服务端口；</li><li><strong>Cache Assets：</strong> 需要缓存静态资源时开启；</li><li><strong>Block Common Exploits：</strong> 建议开启；</li><li><strong>Websockets Support：</strong> 后端使用 WebSocket 时开启，例如部分聊天、流媒体和管理面板应用。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250510101910063.png" alt="填写代理配置"></p><h3 id="配置-SSL"><a href="#配置-SSL" class="headerlink" title="配置 SSL"></a>配置 SSL</h3><p>切换到 <strong>SSL</strong> 标签页：</p><ul><li>选择 <strong>Request a new SSL Certificate</strong>；</li><li>填写用于接收证书通知的邮箱；</li><li>同意 Let’s Encrypt 服务条款；</li><li>按需开启 <strong>Force SSL</strong>；</li><li>按需开启 <strong>HTTP&#x2F;2 Support</strong>。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250510102118596.png" alt="配置 SSL"></p><p>保存后，通过域名访问后端服务。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250510111616434.png" alt="反向代理配置完成"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250510110158960.png" alt="通过域名访问服务"></p><h2 id="四、常用功能"><a href="#四、常用功能" class="headerlink" title="四、常用功能"></a>四、常用功能</h2><ul><li><strong>自定义 Nginx 配置：</strong> 为特殊应用追加高级配置；</li><li><strong>Access Lists：</strong> 使用账号密码限制访问；</li><li><strong>Redirection Hosts：</strong> 配置域名跳转；</li><li><strong>Streams：</strong> 转发 TCP、UDP 流量；</li><li><strong>SSL Certificates：</strong> 集中管理证书和自动续期。</li></ul><h2 id="五、上线前的安全清单"><a href="#五、上线前的安全清单" class="headerlink" title="五、上线前的安全清单"></a>五、上线前的安全清单</h2><ol><li>修改默认管理员账号和密码；</li><li>限制管理界面端口，不要直接裸露到公网；</li><li>固定镜像版本，升级前先备份 <code>data</code> 和 <code>letsencrypt</code> 目录；</li><li>只给确实需要 WebSocket 的服务开启 WebSocket；</li><li>定期检查 NPM、Docker 和证书续期状态；</li><li>对外服务开启 HTTPS，并按需启用 Force SSL。</li></ol><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><p>Nginx Proxy Manager 把常见的反向代理和证书管理操作集中到了 Web 界面中，适合不想反复手写 Nginx 配置的用户。部署本身并不复杂，真正需要重视的是管理入口安全、端口冲突、镜像版本和数据备份。</p><p>如果你正在管理多个自建服务，不妨用 NPM 统一入口，让反向代理配置更直观一些。</p>]]></content>
    
    
    <summary type="html">Nginx Proxy Manager 反向代理教程：使用 Docker 部署、修改默认密码、配置域名、SSL 证书、WebSockets 与 Proxy Host，附安全注意事项。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Docker" scheme="https://xiaomingclassmate.com/tags/Docker/"/>
    
    <category term="Nginx Proxy Manager" scheme="https://xiaomingclassmate.com/tags/Nginx-Proxy-Manager/"/>
    
    <category term="Nginx" scheme="https://xiaomingclassmate.com/tags/Nginx/"/>
    
    <category term="反向代理" scheme="https://xiaomingclassmate.com/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/"/>
    
    <category term="HTTPS" scheme="https://xiaomingclassmate.com/tags/HTTPS/"/>
    
  </entry>
  
  <entry>
    <title>Obsidian图床最佳实践：3分钟配置PicList + GitHub + jsDelivr！</title>
    <link href="https://xiaomingclassmate.com/posts/69317/"/>
    <id>https://xiaomingclassmate.com/posts/69317/</id>
    <published>2025-04-19T03:13:42.000Z</published>
    <updated>2026-11-08T12:57:01.787Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250419091902936.png" alt="Obsidian 图床配置示意图"></p><p>在 Obsidian 中插入图片时，本地附件容易散落，换电脑或同步笔记时也可能出现路径失效。用 <strong>PicList + GitHub + jsDelivr</strong>，可以把图片上传、链接生成和 Obsidian 粘贴图片串成一套自动化流程。</p><p>熟悉工具的人通常几分钟就能完成配置；第一次接触 GitHub Token 和 Obsidian 社区插件，建议预留十几分钟，避免因为权限或路径问题反复排查。</p><blockquote><p>**版本提示：**文中截图使用的 PicList 2.9.8、Obsidian 和 GitHub 界面可能较旧，仅用于演示操作路径。软件更新后菜单和功能可能变化，请使用官方最新稳定版，并以实际界面和官方文档为准。</p></blockquote><h2 id="为什么需要图床？"><a href="#为什么需要图床？" class="headerlink" title="为什么需要图床？"></a>为什么需要图床？</h2><ul><li><strong>跨设备使用</strong>：笔记同步到另一台设备后，图片链接仍可访问；</li><li><strong>减少附件混乱</strong>：图片统一存放在一个仓库中，便于整理；</li><li><strong>分享更方便</strong>：复制 Markdown 笔记时，图片不依赖本地附件目录；</li><li><strong>便于备份</strong>：Git 仓库可以保留历史版本，也能克隆到本地。</li></ul><p>需要注意：GitHub 公开仓库中的图片可能被其他人访问，不要上传身份证、合同、密码等敏感内容。GitHub 也不是专业 CDN，免费服务不承诺永久稳定。</p><h2 id="方案组成"><a href="#方案组成" class="headerlink" title="方案组成"></a>方案组成</h2><table><thead><tr><th>工具</th><th>作用</th></tr></thead><tbody><tr><td>PicList</td><td>上传图片、管理图床、提供本地上传接口</td></tr><tr><td>GitHub</td><td>保存图片文件和历史版本</td></tr><tr><td>jsDelivr</td><td>为 GitHub 中的公开文件提供 CDN 加速</td></tr><tr><td>Obsidian 插件</td><td>粘贴图片后自动调用 PicList 上传</td></tr></tbody></table><p>这套方案适合个人笔记、博客配图和低流量内容站。高流量商业网站应使用正式对象存储和 CDN。</p><h2 id="第一步：创建-GitHub-图片仓库"><a href="#第一步：创建-GitHub-图片仓库" class="headerlink" title="第一步：创建 GitHub 图片仓库"></a>第一步：创建 GitHub 图片仓库</h2><p>登录 GitHub，创建一个新的 <strong>Public</strong> 仓库，例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">obsidian-images</span><br></pre></td></tr></table></figure><p>仓库名可以自定义，记住完整的“用户名&#x2F;仓库名”，例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yourname/obsidian-images</span><br></pre></td></tr></table></figure><p>建议勾选 <strong>Add a README file</strong>，方便之后维护。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418214011124.png" alt="创建 GitHub 图片仓库"></p><h2 id="第二步：安装-PicList"><a href="#第二步：安装-PicList" class="headerlink" title="第二步：安装 PicList"></a>第二步：安装 PicList</h2><p>从 <a href="https://github.com/Kuingsmile/PicList/releases">PicList 官方 Releases</a> 下载并安装最新稳定版。安装完成后先打开 PicList，确认程序可以正常运行。</p><p>不要从来历不明的第三方下载站获取安装包，也不要使用修改版或破解版。</p><h2 id="第三步：配置-PicList-的-GitHub-图床"><a href="#第三步：配置-PicList-的-GitHub-图床" class="headerlink" title="第三步：配置 PicList 的 GitHub 图床"></a>第三步：配置 PicList 的 GitHub 图床</h2><p>进入 PicList 的 <strong>图床设置 → GitHub</strong>，填写以下信息：</p><table><thead><tr><th>配置项</th><th>填写规则</th><th>示例</th></tr></thead><tbody><tr><td>仓库名</td><td>用户名&#x2F;仓库名</td><td><code>yourname/obsidian-images</code></td></tr><tr><td>分支名</td><td>查看仓库默认分支</td><td><code>main</code> 或 <code>master</code></td></tr><tr><td>Token</td><td>GitHub 访问令牌</td><td>不要公开</td></tr><tr><td>存储路径</td><td>图片保存目录</td><td><code>img/</code></td></tr><tr><td>自定义域名</td><td>jsDelivr 地址</td><td><code>https://cdn.jsdelivr.net/gh/yourname/obsidian-images@main</code></td></tr></tbody></table><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418214650259.png" alt="PicList 的 GitHub 图床配置界面（图中账号和仓库仅为示例）"></p><h3 id="创建最小权限-Token"><a href="#创建最小权限-Token" class="headerlink" title="创建最小权限 Token"></a>创建最小权限 Token</h3><p>不建议使用账号密码，也不建议给 Token 开启全部仓库权限。推荐使用 GitHub 的 <strong>Fine-grained token</strong>：</p><p><strong>Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token</strong></p><ul><li>Token name：<code>piclist-obsidian</code></li><li>Expiration：建议选择 90 天或 1 年；</li><li>Repository access：<strong>Only select repositories</strong></li><li>只选择刚才创建的 <code>obsidian-images</code>；</li><li>Repository permissions → <strong>Contents：Read and write</strong></li></ul><p>其他权限通常不需要开启。Token 只会显示一次，复制后立即保存到安全位置。</p><p>如果 Token 泄露，应立即在 GitHub 中删除并重新生成。不要把 Token 写进笔记、截图或公开仓库。</p><h2 id="第四步：配置-Obsidian-自动上传"><a href="#第四步：配置-Obsidian-自动上传" class="headerlink" title="第四步：配置 Obsidian 自动上传"></a>第四步：配置 Obsidian 自动上传</h2><h3 id="1-关闭安全模式"><a href="#1-关闭安全模式" class="headerlink" title="1. 关闭安全模式"></a>1. 关闭安全模式</h3><p>打开 Obsidian 设置，进入 <strong>第三方插件</strong>，关闭安全模式。Obsidian 会提示第三方插件可能带来数据和隐私风险，安装前应确认插件来源可信，并先备份笔记库。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418215044253.png" alt="关闭 Obsidian 安全模式"></p><h3 id="2-打开社区插件市场"><a href="#2-打开社区插件市场" class="headerlink" title="2. 打开社区插件市场"></a>2. 打开社区插件市场</h3><p>关闭安全模式后，点击“社区插件市场”的浏览按钮，搜索并安装 <strong>Image auto upload</strong>。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418215109950.png" alt="打开 Obsidian 社区插件市场"></p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418215505902.png" alt="搜索 Image auto upload 插件"></p><p>插件名称、作者和功能可能随版本变化，安装前请核对插件说明和更新日期。</p><h3 id="3-设置-PicList-上传接口"><a href="#3-设置-PicList-上传接口" class="headerlink" title="3. 设置 PicList 上传接口"></a>3. 设置 PicList 上传接口</h3><p>打开 <strong>Image auto upload</strong> 插件设置：</p><ul><li>开启“剪贴板自动上传”；</li><li>默认上传器选择 <strong>PicGo(app)</strong>；</li><li>上传接口填写 <code>http://127.0.0.1:36677/upload</code>；</li><li>删除接口按插件提示填写，通常为 <code>http://127.0.0.1:36677/delete</code>。</li></ul><p>配置时确认 PicList 正在运行，并且 PicList 的 PicGo server 功能已经开启。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418215818701.png" alt="Image auto upload 插件配置"></p><h2 id="第五步：粘贴图片自动上传"><a href="#第五步：粘贴图片自动上传" class="headerlink" title="第五步：粘贴图片自动上传"></a>第五步：粘贴图片自动上传</h2><p>在 Obsidian 中直接粘贴或拖入图片，插件会调用 PicList 上传到 GitHub，并生成 Markdown 链接。也可以先在 PicList 中手动上传，再复制链接到笔记。</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250418223819540.gif" alt="Obsidian 粘贴图片自动上传演示"></p><p>建议开启时间戳重命名，避免不同图片使用同一个文件名而互相覆盖。</p><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="图片上传成功但无法访问"><a href="#图片上传成功但无法访问" class="headerlink" title="图片上传成功但无法访问"></a>图片上传成功但无法访问</h3><p>依次检查：</p><ol><li>GitHub 仓库是否为 Public；</li><li>分支名是否与仓库实际分支一致；</li><li>文件是否已经出现在仓库中；</li><li>jsDelivr 地址是否包含用户名、仓库名和正确分支；</li><li>jsDelivr 是否存在缓存延迟。</li></ol><h3 id="上传提示-403-或-Permission-denied"><a href="#上传提示-403-或-Permission-denied" class="headerlink" title="上传提示 403 或 Permission denied"></a>上传提示 403 或 Permission denied</h3><p>通常是 Token 权限不足或已过期。检查 Contents 是否为 Read and write，并确认 Token 授权给了正确的图片仓库。</p><h3 id="图片更新后仍显示旧版本"><a href="#图片更新后仍显示旧版本" class="headerlink" title="图片更新后仍显示旧版本"></a>图片更新后仍显示旧版本</h3><p>jsDelivr 可能缓存旧文件。最省事的做法是使用时间戳重命名，让每次上传生成新文件名，而不是反复覆盖同一张图片。</p><h3 id="GitHub-图床稳定吗？"><a href="#GitHub-图床稳定吗？" class="headerlink" title="GitHub 图床稳定吗？"></a>GitHub 图床稳定吗？</h3><p>没有免费服务能保证永久稳定。账号、仓库、GitHub 访问和 jsDelivr 可用性都可能受网络或平台策略影响。重要图片至少保留一份本地原图，并定期备份仓库。</p><h3 id="手机端能自动上传吗？"><a href="#手机端能自动上传吗？" class="headerlink" title="手机端能自动上传吗？"></a>手机端能自动上传吗？</h3><p>PicList 和 Obsidian 插件的主要工作流在桌面端。手机端能否使用取决于 Obsidian 插件、PicList 服务和应用权限，需以当前版本的实际支持情况为准。</p><h2 id="最终检查清单"><a href="#最终检查清单" class="headerlink" title="最终检查清单"></a>最终检查清单</h2><ul><li><input disabled="" type="checkbox"> GitHub 图片仓库已设为公开；</li><li><input disabled="" type="checkbox"> Token 只授权图片仓库的 Contents 读写权限；</li><li><input disabled="" type="checkbox"> PicList 能成功上传图片；</li><li><input disabled="" type="checkbox"> jsDelivr 图片链接可以在无登录状态下打开；</li><li><input disabled="" type="checkbox"> Obsidian 已安装并启用 Image auto upload；</li><li><input disabled="" type="checkbox"> 粘贴图片后可以自动生成 Markdown 链接；</li><li><input disabled="" type="checkbox"> 已开启时间戳重命名；</li><li><input disabled="" type="checkbox"> 本地保留了原图备份；</li><li><input disabled="" type="checkbox"> 没有上传敏感或私密图片。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>PicList + GitHub + jsDelivr 的组合可以显著减少 Obsidian 插图时的手工操作，图片文件也更容易整理和迁移。它不是“零维护”的永久图床，但对个人笔记和低流量博客来说，是一套成本低、流程清晰的实用方案。</p><p>把 Token 权限控制到最小、使用最新稳定版软件、保留本地备份，并接受免费 CDN 可能变化，才能让这套方案用得更久。</p>]]></content>
    
    
    <summary type="html">Obsidian 图床配置教程：使用 PicList、GitHub 和 jsDelivr 自动上传图片，包含细粒度 Token、插件设置、缓存与备份注意事项。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Obsidian" scheme="https://xiaomingclassmate.com/tags/Obsidian/"/>
    
    <category term="GitHub" scheme="https://xiaomingclassmate.com/tags/GitHub/"/>
    
    <category term="图床" scheme="https://xiaomingclassmate.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="PicList" scheme="https://xiaomingclassmate.com/tags/PicList/"/>
    
    <category term="jsDelivr" scheme="https://xiaomingclassmate.com/tags/jsDelivr/"/>
    
  </entry>
  
  <entry>
    <title>Git 入门：版本控制，高效协作</title>
    <link href="https://xiaomingclassmate.com/posts/58421/"/>
    <id>https://xiaomingclassmate.com/posts/58421/</id>
    <published>2025-04-10T10:22:57.000Z</published>
    <updated>2026-11-08T12:56:34.603Z</updated>
    
    <content type="html"><![CDATA[<p>版本控制是软件开发中的重要环节，Git 作为目前最流行的版本控制工具，可以帮助我们更好地管理代码、协作开发。 本文将带你快速入门 Git，掌握基本操作。</p><h2 id="什么是-Git？"><a href="#什么是-Git？" class="headerlink" title="什么是 Git？"></a>什么是 Git？</h2><p>Git 是一个分布式版本控制系统。 它可以记录文件的修改历史，方便我们回溯到之前的版本，或者合并不同分支的代码。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250410172857616.png" alt="image.png"></p><h2 id="Git-的基本概念"><a href="#Git-的基本概念" class="headerlink" title="Git 的基本概念"></a>Git 的基本概念</h2><ul><li><strong>仓库（Repository）：</strong> 存放所有版本信息的地方，可以理解为一个目录，包含了所有文件和历史记录。</li><li><strong>工作区（Working Directory）：</strong> 你电脑中实际存放文件的目录。</li><li><strong>暂存区（Staging Area）：</strong> 用于存放你想要提交的修改。</li><li><strong>提交（Commit）：</strong> 将暂存区中的修改保存到仓库中。</li><li><strong>分支（Branch）：</strong> 独立的代码线路，可以并行开发不同的功能。</li><li><strong>合并（Merge）：</strong> 将不同分支的代码合并到一起。</li></ul><h2 id="Git-的安装"><a href="#Git-的安装" class="headerlink" title="Git 的安装"></a>Git 的安装</h2><p>在开始之前，你需要先安装 Git。 你可以从 Git 官网（<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a>）下载适合你系统的版本。<br><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250410172112026.png" alt="image.png"></p><h2 id="Git-的基本操作"><a href="#Git-的基本操作" class="headerlink" title="Git 的基本操作"></a>Git 的基本操作</h2><h3 id="1-初始化仓库"><a href="#1-初始化仓库" class="headerlink" title="1. 初始化仓库"></a>1. 初始化仓库</h3><p>在你的项目目录下，打开终端，输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure><p>这会在当前目录下创建一个 <code>.git</code> 目录，这就是你的 Git 仓库。</p><h3 id="2-添加文件到暂存区"><a href="#2-添加文件到暂存区" class="headerlink" title="2. 添加文件到暂存区"></a>2. 添加文件到暂存区</h3><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><span class="line">git add &lt;文件名&gt;</span><br><span class="line"><span class="comment"># 例如 git add index.html</span></span><br></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><span class="line">git add .</span><br></pre></td></tr></table></figure><h3 id="3-提交修改"><a href="#3-提交修改" class="headerlink" title="3. 提交修改"></a>3. 提交修改</h3><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><span class="line">git commit -m <span class="string">&quot;提交信息&quot;</span></span><br><span class="line"><span class="comment"># 例如 git commit -m &quot;完成用户登录功能&quot;</span></span><br></pre></td></tr></table></figure><p>提交信息应该清晰地描述本次提交的内容。</p><h3 id="4-查看状态"><a href="#4-查看状态" class="headerlink" title="4. 查看状态"></a>4. 查看状态</h3><p>使用以下命令查看当前仓库的状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure><p>它可以告诉你哪些文件被修改了，哪些文件在暂存区，哪些文件没有被跟踪。</p><h3 id="5-查看历史记录"><a href="#5-查看历史记录" class="headerlink" title="5. 查看历史记录"></a>5. 查看历史记录</h3><p>使用以下命令查看提交历史：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure><p>它可以显示每次提交的作者、时间和提交信息。</p><h3 id="6-创建和切换分支"><a href="#6-创建和切换分支" class="headerlink" title="6. 创建和切换分支"></a>6. 创建和切换分支</h3><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><span class="line">git branch &lt;分支名&gt;</span><br><span class="line"><span class="comment"># 例如 git branch feature/login</span></span><br></pre></td></tr></table></figure><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><span class="line">git checkout &lt;分支名&gt;</span><br><span class="line"><span class="comment"># 例如 git checkout feature/login</span></span><br></pre></td></tr></table></figure><h3 id="7-合并分支"><a href="#7-合并分支" class="headerlink" title="7. 合并分支"></a>7. 合并分支</h3><p>首先切换到要合并的目标分支，然后使用以下命令合并指定分支：</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></pre></td><td class="code"><pre><span class="line">git merge &lt;要合并的分支名&gt;</span><br><span class="line"><span class="comment"># 例如 git checkout main</span></span><br><span class="line"><span class="comment"># git merge feature/login</span></span><br></pre></td></tr></table></figure><h2 id="Git-常用命令速查"><a href="#Git-常用命令速查" class="headerlink" title="Git 常用命令速查"></a>Git 常用命令速查</h2><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>git init</code></td><td>初始化仓库</td></tr><tr><td><code>git add</code></td><td>添加文件到暂存区</td></tr><tr><td><code>git commit</code></td><td>提交修改</td></tr><tr><td><code>git status</code></td><td>查看状态</td></tr><tr><td><code>git log</code></td><td>查看历史记录</td></tr><tr><td><code>git branch</code></td><td>创建、查看分支</td></tr><tr><td><code>git checkout</code></td><td>切换分支</td></tr><tr><td><code>git merge</code></td><td>合并分支</td></tr><tr><td><code>git pull</code></td><td>从远程仓库拉取最新代码</td></tr><tr><td><code>git push</code></td><td>将本地代码推送到远程仓库</td></tr></tbody></table><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Git 是一个强大的工具，掌握这些基本操作，你就可以开始使用 Git 管理你的代码了。 在实际开发中，你还会遇到更多复杂的情况，需要不断学习和实践。 希望这篇文章能帮助你入门 Git，开启高效协作之旅！</p>]]></content>
    
    
    <summary type="html">Git 入门教程：了解仓库、工作区、暂存区和分支等核心概念，掌握初始化、提交、查看状态、分支合并与远程推送等常用操作。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Git" scheme="https://xiaomingclassmate.com/tags/Git/"/>
    
    <category term="版本控制" scheme="https://xiaomingclassmate.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
    
    <category term="团队协作" scheme="https://xiaomingclassmate.com/tags/%E5%9B%A2%E9%98%9F%E5%8D%8F%E4%BD%9C/"/>
    
    <category term="开发工具" scheme="https://xiaomingclassmate.com/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>零成本搭建永久图床！Github+PicGo保姆级教程，自媒体人效率翻倍秘籍</title>
    <link href="https://xiaomingclassmate.com/posts/73842/"/>
    <id>https://xiaomingclassmate.com/posts/73842/</id>
    <published>2025-03-30T11:48:09.000Z</published>
    <updated>2026-11-08T12:56:36.019Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250329120729735.png" alt="公众号首图：电脑屏幕显示 GitHub 仓库与 PicGo 操作界面"></p><p>写公众号、博客或技术文档时，图片管理经常让人崩溃：</p><ul><li>截图散落在桌面，过几天就找不到原图；</li><li>文章搬到另一个平台后，图片全部失效；</li><li>付费图床突然涨价或停止服务，旧文章跟着遭殃。</li></ul><p>用 <strong>GitHub 仓库 + PicGo</strong> 可以搭一套零成本、自己掌控的图片上传流程。配置一次，以后截图后直接生成 Markdown 链接。</p><blockquote><p>**版本提示：**文中截图使用的 PicGo 和 GitHub 界面版本可能较旧，仅用于演示操作路径。GitHub、PicGo 及相关工具的界面和功能可能已经变化，请使用官方最新稳定版，并以官方文档和实际界面为准。</p></blockquote><p>先说清楚：这里的“永久”是指图片保存在自己的仓库中，可以随时备份和迁移，并不代表 GitHub 承诺永久免费、无限存储或链接永不失效。GitHub 也不是专业 CDN，中国大陆的访问速度取决于网络环境。它适合个人博客、低流量内容站和日常写作；高流量商业站点仍建议使用对象存储加 CDN。</p><h2 id="为什么选择-GitHub-图床？"><a href="#为什么选择-GitHub-图床？" class="headerlink" title="为什么选择 GitHub 图床？"></a>为什么选择 GitHub 图床？</h2><h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><ul><li><strong>成本低</strong>：个人账号可以免费创建公开仓库；</li><li><strong>文件可控</strong>：图片、目录和历史版本都在自己的仓库里；</li><li><strong>迁移方便</strong>：需要时可以克隆仓库，换到其他图床；</li><li><strong>写作效率高</strong>：PicGo 上传后直接生成 Markdown 链接。</li></ul><h3 id="限制"><a href="#限制" class="headerlink" title="限制"></a>限制</h3><ul><li>GitHub 不是专门的文件托管或 CDN 服务；</li><li>公开仓库中的图片可能被任何人访问；</li><li>仓库、账号或第三方 CDN 的可用性不受自己控制；</li><li>国内网络访问 GitHub 和 jsDelivr 可能不稳定。</li></ul><h2 id="适用人群"><a href="#适用人群" class="headerlink" title="适用人群"></a>适用人群</h2><table><thead><tr><th>场景</th><th align="center">是否适合</th><th>说明</th></tr></thead><tbody><tr><td>个人博客、技术文档</td><td align="center">适合</td><td>图片量不大，维护成本低</td></tr><tr><td>自媒体日常配图</td><td align="center">适合</td><td>本地保留原图，按平台上传</td></tr><tr><td>团队共享素材</td><td align="center">谨慎</td><td>需要额外管理权限和文件命名</td></tr><tr><td>高流量商业网站</td><td align="center">不建议</td><td>应使用正式对象存储和 CDN</td></tr><tr><td>身份证、合同等敏感图片</td><td align="center">禁止</td><td>不要放进公开仓库</td></tr></tbody></table><h2 id="第一步：创建-GitHub-图片仓库"><a href="#第一步：创建-GitHub-图片仓库" class="headerlink" title="第一步：创建 GitHub 图片仓库"></a>第一步：创建 GitHub 图片仓库</h2><p>登录 GitHub，点击右上角 <strong>+ → New repository</strong>：</p><ul><li>Repository name：例如 <code>username-image-bed</code>；</li><li>Visibility：选择 <strong>Public</strong>；</li><li>勾选 <strong>Add a README file</strong>；</li><li>点击 <strong>Create repository</strong>。</li></ul><p>仓库必须是公开的，否则普通图片链接无法直接访问。建议按年份和月份建立目录，例如：</p><figure class="highlight text"><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><span class="line">posts/2026/11/</span><br><span class="line">covers/2026/</span><br><span class="line">avatar/</span><br></pre></td></tr></table></figure><h2 id="第二步：创建最小权限-Token"><a href="#第二步：创建最小权限-Token" class="headerlink" title="第二步：创建最小权限 Token"></a>第二步：创建最小权限 Token</h2><p>不要直接使用账号密码，也不要给 Token 开启全部仓库权限。推荐使用 GitHub 的 <strong>Fine-grained token</strong>：</p><p><strong>Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token</strong></p><ul><li>Token name：<code>picgo-image-bed</code></li><li>Expiration：建议选择 90 天或 1 年；</li><li>Repository access：<strong>Only select repositories</strong></li><li>只选择刚才创建的图片仓库；</li><li>Repository permissions → <strong>Contents：Read and write</strong></li></ul><p>其他权限不需要开启。Token 只会显示一次，生成后先保存到安全的位置。</p><blockquote><p>Token 一旦泄露，应立即删除并重新生成。不要把 Token 截图、写进文章或提交到 Git 仓库。</p></blockquote><h2 id="第三步：配置-PicGo"><a href="#第三步：配置-PicGo" class="headerlink" title="第三步：配置 PicGo"></a>第三步：配置 PicGo</h2><p>从 <a href="https://github.com/Molunerfinn/PicGo/releases">PicGo 官方 Releases</a> 下载并安装客户端，进入 <strong>图床设置 → GitHub</strong>：</p><table><thead><tr><th>配置项</th><th>填写规则</th><th>示例</th></tr></thead><tbody><tr><td>仓库名</td><td>用户名&#x2F;仓库名</td><td><code>yourname/blog-images</code></td></tr><tr><td>分支名</td><td>查看仓库默认分支</td><td><code>main</code> 或 <code>master</code></td></tr><tr><td>Token</td><td>粘贴刚生成的 Token</td><td>不要公开</td></tr><tr><td>存储路径</td><td>按时间分类</td><td><code>posts/2026/11/</code></td></tr><tr><td>自定义域名</td><td>jsDelivr 地址</td><td><code>https://cdn.jsdelivr.net/gh/yourname/blog-images@main</code></td></tr></tbody></table><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250329121726773.png" alt="PicGo 的 GitHub 图床配置界面"></p><p>保存后，把 GitHub 设为默认图床。在 PicGo 上传区拖入图片，上传完成后复制 Markdown 链接。</p><p>建议开启“时间戳重命名”，避免同名图片互相覆盖：</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250329211936565.png" alt="PicGo 开启时间戳重命名"></p><p>上传成功后会得到类似下面的地址：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">![<span class="string">图片说明</span>](<span class="link">https://cdn.jsdelivr.net/gh/yourname/blog-images@main/posts/2026/11/example.webp</span>)</span><br></pre></td></tr></table></figure><p>如果 jsDelivr 暂时不可用，可以先用 GitHub 原始地址排查：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://raw.githubusercontent.com/yourname/blog-images/main/posts/2026/11/example.webp</span><br></pre></td></tr></table></figure><p>原始地址适合临时测试，但不适合作为高流量网站的长期图片地址。</p><h2 id="第四步：接入-Typora（可选）"><a href="#第四步：接入-Typora（可选）" class="headerlink" title="第四步：接入 Typora（可选）"></a>第四步：接入 Typora（可选）</h2><p>打开 Typora 的 <strong>偏好设置 → 图像</strong>，把上传服务设置为 PicGo，并填写 PicGo 程序路径。配置完成后，插入本地图片时可以自动上传并替换成网络链接。</p><p>无论使用哪种编辑器，都建议保留一份本地原图。GitHub 仓库只是副本，不是唯一备份。</p><h2 id="高阶使用技巧"><a href="#高阶使用技巧" class="headerlink" title="高阶使用技巧"></a>高阶使用技巧</h2><h3 id="1-用相册管理历史图片"><a href="#1-用相册管理历史图片" class="headerlink" title="1. 用相册管理历史图片"></a>1. 用相册管理历史图片</h3><p>PicGo 的相册可以查看和删除历史图片，适合清理误传文件：</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250329220653045.png" alt="PicGo 相册管理"></p><h3 id="2-上传前压缩图片"><a href="#2-上传前压缩图片" class="headerlink" title="2. 上传前压缩图片"></a>2. 上传前压缩图片</h3><p>图片越大，页面加载越慢，仓库备份也越费时间。建议：</p><ul><li>截图统一转为 WebP 或高质量 JPEG；</li><li>长边控制在 1600～2000 像素；</li><li>单张图片尽量控制在 500 KB 以内；</li><li>照片质量设为 75～85；</li><li>文件名使用英文、数字和短横线。</li></ul><p>可以在 PicGo 插件设置中搜索图片压缩插件：</p><p><img src="https://cdn.jsdelivr.net/gh/jumplooper/images/image/20250329221203248.png" alt="PicGo 图片压缩插件"></p><h3 id="3-做好备份"><a href="#3-做好备份" class="headerlink" title="3. 做好备份"></a>3. 做好备份</h3><p>至少保留三层：</p><ol><li>GitHub 仓库保存一份；</li><li>本地保留原始图片；</li><li>定期把仓库克隆到另一块硬盘或私有备份位置。</li></ol><p>Git 可以恢复历史版本，但前提是仓库还在、账号还能登录。不要把“云端有文件”误解成“永远不需要备份”。</p><h2 id="安全注意事项"><a href="#安全注意事项" class="headerlink" title="安全注意事项"></a>安全注意事项</h2><ul><li>Token 只授权图片仓库，不要选择“全部仓库”；</li><li>不要上传身份证、合同、密码等敏感图片；</li><li>公开仓库中的文件可能被搜索引擎或其他人访问；</li><li>Token 过期后，PicGo 会提示上传失败，重新生成并替换即可；</li><li>不要把“永久免费”当成平台承诺，重要图片必须保留本地副本。</li></ul><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="GitHub-图床会被封吗？"><a href="#GitHub-图床会被封吗？" class="headerlink" title="GitHub 图床会被封吗？"></a>GitHub 图床会被封吗？</h3><p>没有平台能保证永远不封。只要仓库内容合规、没有侵权或滥用行为，个人博客使用通常没有问题；但账号、仓库或服务策略变化都可能影响图片访问。</p><h3 id="jsDelivr-每月有多少免费流量？"><a href="#jsDelivr-每月有多少免费流量？" class="headerlink" title="jsDelivr 每月有多少免费流量？"></a>jsDelivr 每月有多少免费流量？</h3><p>jsDelivr 的使用政策和额度可能调整，不应把“每月 100GB”当作永久承诺。高流量站点应准备对象存储或商业 CDN，避免把业务完全依赖第三方免费服务。</p><h3 id="手机端如何上传？"><a href="#手机端如何上传？" class="headerlink" title="手机端如何上传？"></a>手机端如何上传？</h3><p>PicGo 以桌面客户端为主。手机端可以先保存图片，再通过 GitHub 网页上传，或使用支持 GitHub 图床的第三方工具。不同客户端的兼容性需要自行确认。</p><h3 id="图片打不开怎么办？"><a href="#图片打不开怎么办？" class="headerlink" title="图片打不开怎么办？"></a>图片打不开怎么办？</h3><p>依次检查：</p><ol><li>仓库是否为 Public；</li><li>分支名是否填写正确；</li><li>文件是否真的出现在仓库中；</li><li>自定义域名是否包含用户名和仓库名；</li><li>jsDelivr 是否存在缓存延迟。</li></ol><h3 id="上传提示-403-或-Permission-denied"><a href="#上传提示-403-或-Permission-denied" class="headerlink" title="上传提示 403 或 Permission denied"></a>上传提示 403 或 Permission denied</h3><p>通常是 Token 权限不足或已经过期。检查 Contents 是否为 Read and write，确认 Token 没有过期，并确认它授权给了正确的仓库。</p><h2 id="立即开始"><a href="#立即开始" class="headerlink" title="立即开始"></a>立即开始</h2><ol><li>打开 <a href="https://github.com/">GitHub</a> 注册并创建图片仓库；</li><li>下载 <a href="https://github.com/Molunerfinn/PicGo/releases">PicGo 客户端</a>；</li><li>创建最小权限 Token；</li><li>在 PicGo 中完成配置并上传第一张测试图片；</li><li>保留原图，并定期备份整个图片仓库。</li></ol><p>GitHub + PicGo 不是“零维护”的永久图床，但它是一套成本低、文件可控、迁移方便的图片管理方案。把图片掌握在自己手里，再根据访问量选择合适的 CDN，才是更稳妥的长期做法。</p>]]></content>
    
    
    <summary type="html">基于 GitHub 仓库和 PicGo 搭建零成本图床的完整教程：创建公开仓库、配置细粒度 Token、生成 CDN 链接、压缩图片、备份与常见故障排查。</summary>
    
    
    
    <category term="实用教程" scheme="https://xiaomingclassmate.com/categories/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="GitHub" scheme="https://xiaomingclassmate.com/tags/GitHub/"/>
    
    <category term="图床" scheme="https://xiaomingclassmate.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="PicGo" scheme="https://xiaomingclassmate.com/tags/PicGo/"/>
    
    <category term="自媒体" scheme="https://xiaomingclassmate.com/tags/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    <category term="效率工具" scheme="https://xiaomingclassmate.com/tags/%E6%95%88%E7%8E%87%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
</feed>
