<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>文章 on 撷时录</title><link>https://jiangbyte.github.io/posts/index.html</link><description>Recent content in 文章 on 撷时录</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 07 Oct 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://jiangbyte.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Debian 13 友基 XP-Pen 数位板官方驱动与内核冲突排查固化</title><link>https://jiangbyte.github.io/p/debian-13-%E5%8F%8B%E5%9F%BA-xp-pen-%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</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/debian-13-%E5%8F%8B%E5%9F%BA-xp-pen-%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</guid><description>&lt;h2 id="环境"&gt;环境&lt;/h2&gt;&#10;&lt;p&gt;采集时间：2026-10-07。主机名 &lt;code&gt;dev&lt;/code&gt;。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;依据&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Debian GNU/Linux 13 (trixie)，&lt;code&gt;DEBIAN_VERSION_FULL=13.7&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/etc/os-release&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内核&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;6.12.111+deb13-amd64&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;uname -r&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;机型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HP ProBook 450 15.6 inch G9 Notebook PC&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/sys/class/dmi/id/product_name&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;会话&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;XDG_SESSION_TYPE=x11&lt;/code&gt;，&lt;code&gt;DISPLAY=:0&lt;/code&gt;，&lt;code&gt;XDG_CURRENT_DESKTOP=GNOME&lt;/code&gt;，&lt;code&gt;GDMSESSION=gnome-xorg&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;环境变量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;数位板 USB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Bus 003 Device 022: ID 28bd:0905 XP-Pen 10 inch PenTablet&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;lsusb&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sysfs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/sys/bus/usb/devices/3-4&lt;/code&gt;，&lt;code&gt;manufacturer=UGTABLET&lt;/code&gt;，&lt;code&gt;product=10 inch PenTablet&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;sysfs&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;驱动包&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ugeetablet 4.3&lt;/code&gt;（&lt;code&gt;Maintainer: tech@xp-pen.com&lt;/code&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dpkg -l&lt;/code&gt; / &lt;code&gt;apt-cache show&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装包文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/home/charlie/Downloads/ugeeTablet4.3.5-241031.deb&lt;/code&gt;（约 22MB，mtime 2026-10-07 19:36）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;驱动路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/usr/lib/ugeeTablet/{ugeeTabletDriver,ugeeTablet,ugeeTabletDriver.sh}&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文件系统&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;驱动配置目录&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;~/.config/Hanvon Ugee/ugee.conf&lt;/code&gt;（仅 LocalSocket 时间戳）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文件系统&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;相关已装包&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;xserver-xorg-input-wacom 1.2.3-1&lt;/code&gt;，&lt;code&gt;libwacom9&lt;/code&gt;，&lt;code&gt;libwacom-common&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dpkg -l&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;其它输入设备（配置未改）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内置键盘 &lt;code&gt;AT Translated Set 2 keyboard&lt;/code&gt;；&lt;code&gt;Newmen ... 2.4G Keyboard Mouse&lt;/code&gt;；&lt;code&gt;SEMICO USB Gaming Keyboard&lt;/code&gt;；触控板 &lt;code&gt;SYNA30E5:00 06CB:CEAC&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/sys/class/input/*/name&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;驱动 journal（2026-10-07 19:39:11）中的设备标识：&lt;/p&gt;</description></item><item><title>ACOJ在线评测平台-架构风格论文</title><link>https://jiangbyte.github.io/p/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</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/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</guid><description>&lt;h2 id="摘要"&gt;摘要&lt;/h2&gt;&#10;&lt;p&gt;2025 年 6 月至 2026 年 6 月，我参与了校园在线评测平台的研发。该项目的目标是建立一个面向教学与竞赛的在线训练系统，该平台旨在完成题目发布、程序提交与自动评测，为学生和教师提供练习、批改与运营管理等服务。我在该项目中担任系统架构师，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨软件架构风格在软件系统架构中的应用及其实现。&lt;/p&gt;&#10;&lt;p&gt;在构建该评测平台时，我们采用了分层组合的架构模式，执行层能够解释并运行用户程序，确保多种语言在统一规则下安全评测；而消息层则对评测任务进行异步分发，提供了低耦合的构件协作能力。这两层结构相互补充，使得平台既能满足高峰提交，又能进行在线维护与扩展。通过解释器对评测协议进行适配，结合消息中间件进行任务调度，我们成功打造了一个稳定可用的在线评测系统。通过这一实践，我们进一步验证了软件架构风格在现代软件系统架构中的重要性和实用性。&lt;/p&gt;&#10;&lt;p&gt;在我的带领下，项目实施的非常顺利，于 2026 年 6 月成功上线运行，并获得业主单位的一致好评。&lt;/p&gt;&#10;&lt;h2 id="正文"&gt;正文&lt;/h2&gt;&#10;&lt;p&gt;随着程序设计教学规模扩大和集中训练日益频繁，原有手工收作业、本机批改的方式已难以支撑并发提交和安全隔离。公司自 2025 年 3 月起开展需求调研，规划建设一套可扩展的在线评测平台。&lt;/p&gt;&#10;&lt;p&gt;2025 年 6 月我司受托建设本项目。本项目面向校园内网部署，我在项目中担任系统架构师职务，主要负责系统整体架构设计，该系统主要完成题目管理、程序提交、自动评测和运营维护，主要功能模块包括账号权限、题库管理、提交评测、执行调度、文件存储以及通知公告等。&lt;/p&gt;&#10;&lt;p&gt;在架构工作开始阶段，我们便意识到，架构风格是一组设计原则，是能够提供抽象框架模式，可以为我们的项目提供通用解决方案的，这种能够极大提高软件设计的重用的方法加快我们的建设进程，因此在我司总工程师的建议下，我们使用了解释器风格、独立构件隐式调用风格以及 B/S 风格这三种较常用风格。虚拟机风格中的解释器能够把多样的程序执行过程抽象为统一语义，这类风格非常适用于输入形式多、评测规则相对稳定的场景。独立构件风格包括显式调用与隐式调用，我们为了降低提交入口与评测执行之间的耦合采用了隐式调用，通过消息中间件控制系统间信息交互，不仅能削峰填谷，而且还提高了执行节点扩容和故障隔离的能力。B/S 是基于浏览器与服务器的软件架构，它主要使用超文本传输协议进行通信和交互，简化客户端分发的工作，最终减低了机房批量升级的难度，以下正文将重点描述架构风格的实施过程和效果。&lt;/p&gt;&#10;&lt;p&gt;底层架构我们使用解释器风格来满足多语言安全评测需求。解释器风格是虚拟机风格中的一种，具备良好的灵活性，在本项目中我们的架构设计需要兼容多种程序设计语言，一般来说这种软件编写难度非常高，代码维护难度压力也很大，因此这个解释器的设计任务便很明确了，软件设计需要高度抽象、协议的适配由配置文件来承担。具体的做法如下，我们对一次评测过程进行了高度抽象，由于一次评测由很多测试用例组成，每个测试用例容量固定并且标识和数据有明确规定，因此我们将题目中的语言限额和测试用例进行关系建模，将整体题目作为一个根节点，以测试用例作为根节点下的叶子节点，使用结构化配置映射成了题目、限额、用例这三层的数据结构，核心的代码采用模板解析与动态装载生成可执行对象，搭建一套可以基于可变模板的解释器，协议模板的产生可以由语言运行时说明和题目配置进行转换得到，解释器支持协议模板热部署，这种可以将用户程序和测试数据映射成统一的评测对象，将语言差异和数据协议的复杂度简化，后期评测规则更改不会对软件产生影响，仅仅更改协议模板文件即可，最终我们使用了若干份协议描述文件便兼容了这些复杂的语言与用例组合，规避了在业务系统中直接执行用户程序带来的技术风险。&lt;/p&gt;&#10;&lt;p&gt;中间层我们使用独立构件风格中的隐式调用来简化构件间的交互复杂度，降低系统耦合度。主要的实现手段是，我们采用了一个开源的消息中间件作为连接构件，这个构件是成熟的消息服务器，其性能和稳定性久经考验。由上文提到的解释器所需的对象化任务经过消息总线分发到各个订阅此消息的应用系统，这些应用系统包括提交服务、评测服务、重试服务等，这种多 web 应用的情况非常适合采用消息发布与消息订阅的机制，能够有效解决耦合问题，我们在编码的过程中发现只要采用这种风格的 web 应用，整个迭代过程效率极高，错误率降低，而且我们使用的配置化消息框架，消息队列的管理完全基于配置，清晰简单，维护性良好，例如评测任务主题、延迟重试主题、异常死信主题等消息队列分类清晰，可以随时修改其结构也能够随时增加其他主题的消息队列，不同的 web 系统监听的队列也可以随时变换组合，基于消息中间件的架构设计能够让系统的构件化思路得到良好实施，总体来说这种架构风格带来了非常清晰的数据流转架构，简化了编码难度，减低本项目的二次开发的难度。&lt;/p&gt;&#10;&lt;p&gt;应用系统层我们主要采用 B/S 的架构风格，主要用于解决终端分散、难以统一升级的问题。校园应用有一个明显的特点，机房、办公室和竞赛场地分布在不同楼宇，路途很远，且都是内网通讯，部分场所也是走的受控网络，一般是无法远程支持的，这给我们的系统推广以及后期维护带来了很大难题，我们可以想象如果使用 C/S 架构，更新客户端一旦遇到问题很可能需要运维把各机房跑一遍。这让我们在系统推广和维护方面面临较大压力。我们采用的 B/S 架构风格能够解决这个难题，并充分考量了现在相关技术的成熟度，例如现在的浏览器完全能够实现以前客户端的功能，项目中我们使用了大量的动态页面与脚本技术，能够满足在线编辑、结果查询和后台管理等需求。这种风格中页面和逻辑处理存储在 web 服务器上，维护和软件升级只要更新服务器端即可，及时生效，用户体验较好，例如界面上需要优化，改一下页面或者样式文件就可以马上看到效果了。&lt;/p&gt;&#10;&lt;p&gt;项目于 2026 年 6 月完成验收，这半年内共经历了三次大批量集中提交，这几次接入过程平稳顺利，其中协议解释器软件性能没有出现过问题，消息中间件的性能经过多次调优吞吐量也接近了磁盘与网络的承载上限，满足当前的消息交互总量，另外由于我们的项目多次在紧急状态下能够快速适应评测规则变动，得到过业主的邮件表扬。除了业主机房几次突发性的网络故障外，项目至今还未有重大的生产事故，项目组现在留 2 个开发人员和 1 个售后在维护，系统的维护量是可控的，系统运行也比较稳定。&lt;/p&gt;&#10;&lt;p&gt;不足之处有两个方面，第一在架构设计的过程中我们忽略了部分机房终端的兼容性，个别终端因为需要兼容老的应用软件不允许系统升级，这些终端系统老旧，其浏览器不支持现有页面技术，导致了系统推广障碍。第二在高可用方面还有待改善。针对第一种问题，我们通过沟通协商说服业主新购 PC，采用两台机器同时使用方式解决。针对第二种问题我方采用了多节点互备和服务接管等策略，在一台服务暂停的情况下，另外一台服务接管，以增加可用性。&lt;/p&gt;</description></item><item><title>第二章 计算机系统基础知识</title><link>https://jiangbyte.github.io/p/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%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</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%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</guid><description>&lt;h2 id="计算机系统概述"&gt;计算机系统概述&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;计算机系统 = 硬件 + 软件&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="solitude-tag tag-mermaid mermaid"&gt;graph TD&#10; Root[&amp;#34;计算机系统&amp;#34;]&#10;&#10; %% 硬件分支&#10; Root --&amp;gt; HW[&amp;#34;硬件&amp;#34;]&#10; HW --&amp;gt; CPU[&amp;#34;中央处理器&amp;#34;]&#10; CPU --&amp;gt; ALU[&amp;#34;运算单元&amp;#34;]&#10; CPU --&amp;gt; CU[&amp;#34;控制单元&amp;#34;]&#10;&#10; HW --&amp;gt; Mem[&amp;#34;存储器&amp;#34;]&#10; Mem --&amp;gt; MainMem[&amp;#34;主存(内存)&amp;#34;]&#10; Mem --&amp;gt; ExtMem[&amp;#34;外存&amp;#34;]&#10;&#10; HW --&amp;gt; InDev[&amp;#34;输入设备&amp;#34;]&#10; InDev --&amp;gt; Keyboard[&amp;#34;键盘&amp;#34;]&#10; InDev --&amp;gt; Mouse[&amp;#34;鼠标&amp;#34;]&#10; InDev --&amp;gt; InOther[&amp;#34;...&amp;#34;]&#10;&#10; HW --&amp;gt; OutDev[&amp;#34;输出设备&amp;#34;]&#10; OutDev --&amp;gt; Monitor[&amp;#34;显示器&amp;#34;]&#10; OutDev --&amp;gt; OutOther[&amp;#34;...&amp;#34;]&#10;&#10; %% 软件分支&#10; Root --&amp;gt; SW[&amp;#34;软件&amp;#34;]&#10; SW --&amp;gt; SysSW[&amp;#34;系统软件&amp;#34;]&#10; SysSW --&amp;gt; OS[&amp;#34;操作系统&amp;#34;]&#10; SysSW --&amp;gt; Compiler[&amp;#34;编译工具&amp;#34;]&#10; SysSW --&amp;gt; SysOther[&amp;#34;...&amp;#34;]&#10;&#10; SW --&amp;gt; AppSW[&amp;#34;应用软件&amp;#34;]&#10; AppSW --&amp;gt; Office[&amp;#34;办公软件&amp;#34;]&#10; AppSW --&amp;gt; Entertainment[&amp;#34;娱乐软件&amp;#34;]&#10; AppSW --&amp;gt; AppOther[&amp;#34;...&amp;#34;]&lt;/div&gt;&#10;&lt;p&gt;系统分类维度：&lt;/p&gt;</description></item><item><title>第三章 信息系统基础知识</title><link>https://jiangbyte.github.io/p/%E7%AC%AC%E4%B8%89%E7%AB%A0-%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</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E7%AC%AC%E4%B8%89%E7%AB%A0-%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</guid><description>&lt;p&gt;待定&lt;/p&gt;</description></item><item><title>论文</title><link>https://jiangbyte.github.io/p/%E8%AE%BA%E6%96%87.html</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E8%AE%BA%E6%96%87.html</guid><description>&lt;p&gt;用法：先定题目方向（架构风格、高可用、安全、性能、质量属性等），再填入同一项目。摘要三段、正文“背景—职责—总述三点—分点展开—验收—不足”，三点之间换方向只换论点，不换结构。【】内为必填，不要写具体表名、接口路径、框架版本。&lt;/p&gt;&#10;&lt;h2 id="摘要"&gt;摘要&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;【项目起止时间】，我参与了【项目名称】的研发。该项目的目标是建立一个【系统定位】，该平台旨在【核心功能】，为【业务对象】提供【业务目标】等服务。我在该项目中担任【角色】，全程参与了系统的分析规划和设计工作。本文以该项目为例，详细探讨【论文主题，如软件架构风格 / 高可用性设计 / 信息安全体系】在软件系统架构中的应用及其实现。&lt;/p&gt;&#10;&lt;p&gt;在构建【系统名称】时，我们采用了【总体方案，如分层组合 / 主备加集群 / 纵深防御】，【要点A】能够【作用A】，确保【价值A】；而【要点B】则对【对象B】进行【作用B】，提供了【价值B】。这两层结构相互补充，使得平台既能满足【需求A】，又能进行【需求B】。通过【手段A】进行【处理A】，结合【手段B】进行【处理B】，我们成功打造了一个【系统特性】的【系统类型】。通过这一实践，我们进一步验证了【论文主题】在现代软件系统架构中的重要性和实用性。&lt;/p&gt;&#10;&lt;p&gt;在我的带领下，项目实施的非常顺利，于【上线时间】成功上线运行，并获得【评价主体】的一致好评。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="正文"&gt;正文&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;随着【行业趋势或业务矛盾】，原有【旧做法】已难以支撑【新约束，如并发、安全、扩展】。公司自【年】年【月】月起【调研 / 立项准备】，规划【建设目标】。&lt;/p&gt;&#10;&lt;p&gt;【年】年【月】月我司受托建设本项目。本项目【部署与范围一句话】，我在项目中担任系统架构师职务，主要负责系统整体架构设计，该系统主要完成【业务能力】，主要功能模块包括【模块一】、【模块二】、【模块三】、【模块四】以及【模块五】等。&lt;/p&gt;&#10;&lt;p&gt;在架构工作开始阶段，我们便意识到，【论文主题对应的方法，如架构风格 / 质量属性策略】是一组设计原则，是能够提供抽象框架模式，可以为我们的项目提供通用解决方案的，这种能够极大提高软件设计的重用的方法加快我们的建设进程，因此在我司总工程师的建议下，我们使用了【论点一】、【论点二】以及【论点三】这三种较常用【风格 / 策略 / 措施】。【类别一】中的【论点一】能够【能力一】，这类方法非常适用于【适用场景】。【类别二】包括【子类A】与【子类B】，我们为了【设计目标】采用了【论点二】，通过【关键机制】控制系统间信息交互，不仅能【收益一】，而且还提高【收益二】。【论点三】是基于【基本形态】的软件架构，它主要使用【通信方式】进行通信和交互，简化【被简化的工作】，最终减低了【被降低的难度】，以下正文将重点描述【论文主题】的实施过程和效果。&lt;/p&gt;&#10;&lt;p&gt;底层（或第一方面）我们使用【论点一】来满足【需求一】。【论点一】是【所属类别】中的一种，具备【主要优点】，在本项目中我们的架构设计需要兼容【多变部分】，一般来说这种软件编写难度非常高，代码维护难度压力也很大，因此这个设计任务便很明确了，软件设计需要高度抽象、【变化点】的适配由配置来承担。具体的做法如下，我们对【核心对象】进行了高度抽象，由于【核心对象】由很多【组成单元】组成，每个【组成单元】容量固定并且标识和数据有明确规定，因此我们将【主体】中的【属性甲】和【属性乙】进行关系建模，将整体【主体】作为一个根节点，以【组成单元】作为根节点下的叶子节点，使用结构化配置映射成了【层次名称】这【层数】层的数据结构，核心的处理采用【解析 / 装载 / 调度】生成统一对象，搭建一套可以基于可变模板（或策略）的实现，模板或策略可由【来源】转换得到，并支持热更新。这种可以将【复杂输入】映射成统一对象的做法，将【差异点】的复杂度简化，后期规则更改不会对软件产生影响，仅仅更改配置即可，最终我们使用了若干份描述文件便兼容了这些复杂的【差异组合】，规避了【直接硬编码或危险做法】带来的技术风险。&lt;/p&gt;&#10;&lt;p&gt;中间层（或第二方面）我们使用【论点二】来简化【协作对象】间的交互复杂度，降低系统耦合度（或提升【目标质量属性】）。主要的实现手段是，我们采用了【中间件或机制】作为连接构件，这个构件【一句话定位】，其性能和稳定性久经考验。由上文处理得到的对象化数据经过【通道】分发到各个【订阅方 / 协作方】，这些应用系统包括【系统甲】、【系统乙】、【系统丙】等，这种多应用协作的情况非常适合采用【发布订阅 / 异步解耦 / 其他机制】，能够有效解决耦合问题，我们在编码的过程中发现只要采用这种方法，整个迭代过程效率极高，错误率降低，而且我们使用的配置化方式，管理完全基于配置，清晰简单，维护性良好，例如【通道甲】、【通道乙】、【通道丙】等分类清晰，可以随时修改其结构也能够随时增加其他通道，不同系统监听的范围也可以随时变换组合。总体来说这种方法带来了非常清晰的数据流转架构，简化了编码难度，减低本项目的二次开发的难度。&lt;/p&gt;&#10;&lt;p&gt;应用系统层（或第三方面）我们主要采用【论点三】，主要用于解决【推广或使用上的难题】。【业务场景】有一个明显的特点，【使用方】分布在【地理或组织范围】，路途很远，且都是【网络条件】，【部分场所】也是走的【受控网络】，一般是无法远程支持的，这给我们的系统推广以及后期维护带来了很大难题，我们可以想象如果使用【被否定的方案】，更新一旦遇到问题很可能需要【运维代价】。这让我们在系统推广和维护方面面临较大压力。我们采用的【论点三】能够解决这个难题，并充分考量了现在相关技术的成熟度，例如现在的【成熟技术】完全能够实现以前【旧方案】的功能，项目中我们使用了大量的【技术甲】与【技术乙】，能够满足【交互需求】等需求。这种做法中【变更集中位置】在服务器侧，维护和软件升级只要更新服务器端即可，及时生效，用户体验较好，例如界面或规则上需要优化，改一下【页面 / 配置 / 策略】就可以马上看到效果了。&lt;/p&gt;&#10;&lt;p&gt;项目于【年】年【月】月完成验收，这【时长】内共经历了【若干次业务高峰或变更】，这几次过程平稳顺利，其中【论点一对应部件】性能没有出现过问题，【论点二对应部件】经过多次调优也满足当前的交互总量，另外由于我们的项目多次在紧急状态下能够快速适应【规则或接口变动】，得到过业主的邮件表扬。除了业主侧几次突发性的网络故障外，项目至今还未有重大的生产事故，项目组现在留【n】个开发人员和【m】个售后在维护，系统的维护量是可控的，系统运行也比较稳定。&lt;/p&gt;&#10;&lt;p&gt;不足之处有两个方面，第一在架构设计的过程中我们忽略了【兼容性或范围遗漏】，个别【终端 / 子系统】因为需要兼容老的应用软件不允许系统升级，这些【对象】系统老旧，其【运行环境】不支持【新能力】，导致了系统推广障碍。第二在【高可用 / 性能 / 安全等另一质量属性】方面还有待改善。针对第一种问题，我们通过沟通协商说服业主【更换或隔离旧环境】，采用【过渡方案，如两套环境并存】方式解决。针对第二种问题我方采用了【措施甲】和【措施乙】等策略，在一台服务暂停的情况下，另外一台服务接管，以增加可用性。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>第一章 绪论</title><link>https://jiangbyte.github.io/p/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E7%BB%AA%E8%AE%BA.html</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E7%BB%AA%E8%AE%BA.html</guid><description>&lt;h2 id="系统架构概述"&gt;系统架构概述&lt;/h2&gt;&#10;&lt;p&gt;诺依曼系统计算机&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;计算机硬件&lt;/li&gt;&#10;&lt;li&gt;计算机软件&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="系统架构定义"&gt;系统架构定义&lt;/h2&gt;&#10;&lt;p&gt;定义：IEEE 1471-2000 标准&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;架构是体现在&lt;strong&gt;组件&lt;/strong&gt;中的一个系统的基本组织、它们彼此的&lt;strong&gt;关系&lt;/strong&gt;与&lt;strong&gt;环境&lt;/strong&gt;的关系及指导它的设计和发展的&lt;strong&gt;原则&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;架构设计的作用：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;解决相对复杂的需求分析问题&lt;/li&gt;&#10;&lt;li&gt;解决非功能属性在系统中占据重要位置的设计问题&lt;/li&gt;&#10;&lt;li&gt;解决生命周期长、扩展性需求高的系统整体结构问题&lt;/li&gt;&#10;&lt;li&gt;解决系统基于组件需要的集成问题&lt;/li&gt;&#10;&lt;li&gt;解决业务流程再造难的问题&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="软件架构发展历程"&gt;软件架构发展历程&lt;/h2&gt;&#10;&lt;div class="solitude-tag tag-mermaid mermaid"&gt;timeline&#10;&#9;title 软件架构发展历程&#10; 1968 : NATO 会议提出“软件架构”&#10; 1991 : Windton W.Royce、Waiker Royce 首次定义软件架构&#10; 1992 : Perry &amp;amp; Wolf 创造性阐述 {elements, forms, rationale} = software&#10; 1996 : 理论体系完善与发展阶段开始&#10; 1999 : 第一届 IFIP 软件架构会议&#10; 2000 : IEEE 1471-2000 标准发布，标志首次形式化定义&lt;/div&gt;&#10;&lt;div class="solitude-tag tag-mermaid mermaid"&gt;timeline&#10; title 软件架构发展&#10; 1968—1994 基础研究 : NATO 会议提出术语 : 模块化六大原则出现 : MIS 系统分层思想&#10; 1996—2000 概念体系和核心技术形成阶段 : 首次定义软件架构 : SAAM 实践方法体系 : IEEE 1471-2000 标准发布&#10; 1996—至今 理论体系完善与发展阶段开始 : 软件架构描述语言（C2SADL, Wright, ACME, UniCon, Rapide） : 分析方法（SAAM, ATAM, CBAM, SBAR, ALPSM, SAEM）&#10; 2000—至今 普及应用 : 软件架构描述语言 ADML（XML） : IFIP 会议、IFIP 工作组成立&lt;/div&gt;&#10;&lt;h2 id="模块化开发六大原则"&gt;模块化开发六大原则&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;最高模块内聚。也就是在一个模块内部的元素最大限度地关联，只实现一种功能的模块是高内聚的，具有三种以上功能的模块则是低内聚的。&lt;/li&gt;&#10;&lt;li&gt;最低耦合。也就是不同模块之间的关系尽可能弱，以利于软件的升级和扩展。&lt;/li&gt;&#10;&lt;li&gt;模块大小适度。颗粒过大会造成模块内部维护困难，而颗粒过小又会导致模块间的耦合增加。&lt;/li&gt;&#10;&lt;li&gt;模块调用链的深度（嵌套层次）不可过多。&lt;/li&gt;&#10;&lt;li&gt;接口简单、精炼（扇入扇出数不宜太大），具有信息隐蔽能力。&lt;/li&gt;&#10;&lt;li&gt;尽可能地复用已有模块&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="软件架构常用分类"&gt;软件架构常用分类&lt;/h2&gt;&#10;&lt;h3 id="分层架构"&gt;分层架构&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;四层结构：表现层、业务层、持久层、数据库层&lt;/li&gt;&#10;&lt;li&gt;最常见的软件架构，事实标准架构；用户的请求将依次通过这四层的处理，不能跳过其中任何一层&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e8%bd%af%e8%80%83/%e9%ab%98%e7%ba%a7%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e5%b8%88/assets/image-20261005191551470.png" alt="image-20261005191551470" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;</description></item><item><title>Typora 自定义 github-cus 主题：掘金行内代码与标题自动编号</title><link>https://jiangbyte.github.io/p/typora-%E8%87%AA%E5%AE%9A%E4%B9%89-github-cus-%E4%B8%BB%E9%A2%98%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</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/typora-%E8%87%AA%E5%AE%9A%E4%B9%89-github-cus-%E4%B8%BB%E9%A2%98%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</guid><description>&lt;p&gt;Typora 自带主题升级会覆盖，直接改 &lt;code&gt;github.css&lt;/code&gt; 不稳妥。做法是复制一份自定义主题 &lt;code&gt;github-cus&lt;/code&gt;，在上面改行内代码颜色，以及正文 / 大纲的标题自动编号。&lt;/p&gt;&#10;&lt;p&gt;本文环境：Linux，主题目录 &lt;code&gt;~/.config/Typora/themes/&lt;/code&gt;（Windows 一般在 &lt;code&gt;%APPDATA%\Typora\themes\&lt;/code&gt;，macOS 在 &lt;code&gt;~/Library/Application Support/abnerworks.Typora/themes/&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;h2 id="为什么要复制一份主题"&gt;为什么要复制一份主题&lt;/h2&gt;&#10;&lt;p&gt;主题目录里的 &lt;code&gt;Readme.md&lt;/code&gt; 写得很清楚：内置 CSS 更新或重装后会被替换，&lt;strong&gt;不要直接改内置主题&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;正确姿势见官方文档：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://support.typora.io/About-Themes/"&gt;About Themes&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://support.typora.io/Add-Custom-CSS/"&gt;Add Custom CSS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://support.typora.io/Auto-Numbering/"&gt;Auto Numbering&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;目标文件结构：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;~/.config/Typora/themes/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;├── github.css ← 内置，不动&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;├── github/ ← 内置字体，不动&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;├── github-cus.css ← 自定义主题入口&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;└── github-cus/ ← 字体资源（从 github/ 复制）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;~/.config/Typora/themes/&#10;├── github.css ← 内置，不动&#10;├── github/ ← 内置字体，不动&#10;├── github-cus.css ← 自定义主题入口&#10;└── github-cus/ ← 字体资源（从 github/ 复制）&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;Typora 主题名取自 CSS 文件名：&lt;code&gt;github-cus.css&lt;/code&gt; → 主题选择器里一般显示为 &lt;strong&gt;Github Cus&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Docker 本机基础设施执行命令</title><link>https://jiangbyte.github.io/p/docker-%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</link><pubDate>Sat, 03 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/docker-%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</guid><description>&lt;h2 id="拉取镜像"&gt;拉取镜像&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== MySQL 9.7.2 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/library/mysql:9.7.2&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/library/mysql:9.7.2 library/mysql:9.7.2&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/library/mysql:9.7.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Redis 8.8.2 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/library/redis:8.8.2&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/library/redis:8.8.2 library/redis:8.8.2&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/library/redis:8.8.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Silo (MinIO 变体) =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z pgsty/silo:RELEASE.2026-08-06T00-00-00Z&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== RabbitMQ 4.2.9-management =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/library/rabbitmq:4.2.9-management&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/library/rabbitmq:4.2.9-management library/rabbitmq:4.2.9-management&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/library/rabbitmq:4.2.9-management&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Ollama 0.33.1 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/ollama/ollama:0.33.1&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/ollama/ollama:0.33.1 ollama/ollama:0.33.1&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/ollama/ollama:0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;docker pull pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12&lt;span class="p"&gt;;&lt;/span&gt; docker tag pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12 quay.io/coreos/etcd:v3.6.12&lt;span class="p"&gt;;&lt;/span&gt; docker rmi pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;docker pull docker.xuanyuan.run/zilliz/attu:v3.0.0&lt;span class="p"&gt;;&lt;/span&gt; docker tag docker.xuanyuan.run/zilliz/attu:v3.0.0 zilliz/attu:v3.0.0&lt;span class="p"&gt;;&lt;/span&gt; docker rmi docker.xuanyuan.run/zilliz/attu:v3.0.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;# ===== MySQL 9.7.2 =====&#10;docker pull docker.xuanyuan.run/library/mysql:9.7.2; docker tag docker.xuanyuan.run/library/mysql:9.7.2 library/mysql:9.7.2; docker rmi docker.xuanyuan.run/library/mysql:9.7.2&#10;&#10;# ===== Redis 8.8.2 =====&#10;docker pull docker.xuanyuan.run/library/redis:8.8.2; docker tag docker.xuanyuan.run/library/redis:8.8.2 library/redis:8.8.2; docker rmi docker.xuanyuan.run/library/redis:8.8.2&#10;&#10;# ===== Silo (MinIO 变体) =====&#10;docker pull docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z; docker tag docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z pgsty/silo:RELEASE.2026-08-06T00-00-00Z; docker rmi docker.xuanyuan.run/pgsty/silo:RELEASE.2026-08-06T00-00-00Z&#10;&#10;# ===== RabbitMQ 4.2.9-management =====&#10;docker pull docker.xuanyuan.run/library/rabbitmq:4.2.9-management; docker tag docker.xuanyuan.run/library/rabbitmq:4.2.9-management library/rabbitmq:4.2.9-management; docker rmi docker.xuanyuan.run/library/rabbitmq:4.2.9-management&#10;&#10;# ===== Ollama 0.33.1 =====&#10;docker pull docker.xuanyuan.run/ollama/ollama:0.33.1; docker tag docker.xuanyuan.run/ollama/ollama:0.33.1 ollama/ollama:0.33.1; docker rmi docker.xuanyuan.run/ollama/ollama:0.33.1&#10;&#10;&#10;docker pull pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12; docker tag pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12 quay.io/coreos/etcd:v3.6.12; docker rmi pgexh7a70kca8kgghn-quay.xuanyuan.run/coreos/etcd:v3.6.12&#10;&#10;&#10;docker pull docker.xuanyuan.run/zilliz/attu:v3.0.0; docker tag docker.xuanyuan.run/zilliz/attu:v3.0.0 zilliz/attu:v3.0.0; docker rmi docker.xuanyuan.run/zilliz/attu:v3.0.0&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="运行命令"&gt;运行命令&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== MySQL 9.7.2（开机自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; -p 3306:3306 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/mysql:/var/lib/mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; mysql:9.7.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Redis 8.8.2（开机自启 + AOF）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 10&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name redis &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 11&lt;/span&gt;&lt;span class="cl"&gt; -p 6379:6379 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 12&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REDIS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 13&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/redis:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 14&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 15&lt;/span&gt;&lt;span class="cl"&gt; redis:8.8.2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 16&lt;/span&gt;&lt;span class="cl"&gt; --requirepass &lt;span class="s2"&gt;&amp;#34;infra123!&amp;#34;&lt;/span&gt; --appendonly yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 17&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 18&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== MySQL 9.7.2（开机不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 20&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 21&lt;/span&gt;&lt;span class="cl"&gt; -p 3306:3306 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 22&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 23&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/mysql:/var/lib/mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 24&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 25&lt;/span&gt;&lt;span class="cl"&gt; mysql:9.7.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 26&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Redis 8.8.2（开机不自启 + AOF）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 28&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name redis &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 29&lt;/span&gt;&lt;span class="cl"&gt; -p 6379:6379 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 30&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REDIS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 31&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/redis:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 32&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 33&lt;/span&gt;&lt;span class="cl"&gt; redis:8.8.2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 34&lt;/span&gt;&lt;span class="cl"&gt; --requirepass &lt;span class="s2"&gt;&amp;#34;infra123!&amp;#34;&lt;/span&gt; --appendonly yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 35&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 36&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 37&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Silo (MinIO 变体) =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 38&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name silo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 39&lt;/span&gt;&lt;span class="cl"&gt; -p 9000:9000 -p 9001:9001 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 40&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 41&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 42&lt;/span&gt;&lt;span class="cl"&gt; -v silo_data:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 43&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 44&lt;/span&gt;&lt;span class="cl"&gt; pgsty/silo:RELEASE.2026-08-06T00-00-00Z &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 45&lt;/span&gt;&lt;span class="cl"&gt; server /data --console-address &lt;span class="s2"&gt;&amp;#34;:9001&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 46&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 47&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 48&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Silo（默认不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 49&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name silo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 50&lt;/span&gt;&lt;span class="cl"&gt; -p 9000:9000 -p 9001:9001 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 51&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 52&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 53&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/silo:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 54&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 55&lt;/span&gt;&lt;span class="cl"&gt; pgsty/silo:RELEASE.2026-08-06T00-00-00Z &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 56&lt;/span&gt;&lt;span class="cl"&gt; server /data --console-address &lt;span class="s2"&gt;&amp;#34;:9001&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 57&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 58&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== RabbitMQ 4.2.9-management =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 59&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name rabbitmq &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 60&lt;/span&gt;&lt;span class="cl"&gt; -p 5672:5672 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 61&lt;/span&gt;&lt;span class="cl"&gt; -p 15672:15672 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 62&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;RABBITMQ_DEFAULT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 63&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;RABBITMQ_DEFAULT_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 64&lt;/span&gt;&lt;span class="cl"&gt; -v rabbitmq_data:/var/lib/rabbitmq &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 65&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 66&lt;/span&gt;&lt;span class="cl"&gt; rabbitmq:4.2.9-management&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 67&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 68&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Ollama 0.33.1 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 69&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 70&lt;/span&gt;&lt;span class="cl"&gt; -p 11434:11434 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 71&lt;/span&gt;&lt;span class="cl"&gt; -v ollama_data:/root/.ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 72&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 73&lt;/span&gt;&lt;span class="cl"&gt; ollama/ollama:0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 74&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 75&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Ollama 0.33.1 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 76&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 77&lt;/span&gt;&lt;span class="cl"&gt; -p 11434:11434 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 78&lt;/span&gt;&lt;span class="cl"&gt; -v ollama_data:/root/.ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 79&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 80&lt;/span&gt;&lt;span class="cl"&gt; ollama/ollama:0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 81&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 82&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Draw.io 31.4.1 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 83&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name draw &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 84&lt;/span&gt;&lt;span class="cl"&gt; -p 18080:8080 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 85&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 86&lt;/span&gt;&lt;span class="cl"&gt; jgraph/drawio:31.4.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 87&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 88&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name drawio &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 89&lt;/span&gt;&lt;span class="cl"&gt; -p 18080:8080 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 90&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 91&lt;/span&gt;&lt;span class="cl"&gt; jgraph/drawio:31.4.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 92&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 93&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Nacos 2.5.0 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 94&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name nacos &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 95&lt;/span&gt;&lt;span class="cl"&gt; -p 8848:8848 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 96&lt;/span&gt;&lt;span class="cl"&gt; -p 9848:9848 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 97&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 98&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;standalone &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 99&lt;/span&gt;&lt;span class="cl"&gt; nacos/nacos-server:v2.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;100&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;101&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;102&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;103&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name nginx &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;104&lt;/span&gt;&lt;span class="cl"&gt; -p 8080:80 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;105&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/ngnix/conf/nginx.conf:/etc/nginx/nginx.conf:ro &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;106&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/ngnix/conf/conf.d:/etc/nginx/conf.d:ro &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;107&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/ngnix/html:/usr/share/nginx/html:ro &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;108&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/ngnix/logs:/var/log/nginx &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;109&lt;/span&gt;&lt;span class="cl"&gt; -v /home/charlie/Workspace/datas/ngnix/ssl:/etc/nginx/ssl:ro &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;110&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;111&lt;/span&gt;&lt;span class="cl"&gt; nginx:stable-alpine3.24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;# ===== MySQL 9.7.2（开机自启）=====&#10;docker run -d --name mysql \&#10; -p 3306:3306 \&#10; -e MYSQL_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v /home/charlie/Workspace/datas/mysql:/var/lib/mysql \&#10; --restart unless-stopped \&#10; mysql:9.7.2&#10;&#10;# ===== Redis 8.8.2（开机自启 + AOF）=====&#10;docker run -d --name redis \&#10; -p 6379:6379 \&#10; -e REDIS_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v /home/charlie/Workspace/datas/redis:/data \&#10; --restart unless-stopped \&#10; redis:8.8.2 \&#10; --requirepass &amp;#34;infra123!&amp;#34; --appendonly yes&#10;&#10;&#10;# ===== MySQL 9.7.2（开机不自启）=====&#10;docker run -d --name mysql \&#10; -p 3306:3306 \&#10; -e MYSQL_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v /home/charlie/Workspace/datas/mysql:/var/lib/mysql \&#10; --restart no \&#10; mysql:9.7.2&#10;&#10;# ===== Redis 8.8.2（开机不自启 + AOF）=====&#10;docker run -d --name redis \&#10; -p 6379:6379 \&#10; -e REDIS_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v /home/charlie/Workspace/datas/redis:/data \&#10; --restart no \&#10; redis:8.8.2 \&#10; --requirepass &amp;#34;infra123!&amp;#34; --appendonly yes&#10;&#10;&#10;# ===== Silo (MinIO 变体) =====&#10;docker run -d --name silo \&#10; -p 9000:9000 -p 9001:9001 \&#10; -e MINIO_ROOT_USER=admin \&#10; -e MINIO_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v silo_data:/data \&#10; --restart unless-stopped \&#10; pgsty/silo:RELEASE.2026-08-06T00-00-00Z \&#10; server /data --console-address &amp;#34;:9001&amp;#34;&#10; &#10; &#10;# ===== Silo（默认不自启）=====&#10;docker run -d --name silo \&#10; -p 9000:9000 -p 9001:9001 \&#10; -e MINIO_ROOT_USER=admin \&#10; -e MINIO_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v /home/charlie/Workspace/datas/silo:/data \&#10; --restart no \&#10; pgsty/silo:RELEASE.2026-08-06T00-00-00Z \&#10; server /data --console-address &amp;#34;:9001&amp;#34;&#10;&#10;# ===== RabbitMQ 4.2.9-management =====&#10;docker run -d --name rabbitmq \&#10; -p 5672:5672 \&#10; -p 15672:15672 \&#10; -e RABBITMQ_DEFAULT_USER=admin \&#10; -e RABBITMQ_DEFAULT_PASS=&amp;#39;infra123!&amp;#39; \&#10; -v rabbitmq_data:/var/lib/rabbitmq \&#10; --restart no \&#10; rabbitmq:4.2.9-management&#10;&#10;# ===== Ollama 0.33.1 =====&#10;docker run -d --name ollama \&#10; -p 11434:11434 \&#10; -v ollama_data:/root/.ollama \&#10; --restart unless-stopped \&#10; ollama/ollama:0.33.1&#10;&#10;# ===== Ollama 0.33.1 =====&#10;docker run -d --name ollama \&#10; -p 11434:11434 \&#10; -v ollama_data:/root/.ollama \&#10; --restart no \&#10; ollama/ollama:0.33.1&#10; &#10;# ===== Draw.io 31.4.1 =====&#10;docker run -d --name draw \&#10; -p 18080:8080 \&#10; --restart unless-stopped \&#10; jgraph/drawio:31.4.1&#10; &#10;docker run -d --name drawio \&#10; -p 18080:8080 \&#10; --restart no \&#10; jgraph/drawio:31.4.2&#10; &#10;# ===== Nacos 2.5.0 =====&#10;docker run -d --name nacos \&#10; -p 8848:8848 \&#10; -p 9848:9848 \&#10; --restart unless-stopped \&#10; -e MODE=standalone \&#10; nacos/nacos-server:v2.5.0&#10; &#10; &#10; &#10;docker run -d --name nginx \&#10; -p 8080:80 \&#10; -v /home/charlie/Workspace/datas/ngnix/conf/nginx.conf:/etc/nginx/nginx.conf:ro \&#10; -v /home/charlie/Workspace/datas/ngnix/conf/conf.d:/etc/nginx/conf.d:ro \&#10; -v /home/charlie/Workspace/datas/ngnix/html:/usr/share/nginx/html:ro \&#10; -v /home/charlie/Workspace/datas/ngnix/logs:/var/log/nginx \&#10; -v /home/charlie/Workspace/datas/ngnix/ssl:/etc/nginx/ssl:ro \&#10; --restart no \&#10; nginx:stable-alpine3.24&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="运行命令-1"&gt;运行命令&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== MySQL 9.7.2（开机不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; -p 3306:3306 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; -v mysql_data:/var/lib/mysql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; mysql:9.7.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Redis 8.8.2（开机不自启 + AOF）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 10&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name redis &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 11&lt;/span&gt;&lt;span class="cl"&gt; -p 6379:6379 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 12&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REDIS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 13&lt;/span&gt;&lt;span class="cl"&gt; -v redis_data:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 14&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 15&lt;/span&gt;&lt;span class="cl"&gt; redis:8.8.2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 16&lt;/span&gt;&lt;span class="cl"&gt; --requirepass &lt;span class="s2"&gt;&amp;#34;infra123!&amp;#34;&lt;/span&gt; --appendonly yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 17&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Silo（默认不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 19&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name silo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 20&lt;/span&gt;&lt;span class="cl"&gt; -p 9000:9000 -p 9001:9001 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 21&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 22&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 23&lt;/span&gt;&lt;span class="cl"&gt; -v silo_data:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 24&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 25&lt;/span&gt;&lt;span class="cl"&gt; pgsty/silo:RELEASE.2026-08-06T00-00-00Z &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 26&lt;/span&gt;&lt;span class="cl"&gt; server /data --console-address &lt;span class="s2"&gt;&amp;#34;:9001&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 27&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 28&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== RabbitMQ 4.2.9-management =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 29&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name rabbitmq &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 30&lt;/span&gt;&lt;span class="cl"&gt; -p 5672:5672 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 31&lt;/span&gt;&lt;span class="cl"&gt; -p 15672:15672 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 32&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;RABBITMQ_DEFAULT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 33&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;RABBITMQ_DEFAULT_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 34&lt;/span&gt;&lt;span class="cl"&gt; -v rabbitmq_data:/var/lib/rabbitmq &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 35&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 36&lt;/span&gt;&lt;span class="cl"&gt; rabbitmq:4.2.9-management&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 37&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 38&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Ollama 0.33.1 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 39&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 40&lt;/span&gt;&lt;span class="cl"&gt; -p 11434:11434 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 41&lt;/span&gt;&lt;span class="cl"&gt; -v ollama_data:/root/.ollama &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 42&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 43&lt;/span&gt;&lt;span class="cl"&gt; ollama/ollama:0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 44&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 45&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name drawio &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 46&lt;/span&gt;&lt;span class="cl"&gt; -p 18080:8080 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 47&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 48&lt;/span&gt;&lt;span class="cl"&gt; jgraph/drawio:31.4.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 49&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 50&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Nacos 2.5.0 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 51&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name nacos &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 52&lt;/span&gt;&lt;span class="cl"&gt; -p 8848:8848 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 53&lt;/span&gt;&lt;span class="cl"&gt; -p 9848:9848 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 54&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 55&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;standalone &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 56&lt;/span&gt;&lt;span class="cl"&gt; nacos/nacos-server:v2.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 57&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 58&lt;/span&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 59&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Milvus 前置：命名卷写入 etcd 配置 =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 60&lt;/span&gt;&lt;span class="cl"&gt;docker volume create milvus_data&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 61&lt;/span&gt;&lt;span class="cl"&gt;docker run --rm -v milvus_data:/var/lib/milvus alpine sh -c &lt;span class="s1"&gt;&amp;#39;cat &amp;gt; /var/lib/milvus/embedEtcd.yaml &amp;lt;&amp;lt; EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 62&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;listen-client-urls: http://0.0.0.0:2379&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 63&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;advertise-client-urls: http://0.0.0.0:2379&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 64&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;quota-backend-bytes: 4294967296&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 65&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;auto-compaction-mode: revision&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 66&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;auto-compaction-retention: &amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1000&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 67&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;EOF&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 68&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Milvus（开机不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 69&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name milvus &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 70&lt;/span&gt;&lt;span class="cl"&gt; --pull&lt;span class="o"&gt;=&lt;/span&gt;never &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 71&lt;/span&gt;&lt;span class="cl"&gt; --security-opt seccomp:unconfined &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 72&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ETCD_USE_EMBED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 73&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ETCD_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/milvus/etcd &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 74&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ETCD_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/milvus/embedEtcd.yaml &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 75&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;COMMON_STORAGETYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 76&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DEPLOY_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;STANDALONE &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 77&lt;/span&gt;&lt;span class="cl"&gt; -v milvus_data:/var/lib/milvus &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 78&lt;/span&gt;&lt;span class="cl"&gt; -p 19530:19530 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 79&lt;/span&gt;&lt;span class="cl"&gt; -p 9091:9091 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 80&lt;/span&gt;&lt;span class="cl"&gt; -p 2379:2379 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 81&lt;/span&gt;&lt;span class="cl"&gt; --health-cmd&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl -f http://localhost:9091/healthz&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 82&lt;/span&gt;&lt;span class="cl"&gt; --health-interval&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 83&lt;/span&gt;&lt;span class="cl"&gt; --health-start-period&lt;span class="o"&gt;=&lt;/span&gt;90s &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 84&lt;/span&gt;&lt;span class="cl"&gt; --health-timeout&lt;span class="o"&gt;=&lt;/span&gt;20s &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 85&lt;/span&gt;&lt;span class="cl"&gt; --health-retries&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 86&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 87&lt;/span&gt;&lt;span class="cl"&gt; milvusdb/milvus:v3.0.1 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 88&lt;/span&gt;&lt;span class="cl"&gt; milvus run standalone&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 89&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== 开启鉴权，并把 root 密码改为 infra123! =====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 90&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; milvus sh -c &lt;span class="s1"&gt;&amp;#39;cat &amp;gt; /milvus/configs/user.yaml &amp;lt;&amp;lt; EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 91&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;common:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 92&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; security:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 93&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; authorizationEnabled: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 94&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;EOF&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 95&lt;/span&gt;&lt;span class="cl"&gt;docker restart milvus&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 96&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 等 healthy 后执行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 97&lt;/span&gt;&lt;span class="cl"&gt;curl -sS -X POST &lt;span class="s2"&gt;&amp;#34;http://127.0.0.1:19530/v2/vectordb/users/update_password&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 98&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer root:Milvus&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 99&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;100&lt;/span&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;userName&amp;#34;:&amp;#34;root&amp;#34;,&amp;#34;password&amp;#34;:&amp;#34;Milvus&amp;#34;,&amp;#34;newPassword&amp;#34;:&amp;#34;infra123!&amp;#34;}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;101&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ===== Attu（开机不自启）=====&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;102&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name attu &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;103&lt;/span&gt;&lt;span class="cl"&gt; --pull&lt;span class="o"&gt;=&lt;/span&gt;never &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;104&lt;/span&gt;&lt;span class="cl"&gt; -p 8000:3000 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;105&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;MILVUS_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://host.docker.internal:19530 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;106&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ATTU_ADMIN_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;107&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;ATTU_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;infra123!&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;108&lt;/span&gt;&lt;span class="cl"&gt; -v attu_data:/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;109&lt;/span&gt;&lt;span class="cl"&gt; --add-host&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;110&lt;/span&gt;&lt;span class="cl"&gt; --restart no &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;111&lt;/span&gt;&lt;span class="cl"&gt; zilliz/attu:v3.0.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;# ===== MySQL 9.7.2（开机不自启）=====&#10;docker run -d --name mysql \&#10; -p 3306:3306 \&#10; -e MYSQL_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v mysql_data:/var/lib/mysql \&#10; --restart no \&#10; mysql:9.7.2&#10;&#10;# ===== Redis 8.8.2（开机不自启 + AOF）=====&#10;docker run -d --name redis \&#10; -p 6379:6379 \&#10; -e REDIS_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v redis_data:/data \&#10; --restart no \&#10; redis:8.8.2 \&#10; --requirepass &amp;#34;infra123!&amp;#34; --appendonly yes&#10;&#10;# ===== Silo（默认不自启）=====&#10;docker run -d --name silo \&#10; -p 9000:9000 -p 9001:9001 \&#10; -e MINIO_ROOT_USER=admin \&#10; -e MINIO_ROOT_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v silo_data:/data \&#10; --restart no \&#10; pgsty/silo:RELEASE.2026-08-06T00-00-00Z \&#10; server /data --console-address &amp;#34;:9001&amp;#34;&#10;&#10;# ===== RabbitMQ 4.2.9-management =====&#10;docker run -d --name rabbitmq \&#10; -p 5672:5672 \&#10; -p 15672:15672 \&#10; -e RABBITMQ_DEFAULT_USER=admin \&#10; -e RABBITMQ_DEFAULT_PASS=&amp;#39;infra123!&amp;#39; \&#10; -v rabbitmq_data:/var/lib/rabbitmq \&#10; --restart no \&#10; rabbitmq:4.2.9-management&#10;&#10;# ===== Ollama 0.33.1 =====&#10;docker run -d --name ollama \&#10; -p 11434:11434 \&#10; -v ollama_data:/root/.ollama \&#10; --restart no \&#10; ollama/ollama:0.33.1&#10;&#10;docker run -d --name drawio \&#10; -p 18080:8080 \&#10; --restart no \&#10; jgraph/drawio:31.4.6&#10; &#10;# ===== Nacos 2.5.0 =====&#10;docker run -d --name nacos \&#10; -p 8848:8848 \&#10; -p 9848:9848 \&#10; --restart unless-stopped \&#10; -e MODE=standalone \&#10; nacos/nacos-server:v2.5.0&#10; &#10; &#10;# ===== Milvus 前置：命名卷写入 etcd 配置 =====&#10;docker volume create milvus_data&#10;docker run --rm -v milvus_data:/var/lib/milvus alpine sh -c &amp;#39;cat &amp;gt; /var/lib/milvus/embedEtcd.yaml &amp;lt;&amp;lt; EOF&#10;listen-client-urls: http://0.0.0.0:2379&#10;advertise-client-urls: http://0.0.0.0:2379&#10;quota-backend-bytes: 4294967296&#10;auto-compaction-mode: revision&#10;auto-compaction-retention: &amp;#39;\&amp;#39;&amp;#39;1000&amp;#39;\&amp;#39;&amp;#39;&#10;EOF&amp;#39;&#10;# ===== Milvus（开机不自启）=====&#10;docker run -d --name milvus \&#10; --pull=never \&#10; --security-opt seccomp:unconfined \&#10; -e ETCD_USE_EMBED=true \&#10; -e ETCD_DATA_DIR=/var/lib/milvus/etcd \&#10; -e ETCD_CONFIG_PATH=/var/lib/milvus/embedEtcd.yaml \&#10; -e COMMON_STORAGETYPE=local \&#10; -e DEPLOY_MODE=STANDALONE \&#10; -v milvus_data:/var/lib/milvus \&#10; -p 19530:19530 \&#10; -p 9091:9091 \&#10; -p 2379:2379 \&#10; --health-cmd=&amp;#34;curl -f http://localhost:9091/healthz&amp;#34; \&#10; --health-interval=30s \&#10; --health-start-period=90s \&#10; --health-timeout=20s \&#10; --health-retries=3 \&#10; --restart no \&#10; milvusdb/milvus:v3.0.1 \&#10; milvus run standalone&#10;# ===== 开启鉴权，并把 root 密码改为 infra123! =====&#10;docker exec milvus sh -c &amp;#39;cat &amp;gt; /milvus/configs/user.yaml &amp;lt;&amp;lt; EOF&#10;common:&#10; security:&#10; authorizationEnabled: true&#10;EOF&amp;#39;&#10;docker restart milvus&#10;# 等 healthy 后执行&#10;curl -sS -X POST &amp;#34;http://127.0.0.1:19530/v2/vectordb/users/update_password&amp;#34; \&#10; -H &amp;#34;Authorization: Bearer root:Milvus&amp;#34; \&#10; -H &amp;#34;Content-Type: application/json&amp;#34; \&#10; -d &amp;#39;{&amp;#34;userName&amp;#34;:&amp;#34;root&amp;#34;,&amp;#34;password&amp;#34;:&amp;#34;Milvus&amp;#34;,&amp;#34;newPassword&amp;#34;:&amp;#34;infra123!&amp;#34;}&amp;#39;&#10;# ===== Attu（开机不自启）=====&#10;docker run -d --name attu \&#10; --pull=never \&#10; -p 8000:3000 \&#10; -e MILVUS_URL=http://host.docker.internal:19530 \&#10; -e ATTU_ADMIN_USER=admin \&#10; -e ATTU_ADMIN_PASSWORD=&amp;#39;infra123!&amp;#39; \&#10; -v attu_data:/data \&#10; --add-host=host.docker.internal:host-gateway \&#10; --restart no \&#10; zilliz/attu:v3.0.0&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;</description></item><item><title>01-Markdown特性完整测试</title><link>https://jiangbyte.github.io/p/01-markdown%E7%89%B9%E6%80%A7%E5%AE%8C%E6%95%B4%E6%B5%8B%E8%AF%95.html</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/01-markdown%E7%89%B9%E6%80%A7%E5%AE%8C%E6%95%B4%E6%B5%8B%E8%AF%95.html</guid><description>&lt;p&gt;本文用于一次性冒烟：&lt;strong&gt;标准 Markdown&lt;/strong&gt;、&lt;strong&gt;GFM 扩展&lt;/strong&gt;、&lt;strong&gt;代码块（含高亮行）&lt;/strong&gt;、&lt;strong&gt;Mermaid fence&lt;/strong&gt;、&lt;strong&gt;数学公式&lt;/strong&gt;，以及本站常用的 &lt;strong&gt;Solitude shortcode&lt;/strong&gt;。改主题或自定义 CSS 后，打开本页扫一眼即可。&lt;/p&gt;&#10;&#10;&#10;&#10;&#10; &#10;&#10;&lt;aside class="solitude-tag note info flat no-icon has-icon"&gt;&#10; &lt;span class="note-icon" aria-hidden="true"&gt;&lt;i class="fas fa-circle-info"&gt;&lt;/i&gt;&lt;/span&gt;&#10; &lt;div class="note-content"&gt;这是站点本地测试文，路径：&lt;code&gt;content/posts/其它/01-Markdown特性完整测试.md&lt;/code&gt;。部署时由 &lt;code&gt;sync_notes.py&lt;/code&gt; 保留，不会被 Notes 同步冲掉。&lt;/div&gt;&#10;&lt;/aside&gt;&#10;&#10;&lt;h2 id="1-标题层级"&gt;1. 标题层级&lt;/h2&gt;&#10;&lt;p&gt;下面从 &lt;code&gt;##&lt;/code&gt; 到 &lt;code&gt;######&lt;/code&gt;（页面标题已占用 &lt;code&gt;h1&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;h3 id="11-三级标题-h3"&gt;1.1 三级标题 H3&lt;/h3&gt;&#10;&lt;h4 id="111-四级标题-h4"&gt;1.1.1 四级标题 H4&lt;/h4&gt;&#10;&lt;h5 id="五级标题-h5"&gt;五级标题 H5&lt;/h5&gt;&#10;&lt;h6 id="六级标题-h6"&gt;六级标题 H6&lt;/h6&gt;&#10;&lt;h2 id="2-段落与行内强调"&gt;2. 段落与行内强调&lt;/h2&gt;&#10;&lt;p&gt;普通段落。同一段内可以混排 &lt;strong&gt;粗体&lt;/strong&gt;、&lt;em&gt;斜体&lt;/em&gt;、&lt;em&gt;&lt;strong&gt;粗斜体&lt;/strong&gt;&lt;/em&gt;、&lt;del&gt;删除线&lt;/del&gt;，以及 &lt;code&gt;行内代码&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;还可以组合：&lt;code&gt;**&lt;/code&gt; 里不该再套代码；正确写法是 &lt;strong&gt;bold with &lt;code&gt;code&lt;/code&gt;&lt;/strong&gt; 或 &lt;em&gt;italic with &lt;code&gt;code&lt;/code&gt;&lt;/em&gt;。&lt;/p&gt;&#10;&lt;p&gt;硬换行（行尾两个空格）会变成&lt;br&gt;&#10;下一行（同一段落内的强制换行）。&lt;/p&gt;&#10;&lt;p&gt;软换行（单个换行）在 Markdown 里通常仍并成同一段。&lt;/p&gt;&#10;&lt;h2 id="3-链接与图片"&gt;3. 链接与图片&lt;/h2&gt;&#10;&lt;h3 id="31-链接"&gt;3.1 链接&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;行内链接：&lt;a href="https://jiangbyte.github.io/"&gt;撷时录首页&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;带标题的链接：&lt;a href="https://gohugo.io/" title="The world’s fastest framework"&gt;Hugo&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;自动链接：&lt;a href="https://jiangbyte.github.io/"&gt;https://jiangbyte.github.io/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;参考式链接：&lt;a href="https://github.com/everfu/hugo-solitude" title="everfu/hugo-solitude"&gt;Solitude 主题&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;站内锚点：&lt;a href="#8-%E8%A1%A8%E6%A0%BC"&gt;跳到表格&lt;/a&gt; · &lt;a href="#11-mermaid"&gt;跳到 Mermaid&lt;/a&gt;&lt;/p&gt;</description></item><item><title>centos安装mysql</title><link>https://jiangbyte.github.io/p/centos%E5%AE%89%E8%A3%85mysql.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/centos%E5%AE%89%E8%A3%85mysql.html</guid><description>&lt;h2 id="先说背景"&gt;先说背景&lt;/h2&gt;&#10;&lt;p&gt;CentOS 7 自带的包管理是 Yum 不是 Dnf，而且官方源里没有 MySQL，得自己加仓库。这篇文章就是我在 CentOS 7 上装 MySQL 的完整记录，包括几种不同的安装方式，方便下次忘了回来看。&lt;/p&gt;&#10;&lt;h2 id="先看看系统版本"&gt;先看看系统版本&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;cat /etc/redhat-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;hostnamectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;cat /etc/redhat-release&#10;hostnamectl&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;输出是 &lt;code&gt;CentOS Linux release 7.x&lt;/code&gt; 就没问题。如果是 8 或 9 那包管理就变成 Dnf 了，步骤不太一样。&lt;/p&gt;&#10;&lt;h2 id="安装前要确认的事"&gt;安装前要确认的事&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;你有 &lt;code&gt;sudo&lt;/code&gt; 权限&lt;/li&gt;&#10;&lt;li&gt;机器能联网（离线场景下面有单独的方法）&lt;/li&gt;&#10;&lt;li&gt;防火墙要不要开 3306 端口看你自己需求&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="方法一用-yum-装最省事"&gt;方法一：用 Yum 装（最省事）&lt;/h2&gt;&#10;&lt;h3 id="先把仓库加上"&gt;先把仓库加上&lt;/h3&gt;&#10;&lt;p&gt;Oracle 官方准备好了 RPM 包，一行命令搞定：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;装完之后系统里会多一个 &lt;code&gt;/etc/yum.repos.d/mysql-community.repo&lt;/code&gt;，里面有好几个子仓库，默认启用的是 MySQL 8.0。&lt;/p&gt;</description></item><item><title>centos安装redis</title><link>https://jiangbyte.github.io/p/centos%E5%AE%89%E8%A3%85redis.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/centos%E5%AE%89%E8%A3%85redis.html</guid><description>&lt;h2 id="先说背景"&gt;先说背景&lt;/h2&gt;&#10;&lt;p&gt;CentOS 7 默认源里没有 Redis，得自己想办法。这篇整理了几种装法，从最省事的 Yum 到手动编译，看情况选就行。&lt;/p&gt;&#10;&lt;h2 id="方法一yum-装最省事"&gt;方法一：Yum 装（最省事）&lt;/h2&gt;&#10;&lt;h3 id="先加-epel-仓库"&gt;先加 EPEL 仓库&lt;/h3&gt;&#10;&lt;p&gt;Redis 在 EPEL（Extra Packages for Enterprise Linux）里：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install epel-release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo yum install epel-release&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="然后直接装"&gt;然后直接装&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo yum install redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo yum install redis&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="启动服务"&gt;启动服务&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl start redis&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; redis&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl status redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo systemctl start redis&#10;sudo systemctl enable redis&#10;sudo systemctl status redis&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="方法二编译安装想要最新版本"&gt;方法二：编译安装（想要最新版本）&lt;/h2&gt;&#10;&lt;p&gt;Yum 里的 Redis 版本一般比较老，想尝鲜就自己编译。&lt;/p&gt;</description></item><item><title>Claude、Codex 全自动模式</title><link>https://jiangbyte.github.io/p/claudecodex-%E5%85%A8%E8%87%AA%E5%8A%A8%E6%A8%A1%E5%BC%8F.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/claudecodex-%E5%85%A8%E8%87%AA%E5%8A%A8%E6%A8%A1%E5%BC%8F.html</guid><description>&lt;p&gt;&amp;ldquo;YOLO 模式&amp;rdquo;（或叫&amp;quot;全自动模式&amp;quot;）是为了让 AI 编程助手在不经你逐次确认的情况下，全自动执行指令。Codex 和 Claude Code 都有各自的开启方式，但核心逻辑和风险是一样的。&lt;/p&gt;&#10;&lt;p&gt;YOLO 模式主要通过两种方式开启：&lt;strong&gt;命令行参数&lt;/strong&gt;和&lt;strong&gt;配置文件&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;开启 YOLO 模式意味着将 AI 的操作权限完全放开，这虽然能极大提升效率，但也存在不小的风险。&lt;/p&gt;&#10;&lt;h3 id="速览"&gt;速览&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;工具&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;对应的 YOLO 标志&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Codex CLI&lt;/strong&gt; (OpenAI)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;code&gt;--yolo&lt;/code&gt; 或 &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;后者是其完整标志，&lt;code&gt;--yolo&lt;/code&gt; 是别名。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Claude Code 使用的官方标志。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="如何开启-yolo-模式"&gt;如何开启 YOLO 模式&lt;/h3&gt;&#10;&lt;h4 id="命令行启动"&gt;命令行启动&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;对于 Codex&lt;/strong&gt;：在启动命令后直接加上 &lt;code&gt;--yolo&lt;/code&gt; 或完整标志。&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;codex --yolo &lt;span class="s2"&gt;&amp;#34;需求描述&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或者&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;codex --dangerously-bypass-approvals-and-sandbox &lt;span class="s2"&gt;&amp;#34;需求描述&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;codex --yolo &amp;#34;需求描述&amp;#34;&#10;# 或者&#10;codex --dangerously-bypass-approvals-and-sandbox &amp;#34;需求描述&amp;#34;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;对于 Claude Code&lt;/strong&gt;：启动时加上 &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;。&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;claude --dangerously-skip-permissions &lt;span class="s2"&gt;&amp;#34;需求描述&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;claude --dangerously-skip-permissions &amp;#34;需求描述&amp;#34;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Cursor WSL 连接失败？手动安装 cursor-server 的完整方案</title><link>https://jiangbyte.github.io/p/cursor-wsl-%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85-cursor-server-%E7%9A%84%E5%AE%8C%E6%95%B4%E6%96%B9%E6%A1%88.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/cursor-wsl-%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85-cursor-server-%E7%9A%84%E5%AE%8C%E6%95%B4%E6%96%B9%E6%A1%88.html</guid><description>&lt;h2 id="先说问题"&gt;先说问题&lt;/h2&gt;&#10;&lt;p&gt;在 Windows 上用 Cursor 打开 WSL 项目时，左下角一直转圈，等待比较久&amp;hellip;&amp;hellip;好像也没有安装好，检查 &lt;code&gt;~/.cursor-server/bin/&lt;/code&gt; 目录，发现 &lt;code&gt;commit id&lt;/code&gt; 的目录是空的，说明自动下载失败了。这在国内网络环境下应该常见，因为服务器文件有 125MB，可能下载中途断掉了。&lt;/p&gt;&#10;&lt;h2 id="为什么会有这个问题"&gt;为什么会有这个问题&lt;/h2&gt;&#10;&lt;p&gt;Cursor 连接 WSL（或远程 SSH）时，需要在 WSL 内安装一个服务端组件 &lt;code&gt;cursor-server&lt;/code&gt;，它本质上是 VSCode Remote 的定制版。自动下载流程大致是：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Cursor Windows 端发起 WSL 连接&lt;/li&gt;&#10;&lt;li&gt;WSL 端根据 commit ID 下载对应的 &lt;code&gt;vscode-reh-linux-x64.tar.gz&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;解压到 &lt;code&gt;~/.cursor-server/bin/&amp;lt;commit-id&amp;gt;/&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;启动 server，建立通信&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第二步在国内网络环境下经常超时或中断，下载失败后 &lt;code&gt;bin/&amp;lt;commit-id&amp;gt;/&lt;/code&gt; 目录是空的，但 &lt;code&gt;.installation_lock&lt;/code&gt; 文件被写入了，导致 Cursor 以为&amp;quot;正在安装中&amp;quot;，不会重试。&lt;/p&gt;&#10;&lt;h2 id="手动安装步骤"&gt;手动安装步骤&lt;/h2&gt;&#10;&lt;h3 id="找到当前-cursor-版本的-commit-id"&gt;找到当前 Cursor 版本的 commit ID&lt;/h3&gt;&#10;&lt;p&gt;Commit ID 在 Cursor 的版本里，命令：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;cursor --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;cursor --version&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;输出：&lt;/p&gt;</description></item><item><title>Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙</title><link>https://jiangbyte.github.io/p/debian-13-xfce-%E5%BC%80%E5%8F%91%E6%9C%BA%E6%95%B4%E7%90%86%E7%86%84%E5%B1%8F%E8%BD%AF%E4%BB%B6%E6%BA%90%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/debian-13-xfce-%E5%BC%80%E5%8F%91%E6%9C%BA%E6%95%B4%E7%90%86%E7%86%84%E5%B1%8F%E8%BD%AF%E4%BB%B6%E6%BA%90%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</guid><description>&lt;h2 id="先说场景"&gt;先说场景&lt;/h2&gt;&#10;&lt;p&gt;机器是一台日常开发本：&lt;strong&gt;Debian GNU/Linux 13 (trixie) + XFCE&lt;/strong&gt;，硬件是 HP ProBook，双 NVMe，本机还跑着 Docker（MySQL / Redis / Portainer 等）。&lt;/p&gt;&#10;&lt;p&gt;一次顺手整理，把几件容易踩坑的事一起做完：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;关掉自动熄屏 / 挂起（插电、电池都关）&lt;/li&gt;&#10;&lt;li&gt;看清「要不要更新」，以及为什么 &lt;code&gt;apt&lt;/code&gt; 会甩出一千多个可升级包&lt;/li&gt;&#10;&lt;li&gt;注释掉 &lt;code&gt;sid&lt;/code&gt; / &lt;code&gt;bullseye&lt;/code&gt; 混源，只做安全范围内的升级&lt;/li&gt;&#10;&lt;li&gt;弄清 XApp / AppMenu，装上全局菜单并让它对齐、能导出菜单&lt;/li&gt;&#10;&lt;li&gt;看资源占用，给开发机开防火墙（默认不让别的设备访问）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;下面按实际操作顺序写，命令可直接复用。&lt;/p&gt;&#10;&lt;h2 id="xfce关掉自动熄屏和挂起"&gt;XFCE：关掉自动熄屏和挂起&lt;/h2&gt;&#10;&lt;h3 id="电源管理-gui"&gt;电源管理 GUI&lt;/h3&gt;&#10;&lt;p&gt;打开：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;xfce4-power-manager-settings&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;xfce4-power-manager-settings&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;重点看两个标签，且 &lt;strong&gt;On battery / Plugged in 都要改&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;System&lt;/strong&gt;：&lt;code&gt;When inactive for&lt;/code&gt; → &lt;strong&gt;Never&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Display&lt;/strong&gt;：&lt;code&gt;Put to sleep after&lt;/code&gt; / &lt;code&gt;Switch off after&lt;/code&gt; → &lt;strong&gt;Never&lt;/strong&gt;&lt;br&gt;&#10;更干净的做法：直接关掉 &lt;strong&gt;Display power management&lt;/strong&gt; 总开关&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;Devices&lt;/code&gt; 标签只显示电池信息，没有熄屏相关选项。&lt;/p&gt;</description></item><item><title>Debian XFCE 换 GDM 登录页与用户头像</title><link>https://jiangbyte.github.io/p/debian-xfce-%E6%8D%A2-gdm-%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/debian-xfce-%E6%8D%A2-gdm-%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</guid><description>&lt;h2 id="目标与边界"&gt;目标与边界&lt;/h2&gt;&#10;&lt;p&gt;机器：&lt;strong&gt;Debian 13（trixie）+ XFCE&lt;/strong&gt;，原先用 &lt;strong&gt;LightDM + lightdm-gtk-greeter&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;要做的事：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;登录界面换成 &lt;strong&gt;GDM3&lt;/strong&gt;（只要登录页，&lt;strong&gt;不&lt;/strong&gt;换 GNOME 桌面）&lt;/li&gt;&#10;&lt;li&gt;登录后仍进 &lt;strong&gt;Xfce Session&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;能用图形工具调登录页外观（壁纸等）&lt;/li&gt;&#10;&lt;li&gt;搞清楚 &lt;strong&gt;登录头像&lt;/strong&gt; 改哪里、为什么 Mugshot / 只改 &lt;code&gt;~/.face&lt;/code&gt; 不生效&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;明确不做（本文范围外）：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不装 WhiteSur / macOS 风 GDM 主题（可以后再加）&lt;/li&gt;&#10;&lt;li&gt;不卸载 LightDM 包（方便回退）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;桌面侧其它整理可对照：&lt;a href="./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.md"&gt;Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙&lt;/a&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="先备份"&gt;先备份&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo cp -a /etc/X11/default-display-manager &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; /etc/X11/default-display-manager.bak.&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d%H%M%S&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo cp -a /etc/lightdm/lightdm.conf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; /etc/lightdm/lightdm.conf.bak.&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d%H%M%S&lt;span class="k"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo cp -a /etc/X11/default-display-manager \&#10; /etc/X11/default-display-manager.bak.$(date +%Y%m%d%H%M%S)&#10;sudo cp -a /etc/lightdm/lightdm.conf \&#10; /etc/lightdm/lightdm.conf.bak.$(date +%Y%m%d%H%M%S)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;确认当前 DM 与 XFCE 会话文件存在：&lt;/p&gt;</description></item><item><title>Debian安装Redis和MySQL</title><link>https://jiangbyte.github.io/p/debian%E5%AE%89%E8%A3%85redis%E5%92%8Cmysql.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/debian%E5%AE%89%E8%A3%85redis%E5%92%8Cmysql.html</guid><description>&lt;h2 id="说明"&gt;说明&lt;/h2&gt;&#10;&lt;p&gt;本文要装的是 &lt;strong&gt;Oracle MySQL&lt;/strong&gt; 和 &lt;strong&gt;Redis&lt;/strong&gt;，不是 MariaDB。&lt;/p&gt;&#10;&lt;p&gt;Debian 自带仓库里的 &lt;code&gt;default-mysql-server&lt;/code&gt; 实际会装成 &lt;strong&gt;MariaDB&lt;/strong&gt;，&lt;strong&gt;不要用那个包&lt;/strong&gt;。本机用 apt 装 MySQL 时，走 &lt;strong&gt;MySQL 官方 APT 源&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Redis&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;MySQL&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A. 软件源&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Debian 源 &lt;code&gt;redis-server&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MySQL 官方 APT → &lt;code&gt;mysql-community-server&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;B. Docker&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;redis:8.8.2&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;mysql:9.7.2&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;密码示例：&lt;code&gt;infra123!&lt;/code&gt;（请改成自己的）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;不要两套同时占 3306 / 6379。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;前置：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="./linux%E5%88%9D%E5%A7%8B%E6%9C%BA.md"&gt;Linux 初始机&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="./%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.md"&gt;配置 Debian 软件源&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;走 Docker 时还需 &lt;a href="./Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.md"&gt;Debian 中国源安装 Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="方式-a软件源安装含密码配置"&gt;方式 A：软件源安装（含密码配置）&lt;/h2&gt;&#10;&lt;h3 id="先清掉可能装过的-mariadb如有"&gt;先清掉可能装过的 MariaDB（如有）&lt;/h3&gt;&#10;&lt;p&gt;若以前误装过 &lt;code&gt;default-mysql-server&lt;/code&gt; / &lt;code&gt;mariadb-*&lt;/code&gt;，先卸干净，避免抢端口和混淆：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl stop mariadb mysql 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt purge -y &lt;span class="s1"&gt;&amp;#39;mariadb-*&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;default-mysql-*&amp;#39;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo apt autoremove -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确认没有残留服务占 3306&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;sudo ss -tlnp &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="m"&gt;3306&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3306 free&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo systemctl stop mariadb mysql 2&amp;gt;/dev/null || true&#10;sudo apt purge -y &amp;#39;mariadb-*&amp;#39; &amp;#39;default-mysql-*&amp;#39; 2&amp;gt;/dev/null || true&#10;sudo apt autoremove -y&#10;# 确认没有残留服务占 3306&#10;sudo ss -tlnp | grep 3306 || echo &amp;#39;3306 free&amp;#39;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="安装-redisdebian-源"&gt;安装 Redis（Debian 源）&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install -y redis-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now redis-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl status redis-server --no-pager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo apt update&#10;sudo apt install -y redis-server&#10;sudo systemctl enable --now redis-server&#10;sudo systemctl status redis-server --no-pager&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;未设密码时：&lt;/p&gt;</description></item><item><title>Debian中国源安装Docker</title><link>https://jiangbyte.github.io/p/debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85docker.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85docker.html</guid><description>&lt;h2 id="前置"&gt;前置&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;已配好 Debian 软件源（见 &lt;a href="./%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.md"&gt;配置 Debian 软件源&lt;/a&gt;）&lt;/li&gt;&#10;&lt;li&gt;确认代号：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;. /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 本文按 trixie 写；bookworm 等把下面 URL 里的代号一并改掉&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;. /etc/os-release &amp;amp;&amp;amp; echo &amp;#34;$VERSION_CODENAME&amp;#34;&#10;# 本文按 trixie 写；bookworm 等把下面 URL 里的代号一并改掉&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;不要用发行版仓库里过时的 &lt;code&gt;docker.io&lt;/code&gt; 凑合（可以跑，但版本和管理源往往不如官方 CE 清晰）。开发机推荐 &lt;strong&gt;Docker CE + 国内镜像&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="依赖与-gpg-密钥"&gt;依赖与 GPG 密钥&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install -y ca-certificates curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;sudo install -m &lt;span class="m"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; -o /etc/apt/keyrings/docker.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo apt update&#10;sudo apt install -y ca-certificates curl&#10;&#10;sudo install -m 0755 -d /etc/apt/keyrings&#10;sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg \&#10; -o /etc/apt/keyrings/docker.asc&#10;sudo chmod a+r /etc/apt/keyrings/docker.asc&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;若阿里云 GPG 地址异常，可用 Docker 官方密钥再继续用阿里云软件源（密钥与仓库可分开）。&lt;/p&gt;</description></item><item><title>Hugo相对路径图片显示问题的分析与解决</title><link>https://jiangbyte.github.io/p/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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/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</guid><description>&lt;h2 id="先说问题"&gt;先说问题&lt;/h2&gt;&#10;&lt;p&gt;写博客的时候用 Obsidian 插了张图：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="markdown"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;markdown&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;img&lt;/span&gt;](&lt;span class="na"&gt;assets/example.jpg&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-markdown"&gt;![img](assets/example.jpg)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;编辑器里看着好好的，一跑 &lt;code&gt;hugo&lt;/code&gt; 部署上去，图裂了。打开浏览器开发者工具一看，图片请求的路径根本就不对。&lt;/p&gt;&#10;&lt;p&gt;检查了一圈，发现这个问题只出现在 &lt;strong&gt;非 bundle 的 md 文件&lt;/strong&gt; 上，用目录包起来的 &lt;code&gt;index.md&lt;/code&gt; 反倒没事。&lt;/p&gt;&#10;&lt;h2 id="为什么会有这个问题"&gt;为什么会有这个问题&lt;/h2&gt;&#10;&lt;h3 id="hugo-的两种页面"&gt;Hugo 的两种页面&lt;/h3&gt;&#10;&lt;p&gt;Hugo 里写文章有两种姿势：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Page Bundle&lt;/strong&gt; — 建个文件夹，里面放 &lt;code&gt;index.md&lt;/code&gt;，图片丢同目录下&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre tabindex="0"&gt;&lt;code&gt;content/posts/my-post/&#10;├── index.md&#10;└── some-image.jpg&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;content/posts/my-post/&#10;├── index.md&#10;└── some-image.jpg&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;Leaf Page&lt;/strong&gt; — 直接一个 &lt;code&gt;.md&lt;/code&gt; 文件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre tabindex="0"&gt;&lt;code&gt;content/posts/my-post.md&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;content/posts/my-post.md&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;我这边的目录结构是这样的：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre tabindex="0"&gt;&lt;code&gt;content/posts/&#10;├── _index.md&#10;├── assets/&#10;│ └── example.jpg&#10;├── my-post.md ← 出问题的&#10;└── my-bundle-post/&#10; └── index.md ← 没问题的&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;content/posts/&#10;├── _index.md&#10;├── assets/&#10;│ └── example.jpg&#10;├── my-post.md ← 出问题的&#10;└── my-bundle-post/&#10; └── index.md ← 没问题的&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;Blowfish 主题自带的图片渲染逻辑，会先用 &lt;code&gt;$.Page.Resources.GetMatch&lt;/code&gt; 去捞图片。Bundle 页面自然能捞到，但 leaf page 压根没有 page resources，捞了个空。最后 fallback 到直接把原始相对路径当 src 输出——这就是问题的起点。&lt;/p&gt;</description></item><item><title>Integer 缓存机制（JDK 17 源码）</title><link>https://jiangbyte.github.io/p/integer-%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6jdk-17-%E6%BA%90%E7%A0%81.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/integer-%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6jdk-17-%E6%BA%90%E7%A0%81.html</guid><description>&lt;p&gt;&lt;code&gt;Integer&lt;/code&gt; 的缓存不是业务层优化，而是 &lt;strong&gt;JLS 对自动装箱对象同一性&lt;/strong&gt; 的硬要求：一定范围内的 &lt;code&gt;int&lt;/code&gt; 装箱后必须是&lt;strong&gt;同一个&lt;/strong&gt; &lt;code&gt;Integer&lt;/code&gt; 实例。实现落在私有静态内部类 &lt;code&gt;Integer.IntegerCache&lt;/code&gt;，对外入口是 &lt;code&gt;Integer.valueOf(int)&lt;/code&gt;。下文依据 JDK 17 的 &lt;code&gt;java.lang.Integer&lt;/code&gt; 源码展开。&lt;/p&gt;&#10;&lt;h2 id="类上的-valuebased"&gt;类上的 ValueBased&lt;/h2&gt;&#10;&lt;p&gt;JDK 17 的 &lt;code&gt;Integer&lt;/code&gt; 声明为：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="java"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;java&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@jdk.internal.ValueBased&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Comparable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Constable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConstantDesc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-java"&gt;@jdk.internal.ValueBased&#10;public final class Integer extends Number&#10; implements Comparable&amp;lt;Integer&amp;gt;, Constable, ConstantDesc {&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;&lt;code&gt;@ValueBased&lt;/code&gt; 提醒：这类对象更宜按&lt;strong&gt;值&lt;/strong&gt;使用。缓存让小整数在引用层面也「碰巧」同一，但业务比较仍应以 &lt;code&gt;equals&lt;/code&gt; / 拆箱后的 &lt;code&gt;int&lt;/code&gt; 为准，不要把 &lt;code&gt;==&lt;/code&gt; 当成通用相等判断。&lt;/p&gt;&#10;&lt;h2 id="自动装箱实际调用-valueof"&gt;自动装箱实际调用 valueOf&lt;/h2&gt;&#10;&lt;p&gt;编译器对 &lt;code&gt;Integer a = 10;&lt;/code&gt; 这类赋值会插入 &lt;code&gt;Integer.valueOf(10)&lt;/code&gt;，不会走已废弃的构造器。完整验证如下（覆盖缓存边界、&lt;code&gt;new&lt;/code&gt;、&lt;code&gt;equals&lt;/code&gt;、抬高上界）：&lt;/p&gt;</description></item><item><title>Keil5 下载、安装、激活和使用记录</title><link>https://jiangbyte.github.io/p/keil5-%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%BF%80%E6%B4%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/keil5-%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%BF%80%E6%B4%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid><description>&lt;h2 id="下载-keil5"&gt;下载 Keil5&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;安装包下载地址&lt;/strong&gt;：&lt;br&gt;&#10;&lt;a href="https://pan.quark.cn/s/6a455cd4bce2"&gt;https://pan.quark.cn/s/6a455cd4bce2&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b5%8c%e5%85%a5%e5%bc%8f/assets/Pasted%20image%2020260705093919.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;下载内容包括：Keil5 安装包（MDK540.exe）及注册机（keygen.exe）&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="安装-keil5"&gt;安装 Keil5&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b5%8c%e5%85%a5%e5%bc%8f/assets/Pasted%20image%2020260705095347.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;正常安装&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b5%8c%e5%85%a5%e5%bc%8f/assets/Pasted%20image%2020260705095415.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b5%8c%e5%85%a5%e5%bc%8f/assets/Pasted%20image%2020260705100506.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://segmentfault.com/a/1190000047918396"&gt;https://segmentfault.com/a/1190000047918396&lt;/a&gt;&lt;/p&gt;</description></item><item><title>linux初始机</title><link>https://jiangbyte.github.io/p/linux%E5%88%9D%E5%A7%8B%E6%9C%BA.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/linux%E5%88%9D%E5%A7%8B%E6%9C%BA.html</guid><description>&lt;h2 id="目标"&gt;目标&lt;/h2&gt;&#10;&lt;p&gt;新装或刚到手的 &lt;strong&gt;Debian&lt;/strong&gt; 开发机，先把「能正常干活」的底子铺好，再去改软件源、装 Docker、跑 MySQL / Redis。&lt;/p&gt;&#10;&lt;p&gt;本文以 &lt;strong&gt;Debian 13 (trixie) + 图形桌面（如 XFCE）&lt;/strong&gt; 为例，命令对服务器版同样适用（跳过桌面相关即可）。&lt;/p&gt;&#10;&lt;p&gt;建议阅读顺序：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;本文：01 Linux 初始机&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="./%E9%85%8D%E7%BD%AEDebian%E8%BD%AF%E4%BB%B6%E6%BA%90.md"&gt;配置 Debian 软件源&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="./Debian%E4%B8%AD%E5%9B%BD%E6%BA%90%E5%AE%89%E8%A3%85Docker.md"&gt;Debian 中国源安装 Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="./Debian%E5%AE%89%E8%A3%85Redis%E5%92%8CMySQL.md"&gt;Debian 安装 Redis 和 MySQL&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="确认系统"&gt;确认系统&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;cat /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;uname -r&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;hostnamectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;cat /etc/os-release&#10;uname -r&#10;hostnamectl&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;关注：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;VERSION_CODENAME&lt;/code&gt;（如 &lt;code&gt;trixie&lt;/code&gt;）——后面写源、装 Docker 都要用&lt;/li&gt;&#10;&lt;li&gt;架构一般为 &lt;code&gt;x86-64&lt;/code&gt; / &lt;code&gt;amd64&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="用户与-sudo"&gt;用户与 sudo&lt;/h2&gt;&#10;&lt;p&gt;安装时若已创建普通用户并勾选 sudo，可跳过。否则：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;su -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;apt install -y sudo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;usermod -aG sudo 你的用户名&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;su -&#10;apt update&#10;apt install -y sudo&#10;usermod -aG sudo 你的用户名&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;注销重登后验证：&lt;/p&gt;</description></item><item><title>Object 源码解析（Oracle JDK 17）</title><link>https://jiangbyte.github.io/p/object-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90oracle-jdk-17.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/object-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90oracle-jdk-17.html</guid><description>&lt;p&gt;&lt;code&gt;java.lang.Object&lt;/code&gt; 是 Java 类型体系的根：除它自身外，每个类（含数组类型）最终都继承它，因而它定义的方法构成「所有对象共有的最小行为集」&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。下文依据本机 &lt;strong&gt;Oracle JDK 17.0.20.1&lt;/strong&gt;（&lt;code&gt;$JAVA_HOME&lt;/code&gt;=&lt;code&gt;/home/charlie/workspace/sdks/jdk-17&lt;/code&gt;）自带源码包中的 &lt;code&gt;Object.java&lt;/code&gt;，按成员出现顺序解析——侧重&lt;strong&gt;为何存在、契约与 HotSpot 如何支撑、工程上如何用&lt;/strong&gt;；源码与本机实测用来锚定结论，而不是逐行注释。&lt;/p&gt;&#10;&lt;p&gt;源码路径：&lt;code&gt;$JAVA_HOME/lib/src.zip&lt;/code&gt; → &lt;code&gt;java.base/java/lang/Object.java&lt;/code&gt;&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#10;&lt;p&gt;运行与验证：同一套 Oracle JDK；工程 &lt;code&gt;learning-lab/java/java17-sources&lt;/code&gt; 中的 &lt;code&gt;ObjectLayoutVerify&lt;/code&gt; / &lt;code&gt;ObjectMethodsVerify&lt;/code&gt; / &lt;code&gt;ObjectMonitorVerify&lt;/code&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#10;&lt;h2 id="类注释根类型意味着什么"&gt;类注释：根类型意味着什么&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="java"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;java&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Class {@code Object} is the root of the class hierarchy.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Every class has {@code Object} as a superclass. All objects,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * including arrays, implement the methods of this class.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @see java.lang.Class&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @since 1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-java"&gt;/**&#10; * Class {@code Object} is the root of the class hierarchy.&#10; * Every class has {@code Object} as a superclass. All objects,&#10; * including arrays, implement the methods of this class.&#10; *&#10; * @see java.lang.Class&#10; * @since 1.0&#10; */&#10;public class Object {&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;把「万物皆对象」落成语言规则，有三层后果：&lt;/p&gt;</description></item><item><title>ubuntu安装mysql</title><link>https://jiangbyte.github.io/p/ubuntu%E5%AE%89%E8%A3%85mysql.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/ubuntu%E5%AE%89%E8%A3%85mysql.html</guid><description>&lt;h2 id="先说背景"&gt;先说背景&lt;/h2&gt;&#10;&lt;p&gt;Ubuntu 的 APT 源里自带 MySQL，装起来比 CentOS 省心不少。不过默认版本可能不是最新的，想指定版本或者用官方最新版也有办法。&lt;/p&gt;&#10;&lt;h2 id="方法一apt-直接装最省事"&gt;方法一：APT 直接装（最省事）&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install mysql-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo apt update&#10;sudo apt install mysql-server&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;装完启动：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl start mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; mysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo systemctl start mysql&#10;sudo systemctl enable mysql&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;然后跑一下安全配置脚本：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo mysql_secure_installation&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo mysql_secure_installation&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;这个脚本会一步步引导你改 root 密码、删匿名用户、禁止 root 远程登录、删测试数据库。别跳过。&lt;/p&gt;</description></item><item><title>ubuntu安装redis</title><link>https://jiangbyte.github.io/p/ubuntu%E5%AE%89%E8%A3%85redis.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/ubuntu%E5%AE%89%E8%A3%85redis.html</guid><description>&lt;h2 id="先说背景"&gt;先说背景&lt;/h2&gt;&#10;&lt;p&gt;Ubuntu 比 CentOS 省心点，APT 源里直接有 Redis，不用额外加仓库。不过版本可能不是最新的，想尝鲜还是得自己编译。&lt;/p&gt;&#10;&lt;h2 id="方法一apt-装最省事"&gt;方法一：APT 装（最省事）&lt;/h2&gt;&#10;&lt;h3 id="更新源然后直接装"&gt;更新源然后直接装&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install redis-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo apt update&#10;sudo apt install redis-server&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="启动服务"&gt;启动服务&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl start redis-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; redis-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl status redis-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo systemctl start redis-server&#10;sudo systemctl enable redis-server&#10;sudo systemctl status redis-server&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="方法二编译安装想要最新版本"&gt;方法二：编译安装（想要最新版本）&lt;/h2&gt;&#10;&lt;p&gt;APT 里的版本一般落后一两个大版本，想用最新的就自己编译。&lt;/p&gt;&#10;&lt;h3 id="装编译工具"&gt;装编译工具&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt install build-essential tcl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo apt update&#10;sudo apt install build-essential tcl&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="下载源码编译"&gt;下载源码编译&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;wget https://download.redis.io/redis-stable.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;tar -xzvf redis-stable.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; redis-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;make&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;sudo make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;cd /tmp&#10;wget https://download.redis.io/redis-stable.tar.gz&#10;tar -xzvf redis-stable.tar.gz&#10;cd redis-stable&#10;make&#10;sudo make install&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="准备配置目录"&gt;准备配置目录&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo mkdir /etc/redis&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo mkdir /var/redis&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo cp redis.conf /etc/redis/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo mkdir /etc/redis&#10;sudo mkdir /var/redis&#10;sudo cp redis.conf /etc/redis/&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="基本配置"&gt;基本配置&lt;/h2&gt;&#10;&lt;h3 id="测试连接"&gt;测试连接&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;redis-cli&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;127.0.0.1:6379&amp;gt; ping&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;PONG&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;127.0.0.1:6379&amp;gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;127.0.0.1:6379&amp;gt; get &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;127.0.0.1:6379&amp;gt; exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;redis-cli&#10;127.0.0.1:6379&amp;gt; ping&#10;PONG&#10;127.0.0.1:6379&amp;gt; set test &amp;#34;hello&amp;#34;&#10;OK&#10;127.0.0.1:6379&amp;gt; get test&#10;&amp;#34;hello&amp;#34;&#10;127.0.0.1:6379&amp;gt; exit&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="改配置"&gt;改配置&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo nano /etc/redis/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo nano /etc/redis/redis.conf&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;几个常用的：&lt;/p&gt;</description></item><item><title>VMware Workstation Pro 26H1 安装</title><link>https://jiangbyte.github.io/p/vmware-workstation-pro-26h1-%E5%AE%89%E8%A3%85.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/vmware-workstation-pro-26h1-%E5%AE%89%E8%A3%85.html</guid><description>&lt;p&gt;本文按 &lt;strong&gt;2026-06-19&lt;/strong&gt; 时点可获取的 &lt;strong&gt;26H1 免费版&lt;/strong&gt; 流程整理，主要记录 &lt;strong&gt;Windows 宿主机&lt;/strong&gt;上的下载和安装步骤。&lt;/p&gt;&#10;&lt;h2 id="下载-vmware-workstation-pro-26h1"&gt;下载 VMware Workstation Pro 26H1&lt;/h2&gt;&#10;&lt;p&gt;Broadcom 注册地址：&lt;a href="https://profile.broadcom.com/web/registration"&gt;https://profile.broadcom.com/web/registration&lt;/a&gt;&#10;Broadcom 登录地址：&lt;a href="https://access.broadcom.com/default/ui/v1/signin/"&gt;https://access.broadcom.com/default/ui/v1/signin/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260619193508.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;下载入口：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Pro&amp;amp;freeDownloads=true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Pro&amp;amp;freeDownloads=true&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="选择对应版本"&gt;选择对应版本&lt;/h3&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260619193628.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620213828.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre tabindex="0"&gt;&lt;code&gt;I agree to the Terms and Conditions&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;I agree to the Terms and Conditions&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;这个按钮可能有时候点击不了，多试几次&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620213950.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620214002.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;可能需要填写一些信息：&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620214737.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620214956.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="开始安装"&gt;开始安装&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221249.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221357.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221412.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221429.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221448.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221456.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221505.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221525.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221723.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&#10;&lt;figure&gt;&#10; &lt;img src="https://jiangbyte.github.io/posts/%e5%b7%a5%e5%85%b7/vmware/assets/Pasted%20image%2020260620221927.png" alt="" loading="lazy" decoding="async"&gt;&lt;/figure&gt;&#10;&lt;/p&gt;</description></item><item><title>Webhook 与飞书机器人集成</title><link>https://jiangbyte.github.io/p/webhook-%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/webhook-%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</guid><description>&lt;p&gt;审计告警功能需要把检测到的安全事件推送到飞书群。飞书提供了自定义机器人 Webhook 的接口，支持文本和富文本消息格式，也可以配置 HMAC-SHA256 签名验证。&lt;/p&gt;&#10;&lt;p&gt;实现上需要解决三个问题：签名怎么算、参数放哪里、消息怎么写。&lt;/p&gt;&#10;&lt;h2 id="签名算法"&gt;签名算法&lt;/h2&gt;&#10;&lt;p&gt;飞书官方文档给出的签名示例：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="python"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;python&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;base64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hmac&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gen_sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;string_to_sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;hmac_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;string_to_sign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digestmod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hmac_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-python"&gt;import hashlib&#10;import base64&#10;import hmac&#10;&#10;def gen_sign(timestamp, secret):&#10; string_to_sign = &amp;#39;{}\n{}&amp;#39;.format(timestamp, secret)&#10; hmac_code = hmac.new(&#10; string_to_sign.encode(&amp;#34;utf-8&amp;#34;),&#10; digestmod=hashlib.sha256&#10; ).digest()&#10; sign = base64.b64encode(hmac_code).decode(&amp;#39;utf-8&amp;#39;)&#10; return sign&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;注意这里的 &lt;code&gt;hmac.new&lt;/code&gt; 调用是 &lt;code&gt;hmac.new(key, msg=None, digestmod=sha256)&lt;/code&gt;，key 是 &lt;code&gt;timestamp\nsecret&lt;/code&gt;，msg 为空。和通常的 &lt;code&gt;hmac.new(secret, data, digestmod)&lt;/code&gt; 写法不一样，如果习惯性地把 secret 放第一个参数、string_to_sign 放第二个，签名就对不上。&lt;/p&gt;</description></item><item><title>XFCE AppMenu 居中与 Expand 被写回</title><link>https://jiangbyte.github.io/p/xfce-appmenu-%E5%B1%85%E4%B8%AD%E4%B8%8E-expand-%E8%A2%AB%E5%86%99%E5%9B%9E.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/xfce-appmenu-%E5%B1%85%E4%B8%AD%E4%B8%8E-expand-%E8%A2%AB%E5%86%99%E5%9B%9E.html</guid><description>&lt;h2 id="现象"&gt;现象&lt;/h2&gt;&#10;&lt;p&gt;顶栏装了 &lt;strong&gt;AppMenu Plugin&lt;/strong&gt; 之后：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;菜单标题（如 &lt;code&gt;Cursor&lt;/code&gt;、&lt;code&gt;Thunar&lt;/code&gt;）不靠左，像漂在面板中间&lt;/li&gt;&#10;&lt;li&gt;右键属性里把 &lt;strong&gt;Expand plugin on panel&lt;/strong&gt; 关掉，看起来正常了&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;注销 / 重启&lt;/strong&gt; 后，Expand 又被勾上，标题又居中&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;装全局菜单、环境变量、GTK module 等前置步骤见：&lt;a href="./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.md"&gt;Debian 13 XFCE 开发机整理：熄屏、软件源、全局菜单与防火墙&lt;/a&gt;。本文只挖 &lt;strong&gt;居中 / Expand 反复写回&lt;/strong&gt; 这一块。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="appmenu-是什么不是另一套更好的菜单"&gt;AppMenu 是什么（不是另一套更好的菜单）&lt;/h2&gt;&#10;&lt;p&gt;面板里叫 &lt;strong&gt;AppMenu Plugin&lt;/strong&gt; 的东西，包名是：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;apt-cache show xfce4-appmenu-plugin &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;^(Package|Source|Description)&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;apt-cache show xfce4-appmenu-plugin | grep -E &amp;#39;^(Package|Source|Description)&amp;#39;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;实际就是 &lt;strong&gt;vala-panel-appmenu&lt;/strong&gt; 的 XFCE 后端：把当前窗口的 File / Edit 等导出到面板。&lt;br&gt;&#10;没有「再装一个更强的 AppMenu」这种替代品——同一种插件，名字略容易混。&lt;/p&gt;&#10;&lt;p&gt;相关包通常还有：&lt;code&gt;appmenu-gtk3-module&lt;/code&gt;、&lt;code&gt;appmenu-registrar&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="为什么会居中"&gt;为什么会「居中」&lt;/h2&gt;&#10;&lt;p&gt;面板插件有个开关：&lt;strong&gt;Expand plugin on panel&lt;/strong&gt;（扩展以填满可用空间）。&lt;/p&gt;</description></item><item><title>配置Debian软件源</title><link>https://jiangbyte.github.io/p/%E9%85%8D%E7%BD%AEdebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E9%85%8D%E7%BD%AEdebian%E8%BD%AF%E4%BB%B6%E6%BA%90.html</guid><description>&lt;h2 id="为什么要改源"&gt;为什么要改源&lt;/h2&gt;&#10;&lt;p&gt;默认 &lt;code&gt;deb.debian.org&lt;/code&gt; 在国内经常慢或不稳。开发机建议：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;软件包、更新、backports&lt;/strong&gt; → 中科大镜像（也可换清华、北外、阿里云等）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;安全更新&lt;/strong&gt; → 继续用官方 &lt;code&gt;security.debian.org&lt;/code&gt;（更及时）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;同时要避免把 &lt;strong&gt;sid（unstable）&lt;/strong&gt;、旧版 &lt;strong&gt;bullseye&lt;/strong&gt; 和当前稳定版写进同一套默认源，否则 &lt;code&gt;apt list --upgradable&lt;/code&gt; 会刷出上千个包，一不小心就把桌面拖进滚动版。&lt;/p&gt;&#10;&lt;h2 id="备份"&gt;备份&lt;/h2&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d%H%M%S&lt;span class="k"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +%Y%m%d%H%M%S)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;确认代号：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;. /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Debian 13 → trixie&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;. /etc/os-release &amp;amp;&amp;amp; echo &amp;#34;$VERSION_CODENAME&amp;#34;&#10;# Debian 13 → trixie&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;下文以 &lt;strong&gt;trixie&lt;/strong&gt; 为例，其他版本替换代号即可。&lt;/p&gt;&#10;&lt;h2 id="推荐的-sourceslist"&gt;推荐的 sources.list&lt;/h2&gt;&#10;&lt;p&gt;以**中国科学技术大学（USTC）**镜像为例：&lt;/p&gt;</description></item><item><title>使用 Docker 快速部署数据服务环境</title><link>https://jiangbyte.github.io/p/%E4%BD%BF%E7%94%A8-docker-%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E4%BD%BF%E7%94%A8-docker-%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</guid><description>&lt;h2 id="前置准备"&gt;前置准备&lt;/h2&gt;&#10;&lt;p&gt;首先创建所有服务的数据持久化目录：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建统一的数据存储目录&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;mkdir -p ~/docker-data/&lt;span class="o"&gt;{&lt;/span&gt;postgres,redis,rabbitmq&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;# 创建统一的数据存储目录&#10;mkdir -p ~/docker-data/{postgres,redis,rabbitmq}&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="服务部署"&gt;服务部署&lt;/h2&gt;&#10;&lt;h3 id="postgresql支持向量扩展端口5433"&gt;PostgreSQL（支持向量扩展，端口5433）&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 拉取支持向量扩展的PostgreSQL镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;docker pull pgvector/pgvector:pg17&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动PostgreSQL容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; --name postgres &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; --restart unless-stopped &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; -m 512m &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;123456&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myapp &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; -v ~/docker-data/postgres:/var/lib/postgresql/data &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -p 5433:5432 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; pgvector/pgvector:pg17&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;# 拉取支持向量扩展的PostgreSQL镜像&#10;docker pull pgvector/pgvector:pg17&#10;&#10;# 启动PostgreSQL容器&#10;docker run -d \&#10; --name postgres \&#10; --restart unless-stopped \&#10; -m 512m \&#10; -e POSTGRES_PASSWORD=123456 \&#10; -e POSTGRES_DB=myapp \&#10; -v ~/docker-data/postgres:/var/lib/postgresql/data \&#10; -p 5433:5432 \&#10; pgvector/pgvector:pg17&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;&lt;strong&gt;启用向量扩展（首次启动后执行）：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>双远程工作流</title><link>https://jiangbyte.github.io/p/%E5%8F%8C%E8%BF%9C%E7%A8%8B%E5%B7%A5%E4%BD%9C%E6%B5%81.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E5%8F%8C%E8%BF%9C%E7%A8%8B%E5%B7%A5%E4%BD%9C%E6%B5%81.html</guid><description>&lt;h2 id="场景"&gt;场景&lt;/h2&gt;&#10;&lt;p&gt;最近团队基于 Snowy 这个开源项目做二次开发，在它上面加了很多自己的业务功能。但 Snowy 也在持续更新——修 Bug、加新特性、升级依赖版本。&lt;/p&gt;&#10;&lt;p&gt;问题来了：&lt;strong&gt;自己的代码和上游代码混在一起，怎么才能既自由修改，又能定期拉取上游的最新更新？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这就是我写这篇文章要分享的。&lt;/p&gt;&#10;&lt;h2 id="思路"&gt;思路&lt;/h2&gt;&#10;&lt;p&gt;我的核心思路是&lt;strong&gt;双远程 + 上游镜像分支&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;origin&lt;/code&gt; → 团队自己的远程仓库（日常开发用）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;upstream&lt;/code&gt; → 开源项目的远程仓库（只读，仅用来拉取更新）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;upstream-master&lt;/code&gt; 分支 → 上游代码的纯净镜像，绝不直接提交&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;main&lt;/code&gt; 分支 → 团队开发主分支，包含所有自定义代码&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="solitude-tag tag-mermaid mermaid"&gt;gitGraph&#10; commit id: &amp;#34;A&amp;#34;&#10; commit id: &amp;#34;B&amp;#34;&#10; branch upstream-master&#10; checkout upstream-master&#10; commit id: &amp;#34;C&amp;#34;&#10; commit id: &amp;#34;D&amp;#34;&#10; checkout main&#10; commit id: &amp;#34;E: 上游v3.6.5&amp;#34;&#10; branch feature/xxx&#10; checkout feature/xxx&#10; commit id: &amp;#34;F&amp;#34;&#10; checkout main&#10; merge feature/xxx&lt;/div&gt;&#10;&lt;h2 id="初始化仓库"&gt;初始化仓库&lt;/h2&gt;&#10;&lt;h3 id="进入项目目录"&gt;进入项目目录&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /your/project&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;cd /your/project&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="初始化-git"&gt;初始化 Git&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;git init&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="配置两个远程仓库以codeup和gitee为例"&gt;配置两个远程仓库（以codeup和gitee为例）&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;git remote add origin git@codeup.aliyun.com:your-team/your-project.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;git remote add upstream git@gitee.com:xiaonuobase/snowy.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;git remote add origin git@codeup.aliyun.com:your-team/your-project.git&#10;git remote add upstream git@gitee.com:xiaonuobase/snowy.git&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;&lt;code&gt;origin&lt;/code&gt; 是团队日常用的仓库，&lt;code&gt;upstream&lt;/code&gt; 是 Snowy 的仓库（只拉取，不推送）。&lt;/p&gt;</description></item><item><title>同时配置 Gitee 与 GitHub</title><link>https://jiangbyte.github.io/p/%E5%90%8C%E6%97%B6%E9%85%8D%E7%BD%AE-gitee-%E4%B8%8E-github.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E5%90%8C%E6%97%B6%E9%85%8D%E7%BD%AE-gitee-%E4%B8%8E-github.html</guid><description>&lt;p&gt;开发机上经常要同时推 Gitee、GitHub，有时还要接阿里云 Codeup。默认只会用 &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;，多平台共用一把钥匙容易乱；更稳妥的做法是：&lt;strong&gt;每平台一把密钥，用 &lt;code&gt;~/.ssh/config&lt;/code&gt; 按 Host 分流&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="全局-git-身份"&gt;全局 Git 身份&lt;/h2&gt;&#10;&lt;p&gt;提交作者信息与 SSH 无关，但新环境一般先配好：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;jiangbyte&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;your@email.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;git config --global --list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;git config --global user.name &amp;#34;jiangbyte&amp;#34;&#10;git config --global user.email &amp;#34;your@email.com&amp;#34;&#10;git config --global --list&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;确认输出里有 &lt;code&gt;user.name&lt;/code&gt; / &lt;code&gt;user.email&lt;/code&gt;。若某仓库要用不同邮箱，再在该仓库里用 &lt;code&gt;git config user.email&lt;/code&gt;（不加 &lt;code&gt;--global&lt;/code&gt;）覆盖即可。&lt;/p&gt;&#10;&lt;h2 id="为各平台分别生成-ssh-密钥"&gt;为各平台分别生成 SSH 密钥&lt;/h2&gt;&#10;&lt;p&gt;目录权限先保证：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;mkdir -p ~/.ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;700&lt;/span&gt; ~/.ssh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;mkdir -p ~/.ssh&#10;chmod 700 ~/.ssh&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;分别生成三把密钥（文件名自定义，别互相覆盖）：&lt;/p&gt;</description></item><item><title>用 conda 固定默认环境 normal</title><link>https://jiangbyte.github.io/p/%E7%94%A8-conda-%E5%9B%BA%E5%AE%9A%E9%BB%98%E8%AE%A4%E7%8E%AF%E5%A2%83-normal.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E7%94%A8-conda-%E5%9B%BA%E5%AE%9A%E9%BB%98%E8%AE%A4%E7%8E%AF%E5%A2%83-normal.html</guid><description>&lt;h2 id="先说目标"&gt;先说目标&lt;/h2&gt;&#10;&lt;p&gt;机器上同时有三套 Python 很容易搅在一起：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;系统自带的 &lt;code&gt;/usr/bin/python3&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;conda 的 &lt;code&gt;base&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;自己建的业务 / 学习环境&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;想要的结果很简单：&lt;strong&gt;不管终端还是 Cursor，一律只用名为 &lt;code&gt;normal&lt;/code&gt; 的 conda 环境&lt;/strong&gt;，不要再落到 &lt;code&gt;base&lt;/code&gt; 或系统 Python 上。&lt;/p&gt;&#10;&lt;p&gt;下面以 miniforge（路径 &lt;code&gt;/home/charlie/miniforge3&lt;/code&gt;）为例，过程对 Anaconda / Miniconda 同样适用，改一下前缀即可。&lt;/p&gt;&#10;&lt;h2 id="创建-normal-环境"&gt;创建 &lt;code&gt;normal&lt;/code&gt; 环境&lt;/h2&gt;&#10;&lt;p&gt;选用相对稳妥的 3.12：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda create -n normal &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.12 -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;conda create -n normal python=3.12 -y&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;创建完成后确认：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda env list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# base /home/charlie/miniforge3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# normal /home/charlie/miniforge3/envs/normal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;conda env list&#10;# base /home/charlie/miniforge3&#10;# normal /home/charlie/miniforge3/envs/normal&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;解释器路径固定为：&lt;/p&gt;</description></item><item><title>用 Spring AI 实现 RAG 知识库：对话记忆、向量检索与文档入库</title><link>https://jiangbyte.github.io/p/%E7%94%A8-spring-ai-%E5%AE%9E%E7%8E%B0-rag-%E7%9F%A5%E8%AF%86%E5%BA%93%E5%AF%B9%E8%AF%9D%E8%AE%B0%E5%BF%86%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E7%94%A8-spring-ai-%E5%AE%9E%E7%8E%B0-rag-%E7%9F%A5%E8%AF%86%E5%BA%93%E5%AF%B9%E8%AF%9D%E8%AE%B0%E5%BF%86%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</guid><description>&lt;p&gt;最近用 Spring AI 做了一套 RAG 知识库对话：后台管理多知识库和文件上传，对话侧支持会话记忆、按知识库过滤检索，以及 SSE 流式输出。骨架还是原来的 DDD-lite Spring Boot 分层。&lt;/p&gt;&#10;&lt;p&gt;技术选型大致是：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;能力&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;选型&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;框架&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Java 21 / Spring Boot 4.1 / Spring AI 2.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Chat&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;阿里云百炼等 &lt;strong&gt;OpenAI 兼容&lt;/strong&gt;接口（&lt;code&gt;spring-ai-starter-model-openai&lt;/code&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Embedding&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本地 &lt;strong&gt;Ollama&lt;/strong&gt;（如 &lt;code&gt;embeddinggemma&lt;/code&gt;，768 维）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;向量库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Milvus&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对话记忆&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Spring AI &lt;strong&gt;Redis Chat Memory&lt;/strong&gt;（RediSearch）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;原文存储&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;MinIO&lt;/strong&gt;（可与 Milvus 栈共用）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文档解析&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Tika&lt;/strong&gt; + &lt;strong&gt;TokenTextSplitter&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;元数据&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;MySQL&lt;/strong&gt; + MyBatis-Plus&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;前端&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vite + React + Ant Design，SSE 流式对话&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;下面按实现顺序写整条链路：模块怎么分、Spring AI 怎么接、文档如何切片入库、RAG 与记忆如何同时生效，以及默认 RAG 提示词会坑闲聊等问题。&lt;/p&gt;&#10;&lt;h2 id="目标与整体架构"&gt;目标与整体架构&lt;/h2&gt;&#10;&lt;p&gt;先明确要做的行为：&lt;/p&gt;</description></item><item><title>邮件集成与密码重置</title><link>https://jiangbyte.github.io/p/%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</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%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</guid><description>&lt;p&gt;项目中邮件功能用于发送密码重置链接，但此前只搭好了架子，缺少实际测试验证。本文将记录邮件集成的全链路配置、本地测试、以及过程中遇到并解决的几个问题。&lt;/p&gt;&#10;&lt;h2 id="邮件发送引擎"&gt;邮件发送引擎&lt;/h2&gt;&#10;&lt;p&gt;项目在 &lt;code&gt;app/platform/email/sender.py&lt;/code&gt; 中实现了 &lt;code&gt;send_mail&lt;/code&gt; 函数，支持普通 SMTP 和 STARTTLS 两种模式：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="python"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;python&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_mail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;BusinessError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mail service is not configured&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmailMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;From&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;To&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;to_email&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Subject&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_send_sync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-python"&gt;async def send_mail(to_email: str, subject: str, body: str) -&amp;gt; None:&#10; mail = settings.mail&#10; if not mail.host or not mail.from_email:&#10; raise BusinessError(&amp;#34;Mail service is not configured&amp;#34;)&#10; message = EmailMessage()&#10; message[&amp;#34;From&amp;#34;] = f&amp;#34;{mail.from_name} &amp;lt;{mail.from_email}&amp;gt;&amp;#34;&#10; message[&amp;#34;To&amp;#34;] = to_email&#10; message[&amp;#34;Subject&amp;#34;] = subject&#10; message.set_content(body)&#10; await asyncio.to_thread(_send_sync, message)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;邮件配置通过 &lt;code&gt;MailSettings&lt;/code&gt; 集中管理，包括 SMTP 地址、端口、账号密码、TLS 开关等。配置项可在管理后台运行时修改，启动时从 &lt;code&gt;sys_config&lt;/code&gt; 表加载覆盖。&lt;/p&gt;</description></item><item><title>主从复制配置</title><link>https://jiangbyte.github.io/p/%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E9%85%8D%E7%BD%AE.html</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0800</pubDate><guid>https://jiangbyte.github.io/p/%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E9%85%8D%E7%BD%AE.html</guid><description>&lt;h2 id="先说背景"&gt;先说背景&lt;/h2&gt;&#10;&lt;p&gt;两台机器，主库 CentOS 7，从库 Ubuntu，配 MySQL 主从复制。这篇是实际操作记录，方便下次复用。&lt;/p&gt;&#10;&lt;h2 id="主库配置centos"&gt;主库配置（CentOS）&lt;/h2&gt;&#10;&lt;h3 id="改配置文件"&gt;改配置文件&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo vi /etc/my.cnf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo vi /etc/my.cnf&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;p&gt;在 &lt;code&gt;[mysqld]&lt;/code&gt; 段加这些：&lt;/p&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="text"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;text&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;pre tabindex="0"&gt;&lt;code&gt;[mysqld]&#10;server-id = 1 # 主库 id，随便填，唯一就行&#10;log_bin = /var/log/mysql/mysql-bin.log&#10;read-only = 0 # 0 表示读写（主库）&#10;binlog_expire_logs_seconds = 2592000 # 日志保留 30 天&#10;max_binlog_size = 100M&#10;# binlog_do_db = astro_code # 只同步指定库&#10;# binlog_ignore_db = mysql,sys # 不同步的库&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-text"&gt;[mysqld]&#10;server-id = 1 # 主库 id，随便填，唯一就行&#10;log_bin = /var/log/mysql/mysql-bin.log&#10;read-only = 0 # 0 表示读写（主库）&#10;binlog_expire_logs_seconds = 2592000 # 日志保留 30 天&#10;max_binlog_size = 100M&#10;# binlog_do_db = astro_code # 只同步指定库&#10;# binlog_ignore_db = mysql,sys # 不同步的库&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="创建日志目录"&gt;创建日志目录&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo mkdir -p /var/log/mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo chown mysql:mysql /var/log/mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;755&lt;/span&gt; /var/log/mysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo mkdir -p /var/log/mysql&#10;sudo chown mysql:mysql /var/log/mysql&#10;sudo chmod 755 /var/log/mysql&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="重启主库"&gt;重启主库&lt;/h3&gt;&#10;&lt;figure&#10; class="code-block code-block--chroma code-block--line-numbers"&#10; data-code-block&#10; data-language="bash"&#10;&gt;&#10; &lt;figcaption class="code-block__toolbar"&gt;&#10; &lt;span class="code-block__language"&gt;bash&lt;/span&gt;&#10; &lt;button class="code-block__copy" type="button" data-code-copy&gt;复制&lt;/button&gt;&#10; &lt;/figcaption&gt;&#10; &lt;div class="code-block__viewport"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo systemctl restart mysqld&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block__fallback" hidden aria-hidden="true"&gt;&lt;code class="language-bash"&gt;sudo systemctl restart mysqld&lt;/code&gt;&lt;/pre&gt;&#10; &lt;button class="code-block__expand" type="button" data-code-expand hidden&gt;展开全部&lt;/button&gt;&#10;&lt;/figure&gt;&#10;&lt;h3 id="创建复制专用用户"&gt;创建复制专用用户&lt;/h3&gt;&#10;&lt;p&gt;主库上创建个用户给从库用：&lt;/p&gt;</description></item></channel></rss>