<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://jiangbyte.cn/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://jiangbyte.cn/</id>
  <title>摸鱼猫泡泡</title>
  <subtitle>摸鱼猫泡泡：记录 Java、工具与工程实践。</subtitle>
  <icon>https://jiangbyte.cn/img/logo.png</icon>
  <updated>2026-10-29T16:54:13.401Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://jiangbyte.cn/atom.xml"/>
  <link rel="alternate" href="https://jiangbyte.cn/"/>
  <category term="职场与面试"/>
  <category term="考研408"/>
  <category term="泡泡"/>
  <category term="Ops"/>
  <category term="Project"/>
  <category term="Embedded"/>
  <category term="Practice"/>
  <category term="Soft Exam"/>
  <category term="Tools"/>
  <category term="Java"/>
  <entry>
    <title type="text">职场与面试</title>
    <id>https://jiangbyte.cn/career/</id>
    <link href="https://jiangbyte.cn/career/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>职场工作记录与面试经验相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>职场工作记录与面试经验相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">数据库</title>
    <id>https://jiangbyte.cn/database/</id>
    <link href="https://jiangbyte.cn/database/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>数据库相关笔记，按引擎分目录整理。</p>
]]></summary>
    <content type="html"><![CDATA[<p>数据库相关笔记，按引擎分目录整理。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">考研408</title>
    <id>https://jiangbyte.cn/kaoyan-408/</id>
    <link href="https://jiangbyte.cn/kaoyan-408/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>计算机统考 408 相关笔记，按科目分目录整理。</p>
]]></summary>
    <content type="html"><![CDATA[<p>计算机统考 408 相关笔记，按科目分目录整理。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">软考</title>
    <id>https://jiangbyte.cn/soft-exam/</id>
    <link href="https://jiangbyte.cn/soft-exam/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>计算机技术与软件专业技术资格（软考）相关笔记，按考试科目分目录整理。</p>
]]></summary>
    <content type="html"><![CDATA[<p>计算机技术与软件专业技术资格（软考）相关笔记，按考试科目分目录整理。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">源码阅读</title>
    <id>https://jiangbyte.cn/source-reading/</id>
    <link href="https://jiangbyte.cn/source-reading/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>按语言与运行时整理的源码阅读笔记，侧重契约、实现与工程用法。</p>
]]></summary>
    <content type="html"><![CDATA[<p>按语言与运行时整理的源码阅读笔记，侧重契约、实现与工程用法。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">常见八股与手撕</title>
    <id>https://jiangbyte.cn/career/interview/2026-10-29-%E5%B8%B8%E8%A7%81%E5%85%AB%E8%82%A1%E4%B8%8E%E6%89%8B%E6%92%95.html</id>
    <link href="https://jiangbyte.cn/career/interview/2026-10-29-%E5%B8%B8%E8%A7%81%E5%85%AB%E8%82%A1%E4%B8%8E%E6%89%8B%E6%92%95.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">自我介绍与项目讲述</title>
    <id>https://jiangbyte.cn/career/interview/2026-10-29-%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%A1%B9%E7%9B%AE%E8%AE%B2%E8%BF%B0.html</id>
    <link href="https://jiangbyte.cn/career/interview/2026-10-29-%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8D%E4%B8%8E%E9%A1%B9%E7%9B%AE%E8%AE%B2%E8%BF%B0.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">面试复盘</title>
    <id>https://jiangbyte.cn/career/interview/2026-10-29-%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98.html</id>
    <link href="https://jiangbyte.cn/career/interview/2026-10-29-%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">面试经验</title>
    <id>https://jiangbyte.cn/career/interview/</id>
    <link href="https://jiangbyte.cn/career/interview/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>面试准备、题解与复盘相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>面试准备、题解与复盘相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">入职与上手</title>
    <id>https://jiangbyte.cn/career/workplace/2026-10-29-%E5%85%A5%E8%81%8C%E4%B8%8E%E4%B8%8A%E6%89%8B.html</id>
    <link href="https://jiangbyte.cn/career/workplace/2026-10-29-%E5%85%A5%E8%81%8C%E4%B8%8E%E4%B8%8A%E6%89%8B.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">协作与交付</title>
    <id>https://jiangbyte.cn/career/workplace/2026-10-29-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html</id>
    <link href="https://jiangbyte.cn/career/workplace/2026-10-29-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">复盘与成长</title>
    <id>https://jiangbyte.cn/career/workplace/2026-10-29-%E5%A4%8D%E7%9B%98%E4%B8%8E%E6%88%90%E9%95%BF.html</id>
    <link href="https://jiangbyte.cn/career/workplace/2026-10-29-%E5%A4%8D%E7%9B%98%E4%B8%8E%E6%88%90%E9%95%BF.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="职场与面试"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">职场工作记录</title>
    <id>https://jiangbyte.cn/career/workplace/</id>
    <link href="https://jiangbyte.cn/career/workplace/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>职场工作中的过程记录与复盘。</p>
]]></summary>
    <content type="html"><![CDATA[<p>职场工作中的过程记录与复盘。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">MySQL</title>
    <id>https://jiangbyte.cn/database/mysql/</id>
    <link href="https://jiangbyte.cn/database/mysql/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>MySQL 安装、主从复制与运维相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>MySQL 安装、主从复制与运维相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">Redis</title>
    <id>https://jiangbyte.cn/database/redis/</id>
    <link href="https://jiangbyte.cn/database/redis/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>Redis 安装与运维相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Redis 安装与运维相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">体系结构与协议栈</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E4%B8%8E%E5%8D%8F%E8%AE%AE%E6%A0%88.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E4%B8%8E%E5%8D%8F%E8%AE%AE%E6%A0%88.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">物理层与数据链路层</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E7%89%A9%E7%90%86%E5%B1%82%E4%B8%8E%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E7%89%A9%E7%90%86%E5%B1%82%E4%B8%8E%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">网络层与运输层</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E7%BD%91%E7%BB%9C%E5%B1%82%E4%B8%8E%E8%BF%90%E8%BE%93%E5%B1%82.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-network/2026-10-29-%E7%BD%91%E7%BB%9C%E5%B1%82%E4%B8%8E%E8%BF%90%E8%BE%93%E5%B1%82.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机网络</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-network/</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-network/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>计算机网络相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>计算机网络相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">存储系统</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">指令系统与 CPU</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F%E4%B8%8ECPU.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F%E4%B8%8ECPU.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">数据表示与运算</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E4%B8%8E%E8%BF%90%E7%AE%97.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-organization/2026-10-29-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E4%B8%8E%E8%BF%90%E7%AE%97.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机原理</title>
    <id>https://jiangbyte.cn/kaoyan-408/computer-organization/</id>
    <link href="https://jiangbyte.cn/kaoyan-408/computer-organization/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>计算机组成原理相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>计算机组成原理相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">图</title>
    <id>https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E5%9B%BE.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E5%9B%BE.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">树与二叉树</title>
    <id>https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">线性表</title>
    <id>https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E7%BA%BF%E6%80%A7%E8%A1%A8.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/data-structure/2026-10-29-%E7%BA%BF%E6%80%A7%E8%A1%A8.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">数据结构</title>
    <id>https://jiangbyte.cn/kaoyan-408/data-structure/</id>
    <link href="https://jiangbyte.cn/kaoyan-408/data-structure/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>数据结构相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>数据结构相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">内存管理</title>
    <id>https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">文件与 I/O</title>
    <id>https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E6%96%87%E4%BB%B6%E4%B8%8EIO.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E6%96%87%E4%BB%B6%E4%B8%8EIO.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">进程与线程</title>
    <id>https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.html</id>
    <link href="https://jiangbyte.cn/kaoyan-408/operating-system/2026-10-29-%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>占位文：提纲与正文待补。</p>
</blockquote>
<h2>要点（待写）</h2>
<ul>
<li></li>
</ul>
<h2>参考</h2>
<ul>
<li></li>
</ul>
]]></content>
    <category term="考研408"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">操作系统</title>
    <id>https://jiangbyte.cn/kaoyan-408/operating-system/</id>
    <link href="https://jiangbyte.cn/kaoyan-408/operating-system/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>操作系统相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>操作系统相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">高级架构设计师</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>系统架构设计师（高级）综合知识、案例分析与论文相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>系统架构设计师（高级）综合知识、案例分析与论文相关笔记。</p>
]]></content>
    <published>2026-10-29T14:54:42.000Z</published>
  </entry>
  <entry>
    <title type="text">人设与造型</title>
    <id>https://jiangbyte.cn/bubble/2026-10-28-%E4%BA%BA%E8%AE%BE%E4%B8%8E%E9%80%A0%E5%9E%8B.html</id>
    <link href="https://jiangbyte.cn/bubble/2026-10-28-%E4%BA%BA%E8%AE%BE%E4%B8%8E%E9%80%A0%E5%9E%8B.html"/>
    <updated>2026-10-29T16:54:03.000Z</updated>
    <summary type="html"><![CDATA[<p>站点拟人形象：<strong>三花猫耳「泡泡」</strong>。默认造型与三视图如下。</p>
<div class="jb-mascot">
<figure><figcaption>泡泡 · 元气</figcaption></figure>
</div>
<h2>三视图</h2>
<h3>Q 版</h3>
<figure><figcaption>泡泡 Q 版三视图：正面 / 侧面 / 背面</figcaption></figure>
<h3>美型</h3>
<figure><figcaption>泡泡美型三视图：正面 / 侧面 / 背面</figcaption></figure>
<h2>生成说明</h2>]]></summary>
    <content type="html"><![CDATA[<p>站点拟人形象：<strong>三花猫耳「泡泡」</strong>。默认造型与三视图如下。</p>
<div class="jb-mascot">
<figure><figcaption>泡泡 · 元气</figcaption></figure>
</div>
<h2>三视图</h2>
<h3>Q 版</h3>
<figure><figcaption>泡泡 Q 版三视图：正面 / 侧面 / 背面</figcaption></figure>
<h3>美型</h3>
<figure><figcaption>泡泡美型三视图：正面 / 侧面 / 背面</figcaption></figure>
<h2>生成说明</h2>
<p>角色立绘、造型、三视图及 Logo 等素材均由 <strong>AI 图像生成</strong>，再经去底、裁切等后期处理，用于本人站点、作品与项目中的标识与展示。形象为原创拟人设定，<strong>不关联任何商业动画 / 游戏官方角色</strong>。</p>
]]></content>
    <category term="泡泡"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">VuePress 静态站样式丢失排查与修复</title>
    <id>https://jiangbyte.cn/posts/ops/nginx/2026-10-29-VuePress%E9%9D%99%E6%80%81%E7%AB%99%E6%A0%B7%E5%BC%8F%E4%B8%A2%E5%A4%B1%E6%8E%92%E6%9F%A5%E4%B8%8E%E4%BF%AE%E5%A4%8D.html</id>
    <link href="https://jiangbyte.cn/posts/ops/nginx/2026-10-29-VuePress%E9%9D%99%E6%80%81%E7%AB%99%E6%A0%B7%E5%BC%8F%E4%B8%A2%E5%A4%B1%E6%8E%92%E6%9F%A5%E4%B8%8E%E4%BF%AE%E5%A4%8D.html"/>
    <updated>2026-10-29T14:04:02.000Z</updated>
    <summary type="html"><![CDATA[<h2>占位符</h2>
<table>
<thead>
<tr>
<th>写法</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>【域名】</code></td>
<td>主站域名，如 <code>jiangbyte.cn</code></td>
</tr>
<tr>
<td><code>【网关目录】</code></td>
<td>宿主机网关根目录，如 <code>/root/deploy/nginx</code> 或 <code>/opt/nginx-gateway</code></td>
</tr>
<tr>
<td><code>【容器名】</code></td>
<td>网关容器名，如 <code>nginx-gateway</code></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>占位符</h2>
<p>| 写法 | 含义 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-29T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">泡泡</title>
    <id>https://jiangbyte.cn/bubble/</id>
    <link href="https://jiangbyte.cn/bubble/"/>
    <updated>2026-10-29T16:54:03.000Z</updated>
    <summary type="html"><![CDATA[<p>站点拟人形象「泡泡」相关内容：人设造型与三视图。</p>
]]></summary>
    <content type="html"><![CDATA[<p>站点拟人形象「泡泡」相关内容：人设造型与三视图。</p>
]]></content>
    <published>2026-10-28T22:56:53.000Z</published>
  </entry>
  <entry>
    <title type="text">Docker Nginx 通用反向代理网关</title>
    <id>https://jiangbyte.cn/posts/ops/nginx/2026-10-28-Docker%20Nginx%20%E9%80%9A%E7%94%A8%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%BD%91%E5%85%B3.html</id>
    <link href="https://jiangbyte.cn/posts/ops/nginx/2026-10-28-Docker%20Nginx%20%E9%80%9A%E7%94%A8%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%BD%91%E5%85%B3.html"/>
    <updated>2026-10-28T16:15:48.000Z</updated>
    <summary type="html"><![CDATA[<h2>占位符</h2>
<table>
<thead>
<tr>
<th>写法</th>
<th>含义</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>【域名】</code></td>
<td>主站域名</td>
<td><code>docs.example.com</code></td>
</tr>
<tr>
<td><code>【IP】</code></td>
<td>服务器公网 IP</td>
<td><code>203.0.113.10</code>（文档用示例网段）</td>
</tr>
<tr>
<td><code>【子域】</code></td>
<td>子域前缀（不含主域）</td>
<td><code>docs</code> → <code>docs.【域名】</code></td>
</tr>
<tr>
<td><code>【前端容器】</code></td>
<td>上游前端 / 静态容器名</td>
<td><code>my-docs-1</code></td>
</tr>
<tr>
<td><code>【后端容器】</code></td>
<td>上游 API 容器名</td>
<td><code>my-api-1</code></td>
</tr>
<tr>
<td><code>【网络名】</code></td>
<td>Docker 网络名</td>
<td><code>docker network ls</code> 查看</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>占位符</h2>
<p>| 写法 | 含义 | 示例 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">HTTPS 证书：申请、挂载与自动续期</title>
    <id>https://jiangbyte.cn/posts/ops/nginx/2026-10-28-HTTPS%20%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E6%8C%82%E8%BD%BD%E4%B8%8E%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F.html</id>
    <link href="https://jiangbyte.cn/posts/ops/nginx/2026-10-28-HTTPS%20%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E6%8C%82%E8%BD%BD%E4%B8%8E%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F.html"/>
    <updated>2026-10-28T16:15:48.000Z</updated>
    <summary type="html"><![CDATA[<h2>占位符</h2>
<table>
<thead>
<tr>
<th>写法</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>【域名】</code></td>
<td>主站域名（与网关篇一致）</td>
</tr>
<tr>
<td><code>【IP】</code></td>
<td>服务器公网 IP（DNS A 记录应指向这里）</td>
</tr>
<tr>
<td><code>【邮箱】</code></td>
<td>Let’s Encrypt 通知邮箱</td>
</tr>
</tbody>
</table>
<p>路径固定：<code>/root/deploy/nginx</code>，用户：<strong>root</strong>。</p>]]></summary>
    <content type="html"><![CDATA[<h2>占位符</h2>
<p>| 写法 | 含义 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">静态站点部署与持续交付</title>
    <id>https://jiangbyte.cn/posts/ops/nginx/2026-10-28-%E9%9D%99%E6%80%81%E7%AB%99%E7%82%B9%E9%83%A8%E7%BD%B2%E4%B8%8E%E6%8C%81%E7%BB%AD%E4%BA%A4%E4%BB%98.html</id>
    <link href="https://jiangbyte.cn/posts/ops/nginx/2026-10-28-%E9%9D%99%E6%80%81%E7%AB%99%E7%82%B9%E9%83%A8%E7%BD%B2%E4%B8%8E%E6%8C%81%E7%BB%AD%E4%BA%A4%E4%BB%98.html"/>
    <updated>2026-10-28T15:53:18.000Z</updated>
    <summary type="html"><![CDATA[<h2>占位符</h2>
<table>
<thead>
<tr>
<th>写法</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>【域名】</code></td>
<td>站点域名</td>
</tr>
<tr>
<td><code>【IP】</code></td>
<td>服务器公网 IP（SSH / rsync 目标）</td>
</tr>
<tr>
<td><code>【项目目录】</code></td>
<td>本机文档站仓库路径</td>
</tr>
<tr>
<td><code>【构建输出】</code></td>
<td>如 <code>docs/.vuepress/dist/</code></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>占位符</h2>
<p>| 写法 | 含义 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">nginx</title>
    <id>https://jiangbyte.cn/posts/ops/nginx/</id>
    <link href="https://jiangbyte.cn/posts/ops/nginx/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>Docker Nginx 统一入口、证书与静态站点发布相关笔记。文中常用占位 <code>【域名】</code>、<code>【IP】</code>、<code>【邮箱】</code> 等；用户统一 <code>root</code>，目录统一 <code>/root/deploy/nginx</code>。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Docker Nginx 统一入口、证书与静态站点发布相关笔记。文中常用占位 <code>【域名】</code>、<code>【IP】</code>、<code>【邮箱】</code> 等；用户统一 <code>root</code>，目录统一 <code>/root/deploy/nginx</code>。</p>
]]></content>
    <published>2026-10-28T15:35:14.000Z</published>
  </entry>
  <entry>
    <title type="text">项目</title>
    <id>https://jiangbyte.cn/projects/</id>
    <link href="https://jiangbyte.cn/projects/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>开源与个人作品介绍，一篇对应一个项目：定位、特性与技术栈。</p>
]]></summary>
    <content type="html"><![CDATA[<p>开源与个人作品介绍，一篇对应一个项目：定位、特性与技术栈。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">ACOJ</title>
    <id>https://jiangbyte.cn/projects/acoj.html</id>
    <link href="https://jiangbyte.cn/projects/acoj.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/acoj" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/acoj</a></li>
</ul>
<p><strong>ACOJ</strong> 是在线评测（OJ）monorepo：在 HEI 脚手架上扩展题库、提交判题与多执行机调度，提供 <strong>Admin</strong>（Vue 3）、<strong>Portal</strong>（React 19）与统一 Spring Boot API。判题执行依赖 <a href="https://github.com/jiangbyte/SparkSandbox" target="_blank" rel="noopener noreferrer">SparkSandbox</a>：<strong>沙箱只编译与限资源运行，AC / WA 在 ACOJ 裁决</strong>。Apache License 2.0。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/acoj" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/acoj</a></li>
</ul>
<p><strong>ACOJ</strong> 是在线评测（OJ）monorepo：在 HEI 脚手架上扩展题库、提交判题与多执行机调度，提供 <strong>Admin</strong>（Vue 3）、<strong>Portal</strong>（React 19）与统一 Spring Boot API。判题执行依赖 <a href="https://github.com/jiangbyte/SparkSandbox" target="_blank" rel="noopener noreferrer">SparkSandbox</a>：<strong>沙箱只编译与限资源运行，AC / WA 在 ACOJ 裁决</strong>。Apache License 2.0。</p>
<p>相对「沙箱内直接出最终结果」的一体化 OJ，隔离执行与题目语义拆开：执行机加权调度、熔断、排水、租约换机；平台保留测例版本、标签、发布校验与做题统计。<code>modules/oj</code> 叠在脚手架之上，而不是从零拼一套账号与存储。</p>
<h2>特性</h2>
<ul>
<li><strong>双端账号</strong>：ADMIN / PORTAL 独立会话（Sa-Token）；密码 RSA、验证码、失败锁定与限流；JustAuth（可配置）</li>
<li><strong>RBAC</strong>：账号 / 角色 / 部门 / 用户组 / 岗位；菜单、按钮与 API 授权；会话踢出</li>
<li><strong>系统管理</strong>：字典、动态配置（敏感项加密）、Banner、公告、反馈、弱口令库</li>
<li><strong>对象存储</strong>：S3 兼容（MinIO / RustFS / OSS），直链或预签名</li>
<li><strong>运维</strong>：审计与告警、登录日志、运营工作台、<code>sys_job</code> / Lock4j</li>
<li><strong>题库</strong>：CRUD、测例 INLINE / OBJECT、标签、参考答案、试跑与发布校验</li>
<li><strong>提交与判题</strong>：多语言入队；RabbitMQ；加权调度、熔断 / 排水 / 租约换机；业务侧裁决</li>
<li><strong>判题节点</strong>：<code>oj_judge_node</code> 登记沙箱；心跳探活；<code>oj_judge_dispatch</code> 派发审计</li>
<li><strong>个人中心</strong>：公开资料、安全设置、实名认证；做题统计</li>
</ul>
<p>API 前缀 <code>/api/v1/admin/*</code> 与 <code>/api/v1/portal/*</code>。子工程：<code>admin</code> · <code>portal</code> · <code>server</code>。</p>
<h2>技术栈</h2>
<ul>
<li>后端：JDK 21 · Spring Boot 4.1 · Maven · 虚拟线程</li>
<li>持久化：MySQL / PostgreSQL · MyBatis-Plus · Dynamic Datasource</li>
<li>缓存 / 会话 / 队列：Redis · Redisson · Sa-Token · RabbitMQ</li>
<li>管理端：Vue 3 · Vite · TypeScript · Naive UI · UnoCSS</li>
<li>门户：React 19 · Vite · TypeScript · Ant Design</li>
<li>判题：SparkSandbox（HMAC）</li>
<li>其他：JustAuth · AWS SDK v2（S3）· Hutool · MapStruct · Knife4j / SpringDoc</li>
</ul>
<h2>相关项目</h2>
<ul>
<li><a href="https://github.com/jiangbyte/SparkSandbox" target="_blank" rel="noopener noreferrer">SparkSandbox</a>：隔离编译与运行</li>
<li><a href="https://github.com/jiangbyte/hei-boot" target="_blank" rel="noopener noreferrer">hei-boot</a> · <a href="https://github.com/jiangbyte/hei-admin" target="_blank" rel="noopener noreferrer">hei-admin</a> · <a href="https://github.com/jiangbyte/hei-portal" target="_blank" rel="noopener noreferrer">hei-portal</a>：server / 双端同源脚手架</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-08-31T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">code-guide</title>
    <id>https://jiangbyte.cn/projects/code-guide.html</id>
    <link href="https://jiangbyte.cn/projects/code-guide.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/code-guide" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/code-guide</a></li>
<li>主页：<a href="https://jiangbyte.cn" target="_blank" rel="noopener noreferrer">https://jiangbyte.cn</a></li>
</ul>
<p><strong>code-guide</strong>（摸鱼猫泡泡）：VuePress + Theme Hope，笔记按系列归档，项目以独立文章介绍。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/code-guide" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/code-guide</a></li>
<li>主页：<a href="https://jiangbyte.cn" target="_blank" rel="noopener noreferrer">https://jiangbyte.cn</a></li>
</ul>
<p><strong>code-guide</strong>（摸鱼猫泡泡）：VuePress + Theme Hope，笔记按系列归档，项目以独立文章介绍。</p>
<p>内容以 Markdown 为主，站点工程与文档内容同仓，便于一起迭代主题、组件与检索。</p>
<h2>特性</h2>
<ul>
<li>笔记：语言、工具、运维、软考与实践等系列</li>
<li>项目：一篇对应一个项目，含定位、特性与示意</li>
<li>构建：<code>pnpm docs:dev</code> / <code>pnpm docs:build</code></li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">go-blog</title>
    <id>https://jiangbyte.cn/projects/go-blog.html</id>
    <link href="https://jiangbyte.cn/projects/go-blog.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/go-blog" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/go-blog</a></li>
</ul>
<p><strong>go-blog</strong> 是个人博客全栈系统：后端 Go（Gin + GORM），前端含博客前台、管理端与简历站。单管理员模型，支持 Docker 部署。</p>
<p>因为懒得维护动态博客——既不如静态站点用 Markdown 编写方便，也不便备份——所以把之前自己做的博客系统整理出来并开源了。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/go-blog" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/go-blog</a></li>
</ul>
<p><strong>go-blog</strong> 是个人博客全栈系统：后端 Go（Gin + GORM），前端含博客前台、管理端与简历站。单管理员模型，支持 Docker 部署。</p>
<p>因为懒得维护动态博客——既不如静态站点用 Markdown 编写方便，也不便备份——所以把之前自己做的博客系统整理出来并开源了。</p>
<h2>特性</h2>
<ul>
<li>前台：文章、项目、搜索与简历页</li>
<li>管理端：概览、文章、站点配置与个人中心</li>
<li>技术栈：Go 1.22+ · Gin · GORM · Vue 3 · Naive UI</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-10-28T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">M3U8 Downloader</title>
    <id>https://jiangbyte.cn/projects/m3u8-downloader.html</id>
    <link href="https://jiangbyte.cn/projects/m3u8-downloader.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/M3u8Downloader" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/M3u8Downloader</a></li>
</ul>
<p><strong>M3U8 Downloader</strong> 是面向 HLS 的跨平台桌面下载器：解析 master / media playlist，并发拉取 TS 分片，ffmpeg <code>-c copy</code> remux 为 MP4。引擎在 Rust，界面 React，壳层 Tauri 2，覆盖 Windows、macOS、Linux。当前版本 <code>0.1.1</code>，MIT。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/M3u8Downloader" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/M3u8Downloader</a></li>
</ul>
<p><strong>M3U8 Downloader</strong> 是面向 HLS 的跨平台桌面下载器：解析 master / media playlist，并发拉取 TS 分片，ffmpeg <code>-c copy</code> remux 为 MP4。引擎在 Rust，界面 React，壳层 Tauri 2，覆盖 Windows、macOS、Linux。当前版本 <code>0.1.1</code>，MIT。</p>
<p>相对「脚本拼接分片」，清晰度选择、AES-128、代理与自定义请求、任务/分片控制、断点续传和边下边播放进同一任务模型。安装包见 <a href="https://github.com/jiangbyte/M3u8Downloader/releases" target="_blank" rel="noopener noreferrer">Releases</a>。</p>
<h2>特性</h2>
<ul>
<li><strong>清单与变体</strong>：master playlist，下载前选择清晰度</li>
<li><strong>加密分片</strong>：明文 HLS 与 <code>#EXT-X-KEY</code> AES-128-CBC</li>
<li><strong>传输控制</strong>：Headers、Cookie、Referer、HTTP(S) 代理、并发度、输出路径</li>
<li><strong>任务队列</strong>：暂停 / 继续 / 取消 / 删除；按已落盘分片续传</li>
<li><strong>分片粒度</strong>：详情内单独开始、停止、重试；任务级操作中断在途请求</li>
<li><strong>边下边播</strong>：本地 HLS 播放已连续分片；完成后打开 MP4</li>
<li><strong>封装输出</strong>：ffmpeg remux；可选清理临时分片</li>
</ul>
<h2>技术栈</h2>
<ul>
<li>桌面壳：Tauri 2</li>
<li>下载引擎：Rust · Tokio · reqwest</li>
<li>界面：React 19 · TypeScript · Vite · Ant Design</li>
<li>封装：ffmpeg（打包 binaries）</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-09-18T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">ResumeFloat</title>
    <id>https://jiangbyte.cn/projects/resume-float.html</id>
    <link href="https://jiangbyte.cn/projects/resume-float.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/ResumeFloat" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/ResumeFloat</a></li>
</ul>
<p><strong>ResumeFloat</strong> 是跨平台置顶悬浮简历速拷工具：默认 Compact 为「标签 + 一键复制」，可切入编辑。条目由可组合块构成（纯文本 / Markdown / 富文本 / 图片），数据落 SQLite，支持整库导出导入。当前版本 <code>0.1.1</code>，MIT。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/ResumeFloat" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/ResumeFloat</a></li>
</ul>
<p><strong>ResumeFloat</strong> 是跨平台置顶悬浮简历速拷工具：默认 Compact 为「标签 + 一键复制」，可切入编辑。条目由可组合块构成（纯文本 / Markdown / 富文本 / 图片），数据落 SQLite，支持整库导出导入。当前版本 <code>0.1.1</code>，MIT。</p>
<p>面试、网申、即时通讯反复粘贴自我介绍、项目要点、联系方式时，置顶窗口减少在文档与聊天之间切换。<code>v*</code> 标签触发 Actions 构建三端安装包，见 <a href="https://github.com/jiangbyte/ResumeFloat/releases" target="_blank" rel="noopener noreferrer">Releases</a>。</p>
<h2>特性</h2>
<ul>
<li><strong>置顶悬浮</strong>：无边框 always-on-top，标题栏拖拽；钉住与下拉菜单</li>
<li><strong>Compact 速拷</strong>：标签 + 预览（超长省略）；按块顺序拼装剪贴板</li>
<li><strong>主题</strong>：深色 / 浅色，本地记住</li>
<li><strong>块编辑</strong>：增删条目；块类型动态添加、排序、删除</li>
<li><strong>内容类型</strong>：纯文本 · Markdown（编辑 / 预览）· 富文本（TipTap）· 图片</li>
<li><strong>持久化</strong>：<code>items</code> / <code>blocks</code>；图片在配置目录 <code>assets/</code></li>
<li><strong>导出 / 导入</strong>：<code>resume.db</code> + <code>assets/</code>；导入前确认覆盖</li>
</ul>
<h2>技术栈</h2>
<ul>
<li>桌面壳：Tauri 2</li>
<li>界面：React 19 · TypeScript · Vite · Ant Design</li>
<li>内容：TipTap · react-markdown · marked</li>
<li>存储：<code>@tauri-apps/plugin-sql</code> · clipboard-manager · dialog · fs</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-09-18T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">SparkSandbox</title>
    <id>https://jiangbyte.cn/projects/spark-sandbox.html</id>
    <link href="https://jiangbyte.cn/projects/spark-sandbox.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/SparkSandbox" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/SparkSandbox</a></li>
</ul>
<p><strong>SparkSandbox</strong> 是 Linux 上的<strong>隔离执行 HTTP 服务</strong>，不是对外 SDK。任意语言发 HTTP 完成编译与运行，HMAC 验签由调用方实现。响应含 stdout、stderr、资源用量与执行状态；支持多测例、checker、interactive pipeline、文件仓与 SSE。仓内 Python 仅供本仓测试。当前版本 <code>0.1.1</code>，MIT。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/SparkSandbox" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/SparkSandbox</a></li>
</ul>
<p><strong>SparkSandbox</strong> 是 Linux 上的<strong>隔离执行 HTTP 服务</strong>，不是对外 SDK。任意语言发 HTTP 完成编译与运行，HMAC 验签由调用方实现。响应含 stdout、stderr、资源用量与执行状态；支持多测例、checker、interactive pipeline、文件仓与 SSE。仓内 Python 仅供本仓测试。当前版本 <code>0.1.1</code>，MIT。</p>
<p>OJ、在线 IDE、作业评测把「跑用户代码」交给本服务；AC / WA 留在业务侧。<a href="https://github.com/jiangbyte/acoj" target="_blank" rel="noopener noreferrer">ACOJ</a> 判题执行即对接此服务。</p>
<h2>特性</h2>
<ul>
<li><strong>双层实现</strong>：引擎负责隔离与状态分类；编排负责语言表、worker 池、CompileCache、FileStore、多测例并行</li>
<li><strong>执行状态</strong>：<code>succeeded</code>、<code>compile_failed</code>、<code>runtime_error</code>、<code>time_limit_exceeded</code>、<code>memory_limit_exceeded</code>、<code>output_limit_exceeded</code>、<code>security_violation</code>、<code>internal_error</code>；<code>stage</code> 区分 compile / run</li>
<li><strong>语言表</strong>：默认 C11、C++17、Python 3、Java 17、Go、Node.js；镜像另开 Rust 与 SQLite；YAML 可声明 SQL 客户端语言</li>
<li><strong>评测形态</strong>：多测例、checker、interactive、文件仓、SSE</li>
<li><strong>容器</strong>：toolchain base 与 server 分层；<code>--privileged --cgroupns=host</code></li>
</ul>
<h2>技术栈</h2>
<ul>
<li>引擎：C++20 · namespaces · cgroup · seccomp</li>
<li>编排：Python 3.10+ · FastAPI</li>
<li>交付：Docker 双层镜像</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-08-31T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Startpage</title>
    <id>https://jiangbyte.cn/projects/startpage.html</id>
    <link href="https://jiangbyte.cn/projects/startpage.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/startpage" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/startpage</a></li>
<li>主页：<a href="https://jiangbyte.github.io/startpage/" target="_blank" rel="noopener noreferrer">https://jiangbyte.github.io/startpage/</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/startpage" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/startpage</a></li>
<li>主页：<a href="https://jiangbyte.github.io/startpage/" target="_blank" rel="noopener noreferrer">https://jiangbyte.github.io/startpage/</a></li>
</ul>
<p><strong>Startpage</strong> 是静态托管的个人书签导航起始页：无后端、无数据库，书签写在源码。<code>url</code> 必填，<code>title</code> / <code>description</code> 可手写覆盖；未手写则 Microlink 拉元数据，失败回退 hostname。在线：<a href="https://jiangbyte.github.io/startpage/" target="_blank" rel="noopener noreferrer">jiangbyte.github.io/startpage</a>。</p>
<p>浏览器默认页 + 分类书签 + 多搜索引擎，不引入账号或同步服务。<code>main</code> 推送后 Actions 构建 <code>dist/</code> 部署 Pages。</p>
<h2>特性</h2>
<ul>
<li><strong>数据即代码</strong>：分类与条目在 <code>src/data/bookmarks.ts</code>；字符串简写等价于只填 <code>url</code></li>
<li><strong>元数据</strong>：双写 title / description 则不请求外部接口；缓存 2 小时硬过期，超过 1 小时后台刷新</li>
<li><strong>图标</strong>：解析站点自身 favicon；失败用字母头像</li>
<li><strong>搜索</strong>：<code>searchEngines</code> 切换后回车，新标签打开，查询词 <code>%s</code> 占位</li>
<li><strong>发布</strong>：GitHub Actions → GitHub Pages</li>
</ul>
<h2>技术栈</h2>
<ul>
<li>构建：Vite</li>
<li>界面：React · TypeScript</li>
<li>托管：GitHub Pages</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-09-06T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Voxel</title>
    <id>https://jiangbyte.cn/projects/voxel.html</id>
    <link href="https://jiangbyte.cn/projects/voxel.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p><strong>Voxel</strong> 是一组按同一领域分层重建的全栈脚手架系列：<strong>Portal 与 Admin 独立后端、独立前端</strong>，目录、坐标与包名统一为 <code>voxel-*</code> / <code>io.github.jiangbyte.voxel</code>。后端对齐 Java（Spring Boot）、Python（FastAPI）、Go（Gin）；前端对齐 Vue 3 管理端、React 门户与 uni-app。另有七层纯骨架与带账户竖切的充实模板，供对照学习，不作业务拷贝范本。协议 Apache License 2.0。</p>]]></summary>
    <content type="html"><![CDATA[<p><strong>Voxel</strong> 是一组按同一领域分层重建的全栈脚手架系列：<strong>Portal 与 Admin 独立后端、独立前端</strong>，目录、坐标与包名统一为 <code>voxel-*</code> / <code>io.github.jiangbyte.voxel</code>。后端对齐 Java（Spring Boot）、Python（FastAPI）、Go（Gin）；前端对齐 Vue 3 管理端、React 门户与 uni-app。另有七层纯骨架与带账户竖切的充实模板，供对照学习，不作业务拷贝范本。协议 Apache License 2.0。</p>
<p>相对「一份单体里切 admin/portal」，端隔离：Admin 只挂管理 API，Portal 只挂门户 API，前端互不引用对方源码。相对单语言脚手架，同一七层在三种运行时对齐。</p>
<h2>特性</h2>
<ul>
<li><strong>端分离</strong>：Admin / Portal 各仓各端口</li>
<li><strong>DDD 七层</strong>：<code>types</code> · <code>api</code> · <code>domain</code> · <code>infrastructure</code> · <code>case</code>/<code>cases</code> · <code>trigger</code> · <code>app</code></li>
<li><strong>依赖方向</strong>：Trigger → API → Case → Domain ← Infrastructure</li>
<li><strong>Java</strong>：Maven 多模块 <code>{project}-types</code> … <code>-app</code></li>
<li><strong>FastAPI</strong>：仓库根扁平包，无 <code>src/</code> 包装层</li>
<li><strong>Gin</strong>：<code>internal/{types,api,domain,infrastructure,cases,trigger}</code> + <code>cmd/app</code></li>
<li><strong>Web / 移动</strong>：Vue 3、React 19、uni-app 双端</li>
<li><strong>模板仓</strong>：骨架默认注释中间件；充实模板含账户竖切，S3 / Milvus / Spring AI / MCP 注释接入（原 <code>voxel-ddd-ai-lite</code> 已合并）</li>
</ul>
<h2>技术栈</h2>
<ul>
<li>后端：JDK 21 · Python 3.11+ · Go 1.25+</li>
<li>前端：Vue 3 · React 19 · uni-app</li>
<li>协议：OpenAPI / Apifox（<code>docs/api/openapi</code>）</li>
</ul>
<h2>系列仓库</h2>
<p><strong>后端</strong></p>
<ul>
<li><a href="https://github.com/jiangbyte/voxel-boot-admin" target="_blank" rel="noopener noreferrer">voxel-boot-admin</a> · <a href="https://github.com/jiangbyte/voxel-boot-portal" target="_blank" rel="noopener noreferrer">voxel-boot-portal</a></li>
<li><a href="https://github.com/jiangbyte/voxel-fastapi-admin" target="_blank" rel="noopener noreferrer">voxel-fastapi-admin</a> · <a href="https://github.com/jiangbyte/voxel-fastapi-portal" target="_blank" rel="noopener noreferrer">voxel-fastapi-portal</a></li>
<li><a href="https://github.com/jiangbyte/voxel-gin-admin" target="_blank" rel="noopener noreferrer">voxel-gin-admin</a> · <a href="https://github.com/jiangbyte/voxel-gin-portal" target="_blank" rel="noopener noreferrer">voxel-gin-portal</a></li>
</ul>
<p><strong>前端</strong></p>
<ul>
<li><a href="https://github.com/jiangbyte/voxel-admin" target="_blank" rel="noopener noreferrer">voxel-admin</a> · <a href="https://github.com/jiangbyte/voxel-portal" target="_blank" rel="noopener noreferrer">voxel-portal</a></li>
<li><a href="https://github.com/jiangbyte/voxel-admin-uniapp" target="_blank" rel="noopener noreferrer">voxel-admin-uniapp</a> · <a href="https://github.com/jiangbyte/voxel-portal-uniapp" target="_blank" rel="noopener noreferrer">voxel-portal-uniapp</a></li>
</ul>
<p><strong>模板</strong></p>
<ul>
<li><a href="https://github.com/jiangbyte/voxel-ddd-lite-strcut" target="_blank" rel="noopener noreferrer">voxel-ddd-lite-strcut</a> · <a href="https://github.com/jiangbyte/voxel-ddd-lite" target="_blank" rel="noopener noreferrer">voxel-ddd-lite</a></li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">玄鉴</title>
    <id>https://jiangbyte.cn/projects/xuanjian.html</id>
    <link href="https://jiangbyte.cn/projects/xuanjian.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/xuanjian" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/xuanjian</a></li>
</ul>
<p><strong>玄鉴（Xuanjian）</strong> 是面向运维与现场排查的 AI 桌面工作台：主机清单、本地 / SSH / WSL 终端、SFTP、脚本与笔记、会话录制、本机网络工具与 Docker 侧栏，并内置 <strong>玄鉴 Agent</strong>。LangGraph 本地编排，在独立下栏终端可观测执行，按 ReAct 完成排查与运维。数据落 SQLite，跨 Windows / macOS / Linux。当前版本 <code>1.3.7</code>，MIT，<code>io.github.jiangbyte.xuanjian</code>。</p>]]></summary>
    <content type="html"><![CDATA[<ul>
<li>仓库：<a href="https://github.com/jiangbyte/xuanjian" target="_blank" rel="noopener noreferrer">https://github.com/jiangbyte/xuanjian</a></li>
</ul>
<p><strong>玄鉴（Xuanjian）</strong> 是面向运维与现场排查的 AI 桌面工作台：主机清单、本地 / SSH / WSL 终端、SFTP、脚本与笔记、会话录制、本机网络工具与 Docker 侧栏，并内置 <strong>玄鉴 Agent</strong>。LangGraph 本地编排，在独立下栏终端可观测执行，按 ReAct 完成排查与运维。数据落 SQLite，跨 Windows / macOS / Linux。当前版本 <code>1.3.7</code>，MIT，<code>io.github.jiangbyte.xuanjian</code>。</p>
<p>相对「终端 + 散落脚本」，机群、会话、文件、自动化与 Agent 收进同一应用；相对纯云端 Copilot，命令走本机 PTY / SSH，轨迹可回放。</p>
<h2>特性</h2>
<ul>
<li><strong>主机操作台</strong>：分组、标签、排序；口令 AES；一键 SSH 或粘贴 <code>user@host</code></li>
<li><strong>终端工作区</strong>：本地 Shell 与 SSH（xterm）；多标签 keep-alive；左侧文件 / 脚本 / 历史 / 概览 / 进程 / 端口 / Docker；右侧 Agent 与笔记</li>
<li><strong>玄鉴 Agent</strong>：Orchestrator + SubAgent（巡检 / 终端 / 部署 / 分析）；计划 / 确认 / 完全权限；MCP 动态合并；上下文压缩与用量计量</li>
<li><strong>下栏终端</strong>：与主终端分离的独立 PTY；<code>terminal_run</code> / <code>session_exec</code> 输出可见</li>
<li><strong>模型</strong>：自定义供应商；OpenAI 兼容与 Anthropic Messages；思考强度与上下文窗口可配</li>
<li><strong>SFTP</strong>：双栏浏览、上传下载、冲突处理、内联编辑</li>
<li><strong>Docker</strong>：容器、镜像、网络与卷；实时日志；Agent <code>docker_*</code> 工具</li>
<li><strong>脚本与笔记</strong>：脚本包、变量占位、多目标执行；Markdown 分类自动保存</li>
<li><strong>会话日志</strong>：I/O 录制、筛选、回放、导出</li>
<li><strong>网络工具</strong>：Ping / 路由 / DNS、IP 计算、端口、HTTP / TLS、测速、连接与流量</li>
<li><strong>自动化</strong>：批量脚本、Cron、告警、机群概览、审计控制台</li>
<li><strong>数据安全</strong>：SQLite；工作空间同步与 deploy 配方；备份导出（可选 AES）</li>
</ul>
<h2>技术栈</h2>
<ul>
<li>桌面壳：Tauri 2 · SQLite / Dialog / Clipboard</li>
<li>界面：React 19 · TypeScript · Vite · Tailwind CSS · shadcn/ui · Zustand</li>
<li>终端与编辑：xterm.js · Monaco · Markdown · XYFlow · Recharts / ECharts</li>
<li>Agent：LangGraph（<code>agent-core</code>）· Tauri 适配层（<code>agent-adapters</code>）· MCP</li>
<li>会话与网络：Rust · Tokio · russh / russh-sftp · portable-pty · aes-gcm</li>
</ul>
]]></content>
    <category term="Project"/>
    <published>2026-09-02T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">centos安装mysql</title>
    <id>https://jiangbyte.cn/database/mysql/2026-10-01-centos%E5%AE%89%E8%A3%85mysql.html</id>
    <link href="https://jiangbyte.cn/database/mysql/2026-10-01-centos%E5%AE%89%E8%A3%85mysql.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说背景</h2>
<p>CentOS 7 自带的包管理是 Yum 不是 Dnf，而且官方源里没有 MySQL，得自己加仓库。这篇文章就是我在 CentOS 7 上装 MySQL 的完整记录，包括几种不同的安装方式，方便下次忘了回来看。</p>
<h2>先看看系统版本</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redhat-release</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">hostnamectl</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说背景</h2>
<p>CentOS 7 自带的包管理是 Yum 不是 Dnf，而且官方源里没有 MySQL，得自己加仓库。这篇文章就是我在 CentOS 7 上装 MySQL 的完整记录，包括几种不同的安装方式，方便下次忘了回来看。</p>
<h2>先看看系统版本</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redhat-release</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">hostnamectl</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>输出是 <code>CentOS Linux release 7.x</code> 就没问题。如果是 8 或 9 那包管理就变成 Dnf 了，步骤不太一样。</p>
<h2>安装前要确认的事</h2>
<ul>
<li>你有 <code>sudo</code> 权限</li>
<li>机器能联网（离线场景下面有单独的方法）</li>
<li>防火墙要不要开 3306 端口看你自己需求</li>
</ul>
<h2>方法一：用 Yum 装（最省事）</h2>
<h3>先把仓库加上</h3>
<p>Oracle 官方准备好了 RPM 包，一行命令搞定：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>装完之后系统里会多一个 <code>/etc/yum.repos.d/mysql-community.repo</code>，里面有好几个子仓库，默认启用的是 MySQL 8.0。</p>
<h3>想换版本的话</h3>
<p>| 仓库名 | 版本 | 说明 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">ubuntu安装mysql</title>
    <id>https://jiangbyte.cn/database/mysql/2026-10-01-ubuntu%E5%AE%89%E8%A3%85mysql.html</id>
    <link href="https://jiangbyte.cn/database/mysql/2026-10-01-ubuntu%E5%AE%89%E8%A3%85mysql.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说背景</h2>
<p>Ubuntu 的 APT 源里自带 MySQL，装起来比 CentOS 省心不少。不过默认版本可能不是最新的，想指定版本或者用官方最新版也有办法。</p>
<h2>方法一：APT 直接装（最省事）</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说背景</h2>
<p>Ubuntu 的 APT 源里自带 MySQL，装起来比 CentOS 省心不少。不过默认版本可能不是最新的，想指定版本或者用官方最新版也有办法。</p>
<h2>方法一：APT 直接装（最省事）</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>装完启动：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> enable</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>然后跑一下安全配置脚本：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql_secure_installation</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这个脚本会一步步引导你改 root 密码、删匿名用户、禁止 root 远程登录、删测试数据库。别跳过。</p>
<h2>方法二：装特定版本</h2>
<p>APT 里其实各个版本都有独立的包名：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-server-8.0</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 装 8.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-server-5.7</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 装 5.7（如果源里还有的话）</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>方法三：用官方 APT 仓库（想用最新版）</h2>
<p>如果 APT 里的版本太老，可以用 Oracle 官方的仓库：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dpkg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-apt-config_0.8.24-1_all.deb</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>安装过程中会让你选版本，选好之后装的就是官方最新版了。</p>
<h2>基本操作</h2>
<h3>检查状态</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>连 MySQL</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -u</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> root</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>创建用户和数据库</h3>
<div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> USER</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> '</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">username</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">'@</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IDENTIFIED </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">BY</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'password'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> DATABASE</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> dbname</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">GRANT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ALL PRIVILEGES </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dbname.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> TO</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'username'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">@</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'localhost'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FLUSH PRIVILEGES;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>配置文件位置</h3>
<p>| 文件 | 路径 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">主从复制配置</title>
    <id>https://jiangbyte.cn/database/mysql/2026-10-01-%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E9%85%8D%E7%BD%AE.html</id>
    <link href="https://jiangbyte.cn/database/mysql/2026-10-01-%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E9%85%8D%E7%BD%AE.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说背景</h2>
<p>两台机器，主库 CentOS 7，从库 Ubuntu，配 MySQL 主从复制。这篇是实际操作记录，方便下次复用。</p>
<h2>主库配置（CentOS）</h2>
<h3>改配置文件</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/my.cnf</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说背景</h2>
<p>两台机器，主库 CentOS 7，从库 Ubuntu，配 MySQL 主从复制。这篇是实际操作记录，方便下次复用。</p>
<h2>主库配置（CentOS）</h2>
<h3>改配置文件</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/my.cnf</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>在 <code>[mysqld]</code> 段加这些：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>[mysqld]</span></span>
<span class="line"><span>server-id = 1                         # 主库 id，随便填，唯一就行</span></span>
<span class="line"><span>log_bin = /var/log/mysql/mysql-bin.log</span></span>
<span class="line"><span>read-only = 0                         # 0 表示读写（主库）</span></span>
<span class="line"><span>binlog_expire_logs_seconds = 2592000  # 日志保留 30 天</span></span>
<span class="line"><span>max_binlog_size = 100M</span></span>
<span class="line"><span># binlog_do_db = astro_code            # 只同步指定库</span></span>
<span class="line"><span># binlog_ignore_db = mysql,sys         # 不同步的库</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>创建日志目录</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> chown</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql:mysql</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> chmod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 755</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>重启主库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysqld</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>创建复制专用用户</h3>
<p>主库上创建个用户给从库用：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -u</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> root</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CREATE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> USER</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> '</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">copyuser</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">'@</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'120.26.180.149'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IDENTIFIED </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WITH</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mysql_native_password </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">BY</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'MySql@123456'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">GRANT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> replication slave </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ON</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> TO</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'copyuser'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">@</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'120.26.180.149'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>查看主库状态</h3>
<div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SHOW </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MASTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> STATUS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>记下返回的 <code>File</code> 和 <code>Position</code>，从库配置的时候要用。</p>
<h2>从库配置（Ubuntu）</h2>
<h3>改配置文件</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/mysql/mysql.conf.d/mysqld.cnf</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>[mysqld]</span></span>
<span class="line"><span>server-id = 2</span></span>
<span class="line"><span>log_bin = /var/log/mysql/mysql-bin.log</span></span>
<span class="line"><span>read-only = 1                         # 从库只读</span></span>
<span class="line"><span>binlog_expire_logs_seconds = 2592000</span></span>
<span class="line"><span>max_binlog_size = 100M</span></span>
<span class="line"><span>replicate_do_db = astro_code          # 只同步这个库</span></span>
<span class="line"><span>replicate_ignore_db = mysql,sys       # 不同步系统库</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>创建日志目录</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> chown</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql:mysql</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> chmod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 755</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/log/mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>重启从库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>配置同步</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -u</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> root</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">STOP</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> SLAVE;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">RESET</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> SLAVE ALL;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CHANGE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MASTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> TO</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MASTER_HOST</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'47.99.236.69'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- 主库 IP</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MASTER_USER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'copyuser'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- 刚才创建的复制用户</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MASTER_PASSWORD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'MySql@123456'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MASTER_LOG_FILE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mysql-bin.000004'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- 主库 SHOW MASTER STATUS 的 File</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MASTER_LOG_POS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">161383</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;               </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- 主库 SHOW MASTER STATUS 的 Position</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">START</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> SLAVE;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>检查同步状态</h3>
<div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SHOW SLAVE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">STATUS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> \G;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>重点关注两个字段：</p>
<ul>
<li><code>Slave_IO_Running: Yes</code></li>
<li><code>Slave_SQL_Running: Yes</code></li>
</ul>
<p>两个都是 Yes 就说明同步正常。</p>
<h2>踩过的坑</h2>
<h3>日志位置对不上</h3>
<p>主库换了配置或者重启过，binlog 文件和位置会变。重新跑一次 <code>SHOW MASTER STATUS</code>，拿到新的 File 和 Position，在从库重新 <code>CHANGE MASTER TO</code>。</p>
<h3>主从数据不一致</h3>
<p>从库如果之前写过数据，跟主库对不上会导致同步中断。先 <code>STOP SLAVE</code>，从库追上数据之后再 <code>START SLAVE</code>。</p>
<h3>防火墙</h3>
<p>主库 3306 端口要放行从库 IP：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># CentOS</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --permanent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --add-source=从库IP</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --add-port=3306/tcp</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --reload</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>总结</h2>
<ol>
<li><strong>主库</strong>：开 binlog、建复制用户、记下 File 和 Position</li>
<li><strong>从库</strong>：配 server-id、指向主库的 CHANGE MASTER TO、START SLAVE</li>
<li><strong>验证</strong>：<code>SHOW SLAVE STATUS</code> 两个线程都是 Yes 就没问题</li>
</ol>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">centos安装redis</title>
    <id>https://jiangbyte.cn/database/redis/2026-10-01-centos%E5%AE%89%E8%A3%85redis.html</id>
    <link href="https://jiangbyte.cn/database/redis/2026-10-01-centos%E5%AE%89%E8%A3%85redis.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说背景</h2>
<p>CentOS 7 默认源里没有 Redis，得自己想办法。这篇整理了几种装法，从最省事的 Yum 到手动编译，看情况选就行。</p>
<h2>方法一：Yum 装（最省事）</h2>
<h3>先加 EPEL 仓库</h3>
<p>Redis 在 EPEL（Extra Packages for Enterprise Linux）里：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> epel-release</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说背景</h2>
<p>CentOS 7 默认源里没有 Redis，得自己想办法。这篇整理了几种装法，从最省事的 Yum 到手动编译，看情况选就行。</p>
<h2>方法一：Yum 装（最省事）</h2>
<h3>先加 EPEL 仓库</h3>
<p>Redis 在 EPEL（Extra Packages for Enterprise Linux）里：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> epel-release</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>然后直接装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>启动服务</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> enable</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>方法二：编译安装（想要最新版本）</h2>
<p>Yum 里的 Redis 版本一般比较老，想尝鲜就自己编译。</p>
<h3>装编译工具</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> groupinstall</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Development Tools"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tcl</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>下载源码编译</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> http://download.redis.io/redis-stable.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tar</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> xzf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-stable.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-stable</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">make</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> make</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>准备配置目录和数据目录</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/lib/redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis.conf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>方法三：Remi 仓库装（折中方案）</h2>
<p>Remi 仓库里有比较新的 Redis 版本，又不用自己编译：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://rpms.remirepo.net/enterprise/remi-release-7.rpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yum</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --enablerepo=remi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>基本配置</h2>
<h3>改配置</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis.conf</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>几个常用的配置项：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span># 绑定 IP，0.0.0.0 表示允许所有 IP 访问</span></span>
<span class="line"><span>bind 0.0.0.0</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 保护模式（外网访问要关掉）</span></span>
<span class="line"><span>protected-mode no</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 密码（建议设一个）</span></span>
<span class="line"><span>requirepass your_password</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 持久化策略</span></span>
<span class="line"><span>save 900 1</span></span>
<span class="line"><span>save 300 10</span></span>
<span class="line"><span>save 60 10000</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>改完重启：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>测试一下</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-cli</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">ping</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">PONG</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">set</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Hello Redis"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">OK</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">"Hello Redis"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>防火墙放行（如果需要远程连）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --permanent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --add-port=6379/tcp</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --reload</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>安全配置</h2>
<p>Redis 默认没有密码，裸奔很危险。几个基本操作：</p>
<h3>设密码</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> your_strong_password</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>禁掉危险命令</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> FLUSHDB</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> FLUSHALL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> CONFIG</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>限制绑定 IP</h3>
<p>如果只在本机用，绑 <code>127.0.0.1</code> 就好：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">bind</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 127.0.0.1</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>验证安装</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 看看版本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-server</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 跑个性能测试</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-benchmark</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -q</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -n</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 100000</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>总结</h2>
<ul>
<li><strong>图省事</strong> → Yum + EPEL，一行搞定</li>
<li><strong>要最新</strong> → 编译安装，就是多等几分钟</li>
<li><strong>想折中</strong> → Remi 仓库，版本新又不用编译</li>
</ul>
<p>生产环境记得设密码、绑 IP、禁危险命令，别裸奔。</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">ubuntu安装redis</title>
    <id>https://jiangbyte.cn/database/redis/2026-10-01-ubuntu%E5%AE%89%E8%A3%85redis.html</id>
    <link href="https://jiangbyte.cn/database/redis/2026-10-01-ubuntu%E5%AE%89%E8%A3%85redis.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说背景</h2>
<p>Ubuntu 比 CentOS 省心点，APT 源里直接有 Redis，不用额外加仓库。不过版本可能不是最新的，想尝鲜还是得自己编译。</p>
<h2>方法一：APT 装（最省事）</h2>
<h3>更新源然后直接装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说背景</h2>
<p>Ubuntu 比 CentOS 省心点，APT 源里直接有 Redis，不用额外加仓库。不过版本可能不是最新的，想尝鲜还是得自己编译。</p>
<h2>方法一：APT 装（最省事）</h2>
<h3>更新源然后直接装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>启动服务</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> enable</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>方法二：编译安装（想要最新版本）</h2>
<p>APT 里的版本一般落后一两个大版本，想用最新的就自己编译。</p>
<h3>装编译工具</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> build-essential</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tcl</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>下载源码编译</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://download.redis.io/redis-stable.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -xzvf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-stable.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-stable</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">make</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> make</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>准备配置目录</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /var/redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis.conf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>基本配置</h2>
<h3>测试连接</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-cli</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">ping</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">PONG</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">set</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "hello"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">OK</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">"hello"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">127.0.0.1:6379</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">exit</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>改配置</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> nano</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/redis/redis.conf</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>几个常用的：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>bind 127.0.0.1       # 绑定 IP</span></span>
<span class="line"><span>port 6379            # 端口</span></span>
<span class="line"><span>requirepass yourpassword  # 密码</span></span>
<span class="line"><span>daemonize yes        # 后台运行</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>改完重启：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>安全配置</h2>
<h3>设密码</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> your_strong_password</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>禁危险命令</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> FLUSHDB</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> FLUSHALL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rename-command</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> CONFIG</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>防火墙</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ufw</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> allow</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> your_ip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> to</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> any</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> port</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 6379</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>验证安装</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-server</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">redis-benchmark</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -q</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -n</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 100000</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>总结</h2>
<ul>
<li><strong>图省事</strong> → APT 直接装，一行搞定</li>
<li><strong>要最新</strong> → 编译安装，多等几分钟</li>
</ul>
<p>Ubuntu 比 CentOS 舒服的地方就是 APT 源自带 Redis，不用折腾仓库。生产环境一样要设密码、绑 IP、禁危险命令。</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Keil5 下载、安装、激活和使用记录</title>
    <id>https://jiangbyte.cn/posts/embedded/2026-10-01-Keil5%20%E4%B8%8B%E8%BD%BD%E3%80%81%E5%AE%89%E8%A3%85%E3%80%81%E6%BF%80%E6%B4%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</id>
    <link href="https://jiangbyte.cn/posts/embedded/2026-10-01-Keil5%20%E4%B8%8B%E8%BD%BD%E3%80%81%E5%AE%89%E8%A3%85%E3%80%81%E6%BF%80%E6%B4%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>下载 Keil5</h2>
<p><strong>安装包下载地址</strong>：<br>
<a href="https://pan.quark.cn/s/6a455cd4bce2" target="_blank" rel="noopener noreferrer">https://pan.quark.cn/s/6a455cd4bce2</a></p>
<figure></figure>
<blockquote>
<p>下载内容包括：Keil5 安装包（MDK540.exe）及注册机（keygen.exe）</p>
</blockquote>
<h2>安装 Keil5</h2>
<p><br>
正常安装</p>]]></summary>
    <content type="html"><![CDATA[<h2>下载 Keil5</h2>
<p><strong>安装包下载地址</strong>：<br>
<a href="https://pan.quark.cn/s/6a455cd4bce2" target="_blank" rel="noopener noreferrer">https://pan.quark.cn/s/6a455cd4bce2</a></p>
<figure></figure>
<blockquote>
<p>下载内容包括：Keil5 安装包（MDK540.exe）及注册机（keygen.exe）</p>
</blockquote>
<h2>安装 Keil5</h2>
<p><br>
正常安装</p>
<figure></figure>
<figure></figure>
<h2>参考文献</h2>
<p><a href="https://segmentfault.com/a/1190000047918396" target="_blank" rel="noopener noreferrer">https://segmentfault.com/a/1190000047918396</a></p>
]]></content>
    <category term="Embedded"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Embedded</title>
    <id>https://jiangbyte.cn/posts/embedded/</id>
    <link href="https://jiangbyte.cn/posts/embedded/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>嵌入式开发工具与环境相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>嵌入式开发工具与环境相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Webhook 与飞书机器人集成</title>
    <id>https://jiangbyte.cn/posts/practice/2026-10-01-Webhook%20%E4%B8%8E%E9%A3%9E%E4%B9%A6%E6%9C%BA%E5%99%A8%E4%BA%BA%E9%9B%86%E6%88%90.html</id>
    <link href="https://jiangbyte.cn/posts/practice/2026-10-01-Webhook%20%E4%B8%8E%E9%A3%9E%E4%B9%A6%E6%9C%BA%E5%99%A8%E4%BA%BA%E9%9B%86%E6%88%90.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>审计告警功能需要把检测到的安全事件推送到飞书群。飞书提供了自定义机器人 Webhook 的接口，支持文本和富文本消息格式，也可以配置 HMAC-SHA256 签名验证。</p>
<p>实现上需要解决三个问题：签名怎么算、参数放哪里、消息怎么写。</p>
<h2>签名算法</h2>
<p>飞书官方文档给出的签名示例：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hashlib</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base64</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hmac</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> gen_sign</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(timestamp, secret):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    string_to_sign </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{}\n{}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.format(timestamp, secret)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    hmac_code </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hmac.new(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        string_to_sign.encode(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        digestmod</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">hashlib.sha256</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ).digest()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    sign </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base64.b64encode(hmac_code).decode(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'utf-8'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sign</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>审计告警功能需要把检测到的安全事件推送到飞书群。飞书提供了自定义机器人 Webhook 的接口，支持文本和富文本消息格式，也可以配置 HMAC-SHA256 签名验证。</p>
<p>实现上需要解决三个问题：签名怎么算、参数放哪里、消息怎么写。</p>
<h2>签名算法</h2>
<p>飞书官方文档给出的签名示例：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hashlib</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base64</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hmac</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> gen_sign</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(timestamp, secret):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    string_to_sign </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{}\n{}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.format(timestamp, secret)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    hmac_code </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hmac.new(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        string_to_sign.encode(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        digestmod</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">hashlib.sha256</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ).digest()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    sign </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base64.b64encode(hmac_code).decode(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'utf-8'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sign</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意这里的 <code>hmac.new</code> 调用是 <code>hmac.new(key, msg=None, digestmod=sha256)</code>，key 是 <code>timestamp\nsecret</code>，msg 为空。和通常的 <code>hmac.new(secret, data, digestmod)</code> 写法不一样，如果习惯性地把 secret 放第一个参数、string_to_sign 放第二个，签名就对不上。</p>
<h2>时间戳单位</h2>
<p>飞书用的是秒（<code>int(time.time())</code>）。如果写成了 <code>time.time() * 1000</code>，服务端验签就会失败。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 飞书：用秒</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">timestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(time.time()))</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">timestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(time.time() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>参数位置</h2>
<p>另一个容易踩坑的地方是 <code>timestamp</code> 和 <code>sign</code> 参数放在哪里。最初的习惯是把它们作为 URL 查询参数拼在 Webhook 地址后面：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>https://open.feishu.cn/open-apis/bot/v2/hook/xxx?timestamp=xxx&#x26;sign=xxx</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>飞书实际要求的是放在 JSON body 里：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "timestamp"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"1742821707"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "sign"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"xxxxxx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "msg_type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"消息内容"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>拼在 URL 上也不会报错，但签名校验通不过。</p>
<h2>消息格式</h2>
<p>飞书自定义机器人支持多种消息类型。最常用的是文本格式：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "msg_type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"消息正文"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>富文本（post）格式支持更复杂的排版：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "msg_type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"post"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "post"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "zh_cn"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                "title"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"标题"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                        "tag"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                        "text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"说明文字"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    }, {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                        "tag"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"a"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                        "text"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"链接文字"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                        "href"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://example.com"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    }]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>测试验证</h2>
<p>Webhook 配置页面上加了一个测试按钮，填好 Webhook URL 和可选签名密钥后可以直接发一条测试消息到群聊。后端对应一个测试端点，复用同样的签名和发送逻辑。</p>
<p>不填密钥时直接发送，收不到说明 URL 或网络有问题。填了密钥收不到，说明签名计算和服务端预期的不一致，排查上面三个点。</p>
<figure></figure>
<figure></figure>
]]></content>
    <category term="Practice"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">用 Spring AI 实现 RAG 知识库：对话记忆、向量检索与文档入库</title>
    <id>https://jiangbyte.cn/posts/practice/2026-10-01-%E7%94%A8%20Spring%20AI%20%E5%AE%9E%E7%8E%B0%20RAG%20%E7%9F%A5%E8%AF%86%E5%BA%93%EF%BC%9A%E5%AF%B9%E8%AF%9D%E8%AE%B0%E5%BF%86%E3%80%81%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2%E4%B8%8E%E6%96%87%E6%A1%A3%E5%85%A5%E5%BA%93.html</id>
    <link href="https://jiangbyte.cn/posts/practice/2026-10-01-%E7%94%A8%20Spring%20AI%20%E5%AE%9E%E7%8E%B0%20RAG%20%E7%9F%A5%E8%AF%86%E5%BA%93%EF%BC%9A%E5%AF%B9%E8%AF%9D%E8%AE%B0%E5%BF%86%E3%80%81%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2%E4%B8%8E%E6%96%87%E6%A1%A3%E5%85%A5%E5%BA%93.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>最近用 Spring AI 做了一套 RAG 知识库对话：后台管理多知识库和文件上传，对话侧支持会话记忆、按知识库过滤检索，以及 SSE 流式输出。骨架还是原来的 DDD-lite Spring Boot 分层。</p>
<p>技术选型大致是：</p>
<table>
<thead>
<tr>
<th>能力</th>
<th>选型</th>
</tr>
</thead>
<tbody>
<tr>
<td>框架</td>
<td>Java 21 / Spring Boot 4.1 / Spring AI 2.0</td>
</tr>
<tr>
<td>Chat</td>
<td>阿里云百炼等 <strong>OpenAI 兼容</strong>接口（<code>spring-ai-starter-model-openai</code>）</td>
</tr>
<tr>
<td>Embedding</td>
<td>本地 <strong>Ollama</strong>（如 <code>embeddinggemma</code>，768 维）</td>
</tr>
<tr>
<td>向量库</td>
<td><strong>Milvus</strong></td>
</tr>
<tr>
<td>对话记忆</td>
<td>Spring AI <strong>Redis Chat Memory</strong>（RediSearch）</td>
</tr>
<tr>
<td>原文存储</td>
<td><strong>MinIO</strong>（可与 Milvus 栈共用）</td>
</tr>
<tr>
<td>文档解析</td>
<td><strong>Tika</strong> + <strong>TokenTextSplitter</strong></td>
</tr>
<tr>
<td>元数据</td>
<td><strong>MySQL</strong> + MyBatis-Plus</td>
</tr>
<tr>
<td>前端</td>
<td>Vite + React + Ant Design，SSE 流式对话</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<p>最近用 Spring AI 做了一套 RAG 知识库对话：后台管理多知识库和文件上传，对话侧支持会话记忆、按知识库过滤检索，以及 SSE 流式输出。骨架还是原来的 DDD-lite Spring Boot 分层。</p>
<p>技术选型大致是：</p>
<p>| 能力 | 选型 |<br>
|</p>
]]></content>
    <category term="Practice"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">邮件集成与密码重置</title>
    <id>https://jiangbyte.cn/posts/practice/2026-10-01-%E9%82%AE%E4%BB%B6%E9%9B%86%E6%88%90%E4%B8%8E%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE.html</id>
    <link href="https://jiangbyte.cn/posts/practice/2026-10-01-%E9%82%AE%E4%BB%B6%E9%9B%86%E6%88%90%E4%B8%8E%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>项目中邮件功能用于发送密码重置链接，但此前只搭好了架子，缺少实际测试验证。本文将记录邮件集成的全链路配置、本地测试、以及过程中遇到并解决的几个问题。</p>
<h2>邮件发送引擎</h2>
<p>项目在 <code>app/platform/email/sender.py</code> 中实现了 <code>send_mail</code> 函数，支持普通 SMTP 和 STARTTLS 两种模式：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> send_mail</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(to_email: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, subject: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, body: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    mail </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> settings.mail</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mail.host </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">or</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mail.from_email:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        raise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> BusinessError(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Mail service is not configured"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> EmailMessage()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"From"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mail.from_name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mail.from_email</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">>"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"To"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> to_email</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Subject"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> subject</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message.set_content(body)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.to_thread(_send_sync, message)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>项目中邮件功能用于发送密码重置链接，但此前只搭好了架子，缺少实际测试验证。本文将记录邮件集成的全链路配置、本地测试、以及过程中遇到并解决的几个问题。</p>
<h2>邮件发送引擎</h2>
<p>项目在 <code>app/platform/email/sender.py</code> 中实现了 <code>send_mail</code> 函数，支持普通 SMTP 和 STARTTLS 两种模式：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> send_mail</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(to_email: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, subject: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, body: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    mail </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> settings.mail</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mail.host </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">or</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mail.from_email:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        raise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> BusinessError(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Mail service is not configured"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> EmailMessage()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"From"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mail.from_name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mail.from_email</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">>"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"To"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> to_email</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Subject"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> subject</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    message.set_content(body)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.to_thread(_send_sync, message)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>邮件配置通过 <code>MailSettings</code> 集中管理，包括 SMTP 地址、端口、账号密码、TLS 开关等。配置项可在管理后台运行时修改，启动时从 <code>sys_config</code> 表加载覆盖。</p>
<figure></figure>
<figure></figure>
<h2>用 Mailpit 本地测试邮件</h2>
<p>Mailpit 是一个用 Go 写的轻量级邮件测试工具。它启动一个假的 SMTP 服务器，接收所有发来的邮件存在内存里，通过 Web 界面查看，不会真的发出去。</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mailpit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 1025:1025</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8025:8025</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/axllent/mailpit:v1.30.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Mailpit Web 界面访问 <code>http://localhost:8025</code>。配置邮件时将 SMTP 地址填 <code>localhost:1025</code>，关掉 TLS 即可。</p>
<figure></figure>
<h2>密码重置流程</h2>
<p>用户请求重置时，填写邮箱提交到后端 <code>forgot_password</code> 接口。后端验证账号存在且状态正常，生成一次性令牌存入 Redis（设置 TTL），然后通过 SMTP 发送包含重置链接的邮件。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> forgot_password</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, payload, account_type, client_ip</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, user_agent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    email </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload.email.strip().lower()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    account </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.account_repo.get_account_by_identifier(email, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">EMAIL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    reset_token </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> generate_token()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    redis </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">._required_redis()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> redis.setex(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        password_reset_token_key(reset_token),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        settings.auth.password_reset_token_ttl_seconds,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        json.dumps({</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"account_id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: account.id, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: email, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"token_hash"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: hash_password(reset_token)}),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    reset_link </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">._build_password_reset_link(account_type, email, reset_token)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> send_mail(email, subject, body)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>邮件中的链接只带 token 参数：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>http://localhost:5173/auth/forgot-password?token=4GRjtfMusvS4w6qjMZ3...</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>前端页面检测到 URL 中有 <code>token</code> 参数后切换到重置密码模式。用户输入新密码提交到 <code>reset_password</code> 接口：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reset_password</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, payload, account_type, client_ip</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, user_agent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    raw </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> redis.get(password_reset_token_key(payload.token))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json.loads(raw)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> verify_password(payload.token, data[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"token_hash"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        raise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> AuthenticationError(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Invalid or expired reset link"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> transactional(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.db):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        await</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.account_repo.update_password_hash(account.id, hash_password(payload.password))</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> redis.delete(key)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.session_service.delete_account_sessions(account.account_type, account.id)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>验证 token 哈希、更新密码、删除 Redis 中的记录（一次性使用），同时清除该账号的所有活跃会话，使其他设备上的登录态失效。</p>
<h2>邮箱暴露在重置链接中</h2>
<p>最初的 <code>_build_password_reset_link</code> 方法把邮箱拼在了 URL 参数里：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> _build_password_reset_link</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, account_type, email, token):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    base_url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> settings.mail.password_reset_url</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    separator </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "?"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base_url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "?"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">base_url</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">separator</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">email=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">urlencode({</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'email'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: email})</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x26;token=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">token</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>邮件中的链接长这样：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>http://...?email=admin%40example.com&#x26;token=4GRjtfMusv...</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>邮箱地址暴露在 URL 中，可能被浏览器历史、Referer 头、中间代理等渠道泄漏。</p>
<p>改成 token-only，Redis 的 key 从 <code>password:reset:{account_type}:{email}</code> 改为 <code>password:reset:{token}</code>，凭 token 即可从 Redis 中反查出 email 和 account_id：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> _build_password_reset_link</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, account_type, email, token):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    base_url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> settings.mail.password_reset_url</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    separator </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "?"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base_url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "?"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">base_url</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">separator</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">urlencode({</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'token'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: token})</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>ResetPasswordRequest</code> 去掉 <code>email</code> 字段，后端从 token 存储的数据中反查：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-python"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ResetPasswordRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">CaptchaMixin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">PasswordKeyMixin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    token: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Field(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">min_length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">16</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">max_length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">256</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    password: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Field(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">min_length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">max_length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">512</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>前端页面也不再从 URL 读取 email，改为用户手动输入，确保重置链接即使被拦截也无法直接关联到具体账号。</p>
]]></content>
    <category term="Practice"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Practice</title>
    <id>https://jiangbyte.cn/posts/practice/</id>
    <link href="https://jiangbyte.cn/posts/practice/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>业务集成与工程实践相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>业务集成与工程实践相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Tools</title>
    <id>https://jiangbyte.cn/posts/tools/</id>
    <link href="https://jiangbyte.cn/posts/tools/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>工具链相关笔记：Git、AI Agent、Conda、Hugo、Typora、VMware 等。</p>
]]></summary>
    <content type="html"><![CDATA[<p>工具链相关笔记：Git、AI Agent、Conda、Hugo、Typora、VMware 等。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Ops</title>
    <id>https://jiangbyte.cn/posts/ops/</id>
    <link href="https://jiangbyte.cn/posts/ops/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>运维与本机开发环境相关笔记，含 Debian、Docker、Nginx 网关等。数据库见独立「数据库」导航。</p>
]]></summary>
    <content type="html"><![CDATA[<p>运维与本机开发环境相关笔记，含 Debian、Docker、Nginx 网关等。数据库见独立「数据库」导航。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">第一章 绪论</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-05-%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E7%BB%AA%E8%AE%BA.html</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-05-%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E7%BB%AA%E8%AE%BA.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>系统架构概述</h2>
<p>诺依曼系统计算机</p>
<ul>
<li>计算机硬件</li>
<li>计算机软件</li>
</ul>
<h2>系统架构定义</h2>
<p>定义：IEEE 1471-2000 标准</p>
<blockquote>
<p>架构是体现在<strong>组件</strong>中的一个系统的基本组织、它们彼此的<strong>关系</strong>与<strong>环境</strong>的关系及指导它的设计和发展的<strong>原则</strong>。</p>
</blockquote>
<p>架构设计的作用：</p>
<ol>
<li>解决相对复杂的需求分析问题</li>
<li>解决非功能属性在系统中占据重要位置的设计问题</li>
<li>解决生命周期长、扩展性需求高的系统整体结构问题</li>
<li>解决系统基于组件需要的集成问题</li>
<li>解决业务流程再造难的问题</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>系统架构概述</h2>
<p>诺依曼系统计算机</p>
<ul>
<li>计算机硬件</li>
<li>计算机软件</li>
</ul>
<h2>系统架构定义</h2>
<p>定义：IEEE 1471-2000 标准</p>
<blockquote>
<p>架构是体现在<strong>组件</strong>中的一个系统的基本组织、它们彼此的<strong>关系</strong>与<strong>环境</strong>的关系及指导它的设计和发展的<strong>原则</strong>。</p>
</blockquote>
<p>架构设计的作用：</p>
<ol>
<li>解决相对复杂的需求分析问题</li>
<li>解决非功能属性在系统中占据重要位置的设计问题</li>
<li>解决生命周期长、扩展性需求高的系统整体结构问题</li>
<li>解决系统基于组件需要的集成问题</li>
<li>解决业务流程再造难的问题</li>
</ol>
<h2>软件架构发展历程</h2>
<h2>模块化开发六大原则</h2>
<ol>
<li>最高模块内聚。也就是在一个模块内部的元素最大限度地关联，只实现一种功能的模块是高内聚的，具有三种以上功能的模块则是低内聚的。</li>
<li>最低耦合。也就是不同模块之间的关系尽可能弱，以利于软件的升级和扩展。</li>
<li>模块大小适度。颗粒过大会造成模块内部维护困难，而颗粒过小又会导致模块间的耦合增加。</li>
<li>模块调用链的深度（嵌套层次）不可过多。</li>
<li>接口简单、精炼（扇入扇出数不宜太大），具有信息隐蔽能力。</li>
<li>尽可能地复用已有模块</li>
</ol>
<h2>软件架构常用分类</h2>
<h3>分层架构</h3>
<ul>
<li>四层结构：表现层、业务层、持久层、数据库层</li>
<li>最常见的软件架构，事实标准架构；用户的请求将依次通过这四层的处理，不能跳过其中任何一层</li>
</ul>
<figure><figcaption>image-20261005191551470</figcaption></figure>
<h3>事件驱动架构</h3>
<ul>
<li>四个部分：事件队列（入口）、分发器（分发）、事件通道（联系渠道）、事件处理器（实现业务逻辑）</li>
<li>异步处理、解耦的系统</li>
</ul>
<figure><figcaption>image-20261005191610417</figcaption></figure>
<h3>微核架构（插件架构）</h3>
<ul>
<li>内核相对较小，主要功能和业务逻辑都通过插件实现</li>
</ul>
<figure><figcaption>image-20261005191717834</figcaption></figure>
<h3>微服务架构</h3>
<ul>
<li>服务导向架构（SOA）的升级，每一个服务就是一个独立的部署单元，单元都是分布式<br>
的，互相解耦</li>
<li>三种实现模式：RESTful API 模式、RESTful 应用模式、集中消息模式</li>
</ul>
<figure><figcaption>image-20261005191817277</figcaption></figure>
<h3>云架构</h3>
<ul>
<li>数据都复制到内存中，变成可复制的内存数据单元，处理单元按需启停，没有中央数据库</li>
<li>两部分成：处理单元 + 虚拟中间件（消息中间件 (Messaging Grid)、数据中间件 (Data Grid)、处理中间件 (Processing Grid)、部署中间件 (Deployment Manager)）</li>
</ul>
<figure><figcaption>image-20261005192026758</figcaption></figure>
<h2>常用建模方法与&quot;4+1&quot;视角模型</h2>
<h3>4 种建模方法（怎么描述架构）</h3>
<p>| 建模方法 | 一句话解释                 | 关注什么               |<br>
|</p>
]]></content>
    <category term="Soft Exam"/>
    <published>2026-10-05T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">ACOJ在线评测平台-架构风格论文</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-ACOJ%E5%9C%A8%E7%BA%BF%E8%AF%84%E6%B5%8B%E5%B9%B3%E5%8F%B0-%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC%E8%AE%BA%E6%96%87.html</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-ACOJ%E5%9C%A8%E7%BA%BF%E8%AF%84%E6%B5%8B%E5%B9%B3%E5%8F%B0-%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC%E8%AE%BA%E6%96%87.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>摘要</h2>
<p>2025 年 6 月至 2026 年 6 月，我参与了校园在线评测平台的研发。该项目的目标是建立一个面向教学与竞赛的在线训练系统，该平台旨在完成题目发布、程序提交与自动评测，为学生和教师提供练习、批改与运营管理等服务。我在该项目中担任系统架构师，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨软件架构风格在软件系统架构中的应用及其实现。</p>
<p>在构建该评测平台时，我们采用了分层组合的架构模式，执行层能够解释并运行用户程序，确保多种语言在统一规则下安全评测；而消息层则对评测任务进行异步分发，提供了低耦合的构件协作能力。这两层结构相互补充，使得平台既能满足高峰提交，又能进行在线维护与扩展。通过解释器对评测协议进行适配，结合消息中间件进行任务调度，我们成功打造了一个稳定可用的在线评测系统。通过这一实践，我们进一步验证了软件架构风格在现代软件系统架构中的重要性和实用性。</p>]]></summary>
    <content type="html"><![CDATA[<h2>摘要</h2>
<p>2025 年 6 月至 2026 年 6 月，我参与了校园在线评测平台的研发。该项目的目标是建立一个面向教学与竞赛的在线训练系统，该平台旨在完成题目发布、程序提交与自动评测，为学生和教师提供练习、批改与运营管理等服务。我在该项目中担任系统架构师，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨软件架构风格在软件系统架构中的应用及其实现。</p>
<p>在构建该评测平台时，我们采用了分层组合的架构模式，执行层能够解释并运行用户程序，确保多种语言在统一规则下安全评测；而消息层则对评测任务进行异步分发，提供了低耦合的构件协作能力。这两层结构相互补充，使得平台既能满足高峰提交，又能进行在线维护与扩展。通过解释器对评测协议进行适配，结合消息中间件进行任务调度，我们成功打造了一个稳定可用的在线评测系统。通过这一实践，我们进一步验证了软件架构风格在现代软件系统架构中的重要性和实用性。</p>
<p>在我的带领下，项目实施的非常顺利，于 2026 年 6 月成功上线运行，并获得业主单位的一致好评。</p>
<h2>正文</h2>
<p>随着程序设计教学规模扩大和集中训练日益频繁，原有手工收作业、本机批改的方式已难以支撑并发提交和安全隔离。公司自 2025 年 3 月起开展需求调研，规划建设一套可扩展的在线评测平台。</p>
<p>2025 年 6 月我司受托建设本项目。本项目面向校园内网部署，我在项目中担任系统架构师职务，主要负责系统整体架构设计，该系统主要完成题目管理、程序提交、自动评测和运营维护，主要功能模块包括账号权限、题库管理、提交评测、执行调度、文件存储以及通知公告等。</p>
<p>在架构工作开始阶段，我们便意识到，架构风格是一组设计原则，是能够提供抽象框架模式，可以为我们的项目提供通用解决方案的，这种能够极大提高软件设计的重用的方法加快我们的建设进程，因此在我司总工程师的建议下，我们使用了解释器风格、独立构件隐式调用风格以及 B/S 风格这三种较常用风格。虚拟机风格中的解释器能够把多样的程序执行过程抽象为统一语义，这类风格非常适用于输入形式多、评测规则相对稳定的场景。独立构件风格包括显式调用与隐式调用，我们为了降低提交入口与评测执行之间的耦合采用了隐式调用，通过消息中间件控制系统间信息交互，不仅能削峰填谷，而且还提高了执行节点扩容和故障隔离的能力。B/S 是基于浏览器与服务器的软件架构，它主要使用超文本传输协议进行通信和交互，简化客户端分发的工作，最终减低了机房批量升级的难度，以下正文将重点描述架构风格的实施过程和效果。</p>
<p>底层架构我们使用解释器风格来满足多语言安全评测需求。解释器风格是虚拟机风格中的一种，具备良好的灵活性，在本项目中我们的架构设计需要兼容多种程序设计语言，一般来说这种软件编写难度非常高，代码维护难度压力也很大，因此这个解释器的设计任务便很明确了，软件设计需要高度抽象、协议的适配由配置文件来承担。具体的做法如下，我们对一次评测过程进行了高度抽象，由于一次评测由很多测试用例组成，每个测试用例容量固定并且标识和数据有明确规定，因此我们将题目中的语言限额和测试用例进行关系建模，将整体题目作为一个根节点，以测试用例作为根节点下的叶子节点，使用结构化配置映射成了题目、限额、用例这三层的数据结构，核心的代码采用模板解析与动态装载生成可执行对象，搭建一套可以基于可变模板的解释器，协议模板的产生可以由语言运行时说明和题目配置进行转换得到，解释器支持协议模板热部署，这种可以将用户程序和测试数据映射成统一的评测对象，将语言差异和数据协议的复杂度简化，后期评测规则更改不会对软件产生影响，仅仅更改协议模板文件即可，最终我们使用了若干份协议描述文件便兼容了这些复杂的语言与用例组合，规避了在业务系统中直接执行用户程序带来的技术风险。</p>
<p>中间层我们使用独立构件风格中的隐式调用来简化构件间的交互复杂度，降低系统耦合度。主要的实现手段是，我们采用了一个开源的消息中间件作为连接构件，这个构件是成熟的消息服务器，其性能和稳定性久经考验。由上文提到的解释器所需的对象化任务经过消息总线分发到各个订阅此消息的应用系统，这些应用系统包括提交服务、评测服务、重试服务等，这种多 web 应用的情况非常适合采用消息发布与消息订阅的机制，能够有效解决耦合问题，我们在编码的过程中发现只要采用这种风格的 web 应用，整个迭代过程效率极高，错误率降低，而且我们使用的配置化消息框架，消息队列的管理完全基于配置，清晰简单，维护性良好，例如评测任务主题、延迟重试主题、异常死信主题等消息队列分类清晰，可以随时修改其结构也能够随时增加其他主题的消息队列，不同的 web 系统监听的队列也可以随时变换组合，基于消息中间件的架构设计能够让系统的构件化思路得到良好实施，总体来说这种架构风格带来了非常清晰的数据流转架构，简化了编码难度，减低本项目的二次开发的难度。</p>
<p>应用系统层我们主要采用 B/S 的架构风格，主要用于解决终端分散、难以统一升级的问题。校园应用有一个明显的特点，机房、办公室和竞赛场地分布在不同楼宇，路途很远，且都是内网通讯，部分场所也是走的受控网络，一般是无法远程支持的，这给我们的系统推广以及后期维护带来了很大难题，我们可以想象如果使用 C/S 架构，更新客户端一旦遇到问题很可能需要运维把各机房跑一遍。这让我们在系统推广和维护方面面临较大压力。我们采用的 B/S 架构风格能够解决这个难题，并充分考量了现在相关技术的成熟度，例如现在的浏览器完全能够实现以前客户端的功能，项目中我们使用了大量的动态页面与脚本技术，能够满足在线编辑、结果查询和后台管理等需求。这种风格中页面和逻辑处理存储在 web 服务器上，维护和软件升级只要更新服务器端即可，及时生效，用户体验较好，例如界面上需要优化，改一下页面或者样式文件就可以马上看到效果了。</p>
<p>项目于 2026 年 6 月完成验收，这半年内共经历了三次大批量集中提交，这几次接入过程平稳顺利，其中协议解释器软件性能没有出现过问题，消息中间件的性能经过多次调优吞吐量也接近了磁盘与网络的承载上限，满足当前的消息交互总量，另外由于我们的项目多次在紧急状态下能够快速适应评测规则变动，得到过业主的邮件表扬。除了业主机房几次突发性的网络故障外，项目至今还未有重大的生产事故，项目组现在留 2 个开发人员和 1 个售后在维护，系统的维护量是可控的，系统运行也比较稳定。</p>
<p>不足之处有两个方面，第一在架构设计的过程中我们忽略了部分机房终端的兼容性，个别终端因为需要兼容老的应用软件不允许系统升级，这些终端系统老旧，其浏览器不支持现有页面技术，导致了系统推广障碍。第二在高可用方面还有待改善。针对第一种问题，我们通过沟通协商说服业主新购 PC，采用两台机器同时使用方式解决。针对第二种问题我方采用了多节点互备和服务接管等策略，在一台服务暂停的情况下，另外一台服务接管，以增加可用性。</p>
]]></content>
    <category term="Soft Exam"/>
    <published>2026-10-06T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">第三章 信息系统基础知识</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E7%AC%AC%E4%B8%89%E7%AB%A0%20%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E7%AC%AC%E4%B8%89%E7%AB%A0%20%E4%BF%A1%E6%81%AF%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>待定</p>
]]></summary>
    <content type="html"><![CDATA[<p>待定</p>
]]></content>
    <category term="Soft Exam"/>
    <published>2026-10-06T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">第二章 计算机系统基础知识</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>计算机系统概述</h2>
<p><strong>计算机系统 = 硬件 + 软件</strong></p>
<p>系统分类维度：</p>
<h2>计算机硬件</h2>
<h3>计算机硬件组成</h3>
<p>冯·诺依曼体系结构是现代计算机的基础，由数学家约翰·冯·诺依曼于1945年提出。它的核心思想可以概括为一句话：</p>
<blockquote>
<p><strong>程序和数据都存储在同一个存储器中，计算机按照存储的程序顺序自动执行指令。</strong></p>
</blockquote>
<p><strong>冯·诺依曼体系结构的五大部件</strong></p>
<table>
<thead>
<tr>
<th>部件</th>
<th>英文</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>运算器</td>
<td>ALU</td>
<td>完成算术运算和逻辑运算</td>
</tr>
<tr>
<td>控制器</td>
<td>CU</td>
<td>控制指令执行、协调各部件工作</td>
</tr>
<tr>
<td>存储器</td>
<td>Memory</td>
<td>存放程序和数据</td>
</tr>
<tr>
<td>输入设备</td>
<td>Input</td>
<td>将外部信息送入计算机</td>
</tr>
<tr>
<td>输出设备</td>
<td>Output</td>
<td>将计算结果送出计算机</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>计算机系统概述</h2>
<p><strong>计算机系统 = 硬件 + 软件</strong></p>
<p>系统分类维度：</p>
<h2>计算机硬件</h2>
<h3>计算机硬件组成</h3>
<p>冯·诺依曼体系结构是现代计算机的基础，由数学家约翰·冯·诺依曼于1945年提出。它的核心思想可以概括为一句话：</p>
<blockquote>
<p><strong>程序和数据都存储在同一个存储器中，计算机按照存储的程序顺序自动执行指令。</strong></p>
</blockquote>
<p><strong>冯·诺依曼体系结构的五大部件</strong></p>
<p>| 部件 | 英文 | 功能 |<br>
|</p>
]]></content>
    <category term="Soft Exam"/>
    <published>2026-10-06T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">论文</title>
    <id>https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E8%AE%BA%E6%96%87.html</id>
    <link href="https://jiangbyte.cn/soft-exam/advanced-architect/2026-10-06-%E8%AE%BA%E6%96%87.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>用法：先定题目方向（架构风格、高可用、安全、性能、质量属性等），再填入同一项目。摘要三段、正文“背景—职责—总述三点—分点展开—验收—不足”，三点之间换方向只换论点，不换结构。【】内为必填，不要写具体表名、接口路径、框架版本。</p>
<h2>摘要</h2>
<blockquote>
<p>【项目起止时间】，我参与了【项目名称】的研发。该项目的目标是建立一个【系统定位】，该平台旨在【核心功能】，为【业务对象】提供【业务目标】等服务。我在该项目中担任【角色】，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨【论文主题，如软件架构风格 / 高可用性设计 / 信息安全体系】在软件系统架构中的应用及其实现。</p>
<p>在构建【系统名称】时，我们采用了【总体方案，如分层组合 / 主备加集群 / 纵深防御】，【要点A】能够【作用A】，确保【价值A】；而【要点B】则对【对象B】进行【作用B】，提供了【价值B】。这两层结构相互补充，使得平台既能满足【需求A】，又能进行【需求B】。通过【手段A】进行【处理A】，结合【手段B】进行【处理B】，我们成功打造了一个【系统特性】的【系统类型】。通过这一实践，我们进一步验证了【论文主题】在现代软件系统架构中的重要性和实用性。</p>
<p>在我的带领下，项目实施的非常顺利，于【上线时间】成功上线运行，并获得【评价主体】的一致好评。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[<p>用法：先定题目方向（架构风格、高可用、安全、性能、质量属性等），再填入同一项目。摘要三段、正文“背景—职责—总述三点—分点展开—验收—不足”，三点之间换方向只换论点，不换结构。【】内为必填，不要写具体表名、接口路径、框架版本。</p>
<h2>摘要</h2>
<blockquote>
<p>【项目起止时间】，我参与了【项目名称】的研发。该项目的目标是建立一个【系统定位】，该平台旨在【核心功能】，为【业务对象】提供【业务目标】等服务。我在该项目中担任【角色】，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨【论文主题，如软件架构风格 / 高可用性设计 / 信息安全体系】在软件系统架构中的应用及其实现。</p>
<p>在构建【系统名称】时，我们采用了【总体方案，如分层组合 / 主备加集群 / 纵深防御】，【要点A】能够【作用A】，确保【价值A】；而【要点B】则对【对象B】进行【作用B】，提供了【价值B】。这两层结构相互补充，使得平台既能满足【需求A】，又能进行【需求B】。通过【手段A】进行【处理A】，结合【手段B】进行【处理B】，我们成功打造了一个【系统特性】的【系统类型】。通过这一实践，我们进一步验证了【论文主题】在现代软件系统架构中的重要性和实用性。</p>
<p>在我的带领下，项目实施的非常顺利，于【上线时间】成功上线运行，并获得【评价主体】的一致好评。</p>
</blockquote>
<h2>正文</h2>
<blockquote>
<p>随着【行业趋势或业务矛盾】，原有【旧做法】已难以支撑【新约束，如并发、安全、扩展】。公司自【年】年【月】月起【调研 / 立项准备】，规划【建设目标】。</p>
<p>【年】年【月】月我司受托建设本项目。本项目【部署与范围一句话】，我在项目中担任系统架构师职务，主要负责系统整体架构设计，该系统主要完成【业务能力】，主要功能模块包括【模块一】、【模块二】、【模块三】、【模块四】以及【模块五】等。</p>
<p>在架构工作开始阶段，我们便意识到，【论文主题对应的方法，如架构风格 / 质量属性策略】是一组设计原则，是能够提供抽象框架模式，可以为我们的项目提供通用解决方案的，这种能够极大提高软件设计的重用的方法加快我们的建设进程，因此在我司总工程师的建议下，我们使用了【论点一】、【论点二】以及【论点三】这三种较常用【风格 / 策略 / 措施】。【类别一】中的【论点一】能够【能力一】，这类方法非常适用于【适用场景】。【类别二】包括【子类A】与【子类B】，我们为了【设计目标】采用了【论点二】，通过【关键机制】控制系统间信息交互，不仅能【收益一】，而且还提高【收益二】。【论点三】是基于【基本形态】的软件架构，它主要使用【通信方式】进行通信和交互，简化【被简化的工作】，最终减低了【被降低的难度】，以下正文将重点描述【论文主题】的实施过程和效果。</p>
<p>底层（或第一方面）我们使用【论点一】来满足【需求一】。【论点一】是【所属类别】中的一种，具备【主要优点】，在本项目中我们的架构设计需要兼容【多变部分】，一般来说这种软件编写难度非常高，代码维护难度压力也很大，因此这个设计任务便很明确了，软件设计需要高度抽象、【变化点】的适配由配置来承担。具体的做法如下，我们对【核心对象】进行了高度抽象，由于【核心对象】由很多【组成单元】组成，每个【组成单元】容量固定并且标识和数据有明确规定，因此我们将【主体】中的【属性甲】和【属性乙】进行关系建模，将整体【主体】作为一个根节点，以【组成单元】作为根节点下的叶子节点，使用结构化配置映射成了【层次名称】这【层数】层的数据结构，核心的处理采用【解析 / 装载 / 调度】生成统一对象，搭建一套可以基于可变模板（或策略）的实现，模板或策略可由【来源】转换得到，并支持热更新。这种可以将【复杂输入】映射成统一对象的做法，将【差异点】的复杂度简化，后期规则更改不会对软件产生影响，仅仅更改配置即可，最终我们使用了若干份描述文件便兼容了这些复杂的【差异组合】，规避了【直接硬编码或危险做法】带来的技术风险。</p>
<p>中间层（或第二方面）我们使用【论点二】来简化【协作对象】间的交互复杂度，降低系统耦合度（或提升【目标质量属性】）。主要的实现手段是，我们采用了【中间件或机制】作为连接构件，这个构件【一句话定位】，其性能和稳定性久经考验。由上文处理得到的对象化数据经过【通道】分发到各个【订阅方 / 协作方】，这些应用系统包括【系统甲】、【系统乙】、【系统丙】等，这种多应用协作的情况非常适合采用【发布订阅 / 异步解耦 / 其他机制】，能够有效解决耦合问题，我们在编码的过程中发现只要采用这种方法，整个迭代过程效率极高，错误率降低，而且我们使用的配置化方式，管理完全基于配置，清晰简单，维护性良好，例如【通道甲】、【通道乙】、【通道丙】等分类清晰，可以随时修改其结构也能够随时增加其他通道，不同系统监听的范围也可以随时变换组合。总体来说这种方法带来了非常清晰的数据流转架构，简化了编码难度，减低本项目的二次开发的难度。</p>
<p>应用系统层（或第三方面）我们主要采用【论点三】，主要用于解决【推广或使用上的难题】。【业务场景】有一个明显的特点，【使用方】分布在【地理或组织范围】，路途很远，且都是【网络条件】，【部分场所】也是走的【受控网络】，一般是无法远程支持的，这给我们的系统推广以及后期维护带来了很大难题，我们可以想象如果使用【被否定的方案】，更新一旦遇到问题很可能需要【运维代价】。这让我们在系统推广和维护方面面临较大压力。我们采用的【论点三】能够解决这个难题，并充分考量了现在相关技术的成熟度，例如现在的【成熟技术】完全能够实现以前【旧方案】的功能，项目中我们使用了大量的【技术甲】与【技术乙】，能够满足【交互需求】等需求。这种做法中【变更集中位置】在服务器侧，维护和软件升级只要更新服务器端即可，及时生效，用户体验较好，例如界面或规则上需要优化，改一下【页面 / 配置 / 策略】就可以马上看到效果了。</p>
<p>项目于【年】年【月】月完成验收，这【时长】内共经历了【若干次业务高峰或变更】，这几次过程平稳顺利，其中【论点一对应部件】性能没有出现过问题，【论点二对应部件】经过多次调优也满足当前的交互总量，另外由于我们的项目多次在紧急状态下能够快速适应【规则或接口变动】，得到过业主的邮件表扬。除了业主侧几次突发性的网络故障外，项目至今还未有重大的生产事故，项目组现在留【n】个开发人员和【m】个售后在维护，系统的维护量是可控的，系统运行也比较稳定。</p>
<p>不足之处有两个方面，第一在架构设计的过程中我们忽略了【兼容性或范围遗漏】，个别【终端 / 子系统】因为需要兼容老的应用软件不允许系统升级，这些【对象】系统老旧，其【运行环境】不支持【新能力】，导致了系统推广障碍。第二在【高可用 / 性能 / 安全等另一质量属性】方面还有待改善。针对第一种问题，我们通过沟通协商说服业主【更换或隔离旧环境】，采用【过渡方案，如两套环境并存】方式解决。针对第二种问题我方采用了【措施甲】和【措施乙】等策略，在一台服务暂停的情况下，另外一台服务接管，以增加可用性。</p>
</blockquote>
]]></content>
    <category term="Soft Exam"/>
    <published>2026-10-06T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Claude、Codex 全自动模式</title>
    <id>https://jiangbyte.cn/posts/tools/agent/2026-10-01-Claude%E3%80%81Codex%20%E5%85%A8%E8%87%AA%E5%8A%A8%E6%A8%A1%E5%BC%8F.html</id>
    <link href="https://jiangbyte.cn/posts/tools/agent/2026-10-01-Claude%E3%80%81Codex%20%E5%85%A8%E8%87%AA%E5%8A%A8%E6%A8%A1%E5%BC%8F.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>&quot;YOLO 模式&quot;（或叫&quot;全自动模式&quot;）是为了让 AI 编程助手在不经你逐次确认的情况下，全自动执行指令。Codex 和 Claude Code 都有各自的开启方式，但核心逻辑和风险是一样的。</p>
<p>YOLO 模式主要通过两种方式开启：<strong>命令行参数</strong>和<strong>配置文件</strong>。</p>
<p>开启 YOLO 模式意味着将 AI 的操作权限完全放开，这虽然能极大提升效率，但也存在不小的风险。</p>
<h3>速览</h3>
<table>
<thead>
<tr>
<th style="text-align:left">工具</th>
<th style="text-align:left">对应的 YOLO 标志</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Codex CLI</strong> (OpenAI)</td>
<td style="text-align:left"><code>--yolo</code> 或 <code>--dangerously-bypass-approvals-and-sandbox</code></td>
<td style="text-align:left">后者是其完整标志，<code>--yolo</code> 是别名。</td>
</tr>
<tr>
<td style="text-align:left"><strong>Claude Code</strong> (Anthropic)</td>
<td style="text-align:left"><code>--dangerously-skip-permissions</code></td>
<td style="text-align:left">Claude Code 使用的官方标志。</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<p>&quot;YOLO 模式&quot;（或叫&quot;全自动模式&quot;）是为了让 AI 编程助手在不经你逐次确认的情况下，全自动执行指令。Codex 和 Claude Code 都有各自的开启方式，但核心逻辑和风险是一样的。</p>
<p>YOLO 模式主要通过两种方式开启：<strong>命令行参数</strong>和<strong>配置文件</strong>。</p>
<p>开启 YOLO 模式意味着将 AI 的操作权限完全放开，这虽然能极大提升效率，但也存在不小的风险。</p>
<h3>速览</h3>
<p>| 工具                          | 对应的 YOLO 标志                                             | 说明                     |<br>
| :</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Cursor WSL 连接失败？手动安装 cursor-server 的完整方案</title>
    <id>https://jiangbyte.cn/posts/tools/agent/2026-10-01-Cursor%20WSL%20%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%EF%BC%9F%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85%20cursor-server%20%E7%9A%84%E5%AE%8C%E6%95%B4%E6%96%B9%E6%A1%88.html</id>
    <link href="https://jiangbyte.cn/posts/tools/agent/2026-10-01-Cursor%20WSL%20%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%EF%BC%9F%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85%20cursor-server%20%E7%9A%84%E5%AE%8C%E6%95%B4%E6%96%B9%E6%A1%88.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说问题</h2>
<p>在 Windows 上用 Cursor 打开 WSL 项目时，左下角一直转圈，等待比较久......好像也没有安装好，检查 <code>~/.cursor-server/bin/</code> 目录，发现 <code>commit id</code> 的目录是空的，说明自动下载失败了。这在国内网络环境下应该常见，因为服务器文件有 125MB，可能下载中途断掉了。</p>
<h2>为什么会有这个问题</h2>
<p>Cursor 连接 WSL（或远程 SSH）时，需要在 WSL 内安装一个服务端组件 <code>cursor-server</code>，它本质上是 VSCode Remote 的定制版。自动下载流程大致是：</p>]]></summary>
    <content type="html"><![CDATA[<h2>先说问题</h2>
<p>在 Windows 上用 Cursor 打开 WSL 项目时，左下角一直转圈，等待比较久......好像也没有安装好，检查 <code>~/.cursor-server/bin/</code> 目录，发现 <code>commit id</code> 的目录是空的，说明自动下载失败了。这在国内网络环境下应该常见，因为服务器文件有 125MB，可能下载中途断掉了。</p>
<h2>为什么会有这个问题</h2>
<p>Cursor 连接 WSL（或远程 SSH）时，需要在 WSL 内安装一个服务端组件 <code>cursor-server</code>，它本质上是 VSCode Remote 的定制版。自动下载流程大致是：</p>
<ol>
<li>Cursor Windows 端发起 WSL 连接</li>
<li>WSL 端根据 commit ID 下载对应的 <code>vscode-reh-linux-x64.tar.gz</code></li>
<li>解压到 <code>~/.cursor-server/bin/&lt;commit-id&gt;/</code></li>
<li>启动 server，建立通信</li>
</ol>
<p>第二步在国内网络环境下经常超时或中断，下载失败后 <code>bin/&lt;commit-id&gt;/</code> 目录是空的，但 <code>.installation_lock</code> 文件被写入了，导致 Cursor 以为&quot;正在安装中&quot;，不会重试。</p>
<h2>手动安装步骤</h2>
<h3>找到当前 Cursor 版本的 commit ID</h3>
<p>Commit ID 在 Cursor 的版本里，命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cursor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>输出：</p>
<figure></figure>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>"55434bd8062ece6fee083b82beed2aee42d253f0"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>记下这串 commit ID，后面都要用到。</p>
<h3>确认下载 URL</h3>
<p>在安装目录中，<code>/mnt/c/Users/jiang/AppData/Local/Programs/cursor/resources/app/product.json</code> （实际情况依据你安装的目录） <code>product.json</code> 里定义了下载地址模板：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"serverDownloadUrlTemplate"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://cursor.blob.core.windows.net/remote-releases/${commit}/vscode-reh-${os}-${arch}.tar.gz"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>对 Linux x64 来说，最终的 URL 就是：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>https://cursor.blob.core.windows.net/remote-releases/&#x3C;commit-id>/vscode-reh-linux-x64.tar.gz</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>先用 curl 确认能访问（WSL下）：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -sI</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://cursor.blob.core.windows.net/remote-releases/55434bd8062ece6fee083b82beed2aee42d253f0/vscode-reh-linux-x64.tar.gz"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> head</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -5</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>返回 <code>HTTP/1.1 200 OK</code> 就没问题。</p>
<figure></figure>
<h3>下载并解压</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 下载（如果网络慢，可以用代理或者挂在后台慢慢下）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -L</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  "https://cursor.blob.core.windows.net/remote-releases/55434bd8062ece6fee083b82beed2aee42d253f0/vscode-reh-linux-x64.tar.gz"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 解压到对应 commit 目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/55434bd8062ece6fee083b82beed2aee42d253f0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -xzf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -C</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/55434bd8062ece6fee083b82beed2aee42d253f0/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 如果解压后多了一层目录，把内容移上来</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/55434bd8062ece6fee083b82beed2aee42d253f0/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ls</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # 确认是不是直接包含了 bin、node_modules 等目录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 如果只有一个子目录，把内容移上来</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vscode-reh-linux-x64/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">*</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vscode-reh-linux-x64/.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">*</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> 2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/dev/null</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rmdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vscode-reh-linux-x64</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 清理临时文件</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>清理安装锁文件</h3>
<p>这是关键一步。Cursor 在下载开始时写入了 <code>.installation_lock</code>，如果不删掉，它不会检测到 server 已经装好：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/.installation_lock</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">*</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>验证安装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">~</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">/.cursor-server/bin/55434bd8062ece6fee083b82beed2aee42d253f0/bin/cursor-server --version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>输出：</p>
<figure></figure>
<p>版本号和 commit ID 对上，说明安装成功了。</p>
<h3>重新连接</h3>
<p>回到 Cursor Windows 端，点击左下角 <strong>&gt;&lt;</strong> 图标，重新连接 WSL。这次应该秒连，不再卡在安装步骤。</p>
<figure></figure>
<h2>如果 Cursor 更新了版本</h2>
<p>每次 Cursor 更新版本，commit ID 会变，需要重新安装对应的 server。流程一样：</p>
<ol>
<li>查新的 commit ID</li>
<li>下载对应的 <code>vscode-reh-linux-x64.tar.gz</code></li>
<li>解压到新的 <code>bin/&lt;new-commit-id&gt;/</code></li>
<li>清理 lock 文件</li>
</ol>
<p>我习惯把下载包留一份，或者写个脚本一键搞定：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#!/bin/bash</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">COMMIT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">grep</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '"commit"[^,]*'</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "/mnt/e/Users/jiang/AppData/Local/Programs/cursor/resources/app/product.json"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> cut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'"'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -f4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Commit: </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -L</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  "https://cursor.blob.core.windows.net/remote-releases/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/vscode-reh-linux-x64.tar.gz"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -xzf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -C</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 处理嵌套目录</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/vscode-reh-linux-x64"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">then</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  mv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/vscode-reh-linux-x64/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">*</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  rmdir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/bin/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COMMIT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/vscode-reh-linux-x64</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fi</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.cursor-server/.installation_lock</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">*</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/cursor-server.tar.gz</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Done"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>THE END</h2>
<p>| 步骤          | 命令                                                                                                                  |<br>
|</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Agent</title>
    <id>https://jiangbyte.cn/posts/tools/agent/</id>
    <link href="https://jiangbyte.cn/posts/tools/agent/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>AI 编程助手与 Agent 工具链相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>AI 编程助手与 Agent 工具链相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">用 conda 固定默认环境 normal</title>
    <id>https://jiangbyte.cn/posts/tools/conda/2026-10-01-%E7%94%A8%20conda%20%E5%9B%BA%E5%AE%9A%E9%BB%98%E8%AE%A4%E7%8E%AF%E5%A2%83%20normal.html</id>
    <link href="https://jiangbyte.cn/posts/tools/conda/2026-10-01-%E7%94%A8%20conda%20%E5%9B%BA%E5%AE%9A%E9%BB%98%E8%AE%A4%E7%8E%AF%E5%A2%83%20normal.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说目标</h2>
<p>机器上同时有三套 Python 很容易搅在一起：</p>
<ol>
<li>系统自带的 <code>/usr/bin/python3</code></li>
<li>conda 的 <code>base</code></li>
<li>自己建的业务 / 学习环境</li>
</ol>
<p>想要的结果很简单：<strong>不管终端还是 Cursor，一律只用名为 <code>normal</code> 的 conda 环境</strong>，不要再落到 <code>base</code> 或系统 Python 上。</p>
<p>下面以 miniforge（路径 <code>/home/charlie/miniforge3</code>）为例，过程对 Anaconda / Miniconda 同样适用，改一下前缀即可。</p>]]></summary>
    <content type="html"><![CDATA[<h2>先说目标</h2>
<p>机器上同时有三套 Python 很容易搅在一起：</p>
<ol>
<li>系统自带的 <code>/usr/bin/python3</code></li>
<li>conda 的 <code>base</code></li>
<li>自己建的业务 / 学习环境</li>
</ol>
<p>想要的结果很简单：<strong>不管终端还是 Cursor，一律只用名为 <code>normal</code> 的 conda 环境</strong>，不要再落到 <code>base</code> 或系统 Python 上。</p>
<p>下面以 miniforge（路径 <code>/home/charlie/miniforge3</code>）为例，过程对 Anaconda / Miniconda 同样适用，改一下前缀即可。</p>
<h2>创建 <code>normal</code> 环境</h2>
<p>选用相对稳妥的 3.12：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> normal</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> python=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3.12</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>创建完成后确认：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> env</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> list</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># base                     /home/charlie/miniforge3</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># normal                   /home/charlie/miniforge3/envs/normal</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>解释器路径固定为：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>/home/charlie/miniforge3/envs/normal/bin/python</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>网络不稳时下载可能被 <code>Connection reset by peer</code> 打断，直接重跑同一条 <code>conda create</code> 即可，已下完的包会复用缓存。</p>
<h2>关掉 base 自动激活</h2>
<p>默认安装后，新开 shell 会进 <code>base</code>。先关掉：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --set</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> auto_activate_base</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> false</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>新版 conda 会把这个键写成 <code>auto_activate</code>。<code>~/.condarc</code> 里最终可以是：</p>
<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-yaml"><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">auto_activate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这样登录时不会再默认进 <code>base</code>。</p>
<h2>让 bash 登录后自动进 <code>normal</code></h2>
<p>在 <code>~/.bashrc</code> 的 conda initialize 块末尾加上激活语句：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># >>> conda initialize >>></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">__conda_setup</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">'/home/charlie/miniforge3/bin/conda'</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'shell.bash' 'hook' </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /dev/null)"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$?</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">then</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    eval</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$__conda_setup</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "/home/charlie/miniforge3/etc/profile.d/conda.sh"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">then</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        .</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "/home/charlie/miniforge3/etc/profile.d/conda.sh"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/home/charlie/miniforge3/bin:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    fi</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fi</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">unset</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> __conda_setup</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Always use the `normal` env (never conda base / system Python)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> activate</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> normal</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> 2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/dev/null</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># &#x3C;&#x3C;&#x3C; conda initialize &#x3C;&#x3C;&#x3C;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>要点：</p>
<ul>
<li>必须写在 <code>conda</code> hook 初始化<strong>之后</strong>，否则 <code>conda activate</code> 可能不可用</li>
<li><code>2&gt;/dev/null</code> 避免环境尚未创建时刷一堆报错</li>
<li>新开终端后提示符应显示 <code>(normal)</code></li>
</ul>
<p>已打开的旧终端不会自动生效，手动执行一次：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> activate</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> normal</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>让 Cursor 也指向 <code>normal</code></h2>
<p>只改 shell 不够，编辑器里跑 Python / 选解释器时仍可能跳到别的环境。在 Cursor 用户设置里加上：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "python.defaultInterpreterPath"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/home/charlie/miniforge3/envs/normal/bin/python"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "python.terminal.activateEnvironment"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "terminal.integrated.env.linux"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "CONDA_DEFAULT_ENV"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"normal"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>路径按本机 conda 前缀调整。改完后重开集成终端，或在命令面板里重新选一次解释器确认。</p>
<h2>验收</h2>
<p>干净登录测一下（或新开一个终端）：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$CONDA_DEFAULT_ENV</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 期望：normal</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">which</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> python</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">                # .../envs/normal/bin/python</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">python</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">            # Python 3.12.x</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">conda</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> env</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> list</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">              # normal 前有 *</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>再确认没有误用系统解释器：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">command</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> python</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">command</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> python3</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 两者都应落在 .../envs/normal/bin/ 下</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>系统里的 <code>/usr/bin/python3</code> 可以还在，但只要 PATH 里 <code>normal</code> 在前，日常敲 <code>python</code> / <code>python3</code> 就不会撞上它。</p>
<h2>The End</h2>
<p>| 项       | 做法                                                 |<br>
|</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Conda</title>
    <id>https://jiangbyte.cn/posts/tools/conda/</id>
    <link href="https://jiangbyte.cn/posts/tools/conda/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Conda 环境管理相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Conda 环境管理相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Git</title>
    <id>https://jiangbyte.cn/posts/tools/git/</id>
    <link href="https://jiangbyte.cn/posts/tools/git/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Git 工作流与远程协作相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Git 工作流与远程协作相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Hugo相对路径图片显示问题的分析与解决</title>
    <id>https://jiangbyte.cn/posts/tools/hugo/2026-10-01-Hugo%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%9B%BE%E7%89%87%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%8E%E8%A7%A3%E5%86%B3.html</id>
    <link href="https://jiangbyte.cn/posts/tools/hugo/2026-10-01-Hugo%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%9B%BE%E7%89%87%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%8E%E8%A7%A3%E5%86%B3.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说问题</h2>
<p>写博客的时候用 Obsidian 插了张图：</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-markdown"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">![</span><span style="--shiki-light:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline">img</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">](</span><span style="--shiki-light:#24292E;--shiki-light-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline">assets/example.jpg</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>先说问题</h2>
<p>写博客的时候用 Obsidian 插了张图：</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-markdown"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">![</span><span style="--shiki-light:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline">img</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">](</span><span style="--shiki-light:#24292E;--shiki-light-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline">assets/example.jpg</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>编辑器里看着好好的，一跑 <code>hugo</code> 部署上去，图裂了。打开浏览器开发者工具一看，图片请求的路径根本就不对。</p>
<p>检查了一圈，发现这个问题只出现在 <strong>非 bundle 的 md 文件</strong> 上，用目录包起来的 <code>index.md</code> 反倒没事。</p>
<h2>为什么会有这个问题</h2>
<h3>Hugo 的两种页面</h3>
<p>Hugo 里写文章有两种姿势：</p>
<ol>
<li><strong>Page Bundle</strong> — 建个文件夹，里面放 <code>index.md</code>，图片丢同目录下</li>
</ol>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>content/posts/my-post/</span></span>
<span class="line"><span>├── index.md</span></span>
<span class="line"><span>└── some-image.jpg</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li><strong>Leaf Page</strong> — 直接一个 <code>.md</code> 文件</li>
</ol>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>content/posts/my-post.md</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>我这边的目录结构是这样的：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>content/posts/</span></span>
<span class="line"><span>├── _index.md</span></span>
<span class="line"><span>├── assets/</span></span>
<span class="line"><span>│   └── example.jpg</span></span>
<span class="line"><span>├── my-post.md              ← 出问题的</span></span>
<span class="line"><span>└── my-bundle-post/</span></span>
<span class="line"><span>    └── index.md            ← 没问题的</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Blowfish 主题自带的图片渲染逻辑，会先用 <code>$.Page.Resources.GetMatch</code> 去捞图片。Bundle 页面自然能捞到，但 leaf page 压根没有 page resources，捞了个空。最后 fallback 到直接把原始相对路径当 src 输出——这就是问题的起点。</p>
<h3>Permalink 让路径更深了一層</h3>
<p>我的 permalink 配的是：</p>
<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-yaml"><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">permalinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  posts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/posts/:year/:month/:day/:slug/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>假设文件是 <code>content/posts/my-post.md</code>，生成的页面 URL 是 <code>/posts/2026/06/05/my-post/</code>。</p>
<p>Leaf page 里的 <code>![img](assets/example.jpg)</code>，浏览器会以页面 URL 为基准去解析：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>页面地址: /posts/2026/06/05/my-post/</span></span>
<span class="line"><span>浏览器请求: /posts/2026/06/05/my-post/assets/example.jpg   ← 404</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>但图片实际在哪？在 <code>content/posts/assets/example.jpg</code>。Hugo 构建的时候会把 content 目录下的非内容文件也发布出去，所以这张图实际是：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>public/posts/assets/example.jpg</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>问题就是：<strong>leaf page 在 URL 里多了好几层目录，但图片的相对路径没跟着变</strong>。</p>
<h2>怎么修的</h2>
<h3>方案一：改成 Page Bundle（最推荐）</h3>
<p>最省事的做法就是把 leaf page 改成 bundle：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span># 改之前</span></span>
<span class="line"><span>content/posts/my-post.md</span></span>
<span class="line"><span>content/posts/assets/example.jpg</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 改之后</span></span>
<span class="line"><span>content/posts/my-post/index.md</span></span>
<span class="line"><span>content/posts/my-post/assets/example.jpg</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这样 <code>$.Page.Resources.GetMatch</code> 能找到图片，而且 Blowfish 的 responsive 图片优化也会生效。缺点是每个文章都要建目录，已有的存量文章多了有点折腾。</p>
<h3>方案二：写个 render hook 兜底（我用的方案）</h3>
<p>参考了 <a href="https://www.joker.cc/posts/hugo-image.html/" target="_blank" rel="noopener noreferrer">Joker 的文章</a>，但里面用的 <code>../</code> 补丁只适合单层目录，我的 permalink 太深了不管用。改成了拼绝对路径。</p>
<p>在 <code>layouts/_default/_markup/render-image.html</code> 里覆写了 Blowfish 的图片渲染逻辑：</p>
<div class="language-go line-numbers-mode" data-highlighter="shiki" data-ext="go" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-go"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{{- if not $isRemote -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  {{- $isPageBundle := eq $.Page.File.LogicalName "index.md" -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  {{- if $isPageBundle -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- /* bundle: 原样走主题的逻辑 */ -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- $resource = or ($.Page.Resources.GetMatch $urlStr) (resources.Get $urlStr) -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  {{- else if not (strings.HasPrefix $urlStr "/") -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- /* leaf page + 相对路径: 用 .File.Dir 拼出正确路径 */ -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- $correctPath := path.Join $.Page.File.Dir $urlStr -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- $resource = or ($.Page.Resources.GetMatch $correctPath) (resources.Get $correctPath) -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- if not $resource -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {{- $urlStr = printf "/%s" $correctPath -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- end -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  {{- else -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {{- $resource = or ($.Page.Resources.GetMatch $urlStr) (resources.Get $urlStr) -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  {{- end -}}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{{- end -}}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>核心逻辑就几件事：</p>
<ol>
<li>先判断是不是 bundle（看 <code>LogicalName</code> 是不是 <code>&quot;index.md&quot;</code>）</li>
<li>不是 bundle，而且图片路径是相对路径——就用 <code>.Page.File.Dir</code> 拼出内容目录下的绝对路径</li>
<li>试着找一下图片资源，找不到就直接用绝对路径当 src</li>
</ol>
<p><code>path.Join &quot;posts/&quot; &quot;assets/example.jpg&quot;</code> → <code>posts/assets/example.jpg</code> → <code>/posts/assets/example.jpg</code></p>
<p>这样不管 permalink 多深，路径都不会偏。</p>
<h3>验证</h3>
<p>修之前：</p>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">img</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> src</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/posts/2026/06/05/my-post/assets/example.jpg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;!-- 404 --></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>修之后：</p>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">img</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> src</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/posts/assets/example.jpg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;!-- 200 --></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>实际效果：</p>
<figure><figcaption>花火</figcaption></figure>
<p>这张图就是 leaf page 引的，能正常显示说明修好了。</p>
<h2>几个需要注意的</h2>
<ul>
<li><strong>参考文章的方案不适用于深层 permalink</strong>：他直接在相对路径前面加 <code>../</code>，只退一层。本项目的 <code>/:year/:month/:day/:slug/</code> 叠了四层，必须用绝对路径</li>
<li><strong>Leaf page 没有图片优化</strong>：Page bundle 的图片会被 Blowfish 做 responsive resize（生成多尺寸 + srcset），leaf page 的图不会。如果对图片体积有要求，还是推荐 bundle</li>
<li><strong>我这修复只动了 render hook</strong>：不影响 bundle 页面，不影响远程图片，不影响已经用了绝对路径的图片</li>
</ul>
<h2>总结</h2>
<p>| 维度 | Page Bundle | Leaf Page + render hook |<br>
|</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Hugo</title>
    <id>https://jiangbyte.cn/posts/tools/hugo/</id>
    <link href="https://jiangbyte.cn/posts/tools/hugo/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Hugo 静态站点构建与踩坑相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Hugo 静态站点构建与踩坑相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Typora 自定义 github-cus 主题：掘金行内代码与标题自动编号</title>
    <id>https://jiangbyte.cn/posts/tools/typora/2026-10-04-Typora%20%E8%87%AA%E5%AE%9A%E4%B9%89%20github-cus%20%E4%B8%BB%E9%A2%98%EF%BC%9A%E6%8E%98%E9%87%91%E8%A1%8C%E5%86%85%E4%BB%A3%E7%A0%81%E4%B8%8E%E6%A0%87%E9%A2%98%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7.html</id>
    <link href="https://jiangbyte.cn/posts/tools/typora/2026-10-04-Typora%20%E8%87%AA%E5%AE%9A%E4%B9%89%20github-cus%20%E4%B8%BB%E9%A2%98%EF%BC%9A%E6%8E%98%E9%87%91%E8%A1%8C%E5%86%85%E4%BB%A3%E7%A0%81%E4%B8%8E%E6%A0%87%E9%A2%98%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Typora 自带主题升级会覆盖，直接改 <code>github.css</code> 不稳妥。做法是复制一份自定义主题 <code>github-cus</code>，在上面改行内代码颜色，以及正文 / 大纲的标题自动编号。</p>
<p>本文环境：Linux，主题目录 <code>~/.config/Typora/themes/</code>（Windows 一般在 <code>%APPDATA%\Typora\themes\</code>，macOS 在 <code>~/Library/Application Support/abnerworks.Typora/themes/</code>）。</p>]]></summary>
    <content type="html"><![CDATA[<p>Typora 自带主题升级会覆盖，直接改 <code>github.css</code> 不稳妥。做法是复制一份自定义主题 <code>github-cus</code>，在上面改行内代码颜色，以及正文 / 大纲的标题自动编号。</p>
<p>本文环境：Linux，主题目录 <code>~/.config/Typora/themes/</code>（Windows 一般在 <code>%APPDATA%\Typora\themes\</code>，macOS 在 <code>~/Library/Application Support/abnerworks.Typora/themes/</code>）。</p>
<h2>为什么要复制一份主题</h2>
<p>主题目录里的 <code>Readme.md</code> 写得很清楚：内置 CSS 更新或重装后会被替换，<strong>不要直接改内置主题</strong>。</p>
<p>正确姿势见官方文档：</p>
<ul>
<li><a href="https://support.typora.io/About-Themes/" target="_blank" rel="noopener noreferrer">About Themes</a></li>
<li><a href="https://support.typora.io/Add-Custom-CSS/" target="_blank" rel="noopener noreferrer">Add Custom CSS</a></li>
<li><a href="https://support.typora.io/Auto-Numbering/" target="_blank" rel="noopener noreferrer">Auto Numbering</a></li>
</ul>
<p>目标文件结构：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>~/.config/Typora/themes/</span></span>
<span class="line"><span>├── github.css              ← 内置，不动</span></span>
<span class="line"><span>├── github/                 ← 内置字体，不动</span></span>
<span class="line"><span>├── github-cus.css          ← 自定义主题入口</span></span>
<span class="line"><span>└── github-cus/             ← 字体资源（从 github/ 复制）</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Typora 主题名取自 CSS 文件名：<code>github-cus.css</code> → 主题选择器里一般显示为 <strong>Github Cus</strong>。</p>
<h2>从 github 复制出 github-cus</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">THEMES</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/.config/Typora/themes"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THEMES</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/github.css"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THEMES</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/github-cus.css"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -a</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THEMES</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/github"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THEMES</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/github-cus"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字体路径从 ./github/ 改到 ./github-cus/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sed</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "s|url('./github/|url('./github-cus/|g"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THEMES</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/github-cus.css"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>复制后 <code>@font-face</code> 应类似：</p>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">src: local('Open Sans Regular'), local('OpenSans-Regular'),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     url('./github-cus/open-sans-v17-latin-ext_latin-regular.woff2') format('woff2');</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>然后在 Typora：<strong>主题 → Github Cus</strong>。后面所有改动都只动 <code>github-cus.css</code>。</p>
<h2>行内代码改成掘金风格</h2>
<h3>目标效果</h3>
<p>正文里的 <code>`Integer`</code> 一类行内代码：</p>
<ul>
<li>字色：<code>#ff502c</code>（橙红）</li>
<li>背景：<code>rgba(255, 80, 44, 0.1)</code>（淡橙红底）</li>
<li>无边框、小圆角、左右略留白</li>
</ul>
<p>围栏代码块（```）继续用原来的灰底，不要跟行内代码混成同一种颜色。</p>
<h3>原主题怎么写的</h3>
<p>github 主题里行内代码和围栏代码块绑在一起：</p>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.md-fences</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">tt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> solid</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> #e7eaed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#f8f8f8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.9</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">em</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#f3f4f4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>问题在于：改 <code>code</code> 会连带影响 <code>.md-fences</code> 里的 <code>code</code>，所以必须拆开，并给围栏内部做还原。</p>
<h3>替换成下面这段</h3>
<p>在 <code>github-cus.css</code> 里，把上面那段改成：</p>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* Inline code — Juejin style */</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">tt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    margin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">none</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rgba</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">255</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">80</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">44</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#ff502c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.9</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">em</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-family</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: Consolas, Monaco, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Courier New"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">monospace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.md-fences</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    margin-bottom</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">15</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    margin-top</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">15</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 6</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> solid</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> #e7eaed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#f8f8f8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.9</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">em</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">inherit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.md-fences</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D"> code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.md-fences</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D"> tt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    margin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">none</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">transparent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">inherit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">inherit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>要点：</p>
<ol>
<li>只给裸 <code>code</code> / <code>tt</code> 上掘金色</li>
<li><code>.md-fences</code> 单独保留灰底围栏样式</li>
<li><code>.md-fences code</code> 清掉颜色和背景，避免代码块里每个 token 都变橙红</li>
</ol>
<p>改完后重选一次主题，或重启 Typora。</p>
<h2>正文标题自动编号（从 h2 起）</h2>
<h3>需求</h3>
<p>文章一般是「一级标题当文题，正文从二级开始分节」：</p>
<p>| Markdown | 显示 |<br>
|</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-04T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Typora</title>
    <id>https://jiangbyte.cn/posts/tools/typora/</id>
    <link href="https://jiangbyte.cn/posts/tools/typora/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Typora 主题与写作体验相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Typora 主题与写作体验相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">VMware Workstation Pro 26H1 安装</title>
    <id>https://jiangbyte.cn/posts/tools/vmware/2026-10-01-VMware%20Workstation%20Pro%2026H1%20%E5%AE%89%E8%A3%85.html</id>
    <link href="https://jiangbyte.cn/posts/tools/vmware/2026-10-01-VMware%20Workstation%20Pro%2026H1%20%E5%AE%89%E8%A3%85.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>本文按 <strong>2026-06-19</strong> 时点可获取的 <strong>26H1 免费版</strong> 流程整理，主要记录 <strong>Windows 宿主机</strong>上的下载和安装步骤。</p>
<h2>下载 VMware Workstation Pro 26H1</h2>
<p>Broadcom 注册地址：<a href="https://profile.broadcom.com/web/registration" target="_blank" rel="noopener noreferrer">https://profile.broadcom.com/web/registration</a><br>
Broadcom 登录地址：<a href="https://access.broadcom.com/default/ui/v1/signin/" target="_blank" rel="noopener noreferrer">https://access.broadcom.com/default/ui/v1/signin/</a></p>]]></summary>
    <content type="html"><![CDATA[<p>本文按 <strong>2026-06-19</strong> 时点可获取的 <strong>26H1 免费版</strong> 流程整理，主要记录 <strong>Windows 宿主机</strong>上的下载和安装步骤。</p>
<h2>下载 VMware Workstation Pro 26H1</h2>
<p>Broadcom 注册地址：<a href="https://profile.broadcom.com/web/registration" target="_blank" rel="noopener noreferrer">https://profile.broadcom.com/web/registration</a><br>
Broadcom 登录地址：<a href="https://access.broadcom.com/default/ui/v1/signin/" target="_blank" rel="noopener noreferrer">https://access.broadcom.com/default/ui/v1/signin/</a></p>
<figure></figure>
<p>下载入口：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Pro&#x26;freeDownloads=true</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>选择对应版本</h3>
<figure></figure>
<figure></figure>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-"><span class="line"><span>I agree to the Terms and Conditions</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p>这个按钮可能有时候点击不了，多试几次</p>
</blockquote>
<figure></figure>
<figure></figure>
<p>可能需要填写一些信息：</p>
<figure></figure>
<figure></figure>
<h2>开始安装</h2>
<figure></figure>
<figure></figure>
<figure></figure>
<p><br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></content>
    <category term="Tools"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">VMware</title>
    <id>https://jiangbyte.cn/posts/tools/vmware/</id>
    <link href="https://jiangbyte.cn/posts/tools/vmware/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>VMware 虚拟机安装与使用相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>VMware 虚拟机安装与使用相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%2013%20XFCE%20%E5%BC%80%E5%8F%91%E6%9C%BA%E6%95%B4%E7%90%86%EF%BC%9A%E7%86%84%E5%B1%8F%E3%80%81%E8%BD%AF%E4%BB%B6%E6%BA%90%E3%80%81%E5%85%A8%E5%B1%80%E8%8F%9C%E5%8D%95%E4%B8%8E%E9%98%B2%E7%81%AB%E5%A2%99.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%2013%20XFCE%20%E5%BC%80%E5%8F%91%E6%9C%BA%E6%95%B4%E7%90%86%EF%BC%9A%E7%86%84%E5%B1%8F%E3%80%81%E8%BD%AF%E4%BB%B6%E6%BA%90%E3%80%81%E5%85%A8%E5%B1%80%E8%8F%9C%E5%8D%95%E4%B8%8E%E9%98%B2%E7%81%AB%E5%A2%99.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>先说场景</h2>
<p>机器是一台日常开发本：<strong>Debian GNU/Linux 13 (trixie) + XFCE</strong>，硬件是 HP ProBook，双 NVMe，本机还跑着 Docker（MySQL / Redis / Portainer 等）。</p>
<p>一次顺手整理，把几件容易踩坑的事一起做完：</p>
<ol>
<li>关掉自动熄屏 / 挂起（插电、电池都关）</li>
<li>看清「要不要更新」，以及为什么 <code>apt</code> 会甩出一千多个可升级包</li>
<li>注释掉 <code>sid</code> / <code>bullseye</code> 混源，只做安全范围内的升级</li>
<li>弄清 XApp / AppMenu，装上全局菜单并让它对齐、能导出菜单</li>
<li>看资源占用，给开发机开防火墙（默认不让别的设备访问）</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>先说场景</h2>
<p>机器是一台日常开发本：<strong>Debian GNU/Linux 13 (trixie) + XFCE</strong>，硬件是 HP ProBook，双 NVMe，本机还跑着 Docker（MySQL / Redis / Portainer 等）。</p>
<p>一次顺手整理，把几件容易踩坑的事一起做完：</p>
<ol>
<li>关掉自动熄屏 / 挂起（插电、电池都关）</li>
<li>看清「要不要更新」，以及为什么 <code>apt</code> 会甩出一千多个可升级包</li>
<li>注释掉 <code>sid</code> / <code>bullseye</code> 混源，只做安全范围内的升级</li>
<li>弄清 XApp / AppMenu，装上全局菜单并让它对齐、能导出菜单</li>
<li>看资源占用，给开发机开防火墙（默认不让别的设备访问）</li>
</ol>
<p>下面按实际操作顺序写，命令可直接复用。</p>
<h2>XFCE：关掉自动熄屏和挂起</h2>
<h3>电源管理 GUI</h3>
<p>打开：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xfce4-power-manager-settings</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>重点看两个标签，且 <strong>On battery / Plugged in 都要改</strong>：</p>
<ul>
<li><strong>System</strong>：<code>When inactive for</code> → <strong>Never</strong></li>
<li><strong>Display</strong>：<code>Put to sleep after</code> / <code>Switch off after</code> → <strong>Never</strong><br>
更干净的做法：直接关掉 <strong>Display power management</strong> 总开关</li>
</ul>
<p><code>Devices</code> 标签只显示电池信息，没有熄屏相关选项。</p>
<h3>屏保</h3>
<p>本机没有 <code>xfce4-screensaver</code>（<code>command not found</code> 很正常），可以忽略。真正黑屏多半来自电源管理或 DPMS。</p>
<h3>DPMS（硬件级熄屏）</h3>
<p>终端立刻关掉：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xset</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> off</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xset</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -dpms</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xset</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> noblank</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>想开机也生效：在 <strong>设置 → 会话和启动 → 应用程序自动启动</strong> 加一条：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xset</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> off</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -dpms</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> noblank</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>也可用 xfconf 关掉电源管理侧的 DPMS：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xfconf-query</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> xfce4-power-manager</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /xfce4-power-manager/dpms-enabled</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> false</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xfconf-query</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> xfce4-power-manager</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /xfce4-power-manager/blank-on-ac</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">xfconf-query</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> xfce4-power-manager</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /xfce4-power-manager/blank-on-battery</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>系统要不要更新：先看源，再看数量</h2>
<h3>表面现象</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> list</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --upgradable</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>一度出现 <strong>一千多个</strong> 可升级包，内核候选版本甚至从 <code>6.12</code> 跳到 <code>7.x</code>。这不是「trixie 落后很多」，而是软件源混了。</p>
<h3>实际系统状态（整理前）</h3>
<p>| 项             | 状态                                              |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian XFCE 换 GDM 登录页与用户头像</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%20XFCE%20%E6%8D%A2%20GDM%20%E7%99%BB%E5%BD%95%E9%A1%B5%E4%B8%8E%E7%94%A8%E6%88%B7%E5%A4%B4%E5%83%8F.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%20XFCE%20%E6%8D%A2%20GDM%20%E7%99%BB%E5%BD%95%E9%A1%B5%E4%B8%8E%E7%94%A8%E6%88%B7%E5%A4%B4%E5%83%8F.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>目标与边界</h2>
<p>机器：<strong>Debian 13（trixie）+ XFCE</strong>，原先用 <strong>LightDM + lightdm-gtk-greeter</strong>。</p>
<p>要做的事：</p>
<ol>
<li>登录界面换成 <strong>GDM3</strong>（只要登录页，<strong>不</strong>换 GNOME 桌面）</li>
<li>登录后仍进 <strong>Xfce Session</strong></li>
<li>能用图形工具调登录页外观（壁纸等）</li>
<li>搞清楚 <strong>登录头像</strong> 改哪里、为什么 Mugshot / 只改 <code>~/.face</code> 不生效</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>目标与边界</h2>
<p>机器：<strong>Debian 13（trixie）+ XFCE</strong>，原先用 <strong>LightDM + lightdm-gtk-greeter</strong>。</p>
<p>要做的事：</p>
<ol>
<li>登录界面换成 <strong>GDM3</strong>（只要登录页，<strong>不</strong>换 GNOME 桌面）</li>
<li>登录后仍进 <strong>Xfce Session</strong></li>
<li>能用图形工具调登录页外观（壁纸等）</li>
<li>搞清楚 <strong>登录头像</strong> 改哪里、为什么 Mugshot / 只改 <code>~/.face</code> 不生效</li>
</ol>
<p>明确不做（本文范围外）：</p>
<ul>
<li>不装 WhiteSur / macOS 风 GDM 主题（可以后再加）</li>
<li>不卸载 LightDM 包（方便回退）</li>
</ul>
<p>桌面侧其它整理可对照：[Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙](./2026-10-01-Debian 13 XFCE 开发机整理：熄屏、软件源、<a href="http://xn--jhq94fjzbd8ir7efv0blp2a8w4a.md" target="_blank" rel="noopener noreferrer">全局菜单与防火墙.md</a>)。</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian13-GNOME安装Fcitx5-Rime简体拼音</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian13-GNOME%E5%AE%89%E8%A3%85Fcitx5-Rime%E7%AE%80%E4%BD%93%E6%8B%BC%E9%9F%B3.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian13-GNOME%E5%AE%89%E8%A3%85Fcitx5-Rime%E7%AE%80%E4%BD%93%E6%8B%BC%E9%9F%B3.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[
<p>记录时间：2026-10-26</p>
<p>环境：Debian 13 (trixie) · GNOME · X11（<code>gnome-xorg</code>）<br>
目标：Fcitx5 + Rime，默认方案 <code>luna_pinyin_simp</code>（月拼音·简体），登录自动启动。</p>
<p>原先系统是 IBus + <code>ibus-libpinyin</code>。不卸载 IBus（GNOME 有依赖），改用 <code>im-config</code> 切到 Fcitx5。</p>
<hr>
<h2>1. 安装软件包</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  fcitx5</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  fcitx5-rime</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  fcitx5-config-qt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  fcitx5-frontend-all</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rime-data-luna-pinyin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rime-prelude</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rime-essay</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>记录时间：2026-10-26</p>
<p>环境：Debian 13 (trixie) · GNOME · X11（<code>gnome-xorg</code>）<br>
目标：Fcitx5 + Rime，默认方案 <code>luna_pinyin_simp</code>（月拼音·简体），登录自动启动。</p>
<p>原先系统是 IBus + <code>ibus-libpinyin</code>。不卸载 IBus（GNOME 有依赖），改用 <code>im-config</code> 切到 Fcitx5。</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian中国源安装Docker</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>前置</h2>
<ul>
<li>已配好 Debian 软件源（见 <a href="/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html" target="_blank">配置 Debian 软件源</a>）</li>
<li>确认代号：</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/os-release</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VERSION_CODENAME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 本文按 trixie 写；bookworm 等把下面 URL 里的代号一并改掉</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>前置</h2>
<ul>
<li>已配好 Debian 软件源（见 <a href="/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html" target="_blank">配置 Debian 软件源</a>）</li>
<li>确认代号：</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/os-release</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VERSION_CODENAME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 本文按 trixie 写；bookworm 等把下面 URL 里的代号一并改掉</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>不要用发行版仓库里过时的 <code>docker.io</code> 凑合（可以跑，但版本和管理源往往不如官方 CE 清晰）。开发机推荐 <strong>Docker CE + 国内镜像</strong>。</p>
<h2>依赖与 GPG 密钥</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ca-certificates</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> curl</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0755</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/keyrings</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://mirrors.aliyun.com/docker-ce/linux/debian/gpg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/keyrings/docker.asc</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> a+r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/keyrings/docker.asc</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>若阿里云 GPG 地址异常，可用 Docker 官方密钥再继续用阿里云软件源（密钥与仓库可分开）。</p>
<h2>添加阿里云 Docker CE 源</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/os-release</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/debian ${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">VERSION_CODENAME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">} stable"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tee</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list.d/docker.list</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Debian 13 上生效后类似：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/debian trixie stable</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>安装 Docker Engine</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  docker-ce</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  docker-ce-cli</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  containerd.io</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  docker-buildx-plugin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  docker-compose-plugin</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>开机自启并立刻启动：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> enable</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --now</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --no-pager</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>当前用户免 sudo</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> usermod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -aG</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$USER</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>注销重新登录</strong>（或重启）后再测：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> version</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> hello-world</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>配置镜像加速（拉镜像用）</h2>
<p>把加速器写进 daemon 配置（示例为阿里云；也可换中科大、DaoCloud 等）：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/docker</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tee</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/docker/daemon.json</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/dev/null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'EOF'</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">{</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  "registry-mirrors": [</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "https://docker.m.daocloud.io"</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  ],</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  "log-driver": "json-file",</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  "log-opts": {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "max-size": "50m",</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "max-file": "3"</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  }</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> daemon-reload</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> info</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> grep</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -A5</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Registry Mirrors'</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>加速器地址会随服务商变更，以你账号控制台或镜像站文档为准。</p>
<h2>常用自检</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> info</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> version</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ps</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -a</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>数据盘与项目目录建议分开，例如：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/Workspace/datas</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>容器业务数据（MySQL、Redis、对象存储等）优先 bind 到 <code>~/Workspace/datas/...</code>，不要只依赖匿名卷，方便备份和迁移。</p>
<h2>和防火墙的关系（开发机）</h2>
<p>UFW 默认拒入站时，<strong>Docker 映射到 <code>0.0.0.0</code> 的端口仍可能被局域网访问</strong>（走 FORWARD/DNAT，不经 UFW 的 INPUT）。开发本若只想本机用：</p>
<ul>
<li>映射写成 <code>-p 127.0.0.1:3306:3306</code>，或</li>
<li>在 <code>DOCKER-USER</code> 链限制外网访问（见 XFCE 开发机整理一文中的防火墙小节）</li>
</ul>
<h2>小结</h2>
<p>| 步骤 | 要点 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian安装Redis和MySQL</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%E5%AE%89%E8%A3%85Redis%E5%92%8CMySQL.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-Debian%E5%AE%89%E8%A3%85Redis%E5%92%8CMySQL.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>说明</h2>
<p>本文要装的是 <strong>Oracle MySQL</strong> 和 <strong>Redis</strong>，不是 MariaDB。</p>
<p>Debian 自带仓库里的 <code>default-mysql-server</code> 实际会装成 <strong>MariaDB</strong>，<strong>不要用那个包</strong>。本机用 apt 装 MySQL 时，走 <strong>MySQL 官方 APT 源</strong>。</p>
<table>
<thead>
<tr>
<th>方式</th>
<th>Redis</th>
<th>MySQL</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>A. 软件源</strong></td>
<td>Debian 源 <code>redis-server</code></td>
<td>MySQL 官方 APT → <code>mysql-community-server</code></td>
</tr>
<tr>
<td><strong>B. Docker</strong></td>
<td><code>redis:8.8.2</code></td>
<td><code>mysql:9.7.2</code></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>说明</h2>
<p>本文要装的是 <strong>Oracle MySQL</strong> 和 <strong>Redis</strong>，不是 MariaDB。</p>
<p>Debian 自带仓库里的 <code>default-mysql-server</code> 实际会装成 <strong>MariaDB</strong>，<strong>不要用那个包</strong>。本机用 apt 装 MySQL 时，走 <strong>MySQL 官方 APT 源</strong>。</p>
<p>| 方式 | Redis | MySQL |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">XFCE AppMenu 居中与 Expand 被写回</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-XFCE%20AppMenu%20%E5%B1%85%E4%B8%AD%E4%B8%8E%20Expand%20%E8%A2%AB%E5%86%99%E5%9B%9E.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-XFCE%20AppMenu%20%E5%B1%85%E4%B8%AD%E4%B8%8E%20Expand%20%E8%A2%AB%E5%86%99%E5%9B%9E.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>现象</h2>
<p>顶栏装了 <strong>AppMenu Plugin</strong> 之后：</p>
<ul>
<li>菜单标题（如 <code>Cursor</code>、<code>Thunar</code>）不靠左，像漂在面板中间</li>
<li>右键属性里把 <strong>Expand plugin on panel</strong> 关掉，看起来正常了</li>
<li><strong>注销 / 重启</strong> 后，Expand 又被勾上，标题又居中</li>
</ul>
<p>装全局菜单、环境变量、GTK module 等前置步骤见：[Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙](./2026-10-01-Debian 13 XFCE 开发机整理：熄屏、软件源、<a href="http://xn--jhq94fjzbd8ir7efv0blp2a8w4a.md" target="_blank" rel="noopener noreferrer">全局菜单与防火墙.md</a>)。本文只挖 <strong>居中 / Expand 反复写回</strong> 这一块。</p>]]></summary>
    <content type="html"><![CDATA[<h2>现象</h2>
<p>顶栏装了 <strong>AppMenu Plugin</strong> 之后：</p>
<ul>
<li>菜单标题（如 <code>Cursor</code>、<code>Thunar</code>）不靠左，像漂在面板中间</li>
<li>右键属性里把 <strong>Expand plugin on panel</strong> 关掉，看起来正常了</li>
<li><strong>注销 / 重启</strong> 后，Expand 又被勾上，标题又居中</li>
</ul>
<p>装全局菜单、环境变量、GTK module 等前置步骤见：[Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙](./2026-10-01-Debian 13 XFCE 开发机整理：熄屏、软件源、<a href="http://xn--jhq94fjzbd8ir7efv0blp2a8w4a.md" target="_blank" rel="noopener noreferrer">全局菜单与防火墙.md</a>)。本文只挖 <strong>居中 / Expand 反复写回</strong> 这一块。</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">linux初始机</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-linux%E5%88%9D%E5%A7%8B%E6%9C%BA.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-linux%E5%88%9D%E5%A7%8B%E6%9C%BA.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>目标</h2>
<p>新装或刚到手的 <strong>Debian</strong> 开发机，先把「能正常干活」的底子铺好，再去改软件源、装 Docker、跑 MySQL / Redis。</p>
<p>本文以 <strong>Debian 13 (trixie) + 图形桌面（如 XFCE）</strong> 为例，命令对服务器版同样适用（跳过桌面相关即可）。</p>
<p>建议阅读顺序：</p>
<ol>
<li>本文：01 Linux 初始机</li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html" target="_blank">配置 Debian 软件源</a></li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.html" target="_blank">Debian 中国源安装 Docker</a></li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-Debian%E5%AE%89%E8%A3%85Redis%E5%92%8CMySQL.html" target="_blank">Debian 安装 Redis 和 MySQL</a></li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>目标</h2>
<p>新装或刚到手的 <strong>Debian</strong> 开发机，先把「能正常干活」的底子铺好，再去改软件源、装 Docker、跑 MySQL / Redis。</p>
<p>本文以 <strong>Debian 13 (trixie) + 图形桌面（如 XFCE）</strong> 为例，命令对服务器版同样适用（跳过桌面相关即可）。</p>
<p>建议阅读顺序：</p>
<ol>
<li>本文：01 Linux 初始机</li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html" target="_blank">配置 Debian 软件源</a></li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.html" target="_blank">Debian 中国源安装 Docker</a></li>
<li><a href="/posts/ops/debian-dev-box/2026-10-01-Debian%E5%AE%89%E8%A3%85Redis%E5%92%8CMySQL.html" target="_blank">Debian 安装 Redis 和 MySQL</a></li>
</ol>
<h2>确认系统</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/os-release</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">uname</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -r</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">hostnamectl</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>关注：</p>
<ul>
<li><code>VERSION_CODENAME</code>（如 <code>trixie</code>）——后面写源、装 Docker 都要用</li>
<li>架构一般为 <code>x86-64</code> / <code>amd64</code></li>
</ul>
<h2>用户与 sudo</h2>
<p>安装时若已创建普通用户并勾选 sudo，可跳过。否则：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">su</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> -</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sudo</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">usermod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -aG</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 你的用户名</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注销重登后验证：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -v</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">whoami</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>开发机建议：<strong>日常用普通用户，需要提权再 <code>sudo</code></strong>，不要长期挂在 root 图形会话里。</p>
<h2>基础工具包</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  curl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> wget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ca-certificates</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> gnupg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vim</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> htop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unzip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  net-tools</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> iproute2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dnsutils</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  build-essential</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  lm-sensors</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>按需再加：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 压缩 / 磁盘</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> p7zip-full</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ncdu</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 终端体验</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tmux</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> fzf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ripgrep</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>时区与语言</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 时区（上海）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> timedatectl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> set-timezone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> Asia/Shanghai</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">timedatectl</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 中文环境（桌面常用）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> locales</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dpkg-reconfigure</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> locales</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 勾选 zh_CN.UTF-8，并设为默认</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>当前 shell 可先：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'export LANG=zh_CN.UTF-8'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> >></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.bashrc</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>目录习惯（开发机）</h2>
<p>后面 Docker 数据、项目都会落到固定路径，建议一开始就定好，例如：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/Workspace/{projects,datas}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/Workspace/datas/{mysql,redis,silo,ngnix}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>约定示例：</p>
<p>| 路径 | 用途 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">配置Debian软件源</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-01-%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>为什么要改源</h2>
<p>默认 <code>deb.debian.org</code> 在国内经常慢或不稳。开发机建议：</p>
<ul>
<li><strong>软件包、更新、backports</strong> → 中科大镜像（也可换清华、北外、阿里云等）</li>
<li><strong>安全更新</strong> → 继续用官方 <code>security.debian.org</code>（更及时）</li>
</ul>
<p>同时要避免把 <strong>sid（unstable）</strong>、旧版 <strong>bullseye</strong> 和当前稳定版写进同一套默认源，否则 <code>apt list --upgradable</code> 会刷出上千个包，一不小心就把桌面拖进滚动版。</p>]]></summary>
    <content type="html"><![CDATA[<h2>为什么要改源</h2>
<p>默认 <code>deb.debian.org</code> 在国内经常慢或不稳。开发机建议：</p>
<ul>
<li><strong>软件包、更新、backports</strong> → 中科大镜像（也可换清华、北外、阿里云等）</li>
<li><strong>安全更新</strong> → 继续用官方 <code>security.debian.org</code>（更及时）</li>
</ul>
<p>同时要避免把 <strong>sid（unstable）</strong>、旧版 <strong>bullseye</strong> 和当前稳定版写进同一套默认源，否则 <code>apt list --upgradable</code> 会刷出上千个包，一不小心就把桌面拖进滚动版。</p>
<h2>备份</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list.bak.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">date</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> +%Y%m%d%H%M%S</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>确认代号：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/os-release</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VERSION_CODENAME</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Debian 13 → trixie</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>下文以 <strong>trixie</strong> 为例，其他版本替换代号即可。</p>
<h2>推荐的 sources.list</h2>
<p>以<strong>中国科学技术大学（USTC）</strong>镜像为例：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tee</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/dev/null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'EOF'</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb https://mirrors.ustc.edu.cn/debian/ trixie main contrib non-free non-free-firmware</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb https://mirrors.ustc.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb https://mirrors.ustc.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"># 安全更新建议走官方</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb https://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>镜像站文档：<a href="https://mirrors.ustc.edu.cn/help/debian.html" target="_blank" rel="noopener noreferrer">https://mirrors.ustc.edu.cn/help/debian.html</a><br>
若改用其他镜像，把主机名换成例如 <code>mirrors.tuna.tsinghua.edu.cn</code>、<code>mirrors.bfsu.edu.cn</code>、<code>mirrors.aliyun.com</code> 即可。</p>
<p>说明：</p>
<p>| 行 | 作用 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Docker 本机基础设施执行命令</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-03-Docker%20%E6%9C%AC%E6%9C%BA%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-03-Docker%20%E6%9C%AC%E6%9C%BA%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>拉取镜像</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== MySQL 9.7.2 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/mysql:9.7.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Redis 8.8.2 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/redis:8.8.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Silo (MinIO 变体) =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== RabbitMQ 4.2.9-management =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Ollama 0.33.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama/ollama:0.33.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> quay.io/coreos/etcd:v3.6.12</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> zilliz/attu:v3.0.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>拉取镜像</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== MySQL 9.7.2 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/mysql:9.7.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/mysql:9.7.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Redis 8.8.2 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/redis:8.8.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/redis:8.8.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Silo (MinIO 变体) =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== RabbitMQ 4.2.9-management =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> library/rabbitmq:4.2.9-management</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/library/rabbitmq:4.2.9-management</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Ollama 0.33.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama/ollama:0.33.1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/ollama/ollama:0.33.1</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> quay.io/coreos/etcd:v3.6.12</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> zilliz/attu:v3.0.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rmi</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> docker.xuanyuan.run/zilliz/attu:v3.0.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>运行命令</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== MySQL 9.7.2（开机自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 3306:3306</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MYSQL_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/mysql:/var/lib/mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  mysql:9.7.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Redis 8.8.2（开机自启 + AOF）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 6379:6379</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> REDIS_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/redis:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  redis:8.8.2</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "infra123!"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --appendonly</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yes</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== MySQL 9.7.2（开机不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 3306:3306</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MYSQL_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/mysql:/var/lib/mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  mysql:9.7.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Redis 8.8.2（开机不自启 + AOF）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 6379:6379</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> REDIS_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/redis:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  redis:8.8.2</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "infra123!"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --appendonly</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yes</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Silo (MinIO 变体) =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> silo</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9000:9000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9001:9001</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> silo_data:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --console-address</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ":9001"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Silo（默认不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> silo</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9000:9000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9001:9001</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/silo:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --console-address</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ":9001"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== RabbitMQ 4.2.9-management =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 5672:5672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 15672:15672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_PASS='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq_data:/var/lib/rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rabbitmq:4.2.9-management</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Ollama 0.33.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 11434:11434</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama_data:/root/.ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  ollama/ollama:0.33.1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Ollama 0.33.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 11434:11434</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama_data:/root/.ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  ollama/ollama:0.33.1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Draw.io 31.4.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> draw</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 18080:8080</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  jgraph/drawio:31.4.1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> drawio</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 18080:8080</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  jgraph/drawio:31.4.2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Nacos 2.5.0 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> nacos</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8848:8848</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9848:9848</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MODE=standalone</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  nacos/nacos-server:v2.5.0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8080:80</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/ngnix/conf/nginx.conf:/etc/nginx/nginx.conf:ro</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/ngnix/conf/conf.d:/etc/nginx/conf.d:ro</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/ngnix/html:/usr/share/nginx/html:ro</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/ngnix/logs:/var/log/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /home/charlie/Workspace/datas/ngnix/ssl:/etc/nginx/ssl:ro</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  nginx:stable-alpine3.24</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>运行命令</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== MySQL 9.7.2（开机不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 3306:3306</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MYSQL_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql_data:/var/lib/mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  mysql:9.7.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Redis 8.8.2（开机不自启 + AOF）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 6379:6379</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> REDIS_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis_data:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  redis:8.8.2</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "infra123!"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --appendonly</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yes</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Silo（默认不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> silo</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9000:9000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9001:9001</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MINIO_ROOT_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> silo_data:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  pgsty/silo:RELEASE.2026-08-06T00-00-00Z</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --console-address</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ":9001"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== RabbitMQ 4.2.9-management =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 5672:5672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 15672:15672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_PASS='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq_data:/var/lib/rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rabbitmq:4.2.9-management</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Ollama 0.33.1 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 11434:11434</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ollama_data:/root/.ollama</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  ollama/ollama:0.33.1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> drawio</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 18080:8080</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  jgraph/drawio:31.4.6</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Nacos 2.5.0 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> nacos</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8848:8848</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9848:9848</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MODE=standalone</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  nacos/nacos-server:v2.5.0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Milvus 前置：命名卷写入 etcd 配置 =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> volume</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus_data</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus_data:/var/lib/milvus</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> alpine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sh</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'cat > /var/lib/milvus/embedEtcd.yaml &#x3C;&#x3C; EOF</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">listen-client-urls: http://0.0.0.0:2379</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">advertise-client-urls: http://0.0.0.0:2379</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">quota-backend-bytes: 4294967296</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">auto-compaction-mode: revision</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">auto-compaction-retention: '</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\'</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'1000'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\'</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Milvus（开机不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --pull=never</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --security-opt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> seccomp:unconfined</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ETCD_USE_EMBED=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ETCD_DATA_DIR=/var/lib/milvus/etcd</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ETCD_CONFIG_PATH=/var/lib/milvus/embedEtcd.yaml</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> COMMON_STORAGETYPE=local</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> DEPLOY_MODE=STANDALONE</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus_data:/var/lib/milvus</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 19530:19530</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 9091:9091</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 2379:2379</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --health-cmd=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"curl -f http://localhost:9091/healthz"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --health-interval=30s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --health-start-period=90s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --health-timeout=20s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --health-retries=3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  milvusdb/milvus:v3.0.1</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  milvus</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> standalone</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== 开启鉴权，并把 root 密码改为 infra123! =====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exec</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sh</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'cat > /milvus/configs/user.yaml &#x3C;&#x3C; EOF</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">common:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  security:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    authorizationEnabled: true</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF'</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> milvus</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 等 healthy 后执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -sS</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -X</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> POST</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "http://127.0.0.1:19530/v2/vectordb/users/update_password"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -H</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Authorization: Bearer root:Milvus"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -H</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Content-Type: application/json"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '{"userName":"root","password":"Milvus","newPassword":"infra123!"}'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ===== Attu（开机不自启）=====</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> attu</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --pull=never</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 8000:3000</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MILVUS_URL=http://host.docker.internal:19530</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ATTU_ADMIN_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ATTU_ADMIN_PASSWORD='infra123!'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> attu_data:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --add-host=host.docker.internal:host-gateway</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> no</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  zilliz/attu:v3.0.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <category term="Ops"/>
    <published>2026-10-03T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Debian 13 友基 XP-Pen 数位板官方驱动与内核冲突排查固化</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-07-Debian%2013%20%E5%8F%8B%E5%9F%BA%20XP-Pen%20%E6%95%B0%E4%BD%8D%E6%9D%BF%E5%AE%98%E6%96%B9%E9%A9%B1%E5%8A%A8%E4%B8%8E%E5%86%85%E6%A0%B8%E5%86%B2%E7%AA%81%E6%8E%92%E6%9F%A5%E5%9B%BA%E5%8C%96.html</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/2026-10-07-Debian%2013%20%E5%8F%8B%E5%9F%BA%20XP-Pen%20%E6%95%B0%E4%BD%8D%E6%9D%BF%E5%AE%98%E6%96%B9%E9%A9%B1%E5%8A%A8%E4%B8%8E%E5%86%85%E6%A0%B8%E5%86%B2%E7%AA%81%E6%8E%92%E6%9F%A5%E5%9B%BA%E5%8C%96.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>环境</h2>
<p>采集时间：2026-10-07。主机名 <code>dev</code>。</p>
<table>
<thead>
<tr>
<th>项</th>
<th>值</th>
<th>依据</th>
</tr>
</thead>
<tbody>
<tr>
<td>系统</td>
<td>Debian GNU/Linux 13 (trixie)，<code>DEBIAN_VERSION_FULL=13.7</code></td>
<td><code>/etc/os-release</code></td>
</tr>
<tr>
<td>内核</td>
<td><code>6.12.111+deb13-amd64</code></td>
<td><code>uname -r</code></td>
</tr>
<tr>
<td>机型</td>
<td>HP ProBook 450 15.6 inch G9 Notebook PC</td>
<td><code>/sys/class/dmi/id/product_name</code></td>
</tr>
<tr>
<td>会话</td>
<td><code>XDG_SESSION_TYPE=x11</code>，<code>DISPLAY=:0</code>，<code>XDG_CURRENT_DESKTOP=GNOME</code>，<code>GDMSESSION=gnome-xorg</code></td>
<td>环境变量</td>
</tr>
<tr>
<td>数位板 USB</td>
<td><code>Bus 003 Device 022: ID 28bd:0905 XP-Pen 10 inch PenTablet</code></td>
<td><code>lsusb</code></td>
</tr>
<tr>
<td>sysfs</td>
<td><code>/sys/bus/usb/devices/3-4</code>，<code>manufacturer=UGTABLET</code>，<code>product=10 inch PenTablet</code></td>
<td>sysfs</td>
</tr>
<tr>
<td>驱动包</td>
<td><code>ugeetablet 4.3</code>（<code>Maintainer: tech@xp-pen.com</code>）</td>
<td><code>dpkg -l</code> / <code>apt-cache show</code></td>
</tr>
<tr>
<td>安装包文件</td>
<td><code>/home/charlie/Downloads/ugeeTablet4.3.5-241031.deb</code>（约 22MB，mtime 2026-10-07 19:36）</td>
<td><code>ls</code></td>
</tr>
<tr>
<td>驱动路径</td>
<td><code>/usr/lib/ugeeTablet/{ugeeTabletDriver,ugeeTablet,ugeeTabletDriver.sh}</code></td>
<td>文件系统</td>
</tr>
<tr>
<td>驱动配置目录</td>
<td><code>~/.config/Hanvon Ugee/ugee.conf</code>（仅 LocalSocket 时间戳）</td>
<td>文件系统</td>
</tr>
<tr>
<td>相关已装包</td>
<td><code>xserver-xorg-input-wacom 1.2.3-1</code>，<code>libwacom9</code>，<code>libwacom-common</code></td>
<td><code>dpkg -l</code></td>
</tr>
<tr>
<td>其它输入设备（配置未改）</td>
<td>内置键盘 <code>AT Translated Set 2 keyboard</code>；<code>Newmen ... 2.4G Keyboard Mouse</code>；<code>SEMICO USB Gaming Keyboard</code>；触控板 <code>SYNA30E5:00 06CB:CEAC</code></td>
<td><code>/sys/class/input/*/name</code></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>环境</h2>
<p>采集时间：2026-10-07。主机名 <code>dev</code>。</p>
<p>| 项 | 值 | 依据 |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-07T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">debian-dev-box</title>
    <id>https://jiangbyte.cn/posts/ops/debian-dev-box/</id>
    <link href="https://jiangbyte.cn/posts/ops/debian-dev-box/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Debian 开发机装机、桌面与本机基础设施相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Debian 开发机装机、桌面与本机基础设施相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">使用 Docker 快速部署数据服务环境</title>
    <id>https://jiangbyte.cn/posts/ops/docker/2026-10-01-%E4%BD%BF%E7%94%A8%20Docker%20%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E7%8E%AF%E5%A2%83.html</id>
    <link href="https://jiangbyte.cn/posts/ops/docker/2026-10-01-%E4%BD%BF%E7%94%A8%20Docker%20%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E7%8E%AF%E5%A2%83.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>前置准备</h2>
<p>首先创建所有服务的数据持久化目录：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 创建统一的数据存储目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/{postgres,redis,rabbitmq}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>前置准备</h2>
<p>首先创建所有服务的数据持久化目录：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 创建统一的数据存储目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/{postgres,redis,rabbitmq}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>服务部署</h2>
<h3>PostgreSQL（支持向量扩展，端口5433）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拉取支持向量扩展的PostgreSQL镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pgvector/pgvector:pg17</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 启动PostgreSQL容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> postgres</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 512m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> POSTGRES_PASSWORD=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">123456</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> POSTGRES_DB=myapp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/postgres:/var/lib/postgresql/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 5433:5432</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  pgvector/pgvector:pg17</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>启用向量扩展（首次启动后执行）：</strong></p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> postgres</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> psql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -U</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> postgres</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> myapp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "CREATE EXTENSION IF NOT EXISTS vector;"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>连接测试：</strong></p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> postgres</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> psql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -U</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> postgres</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> myapp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "SELECT 1+1;"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 返回 ?column? | 2 表示成功</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>Redis（缓存服务，端口6380）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拉取Redis镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis:7-alpine</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 启动Redis容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 128m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/redis:/data</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 6380:6379</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  redis:7-alpine</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  redis-server</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --maxmemory</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 128mb</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --maxmemory-policy</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> allkeys-lru</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --requirepass</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 123456</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --appendonly</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> yes</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>连接测试：</strong></p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> redis-cli</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -a</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 123456</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ping</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 返回 PONG 表示成功</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>RabbitMQ（消息队列，端口5673/15673）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拉取带管理界面的RabbitMQ镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq:4-management-alpine</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 启动RabbitMQ容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 384m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/rabbitmq:/var/lib/rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 5673:5672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 15673:15672</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_USER=admin</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> RABBITMQ_DEFAULT_PASS=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">123456</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  rabbitmq:4-management-alpine</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>管理界面访问：</strong> <code>http://你的IP:15673</code>，账号 <code>admin</code> / 密码 <code>123456</code></p>
<h3>MySQL（备用数据库，端口3307）</h3>
<p>如需要MySQL作为备用数据库，可使用以下配置：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拉取MySQL镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql:8.0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 启动MySQL容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --restart</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unless-stopped</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 512m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MYSQL_ROOT_PASSWORD=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">123456</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -e</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> MYSQL_DATABASE=myapp</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/docker-data/mysql:/var/lib/mysql</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 3307:3306</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  mysql:8.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  --innodb_buffer_pool_size=256M</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>服务连接信息汇总</h2>
<p>| 服务                | 内部端口  | 外部端口      | 账号        | 密码         |<br>
|</p>
]]></content>
    <category term="Ops"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">docker</title>
    <id>https://jiangbyte.cn/posts/ops/docker/</id>
    <link href="https://jiangbyte.cn/posts/ops/docker/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>Docker 部署数据服务相关笔记。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Docker 部署数据服务相关笔记。</p>
]]></content>
    <published>2026-10-28T15:02:43.000Z</published>
  </entry>
  <entry>
    <title type="text">关于</title>
    <id>https://jiangbyte.cn/about.html</id>
    <link href="https://jiangbyte.cn/about.html"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>关于 Charlie 与摸鱼猫泡泡本站。可在侧栏进入「关于自己」与「关于本站」。</p>
]]></summary>
    <content type="html"><![CDATA[<p>关于 Charlie 与摸鱼猫泡泡本站。可在侧栏进入「关于自己」与「关于本站」。</p>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
  <entry>
    <title type="text">关于</title>
    <id>https://jiangbyte.cn/about/</id>
    <link href="https://jiangbyte.cn/about/"/>
    <updated>2026-10-28T15:02:43.000Z</updated>
    <summary type="html"><![CDATA[<p>关于 Charlie 与摸鱼猫泡泡：作者介绍与站点说明。</p>
]]></summary>
    <content type="html"><![CDATA[<p>关于 Charlie 与摸鱼猫泡泡：作者介绍与站点说明。</p>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
  <entry>
    <title type="text">关于自己</title>
    <id>https://jiangbyte.cn/about/me.html</id>
    <link href="https://jiangbyte.cn/about/me.html"/>
    <updated>2026-10-29T00:03:07.000Z</updated>
    <summary type="html"><![CDATA[
<p>Hi，我是 <strong>Charlie</strong>。</p>
<p>现居贵州黔东南凯里。计算机科学与技术本科毕业后进入职场，目前从事 AI 全栈研发。业余维护摸鱼猫泡泡，整理常用工具、排查记录与项目结论。</p>
<h3>方向</h3>
<p>从事 AI 全栈研发：将大模型能力接入业务（对话助手、RAG 知识库、Tools / Agent 编排），并独立完成页面、接口、数据与部署相关工作。开发侧使用 Cursor、Codex、Workbuddy 等工具，模型侧常用 Claude、DeepSeek、Qwen 等，用于提升开发与联调效率，合入前进行人工复核。</p>
<h3>经历</h3>]]></summary>
    <content type="html"><![CDATA[
<p>Hi，我是 <strong>Charlie</strong>。</p>
<p>现居贵州黔东南凯里。计算机科学与技术本科毕业后进入职场，目前从事 AI 全栈研发。业余维护摸鱼猫泡泡，整理常用工具、排查记录与项目结论。</p>
<h3>方向</h3>
<p>从事 AI 全栈研发：将大模型能力接入业务（对话助手、RAG 知识库、Tools / Agent 编排），并独立完成页面、接口、数据与部署相关工作。开发侧使用 Cursor、Codex、Workbuddy 等工具，模型侧常用 Claude、DeepSeek、Qwen 等，用于提升开发与联调效率，合入前进行人工复核。</p>
<h3>经历</h3>
<p><strong>2026.03 – 至今 · AI 全栈</strong></p>
<p>入职后参与全栈研发与交付，覆盖大文件媒体链路、ERP、分布式预约履约与内部 RAG 知识库等方向：</p>
<ul>
<li><strong>大文件上传</strong>：针对同步上传耗时长的问题，采用自适应分片、并发上传与断点续传；会话状态存于缓存，数据直传对象存储，并完成端到端完整性校验。</li>
<li><strong>异步媒体处理</strong>：将探测、改封装与转码拆分为消息队列任务，由独立 Worker 消费；多节点竞争消费并以租约互斥，避免同一文件被重复处理。</li>
<li><strong>统一存储与交付</strong>：通过存储接口层屏蔽本地对象存储与云厂商差异，后端切换仅依赖配置；配套权限模型与文档网盘；支持容器与裸机部署，应用层可水平扩展。</li>
<li><strong>ERP</strong>：参与主数据、单据流转、库存 / 结算与报表等模块的需求澄清、原型 / UI 及前后端实现；完善查询条件与校验规则，跟进联调与上线。</li>
<li><strong>分布式预约履约</strong>：覆盖入驻、下单、派单与履约闭环；对高频列表查询结合执行计划与复合索引优化；支付回调实现幂等，避免网络重试导致重复入账；接入 AI 辅助咨询 / 业务问答；产出 PRD / 原型并跟进联调。</li>
<li><strong>内部 RAG 知识库</strong>：基于 Spring AI 实现多知识库管理与文件入库（原文对象存储、元数据库、解析切片与向量库）；对话侧支持会话记忆、按库过滤检索与流式输出；封装 Tools 支持业务内查询，合入前人工复核。</li>
</ul>
<p><strong>2025.07 – 2025.11 · 平台研发（实习）</strong></p>
<p>实习期间参与省 / 州级平台的迭代交付与稳定性治理，业务形态覆盖监测预警与公共服务：</p>
<ul>
<li><strong>流水号与一致性</strong>：针对并发场景下流水号冲突，基于缓存原子计数保证编号唯一且连续。</li>
<li><strong>风险评估计算</strong>：梳理文档并落地算法框架，对设备上报数据并行计算以缩短评估耗时；按协议对接设备，完成数据二次转换后入库。</li>
<li><strong>数据质量</strong>：定位业务编码错误导致的脏数据产生点，完成修复与联调，避免错误数据上送。</li>
<li><strong>复杂查询与索引</strong>：针对多条件查询（嵌套 OR、时间范围、模糊匹配）实现动态条件组装，并结合执行计划补全覆盖索引以保障查询性能。</li>
<li><strong>区域策略与防重</strong>：按管辖区域限定参与范围，基于缓存结构实现防重策略，并支持批量统计。</li>
<li><strong>小程序联调</strong>：按 UI 规范调整交互与接口对接，完成前后端联调与页面验收后上线。</li>
</ul>
<p><strong>2024.08 – 2025.09 · 编程实训平台（主导）</strong></p>
<p>校内多语言实训系统（Java / Go / Python 等），包含 AI 辅导与代码相似度检测；负责整体推进与核心模块落地：</p>
<ul>
<li><strong>查重报告短链</strong>：针对长链接不便分享的问题，采用 MurmurHash3 + Base62 生成短码，并结合 Redis 完成去重与查询。</li>
<li><strong>相似计算服务</strong>：将成对相似计算拆分为 Go 微服务；任务进入 Redis 队列，由多协程异步消费，提高吞吐并降低对主业务的影响。</li>
<li><strong>提交接口幂等</strong>：针对重复请求导致的重复落库，基于 Redis + Spring AOP 实现低侵入防重，保证同一业务键仅生效一次。</li>
<li><strong>多语言词法解析</strong>：以策略模式与工厂模式管理各语言解析器；通过 ThreadLocal 隔离请求资源，ConcurrentHashMap 复用解析对象，降低并发竞争。</li>
<li><strong>智能辅导</strong>：基于 Spring AI + RAG 接入题目 / 规则文档，自定义 Tools 完成题目查询与代码分析，并按会话生成结构化学习反馈报告。</li>
</ul>
<h3>技术栈</h3>
<ul>
<li><strong>语言</strong>：Java、Python、Go</li>
<li><strong>后端</strong>：Spring Boot / Cloud、MyBatis-Plus、FastAPI；JUC、JVM 基础</li>
<li><strong>数据</strong>：MySQL、Redis；对象存储、消息队列</li>
<li><strong>前端</strong>：TypeScript、Vue3、Vite、Pinia</li>
<li><strong>工程</strong>：Docker / Compose、Git、Jenkins；需求 → 设计 → 实现 → 发布</li>
<li><strong>AI</strong>：
<ul>
<li>工具：Cursor、Codex、Workbuddy</li>
<li>模型：Claude、DeepSeek、Qwen 等</li>
<li>工程：Spring AI、RAG、Tools / Agent；合入前人工复核</li>
</ul>
</li>
</ul>
<h3>时间线</h3>
<ul>
<li>2022年9月-2026年6月，就读凯里学院计算机科学与技术</li>
<li>2024年8月-2025年9月，主导校内编程实训平台</li>
<li>2025年7月-2025年11月，参与省 / 州级平台研发实习</li>
<li>2026年3月-至今，从事 AI 全栈研发；业余维护摸鱼猫泡泡，并持续更新 GitHub / 掘金</li>
</ul>
<h3>联系</h3>
<ul>
<li>微信：<code>jiang_byte</code>（备注「摸鱼猫泡泡」）</li>
<li>邮箱：<a href="mailto:jiangbytebiz@163.com" target="_blank" rel="noopener noreferrer">jiangbytebiz@163.com</a></li>
<li>GitHub：<a href="https://github.com/jiangbyte" target="_blank" rel="noopener noreferrer">jiangbyte</a></li>
<li>掘金：<a href="https://juejin.cn/user/1968540037686224" target="_blank" rel="noopener noreferrer">juejin.cn</a></li>
</ul>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
  <entry>
    <title type="text">关于本站</title>
    <id>https://jiangbyte.cn/about/site.html</id>
    <link href="https://jiangbyte.cn/about/site.html"/>
    <updated>2026-10-29T16:54:03.000Z</updated>
    <summary type="html"><![CDATA[
<p><strong>摸鱼猫泡泡</strong>是我自己搭的站点，仓库在 <a href="https://github.com/jiangbyte/code-guide" target="_blank" rel="noopener noreferrer">code-guide</a>，线上是 <a href="https://jiangbyte.cn" target="_blank" rel="noopener noreferrer">jiangbyte.cn</a>。用来放技术笔记、项目介绍和一点关于信息，方便以后自己翻，也给路过的人参考。</p>
<h3>定位</h3>
<p>我更想要一份能长期翻的笔记和作品说明，而不是资讯站或动态博客：</p>]]></summary>
    <content type="html"><![CDATA[
<p><strong>摸鱼猫泡泡</strong>是我自己搭的站点，仓库在 <a href="https://github.com/jiangbyte/code-guide" target="_blank" rel="noopener noreferrer">code-guide</a>，线上是 <a href="https://jiangbyte.cn" target="_blank" rel="noopener noreferrer">jiangbyte.cn</a>。用来放技术笔记、项目介绍和一点关于信息，方便以后自己翻，也给路过的人参考。</p>
<h3>定位</h3>
<p>我更想要一份能长期翻的笔记和作品说明，而不是资讯站或动态博客：</p>
<ul>
<li>笔记按系列归档，尽量写清背景、做法和结论</li>
<li>项目一文一介绍，写定位、能力和技术栈</li>
<li>内容用 Markdown，和站点工程放在同一仓库，改主题、改检索都方便</li>
</ul>
<h3>内容结构</h3>
<ul>
<li><strong>笔记</strong>（<code>/posts/</code>）：按系列看，目前有 Tools、Practice、Embedded、Ops 等</li>
<li><strong>源码阅读</strong>（<code>/source-reading/</code>）：按语言整理，目前有 Java（JDK 源码解析）</li>
<li><strong>数据库</strong>（<code>/database/</code>）：目前有 MySQL、Redis</li>
<li><strong>考研408</strong>（<code>/kaoyan-408/</code>）：计原、计网、数据结构、操作系统</li>
<li><strong>软考</strong>（<code>/soft-exam/</code>）：目前有高级架构设计师（系统架构设计师）</li>
<li><strong>职场与面试</strong>（<code>/career/</code>）：职场工作记录、面试经验</li>
<li><strong>项目</strong>（<code>/projects/</code>）：每个开源或个人作品一篇，导航和侧栏都能进</li>
<li><strong>泡泡</strong>（<code>/bubble/</code>）：拟人形象与三视图</li>
<li><strong>关于</strong>（<code>/about/</code>）：关于自己、关于本站</li>
</ul>
<p>站内可以全文搜索；笔记和项目页有目录、标签和阅读信息，方便定位。</p>
<h3>技术选型</h3>
<ul>
<li>静态站点：<a href="https://vuepress.vuejs.org/" target="_blank" rel="noopener noreferrer">VuePress</a>（Vite 打包）</li>
<li>主题：<a href="https://theme-hope.vuejs.press/" target="_blank" rel="noopener noreferrer">VuePress Theme Hope</a></li>
<li>内容能力：Markdown 扩展（提示容器、代码块、数学公式等）、Mermaid、全文检索等</li>
<li>工程：<code>pnpm</code>；本地 <code>pnpm docs:dev</code>，构建 <code>pnpm docs:build</code></li>
</ul>
<p>源码和配置在 GitHub；导航、侧栏和主题相关改动在 <code>docs/.vuepress/</code>。</p>
<h3>更新方式</h3>
<p>跟着工作和学习往里补：排查结论、工具用法、项目说明写进对应系列或项目文；样式和组件有需要再小步改。合入前我会本地预览并跑一遍构建。</p>
<h3>许可</h3>
<p>双许可，用内容或源码时请分开看：</p>
<ul>
<li><strong>文档内容</strong>（<code>docs/</code> 下 Markdown、配图等）：<a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener noreferrer">CC BY-NC 4.0</a> — 可引用、可改编，须署名并附来源，禁止商用</li>
<li><strong>站点源码</strong>（VuePress 配置、组件、工程文件等）：<a href="https://github.com/jiangbyte/code-guide/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">MIT</a></li>
</ul>
<h3>反馈</h3>
<p>有问题、勘误或想交流，走 <a href="/about/me.html" target="_blank">关于自己</a> 里的联系方式，或直接在 <a href="https://github.com/jiangbyte/code-guide" target="_blank" rel="noopener noreferrer">GitHub</a> 提 Issue。</p>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
  <entry>
    <title type="text">笔记</title>
    <id>https://jiangbyte.cn/posts/</id>
    <link href="https://jiangbyte.cn/posts/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>按系列沉淀技术笔记与踩坑记录，涵盖工具链、运维与工程实践。</p>
]]></summary>
    <content type="html"><![CDATA[<p>按系列沉淀技术笔记与踩坑记录，涵盖工具链、运维与工程实践。</p>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
  <entry>
    <title type="text">Integer 缓存机制（JDK 17 源码）</title>
    <id>https://jiangbyte.cn/source-reading/java/2026-10-01-Integer%20%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%EF%BC%88JDK%2017%20%E6%BA%90%E7%A0%81%EF%BC%89.html</id>
    <link href="https://jiangbyte.cn/source-reading/java/2026-10-01-Integer%20%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%EF%BC%88JDK%2017%20%E6%BA%90%E7%A0%81%EF%BC%89.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p><code>Integer</code> 的缓存不是业务层优化，而是 <strong>JLS 对自动装箱对象同一性</strong> 的硬要求：一定范围内的 <code>int</code> 装箱后必须是<strong>同一个</strong> <code>Integer</code> 实例。实现落在私有静态内部类 <code>Integer.IntegerCache</code>，对外入口是 <code>Integer.valueOf(int)</code>。下文依据 JDK 17 的 <code>java.lang.Integer</code> 源码展开。</p>
<h2>类上的 ValueBased</h2>]]></summary>
    <content type="html"><![CDATA[<p><code>Integer</code> 的缓存不是业务层优化，而是 <strong>JLS 对自动装箱对象同一性</strong> 的硬要求：一定范围内的 <code>int</code> 装箱后必须是<strong>同一个</strong> <code>Integer</code> 实例。实现落在私有静态内部类 <code>Integer.IntegerCache</code>，对外入口是 <code>Integer.valueOf(int)</code>。下文依据 JDK 17 的 <code>java.lang.Integer</code> 源码展开。</p>
<h2>类上的 ValueBased</h2>
<p>JDK 17 的 <code>Integer</code> 声明为：</p>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">jdk</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.internal.ValueBased</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> final</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Integer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Number</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Comparable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Constable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ConstantDesc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>@ValueBased</code> 提醒：这类对象更宜按<strong>值</strong>使用。缓存让小整数在引用层面也「碰巧」同一，但业务比较仍应以 <code>equals</code> / 拆箱后的 <code>int</code> 为准，不要把 <code>==</code> 当成通用相等判断。</p>
<h2>自动装箱实际调用 valueOf</h2>
<p>编译器对 <code>Integer a = 10;</code> 这类赋值会插入 <code>Integer.valueOf(10)</code>，不会走已废弃的构造器。完整验证如下（覆盖缓存边界、<code>new</code>、<code>equals</code>、抬高上界）：</p>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IntegerCacheVerify</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> static</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[] </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;                 </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 编译为 Integer.valueOf(10)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer c </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Integer.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">valueOf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"a == b (10): "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"a == c (10): "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> c));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer d </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 127</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer e </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 127</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"127 == : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (d </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> e));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer f </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer g </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"128 == : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (f </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> g));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"128 equals : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (f.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">equals</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(g)));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer h </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-128 == : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (h </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer j </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">129</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer k </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">129</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-129 == : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (j </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> k));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        @</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SuppressWarnings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"removal"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Integer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"new(10) == valueOf(10): "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Integer.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">valueOf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Integer q </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        System.out.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"1000 == : "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> q));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>默认参数运行：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">javac</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> IntegerCacheVerify.java</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">java</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> IntegerCacheVerify</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>输出：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>a == b (10): true</span></span>
<span class="line"><span>a == c (10): true</span></span>
<span class="line"><span>127 == : true</span></span>
<span class="line"><span>128 == : false</span></span>
<span class="line"><span>128 equals : true</span></span>
<span class="line"><span>-128 == : true</span></span>
<span class="line"><span>-129 == : false</span></span>
<span class="line"><span>new(10) == valueOf(10): false</span></span>
<span class="line"><span>1000 == : false</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>抬高缓存上界后再跑同一程序：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">java</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -XX:AutoBoxCacheMax=1000</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> IntegerCacheVerify</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>输出：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-text"><span class="line"><span>a == b (10): true</span></span>
<span class="line"><span>a == c (10): true</span></span>
<span class="line"><span>127 == : true</span></span>
<span class="line"><span>128 == : true</span></span>
<span class="line"><span>128 equals : true</span></span>
<span class="line"><span>-128 == : true</span></span>
<span class="line"><span>-129 == : false</span></span>
<span class="line"><span>new(10) == valueOf(10): false</span></span>
<span class="line"><span>1000 == : true</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>对照结论：</p>
<p>| 表达式 | 默认 | <code>AutoBoxCacheMax=1000</code> | 原因 |<br>
|</p>
]]></content>
    <category term="Java"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Object 源码解析（Oracle JDK 17）</title>
    <id>https://jiangbyte.cn/source-reading/java/2026-10-01-Object%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%EF%BC%88Oracle%20JDK%2017%EF%BC%89.html</id>
    <link href="https://jiangbyte.cn/source-reading/java/2026-10-01-Object%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%EF%BC%88Oracle%20JDK%2017%EF%BC%89.html"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p><code>java.lang.Object</code> 是 Java 类型体系的根：除它自身外，每个类（含数组类型）最终都继承它，因而它定义的方法构成「所有对象共有的最小行为集」<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>。下文依据本机 <strong>Oracle JDK 17.0.20.1</strong>（<code>$JAVA_HOME</code>=<code>/home/charlie/workspace/sdks/jdk-17</code>）自带源码包中的 <code>Object.java</code>，按成员出现顺序解析——侧重<strong>为何存在、契约与 HotSpot 如何支撑、工程上如何用</strong>；源码与本机实测用来锚定结论，而不是逐行注释。</p>]]></summary>
    <content type="html"><![CDATA[<p><code>java.lang.Object</code> 是 Java 类型体系的根：除它自身外，每个类（含数组类型）最终都继承它，因而它定义的方法构成「所有对象共有的最小行为集」[^object-src]。下文依据本机 <strong>Oracle JDK 17.0.20.1</strong>（<code>$JAVA_HOME</code>=<code>/home/charlie/workspace/sdks/jdk-17</code>）自带源码包中的 <code>Object.java</code>，按成员出现顺序解析——侧重<strong>为何存在、契约与 HotSpot 如何支撑、工程上如何用</strong>；源码与本机实测用来锚定结论，而不是逐行注释。</p>
<p>源码路径：<code>$JAVA_HOME/lib/src.zip</code> → <code>java.base/java/lang/Object.java</code>[^object-src]。</p>
<p>运行与验证：同一套 Oracle JDK；工程 <code>learning-lab/java/java17-sources</code> 中的 <code>ObjectLayoutVerify</code> / <code>ObjectMethodsVerify</code> / <code>ObjectMonitorVerify</code>[^lab]。</p>
<h2>类注释：根类型意味着什么</h2>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e"><pre class="shiki shiki-themes github-light github-dark vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Class {@code Object} is the root of the class hierarchy.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Every class has {@code Object} as a superclass. All objects,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * including arrays, implement the methods of this class.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@see</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     java.lang.Class</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@since</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   1.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>把「万物皆对象」落成语言规则，有三层后果：</p>
<ol>
<li><strong>统一多态入口</strong>：任意引用都能当成 <code>Object</code> 传递，集合、反射、序列化等基础设施才能写通用逻辑。</li>
<li><strong>共享行为面</strong>：相等、哈希、字符串表示、监视器等待/通知、浅拷贝入口都挂在根上，子类按需覆盖。</li>
<li><strong>数组也是对象</strong>：<code>int[]</code>、<code>String[]</code> 有独立的运行时 <code>Class</code>，同样具备上述方法；数组还对 <code>clone()</code> 有特殊约定（见后文）。</li>
</ol>
<p>JDK 17 这份 <code>Object.java</code> 里没有早期版本常见的 <code>registerNatives</code> 静态块；本地方法由 VM 侧绑定[^object-src]。这只是源文件形态上的事实，不影响对外 API。</p>
]]></content>
    <category term="Java"/>
    <published>2026-10-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">Java</title>
    <id>https://jiangbyte.cn/source-reading/java/</id>
    <link href="https://jiangbyte.cn/source-reading/java/"/>
    <updated>2026-10-29T14:54:42.000Z</updated>
    <summary type="html"><![CDATA[<p>Java 语言与 JDK 源码相关笔记，侧重契约、实现与工程用法。</p>
]]></summary>
    <content type="html"><![CDATA[<p>Java 语言与 JDK 源码相关笔记，侧重契约、实现与工程用法。</p>
]]></content>
    <published>2026-10-28T12:58:11.000Z</published>
  </entry>
</feed>