<?xml version="1.0" encoding="utf-8" standalone="no"?><feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>gythialy</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://gythialy.github.io/</id>
  <link href="https://gythialy.github.io/" rel="alternate"/>
  <link href="https://gythialy.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, gythialy</rights>
  <subtitle>这里只是我的后花园，随性而写</subtitle>
  <title>机械境</title>
  <updated>2026-04-21T06:30:40.103Z</updated>
  <xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Rust/" term="Rust"/>
    <category scheme="https://gythialy.github.io/tags/CLI/" term="CLI"/>
    <category scheme="https://gythialy.github.io/tags/Unix/" term="Unix"/>
    <category scheme="https://gythialy.github.io/tags/Tools/" term="Tools"/>
    <content>
      <![CDATA[<p>A curated list of replacements for existing software written in Rust.</p><h3 id="System-Tools"><a href="#System-Tools" class="headerlink" title="System Tools"></a>System Tools</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FqZWV0ZHNvdXphL3pveGlkZQ==">zoxide<i class="fa fa-external-link-alt"></i></span> - A smarter cd command, alternative to autojump/z</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NoYXJrZHAvYmF0">bat<i class="fa fa-external-link-alt"></i></span> - A cat(1) clone with wings</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL1hBTVBQUm9ja3kvdG9rZWk=">tokei<i class="fa fa-external-link-alt"></i></span> - Count your code, quickly (alternative to cloc)</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3RhcmthL3hjcA==">xcp<i class="fa fa-external-link-alt"></i></span> - An extended <code>cp</code></li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NoYXJrZHAvZmQ=">fd<i class="fa fa-external-link-alt"></i></span> - A simple, fast alternative to ‘find’</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL29naGFtL2V4YQ==">exa<i class="fa fa-external-link-alt"></i></span> - A replacement for ‘ls’</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2RhbGFuY2UvcHJvY3M=">procs<i class="fa fa-external-link-alt"></i></span> - A modern replacement for ps</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0NsZW1lbnRUc2FuZy9ib3R0b20=">bottom<i class="fa fa-external-link-alt"></i></span> - Yet another cross-platform graphical process/system monitor</li></ul><h3 id="Text-Processing-and-Viewing"><a href="#Text-Processing-and-Viewing" class="headerlink" title="Text Processing and Viewing"></a>Text Processing and Viewing</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0J1cm50U3VzaGkvcmlwZ3JlcA==">ripgrep<i class="fa fa-external-link-alt"></i></span> - Fast alternative to grep</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2RhbmRhdmlzb24vZGVsdGE=">delta<i class="fa fa-external-link-alt"></i></span> - A viewer for git and diff output</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NoYXJrZHAvaGV4eWw=">hexyl<i class="fa fa-external-link-alt"></i></span> - A command-line hex viewer</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21zLWpwcS9zYWQ=">sad<i class="fa fa-external-link-alt"></i></span> - CLI search and replace | Space Age sed</li></ul><h3 id="Development-Tools"><a href="#Development-Tools" class="headerlink" title="Development Tools"></a>Development Tools</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3N0YXJzaGlwL3N0YXJzaGlw">starship<i class="fa fa-external-link-alt"></i></span> - The minimal, blazing-fast, and customizable prompt for any shell</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FsYWNyaXR0eS9hbGFjcml0dHk=">alacritty<i class="fa fa-external-link-alt"></i></span> - A cross-platform, OpenGL terminal emulator</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3plbGxpai1vcmcvemVsbGlq">zellij<i class="fa fa-external-link-alt"></i></span> - A terminal workspace with batteries included (tmux alternative)</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2V4dHJhd3Vyc3QvZ2l0dWk=">gitui<i class="fa fa-external-link-alt"></i></span> - Blazing fast terminal-ui for git</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2Nhc2V5L2p1c3Q=">just<i class="fa fa-external-link-alt"></i></span> - A command runner and partial replacement for <code>make</code></li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2RwcmludC9kcHJpbnQ=">dprint<i class="fa fa-external-link-alt"></i></span> - Pluggable and configurable code formatting platform</li></ul><h3 id="Utilities"><a href="#Utilities" class="headerlink" title="Utilities"></a>Utilities</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2R1Y2FhbGUveGg=">xh<i class="fa fa-external-link-alt"></i></span> - Friendly and fast tool for sending HTTP requests (httpie alternative)</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2RicmduL3RlYWxkZWVy">tealdeer<i class="fa fa-external-link-alt"></i></span> - A very fast implementation of tldr</li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0Nhbm9wL2Jyb290">broot<i class="fa fa-external-link-alt"></i></span> - A better way to navigate directories</li></ul><h3 id="Applications"><a href="#Applications" class="headerlink" title="Applications"></a>Applications</h3><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2NvbnRhaW5lcnMveW91a2k=">youki<i class="fa fa-external-link-alt"></i></span> - An experimental container runtime</li></ul><p>These Rust-based alternatives often provide improved performance, more features, and better user experiences compared to their traditional counterparts, showcasing Rust’s capabilities in systems programming and application development.</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/awesome-alternatives-cli-in-rust/</id>
    <link href="https://gythialy.github.io/awesome-alternatives-cli-in-rust/"/>
    <published>2024-10-11T05:21:49.000Z</published>
    <summary>
      <![CDATA[<p>A curated list of replacements for existing software written in Rust.</p>
<h3 id="System-Tools"><a href="#System-Tools" class="headerlink]]>
    </summary>
    <title>Rust CLI 工具替代品</title>
    <updated>2026-04-21T06:30:40.103Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Zsh/" term="Zsh"/>
    <category scheme="https://gythialy.github.io/tags/mise/" term="mise"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9taXNlLmpkeC5kZXYv">mise<i class="fa fa-external-link-alt"></i></span> 是一个现代化的开发工具版本管理器，可完美替代 asdf。它提供了更快的性能和更丰富的功能，用于管理多种编程语言、工具和框架的版本，包括但不限于：</p><ul><li>Bun</li><li>Deno</li><li>Node.js</li><li>Go</li><li>Rust</li><li>Python</li></ul><p><strong>mise 的主要优点包括：</strong></p><ul><li><strong>高性能：</strong> 比 asdf 更快，使用 Rust 编写。</li><li><strong>兼容性：</strong> 与 asdf 插件和配置文件兼容，同时支持 cargo，go，npm 等生态。</li><li><strong>增强功能：</strong> 提供了更多高级功能，如任务运行器和环境变量管理。</li><li><strong>易于使用：</strong> 具有直观的命令行界面和配置文件格式，不需要单独安装 plugin。</li></ul><span id="more"></span><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tbody><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">brew install mise</span><br><span class="line"><span class="built_in">echo</span> <span class="string">'eval "$(mise activate zsh --shims)"'</span> &gt;&gt; <span class="variable">${ZDOTDIR:-~}</span>/.zshrc</span><br></pre></td></tr></tbody></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><h3 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 全局安装 NodeJS LTS 运行时</span></span><br><span class="line">mise use -g node@lts</span><br><span class="line"><span class="comment"># 在当前安装并使用 NodeJS v22</span></span><br><span class="line">mise use node@22</span><br><span class="line"><span class="comment"># 更新所有过期的运行时</span></span><br><span class="line">mise up</span><br></pre></td></tr></tbody></table></figure><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><p>mise 使用 <code>mise.toml</code> 或 <code>.mise.toml</code> 作为配置文件，例如：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[tools]</span></span><br><span class="line"><span class="attr">nodejs</span> = <span class="string">'18.12.0'</span></span><br><span class="line"><span class="attr">python</span> = <span class="string">'3.10.0'</span></span><br><span class="line"></span><br><span class="line"><span class="section">[env]</span></span><br><span class="line"><span class="attr">DATABASE_URL</span> = <span class="string">'postgres://localhost/myapp'</span></span><br><span class="line"></span><br><span class="line"><span class="section">[tasks]</span></span><br><span class="line"><span class="attr">start</span> = <span class="string">'npm start'</span></span><br><span class="line"><span class="attr">test</span> = <span class="string">'npm test'</span></span><br></pre></td></tr></tbody></table></figure><h2 id="与-Python-venv-集成"><a href="#与-Python-venv-集成" class="headerlink" title="与 Python venv 集成"></a>与 Python venv 集成</h2><p>在目录下创建 <code>.mise.toml</code>，切换到改目录时，会自动切换到自动创建 venv 目录，并设置运行时。也可通过 <code>mise install</code> 手动安装。</p><figure class="highlight toml"><table><tbody><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="section">[tools]</span></span><br><span class="line"><span class="attr">python</span> = <span class="string">"3.11.9"</span> <span class="comment"># [optional] will be used for the venv</span></span><br><span class="line"></span><br><span class="line"><span class="section">[env]</span></span><br><span class="line"><span class="attr">_.python.venv</span> = { path = <span class="string">".venv"</span>, create = <span class="literal">true</span> }</span><br></pre></td></tr></tbody></table></figure><h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>mise 是 asdf 的现代化替代品，提供了更快的性能和更丰富的功能。它保持了与 asdf 的兼容性，同时引入了新的特性，如内置的任务运行器和更灵活的配置选项。对于需要管理多个开发工具和运行时版本的开发者来说，mise 是一个强大而灵活的选择。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/manage-dev-tools-by-mise/</id>
    <link href="https://gythialy.github.io/manage-dev-tools-by-mise/"/>
    <published>2024-09-24T11:04:06.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9taXNlLmpkeC5kZXYv">mise<i class="fa fa-external-link-alt"></i></span> 是一个现代化的开发工具版本管理器，可完美替代 asdf。它提供了更快的性能和更丰富的功能，用于管理多种编程语言、工具和框架的版本，包括但不限于：</p>
<ul>
<li>Bun</li>
<li>Deno</li>
<li>Node.js</li>
<li>Go</li>
<li>Rust</li>
<li>Python</li>
</ul>
<p><strong>mise 的主要优点包括：</strong></p>
<ul>
<li><strong>高性能：</strong> 比 asdf 更快，使用 Rust 编写。</li>
<li><strong>兼容性：</strong> 与 asdf 插件和配置文件兼容，同时支持 cargo，go，npm 等生态。</li>
<li><strong>增强功能：</strong> 提供了更多高级功能，如任务运行器和环境变量管理。</li>
<li><strong>易于使用：</strong> 具有直观的命令行界面和配置文件格式，不需要单独安装 plugin。</li>
</ul>]]>
    </summary>
    <title>使用 mise 管理开发运行时</title>
    <updated>2026-04-21T06:30:40.115Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker/" term="Docker"/>
    <category scheme="https://gythialy.github.io/tags/Registry/" term="Registry"/>
    <category scheme="https://gythialy.github.io/tags/Proxy/" term="Proxy"/>
    <category scheme="https://gythialy.github.io/tags/Cloudflare/" term="Cloudflare"/>
    <content>
      <![CDATA[<h2 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h2><p>需要一个域名，并且域名托管在 Cloudflare 上。</p><h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><ol><li>克隆 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2d5dGhpYWx5L2Nsb3VkZmxhcmUtZG9ja2VyLXByb3h5">https://github.com/gythialy/cloudflare-docker-proxy<i class="fa fa-external-link-alt"></i></span> 到本地</li><li>替换 <code>example.com</code> 为自己的域名</li></ol>  <figure class="highlight bash"><table><tbody><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">sed -i <span class="string">'s/example.com/${your_domain}/g'</span> src/index.js</span><br><span class="line">sed -i <span class="string">'s/example.com/${your_domain}/g'</span> wrangler.toml</span><br><span class="line"><span class="comment"># for macOS</span></span><br><span class="line"><span class="comment"># sed -i '' 's/example.com/${your_domain}/g' src/index.js</span></span><br><span class="line"><span class="comment"># sed -i '' 's/example.com/${your_domain}/g' wrangler.toml</span></span><br></pre></td></tr></tbody></table></figure><ol start="3"><li><code>yarn</code> 安装依赖</li><li><code>npx wrangler deploy</code> 部署</li></ol><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><ul><li>拉取 <code>busybox:stable</code><figure class="highlight bash"><table><tbody><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="comment"># docker pull busybox:stable</span></span><br><span class="line">docker pull docker.example.com/library/busybox:stable</span><br></pre></td></tr></tbody></table></figure></li><li>设置 docker registry 镜像<figure class="highlight bash"><table><tbody><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="built_in">sudo</span> <span class="built_in">mkdir</span> -p /etc/docker</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/docker/daemon.json &lt;&lt;-<span class="string">EOF</span></span><br><span class="line"><span class="string">{</span></span><br><span class="line"><span class="string">    "registry-mirrors": [</span></span><br><span class="line"><span class="string">        "https://docker.example.com",</span></span><br><span class="line"><span class="string">    ]</span></span><br><span class="line"><span class="string">}</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl daemon-reload</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart docker</span><br><span class="line"><span class="comment"># 拉取镜像</span></span><br><span class="line">docker pull busybox:stable</span><br></pre></td></tr></tbody></table></figure><blockquote><p>注：<code>docker.example.com</code> 都需要替换为自己的域名。</p></blockquote></li></ul><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/cloudflare-docker-proxy/</id>
    <link href="https://gythialy.github.io/cloudflare-docker-proxy/"/>
    <published>2024-06-08T04:42:46.000Z</published>
    <summary>
      <![CDATA[<h2 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h2><p>需要一个域名，并且域名托管在 Cloudflare 上。</p>
<h2 id="部署"><a href="#部署" class="head]]>
    </summary>
    <title>基于 Cloudflare 的 Docker 代理</title>
    <updated>2026-04-21T06:30:40.107Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Tips/" term="Tips"/>
    <category scheme="https://gythialy.github.io/tags/macOS/" term="macOS"/>
    <category scheme="https://gythialy.github.io/tags/OnePlus/" term="OnePlus"/>
    <category scheme="https://gythialy.github.io/tags/Android/" term="Android"/>
    <category scheme="https://gythialy.github.io/tags/ColorOS/" term="ColorOS"/>
    <category scheme="https://gythialy.github.io/tags/OxygenOS/" term="OxygenOS"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>OxygenOS 中没国产市场的 app，现在好多 app 并没有在 Google Play 发布。因此可以从 ColorOS 镜像中提取出来，方便安装。</p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><ul><li>根据 <a href="howto-convert-from-ColorOS-to-Global-On-Chinese-Oneplus-12">在 macOS 平台把一加 12 ColorOS 转换为国际版</a> 中的方法，把 从 ColorOS 的<code>payload.bin</code> 中提取 <code>my_</code>开头的 img 文件。</li><li>安装<span class="exturl" data-url="aHR0cHM6Ly9vcmJzdGFjay5kZXYv"> OrbStack<i class="fa fa-external-link-alt"></i></span>，然后创建一个 Ubuntu 虚拟机<figure class="highlight bash"><table><tbody><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">orb create ubuntu my-ubuntu <span class="comment"># 创建虚拟机</span></span><br><span class="line">orb -m my-ubuntu-u root <span class="comment"># SSH 到虚拟机</span></span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="提取"><a href="#提取" class="headerlink" title="提取"></a>提取</h2><figure class="highlight bash"><table><tbody><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"><span class="built_in">mkdir</span> -p /mnt/my_heytap <span class="comment"># 创建挂载点</span></span><br><span class="line">mount -o loop -t erofs app/my_heytap.img /mnt/my_heytap <span class="comment">#挂载 `img` 文件</span></span><br><span class="line">find /mnt/my_heytap/ -name <span class="string">"*.apk"</span> <span class="comment"># 查找 apk 文件</span></span><br><span class="line"><span class="built_in">cp</span> /mnt/my_heytap/priv-app/KeKeMarket.apk <span class="variable">$HOME</span>/apk/ <span class="comment"># 复制到本地</span></span><br></pre></td></tr></tbody></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过挂载 <code>img</code> 文件系统到 Linux 系统，然后从中提取 apk 文件。这里是以 <code>my_heytap</code> 为例，其他分区也可以用同样的方法。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/extract-apk-from-ColorOS-img/</id>
    <link href="https://gythialy.github.io/extract-apk-from-ColorOS-img/"/>
    <published>2024-06-05T10:05:02.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>OxygenOS 中没国产市场的 app，现在好多 app 并没有在 Google Play 发布。因此可以从 ColorOS 镜像中提取出]]>
    </summary>
    <title>从 ColorOS 镜像中提取 apk</title>
    <updated>2026-04-21T06:30:40.112Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/macOS/" term="macOS"/>
    <category scheme="https://gythialy.github.io/tags/OnePlus/" term="OnePlus"/>
    <category scheme="https://gythialy.github.io/tags/Android/" term="Android"/>
    <category scheme="https://gythialy.github.io/tags/ColorOS/" term="ColorOS"/>
    <category scheme="https://gythialy.github.io/tags/OxygenOS/" term="OxygenOS"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>一加 11 之前的版本是可以在氢氧 OS 之间互相刷的，后来合并到 ColorOS 后，莫名增加了很多门槛。在大多数教程中都是基于 Windows 平台。其实要线刷系统思路很简单，就是从 <code>payload.bin</code> 中解压出 <code>img</code> 文件，然后通过 <code>fastboot</code> 刷进去即可。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>安装 adb<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install android-platform-tools</span><br></pre></td></tr></tbody></table></figure></li><li> 下载固件：从 <span class="exturl" data-url="aHR0cHM6Ly94ZGFmb3J1bXMuY29tL3QvaG93LXRvLWNvbnZlcnQtZnJvbS1jb2xvcm9zLXRvLWdsb2JhbC11cy1pbmRpYS1vbi1jaGluZXNlLW9uZXBsdXMtMTIuNDY1MzI1NS8=">XDA<i class="fa fa-external-link-alt"></i></span>这篇文章中找到官方下载链，接，国内也有人做了<span class="exturl" data-url="aHR0cHM6Ly95dW4uZGF4aWFhbXUuY29tL09uZVBsdXNfUm9tcy8lRTQlQjglODAlRTUlOEElQTBPbmVQbHVzJTIwMTIv">分流<i class="fa fa-external-link-alt"></i></span>。理论上来说都是安全的，如果有人修改了文件，签名验证应该过不了。<ul><li>CPH2583 = US = 美版</li><li>CPH2573 = IN = 印度版</li><li>CPH2581 = EU &amp; PU = 欧版</li></ul></li></ul><h2 id="提取-img"><a href="#提取-img" class="headerlink" title="提取 img"></a>提取 <code>img</code></h2><p>这里以 <code>CPH2581</code> 为例，解压 zip 文件到文件夹 <code>oneplus12</code>中。目录结构如下，<code>FTH</code> 为手动创建，用于存放提取出来的 <code>img</code> 文件，<code>flash-all.sh</code> 为刷机脚本。以下所有操作都是在 <code>oneplus12</code> 文件夹中。</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">➜ ll</span><br><span class="line">.rwxr-xr-x@ 1.2k gythialy 22 May 11:16  flash-all.sh</span><br><span class="line">drwxr-xr-x     - gythialy 22 May 11:42  FTH</span><br><span class="line">drwxr-xr-x@    - gythialy 22 May 10:04  META-INF</span><br><span class="line">.rw-r--r--@ 6.6G gythialy  1 Jan  2009  payload.bin</span><br><span class="line">.rw-r--r--@  357 gythialy  1 Jan  2009  payload_properties.txt</span><br></pre></td></tr></tbody></table></figure><p>提取工具为 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NzdXQvcGF5bG9hZC1kdW1wZXItZ28=">payload-dumper-go<i class="fa fa-external-link-alt"></i></span>，官方构建的二进制文件在 macOS ARM 平台会报错，所以下面基于 docker 镜像操作。镜像 <code>latest</code> tag 基于 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NzdXQvcGF5bG9hZC1kdW1wZXItZ28vY29tbWl0L2QwYjBlZmVlNzJiZTEwMDMwYWRhNzI5Njg2OGNlYzIyZWZmOWNhYzY=">d0b0efee72be<i class="fa fa-external-link-alt"></i></span> 构建。</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --<span class="built_in">rm</span> -v <span class="variable">$PWD</span>:/app/ -v <span class="variable">$PWD</span>/FTH:/FTH ghcr.io/gythialy/payload-dumper-go:latest -o /FTH /app/payload.bin</span><br></pre></td></tr></tbody></table></figure><span id="more"></span><p>提取完成后的 <code>FTH</code> 文件如下：</p><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">.rwxr-xr-x 279k gythialy 22 May 10:22  abl.img</span><br><span class="line">.rwxr-xr-x 336k gythialy 22 May 10:22  aop.img</span><br><span class="line">.rwxr-xr-x  29k gythialy 22 May 10:22  aop_config.img</span><br><span class="line">.rwxr-xr-x 1.4M gythialy 22 May 10:22  bluetooth.img</span><br><span class="line">.rwxr-xr-x 201M gythialy 22 May 10:21  boot.img</span><br><span class="line">.rwxr-xr-x 254k gythialy 22 May 10:22  cpucp.img</span><br><span class="line">.rwxr-xr-x  16k gythialy 22 May 10:22  cpucp_dtb.img</span><br><span class="line">.rwxr-xr-x  61k gythialy 22 May 10:22  devcfg.img</span><br><span class="line">.rwxr-xr-x  67M gythialy 22 May 10:22  dsp.img</span><br><span class="line">.rwxr-xr-x  25M gythialy 22 May 10:22  dtbo.img</span><br><span class="line">.rwxr-xr-x 1.0M gythialy 22 May 10:22  engineering_cdt.img</span><br><span class="line">.rwxr-xr-x 106k gythialy 22 May 10:22  featenabler.img</span><br><span class="line">.rwxr-xr-x 1.6M gythialy 22 May 10:22  hyp.img</span><br><span class="line">.rwxr-xr-x  98k gythialy 22 May 10:22  imagefv.img</span><br><span class="line">.rwxr-xr-x 8.4M gythialy 22 May 10:21  init_boot.img</span><br><span class="line">.rwxr-xr-x 426k gythialy 22 May 10:22  keymaster.img</span><br><span class="line">.rwxr-xr-x 302M gythialy 22 May 10:22  modem.img</span><br><span class="line">.rwxr-xr-x 908M gythialy 22 May 10:22  my_bigball.img</span><br><span class="line">.rwxr-xr-x 336k gythialy 22 May 10:22  my_carrier.img</span><br><span class="line">.rwxr-xr-x 336k gythialy 22 May 10:22  my_engineering.img</span><br><span class="line">.rwxr-xr-x 907M gythialy 22 May 10:23  my_heytap.img</span><br><span class="line">.rwxr-xr-x 360k gythialy 22 May 10:22  my_manifest.img</span><br><span class="line">.rwxr-xr-x 767M gythialy 22 May 10:22  my_product.img</span><br><span class="line">.rwxr-xr-x 721k gythialy 22 May 10:22  my_region.img</span><br><span class="line">.rwxr-xr-x 1.1G gythialy 22 May 10:22  my_stock.img</span><br><span class="line">.rwxr-xr-x 1.7G gythialy 22 May 10:22  odm.img</span><br><span class="line">.rwxr-xr-x 872k gythialy 22 May 10:22  oplus_sec.img</span><br><span class="line">.rwxr-xr-x 4.3M gythialy 22 May 10:22  oplusstanvbk.img</span><br><span class="line">.rwxr-xr-x 4.0M gythialy 22 May 10:21  product.img</span><br><span class="line">.rwxr-xr-x  61k gythialy 22 May 10:22  qupfw.img</span><br><span class="line">.rwxr-xr-x 105M gythialy 22 May 10:21  recovery.img</span><br><span class="line">.rwxr-xr-x 139k gythialy 22 May 10:22  shrm.img</span><br><span class="line">.rwxr-xr-x  15M gythialy 22 May 10:22  splash.img</span><br><span class="line">.rwxr-xr-x 649M gythialy 22 May 10:22  system.img</span><br><span class="line">.rwxr-xr-x 7.4M gythialy 22 May 10:21  system_dlkm.img</span><br><span class="line">.rwxr-xr-x 911M gythialy 22 May 10:22  system_ext.img</span><br><span class="line">.rwxr-xr-x 4.1M gythialy 22 May 10:22  tz.img</span><br><span class="line">.rwxr-xr-x 3.2M gythialy 22 May 10:22  uefi.img</span><br><span class="line">.rwxr-xr-x 201k gythialy 22 May 10:22  uefisecapp.img</span><br><span class="line">.rwxr-xr-x 8.2k gythialy 22 May 10:22  vbmeta.img</span><br><span class="line">.rwxr-xr-x 8.2k gythialy 22 May 10:21  vbmeta_system.img</span><br><span class="line">.rwxr-xr-x 4.1k gythialy 22 May 10:22  vbmeta_vendor.img</span><br><span class="line">.rwxr-xr-x 1.2G gythialy 22 May 10:22  vendor.img</span><br><span class="line">.rwxr-xr-x 201M gythialy 22 May 10:21  vendor_boot.img</span><br><span class="line">.rwxr-xr-x  30M gythialy 22 May 10:21  vendor_dlkm.img</span><br><span class="line">.rwxr-xr-x 1.1M gythialy 22 May 10:22  xbl.img</span><br><span class="line">.rwxr-xr-x 229k gythialy 22 May 10:22  xbl_config.img</span><br><span class="line">.rwxr-xr-x 877k gythialy 22 May 10:22  xbl_ramdump.img</span><br></pre></td></tr></tbody></table></figure><p><code>flash-all.sh</code> 会自动检查 <code>FTH</code> 目录中所有的 <code>img</code> 文件，并通过 <code>fastboot</code> 刷写。</p><figure class="highlight bash"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置变量</span></span><br><span class="line">file=vendor_boot</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 fastboot 是否存在</span></span><br><span class="line"><span class="keyword">if</span> ! <span class="built_in">command</span> -v fastboot &amp;&gt; /dev/null; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">"fastboot not found."</span></span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开始刷机</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"************************      START FLASH     ************************"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"*******************      REBOOT FASTBOOTD     *******************"</span></span><br><span class="line">fastboot -aa</span><br><span class="line">fastboot reboot fastboot</span><br><span class="line"><span class="built_in">sleep</span> 5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 刷写 FTH 镜像</span></span><br><span class="line"><span class="keyword">for</span> img <span class="keyword">in</span> FTH/*.img; <span class="keyword">do</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">"flashing <span class="variable">$img</span>"</span></span><br><span class="line">  <span class="comment"># echo "fastboot flash $(basename $img .img) $img"</span></span><br><span class="line">  fastboot flash <span class="string">"<span class="subst">$(basename <span class="string">"<span class="variable">$img</span>"</span> .img)</span>"</span> <span class="string">"<span class="variable">$img</span>"</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 刷写 vendor_boot 镜像</span></span><br><span class="line"><span class="keyword">if</span> [ -f FTH/<span class="variable">$file</span>.zip ]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span></span><br><span class="line">  unzip -p FTH/<span class="variable">$file</span>.zip FTH/<span class="variable">$file</span> &gt; FTH/<span class="variable">$file</span>.img</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">"********************** FTH FLASHING **************************"</span></span><br><span class="line">  fastboot flash <span class="variable">$file</span> FTH/<span class="variable">$file</span>.img</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">"*********************** FASTBOOT AGAIN ***************************"</span></span><br><span class="line">  <span class="built_in">rm</span> -f FTH/<span class="variable">$file</span>.img</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 fastboot</span></span><br><span class="line"><span class="comment"># fastboot reboot fastboot</span></span><br><span class="line"><span class="comment"># sleep 5</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 格式化数据分区</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"**************************** FOMAT DATA ******************************"</span></span><br><span class="line">fastboot -w</span><br><span class="line"><span class="built_in">sleep</span> 5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 bootloader</span></span><br><span class="line">fastboot reboot bootloader</span><br><span class="line"><span class="built_in">sleep</span> 5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 锁定 bootloader</span></span><br><span class="line">fastboot flashing lock</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"Press the \"volume down\" button to \"lock the bootloader"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 退出脚本</span></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></tbody></table></figure><h2 id="刷机"><a href="#刷机" class="headerlink" title="刷机"></a>刷机</h2><h3 id="解锁-OEM-Bootloader锁"><a href="#解锁-OEM-Bootloader锁" class="headerlink" title="解锁 OEM+Bootloader锁"></a>解锁 OEM + Bootloader 锁</h3><ul><li>设置 -&gt; 关于本机 -&gt; 版本信息 -&gt; 版本号敲几次进开发者</li><li>设置 -&gt; 其他设置 -&gt; 开发者选项 -&gt;OEM 解锁和 USB 调试勾上</li><li>手机连电脑，允许 USB 调试</li><li><code>adb devices</code> 能看看到设备</li><li><code>adb reboot bootloader</code> 重启到 fastboot 模式</li><li><code>fastboot flashing unlock</code>，然后音量上下选 unlock</li></ul><p>注：会清空所有数据，做好备份。</p><h3 id="开始刷写"><a href="#开始刷写" class="headerlink" title="开始刷写"></a>开始刷写</h3><p>执行 <code>./flash-all.bash</code> 即可。如果还想 root，把最后的 <code>fastboot flashing lock</code> 注释掉即可。</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ul><li><span class="exturl" data-url="aHR0cHM6Ly94ZGFmb3J1bXMuY29tL3QvaG93LXRvLWNvbnZlcnQtZnJvbS1jb2xvcm9zLXRvLWdsb2JhbC11cy1pbmRpYS1vbi1jaGluZXNlLW9uZXBsdXMtMTIuNDY1MzI1NS8=">How to convert from ColorOS to Global ..US.. India On Chinese Oneplus 12<i class="fa fa-external-link-alt"></i></span></li><li><span class="exturl" data-url="aHR0cHM6Ly95dW4uZGF4aWFhbXUuY29tL09uZVBsdXNfUm9tcy8lRTQlQjglODAlRTUlOEElQTBPbmVQbHVzJTIwMTIv">一加 OnePlus12<i class="fa fa-external-link-alt"></i></span></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>网上有一些第三方提取的 <code>img</code> 文件，从安全角度考虑，建议从官方下载全量包，自行提取比较好。理论上来说，此步骤同样适合 Linux 平台。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/howto-convert-from-ColorOS-to-Global-On-Chinese-Oneplus-12/</id>
    <link href="https://gythialy.github.io/howto-convert-from-ColorOS-to-Global-On-Chinese-Oneplus-12/"/>
    <published>2024-05-22T13:14:42.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>一加 11 之前的版本是可以在氢氧 OS 之间互相刷的，后来合并到 ColorOS 后，莫名增加了很多门槛。在大多数教程中都是基于 Windows 平台。其实要线刷系统思路很简单，就是从 <code>payload.bin</code> 中解压出 <code>img</code> 文件，然后通过 <code>fastboot</code> 刷进去即可。</p>
<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul>
<li>安装 adb<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install android-platform-tools</span><br></pre></td></tr></tbody></table></figure></li>
<li> 下载固件：从 <span class="exturl" data-url="aHR0cHM6Ly94ZGFmb3J1bXMuY29tL3QvaG93LXRvLWNvbnZlcnQtZnJvbS1jb2xvcm9zLXRvLWdsb2JhbC11cy1pbmRpYS1vbi1jaGluZXNlLW9uZXBsdXMtMTIuNDY1MzI1NS8=">XDA<i class="fa fa-external-link-alt"></i></span>这篇文章中找到官方下载链，接，国内也有人做了<span class="exturl" data-url="aHR0cHM6Ly95dW4uZGF4aWFhbXUuY29tL09uZVBsdXNfUm9tcy8lRTQlQjglODAlRTUlOEElQTBPbmVQbHVzJTIwMTIv">分流<i class="fa fa-external-link-alt"></i></span>。理论上来说都是安全的，如果有人修改了文件，签名验证应该过不了。<ul>
<li>CPH2583 = US = 美版</li>
<li>CPH2573 = IN = 印度版</li>
<li>CPH2581 = EU &amp; PU = 欧版</li>
</ul>
</li>
</ul>
<h2 id="提取-img"><a href="#提取-img" class="headerlink" title="提取 img"></a>提取 <code>img</code></h2><p>这里以 <code>CPH2581</code> 为例，解压 zip 文件到文件夹 <code>oneplus12</code>中。目录结构如下，<code>FTH</code> 为手动创建，用于存放提取出来的 <code>img</code> 文件，<code>flash-all.sh</code> 为刷机脚本。以下所有操作都是在 <code>oneplus12</code> 文件夹中。</p>
<figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">➜ ll</span><br><span class="line">.rwxr-xr-x@ 1.2k gythialy 22 May 11:16  flash-all.sh</span><br><span class="line">drwxr-xr-x     - gythialy 22 May 11:42  FTH</span><br><span class="line">drwxr-xr-x@    - gythialy 22 May 10:04  META-INF</span><br><span class="line">.rw-r--r--@ 6.6G gythialy  1 Jan  2009  payload.bin</span><br><span class="line">.rw-r--r--@  357 gythialy  1 Jan  2009  payload_properties.txt</span><br></pre></td></tr></tbody></table></figure>

<p>提取工具为 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NzdXQvcGF5bG9hZC1kdW1wZXItZ28=">payload-dumper-go<i class="fa fa-external-link-alt"></i></span>，官方构建的二进制文件在 macOS ARM 平台会报错，所以下面基于 docker 镜像操作。镜像 <code>latest</code> tag 基于 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3NzdXQvcGF5bG9hZC1kdW1wZXItZ28vY29tbWl0L2QwYjBlZmVlNzJiZTEwMDMwYWRhNzI5Njg2OGNlYzIyZWZmOWNhYzY=">d0b0efee72be<i class="fa fa-external-link-alt"></i></span> 构建。</p>
<figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --<span class="built_in">rm</span> -v <span class="variable">$PWD</span>:/app/ -v <span class="variable">$PWD</span>/FTH:/FTH ghcr.io/gythialy/payload-dumper-go:latest -o /FTH /app/payload.bin</span><br></pre></td></tr></tbody></table></figure>]]>
    </summary>
    <title>在 macOS 平台把一加 12 ColorOS 转换为国际版</title>
    <updated>2026-04-21T06:30:40.113Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Tips/" term="Tips"/>
    <category scheme="https://gythialy.github.io/tags/Cloudflare/" term="Cloudflare"/>
    <category scheme="https://gythialy.github.io/tags/HomeLab/" term="HomeLab"/>
    <category scheme="https://gythialy.github.io/tags/Tunnel/" term="Tunnel"/>
    <content>
      <![CDATA[<p>Cloudflare Tunnel 是一种安全、可靠的内网穿透解决方案，允许您将内部网络中的应用程序和服务暴露到公共互联网。以下是使用 Cloudflare Tunnel 进行内网穿透的步骤：</p><p><strong>1. 准备工作</strong></p><ul><li>Cloudflare 账号: 需要一个 <span class="exturl" data-url="aHR0cHM6Ly93d3cuY2xvdWRmbGFyZS5jb20v">Cloudflare<i class="fa fa-external-link-alt"></i></span> 账号，最好是<strong>绑定信用卡然后开通免费版本</strong>的服务。</li><li>Cloudflare Tunnel 应用程序: 下载并安装 Cloudflare Tunnel 应用程序。您可以从 <span class="exturl" data-url="aHR0cHM6Ly93d3cuY2xvdWRmbGFyZS5jb20vcHJvZHVjdHMvdHVubmVsLw==">tunnel<i class="fa fa-external-link-alt"></i></span> 获取最新版本。</li><li>内网服务: 确保您的内网服务正在运行，并且您知道服务的端口号。</li><li>域名: 您需要一个域名来访问您的内网服务。您可以使用您自己的域名，也可以使用 Cloudflare 提供的免费子域名。</li></ul><p><strong>2. 配置 Cloudflare Tunnel</strong></p><ul><li>创建 Tunnel: 在 Cloudflare Tunnel 应用程序中，创建一个新的 Tunnel。</li><li>配置 Tunnel: 在 Tunnel 配置中，您需要指定以下信息：<ul><li>Tunnel 名称: 为您的 Tunnel 命名。</li><li>域名: 指定您要使用的域名。</li><li>服务端口: 指定您内网服务的端口号。</li><li>命令: 指定启动您的内网服务的命令。</li></ul></li><li>生成证书: Cloudflare Tunnel 将自动生成一个证书，用于安全连接您的内网服务。</li></ul><p><strong>3. 示例:</strong></p><p>假设您的内网服务是一个运行在端口 <code>2001</code> 上的 Web 服务器，您的域名是 <code>example.com</code>。以下是使用 Cloudflare Tunnel 进行内网穿透的步骤：</p><ol><li><p>创建 Tunnel: 在 Cloudflare Tunnel 应用程序中，创建一个名为 <code>HomeLab-tunnel</code> 的 Tunnel，并获取 tunnel 的 token。</p></li><li><p>配置 Hostname: 在 Tunnel 配置中，指定以下信息：</p><ul><li>域名: <code>whoaim.example.com</code></li><li>服务: <code>http://whoami:2001</code></li></ul></li><li><p>部署 Tunnel: 在您的内网服务器上安装并启动 Cloudflare Tunnel 应用程序。</p></li><li><p>验证连接: 使用 <code>https://whoaim.example.com</code> 访问您的 Web 服务器，确保连接正常。</p> <figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.9'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">    <span class="attr">whoami:</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">traefik/whoami</span></span><br><span class="line">        <span class="attr">command:</span></span><br><span class="line">            <span class="comment"># It tells whoami to start listening on 2001 instead of 80</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">--port=2001</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">--name=iamfoo</span></span><br><span class="line">        <span class="attr">networks:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">nginx-proxy</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">tunnel:</span></span><br><span class="line">        <span class="attr">container_name:</span> <span class="string">cloudflared-tunnel</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">cloudflare/cloudflared:2024.5.0</span></span><br><span class="line">        <span class="attr">user:</span> <span class="string">root</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">read_only:</span> <span class="literal">true</span></span><br><span class="line">        <span class="attr">volumes:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">./cloudflared:/root/.cloudflared/</span></span><br><span class="line">        <span class="attr">command:</span> <span class="string">tunnel</span> <span class="string">--no-autoupdate</span> <span class="string">run</span> <span class="string">--token</span> <span class="string">${TUNNEL_TOKEN}</span></span><br><span class="line">        <span class="attr">networks:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">nginx-proxy</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">    <span class="attr">nginx-proxy:</span></span><br><span class="line">        <span class="attr">external:</span> <span class="literal">true</span></span><br></pre></td></tr></tbody></table></figure></li></ol><p>注： 这里是用的是在线配置的方式，也可以通过<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL2Nsb3VkZmxhcmUtb25lL2Nvbm5lY3Rpb25zL2Nvbm5lY3QtbmV0d29ya3MvY29uZmlndXJlLXR1bm5lbHMvbG9jYWwtbWFuYWdlbWVudC8=">离线配置<i class="fa fa-external-link-alt"></i></span>的方式，配置文件放到 <code>cloudflared</code> 目录即可。</p><p><strong>4. 总结:</strong></p><p>Cloudflare Tunnel 提供了一种安全、可靠的内网穿透解决方案，可以帮助您轻松地将内部网络中的应用程序和服务暴露到公共互联网。通过遵循上述步骤，您可以轻松地配置 Cloudflare Tunnel，并享受其带来的便利和安全性。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/expose-homelab-service-via-cloudflare-tunnel/</id>
    <link href="https://gythialy.github.io/expose-homelab-service-via-cloudflare-tunnel/"/>
    <published>2024-05-21T08:44:53.000Z</published>
    <summary>
      <![CDATA[<p>Cloudflare Tunnel 是一种安全、可靠的内网穿透解决方案，允许您将内部网络中的应用程序和服务暴露到公共互联网。以下是使用 Cloudflare Tunnel 进行内网穿透的步骤：</p>
<p><strong>1. 准备工作</strong></p>
<ul>]]>
    </summary>
    <title>基于 Cloudflare Tunnel 进行内网穿透</title>
    <updated>2026-04-21T06:30:40.112Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Tips/" term="Tips"/>
    <category scheme="https://gythialy.github.io/tags/Hexo/" term="Hexo"/>
    <category scheme="https://gythialy.github.io/tags/GitHub-Pages/" term="GitHub Pages"/>
    <category scheme="https://gythialy.github.io/tags/GitHub-Actions/" term="GitHub Actions"/>
    <content>
      <![CDATA[<p>之前在 <a href="deploy-hexo-to-github-pages-via-github-actions">通过 GitHub Actions 自动部署 Hexo</a>，通过创建两个不同的分支，<code>raw</code> 分支存储原始的 Hexo 项目，<code>master</code> 分支存储<code>hexo generate</code>编译出来的静态页面，通过 <code>hexo deploy</code>来部署。由于使用了 <code>hexo deploy</code> 需要设置部署用的 SSH 密钥。</p><p>下面的办法更简单，不需要做额外的设置，Hexo 项目在 <code>main</code>分支，不需要再添加其他分支。</p><figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Hexo</span> <span class="string">deploy</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">raw</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Use</span> <span class="string">Node.js</span> <span class="string">(.tool-versions)</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version-file:</span> <span class="string">".tool-versions"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">pnpm/action-setup@v3</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">Install</span> <span class="string">pnpm</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">version:</span> <span class="number">8</span></span><br><span class="line">          <span class="attr">run_install:</span> <span class="literal">false</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Get</span> <span class="string">pnpm</span> <span class="string">store</span> <span class="string">directory</span></span><br><span class="line">        <span class="attr">shell:</span> <span class="string">bash</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          echo "STORE_PATH=$(pnpm store path --silent)" &gt;&gt; $GITHUB_ENV</span></span><br><span class="line"><span class="string"></span>      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">pnpm</span> <span class="string">cache</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">${{</span> <span class="string">env.STORE_PATH</span> <span class="string">}}</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">${{</span> <span class="string">runner.os</span> <span class="string">}}-pnpm-store-${{</span> <span class="string">hashFiles('**/pnpm-lock.yaml')</span> <span class="string">}}</span></span><br><span class="line">          <span class="attr">restore-keys:</span> <span class="string">|</span></span><br><span class="line"><span class="string">            ${{ runner.os }}-pnpm-store-</span></span><br><span class="line"><span class="string"></span>      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">install</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">Pages</span> <span class="string">artifact</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/upload-pages-artifact@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">./public</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">build</span></span><br><span class="line">    <span class="attr">permissions:</span></span><br><span class="line">      <span class="attr">pages:</span> <span class="string">write</span></span><br><span class="line">      <span class="attr">id-token:</span> <span class="string">write</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">github-pages</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">${{</span> <span class="string">steps.deployment.outputs.page_url</span> <span class="string">}}</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">GitHub</span> <span class="string">Pages</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">deployment</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/deploy-pages@v4</span></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/deploy-hexo-via-github-action/</id>
    <link href="https://gythialy.github.io/deploy-hexo-via-github-action/"/>
    <published>2024-05-08T02:07:03.000Z</published>
    <summary>
      <![CDATA[<p>之前在 <a href="deploy-hexo-to-github-pages-via-github-actions">通过 GitHub Actions 自动部署 Hexo</a>，通过创建两个不同的分支，<code>raw</code> 分支存储原始的 Hexo 项目]]>
    </summary>
    <title>自动部署 Hexo 到 Github Pages</title>
    <updated>2026-04-21T06:30:40.107Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Zsh/" term="Zsh"/>
    <category scheme="https://gythialy.github.io/tags/oh-my-zsh/" term="oh-my-zsh"/>
    <content>
      <![CDATA[<p>在折腾过<a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">antigen</a>、<a href="/zsh-antidote-config/" title="使用 Antidote 管理 Zsh 配置">antidote</a>、<a href="/zsh-sheldon-config/" title="使用 sheldon 管理 Zsh 配置">sheldon</a> 等 Zsh 的包管理器之后，我发现我主要使用的还是 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL29obXl6c2gvb2hteXpzaA==">oh-my-zsh<i class="fa fa-external-link-alt"></i></span>。那就回归本源，再加上现在 oh-my-zsh 也可以自定义 Plugin。</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># install oh-my-zsh</span></span><br><span class="line">sh -c <span class="string">"<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)</span>"</span></span><br><span class="line"><span class="comment"># install oh-my-zsh custom plugins</span></span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/zsh-users/zsh-autosuggestions  <span class="variable">$ZSH_CUSTOM</span>/plugins/zsh-autosuggestions</span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/zsh-users/zsh-completions <span class="variable">$ZSH_CUSTOM</span>/plugins/zsh-completions</span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting <span class="variable">$ZSH_CUSTOM</span>/plugins/zsh-syntax-highlighting</span><br><span class="line"><span class="comment"># install spaceship</span></span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/spaceship-prompt/spaceship-prompt.git <span class="variable">$ZSH_CUSTOM</span>/themes/spaceship-prompt</span><br><span class="line"><span class="built_in">ln</span> -s <span class="string">"<span class="variable">$ZSH_CUSTOM</span>/themes/spaceship-prompt/spaceship.zsh-theme"</span> <span class="string">"<span class="variable">$ZSH_CUSTOM</span>/themes/spaceship.zsh-theme"</span></span><br></pre></td></tr></tbody></table></figure><p>在 <code>.zshrc</code> 中 通过 <code>plugins</code> 配置需要启用的插件。</p><figure class="highlight bash"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> ZSH=<span class="string">"<span class="variable">$HOME</span>/.oh-my-zsh"</span></span><br><span class="line">DISABLE_MAGIC_FUNCTIONS=<span class="literal">true</span></span><br><span class="line">ZSH_THEME=<span class="string">"spaceship"</span></span><br><span class="line">plugins=(</span><br><span class="line">    command-not-found</span><br><span class="line">    common-aliases</span><br><span class="line">    docker</span><br><span class="line">    git</span><br><span class="line">    bun</span><br><span class="line">    npm</span><br><span class="line">    yarn</span><br><span class="line">    kubectl</span><br><span class="line">    asdf</span><br><span class="line">    thefuck</span><br><span class="line">    zsh-autosuggestions</span><br><span class="line">    zsh-syntax-highlighting</span><br><span class="line">    zsh-completions</span><br><span class="line">)</span><br><span class="line"><span class="built_in">source</span> <span class="variable">$ZSH</span>/oh-my-zsh.sh</span><br></pre></td></tr></tbody></table></figure><figure class="highlight bash"><table><tbody><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="comment"># 设置别名更新 omz 插件</span></span><br><span class="line"><span class="built_in">alias</span> update-omz-plugins=<span class="string">'[ -n "$ZSH_CUSTOM" ] &amp;&amp; [ -d "$ZSH_CUSTOM" ] &amp;&amp; find "$ZSH_CUSTOM" -type d -name ".git" -exec sh -c "cd \"{}\"/../ &amp;&amp; echo Updating {} &amp;&amp; git pull --rebase" \;'</span></span><br></pre></td></tr></tbody></table></figure><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/oh-my-zsh-with-custom-plugins/</id>
    <link href="https://gythialy.github.io/oh-my-zsh-with-custom-plugins/"/>
    <published>2024-05-07T02:45:27.000Z</published>
    <summary>
      <![CDATA[<p>在折腾过<a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">antigen</a>、<a href="/zsh-antidote-config/" title="使用 Antidote 管理 Zsh 配置">antidot]]>
    </summary>
    <title>ohmyzsh 安装自定义插件和主题</title>
    <updated>2026-04-21T06:30:40.115Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/asdf/" term="asdf"/>
    <category scheme="https://gythialy.github.io/tags/Zsh/" term="Zsh"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9hc2RmLXZtLmNvbS8=">asdf<i class="fa fa-external-link-alt"></i></span> 是一个版本管理器，用于在不同的项目中管理和切换软件版本。它支持多种编程语言、工具和框架，包括但不限于：</p><ul><li>Python</li><li>Ruby</li><li>Node.js</li><li>Java</li><li>Rust</li><li>Docker</li></ul><p><strong>asdf 的主要优点包括：</strong></p><ul><li><strong>版本管理：</strong> 允许您轻松安装、切换和卸载不同版本的软件。</li><li><strong>项目隔离：</strong> 每个项目都可以使用自己的软件版本集，而不会影响其他项目。</li><li><strong>跨平台支持：</strong> 可在 macOS、Linux 和 Windows 上使用。</li><li><strong>易于使用：</strong> 具有简洁直观的命令行界面。</li></ul><span id="more"></span><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tbody><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">brew install asdf</span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\n. <span class="subst">$(brew --prefix asdf)</span>/libexec/asdf.sh"</span> &gt;&gt; <span class="variable">${ZDOTDIR:-~}</span>/.zshrc</span><br></pre></td></tr></tbody></table></figure><p>也可以使用<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL29obXl6c2gvb2hteXpzaC9ibG9iL21hc3Rlci9wbHVnaW5zL2FzZGYvYXNkZi5wbHVnaW4uenNo"> asdf for oh-my-zsh<i class="fa fa-external-link-alt"></i></span> 来自动加载</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><h3 id="插件相关"><a href="#插件相关" class="headerlink" title="插件相关"></a>插件相关</h3><figure class="highlight bash"><table><tbody><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"># 安装插件，比如 nodejs</span></span><br><span class="line">asdf plugin-add &lt;plugin&gt;</span><br><span class="line"><span class="comment"># 列出已安装的插件</span></span><br><span class="line">asdf plugin-list</span><br><span class="line"><span class="comment"># 列出所有支持的插件</span></span><br><span class="line">asdf plugin-list-all</span><br><span class="line"><span class="comment"># 卸载插件</span></span><br><span class="line">asdf plugin-remove &lt;plugin&gt;</span><br><span class="line"><span class="comment"># 更新插件</span></span><br><span class="line">asdf plugin-update &lt;plugin&gt;</span><br><span class="line"><span class="comment"># 更新所有插件</span></span><br><span class="line">asdf plugin-update --all</span><br></pre></td></tr></tbody></table></figure><h3 id="运行时相关"><a href="#运行时相关" class="headerlink" title="运行时相关"></a>运行时相关</h3><figure class="highlight bash"><table><tbody><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"># 列出已安装的运行时</span></span><br><span class="line">asdf list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装插件</span></span><br><span class="line">asdf install &lt;plugin&gt; &lt;version&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置运行时默认版本</span></span><br><span class="line">asdf global &lt;plugin&gt; &lt;version&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换版本</span></span><br><span class="line">asdf <span class="built_in">local</span> &lt;plugin&gt; &lt;version&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载运行时插件</span></span><br><span class="line">asdf uninstall &lt;plugin&gt; &lt;version&gt;</span><br></pre></td></tr></tbody></table></figure><h3 id="其他有用的命令"><a href="#其他有用的命令" class="headerlink" title="其他有用的命令"></a>其他有用的命令</h3><ul><li><code>asdf rehash</code>：重新加载所有插件</li><li><code>asdf which</code>：显示特定插件的路径</li><li><code>asdf doctor</code>：诊断 asdf 安装问题</li></ul><p><strong>zsh 特有命令</strong></p><ul><li><code>asdf-reshim</code>：重新加载 asdf 插件，并在当前 shell 中设置环境变量</li><li><code>asdf-where</code>：显示特定插件的安装路径</li></ul><p><strong>示例：使用 asdf 管理 Python 版本</strong></p><figure class="highlight bash"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Python 3.10.0</span></span><br><span class="line">asdf install python 3.10.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置 Python 3.10.0 为默认版本</span></span><br><span class="line">asdf global python 3.10.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换到 Python 3.9.0</span></span><br><span class="line">asdf shell python 3.9.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新加载 asdf 插件并设置环境变量</span></span><br><span class="line">asdf reshim</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 Python 3.9.0</span></span><br><span class="line">python --version</span><br><span class="line"><span class="comment"># Python 3.9.0</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换回默认版本（Python 3.10.0）</span></span><br><span class="line">asdf shell python default</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载 Python 3.9.0</span></span><br><span class="line">asdf uninstall python 3.9.0</span><br></pre></td></tr></tbody></table></figure><h2 id="direnv配置"><a href="#direnv配置" class="headerlink" title="direnv配置"></a><code>direnv</code>配置</h2><figure class="highlight bash"><table><tbody><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"><span class="comment"># 安装 direnv</span></span><br><span class="line">asdf plugin-add direnv</span><br><span class="line">asdf install direnv latest</span><br><span class="line">asdf global direnv latest</span><br></pre></td></tr></tbody></table></figure><p><code>.envrc</code>配置，用于自动切换运行时</p><figure class="highlight bash"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># .envrc</span></span><br><span class="line"><span class="comment"># check if python version is set in current dir</span></span><br><span class="line"><span class="keyword">if</span> [ -f <span class="string">".tool-versions"</span> ] ; <span class="keyword">then</span></span><br><span class="line">    <span class="keyword">if</span> [ ! -d <span class="string">".venv"</span> ] ; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"Installing virtualenv for <span class="subst">$(python -V)</span>"</span></span><br><span class="line">        <span class="comment"># if we didn't install `py2venv` for python 2.x, we would need to use</span></span><br><span class="line">        <span class="comment"># `virtualenv`, which you would have to install separately.</span></span><br><span class="line">        python -m venv .venv</span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"Activating <span class="subst">$(python -V)</span> virtualenv"</span></span><br><span class="line">    <span class="built_in">source</span> .venv/bin/activate</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="comment"># announce python version and show the path of the current python in ${PATH}</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"Virtualenv has been activated for <span class="subst">$(python -V)</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="subst">$(which python)</span>"</span></span><br></pre></td></tr></tbody></table></figure><h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>asdf 是一个强大的版本管理器，可以帮助您轻松管理和切换不同项目的软件版本。它易于使用，并且受到开发人员社区的广泛支持。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/manage-multiple-runtimes-via-asdf/</id>
    <link href="https://gythialy.github.io/manage-multiple-runtimes-via-asdf/"/>
    <published>2024-05-05T08:47:13.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9hc2RmLXZtLmNvbS8=">asdf<i class="fa fa-external-link-alt"></i></span> 是一个版本管理器，用于在不同的项目中管理和切换软件版本。它支持多种编程语言、工具和框架，包括但不限于：</p>
<ul>
<li>Python</li>
<li>Ruby</li>
<li>Node.js</li>
<li>Java</li>
<li>Rust</li>
<li>Docker</li>
</ul>
<p><strong>asdf 的主要优点包括：</strong></p>
<ul>
<li><strong>版本管理：</strong> 允许您轻松安装、切换和卸载不同版本的软件。</li>
<li><strong>项目隔离：</strong> 每个项目都可以使用自己的软件版本集，而不会影响其他项目。</li>
<li><strong>跨平台支持：</strong> 可在 macOS、Linux 和 Windows 上使用。</li>
<li><strong>易于使用：</strong> 具有简洁直观的命令行界面。</li>
</ul>]]>
    </summary>
    <title>基于 asdf 管理多种运行时</title>
    <updated>2026-04-21T06:30:40.115Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Alacritty/" term="Alacritty"/>
    <category scheme="https://gythialy.github.io/tags/Zellij/" term="Zellij"/>
    <category scheme="https://gythialy.github.io/tags/Terminal/" term="Terminal"/>
    <category scheme="https://gythialy.github.io/tags/macOS/" term="macOS"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><strong>Alacritty 简介</strong></p><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FsYWNyaXR0eS9hbGFjcml0dHk=">Alacritty<i class="fa fa-external-link-alt"></i></span> 是一款开源、跨平台的终端仿真器，以其高性能、低延迟和可定制性而闻名。它使用 Rust 编程语言编写，并利用 GPU 渲染来实现流畅的滚动和快速的文本渲染。</p><p><strong>优点</strong></p><ul><li><strong>高性能：</strong> GPU 渲染引擎使其成为市场上最快的终端仿真器之一，即使在处理大量文本或图形时也能提供流畅的体验。</li><li><strong>低延迟：</strong> 响应延迟极低。</li><li><strong>跨平台：</strong> 可在 Windows、macOS、Linux 和 FreeBSD 上运行。</li><li><strong>开源：</strong> 是开源的，这意味着用户可以自由查看、修改和分发其源代码。</li></ul><p><strong>缺点</strong></p><ul><li><strong>有限的扩展性：</strong> 与其他终端仿真器相比，不支持插件或扩展。</li><li><strong>缺少某些功能：</strong> 缺少某些高级功能，例如选项卡、分割窗格。</li></ul><p><strong>Zellij 介绍</strong></p><p><span class="exturl" data-url="aHR0cHM6Ly96ZWxsaWouZGV2Lw==">Zellij<i class="fa fa-external-link-alt"></i></span> 是一款开源、跨平台的终端复用器，它允许用户在单个窗口中管理多个终端会话。它使用 Rust 编程语言编写，并具有现代、可定制的界面。</p><p><strong>特点</strong></p><ul><li><strong>终端复用：</strong> 核心功能是终端复用，它允许用户在单个窗口中打开和管理多个终端会话。</li><li><strong>可定制性：</strong> 提供了广泛的配置选项，允许用户根据自己的喜好定制布局、键盘快捷键和配色方案。</li><li><strong>插件支持：</strong> 支持插件，允许用户扩展其功能，例如添加对外部工具或服务的集成。</li><li><strong>跨平台：</strong> 可在 Windows、macOS、Linux 和 FreeBSD 上运行。</li><li><strong>开源：</strong> 是开源的，这意味着用户可以自由查看、修改和分发其源代码。</li></ul><blockquote><p>介绍部分为 Gemini 生成，手动做了部分调整。</p></blockquote><span id="more"></span><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install alacritty zellij font-iosevka-term-nerd-font</span><br></pre></td></tr></tbody></table></figure><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><figure class="highlight bash"><table><tbody><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"><span class="comment"># 修改主题</span></span><br><span class="line">zellij options --theme catppuccin-mocha</span><br><span class="line"><span class="comment"># 下载 alacritty 主题 catppuccin-mocha</span></span><br><span class="line"><span class="built_in">mkdir</span> -p ~/.config/alacritty/themes &amp;&amp; curl -LO --output-dir ~/.config/alacritty/themes https://github.com/catppuccin/alacritty/raw/main/catppuccin-mocha.toml</span><br></pre></td></tr></tbody></table></figure><p><span class="exturl" data-url="aHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3l0aGlhbHkvMTQ4N2E5MDdmZGI2MDEyOGIyODU3OGYzNTJmNGU3MTk=">Alacritty 完整配置<i class="fa fa-external-link-alt"></i></span>如下:</p><figure class="highlight toml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">import</span> = [</span><br><span class="line">  <span class="comment"># uncomment the flavour you want below:</span></span><br><span class="line">  <span class="comment"># "~/.config/alacritty/themes/catppuccin-latte.toml",</span></span><br><span class="line">  <span class="comment"># "~/.config/alacritty/themes/catppuccin-frappe.toml"</span></span><br><span class="line">  <span class="comment"># "~/.config/alacritty/themes/catppuccin-macchiato.toml"</span></span><br><span class="line">  <span class="string">"~/.config/alacritty/themes/catppuccin-mocha.toml"</span>,</span><br><span class="line">  <span class="string">"~/.config/alacritty/keybindings.toml"</span>,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="attr">live_config_reload</span> = <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="section">[env]</span></span><br><span class="line"><span class="attr">TERM</span> = <span class="string">"xterm-256color"</span></span><br><span class="line"><span class="attr">ZELLIJ_AUTO_ATTACH</span> = <span class="string">"true"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[colors]</span></span><br><span class="line"><span class="attr">draw_bold_text_with_bright_colors</span> = <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="section">[cursor.style]</span></span><br><span class="line"><span class="attr">shape</span> = <span class="string">"Beam"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[font]</span></span><br><span class="line"><span class="attr">size</span> = <span class="number">15.0</span></span><br><span class="line"></span><br><span class="line"><span class="section">[font.bold]</span></span><br><span class="line"><span class="attr">family</span> = <span class="string">"IosevkaTerm Nerd Font"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[font.bold_italic]</span></span><br><span class="line"><span class="attr">family</span> = <span class="string">"IosevkaTerm Nerd Font"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[font.italic]</span></span><br><span class="line"><span class="attr">family</span> = <span class="string">"IosevkaTerm Nerd Font"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[font.normal]</span></span><br><span class="line"><span class="attr">family</span> = <span class="string">"IosevkaTerm Nerd Font"</span></span><br><span class="line"><span class="attr">style</span> = <span class="string">"Regular"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[selection]</span></span><br><span class="line"><span class="attr">save_to_clipboard</span> = <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="section">[shell]</span></span><br><span class="line"><span class="attr">args</span> = [<span class="string">"attach"</span>, <span class="string">"--index=0"</span>, <span class="string">"--create"</span>]</span><br><span class="line"><span class="attr">program</span> = <span class="string">"zellij"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[window]</span></span><br><span class="line"><span class="attr">decorations</span> = <span class="string">"Transparent"</span></span><br><span class="line"><span class="attr">blur</span> = <span class="literal">true</span></span><br><span class="line"><span class="attr">opacity</span> = <span class="number">0.8</span></span><br><span class="line"></span><br><span class="line"><span class="section">[window.dimensions]</span></span><br><span class="line"><span class="attr">columns</span> = <span class="number">120</span></span><br><span class="line"><span class="attr">lines</span> = <span class="number">45</span></span><br><span class="line"></span><br><span class="line"><span class="section">[window.padding]</span></span><br><span class="line"><span class="attr">x</span> = <span class="number">10</span></span><br><span class="line"><span class="attr">y</span> = <span class="number">22</span></span><br></pre></td></tr></tbody></table></figure><p>如果将 Alacritty 设为默认终端的话，可以将配置文件中的<code>[shell]</code>部分注释，通过以下命令配置 zellij：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">'eval "$(zellij setup --generate-auto-start zsh)"'</span> &gt;&gt; ~/.zshrc</span><br></pre></td></tr></tbody></table></figure><blockquote><p> Zellij 更多配置项也可以参考<span class="exturl" data-url="aHR0cHM6Ly96ZWxsaWouZGV2L2RvY3VtZW50YXRpb24v">官方文档<i class="fa fa-external-link-alt"></i></span>，默认配置对普通用户来说足矣。</p></blockquote><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Zellij 相对于 tmux 来说几乎是开箱即用，对于没有复杂需求的用户来说非常友好。Alacritty 虽然启动速度很快，对于相同的配置来说，启动速度比 iTerm2 肉眼可见地快，但是开发者对社区的响应很慢，对不少 PR 也是视而不见。</p><p>最终效果：</p><p><img data-src="/alacritty-and-zellij-intergration/SCR-20240505-jrkl.png"></p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/alacritty-and-zellij-intergration/</id>
    <link href="https://gythialy.github.io/alacritty-and-zellij-intergration/"/>
    <published>2024-05-05T08:03:36.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><strong>Alacritty 简介</strong></p>
<p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FsYWNyaXR0eS9hbGFjcml0dHk=">Alacritty<i class="fa fa-external-link-alt"></i></span> 是一款开源、跨平台的终端仿真器，以其高性能、低延迟和可定制性而闻名。它使用 Rust 编程语言编写，并利用 GPU 渲染来实现流畅的滚动和快速的文本渲染。</p>
<p><strong>优点</strong></p>
<ul>
<li><strong>高性能：</strong> GPU 渲染引擎使其成为市场上最快的终端仿真器之一，即使在处理大量文本或图形时也能提供流畅的体验。</li>
<li><strong>低延迟：</strong> 响应延迟极低。</li>
<li><strong>跨平台：</strong> 可在 Windows、macOS、Linux 和 FreeBSD 上运行。</li>
<li><strong>开源：</strong> 是开源的，这意味着用户可以自由查看、修改和分发其源代码。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>有限的扩展性：</strong> 与其他终端仿真器相比，不支持插件或扩展。</li>
<li><strong>缺少某些功能：</strong> 缺少某些高级功能，例如选项卡、分割窗格。</li>
</ul>
<p><strong>Zellij 介绍</strong></p>
<p><span class="exturl" data-url="aHR0cHM6Ly96ZWxsaWouZGV2Lw==">Zellij<i class="fa fa-external-link-alt"></i></span> 是一款开源、跨平台的终端复用器，它允许用户在单个窗口中管理多个终端会话。它使用 Rust 编程语言编写，并具有现代、可定制的界面。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>终端复用：</strong> 核心功能是终端复用，它允许用户在单个窗口中打开和管理多个终端会话。</li>
<li><strong>可定制性：</strong> 提供了广泛的配置选项，允许用户根据自己的喜好定制布局、键盘快捷键和配色方案。</li>
<li><strong>插件支持：</strong> 支持插件，允许用户扩展其功能，例如添加对外部工具或服务的集成。</li>
<li><strong>跨平台：</strong> 可在 Windows、macOS、Linux 和 FreeBSD 上运行。</li>
<li><strong>开源：</strong> 是开源的，这意味着用户可以自由查看、修改和分发其源代码。</li>
</ul>
<blockquote>
<p>介绍部分为 Gemini 生成，手动做了部分调整。</p>
</blockquote>]]>
    </summary>
    <title>Alacritty 与 Zellij 集成</title>
    <updated>2026-04-21T06:30:40.102Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker/" term="Docker"/>
    <category scheme="https://gythialy.github.io/tags/Cloudflare/" term="Cloudflare"/>
    <category scheme="https://gythialy.github.io/tags/Docker-Compose/" term="Docker-Compose"/>
    <category scheme="https://gythialy.github.io/tags/Nginx/" term="Nginx"/>
    <category scheme="https://gythialy.github.io/tags/SSL/" term="SSL"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>如果在内网中运行本地 Web 应用程序，可以使用 IP 地址和端口组合来访问服务，例如 <code>http://192.168.1.32:8096</code> 来访问 Jellyfin。但是如果发生 IP 变更的话，就需要修改 IP 地址，因此可以通过反向代理和本地域名的组合，例如 <code>https://jellyfin.local</code> 或 <code>https://homeassistant.local</code> 来避免 IP 地址变更。这种由于是使用了自己生产的 CA 证书，浏览器会有告警提示。</p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p>假定本地运行 Jellyfin 服务器的 HomeLab IP 为 <code>192.168.1.32</code>，容器名称为 jellyfin，端口为 8096，域名为 jellyfin.example.xyz</p><h3 id="域名"><a href="#域名" class="headerlink" title="域名"></a>域名</h3><h4 id="自有域名"><a href="#自有域名" class="headerlink" title="自有域名"></a>自有域名</h4><p>这里以 <code>Cloudflare</code> 为例</p><ol><li>在 <span class="exturl" data-url="aHR0cHM6Ly9kYXNoLmNsb3VkZmxhcmUuY29tL3Byb2ZpbGUvYXBpLXRva2Vucw==">My Profile/API Tokens<i class="fa fa-external-link-alt"></i></span> 页面生成有 <code>Zone.DNS</code> 权限的 API token</li><li>在 DNS 记录中添加一条 A 记录，名称为 <code>jellyfin</code>, 内容为 <code>192.168.1.32</code>，代理状态为 <code> 仅 DNS - reserved IP</code></li></ol><h4 id="没有域名"><a href="#没有域名" class="headerlink" title="没有域名"></a>没有域名</h4><p>通过 <span class="exturl" data-url="aHR0cHM6Ly93d3cuZHVja2Rucy5vcmcv">DuckDNS<i class="fa fa-external-link-alt"></i></span> 注册账号，然后添加域名记录，比如 <code>homelab001</code>，IP 地址设为 <code>192.168.1.32</code>，最终的域名为 <code>https://jellyfin.homelab001.duckdns.org</code></p><span id="more"></span><h3 id="反向代理"><a href="#反向代理" class="headerlink" title="反向代理"></a>反向代理</h3><p>通过 <code>docker-compose up -d</code> 启动 Nginx Proxy Manager，然后通过 <span class="exturl" data-url="aHR0cDovLzE5Mi4xNjguMS4zMjo4MS8=">http://192.168.1.32:81<i class="fa fa-external-link-alt"></i></span> 访问。默认账号如下</p><figure class="highlight plaintext"><table><tbody><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">Email:    admin@example.com</span><br><span class="line">Password: changeme</span><br></pre></td></tr></tbody></table></figure><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'2'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">nginx-proxy:</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">container_name:</span> <span class="string">nginx-proxy-manager</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"80:80"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"81:81"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"443:443"</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><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shanghai</span></span><br><span class="line">    <span class="attr">networks:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">nginx-proxy</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">nginx-proxy:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">nginx-proxy</span></span><br></pre></td></tr></tbody></table></figure><p>在 <code>SSL Certificates</code> 标签页中通过 Let’s Enctrypt 生成通配符证书。<br><img data-src="/free-valid-SSL-certificates-for-homelab/SCR-20240116-nesd.png"></p><p>在 <code>Proxy Hosts</code> 中添加一条记录<br><img data-src="/free-valid-SSL-certificates-for-homelab/SCR-20240116-nghq.png"></p><p>在 <code>SSL</code> 标签中中选中第一步生成的通配符证书<br><img data-src="/free-valid-SSL-certificates-for-homelab/SCR-20240116-nglo.png"></p><p>生效后，就可以通过 <code>https://jellyfin.example.xyz</code> 访问，如果是通过 DuckDNS 的话，通过 <code>https://jellyfin.homelab001.duckdns.org</code> 访问。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>至此，为内网服务生成有效的 SSL 证书，并绑定内网服务。如果要在外网访问内部服务可以通过 <a href="/access-lan-from-remote-by-zerotier/" title="基于 ZeroTier 和 Openwrt 路由器的内网互联">Zerotier</a> 或者其他类似服务来实现。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/free-valid-SSL-certificates-for-homelab/</id>
    <link href="https://gythialy.github.io/free-valid-SSL-certificates-for-homelab/"/>
    <published>2024-01-16T07:03:20.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>如果在内网中运行本地 Web 应用程序，可以使用 IP 地址和端口组合来访问服务，例如 <code>http://192.168.1.32:8096</code> 来访问 Jellyfin。但是如果发生 IP 变更的话，就需要修改 IP 地址，因此可以通过反向代理和本地域名的组合，例如 <code>https://jellyfin.local</code> 或 <code>https://homeassistant.local</code> 来避免 IP 地址变更。这种由于是使用了自己生产的 CA 证书，浏览器会有告警提示。</p>
<h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p>假定本地运行 Jellyfin 服务器的 HomeLab IP 为 <code>192.168.1.32</code>，容器名称为 jellyfin，端口为 8096，域名为 jellyfin.example.xyz</p>
<h3 id="域名"><a href="#域名" class="headerlink" title="域名"></a>域名</h3><h4 id="自有域名"><a href="#自有域名" class="headerlink" title="自有域名"></a>自有域名</h4><p>这里以 <code>Cloudflare</code> 为例</p>
<ol>
<li>在 <span class="exturl" data-url="aHR0cHM6Ly9kYXNoLmNsb3VkZmxhcmUuY29tL3Byb2ZpbGUvYXBpLXRva2Vucw==">My Profile/API Tokens<i class="fa fa-external-link-alt"></i></span> 页面生成有 <code>Zone.DNS</code> 权限的 API token</li>
<li>在 DNS 记录中添加一条 A 记录，名称为 <code>jellyfin</code>, 内容为 <code>192.168.1.32</code>，代理状态为 <code> 仅 DNS - reserved IP</code></li>
</ol>
<h4 id="没有域名"><a href="#没有域名" class="headerlink" title="没有域名"></a>没有域名</h4><p>通过 <span class="exturl" data-url="aHR0cHM6Ly93d3cuZHVja2Rucy5vcmcv">DuckDNS<i class="fa fa-external-link-alt"></i></span> 注册账号，然后添加域名记录，比如 <code>homelab001</code>，IP 地址设为 <code>192.168.1.32</code>，最终的域名为 <code>https://jellyfin.homelab001.duckdns.org</code></p>]]>
    </summary>
    <title>内网服务部署有效的 SSL 证书</title>
    <updated>2026-04-21T06:30:40.112Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker/" term="Docker"/>
    <category scheme="https://gythialy.github.io/tags/Docker-Compose/" term="Docker-Compose"/>
    <category scheme="https://gythialy.github.io/tags/Wireguard/" term="Wireguard"/>
    <category scheme="https://gythialy.github.io/tags/Rocky-Linux/" term="Rocky Linux"/>
    <category scheme="https://gythialy.github.io/tags/CentOS/" term="CentOS"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Wireguard 有两种模式，一直是内核态，一种是用户态。可以通过 <code>modprobe wireguard</code> 检查内核是否支持 Wireguard。如果该命令成功退出并且没有打印错误，则内核模块可用。如果 wireguard 内核模块不可用，可以切换到像<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvYm9yaW5ndHVu"> boringtun<i class="fa fa-external-link-alt"></i></span> 这样的用户态实现。</p><p>这里以内核态为例。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li>安装 Wireguard</li></ol>  <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> yum install elrepo-release epel-release -y</span><br><span class="line"><span class="built_in">sudo</span> yum update -y</span><br><span class="line"><span class="built_in">sudo</span> yum install kmod-wireguard wireguard-tools -y</span><br><span class="line"><span class="built_in">sudo</span> yum copr <span class="built_in">enable</span> jdoss/wireguard</span><br><span class="line"><span class="built_in">sudo</span> yum update -v</span><br><span class="line"><span class="built_in">sudo</span> yum install wireguard-dkms -y</span><br></pre></td></tr></tbody></table></figure><ol start="2"><li>启用 Wireguard 内核模块</li></ol>  <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> modprobe wireguard</span><br></pre></td></tr></tbody></table></figure><ol start="3"><li>自动加载 <code>iptable_raw</code></li></ol>  <figure class="highlight bash"><table><tbody><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">sudo</span> modprobe iptable_raw</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">echo</span> <span class="string">"iptable_raw"</span> | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/modules-load.d/iptable_raw.conf</span><br></pre></td></tr></tbody></table></figure><span id="more"></span><h2 id="Docker-Compose-文件"><a href="#Docker-Compose-文件" class="headerlink" title="Docker Compose 文件"></a>Docker Compose 文件</h2><figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">"3"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">wireguard:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">linuxserver/wireguard:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">wireguard</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="comment"># - PUID=1000</span></span><br><span class="line">      <span class="comment"># - PGID=1000</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shangai</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SERVERURL=vpn.example.com</span> <span class="comment">#optional</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SERVERPORT=51820</span> <span class="comment">#optional</span></span><br><span class="line">      <span class="comment"># - PEERS=1 #optional</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">PEERDNS=auto</span> <span class="comment">#optional</span></span><br><span class="line">      <span class="comment"># - INTERNAL_SUBNET=10.13.13.0 #optional</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">ALLOWEDIPS=192.168.6.0/24</span> <span class="comment">#optional</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">PERSISTENTKEEPALIVE_PEERS=25</span> <span class="comment">#optional</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">LOG_CONFS=true</span> <span class="comment">#optional</span></span><br><span class="line">    <span class="attr">cap_add:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">NET_ADMIN</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SYS_MODULE</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./config:/config</span></span><br><span class="line">    <span class="attr">sysctls:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">net.ipv4.conf.all.src_valid_mark=1</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="comment"># port for wireguard-ui. this must be set here as the `wireguard-ui` container joins the network of this container and hasn't its own network over which it could publish the ports</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"5000:5000"</span></span><br><span class="line">      <span class="comment"># port of the wireguard server</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"51820:51820/udp"</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">wireguard-ui:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ngoduykhanh/wireguard-ui:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">wireguard-ui</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">wireguard</span></span><br><span class="line">    <span class="attr">cap_add:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">NET_ADMIN</span></span><br><span class="line">    <span class="comment"># use the network of the 'wireguard' service. this enables to show active clients in the status page</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">service:wireguard</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SENDGRID_API_KEYc</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">EMAIL_FROM_ADDRESS</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">EMAIL_FROM_NAME</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SESSION_SECRET</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WGUI_USERNAME=admin</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WGUI_PASSWORD=password</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WG_CONF_TEMPLATE</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WGUI_MANAGE_START=true</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WGUI_MANAGE_RESTART=true</span></span><br><span class="line">    <span class="attr">logging:</span></span><br><span class="line">      <span class="attr">driver:</span> <span class="string">json-file</span></span><br><span class="line">      <span class="attr">options:</span></span><br><span class="line">        <span class="attr">max-size:</span> <span class="string">50m</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./db:/app/db</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./config:/etc/wireguard</span></span><br></pre></td></tr></tbody></table></figure><p>需要修改的参数 <code>SERVERURL</code>,<code>WGUI_USERNAME</code>,<code>WGUI_PASSWORD</code></p><h2 id="启动并配置"><a href="#启动并配置" class="headerlink" title="启动并配置"></a>启动并配置</h2><p>通过 <code>docker compose up -d</code> 启动，然后通过 <span class="exturl" data-url="aHR0cDovL2xvY2FsaG9zdDo1MDAwLw==">http://localhost:5000<i class="fa fa-external-link-alt"></i></span> 访问 Web UI 界面。</p><p>服务端设置<br><img data-src="/deploy-wireguard-with-ui-by-docker/SCR-20231204-lnpk.png"></p><p>客户端设置<br><img data-src="/deploy-wireguard-with-ui-by-docker/SCR-20231204-lnzw.png"></p><p>连接状态<br><img data-src="/deploy-wireguard-with-ui-by-docker/SCR-20231204-lnso.png"></p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/deploy-wireguard-with-ui-by-docker/</id>
    <link href="https://gythialy.github.io/deploy-wireguard-with-ui-by-docker/"/>
    <published>2023-12-04T04:56:39.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Wireguard 有两种模式，一直是内核态，一种是用户态。可以通过 <code>modprobe wireguard</code> 检查内核是否支持 Wireguard。如果该命令成功退出并且没有打印错误，则内核模块可用。如果 wireguard 内核模块不可用，可以切换到像<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvYm9yaW5ndHVu"> boringtun<i class="fa fa-external-link-alt"></i></span> 这样的用户态实现。</p>
<p>这里以内核态为例。</p>
<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol>
<li>安装 Wireguard</li>
</ol>
  <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> yum install elrepo-release epel-release -y</span><br><span class="line"><span class="built_in">sudo</span> yum update -y</span><br><span class="line"><span class="built_in">sudo</span> yum install kmod-wireguard wireguard-tools -y</span><br><span class="line"><span class="built_in">sudo</span> yum copr <span class="built_in">enable</span> jdoss/wireguard</span><br><span class="line"><span class="built_in">sudo</span> yum update -v</span><br><span class="line"><span class="built_in">sudo</span> yum install wireguard-dkms -y</span><br></pre></td></tr></tbody></table></figure>
<ol start="2">
<li>启用 Wireguard 内核模块</li>
</ol>
  <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> modprobe wireguard</span><br></pre></td></tr></tbody></table></figure>
<ol start="3">
<li>自动加载 <code>iptable_raw</code></li>
</ol>
  <figure class="highlight bash"><table><tbody><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">sudo</span> modprobe iptable_raw</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">echo</span> <span class="string">"iptable_raw"</span> | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/modules-load.d/iptable_raw.conf</span><br></pre></td></tr></tbody></table></figure>]]>
    </summary>
    <title>通过 docker 部署 wireguard 及其界面</title>
    <updated>2026-04-21T06:30:40.108Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker-Compose/" term="Docker-Compose"/>
    <category scheme="https://gythialy.github.io/tags/chatGPT/" term="chatGPT"/>
    <category scheme="https://gythialy.github.io/tags/Telegram/" term="Telegram"/>
    <category scheme="https://gythialy.github.io/tags/Bot/" term="Bot"/>
    <content>
      <![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>注册 chatGPT 账户</li><li>注册 Telegram Bot，通过 @BotFather 创建，并获取 token</li><li>获取 Telegram Chat ID， 通过 @userinfobot 查询</li><li>获取 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3RyYW5zaXRpdmUtYnVsbHNoaXQvY2hhdGdwdC1hcGkjYWNjZXNzLXRva2Vu">Access Token<i class="fa fa-external-link-alt"></i></span></li><li>准备<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3RyYW5zaXRpdmUtYnVsbHNoaXQvY2hhdGdwdC1hcGkjcmV2ZXJzZS1wcm94eQ==">反代服务<i class="fa fa-external-link-alt"></i></span>，可以选择别人提供的，不是一定要自己部署</li></ul><h2 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h2><ul><li><p>克隆 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL1JhaW5FZ2dwbGFudC9jaGF0Z3B0LXRlbGVncmFtLWJvdA==">chatgpt-telegram-bot<i class="fa fa-external-link-alt"></i></span></p></li><li><p>准备配置文件 <code>local.json</code></p><figure class="highlight json"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"debug"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"bot"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"token"</span><span class="punctuation">:</span> <span class="string">"telegram bot token"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"groupIds"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span> </span><br><span class="line">    <span class="attr">"userIds"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"chatCmd"</span><span class="punctuation">:</span> <span class="string">"/chat"</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"api"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"unofficial"</span><span class="punctuation">,</span> </span><br><span class="line">    <span class="attr">"unofficial"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"accessToken"</span><span class="punctuation">:</span> <span class="string">"chatGPT access token"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"apiReverseProxyUrl"</span><span class="punctuation">:</span> <span class="string">"https://chat.duti.tech/api/conversation"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"model"</span><span class="punctuation">:</span> <span class="string">""</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><ul><li><code>userIds</code> 为数字，比如 <code>114797892</code>，可指定多个，如果不指定，就所有人都可用，<code>groupIds</code>同理，建议配置上</li><li><code>accessToken</code> 会有过期时间，暂时没特别好的自动更新的办法，主要是有 cloudflare 验证</li></ul></li><li><p>修改<code>docker-compose.yml</code>，并构建镜像</p><figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">chatgpt:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">chatgpt-telegram-bot</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">chatgpt</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</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">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./local.json:/app/config/local.json</span></span><br><span class="line">    <span class="attr">networks:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">nginx-proxy</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">nginx-proxy:</span></span><br><span class="line">    <span class="attr">external:</span> <span class="literal">true</span></span><br></pre></td></tr></tbody></table></figure><p><code>docker-compose build</code> 构建镜像</p></li><li><p>运行<br><code>docker-compose up -d</code> 运行</p></li><li><p>查看 log<br><code>docker-compose logs -f --tail 100 chatgpt</code></p><p>如无意外的话，应该会输出类似的日志</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&gt; node --experimental-loader=extensionless dist/index.js</span><br><span class="line"></span><br><span class="line">(node:42) ExperimentalWarning: Custom ESM Loaders is an experimental feature. This feature could change at any time</span><br><span class="line">(Use `node --trace-warnings ...` to show where the warning was created)</span><br><span class="line">2/23/2023, 3:06:13 AM 🔮 ChatGPT API has started...</span><br><span class="line">2/23/2023, 3:06:14 AM 🤖 Bot @xxx_bot has started...</span><br></pre></td></tr></tbody></table></figure></li><li><p>在 Telegram 中添加刚才创建的机器人，通过 <code>/chat 聊天内容</code> 开始，<code>/help</code> 会显示支持的指令</p></li></ul><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/deploy-own-telegram-chatgpt-bot/</id>
    <link href="https://gythialy.github.io/deploy-own-telegram-chatgpt-bot/"/>
    <published>2023-02-23T05:04:34.000Z</published>
    <summary>
      <![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul>
<li>注册 chatGPT 账户</li>
<li>注册 Telegram Bot，通过 @BotFather 创建，]]>
    </summary>
    <title>部署私有 chatGPT Telegram 机器人</title>
    <updated>2026-04-21T06:30:40.108Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Zsh/" term="Zsh"/>
    <category scheme="https://gythialy.github.io/tags/antidote/" term="antidote"/>
    <category scheme="https://gythialy.github.io/tags/antigen/" term="antigen"/>
    <content>
      <![CDATA[<p>之前介绍了使用 <a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">antigen</a> 和 <a href="/zsh-sheldon-config/" title="使用 sheldon 管理 Zsh 配置">sheldon</a> 管理 Zsh 配置，由于 antigen 已经停止维护了，后面就有了 <span class="exturl" data-url="aHR0cHM6Ly9nZXRhbnRpYm9keS9hbnRpYm9keQ==">antibody<i class="fa fa-external-link-alt"></i></span>，但是这个也停止维护了，最终就有了继任者 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21hdHRtYzMvYW50aWRvdGU=">antidote<i class="fa fa-external-link-alt"></i></span>，这几个使用上都大同小异。</p><ul><li><p>安装</p><figure class="highlight bash"><table><tbody><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"><span class="comment"># macOS 使用 </span></span><br><span class="line">brew install antidote</span><br><span class="line"><span class="comment"># 其他平台</span></span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/mattmc3/antidote.git <span class="variable">${ZDOTDIR:-<span class="variable">$HOME</span>}</span>/.antidote</span><br></pre></td></tr></tbody></table></figure></li><li><p>在 <code>$HOME</code> 目录添加 <code>.zsh_plugins.txt</code> 来定义需要使用的插件</p><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line"># .zsh_plugins.txt</span><br><span class="line"></span><br><span class="line"># comments are supported like this</span><br><span class="line">https://github.com/peterhurford/up.zsh</span><br><span class="line">rummik/zsh-tailf</span><br><span class="line">mattmc3/zman</span><br><span class="line">agkozak/zsh-z</span><br><span class="line"></span><br><span class="line"># empty lines are skipped</span><br><span class="line"></span><br><span class="line"># annotations are also allowed:</span><br><span class="line">romkatv/zsh-bench kind:path</span><br><span class="line">olets/zsh-abbr    kind:defer</span><br><span class="line"></span><br><span class="line"># frameworks like oh-my-zsh are supported</span><br><span class="line">ohmyzsh/ohmyzsh path:lib</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/command-not-found</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/common-aliases</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/gem</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/git</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/npm</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/tmux</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/yarn</span><br><span class="line">ohmyzsh/ohmyzsh path:plugins/fzf</span><br><span class="line"></span><br><span class="line"># prompts:</span><br><span class="line">#   with prompt plugins, remember to add this to your .zshrc:</span><br><span class="line">#   `autoload -Uz promptinit &amp;&amp; promptinit &amp;&amp; prompt pure`</span><br><span class="line"># sindresorhus/pure     kind:fpath</span><br><span class="line"># romkatv/powerlevel10k kind:fpath</span><br><span class="line"></span><br><span class="line"># popular fish-like plugins</span><br><span class="line">zsh-users/zsh-autosuggestions</span><br><span class="line">zsh-users/zsh-completions path:src kind:fpath</span><br><span class="line">zdharma-continuum/fast-syntax-highlighting kind:defer</span><br><span class="line"># zsh-users/zsh-history-substring-search</span><br></pre></td></tr></tbody></table></figure></li><li><p>在 <code>.zshrc</code> 中添加下面的内容，以后修改 <code>.zsh_plugin.txt</code> 中的内容后会自动更新</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"># .zshrc</span><br><span class="line"># Lazy-load antidote and generate the static load file only when needed</span><br><span class="line">zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins</span><br><span class="line">if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then</span><br><span class="line">  (</span><br><span class="line">    source ${ZDOTDIR:-$HOME}/.antidote/antidote.zsh</span><br><span class="line">    antidote bundle &lt;${zsh_plugins}.txt &gt;${zsh_plugins}.zsh</span><br><span class="line">  )</span><br><span class="line">fi</span><br><span class="line">source ${zsh_plugins}.zsh</span><br><span class="line"></span><br><span class="line"># starship</span><br><span class="line"># eval "$(starship init zsh)"</span><br></pre></td></tr></tbody></table></figure></li></ul><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/zsh-antidote-config/</id>
    <link href="https://gythialy.github.io/zsh-antidote-config/"/>
    <published>2023-02-18T09:44:47.000Z</published>
    <summary>
      <![CDATA[<p>之前介绍了使用 <a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">antigen</a> 和 <a href="/zsh-sheldon-config/" title="使用 sheldon 管理 Zsh 配置">she]]>
    </summary>
    <title>使用 Antidote 管理 Zsh 配置</title>
    <updated>2026-04-21T06:30:40.117Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/gpg/" term="gpg"/>
    <category scheme="https://gythialy.github.io/tags/macOS/" term="macOS"/>
    <content>
      <![CDATA[<ul><li><p>安装 <code>gpg</code> 和 <code>pinentry</code><br><code>brew install gpg pinentry-mac</code></p></li><li><p>修改 <code>gpg-agent</code> 配置<br><code>echo pinentry-program $(whitch pinentry-mac) &gt;&gt; ~/.gnupg/gpg-agent.conf</code></p></li><li><p>通过 <code>gpgconf</code> 检查配置</p></li></ul><figure class="highlight plaintext"><table><tbody><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">gpg:OpenPGP:/opt/homebrew/Cellar/gnupg/2.4.0/bin/gpg</span><br><span class="line">gpgsm:S/MIME:/opt/homebrew/Cellar/gnupg/2.4.0/bin/gpgsm</span><br><span class="line">keyboxd:Public Keys:/opt/homebrew/Cellar/gnupg/2.4.0/libexec/keyboxd</span><br><span class="line">gpg-agent:Private Keys:/opt/homebrew/Cellar/gnupg/2.4.0/bin/gpg-agent</span><br><span class="line">scdaemon:Smartcards:/opt/homebrew/Cellar/gnupg/2.4.0/libexec/scdaemon</span><br><span class="line">dirmngr:Network:/opt/homebrew/Cellar/gnupg/2.4.0/bin/dirmngr</span><br><span class="line">pinentry:Passphrase Entry:/opt/homebrew/opt/pinentry/bin/pinentry</span><br></pre></td></tr></tbody></table></figure><ul><li><p>检查 <code>pinentry-mac</code> 是否能正确弹出密码界面<br><code>echo GETPIN | pinentry-mac</code></p></li><li><p>修改 git 签名配置</p></li></ul><figure class="highlight plaintext"><table><tbody><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 config --global user.signingkey F0406D8A</span><br><span class="line">git config --global commit.gpgsign true</span><br><span class="line">git config --global gpg.program $(which gpg)</span><br></pre></td></tr></tbody></table></figure><ul><li><p>测试签名是否正确<br><code>echo "test" | gpg --clearsign</code></p><p>输出结果：</p><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">gpg: using "F0406D8A525890198021BB243D8D256084332679" as default secret key for signing</span><br><span class="line">-----BEGIN PGP SIGNED MESSAGE-----</span><br><span class="line">Hash: SHA512</span><br><span class="line"></span><br><span class="line">test</span><br><span class="line">-----BEGIN PGP SIGNATURE-----</span><br><span class="line"></span><br><span class="line">iQEzBAEBCgAdFiEE8EBtilJYkBmAIbskPY0lYIQzJnkFAmPsoRUACgkQPY0lYIQz</span><br><span class="line">JnkqTQf8DSIYBfaB6ijhO3U7K4FYvCjeMACV3UbuRJI6WxEyDkn4Iglaw/Y4C/s5</span><br><span class="line">U12ba4PIGLmzqRSkISFbIj+5eKH97CQoB/kVlfQWL+wkYCpTWNAIPEBa7FGU4BYN</span><br><span class="line">9dSW/00XEdrWz9Lvzb0QAP2t9a8DIPIhyDGpQoxfq+0enZuFJKMRtKPzDKkpaylG</span><br><span class="line">MTEYEwV5VnyYNsIu8K37h27oPWKPSadT3SGM+m4vFP68V9Thw0/qZFJS8NW7OW8b</span><br><span class="line">RwB5FVSIsORypAtN0AtzzTd8cxEq6Rf9rPkYgtfeGGrCzZdyfKsPe/AoWEP5/ZuY</span><br><span class="line">FzQGzjxomBPHLDt7k89Aq5mwK2NAKw==</span><br><span class="line">=73Fx</span><br><span class="line">-----END PGP SIGNATURE-----</span><br></pre></td></tr></tbody></table></figure></li><li><p>诊断问题</p></li></ul><figure class="highlight plaintext"><table><tbody><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"># Kill gpg-agent</span><br><span class="line">killall gpg-agent</span><br><span class="line"></span><br><span class="line"># Run gpg-agent in daemon mode</span><br><span class="line">gpg-agent --daemon</span><br></pre></td></tr></tbody></table></figure><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/setup-gpg-on-macos/</id>
    <link href="https://gythialy.github.io/setup-gpg-on-macos/"/>
    <published>2023-02-17T03:13:20.000Z</published>
    <summary>
      <![CDATA[<ul>
<li><p>安装 <code>gpg</code> 和 <code>pinentry</code><br><code>brew install gpg pinentry-mac</code></p>
</li>
<li><p>修改 <code>gpg-agent</c]]>
    </summary>
    <title>macOS 设置 GPG</title>
    <updated>2026-04-21T06:30:40.115Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker/" term="Docker"/>
    <category scheme="https://gythialy.github.io/tags/Tips/" term="Tips"/>
    <category scheme="https://gythialy.github.io/tags/Docker-Compose/" term="Docker-Compose"/>
    <category scheme="https://gythialy.github.io/tags/Telegram/" term="Telegram"/>
    <category scheme="https://gythialy.github.io/tags/Watchtower/" term="Watchtower"/>
    <content>
      <![CDATA[<p>通过 <code>WATCHTOWER_NOTIFICATION_URL</code> 定义 Telegram 的<span class="exturl" data-url="aHR0cHM6Ly9jb250YWlucnJyLmRldi9zaG91dHJyci92MC42L3NlcnZpY2VzL3RlbGVncmFtLw==">通知信息<i class="fa fa-external-link-alt"></i></span>，当然了也可以定义其他的通知方式。底层是通过 <span class="exturl" data-url="aHR0cHM6Ly9jb250YWlucnJyLmRldi9zaG91dHJyci92MC42L3NlcnZpY2VzL292ZXJ2aWV3Lw==">shoutrrr<i class="fa fa-external-link-alt"></i></span> 实现的，只要 shoutrrr 支持的方式这里都可以用。</p><figure class="highlight yml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.5'</span></span><br><span class="line"><span class="attr">services:</span>  </span><br><span class="line">  <span class="attr">watchtower:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">containrrr/watchtower</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">watchtower</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">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/var/run/docker.sock:/var/run/docker.sock</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shanghai</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_LIFECYCLE_HOOKS=True</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_NOTIFICATIONS=shoutrrr</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_NOTIFICATION_URL=telegram://token@telegram?chats=@channel-1,chat-id-1</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_DEBUG=true</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_CLEANUP=true</span></span><br><span class="line">      <span class="comment"># - WATCHTOWER_SCHEDULE=0 0 20 * * 0</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WATCHTOWER_POLL_INTERVAL=43200</span></span><br><span class="line">    <span class="attr">command:</span> <span class="string">reference</span> <span class="string">filebrowser</span></span><br></pre></td></tr></tbody></table></figure><ul><li>通过 <code>@BotFather</code> 创建自己的通知机器人，并获取 <code>token</code></li><li>通过 <code>@RawDataBot</code> 获取 Chat ID</li></ul><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/watchtower-notify-by-telegram/</id>
    <link href="https://gythialy.github.io/watchtower-notify-by-telegram/"/>
    <published>2023-02-15T05:51:21.000Z</published>
    <summary>
      <![CDATA[<p>通过 <code>WATCHTOWER_NOTIFICATION_URL</code> 定义 Telegram 的<span class="exturl" data-url="aHR0cHM6Ly9jb250YWlucnJyLmRldi9zaG91dHJyci92MC42L]]>
    </summary>
    <title>Watchtower 通过 telegram 发通知</title>
    <updated>2026-04-21T06:30:40.117Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Docker/" term="Docker"/>
    <category scheme="https://gythialy.github.io/tags/Tips/" term="Tips"/>
    <content>
      <![CDATA[<p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21vYnkvbW9ieS9pc3N1ZXMvMjU0NzE=">原始问题<i class="fa fa-external-link-alt"></i></span>，一言以蔽之就是在 <code>daemon.json</code> 增加 Host 之后，服务会启动失败。</p><p>解决方案:</p><ul><li>在 <code>/etc/systemd/system/docker.service.d/simple_dockerd.conf</code> 中增加<figure class="highlight plaintext"><table><tbody><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">[Service]</span><br><span class="line">ExecStart=</span><br><span class="line">ExecStart=/usr/bin/dockerd</span><br></pre></td></tr></tbody></table></figure></li><li>在 <code>/etc/docker/daemon.json</code> 中增加 <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}</span><br></pre></td></tr></tbody></table></figure></li><li>重启<code>docker</code>服务<figure class="highlight plaintext"><table><tbody><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">systemctl daemon-reload &amp;&amp; </span><br><span class="line">systemctl restart docker.service</span><br></pre></td></tr></tbody></table></figure></li><li>检查<code>docker</code>服务状态<figure class="highlight plaintext"><table><tbody><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">❯ systemctl status docker.service</span><br><span class="line">● docker.service - Docker Application Container Engine</span><br><span class="line">    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)</span><br><span class="line">    Drop-In: /etc/systemd/system/docker.service.d</span><br><span class="line">            └─simple_dockerd.conf</span><br><span class="line">    Active: active (running) since Wed 2023-02-15 11:49:01 CST; 1h 18min ago</span><br><span class="line">TriggeredBy: ● docker.socket</span><br><span class="line">      Docs: https://docs.docker.com</span><br><span class="line">  Main PID: 1193 (dockerd)</span><br><span class="line">      Tasks: 350</span><br><span class="line">    Memory: 198.1M</span><br><span class="line">        CPU: 11.520s</span><br><span class="line">    CGroup: /system.slice/docker.service</span><br><span class="line">            ├─1193 /usr/bin/dockerd</span><br></pre></td></tr></tbody></table></figure></li><li>检查 TCP 连接<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -X GET http://localhost:2375/containers/json?all=1</span><br></pre></td></tr></tbody></table></figure></li></ul><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/Enable-TCP-port-for-external-connection-to-Docker/</id>
    <link href="https://gythialy.github.io/Enable-TCP-port-for-external-connection-to-Docker/"/>
    <published>2023-02-15T05:11:25.000Z</published>
    <summary>
      <![CDATA[<p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21vYnkvbW9ieS9pc3N1ZXMvMjU0NzE=">原始问题<i class="fa fa-external-link-alt"></i></spa]]>
    </summary>
    <title>启用 Docker TCP 连接</title>
    <updated>2026-04-21T06:30:40.101Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Fish/" term="Fish"/>
    <category scheme="https://gythialy.github.io/tags/Starship/" term="Starship"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9maXNoc2hlbGwuY29tLw==">Fish<i class="fa fa-external-link-alt"></i></span> 是一种用户友好的 Unix shell，它支持自动补全、语法高亮和其他功能，使得命令行操作变得更加容易。Fish 具有简单的语法，并且可以自动识别文件和目录名称，这使得它特别适合新手使用。Fish 还有一个强大的脚本语言，可以用来创建复杂的脚本和工具。Fish 也支持多种不同的主题和样式，可以根据用户的喜好进行自定义。</p><p>Fish 和 Bash 和 Zsh 对比，一言以蔽之就是开箱即用的高亮和自动不全，缺点就是和 POSIX 不兼容。Fish 有个骚操作就是执行 <code>fish_config</code> 后就可以在浏览器中配置。</p><p>Bash 中的特殊变量也挺难记的，Fish 中也都改成了单词:</p><figure class="highlight plaintext"><table><tbody><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">$*, $@, $1 ...: $argv  # 函数或者脚本的参数</span><br><span class="line">$0: status filename  # 函数或者脚本的名字</span><br><span class="line">$#: 使用 $argv 的长度</span><br><span class="line">$?: $status  # 上一个命令的返回值</span><br><span class="line">$$: $fish_pid  # shell 的 pid</span><br><span class="line">$!: $last_pid  # 上一个命令的 pid</span><br><span class="line">$-: 大多数使用是 status is-interactive 和 status is-login</span><br></pre></td></tr></tbody></table></figure><p>更多的差异，查看<span class="exturl" data-url="aHR0cHM6Ly9maXNoc2hlbGwuY29tL2RvY3MvY3VycmVudC9maXNoX2Zvcl9iYXNoX3VzZXJzLmh0bWw=">官方文档<i class="fa fa-external-link-alt"></i></span></p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>通过 <code>brew install fish fisher starship</code> 一键安装。</p><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2pvcmdlYnVjYXJhbi9maXNoZXI=">fisher<i class="fa fa-external-link-alt"></i></span>: 作为 Fish 的包管理工具，就不需要每次都去修改 <code>config.fish</code></li><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3N0YXJzaGlwL3N0YXJzaGlw">Starship<i class="fa fa-external-link-alt"></i></span>: Rust 编写的轻量、迅速、可无限定制的高颜值终端，类似 - <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3JvbWthdHYvcG93ZXJsZXZlbDEwaw==">powerlevel10k<i class="fa fa-external-link-alt"></i></span></li></ul><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>我安装的插件如下，可通过 <code>fisher install meaningful-ooo/sponge</code> 安装， <code>fisher update</code> 来进行更新。</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">❯ fisher list</span><br><span class="line">jorgebucaran/fisher</span><br><span class="line">patrickf1/fzf.fish</span><br><span class="line">ankitsumitg/docker-fish-completions</span><br><span class="line">jethrokuan/z</span><br><span class="line">meaningful-ooo/sponge</span><br><span class="line">jhillyerd/plugin-git</span><br><span class="line">rstacruz/fish-asdf</span><br><span class="line">jorgebucaran/replay.fish</span><br><span class="line">nickeb96/puffer-fish</span><br></pre></td></tr></tbody></table></figure><p>更多可参考 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2pvcmdlYnVjYXJhbi9hd3NtLmZpc2g=">awsm.fish<i class="fa fa-external-link-alt"></i></span> 进行安装。</p><p>其他基本上没什么需要配置的，如果需要的话，修改 <code>~/.config/fish/config.fish</code> 文件即可。</p><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><p>可通过 <code>starship preset nerd-font-symbols &gt; ~/.config/starship.toml</code> 设置 <code>symbols</code>，更多设置，可参考<span class="exturl" data-url="aHR0cHM6Ly9zdGFyc2hpcC5ycy9jb25maWcv">官方文档<i class="fa fa-external-link-alt"></i></span>，大部分时候都不需要。</p><p>最终只需要在 <code>~/.config/fish/config.fish</code>中添加一行 <code>starship init fish | source</code> 即可。</p><h2 id="成果"><a href="#成果" class="headerlink" title="成果"></a>成果</h2><p>之后只要在 iTerm2 中设置 <code>fish</code> 为启动 shell，显示效果如下:</p><p><img data-src="/fish-config/SCR-20230207-i55.png"></p><p>从试用上来看，比 iTerm2 + Zsh 的组合启动速度肉眼可见的迅速。但是由于不兼容 POSIX shell，暂时通过 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2pvcmdlYnVjYXJhbi9yZXBsYXkuZmlzaA==">replay.fish<i class="fa fa-external-link-alt"></i></span>临时执行 Bash 脚本，后续还要看看是否有其他问题。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/fish-config/</id>
    <link href="https://gythialy.github.io/fish-config/"/>
    <published>2023-02-07T05:55:07.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><span class="exturl" data-url="aHR0cHM6Ly9maXNoc2hlbGwuY29tLw==">Fish<]]>
    </summary>
    <title>Fish 配置</title>
    <updated>2026-04-21T06:30:40.112Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Zsh/" term="Zsh"/>
    <category scheme="https://gythialy.github.io/tags/sheldon/" term="sheldon"/>
    <content>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>之前一直使用<a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">使用 antigen 管理 Zsh 配置</a>，由于 antigen 已经很就不更新了，最后一次代码提交为 2019，就切换到了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3Jvc3NtYWNhcnRodXIvc2hlbGRvbg==">sheldon<i class="fa fa-external-link-alt"></i></span>。</p><p>sheldon 是 Rust 编写的 Zsh 包管理器，特性如下：</p><ul><li>Plugins from Git repositories.<ul><li>Branch / tag / commit support.</li><li>Submodule support.</li><li>First class support for GitHub repositories.</li><li>First class support for Gists.</li></ul></li><li>Arbitrary remote scripts or binary plugins.</li><li>Local plugins.</li><li>Inline plugins.</li><li>Highly configurable install methods using templates.</li><li>Shell agnostic, with sensible defaults for Zsh.</li><li>Super-fast plugin loading and parallel installation. See <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3Jvc3NtYWNhcnRodXIvenNoLXBsdWdpbi1tYW5hZ2VyLWJlbmNobWFyaw==">benchmarks<i class="fa fa-external-link-alt"></i></span>.</li><li>Config file using <span class="exturl" data-url="aHR0cHM6Ly90b21sLmlvLw==">TOML<i class="fa fa-external-link-alt"></i></span> syntax.</li><li>Clean ~/.zshrc or ~/.bashrc (just add 1 line).</li></ul><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>通过 <code>brew install sheldon</code> 一键安装，也有其他<span class="exturl" data-url="aHR0cHM6Ly9zaGVsZG9uLmNsaS5ycy9JbnN0YWxsYXRpb24uaHRtbA==">安装方式<i class="fa fa-external-link-alt"></i></span>可选。</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>执行 <code>sheldon init</code> 会生成默认配置 <code>plugins.toml</code>，文件存放在 <code>$XDG_CONFIG_HOME/sheldon</code>，一般这个路径就是 <code>~/.config/sheldon/plugins.toml</code>。可以直接编辑这个配置，也可以通过 sheldon CLI 来操作。</p><h3 id="CLI"><a href="#CLI" class="headerlink" title="CLI"></a>CLI</h3><p>sheldon 有三种不同类型的命令:</p><ul><li><code>init</code> 初始化一个新的配置文件。</li><li><code>lock</code> 和 <code>source</code> 处理插件下载、安装和 shell 源代码的生成。</li><li><code>add</code>,<code>edit</code>,<code>remove</code> 会自动更新配置文件</li></ul><p>详细使用，可以参考<span class="exturl" data-url="aHR0cHM6Ly9zaGVsZG9uLmNsaS5ycy9Db21tYW5kLWxpbmUtaW50ZXJmYWNlLmh0bWw=">官方说明<i class="fa fa-external-link-alt"></i></span>，常用的就是 <code>sheldon lock --update</code> 更新所有插件。</p><h3 id="配置结构"><a href="#配置结构" class="headerlink" title="配置结构"></a>配置结构</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># ~/.config/sheldon/plugins.toml</span><br><span class="line"></span><br><span class="line">#           ┌─ Unique name for the plugin</span><br><span class="line">#        ┌──┴─┐</span><br><span class="line">[plugins.base16]</span><br><span class="line">github = "chriskempson/base16-shell"</span><br><span class="line">#         └─────┬────┘ └─────┬────┘</span><br><span class="line">#               │            └─ GitHub repository name</span><br><span class="line">#               └─ GitHub user or organization</span><br></pre></td></tr></tbody></table></figure><span id="more"></span><h3 id="参考配置"><a href="#参考配置" class="headerlink" title="参考配置"></a>参考配置</h3><p>配置中启用了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL29obXl6c2g=">Oh My Zsh<i class="fa fa-external-link-alt"></i></span> 的部分功能，还有启用了自动高亮，完成建议等。</p><figure class="highlight toml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">shell</span> = <span class="string">"zsh"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[templates]</span></span><br><span class="line"><span class="attr">defer</span> = <span class="string">"{% for file in files %}zsh-defer source \"{{ file }}\"\n{% endfor %}"</span></span><br><span class="line"><span class="comment"># PATH = 'export PATH="{{ dir }}:$PATH"'</span></span><br><span class="line"><span class="comment"># fpath = 'fpath=( "{{ dir }}" $fpath )'</span></span><br><span class="line"><span class="comment"># path = 'path=( "{{ dir }}" $path )'</span></span><br><span class="line"><span class="comment"># source = {value = 'source "{{ file }}"', each = true}</span></span><br><span class="line"></span><br><span class="line"><span class="section">[plugins]</span></span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.zsh-defer]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"romkatv/zsh-defer"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.ohmyzsh-lib]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"ohmyzsh/ohmyzsh"</span></span><br><span class="line"><span class="attr">dir</span> = <span class="string">"lib"</span></span><br><span class="line"><span class="attr">use</span> = [<span class="string">"{clipboard,completion,git,termsupport,theme-and-appearance}.zsh"</span>]</span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.ohmyzsh-plugin]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"ohmyzsh/ohmyzsh"</span></span><br><span class="line"><span class="attr">dir</span> = <span class="string">"plugins"</span></span><br><span class="line"><span class="attr">use</span> = [<span class="string">"{command-not-found,common-aliases,docker-compose,gem,git,npm,yarn,kubectl}/*.plugin.zsh"</span>]</span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.zsh-syntax-highlighting]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"zsh-users/zsh-syntax-highlighting"</span></span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.zsh-autosuggestions]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"zsh-users/zsh-autosuggestions"</span></span><br><span class="line"><span class="attr">use</span> = [<span class="string">"{{ name }}.zsh"</span>]</span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.zsh-completions]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"zsh-users/zsh-completions"</span></span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># [plugins.powerlevel10k]</span></span><br><span class="line"><span class="comment"># github = "romkatv/powerlevel10k"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [plugins.zsh-z]</span></span><br><span class="line"><span class="comment"># github = "agkozak/zsh-z"</span></span><br><span class="line"><span class="comment"># apply = ["defer"]</span></span><br><span class="line"></span><br><span class="line"><span class="section">[plugins.z-lua]</span></span><br><span class="line"><span class="attr">github</span> = <span class="string">"skywind3000/z.lua"</span></span><br><span class="line"><span class="attr">apply</span> = [<span class="string">"defer"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># [plugins.compinit]</span></span><br><span class="line"><span class="comment"># gist = "c514eaedbd4539ee2affffab9ca74913"</span></span><br><span class="line"><span class="comment"># inline = 'autoload -Uz compinit &amp;&amp; compinit'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># For example:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># [plugins.base16]</span></span><br><span class="line"><span class="comment"># github = "chriskempson/base16-shell"</span></span><br></pre></td></tr></tbody></table></figure><h2 id="更新-zshrc"><a href="#更新-zshrc" class="headerlink" title="更新 .zshrc"></a>更新 <code>.zshrc</code></h2><p>在文件中添加 <code>eval "$(starship init zsh)"</code> 即可</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/zsh-sheldon-config/</id>
    <link href="https://gythialy.github.io/zsh-sheldon-config/"/>
    <published>2023-02-07T03:45:48.000Z</published>
    <summary>
      <![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>之前一直使用<a href="/zsh-config/" title="使用 antigen 管理 Zsh 配置">使用 antigen 管理 Zsh 配置</a>，由于 antigen 已经很就不更新了，最后一次代码提交为 2019，就切换到了 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3Jvc3NtYWNhcnRodXIvc2hlbGRvbg==">sheldon<i class="fa fa-external-link-alt"></i></span>。</p>
<p>sheldon 是 Rust 编写的 Zsh 包管理器，特性如下：</p>
<ul>
<li>Plugins from Git repositories.<ul>
<li>Branch / tag / commit support.</li>
<li>Submodule support.</li>
<li>First class support for GitHub repositories.</li>
<li>First class support for Gists.</li>
</ul>
</li>
<li>Arbitrary remote scripts or binary plugins.</li>
<li>Local plugins.</li>
<li>Inline plugins.</li>
<li>Highly configurable install methods using templates.</li>
<li>Shell agnostic, with sensible defaults for Zsh.</li>
<li>Super-fast plugin loading and parallel installation. See <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3Jvc3NtYWNhcnRodXIvenNoLXBsdWdpbi1tYW5hZ2VyLWJlbmNobWFyaw==">benchmarks<i class="fa fa-external-link-alt"></i></span>.</li>
<li>Config file using <span class="exturl" data-url="aHR0cHM6Ly90b21sLmlvLw==">TOML<i class="fa fa-external-link-alt"></i></span> syntax.</li>
<li>Clean ~/.zshrc or ~/.bashrc (just add 1 line).</li>
</ul>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>通过 <code>brew install sheldon</code> 一键安装，也有其他<span class="exturl" data-url="aHR0cHM6Ly9zaGVsZG9uLmNsaS5ycy9JbnN0YWxsYXRpb24uaHRtbA==">安装方式<i class="fa fa-external-link-alt"></i></span>可选。</p>
<h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>执行 <code>sheldon init</code> 会生成默认配置 <code>plugins.toml</code>，文件存放在 <code>$XDG_CONFIG_HOME/sheldon</code>，一般这个路径就是 <code>~/.config/sheldon/plugins.toml</code>。可以直接编辑这个配置，也可以通过 sheldon CLI 来操作。</p>
<h3 id="CLI"><a href="#CLI" class="headerlink" title="CLI"></a>CLI</h3><p>sheldon 有三种不同类型的命令:</p>
<ul>
<li><code>init</code> 初始化一个新的配置文件。</li>
<li><code>lock</code> 和 <code>source</code> 处理插件下载、安装和 shell 源代码的生成。</li>
<li><code>add</code>,<code>edit</code>,<code>remove</code> 会自动更新配置文件</li>
</ul>
<p>详细使用，可以参考<span class="exturl" data-url="aHR0cHM6Ly9zaGVsZG9uLmNsaS5ycy9Db21tYW5kLWxpbmUtaW50ZXJmYWNlLmh0bWw=">官方说明<i class="fa fa-external-link-alt"></i></span>，常用的就是 <code>sheldon lock --update</code> 更新所有插件。</p>
<h3 id="配置结构"><a href="#配置结构" class="headerlink" title="配置结构"></a>配置结构</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># ~/.config/sheldon/plugins.toml</span><br><span class="line"></span><br><span class="line">#           ┌─ Unique name for the plugin</span><br><span class="line">#        ┌──┴─┐</span><br><span class="line">[plugins.base16]</span><br><span class="line">github = "chriskempson/base16-shell"</span><br><span class="line">#         └─────┬────┘ └─────┬────┘</span><br><span class="line">#               │            └─ GitHub repository name</span><br><span class="line">#               └─ GitHub user or organization</span><br></pre></td></tr></tbody></table></figure>]]>
    </summary>
    <title>使用 sheldon 管理 Zsh 配置</title>
    <updated>2026-04-21T06:30:40.118Z</updated>
  </entry>
  <entry>
    <author>
      <name>gythialy</name>
    </author>
    <category scheme="https://gythialy.github.io/categories/Notes/" term="Notes"/>
    <category scheme="https://gythialy.github.io/tags/Zerotier/" term="Zerotier"/>
    <category scheme="https://gythialy.github.io/tags/OpenWRT/" term="OpenWRT"/>
    <content>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>偶尔出差的时候，需要访问家里的网络，办公室已经有一台服务器使用了<span class="exturl" data-url="aHR0cHM6Ly96ZXJvdGllci5jb20v" title="Zerotier"> Zerotier<i class="fa fa-external-link-alt"></i></span>网络，索性就把家里的路由也加到网络里面，这样的话，就可以同时访问公司和家里的网络了。因为办公室那台是我控制的，所以不会出现其他同事会进入到家庭网络的情况。</p><p>ZeroTier 是一款软件定义网络（SDN）解决方案，可以帮助企业快速部署和管理全球虚拟网络。它使用一个分布式的虚拟交换机来连接所有的节点，无需物理交换机或配置复杂的 VPN。ZeroTier 可以在任何地方部署，包括云、数据中心、家庭和办公室。它还可以与其他 SDN 解决方案集成，如 OpenFlow 和 Cisco ACI。ZeroTier 还可以通过多个平台使用，包括 Windows、macOS、Linux、Android 和 iOS。</p><h2 id="安装-Zerotier-one-moon"><a href="#安装-Zerotier-one-moon" class="headerlink" title="安装 Zerotier-one-moon"></a>安装 Zerotier-one-moon</h2><p>由于 Zerotier 的中转服务器都在国外，访问速度有可能会慢，所以增加一台中转服务器。 使用 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2d5dGhpYWx5L3plcm90aWVyLW9uZS1tb29u">zerotier-one-moon<i class="fa fa-external-link-alt"></i></span> 可以快速一键部署自己的中转服务器。我这里就找了一台闲置的阿里云服务器，使用下来速度还可以，基本感受不到卡顿。</p><figure class="highlight yaml"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">"3.5"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">zerotier-moon:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ghcr.io/gythialy/zerotier-one-moon:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">zerotier-moon</span></span><br><span class="line">    <span class="attr">cap_add:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">NET_ADMIN</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">SYS_ADMIN</span></span><br><span class="line">    <span class="attr">devices:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/dev/net/tun</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">9993</span><span class="string">:9993/udp</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">-4</span> <span class="string">xxx.xxx.xxx.xxx</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">-p</span> <span class="number">9993</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./zerotier-one:/var/lib/zerotier-one</span></span><br></pre></td></tr></tbody></table></figure><p>服务正常启动后，会得到 moon id，类似 <code>61941d46d1</code>，已经服务器的公网 IP 和端口，记得在防火墙把响应的端口打开。</p><h2 id="配置-Zerotier-账号"><a href="#配置-Zerotier-账号" class="headerlink" title="配置 Zerotier 账号"></a>配置 Zerotier 账号</h2><p>账号本身没什么，就是注册登陆后建立一个 Zerotier 网络，这里建议设置成 private network，这样别人就不能随便加入了。</p><h3 id="授权自己的接入点"><a href="#授权自己的接入点" class="headerlink" title="授权自己的接入点"></a>授权自己的接入点</h3><p>因为设置成了 private network，所以默认是无法加入这个网络的，可以在 Zerotier 的<span class="exturl" data-url="aHR0cHM6Ly9teS56ZXJvdGllci5jb20vbmV0d29yay8=" title="Zerotier 网络管理界面">网络管理界面<i class="fa fa-external-link-alt"></i></span>看到哪些点，然后在 auth 上勾选一下，就授权了这个点接入了。</p><h3 id="设置分配IP的网段"><a href="#设置分配IP的网段" class="headerlink" title="设置分配IP的网段"></a>设置分配 IP 的网段</h3><p>其实不设置根本没问题，你只要设置好路由表保证分配的网段范围都划分到同一个 LAN 就行。我这里设置成了 10.147.17.1~10.147.17.254，保证这个 IP 段不和你两端任意一段路由器的 LAN IP 段冲突就行。</p><h2 id="路由设置"><a href="#路由设置" class="headerlink" title="路由设置"></a>路由设置</h2><p>在 菜单 <code>VPN/Zerotier</code> 中填入刚才在网页上生成的 Network ID，保存并应用即可，正常情况下 Zerotier 的服务应该就启动起来了。<br><img data-src="/access-lan-from-remote-by-zerotier/SCR-20230201-iuv.png"></p><p>启动完成后，在 Zerotier 的<span class="exturl" data-url="aHR0cHM6Ly9teS56ZXJvdGllci5jb20vbmV0d29yay8=" title="Zerotier 网络管理界面">网络管理界面<i class="fa fa-external-link-alt"></i></span>授权通过，至此路由就应该连接到了 Zerotier 网络。</p><h3 id="设置-Zerotier-Moon"><a href="#设置-Zerotier-Moon" class="headerlink" title="设置 Zerotier Moon"></a>设置 Zerotier Moon</h3><p>通过命令行 <code>sudo zerotier-cli orbit 61941d46d1 61941d46d1</code> 添加 Zerotier moon。可以通过 SSH 登录到路由器，或者通过 OpenWRT 提供的<strong> TTYD 终端</strong>都可以，看个人习惯。</p><p>可以通过 <code>sudo zerotier-cli peers</code> 查看节点的连接情况</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">200 peers</span><br><span class="line">&lt;ztaddr&gt;   &lt;ver&gt;  &lt;role&gt; &lt;lat&gt; &lt;link&gt; &lt;lastTX&gt; &lt;lastRX&gt; &lt;path&gt;</span><br><span class="line">61941d46d1 1.6.5  MOON      10 DIRECT 307      306      139.224.186.142/9993</span><br><span class="line">61d294b8cb -      PLANET   168 DIRECT 2593     2431     50.8.73.34/9993</span><br><span class="line">62f845ae71 -      PLANET   321 DIRECT 2593     7327     50.8.252.138/9993</span><br><span class="line">748cde7190 -      PLANET   232 DIRECT 7640     2361     103.195.108.66/9993</span><br><span class="line">952fcf1db7 -      PLANET   247 DIRECT 1628481820060 2346     195.181.174.159/9993</span><br><span class="line">a05acf0233 1.6.4  LEAF     205 DIRECT 2773     2773     34.135.35.67/46781</span><br><span class="line">c8a68837ae -      LEAF      -1 RELAY</span><br></pre></td></tr></tbody></table></figure><p>如果出现 <code>&lt;role&gt;</code> 为 MOON 的节点信息，则表示通过 moon 提速完成，上表中的 IP 和 Zerotier Id 都是随机的生成的。</p><h3 id="设置-Zerotier-的路由表"><a href="#设置-Zerotier-的路由表" class="headerlink" title="设置 Zerotier 的路由表"></a>设置 Zerotier 的路由表</h3><p>在 Zerotier 的<span class="exturl" data-url="aHR0cHM6Ly9teS56ZXJvdGllci5jb20vbmV0d29yay8=" title="Zerotier 网络管理界面">网络管理界面<i class="fa fa-external-link-alt"></i></span>中添加路由表，我的路由表如下：</p><figure class="highlight plaintext"><table><tbody><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">10.147.17.0/24 (LAN)</span><br><span class="line">192.168.5.0/24 via 10.147.17.151</span><br></pre></td></tr></tbody></table></figure><p>第一个表示<code>10.147.17.0/24</code> 这是同一个局域网，分配出来的 IP 在这个范围的直连就行了，不用过别的网关了。</p><p>第二条表示，家庭的路由器后网段是<code>192.168.5.0/24</code>，而 OpenWRT 在 Zerotier 网络得到的 IP 是<code>10.147.17.151</code> (这个可以在 zerotier 网站查，也可以通过<code>ifconfig</code>命令在路由器查)，那么 zerotier 局域网内的其他 IP 要访问这个<code>192.168.5.0/24</code>网段的话，自然要通过<code>10.147.17.151</code>作为网关。</p><p>如果有多个网络的话，增加多条路由表即可，不过 Zerotier 免费的版本，最多可以添加 25 个设备，如果超过这个设备的话，可以通过之间 PLANT 来解决。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>在 OpenWRT 上配置好 Zerotier 后，路由后的所有设备都可以直接访问 <code>10.147.17.x</code> 段的服务，无需做其他配置。在出差的时候，在本地启动 Zerotier 服务后，也可以直接访问家中的 <code>192.168.5.x</code> 的服务，比如 NAS 之类的。</p><p><code>---EOF---</code></p>]]>
    </content>
    <id>https://gythialy.github.io/access-lan-from-remote-by-zerotier/</id>
    <link href="https://gythialy.github.io/access-lan-from-remote-by-zerotier/"/>
    <published>2023-02-01T05:54:58.000Z</published>
    <summary>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>偶尔出差的时候，需要访问家里的网络，办公室已经有一台服务器使用了<span class="exturl" data-url="aHR0cHM]]>
    </summary>
    <title>基于 ZeroTier 和 Openwrt 路由器的内网互联</title>
    <updated>2026-04-21T06:30:40.102Z</updated>
  </entry>
</feed>