<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>运维与服务器 on 扎塔-Zata</title><link>https://www.zata.cc/categories/%E8%BF%90%E7%BB%B4%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%99%A8/</link><description>Recent content in 运维与服务器 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/categories/%E8%BF%90%E7%BB%B4%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%99%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>S3 兼容存储踩坑记：boto3 新默认校验和撞上 NotImplemented</title><link>https://www.zata.cc/p/s3-boto3-checksum-notimplemented/</link><pubDate>Thu, 10 Sep 2026 23:58:52 +0800</pubDate><guid>https://www.zata.cc/p/s3-boto3-checksum-notimplemented/</guid><description>&lt;img src="https://www.zata.cc/p/s3-boto3-checksum-notimplemented/images/index/index.svg" alt="Featured image of post S3 兼容存储踩坑记：boto3 新默认校验和撞上 NotImplemented" />&lt;h2 id="一场全线-500的发布事故">一场&amp;quot;全线 500&amp;quot;的发布事故
&lt;/h2>&lt;p>用自家 CLI 发布一篇博客，服务端返回 500。第一反应：肯定是包格式不对——毕竟几分钟前刚被 422 拒过一次（一个 2.9MB 的自包含 HTML 超了单条目 2MiB 上限），说明接口是通的，可能是我 ZIP 打包的方式不合规范。&lt;/p>
&lt;p>于是按标准流程排查：换 Markdown 源文件 + 图片资源重新打包、用最小草稿（三行文字的 md）测基本链路、HTML 单文件再试一遍……结果所有创建请求一律 500，draft 和 publish 两个端点无一幸免。&lt;/p>
&lt;p>但诡异的是：登录正常，草稿列表正常，健康检查正常，公开博客列表也能刷出来。&lt;strong>所有读路径全绿，所有写路径全红。&lt;/strong>&lt;/p>
&lt;p>如果真是包格式问题，最小草稿不可能挂；如果是认证问题，读接口不可能全通。这不像&amp;quot;我的请求有问题&amp;quot;，更像&amp;quot;服务端某个环节坏了&amp;quot;。&lt;/p>
&lt;h2 id="422-和-500-之间隔着一道分界线">422 和 500 之间隔着一道分界线
&lt;/h2>&lt;p>回头看现象，有一条隐藏的分界线：&lt;/p>
&lt;ul>
&lt;li>超限的 index.html 报 &lt;strong>422&lt;/strong>（校验错误，&lt;code>Zip entry exceeds the 2 MiB limit&lt;/code>）&lt;/li>
&lt;li>所有通过校验的请求报 &lt;strong>500&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>后端是分层架构：API 层收包 → core 层的 &lt;code>BlogService.extract_zip_package&lt;/code> 做校验（格式、大小、路径白名单、symlink）→ 校验通过后 &lt;code>upload_blog&lt;/code> 把正文和附件逐个写入对象存储。&lt;/p>
&lt;p>422 在校验层抛出，说明请求已经正常穿过 API 层；500 卡在&lt;strong>校验通过后的第一步&lt;/strong>——&lt;code>put_object&lt;/code>。把服务端日志拉出来，最底下赫然一行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">botocore.exceptions.ClientError: An error occurred (NotImplemented) when
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">calling the PutObject operation: Aws MultiChunkedEncoding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">STREAMING-UNSIGNED-PAYLOAD-TRAILER is not supported.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>问题根本不在博客业务，也不在包格式——是&lt;strong>对象存储的写入&lt;/strong>挂了。博客发布只是撞在枪口上的第一个受害者：任何要往 S3 写东西的功能（博客、语音、知识库）此时全部阵亡。&lt;/p>
&lt;h2 id="先补一点背景s3-兼容生态与请求编码">先补一点背景：S3 兼容生态与请求编码
&lt;/h2>&lt;h3 id="s3-api-是事实标准但兼容是程度问题">S3 API 是事实标准，但&amp;quot;兼容&amp;quot;是程度问题
&lt;/h3>&lt;p>AWS S3 的 REST API 已经是对象存储的事实标准，MinIO、Cloudflare R2、Backblaze B2、各家云厂商的兼容端点都实现了这套协议。自建 MinIO 时，客户端通过几个参数接入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">boto3&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;s3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">endpoint_url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://your-minio:9000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 指向自建端点，而非 aws&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">region_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;us-east-1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># MinIO 通常随便填一个&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">aws_access_key_id&lt;/span>&lt;span class="o">=...&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">aws_secret_access_key&lt;/span>&lt;span class="o">=...&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">config&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">boto3&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">session&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Config&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s3&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;addressing_style&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;path&amp;#34;&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="c1"># 关键：path-style&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中 &lt;code>addressing_style&lt;/code> 决定 bucket 怎么进 URL：&lt;code>path&lt;/code> 风格是 &lt;code>http://endpoint/bucket/key&lt;/code>，&lt;code>virtual_hosted&lt;/code> 风格是 &lt;code>http://bucket.endpoint/key&lt;/code>。自建 MinIO 没法给每个 bucket 配域名泛解析，所以必须用 path-style——这是自建存储的第一个常识坑。&lt;/p>
&lt;p>但&amp;quot;实现了 S3 API&amp;quot;不等于&amp;quot;实现了 AWS 最新加的每一个字段&amp;quot;。S3 协议在演进，兼容实现永远在追赶，追赶不上的时候，就会返回一个很直白的错误码：&lt;strong>NotImplemented&lt;/strong>。&lt;/p>
&lt;h3 id="签名-v4-之下请求体有三种泳姿">签名 V4 之下，请求体有三种&amp;quot;泳姿&amp;quot;
&lt;/h3>&lt;p>AWS 签名协议 V4 在传输 payload 时有这么几种形态：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>形态&lt;/th>
&lt;th>特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>signed payload&lt;/td>
&lt;td>请求体整体参与签名计算，头里放完整哈希&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>UNSIGNED-PAYLOAD&lt;/code>&lt;/td>
&lt;td>请求体不参与签名，靠 TLS 保证完整性&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>STREAMING-*&lt;/code>&lt;/td>
&lt;td>请求体按 &lt;code>aws-chunked&lt;/code> 分块流式传输，边传边签&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>而这次出事的 &lt;code>STREAMING-UNSIGNED-PAYLOAD-TRAILER&lt;/code> 是最新的变体：分块流式 + 不签名 + &lt;strong>trailer&lt;/strong>——即在所有数据块传完之后，再追加一个尾部块，携带整个请求体的 CRC32 校验和。这套机制是 AWS 2024 年底力推的&amp;quot;默认数据完整性&amp;quot;改造的一部分。&lt;/p>
&lt;h2 id="根因boto3-136-改了一个默认值">根因：boto3 1.36 改了一个默认值
&lt;/h2>&lt;p>2025 年 1 月，boto3 1.36.0 发布，官方 changelog 里有一条不起眼的变更：&lt;/p>
&lt;blockquote>
&lt;p>Default value of &lt;code>request_checksum_calculation&lt;/code> is changed from &lt;code>when_required&lt;/code> to &lt;code>when_supported&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;p>翻译成人话：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>以前（&lt;code>when_required&lt;/code>）&lt;/strong>：只有 API 明确要求校验和时才算。&lt;code>PutObject&lt;/code> 不要求，所以请求体就是普通字节流，任何 S3 兼容实现都吃得下。&lt;/li>
&lt;li>&lt;strong>现在（&lt;code>when_supported&lt;/code>）&lt;/strong>：只要 API &lt;em>支持&lt;/em> 校验和（&lt;code>PutObject&lt;/code> 正好支持），就默认给请求体算 CRC32，并用上面那套 &lt;code>STREAMING-UNSIGNED-PAYLOAD-TRAILER&lt;/code> 编码传输。&lt;/li>
&lt;/ul>
&lt;p>于是新版 boto3 对旧 MinIO（以及一批没跟进的兼容端点）发出的每个 PutObject 都长成了它们看不懂的样子，对端的回应整齐划一：&lt;code>NotImplemented&lt;/code>。&lt;/p>
&lt;p>为什么是&amp;quot;部署之后&amp;quot;才炸？仓库里 &lt;code>pyproject.toml&lt;/code> 写的是 &lt;code>boto3&amp;gt;=1.43.28&lt;/code>，依赖锁在 1.43.28。上一版镜像构建时拉的依赖、和这次重新构建拉的依赖，中间隔着这次默认值变更——&lt;strong>代码一行没改，重新构建镜像本身就成了变更&lt;/strong>。这也是&amp;quot;锁文件 + 常态化重新部署&amp;quot;模式的一个隐性代价：依赖漂移会以最意想不到的方式找上门。&lt;/p>
&lt;h2 id="修复一行-config三个层次">修复：一行 Config，三个层次
&lt;/h2>&lt;p>修复本身轻得可笑，在创建 boto3 客户端的 Config 里显式把行为钉回旧默认：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修复前：跟随 SDK 默认，1.36+ 对 PutObject 附带流式校验尾&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">config&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">boto3&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">session&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">s3&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;addressing_style&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">addressing_style&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修复后：仅在 API 要求时才计算校验和&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">config&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">boto3&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">session&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Config&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s3&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;addressing_style&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">addressing_style&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">request_checksum_calculation&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;when_required&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>除了改代码，还有两条等价路径，按生效成本排序：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>环境变量&lt;/strong>（不重新构建镜像，改完配置重启即生效）：给后端进程加 &lt;code>AWS_REQUEST_CHECKSUM_CALCULATION=when_required&lt;/code>，botocore 会读这个变量；&lt;/li>
&lt;li>&lt;strong>代码 Config&lt;/strong>（本文做法）：写死在适配器里，不依赖部署环境是否记得配这个变量；&lt;/li>
&lt;li>&lt;strong>升级存储端&lt;/strong>：新版本 MinIO 已支持流式校验尾，升级后可以吃回新默认。但注意必须升到 2026-04 之后的补丁版本——这条 trailer 路径先后曝出 CVE-2025-31489、CVE-2026-40344 等认证绕过漏洞（签名校验不完整，持有任意 secret 即可上传），修复分别落在 &lt;code>RELEASE.2025-04-03T14-56-28Z&lt;/code> 和 &lt;code>RELEASE.2026-04-11T03-20-12Z&lt;/code>。对安全敏感的自建场景，&lt;code>when_required&lt;/code> 依旧是更稳的答案。但&amp;quot;为了让客户端新默认能跑而去升级存储&amp;quot;这个依赖方向，在自建场景里通常不如反过来稳。&lt;/li>
&lt;/ol>
&lt;p>选代码层还有一个架构上的理由：全仓库只有一个创建 boto3 客户端的地方——infrastructure 层的对象存储适配器，博客、语音、知识库全部经由它读写。&lt;strong>修一处，全站愈合&lt;/strong>；这也意味着这类坑永远值得修在适配器里，而不是散落在各调用方。&lt;/p>
&lt;h2 id="同类清扫适配器里还埋着一个-ascii-坑">同类清扫：适配器里还埋着一个 ASCII 坑
&lt;/h2>&lt;p>顺着这次排查把对象存储适配器翻了一遍，发现它早已修过另一个&amp;quot;协议约束&amp;quot;类的问题，记录于此，因为它们本质上是同一类坑：&lt;strong>S3 的某些约束不在文档第一页，而在 HTTP 协议的物理规则里。&lt;/strong>&lt;/p>
&lt;p>S3 的用户元数据（&lt;code>x-amz-meta-*&lt;/code>）走的是 HTTP header，而 RFC 7230 规定 header 值必须是 ASCII。存中文描述时，botocore 的 &lt;code>validate_ascii_metadata&lt;/code> 会在&lt;strong>发请求之前&lt;/strong>就拒绝你：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">put_object&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="o">=...&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">=...&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">metadata&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;融入&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span> &lt;span class="c1"># ParamValidationError&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适配器里的解法是&amp;quot;写入时编码 + 侧车标记还原&amp;quot;：非 ASCII 值先 percent-encode，同时多写一个 &lt;code>&amp;lt;key&amp;gt;-encoding: utf-8-pct&lt;/code> 的侧车键；读取时发现有侧车标记就 &lt;code>unquote&lt;/code> 还原。不依赖任何带外信息，元数据自描述。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">_sanitize_s3_metadata&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">metadata&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">metadata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isascii&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sanitized&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">value&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sanitized&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">quote&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">safe&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 值编码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sanitized&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">-encoding&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;utf-8-pct&amp;#34;&lt;/span> &lt;span class="c1"># 侧车标记&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>把它和这次的校验和坑放在一起看，S3 兼容存储的踩坑地图就清晰了：&lt;strong>一类的坑源于&amp;quot;协议在演进，兼容端在追赶&amp;quot;（NotImplemented）；另一类源于&amp;quot;协议在收紧，客户端在把关&amp;quot;（ASCII 校验）&lt;/strong>。前者修客户端编码方式，后者修数据编码方式，但都该修在同一个适配器里。&lt;/p>
&lt;h2 id="验证">验证
&lt;/h2>&lt;p>修复的验证分三层，也正好对应问题的影响面：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>单元测试&lt;/strong>：对象存储适配器的元数据编解码测试全过，确认 Config 变更不影响既有行为；&lt;/li>
&lt;li>&lt;strong>影响面&lt;/strong>：全仓库搜索 &lt;code>boto3.client&lt;/code> 只有适配器一处调用点——博客、语音、知识库三条业务线同时被这一行修复覆盖；&lt;/li>
&lt;li>&lt;strong>真实入口&lt;/strong>：重新部署后，用 CLI 以原来的命令重新发布那篇文章，一次通过，公开页面正常渲染。&lt;/li>
&lt;/ol>
&lt;p>顺带一提，之前 422 拒掉的那个 2.9MB 自包含 HTML，最后也没有硬塞进去，而是改用设计内的路径：Markdown 正文 + 图片平铺进 &lt;code>assets/&lt;/code> 打包上传。事后看这次事故像是两件事，其实共享同一个教训——&lt;strong>别和平台默认值较劲，走它给你留的路&lt;/strong>。&lt;/p>
&lt;h2 id="几点收获">几点收获
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;兼容 S3&amp;quot;是一个光谱，不是一个开关&lt;/strong>。协议基础操作（对象增删改查）早就稳定，差异都藏在演进中的新特性里。判断一个兼容端点的成色，看它对最新协议扩展的支持比看 README 有用。&lt;/li>
&lt;li>&lt;strong>SDK 的默认值也是 API&lt;/strong>。boto3 这次变更完全符合语义化版本（major 没动，默认值动了），但对你来说行为就是变了。升级依赖 = 引入一次隐形变更，重新部署和改代码应该获得同级别的敬畏。&lt;/li>
&lt;li>&lt;strong>读写分离是天然的故障定位器&lt;/strong>。&amp;ldquo;读全绿、写全红&amp;quot;直接把嫌疑范围从整个 API 收窄到存储写入路径。分层架构平时的意义在排障时兑现：日志栈从 API 层一路穿到 botocore，每层只做一件事，所以每一栈帧都在缩小包围圈。&lt;/li>
&lt;li>&lt;strong>报错信息里最值钱的词是 NotImplemented&lt;/strong>。它不是&amp;quot;你错了&amp;rdquo;，而是&amp;quot;我们（实现方）还没做这个&amp;rdquo;——看到它就该去查协议演进和版本差异，而不是盯着自己的请求参数找茬。&lt;/li>
&lt;/ul></description></item><item><title>代理配置与环境变量实战</title><link>https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/</link><pubDate>Sat, 06 Jun 2026 10:00:00 +0800</pubDate><guid>https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/</guid><description>&lt;img src="https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/images/index/index.png" alt="Featured image of post 代理配置与环境变量实战" />&lt;h2 id="概述">概述
&lt;/h2>&lt;p>代理配置分为两个层面：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>系统代理&lt;/strong>：由操作系统或 GUI 客户端（如 Clash Verge）管理，主要影响浏览器和 GUI 应用。&lt;/li>
&lt;li>&lt;strong>环境变量代理&lt;/strong>：通过 &lt;code>http_proxy&lt;/code> / &lt;code>https_proxy&lt;/code> / &lt;code>ALL_PROXY&lt;/code> 等环境变量设置，主要影响命令行工具。&lt;/li>
&lt;/ul>
&lt;p>两者互相独立。系统代理设置了，终端里的 curl/git/docker 不一定走代理；反之亦然。&lt;/p>
&lt;hr>
&lt;h2 id="一macos-系统代理clash-verge">一、macOS 系统代理（Clash Verge）
&lt;/h2>&lt;p>Clash Verge 开启「系统代理」后，会自动配置 macOS 的网络代理设置，浏览器等 GUI 应用会走代理。&lt;/p>
&lt;h3 id="11-查看当前系统代理">1.1 查看当前系统代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">networksetup -getwebproxy &lt;span class="s2">&amp;#34;Wi-Fi&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">networksetup -getsecurewebproxy &lt;span class="s2">&amp;#34;Wi-Fi&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/image/index/1780752703648.png"
width="608"
height="203"
srcset="https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/image/index/1780752703648_hu5340957982220615921.png 480w, https://www.zata.cc/p/%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AE%9E%E6%88%98/image/index/1780752703648_hu5180979553952737406.png 1024w"
loading="lazy"
alt="1780752703648"
class="gallery-image"
data-flex-grow="299"
data-flex-basis="718px"
>&lt;/p>
&lt;h3 id="12-绕过列表bypass">1.2 绕过列表（Bypass）
&lt;/h3>&lt;p>在 Clash Verge 的「系统代理」设置中配置绕过地址，如：（一般默认就有了）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1, localhost, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意&lt;/strong>：系统代理的绕过列表主要影响浏览器和 GUI 应用，&lt;strong>对命令行工具不生效&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h2 id="二shell-环境变量配置">二、Shell 环境变量配置
&lt;/h2>&lt;h3 id="21-基础变量">2.1 基础变量
&lt;/h3>&lt;p>在 &lt;code>~/.zshrc&lt;/code>（或 &lt;code>~/.bashrc&lt;/code>）中添加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 代理地址（根据你的客户端端口修改）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">https_proxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ALL_PROXY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;socks5://127.0.0.1:7897&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 绕过本地和局域网&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">NO_PROXY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;127.0.0.1,localhost,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.zshrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="22-快速开关代理">2.2 快速开关代理
&lt;/h3>&lt;p>可以添加别名方便切换：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ~/.zshrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">proxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;export http_proxy=http://127.0.0.1:7897; export https_proxy=http://127.0.0.1:7897; export ALL_PROXY=socks5://127.0.0.1:7897&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">alias&lt;/span> &lt;span class="nv">unproxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;unset http_proxy; unset https_proxy; unset ALL_PROXY&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="23-只对当前命令生效">2.3 只对当前命令生效
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7897 curl -I https://github.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="三no_proxy-绕过详解">三、NO_PROXY 绕过详解
&lt;/h2>&lt;h3 id="31-问题现象">3.1 问题现象
&lt;/h3>&lt;p>Clash Verge 开启系统代理后，curl 访问 &lt;code>localhost&lt;/code> 返回 404：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl http://localhost:8000/api/xxx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># {&amp;#34;detail&amp;#34;:&amp;#34;Not Found&amp;#34;}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>curl -v&lt;/code> 发现请求走了代理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Uses&lt;/span> &lt;span class="n">proxy&lt;/span> &lt;span class="n">env&lt;/span> &lt;span class="n">variable&lt;/span> &lt;span class="n">http_proxy&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;http://127.0.0.1:7897&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-原因">3.2 原因
&lt;/h3>&lt;p>Clash Verge 的绕过列表不影响命令行工具。curl 读取 &lt;code>http_proxy&lt;/code> 环境变量后，会尝试通过代理访问 localhost，而代理服务器不认识这个本地地址。&lt;/p>
&lt;h3 id="33-解决">3.3 解决
&lt;/h3>&lt;p>补充 &lt;code>NO_PROXY&lt;/code> 环境变量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">NO_PROXY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;127.0.0.1,localhost,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>常见 NO_PROXY 值&lt;/strong>：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>地址&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>127.0.0.1&lt;/code>&lt;/td>
&lt;td>本地 IPv4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>localhost&lt;/code>&lt;/td>
&lt;td>本地主机名&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>::1&lt;/code>&lt;/td>
&lt;td>本地 IPv6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>192.168.0.0/16&lt;/code>&lt;/td>
&lt;td>私网 A 段&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>10.0.0.0/8&lt;/code>&lt;/td>
&lt;td>私网 B 段&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>172.16.0.0/12&lt;/code>&lt;/td>
&lt;td>私网 C 段&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="34-验证">3.4 验证
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -v http://localhost:8000/health
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 不再出现 &amp;#34;Uses proxy env variable&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="四git-代理配置">四、Git 代理配置
&lt;/h2>&lt;p>Git 不读取 &lt;code>http_proxy&lt;/code> 环境变量（某些版本会读，但不可靠），需要单独配置：&lt;/p>
&lt;h3 id="41-httphttps-代理">4.1 HTTP/HTTPS 代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git config --global http.proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global https.proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="42-socks5-代理">4.2 SOCKS5 代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git config --global http.proxy socks5://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="43-取消代理">4.3 取消代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git config --global --unset http.proxy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global --unset https.proxy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="44-仅对特定域名配置">4.4 仅对特定域名配置
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git config --global http.https://github.com.proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="五docker-代理配置">五、Docker 代理配置
&lt;/h2>&lt;p>Docker 的代理分两个层面：&lt;strong>Daemon 代理&lt;/strong>（影响 &lt;code>docker pull&lt;/code> 等命令）和&lt;strong>客户端默认代理&lt;/strong>（影响 &lt;code>docker run&lt;/code> / &lt;code>docker build&lt;/code> 自动注入的环境变量）。&lt;/p>
&lt;h3 id="51-docker-客户端默认代理">5.1 Docker 客户端默认代理
&lt;/h3>&lt;p>配置 &lt;code>~/.docker/config.json&lt;/code>，让 &lt;code>docker run&lt;/code> 和 &lt;code>docker build&lt;/code> 自动注入代理环境变量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir -p ~/.docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>~/.docker/config.json&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;proxies&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;httpProxy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;httpsProxy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;noProxy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;127.0.0.1,localhost,::1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意&lt;/strong>：这个配置只影响容器内部和构建过程，&lt;strong>不影响&lt;/strong> &lt;code>docker pull&lt;/code> 拉取镜像。&lt;/p>
&lt;h3 id="52-docker-daemon-代理">5.2 Docker Daemon 代理
&lt;/h3>&lt;p>&lt;code>docker pull&lt;/code> 等命令由 Docker Daemon 执行，Daemon 作为系统服务运行，不读取 Shell 环境变量，需要单独配置。&lt;/p>
&lt;p>&lt;strong>注意：macOS 上的特殊行为&lt;/strong>&lt;/p>
&lt;p>Docker Desktop for Mac 运行在一个轻量级 Linux VM 中，这个 VM 的网络流量&lt;strong>经过 macOS 主机的网络栈&lt;/strong>。因此即使没有在 Docker 中手动配置代理，Clash Verge 等工具开启的 &lt;strong>macOS 系统代理也会被 VM &amp;ldquo;捎带&amp;rdquo; 走&lt;/strong>。这会导致：&lt;/p>
&lt;ul>
&lt;li>开启 Clash 系统代理时，&lt;code>docker pull&lt;/code> 能正常拉取（走了代理）&lt;/li>
&lt;li>关闭 Clash 系统代理后，&lt;code>docker pull&lt;/code> 可能失败或极慢（因为原先走代理的流量现在直连不通了）&lt;/li>
&lt;/ul>
&lt;p>如果你需要 Docker 在&lt;strong>无论系统代理开或关&lt;/strong>的情况下都能稳定工作，建议显式配置 Daemon 代理（见下方）。&lt;/p>
&lt;p>&lt;strong>Linux (systemd)&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir -p /etc/systemd/system/docker.service.d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf &lt;span class="s">&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">[Service]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">Environment=&amp;#34;HTTP_PROXY=http://127.0.0.1:7897&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">Environment=&amp;#34;HTTPS_PROXY=http://127.0.0.1:7897&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">Environment=&amp;#34;NO_PROXY=localhost,127.0.0.1,::1&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>macOS (Docker Desktop)&lt;/strong>：&lt;/p>
&lt;p>Settings → Resources → Proxies → Manual proxy configuration&lt;/p>
&lt;h3 id="53-容器内代理">5.3 容器内代理
&lt;/h3>&lt;p>运行容器时传入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run -e &lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://host.docker.internal:7897 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">https_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://host.docker.internal:7897 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">NO_PROXY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost,127.0.0.1&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> ubuntu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意：容器内访问宿主机代理，macOS 用 &lt;code>host.docker.internal&lt;/code>，Linux 用宿主机的局域网 IP。&lt;/p>
&lt;hr>
&lt;h2 id="六包管理器代理">六、包管理器代理
&lt;/h2>&lt;h3 id="61-pip">6.1 pip
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install package-name --proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或设置环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PIP_PROXY&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="62-npm">6.2 npm
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm config &lt;span class="nb">set&lt;/span> proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config &lt;span class="nb">set&lt;/span> https-proxy http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 取消&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config delete proxy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm config delete https-proxy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="63-uv">6.3 uv
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># uv 读取标准环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">https_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7897
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或使用 --native-tls（某些证书问题场景）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install package-name --native-tls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="七常用工具代理">七、常用工具代理
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>工具&lt;/th>
&lt;th>代理方式&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>curl&lt;/code>&lt;/td>
&lt;td>读取 &lt;code>http_proxy&lt;/code> / &lt;code>https_proxy&lt;/code> / &lt;code>ALL_PROXY&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>wget&lt;/code>&lt;/td>
&lt;td>读取 &lt;code>http_proxy&lt;/code> / &lt;code>https_proxy&lt;/code>，或用 &lt;code>-e http_proxy=&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ssh&lt;/code>&lt;/td>
&lt;td>用 &lt;code>-o ProxyCommand=&amp;quot;nc -X 5 -x 127.0.0.1:7897 %h %p&amp;quot;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>brew&lt;/code>&lt;/td>
&lt;td>读取环境变量，或 &lt;code>HOMEBREW_CURLRC=1&lt;/code> + &lt;code>~/.curlrc&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>go get&lt;/code>&lt;/td>
&lt;td>读取 &lt;code>http_proxy&lt;/code> / &lt;code>https_proxy&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="71-curl-指定代理">7.1 curl 指定代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -x http://127.0.0.1:7897 https://api.github.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或 SOCKS5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -x socks5://127.0.0.1:7897 https://api.github.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="72-wget-指定代理">7.2 wget 指定代理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget -e &lt;span class="nv">http_proxy&lt;/span>&lt;span class="o">=&lt;/span>http://127.0.0.1:7897 https://example.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="八一键验证">八、一键验证
&lt;/h2>&lt;p>配置完成后，验证代理是否生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看当前代理环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;HTTP: &lt;/span>&lt;span class="nv">$http_proxy&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;HTTPS: &lt;/span>&lt;span class="nv">$https_proxy&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;ALL: &lt;/span>&lt;span class="nv">$ALL_PROXY&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;NO: &lt;/span>&lt;span class="nv">$NO_PROXY&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 测试外网（应走代理）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -s -o /dev/null -w &lt;span class="s2">&amp;#34;%{http_code}&amp;#34;&lt;/span> https://github.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 测试本地（应直连）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -v http://localhost:8000 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> grep -i &lt;span class="s2">&amp;#34;proxy&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看出口 IP（对比开关代理）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -s https://httpbin.org/ip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="九常见问题">九、常见问题
&lt;/h2>&lt;h3 id="q1-终端已经设置了代理但某些命令还是不生效">Q1: 终端已经设置了代理，但某些命令还是不生效？
&lt;/h3>&lt;p>某些工具（如 Git）不读环境变量，需要单独配置。详见上文各节。&lt;/p>
&lt;h3 id="q2-docker-容器内无法访问宿主机代理">Q2: Docker 容器内无法访问宿主机代理？
&lt;/h3>&lt;ul>
&lt;li>macOS: 用 &lt;code>host.docker.internal:7897&lt;/code>&lt;/li>
&lt;li>Linux: 用宿主机局域网 IP，如 &lt;code>192.168.1.x:7897&lt;/code>&lt;/li>
&lt;li>或配置 Docker 的 &lt;code>--network host&lt;/code>（仅限 Linux）&lt;/li>
&lt;/ul>
&lt;h3 id="q3-no_proxy-设置后不生效">Q3: NO_PROXY 设置后不生效？
&lt;/h3>&lt;p>注意大小写：&lt;/p>
&lt;ul>
&lt;li>大多数工具读 &lt;code>NO_PROXY&lt;/code>&lt;/li>
&lt;li>部分老工具读 &lt;code>no_proxy&lt;/code>
建议两个都设：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">NO_PROXY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">no_proxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$NO_PROXY&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>服务器磁盘管理基础</title><link>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/</link><pubDate>Fri, 05 Jun 2026 10:00:00 +0800</pubDate><guid>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/</guid><description>&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/images/index/index.png" alt="Featured image of post 服务器磁盘管理基础" />&lt;p>服务器运维的第一步是搞清楚自己手上有几块盘、有多大、挂在哪。本文覆盖从磁盘查看、分区格式化到持久化挂载的完整流程。&lt;/p>
&lt;hr>
&lt;h2 id="查看磁盘概况">查看磁盘概况
&lt;/h2>&lt;h3 id="1-lsblk--最直观的树形视图">1. lsblk —— 最直观的树形视图
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">lsblk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出示例：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/image/index/1780640633328.png"
width="812"
height="364"
srcset="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/image/index/1780640633328_hu5275955386156789794.png 480w, https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/image/index/1780640633328_hu2854119440593011549.png 1024w"
loading="lazy"
alt="1780640633328"
class="gallery-image"
data-flex-grow="223"
data-flex-basis="535px"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sda 8:0 0 50G 0 disk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─sda1 8:1 0 1G 0 part /boot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─sda2 8:2 0 49G 0 part /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sdb 8:16 0 100G 0 disk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─sdb1 8:17 0 100G 0 part /mnt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvme0n1 259:0 0 200G 0 disk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>解读：&lt;/p>
&lt;ul>
&lt;li>&lt;code>sda&lt;/code>、&lt;code>sdb&lt;/code>、&lt;code>nvme0n1&lt;/code> 是 &lt;strong>3 块物理磁盘&lt;/strong>&lt;/li>
&lt;li>&lt;code>sda&lt;/code> 分了 2 个区，分别挂载到 &lt;code>/boot&lt;/code> 和 &lt;code>/&lt;/code>&lt;/li>
&lt;li>&lt;code>sdb&lt;/code> 分了 1 个区，挂载到 &lt;code>/mnt&lt;/code>&lt;/li>
&lt;li>&lt;code>nvme0n1&lt;/code> 未分区、未挂载&lt;/li>
&lt;/ul>
&lt;p>常用参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 只看物理盘，不显示分区&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsblk -d -o NAME,SIZE,TYPE,MODEL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 显示文件系统类型和 UUID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsblk -f
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-df--h--查看已挂载分区的使用情况">2. df -h —— 查看已挂载分区的使用情况
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">df -h
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Filesystem Size Used Avail Use% Mounted on
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/sda2 49G 15G 32G 32% /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/sda1 1.0G 200M 800M 20% /boot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/dev/sdb1 100G 10G 90G 10% /mnt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-fdisk--l--查看所有磁盘详情含未挂载">3. fdisk -l —— 查看所有磁盘详情（含未挂载）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo fdisk -l
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要 root 权限，能看到 sector 大小、磁盘标签类型等详细信息。&lt;/p>
&lt;h3 id="4-查看磁盘类型hdd--ssd--nvme">4. 查看磁盘类型（HDD / SSD / NVMe）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法1：通过旋转状态判断（SSD 为 0）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat /sys/block/sda/queue/rotational
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 0 = SSD/NVMe, 1 = 机械硬盘&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法2：直接查看硬件信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsblk -d -o NAME,ROTA,TYPE,MODEL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法3：NVMe 专用信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nvme list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="分区与格式化">分区与格式化
&lt;/h2>&lt;h3 id="对新磁盘进行分区">对新磁盘进行分区
&lt;/h3>&lt;p>以 &lt;code>/dev/sdb&lt;/code> 为例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo fdisk /dev/sdb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>交互命令：&lt;/p>
&lt;ul>
&lt;li>&lt;code>n&lt;/code> —— 新建分区&lt;/li>
&lt;li>&lt;code>p&lt;/code> —— 主分区&lt;/li>
&lt;li>&lt;code>1&lt;/code> —— 分区号&lt;/li>
&lt;li>回车两次 —— 使用默认起始和结束扇区（占用整块盘）&lt;/li>
&lt;li>&lt;code>w&lt;/code> —— 写入并退出&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>大于 2TB 的磁盘请使用 &lt;code>gdisk&lt;/code> 或 &lt;code>parted&lt;/code>，fdisk 不支持 GPT 大分区。&lt;/p>
&lt;/blockquote>
&lt;h3 id="格式化分区">格式化分区
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ext4（Linux 最常用）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkfs.ext4 /dev/sdb1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># xfs（适合大文件、高并发）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkfs.xfs /dev/sdb1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="挂载磁盘">挂载磁盘
&lt;/h2>&lt;h3 id="临时挂载">临时挂载
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir -p /mnt/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mount /dev/sdb1 /mnt/data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重启后失效。&lt;/p>
&lt;h3 id="持久化挂载etcfstab">持久化挂载（/etc/fstab）
&lt;/h3>&lt;p>先获取分区的 UUID：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">lsblk -f /dev/sdb1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo blkid /dev/sdb1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>编辑 fstab：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/fstab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>添加一行（&lt;strong>务必用 UUID，不要用设备名&lt;/strong>，防止重启后设备名变化导致挂错盘）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">UUID=xxxxx-xxxxx-xxxxx /mnt/data ext4 defaults,noatime 0 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>字段说明：&lt;/p>
&lt;ul>
&lt;li>&lt;code>UUID=...&lt;/code> —— 分区的唯一标识&lt;/li>
&lt;li>&lt;code>/mnt/data&lt;/code> —— 挂载点&lt;/li>
&lt;li>&lt;code>ext4&lt;/code> —— 文件系统类型&lt;/li>
&lt;li>&lt;code>defaults,noatime&lt;/code> —— 挂载选项（noatime 减少不必要的写操作，延长 SSD 寿命）&lt;/li>
&lt;li>&lt;code>0&lt;/code> —— dump 备份标记（一般填 0）&lt;/li>
&lt;li>&lt;code>2&lt;/code> —— fsck 检查顺序（根目录填 1，其他填 2，不检查填 0）&lt;/li>
&lt;/ul>
&lt;p>验证配置是否正确：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mount -a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>无报错即表示配置正确。如果配错了，重启后可能进不了系统，所以 &lt;strong>mount -a 验证这一步不能省&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h2 id="场景把-docker-数据迁移到数据盘">场景：把 Docker 数据迁移到数据盘
&lt;/h2>&lt;p>这是最常见的需求之一。系统盘通常只有 50G，数据盘有几百 G。将 Docker 数据根目录改到 &lt;code>/mnt/docker_data&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl stop docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl stop docker.socket
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /mnt/docker_data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo rsync -aP /var/lib/docker/ /mnt/docker_data/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo nano /etc/docker/daemon.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>写入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;data-root&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/mnt/docker_data&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>验证：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker info &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;Docker Root Dir&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 应输出 /mnt/docker_data&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更详细的方案（软链接、Compose 级挂载等）可参考 &lt;a class="link" href="https://www.zata.cc/p/docker%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/" >Docker 容器相关命令&lt;/a> 中的&amp;quot;数据卷自动挂载到 /mnt&amp;quot;一节。&lt;/p>
&lt;hr>
&lt;h2 id="常用命令速查表">常用命令速查表
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>需求&lt;/th>
&lt;th>命令&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>查看物理磁盘列表&lt;/td>
&lt;td>&lt;code>lsblk -d&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查看分区 + 挂载点&lt;/td>
&lt;td>&lt;code>lsblk&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查看已挂载磁盘使用率&lt;/td>
&lt;td>&lt;code>df -h&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查看所有磁盘详情&lt;/td>
&lt;td>&lt;code>sudo fdisk -l&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查看分区 UUID&lt;/td>
&lt;td>&lt;code>lsblk -f&lt;/code> 或 &lt;code>sudo blkid&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>判断 SSD/HDD&lt;/td>
&lt;td>&lt;code>cat /sys/block/sdX/queue/rotational&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新建分区&lt;/td>
&lt;td>&lt;code>sudo fdisk /dev/sdX&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>格式化 ext4&lt;/td>
&lt;td>&lt;code>sudo mkfs.ext4 /dev/sdX1&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>临时挂载&lt;/td>
&lt;td>&lt;code>sudo mount /dev/sdX1 /mnt/xxx&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>验证 fstab&lt;/td>
&lt;td>&lt;code>sudo mount -a&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>查看目录占用空间&lt;/td>
&lt;td>&lt;code>du -sh /path&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="注意事项">注意事项
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>操作前确认设备名&lt;/strong>：&lt;code>sda&lt;/code>、&lt;code>sdb&lt;/code> 在不同机器、甚至同一机器重启后可能变化，写脚本或 fstab 时尽量用 UUID。&lt;/li>
&lt;li>&lt;strong>不要直接格式化已挂载的分区&lt;/strong>：先 &lt;code>umount&lt;/code>，或者在救援模式下操作。&lt;/li>
&lt;li>&lt;strong>云服务器的数据盘&lt;/strong>：首次使用需要先在控制台&amp;quot;挂载&amp;quot;到实例，然后在系统内分区格式化。阿里云、AWS、GCP 都是如此。&lt;/li>
&lt;li>&lt;strong>LVM 场景&lt;/strong>：某些云镜像默认使用 LVM，此时 &lt;code>lsblk&lt;/code> 看到的结构会更复杂（&lt;code>vg-xxx&lt;/code>、&lt;code>lv-xxx&lt;/code>），扩容操作需要用 &lt;code>lvextend&lt;/code> + &lt;code>resize2fs&lt;/code>。&lt;/li>
&lt;/ol></description></item><item><title>数据库备份实战</title><link>https://www.zata.cc/p/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E5%AE%9E%E6%88%98/</link><pubDate>Thu, 28 May 2026 14:55:07 +0800</pubDate><guid>https://www.zata.cc/p/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E5%AE%9E%E6%88%98/</guid><description>&lt;img src="https://www.zata.cc/p/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E5%AE%9E%E6%88%98/images/index/index.png" alt="Featured image of post 数据库备份实战" />&lt;h2 id="前言">前言
&lt;/h2>&lt;p>数据是企业的核心资产，数据库备份是数据安全的最后一道防线。本文将系统介绍 PostgreSQL 和 MySQL 的备份方法、自动化策略以及恢复演练流程。&lt;/p>
&lt;h2 id="一postgresql-备份">一、PostgreSQL 备份
&lt;/h2>&lt;h3 id="11-pg_dump-基础用法">1.1 pg_dump 基础用法
&lt;/h3>&lt;p>&lt;code>pg_dump&lt;/code> 是 PostgreSQL 最常用的逻辑备份工具，支持单数据库导出。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本备份命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 压缩备份（推荐）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb -Fc &amp;gt; backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份结构（不含数据）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb --schema-only &amp;gt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份数据（不含结构）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb --data-only &amp;gt; data.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb -t users -t orders &amp;gt; tables.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>参数说明：&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-h&lt;/code>&lt;/td>
&lt;td>数据库主机地址&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-U&lt;/code>&lt;/td>
&lt;td>连接用户名&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-d&lt;/code>&lt;/td>
&lt;td>数据库名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-Fc&lt;/code>&lt;/td>
&lt;td>自定义格式压缩（推荐，支持并行恢复）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-t&lt;/code>&lt;/td>
&lt;td>指定备份的表&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="12-pg_dumpall-全库备份">1.2 pg_dumpall 全库备份
&lt;/h3>&lt;p>备份整个 PostgreSQL 实例（所有数据库 + 全局对象）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份所有数据库和全局对象（角色、表空间等）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres &amp;gt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份全局对象（角色定义）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres --globals-only &amp;gt; globals.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="13-恢复方法">1.3 恢复方法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复 SQL 格式备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复自定义格式备份（支持并行）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -j &lt;span class="m">4&lt;/span> backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复前创建新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb_restore
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb_restore backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="二mysql-备份">二、MySQL 备份
&lt;/h2>&lt;h3 id="21-mysqldump-基础用法">2.1 mysqldump 基础用法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本备份命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份所有数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p --all-databases &amp;gt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb users orders &amp;gt; tables.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份结构&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb --no-data &amp;gt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb --no-create-info &amp;gt; data.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>推荐参数组合：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生产环境推荐参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --single-transaction &lt;span class="se">\ &lt;/span> &lt;span class="c1"># InnoDB 一致性快照&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --routines &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含存储过程和函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --triggers &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含触发器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --events &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含事件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --master-data&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 记录 binlog 位置（用于主从同步）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="22-恢复方法">2.2 恢复方法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复所有数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p &amp;lt; all_databases.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="三其他-postgresql-图形化工具">三、其他 PostgreSQL 图形化工具
&lt;/h2>&lt;p>除了 Navicat，还有多种优秀的 PostgreSQL 客户端工具支持备份和恢复功能。&lt;/p>
&lt;h3 id="31-pgadmin">3.1 pgAdmin
&lt;/h3>&lt;p>pgAdmin 是 PostgreSQL 官方推荐的免费图形化管理工具：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask pgadmin4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.pgadmin.org/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>连接数据库服务器，选择目标数据库&lt;/li>
&lt;li>右键点击数据库 →「备份」&lt;/li>
&lt;li>配置备份选项：
&lt;ul>
&lt;li>&lt;strong>格式&lt;/strong>：Custom（推荐）、Directory、Plain SQL、Tar&lt;/li>
&lt;li>&lt;strong>编码&lt;/strong>：UTF8（推荐）&lt;/li>
&lt;li>&lt;strong>中定义&lt;/strong>：选择「仅结构」或「结构和数据」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>选择备份文件保存位置，点击「备份」&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 →「恢复」&lt;/li>
&lt;li>选择备份文件（.backup 或 .dump）&lt;/li>
&lt;li>配置恢复选项：
&lt;ul>
&lt;li>&lt;strong>架构&lt;/strong>：选择要恢复的 schema&lt;/li>
&lt;li>&lt;strong>数据&lt;/strong>：选择要恢复的表&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>点击「恢复」执行&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>免费开源，官方推荐&lt;/li>
&lt;li>功能全面，支持服务器管理&lt;/li>
&lt;li>跨平台（Windows/macOS/Linux）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>界面较复杂，新手上手较难&lt;/li>
&lt;li>大数据库备份可能较慢&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="32-dbeaver">3.2 DBeaver
&lt;/h3>&lt;p>DBeaver 是一款功能强大的免费数据库管理工具，支持 PostgreSQL 及多种数据库：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask dbeaver-community
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://dbeaver.io/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击数据库 →「工具」→「备份数据库」&lt;/li>
&lt;li>选择备份对象（整个库或指定表）&lt;/li>
&lt;li>配置备份选项：
&lt;ul>
&lt;li>&lt;strong>格式&lt;/strong>：SQL、Dump、CSV 等&lt;/li>
&lt;li>&lt;strong>选项&lt;/strong>：包含索引、触发器、外键等&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>保存备份文件&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 →「工具」→「恢复数据库」&lt;/li>
&lt;li>选择备份文件&lt;/li>
&lt;li>配置恢复选项&lt;/li>
&lt;li>执行恢复&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>完全免费开源&lt;/li>
&lt;li>支持 80+ 种数据库&lt;/li>
&lt;li>界面友好，功能丰富&lt;/li>
&lt;li>支持数据导出/导入&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>功能较多，界面稍显复杂&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="33-datagrip">3.3 DataGrip
&lt;/h3>&lt;p>JetBrains DataGrip 是一款专业的数据库 IDE（付费）：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask datagrip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.jetbrains.com/datagrip/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份方式：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键数据库 →「Dump to File」导出&lt;/li>
&lt;li>使用 Database Diff 进行数据库同步备份&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>强大的 SQL 编辑和调试功能&lt;/li>
&lt;li>支持多数据库管理&lt;/li>
&lt;li>与 JetBrains 全家桶集成良好&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="34-heidisql">3.4 HeidiSQL
&lt;/h3>&lt;p>HeidiSQL 主要用于 MySQL/MariaDB，但也支持 PostgreSQL：&lt;/p>
&lt;p>&lt;strong>备份：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>右键数据库 →「导出数据库为 SQL」&lt;/li>
&lt;li>支持自定义导出选项&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>免费、轻量级&lt;/li>
&lt;li>Windows 专用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="35-phppgadmin">3.5 phpPgAdmin
&lt;/h3>&lt;p>基于 Web 的 PostgreSQL 管理工具：&lt;/p>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>浏览器访问，无需安装客户端&lt;/li>
&lt;li>适合服务器管理&lt;/li>
&lt;li>功能相对基础&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="36-adminer">3.6 Adminer
&lt;/h3>&lt;p>轻量级单文件数据库管理工具：&lt;/p>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>仅一个 PHP 文件，非常轻量&lt;/li>
&lt;li>支持 PostgreSQL、MySQL、MongoDB 等&lt;/li>
&lt;li>可直接通过 Web 访问&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="37-工具对比">3.7 工具对比
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>工具&lt;/th>
&lt;th>类型&lt;/th>
&lt;th>价格&lt;/th>
&lt;th>跨平台&lt;/th>
&lt;th>特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Navicat&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>付费&lt;/td>
&lt;td>Windows/macOS/Linux&lt;/td>
&lt;td>功能全面，界面美观&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>pgAdmin&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>官方推荐，功能强大&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DBeaver&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>开源社区活跃&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DataGrip&lt;/strong>&lt;/td>
&lt;td>IDE&lt;/td>
&lt;td>付费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>开发者友好&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>HeidiSQL&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>Windows&lt;/td>
&lt;td>轻量级&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>phpPgAdmin&lt;/strong>&lt;/td>
&lt;td>Web 应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>无需安装客户端&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Adminer&lt;/strong>&lt;/td>
&lt;td>Web 应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>极轻量级&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="38-命令行工具补充">3.8 命令行工具补充
&lt;/h3>&lt;p>除了图形化工具，以下命令行工具也非常有用：&lt;/p>
&lt;p>&lt;strong>pg_dumpall&lt;/strong>（已介绍）：备份所有数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres &amp;gt; all.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>psql&lt;/strong>（已介绍）：恢复 SQL 文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>pg_basebackup&lt;/strong>：物理备份（完整数据库复制）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建物理备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_basebackup -h localhost -U postgres -D /backup/base -Ft -z -P
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复物理备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -d postgres /backup/base
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Barman&lt;/strong>：企业级备份管理工具&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置备份服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman check pg_server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman backup pg_server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman recover pg_server latest /var/lib/postgresql/data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="四navicat-图形化备份">四、Navicat 图形化备份
&lt;/h2>&lt;p>Navicat 是一款流行的数据库管理工具，支持 MySQL、PostgreSQL、SQL Server、Oracle 等多种数据库，提供直观的图形界面进行备份操作。&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装 Navicat Premium（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask navicat-premium
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或安装 Navicat for PostgreSQL 专用版&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask navicat-for-postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.navicat.com.cn/download/navicat-premium&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="41-postgresql-备份">4.1 PostgreSQL 备份
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>连接数据库&lt;/strong>：在左侧连接列表中选择 PostgreSQL 连接&lt;/li>
&lt;li>&lt;strong>开始备份&lt;/strong>：
&lt;ul>
&lt;li>右键点击目标数据库 → 选择「备份数据库」&lt;/li>
&lt;li>或菜单栏选择「工具」→「备份数据库」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>配置备份选项&lt;/strong>：
&lt;ul>
&lt;li>选择备份格式（建议选择「自定义」格式）&lt;/li>
&lt;li>可选择要包含的对象（表、视图、函数等）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>保存备份&lt;/strong>：点击「开始」后选择保存位置&lt;/li>
&lt;/ol>
&lt;h3 id="42-mysql-备份">4.2 MySQL 备份
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>连接数据库&lt;/strong>：在左侧连接列表中选择 MySQL 连接&lt;/li>
&lt;li>&lt;strong>数据同步（迁移备份）&lt;/strong>：
&lt;ul>
&lt;li>菜单栏选择「工具」→「数据同步」&lt;/li>
&lt;li>源选择当前数据库&lt;/li>
&lt;li>目标选择文件或另一个数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>导出数据库&lt;/strong>：
&lt;ul>
&lt;li>右键数据库 →「转储 SQL 文件」→「结构和数据」或「仅结构」&lt;/li>
&lt;li>自动生成 .sql 文件保存到本地&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="43-定时自动备份navicat-premium">4.3 定时自动备份（Navicat Premium）
&lt;/h3>&lt;p>Navicat Premium 支持定时任务自动备份：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>新建批处理作业&lt;/strong>：
&lt;ul>
&lt;li>菜单栏选择「工具」→「自动运行」或「计划」&lt;/li>
&lt;li>点击「新建批处理作业」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>添加备份任务&lt;/strong>：
&lt;ul>
&lt;li>从左侧拖拽「备份」任务到右侧流程区&lt;/li>
&lt;li>选择连接和数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>配置定时计划&lt;/strong>：
&lt;ul>
&lt;li>勾选「计划」选项卡&lt;/li>
&lt;li>设置执行频率（每天、每周等）&lt;/li>
&lt;li>设置执行时间&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>保存并启用&lt;/strong>：
&lt;ul>
&lt;li>保存批处理作业&lt;/li>
&lt;li>勾选「启用」启动定时任务&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="44-navicat-cloud-备份">4.4 Navicat Cloud 备份
&lt;/h3>&lt;p>Navicat Cloud 提供云端备份同步功能：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>登录 Navicat Cloud&lt;/strong>：
&lt;ul>
&lt;li>菜单栏「文件」→「登录 Navicat Cloud」&lt;/li>
&lt;li>输入账号密码&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>同步备份&lt;/strong>：
&lt;ul>
&lt;li>右键数据库 →「备份到 Navicat Cloud」&lt;/li>
&lt;li>或通过「工具」→「同步」上传备份&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>恢复云端备份&lt;/strong>：
&lt;ul>
&lt;li>从 Navicat Cloud 下载备份文件&lt;/li>
&lt;li>恢复到本地数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="45-navicat-恢复数据库">4.5 Navicat 恢复数据库
&lt;/h3>&lt;p>备份的最终目的是恢复，Navicat 提供了便捷的恢复功能：&lt;/p>
&lt;p>&lt;strong>PostgreSQL 恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 → 选择「还原数据库」&lt;/li>
&lt;li>选择备份文件（.backup 或 .dump 格式）&lt;/li>
&lt;li>配置恢复选项：
&lt;ul>
&lt;li>&lt;strong>仅还原结构&lt;/strong>：只恢复表结构，不恢复数据&lt;/li>
&lt;li>&lt;strong>仅还原数据&lt;/strong>：只恢复数据，表结构需已存在&lt;/li>
&lt;li>&lt;strong>结构和数据&lt;/strong>：完整恢复（推荐）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>点击「开始」执行恢复&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>MySQL 恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>运行 SQL 文件&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>右键目标数据库 →「运行 SQL 文件」&lt;/li>
&lt;li>选择之前导出的 .sql 备份文件&lt;/li>
&lt;li>执行导入&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>数据同步恢复&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>菜单栏「工具」→「数据同步」&lt;/li>
&lt;li>源选择备份文件或备份库&lt;/li>
&lt;li>目标选择要恢复的数据库&lt;/li>
&lt;li>执行同步&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复注意事项：&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>场景&lt;/th>
&lt;th>注意事项&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>覆盖恢复&lt;/strong>&lt;/td>
&lt;td>确保目标库已清空或删除，避免数据冲突&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>部分恢复&lt;/strong>&lt;/td>
&lt;td>可选择仅恢复特定表，减少恢复时间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>跨版本恢复&lt;/strong>&lt;/td>
&lt;td>高版本备份可能无法恢复到低版本数据库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>字符集问题&lt;/strong>&lt;/td>
&lt;td>确保备份和恢复使用相同字符集，避免乱码&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="46-navicat-备份注意事项">4.6 Navicat 备份注意事项
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>注意事项&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>备份位置&lt;/strong>&lt;/td>
&lt;td>建议保存到非系统盘，避免系统崩溃丢失&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>文件命名&lt;/strong>&lt;/td>
&lt;td>包含日期时间，便于追溯（如 &lt;code>mydb_20260528.sql&lt;/code>）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>定期检查&lt;/strong>&lt;/td>
&lt;td>定期验证备份文件能否正常恢复&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>大数据库&lt;/strong>&lt;/td>
&lt;td>超大数据库建议使用命令行工具，性能更优&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>密码保护&lt;/strong>&lt;/td>
&lt;td>敏感数据库建议设置备份文件密码&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="五自动化备份脚本">五、自动化备份脚本
&lt;/h2>&lt;h3 id="51-postgresql-自动备份脚本">5.1 PostgreSQL 自动备份脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># pg_backup.sh - PostgreSQL 自动备份脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;postgres&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;5432&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RETENTION_DAYS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d_%H%M%S&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建备份目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$BACKUP_DIR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有数据库列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATABASES&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>psql -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -p &lt;span class="nv">$PG_PORT&lt;/span> -t -c &lt;span class="s2">&amp;#34;SELECT datname FROM pg_database WHERE datistemplate = false;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 遍历备份每个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> DB in &lt;span class="nv">$DATABASES&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">DB&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">echo&lt;/span> &lt;span class="nv">$DB&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -n &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;正在备份数据库: &lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_dump -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -p &lt;span class="nv">$PG_PORT&lt;/span> -d &lt;span class="nv">$DB&lt;/span> -Fc &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$BACKUP_DIR&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DB&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">_&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DATE&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.dump&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理过期备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$BACKUP_DIR&lt;/span> -name &lt;span class="s2">&amp;#34;*.dump&amp;#34;&lt;/span> -mtime +&lt;span class="nv">$RETENTION_DAYS&lt;/span> -delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;备份完成！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-mysql-自动备份脚本">5.2 MySQL 自动备份脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># mysql_backup.sh - MySQL 自动备份脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_PASS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;your_password&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/mysql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RETENTION_DAYS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d_%H%M%S&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建备份目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$BACKUP_DIR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有数据库列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATABASES&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>mysql -h &lt;span class="nv">$MYSQL_HOST&lt;/span> -u &lt;span class="nv">$MYSQL_USER&lt;/span> -p&lt;span class="nv">$MYSQL_PASS&lt;/span> -e &lt;span class="s2">&amp;#34;SHOW DATABASES;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> grep -v Database &lt;span class="p">|&lt;/span> grep -v information_schema &lt;span class="p">|&lt;/span> grep -v performance_schema&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 遍历备份每个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> DB in &lt;span class="nv">$DATABASES&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;正在备份数据库: &lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mysqldump -h &lt;span class="nv">$MYSQL_HOST&lt;/span> -u &lt;span class="nv">$MYSQL_USER&lt;/span> -p&lt;span class="nv">$MYSQL_PASS&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --single-transaction --routines --triggers --events &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="nv">$DB&lt;/span> &lt;span class="p">|&lt;/span> gzip &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$BACKUP_DIR&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DB&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">_&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DATE&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.sql.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理过期备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$BACKUP_DIR&lt;/span> -name &lt;span class="s2">&amp;#34;*.sql.gz&amp;#34;&lt;/span> -mtime +&lt;span class="nv">$RETENTION_DAYS&lt;/span> -delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;备份完成！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="53-配置定时任务">5.3 配置定时任务
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑 crontab&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crontab -e
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 每天凌晨 2 点执行备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> &lt;span class="m">2&lt;/span> * * * /scripts/pg_backup.sh &amp;gt;&amp;gt; /var/log/pg_backup.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> &lt;span class="m">2&lt;/span> * * * /scripts/mysql_backup.sh &amp;gt;&amp;gt; /var/log/mysql_backup.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="六云存储备份">六、云存储备份
&lt;/h2>&lt;h3 id="51-上传到-aws-s3">5.1 上传到 AWS S3
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># upload_to_s3.sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">S3_BUCKET&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;s3://your-bucket/database-backups&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 同步备份文件到 S3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">aws s3 sync &lt;span class="nv">$BACKUP_DIR&lt;/span> &lt;span class="nv">$S3_BUCKET&lt;/span>/&lt;span class="nv">$DATE&lt;/span>/ &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --storage-class STANDARD_IA &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置生命周期规则自动清理旧备份（在 S3 控制台配置）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-上传到-cloudflare-r2">5.2 上传到 Cloudflare R2
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 rclone 同步到 R2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rclone sync /backup/postgresql r2:your-bucket/database-backups/&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="七备份策略最佳实践">七、备份策略最佳实践
&lt;/h2>&lt;h3 id="61-备份类型对比">6.1 备份类型对比
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>类型&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>优点&lt;/th>
&lt;th>缺点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>全量备份&lt;/strong>&lt;/td>
&lt;td>备份所有数据&lt;/td>
&lt;td>恢复简单快速&lt;/td>
&lt;td>占用空间大，耗时长&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>增量备份&lt;/strong>&lt;/td>
&lt;td>仅备份变化数据&lt;/td>
&lt;td>占用空间小&lt;/td>
&lt;td>恢复需要全量+所有增量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>差异备份&lt;/strong>&lt;/td>
&lt;td>备份自上次全量后的变化&lt;/td>
&lt;td>恢复比增量快&lt;/td>
&lt;td>比增量占用更多空间&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="62-推荐策略">6.2 推荐策略
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">生产环境推荐备份策略：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 周日：全量备份 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 周一~周六：增量备份 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 保留周期：至少 4 周 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 异地备份：同步到云存储（S3/R2/OSS） │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 恢复演练：每月至少 1 次 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="63-备份验证清单">6.3 备份验证清单
&lt;/h3>&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> 备份文件是否完整生成&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 备份文件大小是否合理&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 备份是否按时执行（检查 cron 日志）&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 异地备份是否同步成功&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 定期进行恢复演练&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="八数据恢复命令行">八、数据恢复（命令行）
&lt;/h2>&lt;p>命令行恢复是生产环境中最重要的技能，本节详细介绍 PostgreSQL 和 MySQL 的恢复操作。&lt;/p>
&lt;h3 id="71-postgresql-恢复详解">7.1 PostgreSQL 恢复详解
&lt;/h3>&lt;p>&lt;strong>基础恢复命令：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复 SQL 格式备份（纯文本）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复自定义格式备份（.dump 文件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 并行恢复（加快大数据库恢复速度）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -j &lt;span class="m">4&lt;/span> backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>创建新数据库恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 创建新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb_new
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 恢复数据到新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb_new backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>恢复前清理目标库：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果目标库存在且要完全覆盖，先删除&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h localhost -U postgres mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重新创建数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>选择性恢复（仅恢复指定表）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 列出备份中的所有对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -l backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复特定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -t users backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -t orders backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复存储过程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -P -t function_name backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>恢复前检查选项：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 先检查备份文件内容（不执行恢复）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore --help &lt;span class="c1"># 查看所有选项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 不带数据恢复（仅检查结构）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb --schema-only backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复到另一个表空间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb --tablespace&lt;span class="o">=&lt;/span>new_space backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="72-mysql-恢复详解">7.2 MySQL 恢复详解
&lt;/h3>&lt;p>&lt;strong>基础恢复命令：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复单个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复所有数据库（备份时包含 CREATE DATABASE 语句）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p &amp;lt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复压缩备份（gzip 格式）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gunzip &amp;lt; backup.sql.gz &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或使用 zcat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">zcat backup.sql.gz &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>指定字符集恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果有字符集问题，指定字符集&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p --default-character-set&lt;span class="o">=&lt;/span>utf8mb4 mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或在 SQL 文件开头设置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p --init-command&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;SET NAMES utf8mb4&amp;#34;&lt;/span> mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>覆盖恢复（先清空后导入）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 删除并重建数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p -e &lt;span class="s2">&amp;#34;DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 恢复数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>选择性恢复（仅恢复指定表）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法1：使用 sed 提取指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -n &lt;span class="s1">&amp;#39;/DROP TABLE.*`表名`;/,/UNLOCK TABLES;/p&amp;#39;&lt;/span> backup.sql &amp;gt; table.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; table.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法2：使用 mysqlimport（需要先创建空表）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqlimport -h localhost -u root -p mydb table_data.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法3：使用 mydumper 并行导出/导入指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mydumper -h localhost -u root -p -o /backup/tables -t users -t orders
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">myloader -h localhost -u root -p -d /backup/tables -o mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>表结构与数据分离恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复表结构&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复数据（表结构需已存在）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb --init-command&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;SET foreign_key_checks=0; SET unique_checks=0; SET SESSION tx_isolation=&amp;#39;READ-UNCOMMITTED&amp;#39;;&amp;#34;&lt;/span> &amp;lt; data.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="73-恢复高级技巧">7.3 恢复高级技巧
&lt;/h3>&lt;p>&lt;strong>时间点恢复（PITR）：&lt;/strong>&lt;/p>
&lt;p>PostgreSQL 支持基于时间点的恢复：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 停止 PostgreSQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl stop postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 备份当前数据目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp -r /var/lib/postgresql/data /var/lib/postgresql/data.bak
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 恢复到指定时间点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PGDATA&lt;/span>&lt;span class="o">=&lt;/span>/var/lib/postgresql/data pg_restore -P --clean --create --dbname&lt;span class="o">=&lt;/span>postgres backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或编辑 postgresql.conf 设置恢复目标时间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># recovery_target_time = &amp;#39;2026-05-28 10:00:00&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>MySQL binlog 恢复：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 确定恢复时间点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqlbinlog --start-datetime&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026-05-28 10:00:00&amp;#34;&lt;/span> --stop-datetime&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026-05-28 12:00:00&amp;#34;&lt;/span> mysql-bin.000001 &amp;gt; recovery.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 应用恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; recovery.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>增量备份恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL WAL 归档恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 恢复基础全量备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d postgres backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 应用 WAL 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; &lt;span class="m">000000010000000000000001&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; &lt;span class="m">000000010000000000000002&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>跨服务器恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL：恢复远程数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h remote_host -U postgres -d mydb &lt;span class="p">|&lt;/span> pg_restore -h localhost -U postgres -d mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># MySQL：远程到本地&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h remote_host -u root -p mydb &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="74-恢复检查清单">7.4 恢复检查清单
&lt;/h3>&lt;p>执行恢复前务必检查以下项目：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>检查项&lt;/th>
&lt;th>操作&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>备份文件完整性&lt;/strong>&lt;/td>
&lt;td>检查文件大小和校验和&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>磁盘空间&lt;/strong>&lt;/td>
&lt;td>确认目标磁盘有足够空间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>数据库版本&lt;/strong>&lt;/td>
&lt;td>确保备份和目标版本兼容&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>字符集&lt;/strong>&lt;/td>
&lt;td>确认字符集设置一致&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>连接权限&lt;/strong>&lt;/td>
&lt;td>确认恢复账号有足够权限&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>依赖关系&lt;/strong>&lt;/td>
&lt;td>检查存储过程、触发器依赖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>外键约束&lt;/strong>&lt;/td>
&lt;td>恢复时关闭外键检查可加速&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="九恢复演练">九、恢复演练
&lt;/h2>&lt;p>恢复演练是备份策略中&lt;strong>最容易被忽视但最重要&lt;/strong>的环节！&lt;/p>
&lt;h3 id="91-演练脚本">9.1 演练脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># restore_drill.sh - 恢复演练脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_FILE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql/mydb_20260528_020000.dump&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TEST_DB&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;mydb_drill_test&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;postgres&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 数据库恢复演练开始 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;时间: &lt;/span>&lt;span class="k">$(&lt;/span>date&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 创建测试数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;1. 创建测试数据库: &lt;/span>&lt;span class="nv">$TEST_DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$POSTGRES_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span> 2&amp;gt;/dev/null &lt;span class="o">||&lt;/span> &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 执行恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;2. 执行恢复...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -d &lt;span class="nv">$TEST_DB&lt;/span> &lt;span class="nv">$BACKUP_FILE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 验证数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;3. 验证数据完整性...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TABLE_COUNT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>psql -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -d &lt;span class="nv">$TEST_DB&lt;/span> -t -c &lt;span class="s2">&amp;#34;SELECT count(*) FROM information_schema.tables WHERE table_schema = &amp;#39;public&amp;#39;;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34; 恢复表数量: &lt;/span>&lt;span class="nv">$TABLE_COUNT&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 清理测试数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;4. 清理测试数据库...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 恢复演练完成 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="92-演练报告模板">9.2 演练报告模板
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">数据库恢复演练报告
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">==================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">日期：2026-05-28
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">演练人员：张三
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">备份文件：mydb_20260528_020000.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">备份大小：1.2 GB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">演练结果：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 恢复耗时：3分28秒
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 表数量：45
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 数据完整性：✓ 通过
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 应用连接测试：✓ 通过
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">结论：备份有效，恢复流程正常。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="十常见问题">十、常见问题
&lt;/h2>&lt;h3 id="q1-备份时数据库是否需要停服">Q1: 备份时数据库是否需要停服？
&lt;/h3>&lt;p>&lt;strong>不需要。&lt;/strong> PostgreSQL 的 &lt;code>pg_dump&lt;/code> 和 MySQL 的 &lt;code>mysqldump --single-transaction&lt;/code> 都支持在线热备份，不会阻塞业务。&lt;/p>
&lt;h3 id="q2-大数据库备份太慢怎么办">Q2: 大数据库备份太慢怎么办？
&lt;/h3>&lt;ul>
&lt;li>PostgreSQL：使用 &lt;code>-j&lt;/code> 参数并行备份/恢复&lt;/li>
&lt;li>MySQL：考虑使用 &lt;code>mydumper&lt;/code> 工具并行导出&lt;/li>
&lt;li>超大数据库建议使用物理备份工具（pg_basebackup、XtraBackup）&lt;/li>
&lt;/ul>
&lt;h3 id="q3-如何备份-docker-中的数据库">Q3: 如何备份 Docker 中的数据库？
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> postgres pg_dump -U postgres mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># MySQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> mysql mysqldump -u root -pPassword mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="总结">总结
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>备份是刚需&lt;/strong>：没有备份的数据库就是在裸奔&lt;/li>
&lt;li>&lt;strong>自动化是关键&lt;/strong>：手动备份一定会被遗忘&lt;/li>
&lt;li>&lt;strong>异地备份是保障&lt;/strong>：服务器挂了，备份还在&lt;/li>
&lt;li>&lt;strong>演练是验证&lt;/strong>：没测试过的备份等于没有备份&lt;/li>
&lt;li>&lt;strong>监控是补充&lt;/strong>：备份失败要及时告警&lt;/li>
&lt;/ol>
&lt;p>记住：&lt;strong>数据无价，备份先行！&lt;/strong>&lt;/p></description></item><item><title>server_ops</title><link>https://www.zata.cc/p/server_ops/</link><pubDate>Tue, 24 Mar 2026 15:25:22 +0800</pubDate><guid>https://www.zata.cc/p/server_ops/</guid><description>&lt;img src="https://www.zata.cc/p/server_ops/images/index/index.png" alt="Featured image of post server_ops" />&lt;h1 id="注意事项">注意事项
&lt;/h1>&lt;h2 id="-血泪教训别再把数据库和业务代码塞进同一个-docker-容器了">🩸 血泪教训：别再把数据库和业务代码塞进同一个 Docker 容器了！
&lt;/h2>&lt;p>&lt;strong>前言：&lt;/strong>&lt;/p>
&lt;p>刚接触 Docker 的时候，我曾陷入一个深深的误区——认为“容器化部署”就等于把前端、后端、MySQL、Redis 等所有东西全都写进一个 docker-compose.yml 里，然后在服务器上敲一行 docker-compose up -d，看着整个世界“一键启动”，简直爽翻了。&lt;/p>
&lt;p>直到最近，我经历了一次惨痛的教训：业务代码引发的资源耗尽导致 MySQL 崩溃，随之而来的是极其痛苦的备份恢复，整个服务直接瘫痪。&lt;/p>
&lt;p>这次事故让我彻底顿悟：在生产环境中，绝不能把基础设施（Infra）和实际业务代码混在一起部署。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>1. 为什么“一键打包”只适合玩具项目？&lt;/strong>&lt;/p>
&lt;p>把所有服务部署在同一台机器上，在本地开发或测试环境确实是银弹，但在生产环境却是一场定时炸弹。从“单机思维”走向“架构思维”，我们需要明白以下几个核心差异：&lt;/p>
&lt;p>🆚 &lt;strong>无状态（业务应用） vs 有状态（数据库）&lt;/strong>&lt;/p>
&lt;p>你的后端 API 是“无状态”的，随时可以重启、销毁、水平扩展，崩了拉起一个新的立刻就能用。而数据库（MySQL/PostgreSQL）是“有状态”的，里面存着身家性命。把它们绑在一起，无异于让脆弱的消耗品和贵重的传家宝放在同一个易碎的盒子里。&lt;/p>
&lt;p>💣 &lt;strong>恐怖的“爆炸半径”（Blast Radius）&lt;/strong>&lt;/p>
&lt;p>如果业务代码出现 Bug（比如内存泄漏），或者遭遇突发流量，服务器的 CPU 和内存会被瞬间吃光。这时 Linux 的 OOM Killer 就会无情启动，强制杀掉占用内存大的进程——通常数据库就是那个“冤大头”。业务代码的锅，导致数据库崩溃，进而导致全站瘫痪。&lt;/p>
&lt;p>此外，业务日志和数据库争抢磁盘 IOPS，也会让数据库性能大打折扣。&lt;/p>
&lt;p>💡 &lt;strong>架构顿悟：让计算归计算，存储归存储。&lt;/strong> 将业务应用和数据库分别部署在不同的服务器上，进行物理隔离，是迈向高可用架构的第一步。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>2. 妥协与选择：自建 Docker 版 PostgreSQL&lt;/strong>&lt;/p>
&lt;p>明确了分离部署的原则后，我面临了一个新问题：我手头的云厂商 RDS 只有 MySQL，但我目前的业务非常想用 PostgreSQL。&lt;/p>
&lt;p>云厂商的高级托管服务（如 AWS RDS 或 Serverless 方案如 Neon/Supabase）当然是首选，但如果受限于预算或现有资源，单独买一台服务器，用 Docker 跑 PostgreSQL 依然是一个极具性价比且成熟的方案。&lt;/p>
&lt;p>很多人担心 Docker 部署数据库会有性能损耗。但在中小规模业务面前，那 2%~5% 的网络/IO损耗完全可以忽略不计。相反，只要坚持了**“物理分离”**的原则，Docker 带来的环境一致性和迁移便利性绝对物超所值。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>3. 生产级 Docker PostgreSQL 部署指南&lt;/strong>&lt;/p>
&lt;p>既然成为了自己的 DBA，就不能像本地开发那样随意。以下是我整理的部署在独立数据库服务器上的生产级 docker-compose.yml 模板：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">postgres&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgres:16-alpine &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 推荐指定明确的版本号，Alpine体积更小&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgres_prod&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 宿主机重启时自动拉起&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">POSTGRES_USER&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">myuser &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># ⚠️ 不要用默认的 postgres 作为日常用户名&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">POSTGRES_PASSWORD&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">MyStrongPassword_123! &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">POSTGRES_DB&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mydb &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">TZ&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Asia/Shanghai &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># ⚠️ 警告：千万不要写 &amp;#34;5432:5432&amp;#34; 直接暴露公网！&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;5432:5432&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 核心！必须把数据挂载到宿主机，绝对不能留在容器内&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/postgres_data/data:/var/lib/postgresql/data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 挂载一个备份目录，方便宿主机的定时任务导出数据&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/postgres_data/backups:/backups&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 【性能调优】Docker PG默认 shared_buffers 极小 (128MB)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 推荐把 shared_buffers 设置为这台独立服务器总物理内存的 25% (假设分配1GB)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;postgres&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;shared_buffers=1GB&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;max_connections=200&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;strong>4. 守住底线：数据库保命的“三道防线”&lt;/strong>&lt;/p>
&lt;p>脱离了云数据库 RDS 的温室，自建 Docker 数据库必须自己做好以下三道保险，否则之前的悲剧迟早重演：&lt;/p>
&lt;p>🛡️ &lt;strong>第一道防线：防勒索（网络隔离）&lt;/strong>&lt;/p>
&lt;p>自建数据库最容易踩的坑就是被勒索软件删库要比特币。&lt;/p>
&lt;p>绝对不要把 5432 端口暴露在公网上！&lt;/p>
&lt;p>去云服务器控制台的安全组（防火墙）设置中，配置 5432 端口的入站规则：仅允许你业务服务器的内网 IP 访问。&lt;/p>
&lt;p>🚀 &lt;strong>第二道防线：突破默认限制（性能调优）&lt;/strong>&lt;/p>
&lt;p>不要抱怨 Docker 跑 PG 慢，往往是因为没改配置。PG 默认的 shared_buffers 非常保守（128MB），会导致疯狂读写硬盘。如果你这台专用的 DB 服务器有 4G 内存，直接在 docker command 里设为 1GB（25% 原则），性能会有质的飞跃。&lt;/p>
&lt;p>💾 &lt;strong>第三道防线：自动化异地备份（保命符）&lt;/strong>&lt;/p>
&lt;p>由于没了 RDS 的自动备份，我们必须手动写 Crontab 脚本每天导出，并且一定要传到异地（如对象存储 OSS/S3）。&lt;/p>
&lt;p>一个简单的 Bash 备份脚本参考 (backup.sh)：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y-%m-%d&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/data/postgres_data/backups&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 容器内执行 pg_dump 导出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> postgres_prod pg_dump -U myuser -d mydb -F c -f /backups/mydb_&lt;span class="nv">$DATE&lt;/span>.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 删除7天前的旧备份（防止撑爆硬盘）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$BACKUP_DIR&lt;/span> -name &lt;span class="s2">&amp;#34;*.dump&amp;#34;&lt;/span> -type f -mtime +7 -exec rm -f &lt;span class="o">{}&lt;/span> &lt;span class="se">\;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 【关键】上传到对象存储或另一台机器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ossutil cp $BACKUP_DIR/mydb_$DATE.dump oss://my-backup-bucket/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过 &lt;code>crontab -e&lt;/code> 设定每天凌晨 3 点执行：&lt;code>0 3 * * * /bin/bash /data/postgres_data/backup.sh&lt;/code>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>写在最后&lt;/strong>&lt;/p>
&lt;p>从“把所有东西塞进一个容器里一键启动”，到“将业务逻辑与基础设施拆分并做好隔离与备份”，这是每一个开发者向后端架构师蜕变的必经之路。&lt;/p>
&lt;p>“性能损失”从来不是自建数据库的痛点，“运维疏忽”才是。只要严格遵守分离部署 + 挂载卷 + 限制公网访问 + 定时异地备份，你用 Docker 搭建的 PostgreSQL，足以平稳支撑你的业务走过漫长的初创和成长期。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>5. 用户权限管理：创建只读用户&lt;/strong>&lt;/p>
&lt;p>在实际生产环境中，我们经常需要给第三方工具或只读分析需求提供数据库访问，但绝不能直接暴露拥有写权限的超级用户。&lt;/p>
&lt;p>以下是在 PostgreSQL 中创建一个只读用户的完整命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 1. 创建只读用户（替换密码为强密码）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readonly_vanta&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PASSWORD&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;Vanta123456!&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 2. 授予数据库连接权限
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CONNECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Vanta&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readonly_vanta&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 3. 授予 schema 的使用权限
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USAGE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readonly_vanta&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 4. 授予现有所有表的查询权限
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readonly_vanta&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 5. 【关键】设置默认权限，使该用户自动拥有未来新建表的查询权
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">ALTER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFAULT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">IN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SCHEMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TABLES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readonly_vanta&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>💡 &lt;strong>注意事项&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>创建用户后，务必在安全组中限制该用户的连接来源 IP，避免公网直接暴露。&lt;/li>
&lt;li>如果数据库已有多个 schema，需要针对每个 schema 重复执行 &lt;code>GRANT USAGE&lt;/code> 和 &lt;code>GRANT SELECT&lt;/code>。&lt;/li>
&lt;li>如需回收权限，可使用 &lt;code>REVOKE&lt;/code> 命令或直接用 &lt;code>DROP USER readonly_vanta;&lt;/code> 删除用户。&lt;/li>
&lt;/ul>
&lt;/blockquote></description></item><item><title>阿里云服务器</title><link>https://www.zata.cc/p/%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</link><pubDate>Sun, 22 Mar 2026 22:35:40 +0800</pubDate><guid>https://www.zata.cc/p/%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</guid><description>&lt;img src="https://www.zata.cc/p/%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/images/index/index.png" alt="Featured image of post 阿里云服务器" />&lt;h1 id="注意事项">注意事项
&lt;/h1>&lt;ul>
&lt;li>我碰到过一次，下面新加的防火墙策略和上面的策略冲突，导致下面的失效，如果下面的策略没有问题，就不要加上面的策略&lt;/li>
&lt;/ul></description></item><item><title>服务器爬墙</title><link>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/</link><pubDate>Fri, 20 Mar 2026 00:31:26 +0800</pubDate><guid>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/</guid><description>&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/index.png" alt="Featured image of post 服务器爬墙" />&lt;h1 id="安装和配置">安装和配置
&lt;/h1>&lt;p>&lt;a class="link" href="mihomo-linux-amd64-v1.19.21.deb" >mihomo安装包&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="country.mmdb" >mmdb文件&lt;/a>&lt;/p>
&lt;hr>
&lt;p>&lt;a class="link" href="https://github.com/MetaCubeX/mihomo/releases" target="_blank" rel="noopener"
>mihomo - github地址&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/Dreamacro/maxmind-geoip/releases" target="_blank" rel="noopener"
>maxmind-geoip - github地址&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>首先下载deb包和mmdb（或者压缩包）
&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image.png"
width="3374"
height="2028"
srcset="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image_hu10934082459871596353.png 480w, https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image_hu2472621948217888999.png 1024w"
loading="lazy"
alt="deb安装包"
class="gallery-image"
data-flex-grow="166"
data-flex-basis="399px"
>
&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-2.png"
width="3404"
height="1978"
srcset="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-2_hu2752975169327569838.png 480w, https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-2_hu15528879812114941317.png 1024w"
loading="lazy"
alt="mmdb文件"
class="gallery-image"
data-flex-grow="172"
data-flex-basis="413px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>传输到远程服务器&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">scp &amp;lt;deb包名&amp;gt;.deb root@remote_server:/root/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp &amp;lt;mmdb文件名&amp;gt;.mmdb root@remote_server:/root/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>安装deb包&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">dpkg -i /root/&amp;lt;deb包名&amp;gt;.deb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>4.下载 Country.mmdb&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 进入配置目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /etc/mihomo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 下载 Country.mmdb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -L -o Country.mmdb https://ghp.ci/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#或者&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制 mmdb 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp /root/&amp;lt;mmdb文件名&amp;gt;.mmdb Country.mmdb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制 mmdb 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp Country.mmdb /etc/mihomo/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>修改配置文件&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim /etc/mihomo/config.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 粘贴你的clash配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【-------】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 把这几行添加到配置文件的开头&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">geodata-loader: memconservative
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">geodata-mode: &lt;span class="nb">false&lt;/span> &lt;span class="c1"># 某些版本可用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">external-controller: 0.0.0.0:9090 &lt;span class="c1"># 外部控制端口，建议 0.0.0.0 方便远程访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">secret: &lt;span class="s2">&amp;#34;your_secret_password&amp;#34;&lt;/span> &lt;span class="c1"># 控制面板密码 (强烈建议修改)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">external-ui: ui &lt;span class="c1"># 控制面板文件目录 (可选)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-1.png"
width="1224"
height="332"
srcset="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-1_hu1180109389163394389.png 480w, https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%88%AC%E5%A2%99/images/index/image-1_hu1999628109651433375.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="368"
data-flex-basis="884px"
>&lt;/p>
&lt;ol start="6">
&lt;li>重启服务&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl restart mihomo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 立即查看日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">journalctl -u mihomo -f
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="7">
&lt;li>访问控制面板&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 访问控制面板&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">http://remote_server:9090/ui?secret&lt;span class="o">=&lt;/span>your_secret_password
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="8">
&lt;li>配置环境变量&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 写入环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;export http_proxy=http://127.0.0.1:7890&amp;#34;&lt;/span> &amp;gt;&amp;gt; ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;export https_proxy=http://127.0.0.1:7890&amp;#34;&lt;/span> &amp;gt;&amp;gt; ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使其立即生效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="9">
&lt;li>设置开机自启&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置开机自启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> mihomo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>域名迁移</title><link>https://www.zata.cc/p/%E5%9F%9F%E5%90%8D%E8%BF%81%E7%A7%BB/</link><pubDate>Sat, 14 Mar 2026 02:44:12 +0800</pubDate><guid>https://www.zata.cc/p/%E5%9F%9F%E5%90%8D%E8%BF%81%E7%A7%BB/</guid><description>&lt;img src="https://www.zata.cc/p/%E5%9F%9F%E5%90%8D%E8%BF%81%E7%A7%BB/images/index/index.png" alt="Featured image of post 域名迁移" />&lt;h1 id="域名迁移避坑指南解决-dns-缓存与数据一致性的终极方案">域名迁移避坑指南：解决 DNS 缓存与数据一致性的终极方案
&lt;/h1>&lt;p>在服务器迁移、更换 IP 或域名解析切换的过程中，开发者最常遇到的噩梦莫过于：&lt;strong>明明 DNS 解析已经生效，Ping 也是新 IP，但部分用户依然访问的是旧服务器，甚至导致数据写入错误或服务不可用。&lt;/strong>&lt;/p>
&lt;p>很多开发者倾向于直接关停旧服务以“止损”，但这往往会导致用户端出现 502/504 错误或连接超时，严重影响用户体验。本文将深入剖析 DNS 缓存的机制，解释为何“刷新页面”无效，并提供三种不同级别的平滑迁移方案，帮助你实现用户无感知的无缝切换。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>一、为什么解析生效了，流量还在旧 IP？&lt;/strong>&lt;/p>
&lt;p>即使你在本地通过 &lt;code>ping&lt;/code> 或 &lt;code>nslookup&lt;/code> 确认解析已更新，部分用户（甚至你自己）仍可能访问旧 IP。这并非玄学，而是由 &lt;strong>DNS 缓存的多级机制&lt;/strong> 和 &lt;strong>网络连接特性&lt;/strong> 决定的。&lt;/p>
&lt;p>&lt;strong>1. DNS 缓存的多级“拦路虎”&lt;/strong>
DNS 解析并非实时查询，而是层层缓存。当用户发起请求时，IP 地址的获取顺序如下：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>浏览器缓存&lt;/strong>：Chrome、Safari 等浏览器自带 DNS 缓存（如 Chrome 的 &lt;code>chrome://net-internals/#dns&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>操作系统缓存&lt;/strong>：Windows/macOS/Linux 系统内核会缓存 DNS 记录。&lt;/li>
&lt;li>&lt;strong>本地网络设备&lt;/strong>：家庭或公司的路由器、光猫可能缓存了旧解析。&lt;/li>
&lt;li>&lt;strong>运营商（ISP）缓存&lt;/strong>：这是最不可控的一环。电信、联通等运营商为了节省带宽，往往无视你设置的 TTL（生存时间），强行缓存旧记录。部分地区可能需要几小时甚至 48 小时才能彻底刷新。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>2. 长连接（Keep-Alive）未断开&lt;/strong>
如果客户端（App、浏览器页面、第三方 API）与旧服务器建立了 HTTP 长连接或 WebSocket，只要连接未断开，后续请求会直接在原有的 TCP 连接上发送，&lt;strong>根本不会触发新的 DNS 查询&lt;/strong>。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>二、为什么用户疯狂“刷新”也没用？&lt;/strong>&lt;/p>
&lt;p>很多开发者误以为让用户“刷新页面”就能获取最新网络状态。实际上，&lt;strong>浏览器的“刷新”刷新的是 HTTP 请求，而不是 DNS 解析。&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>真实情况&lt;/strong>：只要上述任何一个缓存环节（浏览器、系统、路由器、运营商）命中了旧 IP，用户无论按多少次 F5，流量依然会死死地打在旧服务器上。&lt;/li>
&lt;li>&lt;strong>何时生效&lt;/strong>：除非用户切换网络（如 WiFi 切 5G）、重启路由器、或手动清空 DNS 缓存（&lt;code>ipconfig /flushdns&lt;/code>），否则只能被动等待缓存过期（TTL 到期）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>直接关停旧服务的后果：&lt;/strong>
如果旧服务器直接关机或杀进程，访问旧 IP 的用户将面临：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>连接失败/超时&lt;/strong>：用户以为网站倒闭或服务器宕机。&lt;/li>
&lt;li>&lt;strong>502/504 错误&lt;/strong>：如果只关了应用没关网关。&lt;/li>
&lt;li>&lt;strong>数据焦虑&lt;/strong>：正在提交表单或付款的用户遇到报错，会疯狂重复提交，导致数据混乱或用户流失。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>三、三大解决方案：如何完美处理旧服务？&lt;/strong>&lt;/p>
&lt;p>核心诉求是：&lt;strong>防止数据错误（写错库、数据不同步），同时保证用户体验。&lt;/strong> 根据业务容忍度，可选择以下三种方案。&lt;/p>
&lt;p>&lt;strong>方案 A：旧服务器做“反向代理”（⭐️ 最优解，强推）&lt;/strong>&lt;/p>
&lt;p>这是大厂做无缝迁移的标准做法。不要停掉旧服务器的网络，而是让旧服务器充当“跳板”，将收到的流量透明地转发给新服务器。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>原理&lt;/strong>：无论用户 DNS 刷新与否，最终处理请求和写入数据的都是新服务器。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：用户无感知，数据 100% 一致，无报错。&lt;/li>
&lt;li>&lt;strong>操作&lt;/strong>：修改旧服务器 Nginx 配置，停掉旧服务进程，将请求 Proxy 到新服务器 IP。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nginx 配置示例：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 关键点：直接写新服务器的 IP 地址，千万不要写域名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1"># 否则旧服务器可能自己解析回自己，造成死循环
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://&amp;lt;新服务器的&lt;/span> &lt;span class="s">IP&lt;/span> &lt;span class="s">地址&amp;gt;:&amp;lt;新服务器端口&amp;gt;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 透传真实用户信息
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">proxy_set_header&lt;/span> &lt;span class="s">Host&lt;/span> &lt;span class="nv">$host&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">proxy_set_header&lt;/span> &lt;span class="s">X-Real-IP&lt;/span> &lt;span class="nv">$remote_addr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">proxy_set_header&lt;/span> &lt;span class="s">X-Forwarded-For&lt;/span> &lt;span class="nv">$proxy_add_x_forwarded_for&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>后续步骤&lt;/strong>：配置生效后，观察旧服务器流量。等 48 小时后确认所有地区 DNS 刷新完毕，再无流量进入，再下线旧服务器。&lt;/p>
&lt;p>&lt;strong>方案 B：修改旧服务数据库连接（适用于内网/直连）&lt;/strong>&lt;/p>
&lt;p>如果新旧服务器处于同一内网，或允许公网数据库直连，可保持旧服务器服务运行，但修改其配置。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>原理&lt;/strong>：流量可能打到旧机器，但数据落库指向新数据库。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：避免数据分裂，实现数据统一。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：旧代码逻辑可能不兼容新库结构；依赖网络连通性。&lt;/li>
&lt;li>&lt;strong>操作&lt;/strong>：修改旧服务的 JDBC URL / Redis URL 等配置，指向新服务器数据库。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>方案 C：返回优雅的“维护中”提示（兜底方案）&lt;/strong>&lt;/p>
&lt;p>如果方案 A 和 B 都无法实施，且你宁可让用户报错，也绝对不能接受数据出现错误。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>原理&lt;/strong>：停掉业务逻辑，但保留 Web 服务器返回明确状态码。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：明确告知用户系统状态，避免产生“网站挂了”的误解，防止脏数据。&lt;/li>
&lt;li>&lt;strong>操作&lt;/strong>：关掉旧服务器的后台应用（Java/Node/PHP），让 Nginx 直接返回 503。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nginx 配置示例：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 返回 503 状态码及提示
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">default_type&lt;/span> &lt;span class="s">application/json&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">return&lt;/span> &lt;span class="mi">503&lt;/span> &lt;span class="s">&amp;#39;&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="kn">&amp;#34;code&amp;#34;:&lt;/span> &lt;span class="mi">503&lt;/span>&lt;span class="s">,&lt;/span> &lt;span class="s">&amp;#34;msg&amp;#34;:&lt;/span> &lt;span class="s">&amp;#34;系统升级中，由于您的本地网络运营商&lt;/span> &lt;span class="s">DNS&lt;/span> &lt;span class="s">缓存暂未刷新，请等待&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="s">-30&lt;/span> &lt;span class="s">分钟后刷新重试。&amp;#34;&lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="s">&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;strong>四、未来迁移的避坑经验（TTL 预调整）&lt;/strong>&lt;/p>
&lt;p>为了避免下次迁移出现同样的问题，建议在换 IP 的 &lt;strong>前几天&lt;/strong> 执行以下操作：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>调低 TTL&lt;/strong>：去域名服务商处，将 DNS 记录的 TTL 值改到最小（如 60 秒 或 120 秒）。&lt;/li>
&lt;li>&lt;strong>等待生效&lt;/strong>：等待旧的长 TTL 过期，确保全球 DNS 服务器都接受了短 TTL 设置。&lt;/li>
&lt;li>&lt;strong>执行迁移&lt;/strong>：此时更换 IP，缓存刷新速度会大大加快。&lt;/li>
&lt;li>&lt;strong>恢复 TTL&lt;/strong>：确认迁移无误后，将 TTL 调回正常值（如 10 分钟或更长），以减轻 DNS 服务器压力。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>五、总结与建议&lt;/strong>&lt;/p>
&lt;p>域名迁移不仅仅是改一条 A 记录，更是一场关于缓存与连接的博弈。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>立刻行动&lt;/strong>：如果正在迁移中，请首选 &lt;strong>方案 A（Nginx 反向代理）&lt;/strong>。只需花 2 分钟改几行配置，就能确保流量无缝导向新服务器，杜绝 502 错误和数据不一致。&lt;/li>
&lt;li>&lt;strong>核心原则&lt;/strong>：作为开发者，“让用户无感知地平滑过渡”是最佳实践。&lt;/li>
&lt;li>&lt;strong>下线时机&lt;/strong>：只要旧服务器机器未到期，建议保留 2-3 天作为缓冲期。确认监控中旧服务器无任何流量后，再彻底关机。&lt;/li>
&lt;/ul>
&lt;p>通过优雅的处理方式，不仅能保护数据一致性，更能体现团队的专业性，避免不必要的用户投诉与信任危机。&lt;/p></description></item><item><title>服务器安全-server Security</title><link>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8-server-security/</link><pubDate>Mon, 09 Mar 2026 13:54:43 +0800</pubDate><guid>https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8-server-security/</guid><description>&lt;img src="https://www.zata.cc/p/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8-server-security/images/index/index.png" alt="Featured image of post 服务器安全-server Security" />&lt;p>这份教程的基础架构非常扎实，逻辑清晰。作为一个有追求的 AI 协作伙伴，我为你进行了&lt;strong>深度改写&lt;/strong>。&lt;/p>
&lt;p>这次改写的核心提升在于：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>交互感&lt;/strong>：将枯燥的步骤转化为“闯关”体验。&lt;/li>
&lt;li>&lt;strong>技术严谨性&lt;/strong>：修正了 Ubuntu 系统中 &lt;code>sshd_config.d&lt;/code> 覆盖配置的常见坑点。&lt;/li>
&lt;li>&lt;strong>可读性&lt;/strong>：使用更清晰的 Markdown 布局和视觉引导。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="-linux-服务器金钟罩15-分钟全手工安全加固指南">🛡️ Linux 服务器金钟罩：15 分钟全手工安全加固指南
&lt;/h1>&lt;blockquote>
&lt;p>&lt;strong>写在前面：&lt;/strong> 互联网上每秒有数万个脚本在扫描公网 IP。如果你的服务器还在用默认端口、弱密码、开着 Root 登录，那不是“会不会被黑”的问题，而是“什么时候被黑”的问题。&lt;/p>
&lt;/blockquote>
&lt;h3 id="-终极保命准则">🚨 终极保命准则
&lt;/h3>&lt;p>&lt;strong>操作期间，千万不要断开当前的 SSH 窗口！&lt;/strong>
每完成一步加固，务必&lt;strong>新开一个终端窗口&lt;/strong>测试能否登录。确认无误后，再继续下一步。&lt;/p>
&lt;hr>
&lt;h2 id="第一阶段深度体检寻找破绽">第一阶段：深度体检（寻找破绽）
&lt;/h2>&lt;p>我们先通过一个自检脚本，看看你的服务器在黑客眼中长什么样。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>创建检测脚本&lt;/strong>：&lt;code>nano security_check.sh&lt;/code>&lt;/li>
&lt;li>&lt;strong>填入代码&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 颜色定义&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RED&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;\033[0;31m&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">GREEN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;\033[0;32m&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">YELLOW&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;\033[1;33m&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">NC&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;\033[0m&amp;#39;&lt;/span> &lt;span class="c1"># 恢复默认颜色&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">==================================================&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 服务器基础安全配置自检脚本 (只读模式) &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">==================================================&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查是否以 root 权限运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$EUID&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> -ne &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">RED&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[!] 请使用 sudo 运行此脚本 (例如: sudo bash security_check.sh)&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[1] 正在检查 SSH 安全配置...&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">SSH_PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>sshd -T &lt;span class="p">|&lt;/span> grep -w &lt;span class="s2">&amp;#34;^port&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">SSH_ROOT_LOGIN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>sshd -T &lt;span class="p">|&lt;/span> grep -w &lt;span class="s2">&amp;#34;^permitrootlogin&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">SSH_PASS_AUTH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>sshd -T &lt;span class="p">|&lt;/span> grep -w &lt;span class="s2">&amp;#34;^passwordauthentication&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$SSH_PORT&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;22&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 SSH 端口: &lt;/span>&lt;span class="nv">$SSH_PORT&lt;/span>&lt;span class="s2"> (默认端口, 易被扫描)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 SSH 端口: &lt;/span>&lt;span class="nv">$SSH_PORT&lt;/span>&lt;span class="s2"> (已修改为非标准端口)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$SSH_ROOT_LOGIN&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;yes&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 Root 直接登录: 允许 (极高风险, 容易被爆破 root 密码)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 Root 直接登录: 禁止&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$SSH_PASS_AUTH&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;yes&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 密码登录: 允许 (高风险, 建议改用密钥登录)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 密码登录: 禁止 (安全, 已启用纯密钥登录)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[2] 正在检查防火墙状态...&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="nb">command&lt;/span> -v ufw &amp;gt; /dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>1&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">UFW_STATUS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ufw status &lt;span class="p">|&lt;/span> grep -i &lt;span class="s2">&amp;#34;Status: active\|状态： 激活&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -n &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$UFW_STATUS&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 防火墙 (UFW): 已启用&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 防火墙 (UFW): 未启用!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">elif&lt;/span> &lt;span class="nb">command&lt;/span> -v firewall-cmd &amp;gt; /dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>1&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">FW_STATUS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>firewall-cmd --state 2&amp;gt;/dev/null&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$FW_STATUS&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;running&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 防火墙 (Firewalld): 已启用&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 防火墙 (Firewalld): 未启用!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 未检测到 UFW 或 Firewalld 防火墙工具!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[3] 正在检查防爆破工具 (Fail2ban)...&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> systemctl is-active --quiet fail2ban&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 Fail2ban: 正在运行 (防爆破保护中)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 Fail2ban: 未安装或未运行!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[4] 正在检查对外暴露的端口 (仅列出监听状态的 TCP 端口)...&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;请检查以下端口是否都是你主动开放的？（数据库如3306不应暴露在0.0.0.0）&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">netstat_out&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ss -tulnp &lt;span class="p">|&lt;/span> grep tcp &lt;span class="p">|&lt;/span> grep LISTEN&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -z &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$netstat_out&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟡 未检测到监听中的 TCP 端口&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ss -tulnp &lt;span class="p">|&lt;/span> grep tcp &lt;span class="p">|&lt;/span> grep LISTEN &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print &amp;#34; - 协议:&amp;#34;$1&amp;#34; | 监听地址:&amp;#34;$5&amp;#34; | 进程:&amp;#34;$7}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s/users:((&amp;#34;//g&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s/&amp;#34;.*//g&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">[5] 正在检查特权用户...&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">SUPER_USERS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>awk -F: &lt;span class="s1">&amp;#39;($3 == &amp;#34;0&amp;#34; &amp;amp;&amp;amp; $1 != &amp;#34;root&amp;#34;) {print $1}&amp;#39;&lt;/span> /etc/passwd&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -z &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$SUPER_USERS&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🟢 UID为0的用户: 只有 root (正常)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34; 🔴 警告! 发现其他具有最高权限的用户: &lt;/span>&lt;span class="nv">$SUPER_USERS&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;\n&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">==================================================&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 检查完成！请根据 🔴红色的警告项 进行下一步修改。 &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">YELLOW&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">==================================================&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">NC&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>&lt;strong>赋予权限并执行&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">chmod +x security_check.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ./security_check.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>你的目标：&lt;/strong> 消除所有的 🔴，迎接满屏的 🟢。&lt;/p>
&lt;hr>
&lt;h2 id="第二阶段五步锁死安全之门">第二阶段：五步锁死安全之门
&lt;/h2>&lt;h3 id="第-1-步建立安全通道创建-sudo-用户与密钥">第 1 步：建立“安全通道”（创建 sudo 用户与密钥）
&lt;/h3>&lt;p>&lt;strong>严禁&lt;/strong>直接在 Root 账户下裸奔。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>创建新管理账号&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">adduser armoradmin &lt;span class="c1"># 名字随你起&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">usermod -aG sudo armoradmin
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>注入 SSH 密钥&lt;/strong>（在你的&lt;strong>本地电脑&lt;/strong>执行）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ssh-keygen -t ed25519 -C &lt;span class="s2">&amp;#34;server_key&amp;#34;&lt;/span> &lt;span class="c1"># 推荐 ed25519 算法，更短更安全&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-copy-id -i ~/.ssh/id_ed25519.pub armoradmin@服务器IP
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>测试：&lt;code>ssh armoradmin@服务器IP&lt;/code>，无需密码直接进入即为成功。&lt;/em>&lt;/p>
&lt;hr>
&lt;h3 id="第-2-步斩断后门收紧-ssh-配置">第 2 步：斩断“后门”（收紧 SSH 配置）
&lt;/h3>&lt;p>这是最关键的一步。我们要让密码爆破彻底失效。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>注意 Ubuntu 特有的坑&lt;/strong>：
检查 &lt;code>/etc/ssh/sshd_config.d/&lt;/code> 下是否有 &lt;code>.conf&lt;/code> 文件。如果有，里面的配置会优先于主配置。建议直接清理或同步修改。&lt;/li>
&lt;li>&lt;strong>修改主配置&lt;/strong>：&lt;code>sudo nano /etc/ssh/sshd_config&lt;/code>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># 核心三要素
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PermitRootLogin no # 禁止 Root 登录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PasswordAuthentication no # 禁止密码登录（关键！）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">KbdInteractiveAuthentication no # 彻底切断交互式认证
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 进阶项
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port 22222 # 修改默认端口（记得在防火墙放行新端口！）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>注意&lt;/em> 如果 /etc/ssh/sshd_config.d/ 目录下有任何以 .conf 结尾的文件（比如云厂商预设的配置），它们的内容会覆盖掉你在主配置文件里的修改。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>检查方法：ls /etc/ssh/sshd_config.d/&lt;/p>
&lt;/li>
&lt;li>
&lt;p>检查密码登录是否已禁用：sshd -T | grep passwordauthentication&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>检查并重启&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo sshd -t &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo systemctl restart ssh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="第-3-步架起护城河ufw-防火墙">第 3 步：架起“护城河”（UFW 防火墙）
&lt;/h3>&lt;p>别让你的 Docker 容器或数据库在公网“裸奔”。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>初始化策略&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw default deny incoming &lt;span class="c1"># 默认拒绝所有入站&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw default allow outgoing &lt;span class="c1"># 默认允许所有出站&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>精准开门&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;p>关于docker swarm&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 允许 B 服务器访问我的 Swarm 端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow from 2.2.2.2 to any proto tcp port 2377,7946
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow from 2.2.2.2 to any proto udp port 7946,4789
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 允许 C 服务器访问我的 Swarm 端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow from 3.3.3.3 to any proto tcp port 2377,7946
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow from 3.3.3.3 to any proto udp port 7946,4789
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw allow 22222/tcp &lt;span class="c1"># 换成你修改后的 SSH 端口！&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 80/tcp &lt;span class="c1"># HTTP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 443/tcp &lt;span class="c1"># HTTPS&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>&lt;strong>合闸开启&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw &lt;span class="nb">enable&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="第-4-步部署自动保安fail2ban">第 4 步：部署“自动保安”（Fail2ban）
&lt;/h3>&lt;p>Fail2ban 会自动关押那些尝试试探你端口的 IP。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>安装并启动&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install fail2ban -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> --now fail2ban
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>默认保护&lt;/strong>：它会自动保护 SSH。你可以通过 &lt;code>sudo fail2ban-client status sshd&lt;/code> 查看又有多少倒霉蛋被你关进了“小黑屋”。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="第-5-步内鬼肃清清理特权用户与危险监听">第 5 步：内鬼肃清（清理特权用户与危险监听）
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>监听自查&lt;/strong>：运行 &lt;code>ss -tulnp&lt;/code>。如果看到 &lt;code>0.0.0.0:3306&lt;/code>，请立即去数据库配置里把 &lt;code>bind-address&lt;/code> 改为 &lt;code>127.0.0.1&lt;/code>。&lt;/li>
&lt;li>&lt;strong>权限自查&lt;/strong>：如果脚本提示有除 root 以外的 UID 0 用户，&lt;strong>别犹豫，你的系统大概率已经“不干净”了&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="第三阶段最后验收">第三阶段：最后验收
&lt;/h2>&lt;p>现在，再次运行你的自检脚本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ./security_check.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="-维护锦囊">💡 维护锦囊
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>定期更新&lt;/strong>：养成每周 &lt;code>sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code> 的好习惯。&lt;/li>
&lt;li>&lt;strong>监控日志&lt;/strong>：偶尔看看 &lt;code>/var/log/auth.log&lt;/code>，你会惊讶于外面的世界有多疯狂。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>加固完成了！需要我帮你写一个自动导出安全日志的定时任务脚本吗？&lt;/strong>&lt;/p></description></item><item><title>Object Storage (对象存储服务)</title><link>https://www.zata.cc/p/object-storage-%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1/</link><pubDate>Tue, 03 Mar 2026 15:36:55 +0800</pubDate><guid>https://www.zata.cc/p/object-storage-%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1/</guid><description>&lt;img src="https://www.zata.cc/p/object-storage-%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1/images/index/index.png" alt="Featured image of post Object Storage (对象存储服务)" />&lt;h1 id="backblaze-b2-与-cloudflare-r2-全方位对比分析">Backblaze B2 与 Cloudflare R2 全方位对比分析
&lt;/h1>&lt;p>Backblaze B2 和 Cloudflare R2 都是目前市场上非常受欢迎且兼容 S3 API 的对象存储服务。它们都以比 Amazon S3 更具性价比作为主打优势，但在定价逻辑和底层架构上存在显著区别。&lt;/p>
&lt;p>以下是基于最新数据的核心对比：&lt;/p>
&lt;p>&lt;strong>核心定位差异&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Backblaze B2&lt;/strong>：传统的“中心化”对象存储。主打极低的存储成本和简单的计费模式，是数据备份、归档和大容量媒体存储的理想选择。&lt;/li>
&lt;li>&lt;strong>Cloudflare R2&lt;/strong>：基于“边缘网络”的对象存储。主打&lt;strong>零下行流量费&lt;/strong>和与 Cloudflare 边缘计算的深度集成，非常适合需要频繁读取、分发数据的应用。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>价格对比（核心决胜点）&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">计费项目&lt;/th>
&lt;th style="text-align: left">Backblaze B2&lt;/th>
&lt;th style="text-align: left">Cloudflare R2&lt;/th>
&lt;th style="text-align: left">优势方&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>基础存储费&lt;/strong>&lt;/td>
&lt;td style="text-align: left">$6/TB/月 ($0.006/GB)&lt;/td>
&lt;td style="text-align: left">$15/TB/月 ($0.015/GB) (标准层)&lt;br>$10/TB/月 ($0.010/GB) (低频层)&lt;/td>
&lt;td style="text-align: left">&lt;strong>B2 胜&lt;/strong> (便宜60%)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>下行流量费&lt;/strong>&lt;/td>
&lt;td style="text-align: left">每月免费额度为总存储量的3倍，超出后 $0.01/GB。&lt;/td>
&lt;td style="text-align: left">&lt;strong>永远 $0&lt;/strong> (完全免费)&lt;/td>
&lt;td style="text-align: left">&lt;strong>R2 胜&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>写入 API 费&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;strong>完全免费&lt;/strong> (上传文件不计费)。&lt;/td>
&lt;td style="text-align: left">免费100万次/月，超出后 $4.50/百万次。&lt;/td>
&lt;td style="text-align: left">&lt;strong>B2 胜&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>读取 API 费&lt;/strong>&lt;/td>
&lt;td style="text-align: left">免费2500次/天，超出后 $0.004/万次。&lt;/td>
&lt;td style="text-align: left">免费1000万次/月，超出后 $0.36/百万次。&lt;/td>
&lt;td style="text-align: left">&lt;strong>平局&lt;/strong> (都很便宜)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>免费额度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">前10GB存储免费&lt;/td>
&lt;td style="text-align: left">前10GB存储免费&lt;/td>
&lt;td style="text-align: left">&lt;strong>平局&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>价格维度的注意点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>R2 的 API 写入成本&lt;/strong>：如果你的业务是写入海量小文件（例如日志收集、IoT数据），R2 高达 $4.50/百万次的写入费用可能带来较高成本。而 B2 写入是完全免费的。&lt;/li>
&lt;li>&lt;strong>R2 的低频层&lt;/strong>：虽然存储费降到 $10/TB，但有&lt;strong>30天最短存储期&lt;/strong>要求，且读取时会收取**$0.01/GB 的数据检索费**。B2 则没有任何最短存储时长或最小文件限制。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>性能与网络架构&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cloudflare R2&lt;/strong>：在性能与延迟方面占优。它依托 Cloudflare 庞大的全球 CDN 边缘节点构建。请求数据时，R2 会动态地在离用户最近的节点处理，实现全球范围内的低延迟访问。&lt;/li>
&lt;li>&lt;strong>Backblaze B2&lt;/strong>：采用传统的区域化存储架构（主要区域在美国西部、美国东部和欧洲）。如果用户在远离这些数据中心的地方（如亚洲），直接访问的物理延迟可能较高。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>生态与高级特性&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>S3 兼容性&lt;/strong>：两者都提供了优秀的 S3 API 兼容性，大部分支持 Amazon S3 的备份软件（如 Restic, Veeam, AWS CLI）都可以直接无缝切换。&lt;/li>
&lt;li>&lt;strong>计算集成&lt;/strong>：R2 与 Cloudflare Workers 无缝集成，极度适合构建 Serverless 全栈应用。&lt;/li>
&lt;li>&lt;strong>带宽联盟&lt;/strong>：B2 与 Cloudflare、Fastly 等 CDN 有合作。如果将 Cloudflare CDN 置于 B2 之前，从 B2 传输到 Cloudflare 网络的流量是完全免费的。&lt;/li>
&lt;/ul>
&lt;h2 id="总结你应该怎么选">总结：你应该怎么选？
&lt;/h2>&lt;p>&lt;strong>什么时候该选 Backblaze B2？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>数据备份与归档&lt;/strong>：你需要存放几十 TB 甚至 PB 级的备份数据（如 NAS 备份、数据库快照），且读取频率不高。B2 每月 $6/TB 的价格能节省大量成本。&lt;/li>
&lt;li>&lt;strong>写多读少、海量小文件&lt;/strong>：因为 B2 没有写入 API 费用，也没有最小文件体积限制。&lt;/li>
&lt;li>&lt;strong>经典的 “B2 + Cloudflare CDN” 组合玩家&lt;/strong>：你可以将 B2 作为源站，搭配 Cloudflare 的免费 CDN。这样既能享受 B2 的极低存储费，又能利用 Cloudflare 的分发网络和免流量费优势。（注意：Cloudflare 对免费版有大文件/纯媒体分发的服务条款限制，需视具体业务而定。）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>什么时候该选 Cloudflare R2？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>高频下行读取（大流量应用）&lt;/strong>：如果你的存储量不大（比如几百GB），但每月会产生数TB甚至数十TB的下载流量（例如播客音频、软件安装包分发、高频访问的图床）。R2 的零流量费优势明显。&lt;/li>
&lt;li>&lt;strong>全球化前端 / Serverless 架构&lt;/strong>：适合搭配 Cloudflare Workers 构建现代 Web 应用，需要极低的读写延迟和极致的边缘计算体验。&lt;/li>
&lt;li>&lt;strong>想要避免流量账单风险&lt;/strong>：R2 的定价简单可预测，无需担心突然爆发的流量或恶意盗刷流量导致的高额费用，零下行流量费提供了很高的安全感。&lt;/li>
&lt;/ul></description></item><item><title>CICD</title><link>https://www.zata.cc/p/cicd/</link><pubDate>Wed, 25 Feb 2026 09:52:08 +0800</pubDate><guid>https://www.zata.cc/p/cicd/</guid><description>&lt;img src="https://www.zata.cc/p/cicd/images/index/index.png" alt="Featured image of post CICD" />&lt;h1 id="cicd-详细使用教程">CI/CD 详细使用教程
&lt;/h1>&lt;p>CI/CD 是现代软件开发中至关重要的实践，它代表持续集成（Continuous Integration）和持续部署（Continuous Deployment）或持续交付（Continuous Delivery）。本教程将 guiding 您了解 CI/CD 的核心概念、工作流程以及如何在实际项目中落地。&lt;/p>
&lt;p>&lt;strong>什么是持续集成（CI）&lt;/strong>&lt;/p>
&lt;p>持续集成是指开发人员频繁地将代码集成到共享仓库中。每次集成都会通过自动化的构建和测试来验证，以便尽早发现错误。核心目标是减少集成冲突，提高代码质量。&lt;/p>
&lt;p>&lt;strong>什么是持续部署与交付（CD）&lt;/strong>&lt;/p>
&lt;p>持续交付确保代码在经过测试后可以随时可靠地发布到生产环境。持续部署则更进一步，将通过所有测试的代码自动部署到生产环境，无需人工干预。这两者共同构成了自动化发布流水线。&lt;/p>
&lt;p>&lt;strong>CI/CD 的核心价值&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>提高效率&lt;/strong>：自动化重复任务，减少人工操作时间。&lt;/li>
&lt;li>&lt;strong>降低风险&lt;/strong>：小步快跑，每次变更范围小，出现问题容易回滚。&lt;/li>
&lt;li>&lt;strong>快速反馈&lt;/strong>：开发人员能迅速得知代码构建和测试的结果。&lt;/li>
&lt;li>&lt;strong>质量保证&lt;/strong>：强制通过测试才能进入下一阶段，确保交付质量。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>主流 CI/CD 工具介绍&lt;/strong>&lt;/p>
&lt;p>市面上有多种工具可供选择，您可以根据团队技术栈进行选择：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Jenkins&lt;/strong>：开源灵活，插件生态丰富，适合复杂定制需求。&lt;/li>
&lt;li>&lt;strong>GitLab CI&lt;/strong>：与 GitLab 代码仓库深度集成，配置简单，使用方便。&lt;/li>
&lt;li>&lt;strong>GitHub Actions&lt;/strong>：原生集成于 GitHub，适合开源项目及托管在 GitHub 上的私有项目。&lt;/li>
&lt;li>&lt;strong>CircleCI&lt;/strong>：云端服务，配置简洁，支持多种语言环境。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>基础工作流程搭建&lt;/strong>&lt;/p>
&lt;p>一个标准的 CI/CD 流水线通常包含以下几个阶段：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>代码提交&lt;/strong>：开发人员将代码推送到版本控制系统（如 Git）。&lt;/li>
&lt;li>&lt;strong>触发构建&lt;/strong>：代码推送动作触发 CI 服务器开始工作。&lt;/li>
&lt;li>&lt;strong>依赖安装&lt;/strong>：系统自动安装项目所需的依赖包。&lt;/li>
&lt;li>&lt;strong>代码编译&lt;/strong>：将源代码编译为可执行文件或 artifacts。&lt;/li>
&lt;li>&lt;strong>自动化测试&lt;/strong>：运行单元测试、集成测试等验证代码逻辑。&lt;/li>
&lt;li>&lt;strong>代码扫描&lt;/strong>：进行静态代码分析，检查安全漏洞和规范。&lt;/li>
&lt;li>&lt;strong>构建镜像&lt;/strong>：如果是容器化部署，此处构建 Docker 镜像。&lt;/li>
&lt;li>&lt;strong>部署环境&lt;/strong>：将应用部署到测试环境或生产环境。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>简单配置示例&lt;/strong>&lt;/p>
&lt;p>以下是一个基于 GitHub Actions 的简单配置文件示例，展示了如何运行测试和构建：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">CI Pipeline&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">main ]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Run tests&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">npm test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build project&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">npm run build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>最佳实践建议&lt;/strong>&lt;/p>
&lt;p>为了充分发挥 CI/CD 的优势，建议遵循以下原则：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>保持构建快速&lt;/strong>：优化测试和构建脚本，确保流水线能在几分钟内完成。&lt;/li>
&lt;li>&lt;strong>测试覆盖率高&lt;/strong>：确保自动化测试覆盖核心业务逻辑，避免漏测。&lt;/li>
&lt;li>&lt;strong>单一来源真理&lt;/strong>：所有配置代码化（Infrastructure as Code），存放在版本控制中。&lt;/li>
&lt;li>&lt;strong>失败即停止&lt;/strong>：一旦任何阶段失败，立即停止流水线并通知相关人员。&lt;/li>
&lt;li>&lt;strong>定期维护&lt;/strong>：定期更新工具和依赖，修复已知漏洞。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>常见问题与排查&lt;/strong>&lt;/p>
&lt;p>在使用初期，您可能会遇到构建失败或部署超时的问题。首先检查日志输出，定位错误阶段。如果是环境依赖问题，尝试清理缓存或重新安装依赖。如果是网络问题，检查服务器连通性及权限配置。保持日志清晰可读有助于快速定位问题根源。&lt;/p>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;p>实施 CI/CD 是一个循序渐进的过程。建议从简单的自动化构建开始，逐步加入测试、扫描和部署环节。通过不断迭代优化流水线，团队将获得更高的交付速度和更稳定的产品质量。希望本教程能帮助您顺利开启自动化运维之旅。&lt;/p>
&lt;h1 id="使用与配置">使用与配置
&lt;/h1>&lt;h2 id="-技巧分享利用阿里云容器镜像服务解决-github-镜像国内下载慢的问题">🚀 技巧分享：利用阿里云容器镜像服务解决 GitHub 镜像国内下载慢的问题
&lt;/h2>&lt;p>在部署 Docker 项目时，我们常遇到一个尴尬的场景：通过 GitHub Actions 或其他方式将镜像推送到国外服务器（或 GitHub Packages）后，&lt;strong>国内服务器拉取镜像的速度非常慢，甚至超时&lt;/strong>。但受限于网络策略，GitHub 往往无法直接将镜像推送到国内的镜像源。&lt;/p>
&lt;p>&lt;strong>💡 解决方案：使用阿里云容器镜像服务（ACR）作为“中转站”&lt;/strong>&lt;/p>
&lt;p>我们可以利用阿里云提供的容器镜像服务，搭建一个国内的镜像仓库。流程如下：
&lt;code>GitHub/国外服务器&lt;/code> &amp;ndash;&amp;gt; &lt;code>阿里云镜像仓库&lt;/code> &amp;ndash;&amp;gt; &lt;code>国内服务器&lt;/code>&lt;/p>
&lt;p>&lt;strong>🛠️ 操作实录&lt;/strong>&lt;/p>
&lt;p>如截图所示，登录阿里云控制台后，操作非常直观：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>开通实例&lt;/strong>：选择**“个人版实例”**（对于个人开发者或小团队，免费额度通常足够使用）。&lt;/li>
&lt;li>&lt;strong>创建仓库&lt;/strong>：点击**“创建镜像仓库”**，设置好命名空间。
&lt;ul>
&lt;li>&lt;em>建议将仓库类型设置为&lt;/em>*“私有”**，以保障代码和镜像安全。*&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>配置同步&lt;/strong>：
&lt;ul>
&lt;li>在 CI/CD 流程（如 GitHub Actions）中，增加一步推送动作，将构建好的镜像同时 &lt;code>docker push&lt;/code> 到阿里云的仓库地址。&lt;/li>
&lt;li>或者在阿里云后台配置“实例同步”功能，自动从 GitHub/Docker Hub 同步镜像。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>✅ 最终效果&lt;/strong>&lt;/p>
&lt;p>配置完成后，国内服务器只需修改 &lt;code>docker pull&lt;/code> 的地址为阿里云的仓库地址（例如 &lt;code>registry.cn-hangzhou.aliyuncs.com/...&lt;/code>），即可享受&lt;strong>国内专线速度&lt;/strong>，彻底告别下载卡顿。&lt;/p>
&lt;h2 id="告别手动复制粘贴我们如何实现-windows-环境下的全自动化部署">告别手动复制粘贴：我们如何实现 Windows 环境下的全自动化部署
&lt;/h2>&lt;blockquote>
&lt;p>&lt;strong>摘要：&lt;/strong> 每次发布新版本都要手动停止服务、复制文件、重启程序？在这篇文章中，我们将分享如何利用 GitHub Actions 和自托管 Runner (Self-hosted Runner) 构建一条流畅的 Windows 到 Windows CI/CD 流水线，彻底告别繁琐的手动部署。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>1. 曾经的痛点：手动部署的“黑暗时代”&lt;/strong>&lt;/p>
&lt;p>在过去的开发周期中，每次要在测试机或生产机上更新我们的 Windows 桌面软件（或后台服务），流程大概是这样的：&lt;/p>
&lt;ol>
&lt;li>在开发机上编译打包。&lt;/li>
&lt;li>将几十 MB 甚至上百 MB 的安装包或压缩包通过微信、网盘或共享文件夹传到目标机器。&lt;/li>
&lt;li>远程登录目标机器。&lt;/li>
&lt;li>手动打开任务管理器，杀掉旧版本的进程。&lt;/li>
&lt;li>解压新文件，覆盖旧文件。&lt;/li>
&lt;li>重新启动程序，祈祷一切正常运行。&lt;/li>
&lt;/ol>
&lt;p>这不仅耗时耗力，而且极其容易出错（比如漏掉配置文件、忘记关闭旧进程导致文件被占用）。随着迭代速度的加快，这种“刀耕火种”的部署方式已经成为了团队效率的最大瓶颈。&lt;/p>
&lt;p>&lt;strong>2. 破局思路：引入 CI/CD 与自托管 Runner&lt;/strong>&lt;/p>
&lt;p>为了解决这个问题，我们决定引入自动化流水线。考虑到我们的开发环境和目标环境都是 Windows，并且代码托管在支持 CI/CD 的平台上，我们最终敲定了 &lt;strong>“云端触发 + 本地自托管 Runner 执行”&lt;/strong> 的架构。&lt;/p>
&lt;p>核心思路很简单：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>开发端：&lt;/strong> 开发者只需专注于写代码，完成后执行 &lt;code>git push&lt;/code>。&lt;/li>
&lt;li>&lt;strong>云端桥梁：&lt;/strong> 代码仓库监听到提交后，生成部署指令，下发给目标机器。&lt;/li>
&lt;li>&lt;strong>目标端：&lt;/strong> 目标机器上安装了一个后台服务（Runner），它接收指令后，自动在本地拉取代码、编译、替换文件并重启应用。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 核心实践：部署流水线的关键步骤&lt;/strong>&lt;/p>
&lt;p>我们在目标 Windows 机器上配置了 Actions Runner，并将其注册为 Windows 服务以保证常驻运行。接下来，我们编写了流水线脚本，主要包含以下几个关键自动化步骤：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>自动化清理与准备：&lt;/strong> 脚本首先会静默停止正在运行的旧版本进程 &lt;code>Stop-Process -Name &amp;quot;MyApp&amp;quot; -ErrorAction SilentlyContinue&lt;/code>，确保文件解除占用。&lt;/li>
&lt;li>&lt;strong>自动化构建：&lt;/strong> Runner 直接在目标机器上拉取最新 &lt;code>main&lt;/code> 分支的代码，并执行编译命令，生成最新的二进制文件。&lt;/li>
&lt;li>&lt;strong>自动化覆盖：&lt;/strong> 使用 PowerShell 脚本将编译好的产物精准复制并覆盖到软件的实际运行目录中。&lt;/li>
&lt;li>&lt;strong>自动化启动：&lt;/strong> 最后，脚本拉起新版本的可执行文件，整个过程在几秒钟内无缝完成。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>4. 取得的收益&lt;/strong>&lt;/p>
&lt;p>这条简单的 CI/CD 流水线落地后，给我们带来了肉眼可见的改变：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>🚀 效率飙升：&lt;/strong> 部署时间从过去的 10 分钟缩短到了 1 分钟以内，彻底解放了开发人员的双手。&lt;/li>
&lt;li>&lt;strong>🛡️ 零人为失误：&lt;/strong> 标准化的脚本代替了人工操作，再也没有出现过“忘了覆盖某个动态链接库”这种低级错误。&lt;/li>
&lt;li>&lt;strong>🔄 快速迭代：&lt;/strong> 真正实现了“代码一推，新版就绪”，团队可以更专注于业务逻辑的开发，而不是被运维琐事牵绊。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>5. 结语&lt;/strong>&lt;/p>
&lt;p>虽然 Windows 环境下的持续集成/持续部署在配置上可能比纯 Linux 环境稍显繁琐，但通过合理利用自托管 Runner，我们依然可以获得极致的自动化体验。如果你的团队也正在忍受手动部署的折磨，不妨花半天时间把这套流程搭建起来，这绝对是一笔稳赚不赔投资！&lt;/p></description></item><item><title>traefik</title><link>https://www.zata.cc/p/traefik/</link><pubDate>Mon, 23 Feb 2026 17:15:54 +0800</pubDate><guid>https://www.zata.cc/p/traefik/</guid><description>&lt;img src="https://www.zata.cc/p/traefik/images/index/index.png" alt="Featured image of post traefik" />&lt;h1 id="traefik-在容器化部署中的核心作用与原理解析">Traefik 在容器化部署中的核心作用与原理解析
&lt;/h1>&lt;p>Traefik 是现代容器化部署中非常核心的一个组件，尤其是在像 Dokploy、Coolify 这种 PaaS 平台上。我们可以用一个**“大楼前台”**的比喻来深入理解它。&lt;/p>
&lt;p>&lt;strong>通俗比喻：Traefik 是做什么的？&lt;/strong>&lt;/p>
&lt;p>想象你的服务器是一栋&lt;strong>写字楼&lt;/strong>（Host），里面有很多个&lt;strong>小房间&lt;/strong>（Docker 容器）。&lt;/p>
&lt;ul>
&lt;li>房间 A 是你的博客。&lt;/li>
&lt;li>房间 B 是你的数据库。&lt;/li>
&lt;li>房间 C 就是你刚搭建的 &lt;strong>Docker 仓库&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>这些房间原本只有一个内部编号（比如端口号 5000、3306、8080）。&lt;/p>
&lt;p>&lt;strong>如果没有 Traefik：&lt;/strong>
访客（用户）想去房间 C，他必须知道这栋楼的地址（IP）和房间号（端口）。他得在浏览器输入 &lt;code>http://1.2.3.4:5000&lt;/code>。这既难记，又不安全（没有 HTTPS）。&lt;/p>
&lt;p>&lt;strong>有了 Traefik（大楼前台）：&lt;/strong>
Traefik 就是坐在大楼门口的&lt;strong>全自动智能前台&lt;/strong>。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>指路（路由）&lt;/strong>：访客不需要知道房间号。访客只要说：“我要去 &lt;code>registry.你的域名.com&lt;/code>”，Traefik 查一下表格，马上把访客带到 &lt;strong>房间 C&lt;/strong>（端口 5000）。&lt;/li>
&lt;li>&lt;strong>安检（SSL/HTTPS）&lt;/strong>：访客进来时，Traefik 负责和访客建立安全连接（HTTPS）。它会自动去申请证书、验证身份。等确认安全了，再把访客的信息送到房间里。&lt;strong>房间里的人（容器）不需要懂怎么处理证书，只需要专心干活。&lt;/strong>&lt;/li>
&lt;li>&lt;strong>自动发现（动态配置）&lt;/strong>：这是 Traefik 最厉害的地方。当你新建一个房间（部署新应用）时，只要在门口贴个条子（Docker Labels），Traefik 会立刻看见：“哦，这里新开了一家店，域名是 xyz.com”，它就自动配置好了。你不需要重启服务器，也不需要手动写复杂的配置文件。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>在 Dokploy 中，Traefik 具体的工作机制&lt;/strong>&lt;/p>
&lt;p>当你使用 Dokploy 部署应用并添加域名时，Traefik 在后台默默做了这三件事：&lt;/p>
&lt;p>&lt;strong>1. 反向代理 (Reverse Proxy)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>动作&lt;/strong>：它监听服务器的 80 (HTTP) 和 443 (HTTPS) 端口。所有的外部流量都先到达 Traefik。&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>：它根据&lt;strong>域名&lt;/strong>来区分流量。
&lt;ul>
&lt;li>&lt;code>blog.com&lt;/code> 的流量 -&amp;gt; 转给博客容器。&lt;/li>
&lt;li>&lt;code>registry.com&lt;/code> 的流量 -&amp;gt; 转给你的 Docker 仓库容器。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>好处&lt;/strong>：你可以在一台服务器上跑 10 个不同的网站，只要域名不同，Traefik 就能把它们分得清清楚楚，而且全部共用 443 端口。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. SSL 卸载 (SSL Termination)&lt;/strong>
这就是解决你 Docker 仓库 HTTPS 问题的关键。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>外部&lt;/strong>：Traefik &amp;lt;&amp;ndash;&amp;gt; 你的电脑（Docker 客户端）。这一段是 &lt;strong>HTTPS 加密&lt;/strong>的，Traefik 自动帮你从 Let&amp;rsquo;s Encrypt 申请免费证书并续期。&lt;/li>
&lt;li>&lt;strong>内部&lt;/strong>：Traefik &amp;lt;&amp;ndash;&amp;gt; Docker 仓库容器。这一段是 &lt;strong>HTTP 明文&lt;/strong>的。&lt;/li>
&lt;li>&lt;strong>原理&lt;/strong>：Traefik 把加密的包裹拆开，确认没问题，把里面的内容用 HTTP 传给容器。容器觉得自己处理的是 HTTP，但外面的用户看到的是 HTTPS。这就叫“SSL 卸载”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 中间件处理 (Middleware) - 解决上传报错的关键&lt;/strong>
Traefik 有一个很强大的功能叫“中间件”，可以在把请求转给容器之前，对请求进行“魔改”。&lt;/p>
&lt;p>你遇到的 &lt;code>Entity Too Large&lt;/code>（上传文件过大）问题，如果不加 Traefik 配置，默认可能只允许上传几兆的文件。我们在 &lt;code>docker-compose.yml&lt;/code> 里写的 &lt;code>labels&lt;/code>，其实就是给 Traefik 下指令：&lt;/p>
&lt;blockquote>
&lt;p>“嘿，Traefik，对于这个 Docker 仓库服务，请把**请求体大小限制（Max Request Body）**取消掉（设为 0），允许上传超大文件。”&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>&lt;strong>为什么在 Docker Compose 里要写 labels？&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中，通常有两种方式告诉 Traefik 怎么做：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>UI 面板操作&lt;/strong>：你在 Dokploy 网页上点点点（添加域名、开启 HTTPS），Dokploy 会自动帮你在后台生成 Traefik 的配置。这是最简单的。&lt;/li>
&lt;li>&lt;strong>Labels (标签)&lt;/strong>：这是更高级的玩法。你可以直接在 &lt;code>docker-compose.yml&lt;/code> 里写配置。&lt;/li>
&lt;/ol>
&lt;p>回到代码片段的例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 告诉 Traefik：这个容器归你管&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry.rule=Host(`registry.你的域名.com`)&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 告诉 Traefik：谁访问这个域名，就找我&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.services.registry.loadbalancer.server.port=5000&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 告诉 Traefik：把流量转到我的 5000 端口&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=0&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 告诉 Traefik：允许无限大的上传&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些 &lt;code>labels&lt;/code> 就像是贴在容器门口的便利贴。Traefik 每隔几秒就会扫描所有容器，看到这些便利贴，它就懂了：“好的，我把这个域名指过来，并且放开上传限制。”&lt;/p>
&lt;hr>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>没有 Traefik&lt;/strong>：你需要裸奔（HTTP），或者自己手动配很难搞的 Nginx 证书文件，还要记住各种端口号。&lt;/li>
&lt;li>&lt;strong>有 Traefik (配合 Dokploy)&lt;/strong>：你只需要点一下“开启 HTTPS”，剩下的路由、证书、端口映射，全由这个“智能前台”自动处理。&lt;/li>
&lt;/ul>
&lt;p>这就是为什么现在的 Docker 部署（尤其是在 Dokploy 这种面板里）都离不开 Traefik。&lt;/p></description></item><item><title>1核1G云服务器“绝地求生”：如何把Ubuntu的内存从剩200M优化到能跑服务</title><link>https://www.zata.cc/p/1%E6%A0%B81g%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F%E5%A6%82%E4%BD%95%E6%8A%8Aubuntu%E7%9A%84%E5%86%85%E5%AD%98%E4%BB%8E%E5%89%A9200m%E4%BC%98%E5%8C%96%E5%88%B0%E8%83%BD%E8%B7%91%E6%9C%8D%E5%8A%A1/</link><pubDate>Sun, 22 Feb 2026 20:11:29 +0800</pubDate><guid>https://www.zata.cc/p/1%E6%A0%B81g%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F%E5%A6%82%E4%BD%95%E6%8A%8Aubuntu%E7%9A%84%E5%86%85%E5%AD%98%E4%BB%8E%E5%89%A9200m%E4%BC%98%E5%8C%96%E5%88%B0%E8%83%BD%E8%B7%91%E6%9C%8D%E5%8A%A1/</guid><description>&lt;img src="https://www.zata.cc/p/1%E6%A0%B81g%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F%E5%A6%82%E4%BD%95%E6%8A%8Aubuntu%E7%9A%84%E5%86%85%E5%AD%98%E4%BB%8E%E5%89%A9200m%E4%BC%98%E5%8C%96%E5%88%B0%E8%83%BD%E8%B7%91%E6%9C%8D%E5%8A%A1/images/index/index.png" alt="Featured image of post 1核1G云服务器“绝地求生”：如何把Ubuntu的内存从剩200M优化到能跑服务" />&lt;h1 id="实战-1核1g云服务器绝地求生如何把ubuntu的内存从剩200m优化到能跑服务">[实战] 1核1G云服务器“绝地求生”：如何把Ubuntu的内存从剩200M优化到能跑服务？
&lt;/h1>&lt;p>&lt;strong>【前言：年轻人的第一台云服务器】&lt;/strong>&lt;/p>
&lt;p>趁着云厂商搞活动，你是不是也入手了一台 &lt;strong>1核 1G&lt;/strong> 的“入门级”云服务器？&lt;/p>
&lt;p>你满怀期待地装上了最新的 Ubuntu LTS，准备大干一场（建博客、跑脚本、练Linux）。结果刚连上 SSH，随手敲了一个 &lt;code>free -h&lt;/code>，当场心凉了一半：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Total: 980Mi | Used: 700Mi | Free: 200Mi&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>还没跑任何业务，系统纯待机就吃掉了近 800M 内存，只剩下 200M 还能干嘛？跑个 &lt;code>apt update&lt;/code> 都怕卡死，更别提装 MySQL 了。&lt;/p>
&lt;p>别急着重装系统，在 1G 内存的极限环境下，我们需要掌握一些 &lt;strong>Linux 精细化运维&lt;/strong> 的技巧。本文将手把手教你如何榨干这台服务器的每一滴性能。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>【第一阶段：ICU 急救（配置 Swap）】&lt;/strong>&lt;/p>
&lt;p>剩下 200M 内存最大的风险是什么？是 &lt;strong>OOM (Out Of Memory)&lt;/strong>。一旦内存耗尽，Linux 内核会启动 OOM Killer，随机杀掉占用内存最高的进程（通常就是你的数据库或 Web 服务）。&lt;/p>
&lt;p>&lt;strong>Swap（虚拟内存）&lt;/strong> 是小内存服务器的救命稻草。虽然硬盘读写比内存慢几个数量级，但它能保证系统“卡顿”而不是“宕机”。&lt;/p>
&lt;p>&lt;strong>操作步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>创建 2G 的 Swap 文件&lt;/strong>（一般设置为物理内存的 1-2 倍）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo fallocate -l 2G /swapfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>设置权限并格式化&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chmod &lt;span class="m">600&lt;/span> /swapfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkswap /swapfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>&lt;strong>启用 Swap&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo swapon /swapfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>&lt;strong>设置开机自启&lt;/strong>（重要，否则重启失效）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;/swapfile none swap sw 0 0&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee -a /etc/fstab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>&lt;strong>调整 Swappiness（使用倾向）&lt;/strong>：
默认值是 60，意味着内存用到 40% 就开始用 Swap。对于 1G 内存，我们希望尽量用物理内存，满了再用 Swap，防止频繁 IO 卡死系统。建议设为 10。&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo sysctl vm.swappiness&lt;span class="o">=&lt;/span>&lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>永久生效（写入配置文件）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;vm.swappiness=10&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee -a /etc/sysctl.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>效果：&lt;/strong> 现在你拥有了 1G 内存 + 2G 虚拟内存，至少不用担心程序一启动就暴毙了。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>&lt;strong>【第二阶段：卸载“内存刺客” Snapd】&lt;/strong>&lt;/p>
&lt;p>如果你用的是 Ubuntu，那么内存占用高的罪魁祸首通常是 &lt;strong>Snap&lt;/strong>。&lt;/p>
&lt;p>Ubuntu 官方为了推行 Snap 包管理，默认在后台运行 &lt;code>snapd&lt;/code> 服务，并挂载了一堆 loop device。这在 16G 内存的电脑上没感觉，但在 1G 的服务器上简直是“吸血鬼”。&lt;/p>
&lt;p>&lt;strong>优化方案：斩草除根&lt;/strong>&lt;/p>
&lt;p>如果你不强依赖 snap 安装软件（建议服务器端全用 apt 或 docker），请直接卸载它。&lt;/p>
&lt;p>&lt;strong>第一步：停止服务&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl stop snapd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl disable snapd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>第二步：彻底卸载（耗时稍长，耐心等待）&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt autoremove --purge snapd -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>第三步：阻止它自动回来（可选）&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt-mark hold snapd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>效果：&lt;/strong> 这一步通常能释放 &lt;strong>50M - 100M&lt;/strong> 的纯物理内存，且 &lt;code>df -h&lt;/code> 列表瞬间清爽了。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>&lt;strong>【第三阶段：关闭非必要系统服务】&lt;/strong>&lt;/p>
&lt;p>Ubuntu Server 为了通用性，开了很多你可能根本用不上的服务。&lt;/p>
&lt;p>&lt;strong>1. 关闭自动更新 (Unattended Upgrades)&lt;/strong>
自动更新会在后台静默运行 apt，极度消耗 IO 和内存。小内存机器建议改为手动定期维护。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl stop unattended-upgrades
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl disable unattended-upgrades
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2. 移除 Cloud-init&lt;/strong>
如果是云服务器，&lt;code>cloud-init&lt;/code> 仅在第一次创建实例时有用（用于注入 SSH Key、设置 hostname 等）。之后它就是个累赘。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo touch /etc/cloud/cloud-init.disabled
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt purge cloud-init -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>3. 限制系统日志&lt;/strong>
&lt;code>systemd-journald&lt;/code> 可能会占用大量内存做日志缓存。
编辑 &lt;code>/etc/systemd/journald.conf&lt;/code>，修改或添加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">SystemMaxUse&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">50M&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后重启服务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart systemd-journald
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;strong>【第四阶段：软件选型的智慧】&lt;/strong>&lt;/p>
&lt;p>在 1G 内存上，软件的选择比优化更重要。&lt;strong>不要试图挑战物理定律。&lt;/strong>&lt;/p>
&lt;p>&lt;strong>1. 数据库：告别 MySQL 8.0&lt;/strong>
MySQL 8.0 默认配置启动空载就要 400M+ 内存，加上系统本身，直接爆内存。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>青铜方案&lt;/strong>：使用 &lt;strong>MariaDB&lt;/strong>，并修改 &lt;code>my.cnf&lt;/code>，将 &lt;code>innodb_buffer_pool_size&lt;/code> 调低至 64M 或 128M。&lt;/li>
&lt;li>&lt;strong>王者方案&lt;/strong>：使用 &lt;strong>SQLite&lt;/strong>。如果你的业务是个人博客（Typecho, Hexo）、简单的 CMS 或测试项目，SQLite 是文件型数据库，&lt;strong>0 内存常驻&lt;/strong>，性能在低并发下甚至优于 MySQL。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Web 服务器：Nginx 是唯一真神&lt;/strong>
不要用 Apache，它的进程模型比较吃资源。Nginx 或 Caddy 是小内存服务器的最佳拍档。&lt;/p>
&lt;p>&lt;strong>3. 编程语言环境&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Java&lt;/strong>: 尽量避开。JVM 是内存黑洞。&lt;/li>
&lt;li>&lt;strong>Python/Node&lt;/strong>: 勉强可以，控制依赖数量。&lt;/li>
&lt;li>&lt;strong>Go/Rust&lt;/strong>: 完美适配，编译后的二进制文件占用极小。&lt;/li>
&lt;li>&lt;strong>PHP&lt;/strong>: 可以用，但需要调整 &lt;code>php-fpm&lt;/code> 配置，限制 &lt;code>pm.max_children&lt;/code> 为 5 左右，防止并发来了把内存撑爆。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>【终极方案：换个“瘦”点的系统】&lt;/strong>&lt;/p>
&lt;p>如果经过上述优化，Ubuntu 依然让你感到捉襟见肘，那么问题可能不在你，而在 Ubuntu。&lt;/p>
&lt;p>Ubuntu 是一个“胖”系统，为了易用性塞了太多东西。如果你的目标是 &lt;strong>极致省资源&lt;/strong>，建议重装系统：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>推荐：Debian 11/12&lt;/strong>
Debian 是 Ubuntu 的上游，极其稳定且纯净。同样的 1G 配置，Debian 11 启动后内存占用通常只有 &lt;strong>70M - 120M&lt;/strong>。这直接给你省出了 600M+ 的空间！&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>极限：Alpine Linux&lt;/strong>
空载仅需 &lt;strong>10M&lt;/strong> 内存。但它是基于 musl libc 的，命令习惯和软件兼容性（特别是 glibc 依赖）需要一定门槛，适合 Docker 容器化部署。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>【总结】&lt;/strong>&lt;/p>
&lt;p>&lt;strong>1核 1G 并不是电子垃圾&lt;/strong>，它依然可以跑得很欢快。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>先加 Swap&lt;/strong>，保命要紧。&lt;/li>
&lt;li>&lt;strong>卸载 Snap&lt;/strong>，释放资源。&lt;/li>
&lt;li>&lt;strong>精简服务&lt;/strong>，关掉自动更新。&lt;/li>
&lt;li>如果可能，&lt;strong>重装成 Debian&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;p>只要配置得当，这台小机器跑一个日均 IP 1000 的博客、挂个探针、跑个签到脚本依然是绰绰有余的。&lt;/p>
&lt;h1 id="选型指南-1-核-1g-云服务器装-ubuntudebian-还是-centos">[选型指南] 1 核 1G 云服务器，装 Ubuntu、Debian 还是 CentOS？
&lt;/h1>&lt;p>这是一个为你定制的博客文章，专门针对那些在 &lt;strong>“云服务器装什么系统”&lt;/strong> 这个问题上纠结的用户。&lt;/p>
&lt;p>这篇文章延续了之前的硬核实战风格，重点对比了主流发行版在**小内存（1 核 1G/2G）**场景下的表现，帮你做出最理性的选择。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>前言：你的起跑线决定了终点&lt;/strong>&lt;/p>
&lt;p>当你花 99 块钱买了一台 1 核 1G 的入门级云服务器时，你其实正站在一个岔路口。&lt;/p>
&lt;p>很多人觉得：“反正都是 Linux，随便装一个不就行了？”
&lt;strong>大错特错。&lt;/strong>&lt;/p>
&lt;p>在 16G 内存的电脑上，系统本身占 500M 还是 100M 你感觉不到区别；但在 1G 内存的服务器上，这 &lt;strong>400M 的差距&lt;/strong>，就是“能不能跑得动 Docker&amp;quot;或者“数据库会不会半夜崩溃”的生死线。&lt;/p>
&lt;p>今天我们就来一场 &lt;strong>Linux 发行版大乱斗&lt;/strong>，看看谁才是小内存 VPS 的“真命天子”。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>选手一：Ubuntu Server (特别是 20.04/22.04)&lt;/strong>&lt;/p>
&lt;p>&lt;strong>标签：&lt;/strong> &lt;code>网红&lt;/code> &lt;code>资源大户&lt;/code> &lt;code>生态最好&lt;/code>&lt;/p>
&lt;p>Ubuntu 无疑是目前最流行的发行版。它的社区极其强大，你遇到任何问题，百度/谷歌搜出来的教程 80% 都是基于 Ubuntu 的。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>优点：&lt;/strong>
&lt;ul>
&lt;li>教程多，遇到报错容易解决。&lt;/li>
&lt;li>PPA 软件源丰富，想装最新版 Node.js 或 Golang 非常容易。&lt;/li>
&lt;li>开箱即用，预装了 UFW、Sudo 等工具。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>缺点（致命）：&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>胖。&lt;/strong> 真的很胖。&lt;/li>
&lt;li>为了推广自家的 Snap 包管理，强制后台运行 Snapd 守护进程，加上 Cloud-init 等云服务组件，&lt;strong>空载启动内存占用常年在 400MB - 600MB&lt;/strong>。&lt;/li>
&lt;li>对于 1G 内存的机器，系统吃掉一半，剩下一半你还想跑 MySQL？做梦。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适合人群：&lt;/strong> 内存 ≥ 4GB 的土豪，或者极其依赖某些 Ubuntu 独占教程的新手。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>选手二：Debian (推荐 11/12)&lt;/strong>&lt;/p>
&lt;p>&lt;strong>标签：&lt;/strong> &lt;code>极简&lt;/code> &lt;code>稳定&lt;/code> &lt;code>省内存的神&lt;/code>&lt;/p>
&lt;p>Debian 是 Ubuntu 的“爸爸”（Ubuntu 基于 Debian 开发）。它去掉了 Ubuntu 那些花里胡哨的商业推广服务，保留了最纯粹的 Linux 核心。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>优点：&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>极度省内存。&lt;/strong> Debian 11 Server 空载启动仅需 &lt;strong>70MB - 120MB&lt;/strong>。相比 Ubuntu，它直接为你省出了 300M+ 的“纯利润”。&lt;/li>
&lt;li>&lt;strong>极其稳定。&lt;/strong> Debian 的稳定分支是以“稳如老狗”著称的，服务器跑几年不重启是常态。&lt;/li>
&lt;li>&lt;strong>无缝迁移。&lt;/strong> 命令和 Ubuntu 99% 通用（都是 &lt;code>apt&lt;/code>，都是 &lt;code>systemd&lt;/code>），你会用 Ubuntu 就会用 Debian。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>缺点：&lt;/strong>
&lt;ul>
&lt;li>默认软件库的版本策略偏保守（比较旧），但可以通过添加源解决。&lt;/li>
&lt;li>极其纯净，可能需要你手动 &lt;code>apt install sudo&lt;/code> 或 &lt;code>apt install ufw&lt;/code>（但这其实是优点）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适合人群：&lt;/strong> &lt;strong>1 核 1G / 2G 用户的首选。&lt;/strong> 懂点基础 Linux 的人。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>选手三：CentOS (及 AlmaLinux / Rocky Linux)&lt;/strong>&lt;/p>
&lt;p>&lt;strong>标签：&lt;/strong> &lt;code>企业级&lt;/code> &lt;code>老派&lt;/code> &lt;code>正在消亡&lt;/code>&lt;/p>
&lt;p>曾经的服务器霸主，互联网公司的标配。但自从 RedHat 宣布 &lt;strong>CentOS 7 停止维护&lt;/strong> 且 CentOS 8 转为“上游测试版（Stream）”后，它的地位就在急剧下降。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>现状：&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>CentOS 7：&lt;/strong> 太老了，内核老，软件老，且已停止维护，&lt;strong>不推荐&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>CentOS Stream：&lt;/strong> 激进的测试版，不适合生产环境。&lt;/li>
&lt;li>&lt;strong>AlmaLinux / Rocky Linux：&lt;/strong> CentOS 的完美替代品，原汁原味的企业级 RHEL 体验。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>资源占用：&lt;/strong> 介于 Debian 和 Ubuntu 之间，空载约 &lt;strong>200MB - 300MB&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>缺点：&lt;/strong>
&lt;ul>
&lt;li>包管理器 &lt;code>yum/dnf&lt;/code> 的速度体感上比 &lt;code>apt&lt;/code> 慢。&lt;/li>
&lt;li>很多个人开发者的软件（如某些一键脚本、面板）现在优先适配 Debian/Ubuntu 系，CentOS 支持度在下降。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适合人群：&lt;/strong> 公司生产环境要求（必须兼容 RHEL）、正在学习红帽认证（RHCE）的同学。&lt;strong>个人小鸡不推荐。&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>选手四：Alpine Linux&lt;/strong>&lt;/p>
&lt;p>&lt;strong>标签：&lt;/strong> &lt;code>极端&lt;/code> &lt;code>微型&lt;/code> &lt;code>容器专家&lt;/code>&lt;/p>
&lt;p>这是一个走极端路线的系统。它不是基于常见的 GNU 库（glibc），而是基于 musl libc。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>优点：&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>小到离谱。&lt;/strong> 空载内存占用仅 &lt;strong>5MB - 15MB&lt;/strong>。&lt;/li>
&lt;li>镜像体积极小，下载秒完。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>缺点（劝退）：&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>兼容性地狱。&lt;/strong> 因为缺少 glibc，很多常见的二进制程序（如标准的 JDK、某些编译好的 Python 库）无法直接运行，会报错“文件不存在”。&lt;/li>
&lt;li>命令不同。它用 &lt;code>apk&lt;/code> 安装软件，没有 &lt;code>systemd&lt;/code>，很多习惯要改。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>适合人群：&lt;/strong> Docker 深度玩家（作为容器底包）、极端资源匮乏环境、Linux 老鸟。&lt;strong>新手慎入。&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>总结：一张图告诉你怎么选&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">特性&lt;/th>
&lt;th style="text-align: left">&lt;strong>Ubuntu 20/22&lt;/strong>&lt;/th>
&lt;th style="text-align: left">&lt;strong>Debian 11/12&lt;/strong>&lt;/th>
&lt;th style="text-align: left">&lt;strong>CentOS 7/Alma&lt;/strong>&lt;/th>
&lt;th style="text-align: left">&lt;strong>Alpine&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>空载内存&lt;/strong>&lt;/td>
&lt;td style="text-align: left">400MB+ (胖)&lt;/td>
&lt;td style="text-align: left">&lt;strong>80MB - 120MB (优)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">200MB+ (中)&lt;/td>
&lt;td style="text-align: left">10MB (神)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>命令习惯&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;code>apt&lt;/code> (主流)&lt;/td>
&lt;td style="text-align: left">&lt;code>apt&lt;/code> (同上)&lt;/td>
&lt;td style="text-align: left">&lt;code>yum/dnf&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>apk&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>软件新旧&lt;/strong>&lt;/td>
&lt;td style="text-align: left">新&lt;/td>
&lt;td style="text-align: left">稳 (偏旧)&lt;/td>
&lt;td style="text-align: left">旧/稳&lt;/td>
&lt;td style="text-align: left">新&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>上手难度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">⭐&lt;/td>
&lt;td style="text-align: left">⭐⭐&lt;/td>
&lt;td style="text-align: left">⭐⭐⭐&lt;/td>
&lt;td style="text-align: left">⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>1G 机器推荐&lt;/strong>&lt;/td>
&lt;td style="text-align: left">❌ 不推荐&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>强烈推荐&lt;/strong>&lt;/td>
&lt;td style="text-align: left">⭕ 勉强可用&lt;/td>
&lt;td style="text-align: left">⚠️ 仅限专家&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>最终建议&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>如果你手里拿着 &lt;strong>1 核 1G&lt;/strong> 的服务器，&lt;strong>请无脑安装 Debian 11 或 12&lt;/strong>。
&lt;ul>
&lt;li>理由：它能让你用 Ubuntu 的操作习惯，享受到极致的资源利用率。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>如果你是去公司上班，公司要求用啥你就用啥（通常是 CentOS 或 Rocky）。&lt;/li>
&lt;li>如果你是玩 Docker 微服务架构，可以尝试 Alpine。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>别再让操作系统吃掉你 40% 的性能了，换个 Debian，给你的业务留点活路吧。&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>&lt;em>觉得有用？点赞收藏，下次重装系统不迷路。&lt;/em>&lt;/p>
&lt;h1 id="服务器带宽测试完全指南场景方法与单位换算">服务器带宽测试完全指南：场景、方法与单位换算
&lt;/h1>&lt;p>测试服务器带宽，通常分两种场景：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>想看综合表现：&lt;/strong> 比如连接国内（电信/联通/移动）快不快，连接海外快不快。&lt;/li>
&lt;li>&lt;strong>想看瞬时峰值：&lt;/strong> 就像家里测速一样，看最大能跑多少。&lt;/li>
&lt;/ol>
&lt;p>以下是几种最常用、最硬核的测试方法（按推荐程度排序）：&lt;/p>
&lt;hr>
&lt;p>&lt;strong>方法一：使用“一键测速脚本” (最推荐，VPS 玩家必备)&lt;/strong>&lt;/p>
&lt;p>这是 Linux 服务器圈子最常用的方法。这些脚本会自动测试服务器连接全球（包括中国大陆三网）的上传和下载速度，并生成漂亮的报告。&lt;/p>
&lt;p>&lt;strong>推荐脚本 1：Hyperspeed (测速速度快，节点多，但是注意，没有配置的情况下可能会有中文乱码)&lt;/strong>&lt;/p>
&lt;p>这是一个专注于网络测速的脚本，它会测试国内三网和国际主要节点的带宽。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">bash &amp;lt;&lt;span class="o">(&lt;/span>curl -Lso- https://bench.im/hyperspeed&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>推荐脚本 2：Superbench (经典老牌)&lt;/strong>&lt;/p>
&lt;p>不仅测网速，还能顺便把你的 CPU 型号、磁盘 I/O 读写速度一起测了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget -qO- --no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh &lt;span class="p">|&lt;/span> bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>如何看结果？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Upload Speed (上行带宽):&lt;/strong> 这是最重要的。决定了你的服务器给用户发数据的速度（比如你建站，用户打开网页的速度）。&lt;/li>
&lt;li>&lt;strong>Download Speed (下行带宽):&lt;/strong> 决定了你服务器下载文件的速度。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>方法二：使用 Speedtest 命令行版 (最准确的单点测试)&lt;/strong>&lt;/p>
&lt;p>如果你只关心“这一刻我的最大带宽是多少”，用 Ookla 官方的 Speedtest 工具最准。&lt;/p>
&lt;p>&lt;strong>1. 安装 Speedtest：&lt;/strong>&lt;/p>
&lt;p>Debian/Ubuntu 默认源里的版本比较老，建议用下面的方式安装 Python 版，轻量方便。&lt;/p>
&lt;p>先安装 pip（如果还没有的话）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install python3-pip -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装 speedtest-cli：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip3 install speedtest-cli
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2. 开始测速：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>简单测速（自动找最近节点）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">speedtest-cli
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>生成图片链接（方便发给朋友看）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">speedtest-cli --share
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>方法三：实时监控 (看着流量跑)&lt;/strong>&lt;/p>
&lt;p>如果你正在下载东西，或者想看着服务器当前的实时带宽占用，可以用 &lt;code>nload&lt;/code>。它像个仪表盘一样。&lt;/p>
&lt;p>&lt;strong>1. 安装：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt install nload -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2. 运行：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">nload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Incoming:&lt;/strong> 进来的流量（下载）&lt;/li>
&lt;li>&lt;strong>Outgoing:&lt;/strong> 出去的流量（上传）&lt;/li>
&lt;li>按键盘上的左右箭头键可以在不同网卡之间切换。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>⚠️ 新手必看的“带宽单位”坑&lt;/strong>&lt;/p>
&lt;p>&lt;strong>千万别搞混了 &lt;code>Mbps&lt;/code> 和 &lt;code>MB/s&lt;/code>！&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>商家卖给你的带宽通常是 &lt;strong>Mbps&lt;/strong> (Megabits per second, 小写的 b)。&lt;/li>
&lt;li>你在浏览器/迅雷里看到的速度通常是 &lt;strong>MB/s&lt;/strong> (Megabytes per second, 大写的 B)。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>换算公式：除以 8&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">商家标称带宽&lt;/th>
&lt;th style="text-align: left">理论最高下载速度 (MB/s)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>1 Mbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">128 KB/s (慢到令人发指)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>5 Mbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">640 KB/s (勉强看标清视频)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>10 Mbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">1.25 MB/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>30 Mbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">3.75 MB/s (轻量级应用够用)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>100 Mbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">12.5 MB/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>1 Gbps&lt;/strong>&lt;/td>
&lt;td style="text-align: left">125 MB/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>实战判断：&lt;/strong>&lt;/p>
&lt;p>如果你买的是 30Mbps 的服务器，你用 &lt;code>nload&lt;/code> 看到 Outgoing 跑到 &lt;strong>3.5MB/s&lt;/strong> 左右，说明带宽已经跑满了。&lt;/p></description></item><item><title>Dokploy</title><link>https://www.zata.cc/p/dokploy/</link><pubDate>Sun, 22 Feb 2026 15:43:30 +0800</pubDate><guid>https://www.zata.cc/p/dokploy/</guid><description>&lt;img src="https://www.zata.cc/p/dokploy/images/index/index.png" alt="Featured image of post Dokploy" />&lt;h1 id="快速安装使用教程-注意如果内存小于等于2g一定要加虚拟内存否则会卡死">快速安装使用教程 (注意，如果内存小于等于2G，一定要加虚拟内存，否则会卡死)
&lt;/h1>&lt;p>&lt;a class="link" href="https://dokploy.com/" target="_blank" rel="noopener"
>官网地址&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://docs.dokploy.com/docs/core/manual-installation" target="_blank" rel="noopener"
>关于swarm的安装&lt;/a>&lt;/p>
&lt;p>注意: 如果内存很小的机器,安装之后千万别点升级dokploy的按钮, 即使你开了Swap也没用,只要一升级,很大概率就会很绝望了(dokploy服务崩溃且无法恢复),内存1G的推荐安装0.26.6版本,其他版本可能就爆内存了 export DOKPLOY_VERSION=v0.26.6 &amp;amp;&amp;amp; curl -sSL &lt;a class="link" href="https://dokploy.com/install.sh" target="_blank" rel="noopener"
>https://dokploy.com/install.sh&lt;/a> | sh &amp;mdash; 20260310&lt;/p>
&lt;p>一键安装脚本，安装完成之后会给一个地址&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ADVERTISE_ADDR&lt;/span>&lt;span class="o">=&lt;/span>&amp;lt;指定IP地址&amp;gt; &lt;span class="c1"># 需要指定公网IP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://dokploy.com/install.sh &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://dokploy.com/install.sh &lt;span class="p">|&lt;/span> &lt;span class="nv">ADVERTISE_ADDR&lt;/span>&lt;span class="o">=&lt;/span>&amp;lt;你的服务器公网IP&amp;gt; bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>帮助子节点安装docker&lt;/p>
&lt;p>&lt;strong>阿里云服务器&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add the Aliyun Repository&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2">] https://mirrors.aliyun.com/docker-ce/linux/ubuntu &lt;/span>&lt;span class="k">$(&lt;/span>lsb_release -cs&lt;span class="k">)&lt;/span>&lt;span class="s2"> stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Update your Package List&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Install Docker &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># verify the installation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#配置镜像加速&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /etc/docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo tee /etc/docker/daemon.json &lt;span class="s">&amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://&amp;lt;你的加速镜像地址，进入阿里云镜像加速服务获取&amp;gt;.mirror.aliyuncs.com&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> --now docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> containerd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>腾讯云服务器&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo install -m &lt;span class="m">0755&lt;/span> -d /etc/apt/keyrings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fsSL http://mirrors.tencentyun.com/docker-ce/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2"> signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.tencentyun.com/docker-ce/linux/ubuntu \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &lt;/span>&lt;span class="k">$(&lt;/span>. /etc/os-release &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$VERSION_CODENAME&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2"> stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /etc/docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo tee /etc/docker/daemon.json &lt;span class="s">&amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://mirror.ccs.tencentyun.com&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> --now docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> containerd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -fsSL https://get.docker.com &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置开机自启 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 作为子节点加入到 swarm 集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker swarm join &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --token &amp;lt;TOKEN&amp;gt; &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --advertise-addr &amp;lt;当前子节点的_公网IP&amp;gt; &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --data-path-addr &amp;lt;当前子节点的_公网IP&amp;gt; &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &amp;lt;Manager_公网IP&amp;gt;:2377
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查是否成功加入 swarm 集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">telnet &amp;lt;Manager_公网IP&amp;gt; &lt;span class="m">2377&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">telnet &amp;lt;Manager_公网IP&amp;gt; &lt;span class="m">7946&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查看所有容器的运行状态&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker service ps
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="服务器爬墙来安装">服务器爬墙来安装
&lt;/h2>&lt;p>服务器爬墙的内容可以看我另一篇 《服务器爬墙》教程&lt;/p>
&lt;p>&lt;strong>🛠️ Dokploy 完美安装四部曲&lt;/strong>&lt;/p>
&lt;p>&lt;strong>第一步：基础环境准备 (Ubuntu/Debian)&lt;/strong>
首先确保系统干净，并安装必要的工具。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install -y curl vim net-tools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>第二步：安装并优化 Docker (核心环节)&lt;/strong>
不要直接运行 Dokploy 脚本，先手动把 Docker 装好并配置代理。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>安装 Docker&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -fsSL https://get.docker.com &lt;span class="p">|&lt;/span> bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置 Docker 代理 (解决镜像下载失败)&lt;/strong>：
这是国内服务器成功的关键。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir -p /etc/systemd/system/docker.service.d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim /etc/systemd/system/docker.service.d/http-proxy.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>写入以下内容（假设你的 Mihomo 代理在 7890）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Environment&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;HTTP_PROXY=http://127.0.0.1:7890&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Environment&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;HTTPS_PROXY=http://127.0.0.1:7890&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Environment&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;NO_PROXY=localhost,127.0.0.1,你的服务器公网IP&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>重启生效&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl restart docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>第三步：部署 Dokploy&lt;/strong>
现在 Docker 已经可以丝滑地拉取镜像了，直接运行官方脚本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 注意替换成你自己的服务器公网 IP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://dokploy.com/install.sh &lt;span class="p">|&lt;/span> &lt;span class="nv">ADVERTISE_ADDR&lt;/span>&lt;span class="o">=&lt;/span>你的服务器公网IP bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>这一步脚本会自动完成以下操作：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>初始化 Docker Swarm（容器集群模式）。&lt;/li>
&lt;li>创建 &lt;code>dokploy-network&lt;/code> 虚拟网络。&lt;/li>
&lt;li>生成随机的数据库密码并存入 &lt;code>Docker Secrets&lt;/code>。&lt;/li>
&lt;li>部署 &lt;code>Postgres&lt;/code> (数据库)、&lt;code>Redis&lt;/code> (缓存) 和 &lt;code>Dokploy&lt;/code> (主程序)。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>第四步：防火墙与初始化&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>放行端口&lt;/strong>：
去你的云商后台（腾讯云/阿里云等）开启以下入站规则：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>3000&lt;/strong>：Dokploy 面板访问端口。&lt;/li>
&lt;li>&lt;strong>80 / 443&lt;/strong>：未来你部署应用后的访问端口。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>访问面板&lt;/strong>：
打开浏览器：&lt;code>http://你的服务器IP:3000&lt;/code>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>第一次进入&lt;/strong>：会要求你创建管理员账号（邮箱/密码）。&lt;/li>
&lt;li>&lt;strong>配置面板&lt;/strong>：进入后在 &lt;code>Settings&lt;/code> 中确认 &lt;code>Server IP&lt;/code> 正确。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>💡 为什么之前会失败？（复盘总结）&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">错误阶段&lt;/th>
&lt;th style="text-align: left">根本原因&lt;/th>
&lt;th style="text-align: left">表现&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>安装 Docker 报错&lt;/strong>&lt;/td>
&lt;td style="text-align: left">脚本传参语法不对&lt;/td>
&lt;td style="text-align: left">&lt;code>Failure writing output&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>创建容器一直 Preparing&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Docker 无法连接官方镜像仓库&lt;/td>
&lt;td style="text-align: left">镜像下载进度 0%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>PostgresError (密码错误)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">残留的旧数据库卷与新生成的密码冲突&lt;/td>
&lt;td style="text-align: left">容器一直重启，日志报 &lt;code>auth_failed&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="安装卡住时的清理方法">安装卡住时的清理方法
&lt;/h2>&lt;p>有时候安装Dokploy可能会卡住，需要清除重来，以下是完整的清理步骤：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 离开 swarm 并清理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker swarm leave --force
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删掉所有 Dokploy 相关的东西&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker service rm &lt;span class="k">$(&lt;/span>docker service ls -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker container rm -f &lt;span class="k">$(&lt;/span>docker ps -aq --filter &lt;span class="s2">&amp;#34;name=dokploy&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker volume rm &lt;span class="k">$(&lt;/span>docker volume ls -q --filter &lt;span class="s2">&amp;#34;name=dokploy&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker network rm &lt;span class="k">$(&lt;/span>docker network ls -q --filter &lt;span class="s2">&amp;#34;name=dokploy&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 更加彻底的：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除所有服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker service rm &lt;span class="k">$(&lt;/span>docker service ls -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除 Dokploy 存储的密码密钥 (关键！)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker secret rm &lt;span class="k">$(&lt;/span>docker secret ls -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除网络&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker network rm dokploy-network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除数据卷（如果你不介意清空重来，这能解决 99% 的数据库问题）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker volume rm &lt;span class="k">$(&lt;/span>docker volume ls -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理残留镜像（可选）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system prune -a --volumes --force
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 再跑安装（加 --debug 看更详细输出）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://dokploy.com/install.sh &lt;span class="p">|&lt;/span> bash -s -- --debug
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或指定 advertise addr（如果你的公网IP不是自动检测到的）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://dokploy.com/install.sh &lt;span class="p">|&lt;/span> &lt;span class="nv">ADVERTISE_ADDR&lt;/span>&lt;span class="o">=&lt;/span>你的服务器公网IP bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="注意事项">注意事项
&lt;/h1>&lt;ol>
&lt;li>
&lt;p>只要改过了domin,就一定要重新deploy
&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-6.png"
width="644"
height="256"
srcset="https://www.zata.cc/p/dokploy/images/index/image-6_hu5312012935175865417.png 480w, https://www.zata.cc/p/dokploy/images/index/image-6_hu11201298481149940884.png 1024w"
loading="lazy"
alt="提醒重新部署"
class="gallery-image"
data-flex-grow="251"
data-flex-basis="603px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>可以先用自己电脑ssh-copy-id 到远程服务器，然后把自己电脑上的ssh密钥复制过来
&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-1.png"
width="2754"
height="1642"
srcset="https://www.zata.cc/p/dokploy/images/index/image-1_hu12951991248830545399.png 480w, https://www.zata.cc/p/dokploy/images/index/image-1_hu8854949752212430651.png 1024w"
loading="lazy"
alt="可以复制自己电脑上的ssh密钥"
class="gallery-image"
data-flex-grow="167"
data-flex-basis="402px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>子节点默认可能是没有docker的,需要安装一下
&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-2.png"
width="3404"
height="1932"
srcset="https://www.zata.cc/p/dokploy/images/index/image-2_hu10748364068089874623.png 480w, https://www.zata.cc/p/dokploy/images/index/image-2_hu6406890722659584139.png 1024w"
loading="lazy"
alt="没有docker报错"
class="gallery-image"
data-flex-grow="176"
data-flex-basis="422px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>添加docker swarm 误操作添加了管理节点，然后又下线会导致原本的管理节点脑裂,详情需要看dokploy的官方文档
重新安装请查看前面的方法&lt;/p>
&lt;/li>
&lt;li>
&lt;p>dokploy很多时候部署失败可能是不提示的,尤其是使用 docker stack 的时候&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配置了域名地址之后,有时候可能要等一会才能生效&lt;/p>
&lt;/li>
&lt;li>
&lt;p>网络配置
这一步非常重要，告诉 Docker 使用 Dokploy 已经建好的网络
networks:
dokploy-network:
external: true&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如何更换swarm的advertise addr
docker swarm init &amp;ndash;force-new-cluster &amp;ndash;advertise-addr &amp;lt;你的服务器IP&amp;gt;&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h1 id="一些应用的部署">一些应用的部署
&lt;/h1>&lt;h2 id="ip-重定向-解决切换ip后访问域名失败的问题-----20260323">IP 重定向 (解决切换IP后访问域名失败的问题) &amp;mdash; 20260323
&lt;/h2>&lt;p>将所有访问你的域名的请求重定向到你的新 IP 地址。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">version: &lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">services:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ip-redirector:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> image: nginx:alpine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> restart: unless-stopped
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> networks:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - dokploy-network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> labels:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 【修改这里 1】替换成你真实的域名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;traefik.http.routers.ip-redirector.rule=Host(`yourdomain.com`) || Host(`www.yourdomain.com`)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;traefik.http.services.ip-redirector.loadbalancer.server.port=80&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;traefik.http.routers.ip-redirector.entrypoints=websecure&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;traefik.http.routers.ip-redirector.tls.certresolver=letsencrypt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> command: &amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /bin/sh -c &lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> echo &amp;#39;server {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> listen 80;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> location / {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> # 【修改这里 2】改成你的新IP！注意这里改成了 https://
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_pass https://1.2.3.4;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> # 传递真实访客信息
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header Host &lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">host;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header X-Real-IP &lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">remote_addr;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header X-Forwarded-For &lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">proxy_add_x_forwarded_for;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header X-Forwarded-Proto https;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> # 【新增：核心修复代码】开启 SNI，否则新服务器的 HTTPS 无法识别域名会报错
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_ssl_server_name on;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_ssl_name &lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">host;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> # 支持 WebSocket 等长连接
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_http_version 1.1;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header Upgrade &lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">http_upgrade;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> proxy_set_header Connection \&amp;#34;upgrade\&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> }&amp;#39; &amp;gt; /etc/nginx/conf.d/default.conf &amp;amp;&amp;amp; nginx -g &amp;#39;daemon off;&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">networks:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> dokploy-network:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> external: &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="docker-registry------20260307创建-未做测试">Docker Registry &amp;mdash; 20260307创建 未做测试
&lt;/h2>&lt;p>Docker Registry 原生并没有提供“自动根据时间删除镜像”的功能。要实现超过 7 天自动删除，必须分为两步完成：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>调用 API 删除标签&lt;/strong>：将超过 7 天的镜像标记为“已删除”（但此时物理磁盘空间还未释放）。&lt;/li>
&lt;li>&lt;strong>执行垃圾回收 (Garbage Collection)&lt;/strong>：清理那些失去标签的底层文件（Blob），真正释放磁盘空间。&lt;/li>
&lt;/ol>
&lt;p>为了在 Docker Compose 中实现自动化，我们可以&lt;strong>增加一个专门的清理服务（&lt;code>registry-cleanup&lt;/code>）&lt;/strong>。它会每天自动运行一个广受欢迎的开源 Python 脚本 &lt;code>registry-cli&lt;/code> 来删除旧镜像，并调用 Registry 的 GC 命令释放空间。&lt;/p>
&lt;p>下面是修改后的完整 &lt;code>docker-compose.yml&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 定义数据卷，持久化存储镜像和认证信息&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">registry-data&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">registry-auth-data&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 使用 Dokploy 预置的外部网络&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dokploy-network&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 1. 认证辅助服务：生成账号 admin / 密码 123456&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">auto-setup-auth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">httpd:alpine&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/bin/sh -c &amp;#34;htpasswd -Bbn admin 123456 &amp;gt; /auth/htpasswd&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">registry-auth-data:/auth&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 2. 核心 Registry 服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">registry&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">registry:2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">my-private-registry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;5000:5000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_AUTH&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">htpasswd&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_AUTH_HTPASSWD_REALM&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Registry Realm&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_AUTH_HTPASSWD_PATH&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/auth/htpasswd&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_X_FORWARDED_FOR&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_X_FORWARDED_PROTO&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 【关键配置】开启删除权限（必须开启，清理脚本才能工作）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_STORAGE_DELETE_ENABLED&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_ACCESS_CONTROL_ALLOW_ORIGIN&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;[https://registry-ui.zata.cafe]&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_ACCESS_CONTROL_ALLOW_METHODS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;[HEAD,GET,OPTIONS,DELETE]&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_ACCESS_CONTROL_ALLOW_HEADERS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;[Authorization,Accept,Cache-Control]&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">REGISTRY_HTTP_HEADERS_ACCESS_CONTROL_EXPOSE_HEADERS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;[Docker-Content-Digest]&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">registry-data:/var/lib/registry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">registry-auth-data:/auth&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">auto-setup-auth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">condition&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">service_completed_successfully&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry.rule=Host(`registry.zata.cafe`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry.entrypoints=websecure&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry.tls.certresolver=letsencrypt&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.services.registry.loadbalancer.server.port=5000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 3. Web UI 管理界面&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">registry-ui&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">joxit/docker-registry-ui:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">registry-ui&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">NGINX_PROXY_PASS_URL=http://my-private-registry:5000&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">SINGLE_REGISTRY=true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DELETE_IMAGES=true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">REGISTRY_TITLE=Zata Registry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry-ui.rule=Host(`registry-ui.zata.cafe`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry-ui.entrypoints=websecure&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.registry-ui.tls.certresolver=letsencrypt&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.services.registry-ui.loadbalancer.server.port=80&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 4. 【新增】自动清理服务 (每天执行)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">registry-cleanup&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">docker:cli&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">registry-cleanup&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 挂载宿主机的 Docker Socket，以便此容器能够向 registry 容器发送垃圾回收命令&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/var/run/docker.sock:/var/run/docker.sock&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">registry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entrypoint&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;/bin/sh&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 核心自动化脚本&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 安装 Python 和 HTTP 请求库
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> apk add --no-cache python3 py3-requests curl
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 下载著名的开源镜像清理脚本 registry-cli
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> curl -sSLO https://raw.githubusercontent.com/anoxis/registry-cli/master/registry.py
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> chmod +x registry.py&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;自动清理服务已启动...&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">while true; do&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;==== 开始调用 API 清理 7 天前的镜像标签 ====&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 参数说明:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># --keep-days 7 : 删除 7 天前的镜像&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># --keep-tags 1 : 即使超过 7 天，也强制保留最新生成的 1 个版本（防止仓库被彻底删空，如果你想彻底删空可去掉此参数）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">python3 registry.py -r http://my-private-registry:5000 -l admin:123456 --delete --keep-days 7 --keep-tags 1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;==== 开始执行 GC (垃圾回收) 释放磁盘空间 ====&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 必须执行 --delete-untagged，否则上一段脚本删除的镜像文件依然会占用物理空间&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">docker exec my-private-registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;==== 清理与回收完成，休眠 24 小时 ====&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sleep 86400&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">done&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>新增服务原理解析：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>基础镜像 (&lt;code>docker:cli&lt;/code>)&lt;/strong>：我们需要在脚本最后使用 &lt;code>docker exec&lt;/code> 去调用 Registry 容器执行垃圾回收，因此使用了带 docker 命令的基础镜像，并挂载了宿主机的 &lt;code>docker.sock&lt;/code>。&lt;/li>
&lt;li>&lt;strong>依赖安装&lt;/strong>：自动下载著名的 &lt;code>anoxis/registry-cli&lt;/code> 脚本，它擅长处理 Docker Registry 的 API，并且支持基于时间删除。&lt;/li>
&lt;li>&lt;strong>保留策略控制&lt;/strong>：
&lt;ul>
&lt;li>&lt;code>--keep-days 7&lt;/code>：这就是你要求的，超过 7 天的删除。&lt;/li>
&lt;li>&lt;code>--keep-tags 1&lt;/code>：（推荐设置）保护机制，如果某个镜像 1 个月没更新了，清理时依然会保留最近的一个版本，以免业务拉取不到镜像。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>垃圾回收 (&lt;code>garbage-collect&lt;/code>)&lt;/strong>：脚本删除标签后，镜像状态会变成 untagged（无标签），最后执行 &lt;code>registry garbage-collect --delete-untagged&lt;/code> 才会把它们真正从宿主机的物理硬盘上删除。&lt;/li>
&lt;li>&lt;strong>内网直连&lt;/strong>：脚本直接使用内网地址 &lt;code>http://my-private-registry:5000&lt;/code> 通信，既快又不会受到外部 Traefik 或 Nginx 超时策略的影响。&lt;/li>
&lt;/ol>
&lt;h2 id="filebrowser">FileBrowser
&lt;/h2>&lt;p>这份教程不仅能让你拥有一个管理 VPS 全盘文件的神器，还规避了密码无法重置、下载系统文件报错等常见问题。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>1. 准备工作&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>目标&lt;/strong>：部署一个 Web 端的文件管理器，可以管理 VPS 上的&lt;strong>所有文件&lt;/strong>（拥有 Root 权限）。&lt;/li>
&lt;li>&lt;strong>工具&lt;/strong>：Dokploy 面板（使用 Docker Compose 方式）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 部署配置 (Docker Compose)&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中创建一个新的 &lt;strong>Application (Compose)&lt;/strong>，将以下代码完整复制进去。&lt;/p>
&lt;p>&lt;strong>代码特点：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>超级权限&lt;/strong>：使用 &lt;code>user: &amp;quot;0:0&amp;quot;&lt;/code> 获得 Root 权限，可读写系统任何文件。&lt;/li>
&lt;li>&lt;strong>全盘挂载&lt;/strong>：将宿主机根目录 &lt;code>/&lt;/code> 挂载到容器内，实现全盘管理。&lt;/li>
&lt;li>&lt;strong>防止配置冲突&lt;/strong>：修正了之前的语法错误，并配置了数据卷以确保持久化。&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.3&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">filebrowser&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">filebrowser/filebrowser:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">filebrowser_root&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 核心：赋予容器 Root 权限，否则无法修改系统文件&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0:0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 核心：将 VPS 的根目录 (/) 挂载到容器的 /srv 目录&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/:/srv&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 数据库持久化卷：存储你的用户信息和设置&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 如果忘记密码，修改冒号前的名称 (如改成 filebrowser_data_v3) 即可重置&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">filebrowser_data_v2:/database &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 启动命令 (合并写在一行)：&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># -d 指定数据库路径&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># -p 强制监听 80 端口&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># -r 指定根目录为挂载进来的 /srv&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>-&lt;span class="l">d /database/filebrowser.db -p 80 -r /srv&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 对应上面的数据卷名称&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">filebrowser_data_v2&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dokploy-network&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>3. 端口设置 (Ports)&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 的应用设置界面，找到 &lt;strong>Ports&lt;/strong> 选项卡：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Internal Port (容器端口)&lt;/strong>: &lt;code>80&lt;/code>&lt;/li>
&lt;li>&lt;strong>External Port (外部端口)&lt;/strong>: 填写一个未被占用的端口，例如 &lt;code>8088&lt;/code> 或 &lt;code>9999&lt;/code>。&lt;/li>
&lt;/ul>
&lt;p>点击 &lt;strong>Save&lt;/strong> 并 &lt;strong>Deploy&lt;/strong>。&lt;/p>
&lt;p>&lt;strong>4. 首次登录与设置&lt;/strong>&lt;/p>
&lt;p>部署完成后，通过浏览器访问 &lt;code>http://你的 IP:你的外部端口&lt;/code>。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>默认账号&lt;/strong>：&lt;code>admin&lt;/code>&lt;/li>
&lt;li>&lt;strong>默认密码&lt;/strong>：&lt;code>admin&lt;/code>&lt;/li>
&lt;li>&lt;strong>修改密码（重要）&lt;/strong>：
&lt;ul>
&lt;li>登录后，点击左侧栏 &lt;strong>Settings&lt;/strong> -&amp;gt; &lt;strong>Profile&lt;/strong>。&lt;/li>
&lt;li>在 &lt;strong>Password&lt;/strong> 区域输入新密码。&lt;/li>
&lt;li>点击 &lt;strong>Update&lt;/strong> 保存。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>5. 避坑指南 (常见误区)&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Q1: 为什么下载某些文件报错 &lt;code>ERR_INVALID_RESPONSE&lt;/code>？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>现象&lt;/strong>：尝试下载 &lt;code>/proc&lt;/code>、&lt;code>/sys&lt;/code>、&lt;code>/dev&lt;/code> 目录下的文件时失败。&lt;/li>
&lt;li>&lt;strong>原因&lt;/strong>：这些不是真实文件，而是系统内存和内核状态的“虚拟映射”。它们大小通常显示为 0，Web 服务器无法打包下载它们。&lt;/li>
&lt;li>&lt;strong>解决&lt;/strong>：&lt;strong>不要下载这些目录的文件&lt;/strong>。请测试下载 &lt;code>/etc/hosts&lt;/code> 或者你自己创建的 &lt;code>/home/test.txt&lt;/code>，这些才是真实文件。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Q2: 我忘记了密码怎么办？&lt;/strong>&lt;/p>
&lt;p>&lt;strong>无法通过环境变量设置密码&lt;/strong>。如果忘记密码，最快的方法是“洗号重来”：&lt;/p>
&lt;ol>
&lt;li>修改 Docker Compose 中的 &lt;code>volumes&lt;/code> 部分。&lt;/li>
&lt;li>将 &lt;code>- filebrowser_data_v2:/database&lt;/code> 改为 &lt;code>- filebrowser_data_v3:/database&lt;/code>。&lt;/li>
&lt;li>重新部署。这会生成全新的数据库，密码恢复为默认的 &lt;code>admin&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Q3: 安全警告&lt;/strong>&lt;/p>
&lt;p>因为这个容器挂载了 &lt;code>/&lt;/code> 根目录且拥有 Root 权限：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>不要&lt;/strong>随意删除 &lt;code>/bin&lt;/code>, &lt;code>/boot&lt;/code>, &lt;code>/usr&lt;/code> 等系统核心目录，否则 VPS 会挂掉。&lt;/li>
&lt;li>&lt;strong>务必&lt;/strong>设置强密码，不要将此服务随意暴露给不可信的人。&lt;/li>
&lt;/ul>
&lt;h2 id="webdav">webDAV
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">webdav&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bytemark/webdav&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">AUTH_TYPE=Basic&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">USERNAME=your_username&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">PASSWORD=your_password&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./data:/var/lib/dav&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 1. 路由规则：域名匹配&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.webdav.rule=Host(`dav.yourdomain.com`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 2. 启用 TLS 并在入口点使用 HTTPS (443)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.webdav.entrypoints=websecure&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 3. 指定你的 Let&amp;#39;s Encrypt 解析器名称 (通常在 Traefik 全局配置里定义)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.routers.webdav.tls.certresolver=letsencrypt&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 4. 强制指定内部端口，防止 Traefik 误判&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;traefik.http.services.webdav.loadbalancer.server.port=80&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cleaner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alpine&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./data:/var/lib/dav&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/bin/sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- -&lt;span class="l">c&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> while true; do
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 检查 1024MB (1GB)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> while [ $$(du -sm /var/lib/dav | awk &amp;#39;{print $$1}&amp;#39;) -gt 1024 ]; do
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 删掉最老的文件
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> OLDEST=$$(find /var/lib/dav -type f -exec stat -c &amp;#34;%Y %n&amp;#34; {} + | sort -n | head -n 1 | cut -d&amp;#34; &amp;#34; -f2-)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> [ -z &amp;#34;$$OLDEST&amp;#34; ] &amp;amp;&amp;amp; break
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> rm -f &amp;#34;$$OLDEST&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> done
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> sleep 60
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> done&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;strong>💡补充几点：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>证书解析器名称&lt;/strong>：
标签里的 &lt;code>tls.certresolver=letsencrypt&lt;/code>。这里的 &lt;code>letsencrypt&lt;/code> 必须和你 Traefik 静态配置文件（或是 Dokploy 设置里）定义的解析器名称&lt;strong>完全一致&lt;/strong>。如果不一致，证书不会自动签发。&lt;/li>
&lt;li>&lt;strong>网络（Network）的坑&lt;/strong>：
如果你发现域名访问报 &lt;strong>504 Gateway Timeout&lt;/strong>，那 99% 还是网络问题。此时你需要运行 &lt;code>docker network ls&lt;/code> 看看 Traefik 在哪个网段，并在 &lt;code>webdav&lt;/code> 服务下加上该网络。&lt;/li>
&lt;li>&lt;strong>关于清理脚本（Cleaner）&lt;/strong>：
这个脚本是并行的。WebDAV 负责写，Cleaner 负责巡逻。它们共享 &lt;code>./data&lt;/code> 卷，所以互不干扰。&lt;/li>
&lt;/ol>
&lt;h2 id="alist">alist
&lt;/h2>&lt;p>alist 直接可以在应用市场安装&lt;/p>
&lt;h1 id="使用与配置">使用与配置
&lt;/h1>&lt;h2 id="docker-swarm-切换advertise-addr">docker swarm 切换advertise addr
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker swarm init --force-new-cluster --advertise-addr &amp;lt;你的服务器IP&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意: 需要等待几分钟,等待dokploy重新启动&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-7.png"
width="1573"
height="379"
srcset="https://www.zata.cc/p/dokploy/images/index/image-7_hu18256622804942156503.png 480w, https://www.zata.cc/p/dokploy/images/index/image-7_hu2889444537278421097.png 1024w"
loading="lazy"
alt="切换advertise addr"
class="gallery-image"
data-flex-grow="415"
data-flex-basis="996px"
>&lt;/p>
&lt;hr>
&lt;p>如果你已经安装好了 Dokploy，并且它正在运行，此时你&lt;strong>绝对不能执行&lt;/strong> &lt;code>docker swarm leave&lt;/code>，否则就像我们前面说的，整个 Dokploy 连同你的数据库会瞬间灰飞烟灭。&lt;/p>
&lt;p>但是 Docker 官方提供了一个非常优雅的“无损更换网络”的隐藏指令！你可以通过强制基于当前状态创建一个新集群的方式，在不丢失任何服务和数据的情况下更改 IP。&lt;/p>
&lt;p>&lt;strong>核心命令：无损更改 Advertise IP&lt;/strong>&lt;/p>
&lt;p>在你的主节点（运行 Dokploy 面板的服务器）上，直接执行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker swarm init --force-new-cluster --advertise-addr &amp;lt;你的内网IP&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;code>docker swarm init --force-new-cluster --advertise-addr 10.0.0.5&lt;/code>&lt;/p>
&lt;p>&lt;strong>为什么这个命令有效且安全？&lt;/strong>&lt;/p>
&lt;p>这个命令里的 &lt;code>--force-new-cluster&lt;/code>（强制新建集群）是关键。它的底层逻辑是：提取当前 Swarm 的所有数据状态（包括 Dokploy 面板、Postgres 数据库、Traefik 路由以及你已经部署的所有应用），然后用你指定的新 IP 强行拉起一个新的集群配置。&lt;/p>
&lt;p>在这个过程中：&lt;/p>
&lt;ul>
&lt;li>你的底层容器和 Volume 数据卷&lt;strong>完全不会丢失&lt;/strong>。&lt;/li>
&lt;li>Dokploy 面板在短暂的重启后会&lt;strong>立刻恢复可用&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>操作后的确认与收尾工作&lt;/p>
&lt;p>更改完成后，你需要做两步检查：&lt;/p>
&lt;p>&lt;strong>第一步：确认 IP 已经更改成功&lt;/strong>&lt;/p>
&lt;p>运行以下命令查看当前节点的实际广播地址：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker info &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;Node Address&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果输出显示的是你的内网 IP，说明网络通道已经成功切换到内网了。&lt;/p>
&lt;p>&lt;strong>第二步：重新连接子节点（重要！）&lt;/strong>&lt;/p>
&lt;p>如果你之前已经添加了其他子节点（Worker），由于你强制生成了新的集群状态（集群的隐藏 ID 已经变了），以前加入的旧子节点会&lt;strong>全部断开连接&lt;/strong>。你需要让它们重新加入：&lt;/p>
&lt;ol>
&lt;li>在主节点上获取新的加入令牌：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker swarm join-token worker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>（复制终端打印出来的那串新命令）&lt;/p>
&lt;ol start="2">
&lt;li>登录到所有的子节点服务器，先让它们强制退出旧网络，再加入新网络：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 先让子节点强制离开旧集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker swarm leave --force
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 然后粘贴你刚刚复制的加入命令，例如：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker swarm join --token SWMTKN-1-xxxx &amp;lt;主节点内网IP&amp;gt;:2377
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="volume--vs-bind-mount-vs-environment-variables-----20260310">Volume vs Bind Mount vs Environment Variables &amp;mdash; 20260310
&lt;/h2>&lt;p>本教程旨在帮助您彻底理解 Dokploy 中的数据存储机制（Volumes）与环境变量（Environment Variables）的配置方式、区别及最佳实践。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>📋 第一部分：核心概念速查（决策树）&lt;/strong>&lt;/p>
&lt;p>在动手配置之前，请根据您的具体需求选择正确的存储类型：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">您的需求&lt;/th>
&lt;th style="text-align: left">推荐类型&lt;/th>
&lt;th style="text-align: left">关键特征&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>数据库数据&lt;/strong> (MySQL, PostgreSQL, Redis)&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>Volume (命名卷)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Docker 自动管理，权限无忧，备份迁移方便。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>用户上传的文件&lt;/strong> (图片/视频/附件)&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>Volume (命名卷)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">安全隔离，不依赖宿主机具体路径结构。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>简单的配置文件&lt;/strong> (&lt;code>.env&lt;/code>, &lt;code>config.json&lt;/code>, &lt;code>nginx.conf&lt;/code>)&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>File Mount (文件挂载)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;strong>最推荐&lt;/strong>。网页直接编写内容，无需 SSH，自动创建并挂载。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>复杂的配置目录&lt;/strong> (已有大量现有配置文件)&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>Bind Mount (绑定挂载)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">映射宿主机现有目录，适合高级用户或遗留系统迁移。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>开发调试/代码热更新&lt;/strong>&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>Bind Mount (绑定挂载)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">宿主机修改代码/文件，容器内即时生效。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>不确定选哪个&lt;/strong>&lt;/td>
&lt;td style="text-align: left">✅ &lt;strong>Volume&lt;/strong>&lt;/td>
&lt;td style="text-align: left">它是 Docker 的最佳实践，容错率最高。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;p>&lt;strong>🛠️ 第二部分：三种存储类型详解与实战&lt;/strong>&lt;/p>
&lt;p>&lt;strong>1. Volume (命名卷) —— &amp;ldquo;让 Docker 操心&amp;rdquo;&lt;/strong>
&lt;strong>适用场景&lt;/strong>：数据库持久化、应用产生的数据文件。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>工作原理&lt;/strong>：Docker 在其专用目录（通常是 &lt;code>/var/lib/docker/volumes/&lt;/code>）下创建并管理存储空间。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>权限自动适配&lt;/strong>：极少出现 &lt;code>Permission denied&lt;/code> 错误。&lt;/li>
&lt;li>&lt;strong>高可移植性&lt;/strong>：不依赖宿主机的具体目录结构，迁移服务器只需迁移卷数据。&lt;/li>
&lt;li>&lt;strong>安全隔离&lt;/strong>：数据存储在 Docker 管理区域，不易被误删。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Dokploy 配置步骤&lt;/strong>：
&lt;ol>
&lt;li>进入应用 &lt;strong>Advanced&lt;/strong> -&amp;gt; &lt;strong>Volumes&lt;/strong>。&lt;/li>
&lt;li>点击 &lt;strong>Add Volume&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Mount Type&lt;/strong>: 选择 &lt;code>Volume&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Name&lt;/strong>: 输入卷名称（如 &lt;code>db_data&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>Mount Path&lt;/strong>: 输入容器内路径（如 &lt;code>/var/lib/postgresql/data&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>Host Path&lt;/strong>: &lt;strong>留空&lt;/strong>。&lt;/li>
&lt;li>保存并 &lt;strong>Deploy&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. File Mount (文件挂载) —— &amp;ldquo;网页即写即用&amp;rdquo;&lt;/strong>
&lt;strong>适用场景&lt;/strong>：单个配置文件（&lt;code>.env&lt;/code>, &lt;code>.conf&lt;/code>, &lt;code>.json&lt;/code>）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>工作原理&lt;/strong>：Dokploy 将您在网页文本框中输入的内容，在后台动态生成一个临时文件，并挂载到容器指定路径。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>无需 SSH&lt;/strong>：直接在面板编辑，无需登录服务器创建文件。&lt;/li>
&lt;li>&lt;strong>版本友好&lt;/strong>：内容直接保存在 Dokploy 配置中，便于管理。&lt;/li>
&lt;li>&lt;strong>简单快捷&lt;/strong>：最适合 &lt;code>.env&lt;/code> 文件管理。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Dokploy 配置步骤&lt;/strong>：
&lt;ol>
&lt;li>进入应用 &lt;strong>Advanced&lt;/strong> -&amp;gt; &lt;strong>Volumes&lt;/strong>。&lt;/li>
&lt;li>点击 &lt;strong>Add Volume&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Mount Type&lt;/strong>: 选择 &lt;code>File Mount&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Content&lt;/strong>: 粘贴文件完整内容。&lt;/li>
&lt;li>&lt;strong>File Path&lt;/strong>: 输入容器内&lt;strong>完整文件路径&lt;/strong>（必须包含文件名，如 &lt;code>/app/.env&lt;/code>）。&lt;/li>
&lt;li>保存并 &lt;strong>Deploy&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. Bind Mount (绑定挂载) —— &amp;ldquo;完全由你控制&amp;rdquo;&lt;/strong>
&lt;strong>适用场景&lt;/strong>：挂载现有目录、代码热重载、访问宿主机特定资源。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>工作原理&lt;/strong>：将容器路径直接映射到宿主机上已存在的绝对路径。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>路径透明&lt;/strong>：可直接在宿主机通过 SSH/FTP 访问和编辑文件。&lt;/li>
&lt;li>&lt;strong>实时同步&lt;/strong>：宿主机文件修改，容器内立即生效（适合开发）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>权限陷阱&lt;/strong>：需手动确保宿主机文件夹权限与容器用户匹配。&lt;/li>
&lt;li>&lt;strong>路径依赖&lt;/strong>：迁移服务器时需重建相同的目录结构。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>前置准备&lt;/strong>（SSH 登录服务器）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir -p /home/dokploy/my-app/logs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod &lt;span class="m">777&lt;/span> /home/dokploy/my-app/logs &lt;span class="c1"># 注意权限设置&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>Dokploy 配置步骤&lt;/strong>：
&lt;ol>
&lt;li>进入应用 &lt;strong>Advanced&lt;/strong> -&amp;gt; &lt;strong>Volumes&lt;/strong>。&lt;/li>
&lt;li>点击 &lt;strong>Add Volume&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Mount Type&lt;/strong>: 选择 &lt;code>Bind&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Host Path&lt;/strong>: 填写宿主机&lt;strong>绝对路径&lt;/strong>（如 &lt;code>/home/dokploy/my-app/logs&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>Mount Path&lt;/strong>: 填写容器内路径（如 &lt;code>/app/logs&lt;/code>）。&lt;/li>
&lt;li>保存并 &lt;strong>Deploy&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>⚖️ 第三部分：环境变量 (Env) 的两种配置方式及优先级&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中，您有两种方式向容器传递配置信息，理解它们的区别至关重要。&lt;/p>
&lt;p>&lt;strong>1. 两种方式对比&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">特性&lt;/th>
&lt;th style="text-align: left">&lt;strong>控制面板 Env 设置&lt;/strong>&lt;/th>
&lt;th style="text-align: left">&lt;strong>挂载 .env 文件 (File Mount)&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>操作位置&lt;/strong>&lt;/td>
&lt;td style="text-align: left">应用菜单 -&amp;gt; &lt;strong>Environment&lt;/strong> 标签页&lt;/td>
&lt;td style="text-align: left">应用菜单 -&amp;gt; &lt;strong>Advanced&lt;/strong> -&amp;gt; &lt;strong>Volumes&lt;/strong> -&amp;gt; &lt;strong>File Mount&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>底层原理&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Docker 启动参数 &lt;code>-e KEY=VALUE&lt;/code>&lt;/td>
&lt;td style="text-align: left">文件系统挂载 &lt;code>-v host_file:/container/.env&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>生效机制&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Docker 守护进程直接注入进程环境空间&lt;/td>
&lt;td style="text-align: left">&lt;strong>应用程序自己读取文件&lt;/strong>解析加载&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>适用框架&lt;/strong>&lt;/td>
&lt;td style="text-align: left">所有支持环境变量的应用&lt;/td>
&lt;td style="text-align: left">支持读取 &lt;code>.env&lt;/code> 文件的框架 (Node.js, Python, Laravel 等)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>管理体验&lt;/strong>&lt;/td>
&lt;td style="text-align: left">适合少量、分散的变量&lt;/td>
&lt;td style="text-align: left">适合大量、成组的配置，与本地开发一致&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>2. 优先级冲突：如果两个地方都设置了同一个变量，谁生效？&lt;/strong>&lt;/p>
&lt;p>&lt;strong>答案取决于您的应用程序代码逻辑，而非 Docker。&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>情况 A：现代框架 (Node.js &lt;code>dotenv&lt;/code>, Python &lt;code>python-dotenv&lt;/code>, Laravel)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>通常加载顺序：先读 &lt;code>.env&lt;/code> 文件 -&amp;gt; 再读系统环境变量。&lt;/li>
&lt;li>&lt;strong>常见行为&lt;/strong>：系统环境变量（控制面板设置）&lt;strong>覆盖&lt;/strong> &lt;code>.env&lt;/code> 文件中的值。&lt;/li>
&lt;li>&lt;strong>部分行为&lt;/strong>：某些配置下，&lt;code>.env&lt;/code> 文件一旦加载即锁定，环境变量无法覆盖。&lt;/li>
&lt;li>&lt;em>风险&lt;/em>：混用会导致配置行为不可预测，难以排查。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>情况 B：传统应用 (Nginx, Redis, Go/C 编译程序)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>这些程序通常&lt;strong>不会自动读取 &lt;code>.env&lt;/code> 文件&lt;/strong>。&lt;/li>
&lt;li>它们只认&lt;strong>系统环境变量&lt;/strong>（控制面板设置）或特定的配置文件（如 &lt;code>nginx.conf&lt;/code>）。&lt;/li>
&lt;li>&lt;em>结论&lt;/em>：对于这类应用，挂载 &lt;code>.env&lt;/code> 文件通常&lt;strong>无效&lt;/strong>，必须使用控制面板 Env 或直接挂载对应的 conf 文件。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 💡 最佳实践建议&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>二选一原则&lt;/strong>：针对同一组配置，&lt;strong>不要混用&lt;/strong>两种方式。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案 A（推荐用于 Web 应用）&lt;/strong>：完全使用 &lt;strong>File Mount&lt;/strong> 挂载完整的 &lt;code>.env&lt;/code> 文件。
&lt;ul>
&lt;li>&lt;em>理由&lt;/em>：保证本地开发环境与生产环境配置文件完全一致，复制粘贴即可，减少人为遗漏。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>方案 B（推荐用于基础服务/简单变量）&lt;/strong>：完全使用 &lt;strong>控制面板 Env 设置&lt;/strong>。
&lt;ul>
&lt;li>&lt;em>理由&lt;/em>：界面清晰，管理方便，适合变量较少的情况。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>明确应用行为&lt;/strong>：查阅应用文档，确认它是优先读取文件还是优先读取环境变量。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>敏感信息&lt;/strong>：如果极度敏感，考虑使用 &lt;strong>Bind Mount&lt;/strong> 挂载服务器上权限严格控制的独立文件，避免内容出现在 Dokploy 数据库备份中。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>⚠️ 第四部分：常见陷阱与故障排查&lt;/strong>&lt;/p>
&lt;p>&lt;strong>1. 权限错误 (Permission Denied)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>现象&lt;/strong>：容器启动失败，日志提示无法写入文件或读取配置。&lt;/li>
&lt;li>&lt;strong>原因&lt;/strong>：多见于 &lt;strong>Bind Mount&lt;/strong>。容器内用户 UID 与宿主机文件夹所有者不一致。&lt;/li>
&lt;li>&lt;strong>解决&lt;/strong>：
&lt;ul>
&lt;li>优先改用 &lt;strong>Volume&lt;/strong>。&lt;/li>
&lt;li>若必须用 Bind，在服务器执行 &lt;code>chown -R &amp;lt;UID&amp;gt;:&amp;lt;GID&amp;gt; /host/path&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 路径错误&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>File Mount&lt;/strong>：&lt;code>File Path&lt;/code> 必须是&lt;strong>完整路径 + 文件名&lt;/strong>（例：&lt;code>/app/.env&lt;/code>），不能只是目录。&lt;/li>
&lt;li>&lt;strong>Bind Mount&lt;/strong>：&lt;code>Host Path&lt;/code> 必须是&lt;strong>绝对路径&lt;/strong>，不能用 &lt;code>~&lt;/code> 或相对路径。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 修改未生效&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>File Mount / Env Panel&lt;/strong>：修改后必须点击 &lt;strong>Deploy&lt;/strong> 重新创建/启动容器。&lt;/li>
&lt;li>&lt;strong>Bind Mount&lt;/strong>：文件修改通常即时生效，但&lt;strong>应用程序可能需要重启&lt;/strong>才能重新加载配置（除非支持热重载）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>4. 数据迁移&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Volume&lt;/strong>：需使用 Docker 命令或 Dokploy 备份功能迁移卷数据。&lt;/li>
&lt;li>&lt;strong>Bind Mount&lt;/strong>：直接打包宿主机对应文件夹 (&lt;code>tar&lt;/code>) 传输到新服务器即可。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>🏁 总结流程图&lt;/strong>&lt;/p>
&lt;div class="mermaid">
graph TD
Start[开始配置存储] --&amp;gt; Q1{数据类型？}
Q1 -- 数据库/持久化数据 --&amp;gt; Vol[使用 Volume&amp;lt;br&amp;gt;安全/自动管理]
Q1 -- 单个配置文件 (.env) --&amp;gt; File[使用 File Mount&amp;lt;br&amp;gt;网页编辑/最便捷]
Q1 -- 现有目录/代码热更 --&amp;gt; Bind[使用 Bind Mount&amp;lt;br&amp;gt;需 SSH 预建目录]
File --&amp;gt; EnvQ{是否需要设置环境变量？}
EnvQ -- 是 --&amp;gt; Choice{选择策略}
Choice -- 推荐：保持一致性 --&amp;gt; UseFile[完全使用 File Mount 挂载 .env]
Choice -- 备选：简单变量 --&amp;gt; UsePanel[完全使用 控制面板 Env 设置]
Choice -- ❌ 禁止 --&amp;gt; Mix[&amp;#34;混用两者 (易导致冲突)&amp;#34;]
Vol --&amp;gt; Deploy[点击 Deploy 部署]
Bind --&amp;gt; Deploy
UseFile --&amp;gt; Deploy
UsePanel --&amp;gt; Deploy
Deploy --&amp;gt; Done[完成]
&lt;/div>
&lt;p>遵循本指南，您将能够高效、安全地管理 Dokploy 中的应用数据与配置。如有具体报错，请提供日志以便进一步分析。&lt;/p>
&lt;h2 id="dokploy-自动化部署踩坑">Dokploy 自动化部署踩坑
&lt;/h2>&lt;p>在使用 Dokploy 配合 CI/CD（如 GitHub Actions）进行自动化部署时，很多人会踩到两个致命的坑：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>时序错乱（抢跑）&lt;/strong>：刚 git push 完代码，CI/CD 还没把镜像打包推送完，Dokploy 就已经提前开始拉取部署了，导致部署失败或拉到旧镜像。&lt;/li>
&lt;li>&lt;strong>镜像缓存（死不更新）&lt;/strong>：等镜像真正推送完，去触发 Dokploy Webhook 时，由于镜像标签都是 latest，Dokploy 直接用了本地缓存，怎么部署都是旧版本！&lt;/li>
&lt;/ul>
&lt;p>今天，我们就用 &lt;strong>“Raw 模式分离” + “API 改写镜像 SHA”&lt;/strong> 的终极方案，彻底打通这条全自动流水线！&lt;/p>
&lt;p>&lt;strong>踩坑一：为什么一 Push 代码 Dokploy 就抢跑？&lt;/strong>&lt;/p>
&lt;p>根本原因：如果你在 Dokploy 中选择了 Git 作为代码源，它的触发器只有 On Push，一旦侦测到代码提交它就会立刻执行。&lt;/p>
&lt;p>破局思路：既然镜像已经由 CI/CD 负责打包，Dokploy 就只需要做一个“纯粹的执行器”。&lt;/p>
&lt;p>👉 &lt;strong>解决方法：&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 的应用设置中，不要选 Git/GitHub。&lt;/p>
&lt;ul>
&lt;li>如果是单容器，数据源选 &lt;strong>Docker&lt;/strong>。&lt;/li>
&lt;li>如果是编排部署，数据源选 &lt;strong>Raw 模式&lt;/strong>（直接粘贴你的 docker-compose.yml）。&lt;/li>
&lt;/ul>
&lt;p>这样 Dokploy 就彻底脱离了 Git 仓库的束缚，只会安静等待指令。&lt;/p>
&lt;p>&lt;strong>踩坑二：触发更新时，如何彻底避免 latest 镜像缓存？&lt;/strong>&lt;/p>
&lt;p>很多教程只教你推完镜像后 curl 一下 Webhook，但这不够。为了实现绝对的不可变部署（Immutable Deployment），最佳实践是在 CI/CD 构建完镜像后，提取该镜像唯一的 SHA 摘要（Digest），利用 Dokploy 的 API 动态改写配置，然后再触发部署。&lt;/p>
&lt;p>&lt;strong>准备工作：获取 API 密钥与 URL&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>生成 API Key&lt;/strong>：登录 Dokploy 面板，点击右上角头像 -&amp;gt; Profile -&amp;gt; 找到 API/CLI 区域，生成一串 API Key。&lt;/li>
&lt;li>&lt;strong>确认 API URL&lt;/strong>：即你的 Dokploy 访问地址（例如 &lt;code>https://dokploy.your-domain.com&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>获取应用 ID&lt;/strong>：在 Dokploy 中点开你的应用，看浏览器地址栏，通常能找到你的 &lt;code>applicationId&lt;/code> 或 &lt;code>composeId&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>终极 CI/CD 流水线实战（以 GitHub Actions 为例）&lt;/strong>&lt;/p>
&lt;p>我们需要在工作流中完成三个步骤：构建推送 -&amp;gt; 改写 Dokploy 配置里的 SHA -&amp;gt; 触发部署。&lt;/p>
&lt;p>在你的 &lt;code>.github/workflows/deploy.yml&lt;/code> 最后加上这段核心代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 前置步骤：正常拉取代码并登录镜像库...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">构建并推送 Docker 镜像，提取 SHA&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build-image&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 1. 正常打包并推送最新镜像
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> docker build -t your-namespace/your-image:latest .
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> docker push your-namespace/your-image:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 2. 核心操作：获取刚刚推送在云端生成的唯一 SHA256 摘要&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">IMAGE_SHA=$(docker inspect --format=&amp;#39;{{index .RepoDigests 0}}&amp;#39; your-namespace/your-image:latest)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;IMAGE_SHA=$IMAGE_SHA&amp;#34; &amp;gt;&amp;gt; $GITHUB_ENV&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">echo &amp;#34;最新镜像摘要为: $IMAGE_SHA&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">调用 Dokploy API 改写镜像 SHA&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 3. 将带有 SHA 的完整镜像地址更新到 Dokploy 的配置中
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> curl -X POST &amp;#34;https://dokploy.your-domain.com/api/application.update&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -H &amp;#34;Authorization: Bearer ${{ secrets.DOKPLOY_API_KEY }}&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -H &amp;#34;Content-Type: application/json&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -d &amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;applicationId&amp;#34;: &amp;#34;${{ secrets.DOKPLOY_APP_ID }}&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;dockerImage&amp;#34;: &amp;#34;${{ env.IMAGE_SHA }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> }&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">调用 Dokploy API 触发真实部署&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> # 4. 配置修改完毕，正式下达部署指令
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> curl -X POST &amp;#34;https://dokploy.your-domain.com/api/application.deploy&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -H &amp;#34;Authorization: Bearer ${{ secrets.DOKPLOY_API_KEY }}&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -H &amp;#34;Content-Type: application/json&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -d &amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;applicationId&amp;#34;: &amp;#34;${{ secrets.DOKPLOY_APP_ID }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> }&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(💡 提示：记得在 GitHub 的 Secrets 中配置好 &lt;code>DOKPLOY_API_KEY&lt;/code> 和 &lt;code>DOKPLOY_APP_ID&lt;/code>)&lt;/p>
&lt;p>&lt;strong>💡 进阶技巧：如果你用的是 Raw 模式 (Docker Compose) 怎么办？&lt;/strong>&lt;/p>
&lt;p>在 Raw 模式下由于是直接写 YAML 文件，API 更新全文有些繁琐。最佳实践是结合环境变量：&lt;/p>
&lt;p>在 Dokploy 的 Raw 配置框中这样写：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">web&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">your-namespace/your-image@${IMAGE_SHA}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 引用环境变量&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 GitHub Actions 中，调用 Dokploy 的环境变量更新 API（&lt;code>/api/application.env.set&lt;/code> 或相关路由），把新的 SHA 刷进环境变量里。最后再触发 Deploy。&lt;/p>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;p>通过上述改造，我们完美分离了“代码构建”与“容器部署”的职责：&lt;/p>
&lt;ul>
&lt;li>CI/CD 专职负责构建镜像，并产出带有唯一指纹的 SHA 摘要。&lt;/li>
&lt;li>Dokploy 作为纯粹的容器执行引擎，通过 API 接收最新的 SHA 彻底绕过本地缓存。&lt;/li>
&lt;/ul>
&lt;p>时序绝对正确，更新绝对精准，你的全自动 CI/CD 部署流水线现在坚不可摧了！🎉&lt;/p>
&lt;h2 id="解决-traefik-处理大文件上传时的-502-错误-io-timeout">解决 Traefik 处理大文件上传时的 502 错误 (i/o timeout)
&lt;/h2>&lt;p>在使用 Traefik 作为反向代理时，如果遇到大文件上传导致 &lt;code>502 Bad Gateway&lt;/code> 错误，且日志中出现 &lt;code>i/o timeout&lt;/code> 相关信息，通常是因为 Traefik 的默认超时设置过短。&lt;/p>
&lt;p>以下是具体的排查思路与解决方案。&lt;/p>
&lt;p>&lt;strong>1. 问题现象与日志分析&lt;/strong>&lt;/p>
&lt;p>当上传较大文件时，请求在到达后端之前被 Traefik 截断，返回 502 错误。查看 Traefik 容器日志，关键错误信息如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vulcand/oxy/buffer: error when reading request body, err: i/o timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">entryPointName=websecure middlewareName=transmaster-staging-backend-buffering@docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>原因定位：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>错误并非由 &lt;code>maxRequestBodyBytes&lt;/code>（请求体大小限制）引起。&lt;/li>
&lt;li>根本原因是 Traefik 的 &lt;code>buffering&lt;/code> 中间件在等待客户端上传数据时发生了 &lt;strong>I/O 超时 (i/o timeout)&lt;/strong>。默认的读取超时时间对于大文件上传来说太短了。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 解决方案&lt;/strong>&lt;/p>
&lt;p>需要修改 &lt;code>traefik.yml&lt;/code> 配置文件，在对应的 &lt;code>entryPoints&lt;/code>（入口点）下增加 &lt;code>respondingTimeouts&lt;/code> 配置，延长读取和写入的超时时间。&lt;/p>
&lt;p>&lt;strong>修改 &lt;code>traefik.yml&lt;/code>&lt;/strong>&lt;/p>
&lt;p>找到你的 &lt;code>traefik.yml&lt;/code> 文件（通常位于 &lt;code>/etc/dokploy/traefik/traefik.yml&lt;/code> 或类似路径），在 &lt;code>entryPoints&lt;/code> 部分添加或修改 &lt;code>transport&lt;/code> 配置。&lt;/p>
&lt;p>&lt;strong>配置示例：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">entryPoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">web&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">address&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">80&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">transport&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">respondingTimeouts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">readTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">900s &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 读取请求体超时时间（针对大文件上传，建议设大一点，如 15 分钟）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">writeTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">900s &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 写入响应超时时间&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">idleTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">180s &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 空闲连接超时时间&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">websecure&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">address&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">443&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">transport&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">respondingTimeouts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">readTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">900s&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">writeTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">900s&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">idleTimeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">180s&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tls&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">certResolver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">letsencrypt&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>参数说明：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>readTimeout&lt;/code>: 最关键参数。决定 Traefik 等待客户端把请求体传完的时间。如果上传文件较大或网速较慢，需适当调大（例如 900s）。&lt;/li>
&lt;li>&lt;code>writeTimeout&lt;/code>: 决定 Traefik 等待后端服务返回响应的时间。&lt;/li>
&lt;li>&lt;code>idleTimeout&lt;/code>: 保持连接空闲的超时时间，通常不需要太大。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 应用配置&lt;/strong>&lt;/p>
&lt;p>修改保存配置文件后，需要重启 Traefik 容器以使配置生效。&lt;/p>
&lt;p>&lt;strong>执行重启命令：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker restart dokploy-traefik
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// 或者根据你的容器名称调整，例如：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// docker restart &amp;lt;traefik_container_name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>4. 验证结果&lt;/strong>&lt;/p>
&lt;p>重启完成后，再次尝试上传之前失败的大文件。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>观察日志：&lt;/strong> 确认不再出现 &lt;code>i/o timeout&lt;/code> 错误。&lt;/li>
&lt;li>&lt;strong>业务测试：&lt;/strong> 文件上传成功，不再返回 502 错误。&lt;/li>
&lt;/ul>
&lt;p>通过调整 &lt;code>respondingTimeouts&lt;/code>，即可解决因网络波动或文件过大导致的 Traefik 上传超时问题。&lt;/p>
&lt;h2 id="部署相同项目的但是不同的环境staging和production发现冲突-----trakfik路由重名冲突问题">部署相同项目的但是不同的环境（staging和production）发现冲突 &amp;mdash; trakfik路由重名冲突问题
&lt;/h2>&lt;p>在 Dokploy 中，路由重名问题（Route Name Collision / Duplicate Route）是一个在部署多个应用或同一应用的多个实例时经常遇到的网络路由冲突问题。&lt;/p>
&lt;p>要理解这个问题，首先需要了解 Dokploy 的底层网络架构：Dokploy 依赖 Traefik 作为其反向代理和负载均衡器。Traefik 通过读取 Docker 容器上的标签（Labels）或动态配置文件，来决定如何将外部的 HTTP/HTTPS 请求转发到正确的内部容器。&lt;/p>
&lt;p>以下是关于 Dokploy 中路由重名问题的详细解释：&lt;/p>
&lt;p>&lt;strong>什么是“路由重名”？&lt;/strong>&lt;/p>
&lt;p>在 Traefik 的配置体系中，每个路由规则都需要一个唯一的路由名称（Router Name）。例如，在 Docker Compose 的 labels 中，你可能会看到这样的配置：&lt;code>traefik.http.routers.my-app-router.rule=Host('example.com')&lt;/code>。这里的 &lt;code>my-app-router&lt;/code> 就是路由名称。如果在 Dokploy 中，有两个不同的服务或应用使用了完全相同的路由名称，Traefik 就会发生冲突。&lt;/p>
&lt;p>&lt;strong>常见的触发场景&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>部署同一模板的多个实例（多租户场景）：&lt;/strong> 假设你使用 Docker Compose 模板在 Dokploy 上部署了一个开源系统（如 ERPNext、WordPress 或你自己的项目）。当你想要为另一个客户部署第二套相同的系统时，如果你直接复制了 Compose 文件而没有修改里面的 Traefik 标签，两个容器都会声明自己叫 &lt;code>my-app-router&lt;/code>。&lt;/li>
&lt;li>&lt;strong>误绑重复的域名：&lt;/strong> 团队成员在 Dokploy 的控制面板中，不小心为两个不同的应用程序绑定了相同的域名（在 Dokploy 的 GitHub 仓库中，Issue #3036 专门提到了缺少重复域名校验导致的 Traefik 路由崩溃问题）。&lt;/li>
&lt;li>&lt;strong>服务从其他平台迁移时的硬编码：&lt;/strong> 直接复制了原本在 Coolify 或纯 Docker 环境下的 Compose 文件，导致不同项目复用了默认的通用路由名称（如 &lt;code>web-router&lt;/code> 或 &lt;code>frontend-router&lt;/code>）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>路由重名会导致的后果&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>流量串门 / 覆盖失效：&lt;/strong> Traefik 无法区分这两个服务。通常情况下，后启动的容器可能会覆盖先启动的容器的路由规则，导致访问应用 A 的域名却打开了应用 B 的页面。&lt;/li>
&lt;li>&lt;strong>服务不可用（504 或 404 错误）：&lt;/strong> Traefik 的动态配置加载可能会因为命名冲突而报错，导致该路由规则被整体丢弃，最终访问域名时出现 504 Gateway Timeout 或 404 Not Found。&lt;/li>
&lt;li>&lt;strong>部署状态假死：&lt;/strong> Dokploy 面板显示应用已成功部署且正在运行，但外部始终无法通过域名访问。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>如何解决和避免？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方法一：确保路由名称的唯一性（最核心）&lt;/strong>
如果你通过 Templates 或 Docker Compose 部署应用，必须确保 labels 里的 router 和 service 名称是全局唯一的。
&lt;ul>
&lt;li>错误写法（写死名称）：&lt;code>- &amp;quot;traefik.http.routers.web-router.rule=...&amp;quot;&lt;/code>&lt;/li>
&lt;li>正确写法（添加唯一标识/租户 ID）：&lt;code>- &amp;quot;traefik.http.routers.app1-web-router.rule=...&amp;quot;&lt;/code> 或 &lt;code>- &amp;quot;traefik.http.routers.app2-web-router.rule=...&amp;quot;&lt;/code>&lt;/li>
&lt;li>或者使用环境变量：&lt;code>- &amp;quot;traefik.http.routers.${TENANT_ID}-router.rule=...&amp;quot;&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>方法二：明确指定 Traefik 网络&lt;/strong>
当出现复杂的网络配置时（例如应用同时加入了多个 Docker Network），Traefik 会不知道该把流量发往哪个网络，从而引发 504 错误。在标签中明确指定 Dokploy 的默认网络可以防范此类路由异常：&lt;code>- &amp;quot;traefik.docker.network=dokploy-network&amp;quot;&lt;/code>。&lt;/li>
&lt;li>&lt;strong>方法三：使用 Dokploy 原生 Application 部署&lt;/strong>
如果你使用的是 Dokploy 的 Applications 功能（基于 Nixpacks, Dockerfile 或 Buildpacks 部署），Dokploy 底层会通过修改 Traefik 的文件系统（File Provider）来自动为你生成带有唯一哈希值的路由名称。这种模式下，只要你不绑定完全重复的域名，通常不会触发路由重名问题。&lt;/li>
&lt;/ul>
&lt;p>总结：Dokploy 的路由重名本质上是 Traefik 代理引擎的命名空间冲突。在编写 Compose 文件或打标签时，养成为所有 Traefik 相关的 router、service、middlewares 加上项目名前缀的习惯，就能完美避开这个问题。&lt;/p>
&lt;p>&lt;strong>参考资料&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>cherryservers.com&lt;/li>
&lt;li>dokploy.com&lt;/li>
&lt;li>frappe.io&lt;/li>
&lt;li>github.com&lt;/li>
&lt;li>lobehub.com&lt;/li>
&lt;li>Google Search Suggestions: &amp;ldquo;dokploy&amp;rdquo; router name collision, &amp;ldquo;dokploy&amp;rdquo; route name, &amp;ldquo;dokploy&amp;rdquo; 路由冲突，&amp;ldquo;dokploy&amp;rdquo; duplicate route&lt;/li>
&lt;/ul>
&lt;h2 id="dokploy-如果因为磁盘爆了而崩溃怎么解决">dokploy 如果因为磁盘爆了而崩溃，怎么解决
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 确认磁盘状态&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">df -h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清除陈旧的系统日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo journalctl --vacuum-time&lt;span class="o">=&lt;/span>1d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo journalctl --vacuum-size&lt;span class="o">=&lt;/span>100M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理未使用的 Docker 镜像和停止的容器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system prune -a -f
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="配置s3-destinations">配置S3 Destinations
&lt;/h2>&lt;ul>
&lt;li>以b2_buckets 为例&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>将 Backblaze B2 配置到 Dokploy 的 S3 存储指南&lt;/strong>&lt;/p>
&lt;p>将 Backblaze B2 配置到 Dokploy 的 S3 存储中主要分为两步：首先在 Backblaze 获取凭据，然后在 Dokploy 仪表板中完成设置。&lt;/p>
&lt;p>&lt;strong>第一步：在 Backblaze B2 中获取信息&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>创建存储桶 (Bucket)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>登录 Backblaze，进入 B2 Cloud Storage &amp;gt; Buckets。&lt;/li>
&lt;li>创建一个新存储桶（例如命名为 &lt;code>dokploy-backups&lt;/code>）。&lt;/li>
&lt;li>注意：在存储桶列表中找到刚才创建的桶，复制其显示的 S3 Endpoint（例如 &lt;code>s3.us-west-002.backblazeb2.com&lt;/code>）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>创建应用程序密钥 (Application Keys)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>进入 App Keys 页面。&lt;/li>
&lt;li>点击 Add a New Application Key。&lt;/li>
&lt;li>设置名称，并确保权限设置为 Read and Write。&lt;/li>
&lt;li>创建后，你会得到：
&lt;ul>
&lt;li>&lt;code>keyID&lt;/code>（即 Dokploy 中的 Access Key）&lt;/li>
&lt;li>&lt;code>applicationKey&lt;/code>（即 Dokploy 中的 Secret Key）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>注意：&lt;code>applicationKey&lt;/code> 仅显示一次，请务必保存。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>第二步：在 Dokploy 中进行配置&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>进入 Dokploy 面板，点击左侧菜单的 Settings (设置)。&lt;/li>
&lt;li>找到 S3 Destinations 选项卡，点击 Add S3 Destination。&lt;/li>
&lt;li>根据以下对应关系填写表单：&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Dokploy 字段&lt;/th>
&lt;th style="text-align: left">对应 Backblaze 的信息&lt;/th>
&lt;th style="text-align: left">示例值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">Name&lt;/td>
&lt;td style="text-align: left">自定义名称&lt;/td>
&lt;td style="text-align: left">Backblaze-B2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Provider&lt;/td>
&lt;td style="text-align: left">&lt;/td>
&lt;td style="text-align: left">选择 Amazon Web Services （AWS）S3 ｜&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Endpoint&lt;/td>
&lt;td style="text-align: left">存储桶页面的 S3 Endpoint (需带 https://)&lt;/td>
&lt;td style="text-align: left">&lt;code>https://s3.us-west-002.backblazeb2.com&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Region&lt;/td>
&lt;td style="text-align: left">Endpoint 中的地区部分&lt;/td>
&lt;td style="text-align: left">&lt;code>us-west-002&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Bucket&lt;/td>
&lt;td style="text-align: left">你创建的存储桶名称&lt;/td>
&lt;td style="text-align: left">&lt;code>dokploy-backups&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Access Key&lt;/td>
&lt;td style="text-align: left">刚才生成的 keyID&lt;/td>
&lt;td style="text-align: left">&lt;code>002123456789...&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Secret Key&lt;/td>
&lt;td style="text-align: left">刚才生成的 applicationKey&lt;/td>
&lt;td style="text-align: left">&lt;code>K001abcd...&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>&lt;strong>保存并测试&lt;/strong>：填写完成后，点击 Test Connection。如果显示成功，则说明配置正确。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>第三步：为数据库或应用开启备份&lt;/strong>&lt;/p>
&lt;p>配置好 S3 目的地后，你还需要将其应用到具体的备份任务中：&lt;/p>
&lt;ol>
&lt;li>进入你想备份的 Database (数据库) 或 Service。&lt;/li>
&lt;li>点击 Backups 选项卡。&lt;/li>
&lt;li>在 Select Destination 下拉菜单中选择刚才创建的 Backblaze-B2。&lt;/li>
&lt;li>设置 Cron Schedule（例如 &lt;code>0 0 * * *&lt;/code> 表示每天午夜备份）并启用。&lt;/li>
&lt;/ol>
&lt;p>** 第四步：恢复备份**&lt;/p>
&lt;p>总结恢复步骤清单：&lt;/p>
&lt;p>本地已经部署镜像并启动容器，对应需要恢复的卷名是 9cut8x_postgres_data。&lt;/p>
&lt;ol>
&lt;li>命令行查卷(这个卷名换成实际的)：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="nv">volume&lt;/span>&lt;span class="o">=&lt;/span>9cut8x_postgres_data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>清理现场： docker rm -f &amp;lt;查到的容器ID&amp;gt;&lt;/li>
&lt;li>彻底删除旧卷： docker volume rm 9cut8x_postgres_data&lt;/li>
&lt;li>执行恢复： 在 Dokploy 的 Volume Backups 页面填入 9cut8x_postgres_data 并点击 Restore。&lt;/li>
&lt;li>验证： 恢复完成后，执行 docker volume ls 确保该卷已重新创建。&lt;/li>
&lt;li>部署应用： 回到 Dokploy 对应的服务界面，点击 &amp;ldquo;Deploy&amp;rdquo;（这会根据你的 docker-compose.yml 重新挂载刚才恢复好的卷）。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>常见问题排查&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>权限错误&lt;/strong>：确保创建 Key 时勾选了对应存储桶的 &amp;ldquo;Read and Write&amp;rdquo; 权限。&lt;/li>
&lt;li>&lt;strong>Endpoint 格式&lt;/strong>：Dokploy 通常需要完整的 URL 格式，请确保包含 &lt;code>https://&lt;/code>。&lt;/li>
&lt;li>&lt;strong>地区 (Region)&lt;/strong>：Backblaze 的地区代码通常就在 Endpoint URL 中（如 &lt;code>us-west-002&lt;/code>），必须准确填写。&lt;/li>
&lt;/ul>
&lt;h2 id="dokploy-swarm-子节点联通性测试指南">Dokploy Swarm 子节点联通性测试指南
&lt;/h2>&lt;p>这是一份专为 Dokploy 用户准备的 &lt;strong>Docker Swarm 子节点（Worker Node）联通性测试教程&lt;/strong>。在搭建好 Dokploy 多节点集群后，最关键的一步是验证 &lt;strong>管理节点（Manager）&lt;/strong> 是否能通过 &lt;strong>Overlay 网络&lt;/strong> 正常调度并连接到 &lt;strong>子节点（Worker）&lt;/strong> 上的容器。本教程将通过部署一个跨节点的测试应用，验证网络数据平面（Data Plane）是否畅通。&lt;/p>
&lt;p>&lt;strong>一、核心概念：为什么不能用“默认”网络？&lt;/strong>&lt;/p>
&lt;p>很多教程提到“不要使用默认网络”，这通常指两点：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>禁止使用 &lt;code>bridge&lt;/code> 网络&lt;/strong>：这是单机网络。如果你不指定网络，Docker 默认使用 &lt;code>bridge&lt;/code>，跨服务器的容器将无法互相访问。&lt;/li>
&lt;li>&lt;strong>必须使用 &lt;code>Overlay&lt;/code> 网络&lt;/strong>：Swarm 模式下，只有 Overlay 网络能建立跨物理机的虚拟隧道。&lt;/li>
&lt;li>&lt;strong>Dokploy 的做法&lt;/strong>：Dokploy 已经预设了一个名为 &lt;code>dokploy-network&lt;/code> 的 Overlay 网络。&lt;strong>我们的应用必须挂载到这个网络上&lt;/strong>，才能被 Dokploy 的 Traefik 网关识别并实现跨节点转发。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>二、准备工作&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>确保在 Dokploy 的 &lt;strong>Servers&lt;/strong> 菜单中，子节点显示为 &lt;code>Ready&lt;/code>。&lt;/li>
&lt;li>（可选）为子节点添加标签：
&lt;ul>
&lt;li>在管理节点终端执行：&lt;code>docker node update --label-add type=worker &amp;lt;子节点主机名&amp;gt;&lt;/code>&lt;/li>
&lt;li>&lt;em>这能确保我们的测试应用准确落在子节点上。&lt;/em>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>三、编写部署文件 (Compose)&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中新建一个 &lt;strong>Compose&lt;/strong>，选择 &lt;strong>Stack&lt;/strong> 模式，填入以下配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 服务 A：强制运行在管理节点 (Manager)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">test-manager&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nginxdemos/hello:plain-text&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">replicas&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">placement&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">constraints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">node.role == manager&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 服务 B：强制运行在子节点 (Worker)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">test-worker&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nginxdemos/hello:plain-text&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">dokploy-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">replicas&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">placement&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">constraints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 如果没打标签，可用 - node.role == worker&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">node.role == worker &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 使用 Dokploy 预设的 Overlay 网络&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dokploy-network&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>注意：上述 YAML 中的注释行已保留，但请确保在实际编辑时不要误删关键配置。&lt;/em>&lt;/p>
&lt;p>&lt;strong>四、部署步骤&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>创建 Stack&lt;/strong>：在 Dokploy 项目中点击 &lt;code>Create Service&lt;/code> -&amp;gt; &lt;code>Compose&lt;/code>。&lt;/li>
&lt;li>&lt;strong>配置&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>Name&lt;/strong>: &lt;code>swarm-test&lt;/code>&lt;/li>
&lt;li>&lt;strong>Source&lt;/strong>: 直接粘贴上述 YAML 代码。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>部署&lt;/strong>：点击 &lt;strong>Deploy&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>确认位置&lt;/strong>：
&lt;ul>
&lt;li>部署完成后，在 Dokploy 的容器列表里查看。&lt;/li>
&lt;li>确认 &lt;code>test-manager&lt;/code> 运行在管理节点 IP 上。&lt;/li>
&lt;li>确认 &lt;code>test-worker&lt;/code> 运行在子节点 IP 上。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>五、联通性验证（手动测试）&lt;/strong>&lt;/p>
&lt;p>即使两个容器都显示 &amp;ldquo;Running&amp;rdquo;，也不代表网络是通的。我们需要执行以下两项压力测试：&lt;/p>
&lt;p>&lt;strong>1. 容器间内网互访（验证 Overlay 网络）&lt;/strong>&lt;/p>
&lt;p>进入管理节点上的 &lt;code>test-manager&lt;/code> 容器，尝试访问子节点上的服务名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. 在管理节点终端找到容器 ID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps &lt;span class="p">|&lt;/span> grep test-manager
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. 进入容器内部&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it &amp;lt;容器 ID&amp;gt; sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. 通过服务名访问子节点的容器（Swarm 会自动做 VIP 负载均衡）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://test-worker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>成功标志&lt;/strong>：如果返回 &lt;code>Server address: 10.0.x.x&lt;/code> 且该 IP 是子节点的内部 IP，说明 &lt;strong>Overlay 网络跨机通信正常&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 外部网关转发（验证 Traefik 联通）&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中为 &lt;code>test-worker&lt;/code> 服务配置一个域名（Domain）：&lt;/p>
&lt;ol>
&lt;li>在 &lt;code>test-worker&lt;/code> 的域名设置里绑定一个测试域名。&lt;/li>
&lt;li>通过浏览器访问该域名。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>原理&lt;/strong>：流量会先到达 &lt;strong>管理节点的 Traefik&lt;/strong> -&amp;gt; 通过 &lt;strong>dokploy-network&lt;/strong> -&amp;gt; 转发到 &lt;strong>子节点的容器&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>成功标志&lt;/strong>：浏览器正常显示网页。如果出现 &lt;code>502 Bad Gateway&lt;/code>，说明管理节点和子节点之间的 &lt;strong>4789/UDP&lt;/strong> 端口被防火墙拦截了。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>六、故障排查&lt;/strong>&lt;/p>
&lt;p>如果测试不通，请检查各节点间防火墙是否放行了以下 Swarm 必需端口：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>TCP 2377&lt;/strong>：集群管理通信。&lt;/li>
&lt;li>&lt;strong>TCP/UDP 7946&lt;/strong>：节点发现与健康检查。&lt;/li>
&lt;li>&lt;strong>UDP 4789&lt;/strong>：&lt;strong>关键！&lt;/strong> 数据平面 Overlay 网络（UDP 封装）。如果该端口不通，容器能启动但无法互相 ping 通。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>检查指令（在任一节点查看网络详情）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker network inspect dokploy-network
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>确认子节点（Worker）的容器 IP 是否出现在 &lt;code>Containers&lt;/code> 列表中。&lt;/p>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;p>在 Dokploy 中测试子节点，&lt;strong>核心就是利用 &lt;code>dokploy-network&lt;/code> (External Overlay)&lt;/strong>。只要能通过管理节点的容器 &lt;code>curl&lt;/code> 通子节点的容器名，你的集群网络就是完美的。&lt;/p>
&lt;h2 id="dokploy--docker-swarm-实战为什么扩容后看不见容器多节点部署避坑指南">Dokploy + Docker Swarm 实战：为什么扩容后看不见容器？(多节点部署避坑指南)
&lt;/h2>&lt;p>&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-5.png"
width="1912"
height="954"
srcset="https://www.zata.cc/p/dokploy/images/index/image-5_hu7863231414691180608.png 480w, https://www.zata.cc/p/dokploy/images/index/image-5_hu5255400510229230479.png 1024w"
loading="lazy"
alt="dokploy只能看见本地的容器,但是实际上是有两个容器在跑的"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
>&lt;/p>
&lt;p>最近在使用 &lt;strong>Dokploy&lt;/strong> 配合 &lt;strong>Docker Swarm&lt;/strong> 进行多节点部署时，遇到了一些非常经典的概念误区。这篇笔记旨在记录从单机迈向集群模式时，容易让人产生“自我怀疑”的几个瞬间，以及如何正确地管理你的 Swarm 集群。&lt;/p>
&lt;p>&lt;strong>01. 现象：明明扩容了，容器去哪了？&lt;/strong>&lt;/p>
&lt;p>我在 Dokploy 的后台将一个应用（&lt;code>transfileserver&lt;/code>）的副本数（Replicas）设置为了 &lt;strong>2&lt;/strong>。&lt;/p>
&lt;p>在主节点（Master/Manager）终端输入 &lt;code>docker service ls&lt;/code>，状态看起来非常完美：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">root@master:~# docker service ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ID NAME REPLICAS IMAGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">j4pif4la2ox3 smallappforfun-test..._app 2/2 registry.../app:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>REPLICAS 2/2&lt;/code> 告诉我：期望跑 2 个，实际跑了 2 个。一切正常，对吧？&lt;/p>
&lt;p>&lt;strong>但是&lt;/strong>，当我习惯性地在主节点输入 &lt;code>docker ps&lt;/code> 想看看这两个容器时，却发现：&lt;strong>只有一个容器在运行！&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">root@master:~# docker ps &lt;span class="p">|&lt;/span> grep transfileserver
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// 只有一行输出，显示其中一个容器 ID
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>我的第一个反应是：&lt;/strong> 部署失败了？还是 Dokploy UI 显示 bug 了？为什么丢了一个容器？&lt;/p>
&lt;p>&lt;strong>02. 原理：上帝视角 vs. 本地视角&lt;/strong>&lt;/p>
&lt;p>其实，部署并没有失败。这是 &lt;strong>Docker Swarm&lt;/strong> 最基本的运行逻辑，也是新手最容易混淆的地方。&lt;/p>
&lt;p>&lt;strong>为什么 &lt;code>docker ps&lt;/code> 看不到？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>docker ps&lt;/code> 是“本地视角”&lt;/strong>：这个命令问的是当前这台物理服务器：“你的 CPU 和内存里现在跑着哪些进程？”&lt;/li>
&lt;li>&lt;strong>Swarm 调度机制&lt;/strong>：当你设置 &lt;code>replicas: 2&lt;/code> 且拥有多个节点时，Swarm 调度器为了负载均衡，大概率会将其中一个容器分配给主节点，另一个分配给子节点（Worker Node）。&lt;/li>
&lt;/ul>
&lt;p>所以，你在主节点运行 &lt;code>docker ps&lt;/code>，当然只能看到分配给主节点的那个容器。另一个容器正在子节点的肚子里跑得欢呢。&lt;/p>
&lt;p>&lt;strong>正确的查看方式：上帝视角&lt;/strong>&lt;/p>
&lt;p>要确认所有副本的状态和位置，不能用 &lt;code>docker ps&lt;/code>，而要用 &lt;strong>Service&lt;/strong> 级别的命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker service ps &amp;lt;你的服务名称&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出结果会像这样：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">ID&lt;/th>
&lt;th style="text-align: left">NAME&lt;/th>
&lt;th style="text-align: left">NODE&lt;/th>
&lt;th style="text-align: left">DESIRED STATE&lt;/th>
&lt;th style="text-align: left">CURRENT STATE&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">x7&amp;hellip;&lt;/td>
&lt;td style="text-align: left">&amp;hellip;app.1&lt;/td>
&lt;td style="text-align: left">&lt;strong>racknerd-master&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Running&lt;/td>
&lt;td style="text-align: left">Running&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">y9&amp;hellip;&lt;/td>
&lt;td style="text-align: left">&amp;hellip;app.2&lt;/td>
&lt;td style="text-align: left">&lt;strong>worker-node-01&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Running&lt;/td>
&lt;td style="text-align: left">Running&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>注意 &lt;strong>NODE&lt;/strong> 这一列。你可以清晰地看到，Swarm 已经把任务分发到了不同的机器上。这证明你的负载均衡集群已经完美工作了。&lt;/p>
&lt;p>&lt;strong>03. 疑问：子节点需要安装 Dokploy 吗？&lt;/strong>&lt;/p>
&lt;p>既然应用跑在子节点上，我是否需要在子节点上也跑一遍 Dokploy 的安装脚本？&lt;/p>
&lt;p>&lt;strong>答案是：绝对不需要，千万别装！&lt;/strong>&lt;/p>
&lt;p>&lt;strong>为什么？&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>架构逻辑&lt;/strong>：Dokploy 是“指挥官”（Brain），它只需要存在于主节点。Worker 节点只需要安装基础的 Docker Engine。主节点通过 Swarm 协议遥控子节点干活。&lt;/li>
&lt;li>&lt;strong>端口冲突&lt;/strong>：Dokploy 自带 Traefik（网关），占用 80/443 端口。如果在子节点再装一套，会导致端口冲突，破坏集群的统一路由网络。&lt;/li>
&lt;li>&lt;strong>资源浪费&lt;/strong>：子节点会被迫运行一套多余的 Postgres、Redis 和监控服务。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>子节点只需要做一件事&lt;/strong>：安装 Docker，然后运行 &lt;code>docker swarm join ...&lt;/code> 命令加入集群即可。&lt;/p>
&lt;p>&lt;strong>04. 关键避坑：多节点下的文件存储（Volumes）&lt;/strong>&lt;/p>
&lt;p>虽然多节点部署成功了，但如果你的应用涉及到文件上传或持久化存储（比如我的文件传输服务），这里有一个巨大的隐患。&lt;/p>
&lt;p>&lt;strong>场景重现&lt;/strong>&lt;/p>
&lt;p>假设你的 &lt;code>docker-compose.yml&lt;/code> 是这样写的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./uploads:/app/uploads&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>用户 A&lt;/strong> 上传文件，请求被分发到了 &lt;strong>主节点&lt;/strong> 的容器。文件保存在主节点的硬盘里。&lt;/li>
&lt;li>&lt;strong>用户 A&lt;/strong> 再次刷新，请求被分发到了 &lt;strong>子节点&lt;/strong> 的容器。&lt;/li>
&lt;li>&lt;strong>结果&lt;/strong>：子节点容器里是空的！用户发现刚传的文件“丢了”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>解决方案&lt;/strong>&lt;/p>
&lt;p>在 Swarm 模式下，本地目录挂载（Bind Mounts）不再适用于需要数据共享的场景。你需要：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>方案一（推荐）：对象存储&lt;/strong>
修改代码，不要把文件存本地硬盘，而是存到 AWS S3、阿里云 OSS 或自建的 MinIO 中。这是云原生应用的最佳实践。&lt;/li>
&lt;li>&lt;strong>方案二：NFS（网络文件系统）&lt;/strong>
搭建一个 NFS 服务器，让所有节点挂载同一个网络硬盘。&lt;/li>
&lt;li>&lt;strong>方案三：限制节点（临时方案）&lt;/strong>
如果是单机应用强行上 Swarm，可以通过配置 &lt;code>placement constraints&lt;/code>，强制该服务只运行在主节点上，放弃多节点负载均衡，只利用 Swarm 的管理功能。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>信任 &lt;code>docker service ls&lt;/code>&lt;/strong>：如果它显示 &lt;code>2/2&lt;/code>，那就是成功的。&lt;/li>
&lt;li>&lt;strong>用对命令&lt;/strong>：查看集群状态用 &lt;code>docker service ps&lt;/code>，而不是 &lt;code>docker ps&lt;/code>。&lt;/li>
&lt;li>&lt;strong>保持子节点纯净&lt;/strong>：不要在 Worker 节点重复安装 Dokploy。&lt;/li>
&lt;li>&lt;strong>留意存储&lt;/strong>：多节点部署必须解决文件共享问题，否则数据会“漂移”。&lt;/li>
&lt;/ol>
&lt;p>希望这篇避坑指南能帮你更自信地驾驭 Dokploy 和 Docker Swarm！&lt;/p>
&lt;h2 id="dokploy-安全建议检查与服务器加固操作指南">Dokploy 安全建议检查与服务器加固操作指南
&lt;/h2>&lt;p>&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-3.png"
width="3404"
height="1932"
srcset="https://www.zata.cc/p/dokploy/images/index/image-3_hu10136642107161284263.png 480w, https://www.zata.cc/p/dokploy/images/index/image-3_hu7800812264568771261.png 1024w"
loading="lazy"
alt="刚安装完成的dokploy"
class="gallery-image"
data-flex-grow="176"
data-flex-basis="422px"
>&lt;/p>
&lt;p>这张截图显示的是 Dokploy 的 &lt;strong>安全建议检查（Security Suggestions）&lt;/strong>。它并不是让你在 Dokploy 的网页界面里填个表，而是提示你需要登录到 &lt;strong>服务器的终端（Terminal）&lt;/strong> 去修改系统配置文件。这是一份服务器“加固”清单。要把这些红色的叉号（❌）变成绿色的勾号（✅），你需要 SSH 登录到这台服务器，依次执行以下操作。&lt;/p>
&lt;p>⚠️ &lt;strong>警告：在操作之前，请务必确保你已经可以通过 SSH 密钥登录服务器！如果你在没有配置好密钥的情况下禁用了密码登录，你将无法进入服务器！&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>第一步：修复 SSH 设置 (最重要)&lt;/strong>&lt;/p>
&lt;p>截图建议你禁用密码登录（Password Auth）和 PAM，只允许密钥登录。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>SSH 登录服务器&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>编辑 SSH 配置文件&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>修改以下配置项&lt;/strong>（使用键盘上下键找到这些行，修改后的样子如下）：
&lt;ul>
&lt;li>找到 &lt;code>PasswordAuthentication&lt;/code>，将其改为 &lt;code>no&lt;/code>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PasswordAuthentication no
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>找到 &lt;code>UsePAM&lt;/code>，建议改为 &lt;code>no&lt;/code> (注意：有些系统改为 no 可能会有副作用，通常改 PasswordAuthentication 最关键，但为了满足 Dokploy 的检查，你可以改为 no)：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">UsePAM no
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;em>确保 &lt;code>PubkeyAuthentication&lt;/code> 是 &lt;code>yes&lt;/code>（通常默认就是）。&lt;/em>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>保存并退出&lt;/strong>：按 &lt;code>Ctrl + O&lt;/code> 回车保存，按 &lt;code>Ctrl + X&lt;/code> 退出。&lt;/li>
&lt;li>&lt;strong>重启 SSH 服务&lt;/strong>使配置生效：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart ssh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;em>操作完这一步，SSH 部分的红色叉号应该会变绿。&lt;/em>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>第二步：配置 UFW 防火墙&lt;/strong>&lt;/p>
&lt;p>截图显示 UFW 已安装但未激活，且默认策略不是“拒绝”。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>设置默认拒绝进入&lt;/strong>（安全基线）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw default deny incoming
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>放行必要的端口&lt;/strong>（&lt;strong>非常重要，否则你会把自己关在外面&lt;/strong>）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 放行 SSH (通常是 22)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 22/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 放行 Web 服务 (HTTP/HTTPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 80/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 443/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 放行 Dokploy 面板端口 (默认是 3000)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 3000/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>启用防火墙&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw &lt;span class="nb">enable&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;em>(系统会提示你这可能会断开 SSH 连接，输入 &lt;code>y&lt;/code> 确认即可，只要上面 allow 22 执行了就没事)&lt;/em>。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>第三步：安装并配置 Fail2Ban&lt;/strong>&lt;/p>
&lt;p>截图显示 Fail2Ban 根本没安装，建议安装并开启 SSH 攻击保护（Aggressive 模式）。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>安装 Fail2Ban&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install fail2ban -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>创建配置文件&lt;/strong>（不要直接改 jail.conf，新建 jail.local）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/fail2ban/jail.local
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>粘贴以下内容&lt;/strong>（开启 SSH 保护并设为激进模式）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[sshd]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">enabled&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">ssh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">filter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">sshd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">logpath&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/var/log/auth.log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">maxretry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 截图建议 SSH Mode: aggressive&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">mode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">aggressive&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>保存并退出&lt;/strong>：&lt;code>Ctrl + O&lt;/code> 回车，&lt;code>Ctrl + X&lt;/code>。&lt;/li>
&lt;li>&lt;strong>启动 Fail2Ban 服务&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> fail2ban
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start fail2ban
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>最后一步：验证&lt;/strong>&lt;/p>
&lt;p>回到 Dokploy 网页界面，点击弹窗右上角的 &lt;strong>Refresh (刷新)&lt;/strong> 按钮。如果操作正确，大部分或者全部的红叉 ❌ 应该都会变成绿色的 ✅。&lt;/p>
&lt;p>&lt;strong>简单总结：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>改 &lt;code>/etc/ssh/sshd_config&lt;/code> 禁止密码。&lt;/li>
&lt;li>运行 &lt;code>ufw&lt;/code> 命令开放端口并开启防火墙。&lt;/li>
&lt;li>运行 &lt;code>apt install fail2ban&lt;/code> 并配置它。&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/dokploy/images/index/image-4.png"
width="3404"
height="1932"
srcset="https://www.zata.cc/p/dokploy/images/index/image-4_hu15573905085076454083.png 480w, https://www.zata.cc/p/dokploy/images/index/image-4_hu11951157610726082232.png 1024w"
loading="lazy"
alt="配置完成如下"
class="gallery-image"
data-flex-grow="176"
data-flex-basis="422px"
>&lt;/p>
&lt;h2 id="dokploy-搭配-nginx-proxy-manager-保姆级实操教程">Dokploy 搭配 Nginx Proxy Manager 保姆级实操教程
&lt;/h2>&lt;p>没问题！既然你习惯了 1Panel 的操作逻辑，那么&lt;strong>方案一：使用 Nginx Proxy Manager (NPM)&lt;/strong> 绝对是你的最佳选择。&lt;/p>
&lt;p>这将是一个&lt;strong>手把手、保姆级&lt;/strong>的实操教程，涵盖从网络配置到最终通过域名访问的全过程。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>准备工作&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>一台安装好 Dokploy 的服务器&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>一个域名&lt;/strong>（假设为 &lt;code>example.com&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>确保端口未被占用&lt;/strong>：确保服务器的 80 和 443 端口没有被其他程序占用（Dokploy 面板默认通常在 3000 端口，所以 80/443 通常是空闲的）。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>第一步：规划 Docker 网络（关键点）&lt;/strong>&lt;/p>
&lt;p>在 1Panel 里，系统帮你自动处理了网络。但在 Dokploy（以及原生 Docker）中，为了让“反向代理容器”能找到“应用容器”，它们必须在&lt;strong>同一个 Docker 网络&lt;/strong>中。&lt;/p>
&lt;p>我们先创建一个专用的网络，名字叫 &lt;code>proxy-net&lt;/code>。&lt;/p>
&lt;ol>
&lt;li>登录你的服务器终端（SSH）。&lt;/li>
&lt;li>执行以下命令创建网络：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker network create proxy-net
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这一步做完，以后所有的应用和 NPM 都加入这个网络，它们就能通过“容器名”互相通信了。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>第二步：在 Dokploy 中部署 Nginx Proxy Manager&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>登录 Dokploy 面板。&lt;/li>
&lt;li>进入 &lt;strong>Project（项目）&lt;/strong> -&amp;gt; 选择或新建一个项目（例如叫 &lt;code>System&lt;/code>）。&lt;/li>
&lt;li>点击 &lt;strong>Compose&lt;/strong> -&amp;gt; &lt;strong>Add Compose&lt;/strong>。
&lt;ul>
&lt;li>&lt;strong>Name:&lt;/strong> &lt;code>nginx-proxy-manager&lt;/code>&lt;/li>
&lt;li>&lt;strong>Description:&lt;/strong> 反向代理服务&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>在右侧的编辑器中，粘贴以下配置（注意我添加了网络配置）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;jc21/nginx-proxy-manager:latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nginx-proxy-manager&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;80:80&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;81:81&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;443:443&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./data:/data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./letsencrypt:/etc/letsencrypt&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">proxy-net&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxy-net&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>点击 &lt;strong>Deploy&lt;/strong>（部署）。&lt;/li>
&lt;li>等待日志显示 &lt;code>Listening on port 81&lt;/code>，表示启动成功。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>第三步：初始化 Nginx Proxy Manager&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>在浏览器访问：&lt;code>http://你的服务器 IP:81&lt;/code>&lt;/li>
&lt;li>使用默认账号登录：
&lt;ul>
&lt;li>&lt;strong>Email:&lt;/strong> &lt;code>admin@example.com&lt;/code>&lt;/li>
&lt;li>&lt;strong>Password:&lt;/strong> &lt;code>changeme&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>登录后，系统会立即要求你修改&lt;strong>用户名&lt;/strong>和&lt;strong>密码&lt;/strong>，请务必修改并记住。&lt;/li>
&lt;/ol>
&lt;p>此时，你的“反向代理中心”已经搭建好了！&lt;/p>
&lt;hr>
&lt;p>&lt;strong>第四步：部署一个业务应用（以 Alist 为例）&lt;/strong>&lt;/p>
&lt;p>现在我们来部署一个实际的应用，并尝试通过域名访问它。&lt;/p>
&lt;ol>
&lt;li>回到 Dokploy 面板。&lt;/li>
&lt;li>进入你的项目，点击 &lt;strong>Compose&lt;/strong> -&amp;gt; &lt;strong>Add Compose&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Name:&lt;/strong> &lt;code>alist&lt;/code>&lt;/li>
&lt;li>粘贴以下配置（&lt;strong>注意看 &lt;code>networks&lt;/code> 和 &lt;code>ports&lt;/code> 的部分&lt;/strong>）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.3&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">alist&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;xhofe/alist:latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alist-app&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;./etc/alist:/opt/alist/data&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">proxy-net&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxy-net&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>点击 &lt;strong>Deploy&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>重点理解&lt;/strong>：此时，&lt;code>alist-app&lt;/code> 和 &lt;code>nginx-proxy-manager&lt;/code> 都在 &lt;code>proxy-net&lt;/code> 这个网络里。虽然你在公网通过 IP:5244 访问不到 Alist（因为没暴露端口），但 NPM 可以通过内部网络访问到它。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>第五步：域名解析 (DNS)&lt;/strong>&lt;/p>
&lt;p>去你的域名服务商（阿里云、腾讯云、Cloudflare 等）：&lt;/p>
&lt;ol>
&lt;li>添加一条 &lt;strong>A 记录&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>主机记录 (Name):&lt;/strong> 例如 &lt;code>pan&lt;/code> (即 &lt;code>pan.example.com&lt;/code>)。&lt;/li>
&lt;li>&lt;strong>记录值 (Value):&lt;/strong> 填写你 &lt;strong>Dokploy 服务器的公网 IP&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>第六步：在 NPM 中配置反向代理（最后一步！）&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>回到 NPM 的管理后台 (&lt;code>http://你的服务器 IP:81&lt;/code>)。&lt;/li>
&lt;li>点击顶部菜单 &lt;strong>Hosts&lt;/strong> -&amp;gt; &lt;strong>Proxy Hosts&lt;/strong>。&lt;/li>
&lt;li>点击右上角 &lt;strong>Add Proxy Host&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>A. Details 标签页 (基本信息)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Domain Names:&lt;/strong> &lt;code>pan.example.com&lt;/code> (你刚才解析的域名)&lt;/li>
&lt;li>&lt;strong>Scheme:&lt;/strong> &lt;code>http&lt;/code>&lt;/li>
&lt;li>&lt;strong>Forward Hostname / IP:&lt;/strong> &lt;code>alist-app&lt;/code>
&lt;ul>
&lt;li>这里最关键！填写你在第四步定义的 &lt;code>container_name&lt;/code>。不要填 IP，填容器名即可。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Forward Port:&lt;/strong> &lt;code>5244&lt;/code>
&lt;ul>
&lt;li>填写 Alist 的内部端口。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Cache Assets / Block Common Exploits:&lt;/strong> 推荐勾选。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>B. SSL 标签页 (HTTPS 证书)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>SSL Certificate:&lt;/strong> 选择 &lt;code>Request a new SSL Certificate&lt;/code>。&lt;/li>
&lt;li>&lt;strong>Force SSL:&lt;/strong> 勾选 (强制跳转 HTTPS)。&lt;/li>
&lt;li>&lt;strong>HTTP/2 Support:&lt;/strong> 推荐勾选。&lt;/li>
&lt;li>&lt;strong>Email Address:&lt;/strong> 填写你的邮箱。&lt;/li>
&lt;li>&lt;strong>I Agree to the Terms:&lt;/strong> 勾选。&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>点击 &lt;strong>Save&lt;/strong>。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>&lt;strong>验证成果&lt;/strong>&lt;/p>
&lt;p>现在，在浏览器输入 &lt;code>https://pan.example.com&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>如果一切顺利，你应该能看到 Alist 的页面。&lt;/li>
&lt;li>并且浏览器地址栏有一把&lt;strong>小锁&lt;/strong>（HTTPS 已启用）。&lt;/li>
&lt;li>整个过程你不需要手动去碰 Nginx 的配置文件，也不需要手动上传证书。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>进阶小贴士&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>后续添加新应用：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>在 Dokploy 部署新应用时，记得在 Compose 文件里加上 &lt;code>networks: - proxy-net&lt;/code>。&lt;/li>
&lt;li>记下容器名 (&lt;code>container_name&lt;/code>) 和内部端口。&lt;/li>
&lt;li>去 NPM 添加一条新的 Proxy Host 即可。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>关于端口 81 的安全：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>NPM 的后台（81 端口）直接暴露在公网其实不太安全。&lt;/li>
&lt;li>&lt;strong>高级玩法&lt;/strong>：你可以在 NPM 里，把自己（&lt;code>nginx-proxy-manager&lt;/code> 容器，端口 81）也代理一下！&lt;/li>
&lt;li>配置一个域名如 &lt;code>npm.example.com&lt;/code> -&amp;gt; Forward Hostname: &lt;code>nginx-proxy-manager&lt;/code> -&amp;gt; Port: &lt;code>81&lt;/code>。&lt;/li>
&lt;li>一旦配置成功，去云服务商防火墙把 81 端口封掉，只留 80/443，以后通过 &lt;code>npm.example.com&lt;/code> 访问管理后台，更加安全且带有 HTTPS。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>通过这套流程，你在 Dokploy 上就完美复刻了 1Panel 的反向代理体验，甚至在多服务器扩展性上比 1Panel 更强（因为基于标准的 Docker 网络）。&lt;/p>
&lt;h1 id="dokploy介绍">Dokploy介绍
&lt;/h1>&lt;p>Dokploy 是一个新兴的、开源的、基于 Web 的服务器管理和应用程序部署平台，旨在让开发者和中小型团队能够像使用 Heroku 或 Vercel 一样简便地部署和管理应用，但所有服务完全运行在您自己拥有或控制的服务器（如 VPS）上。简单来说，Dokploy 是“自托管/私有化部署的 Heroku”。&lt;/p>
&lt;p>它通过一个直观的 Web 控制面板，将复杂的 Docker、Git、Webhook 和反向代理配置过程完全可视化，让您无需记忆冗长的命令行指令，就能完成应用部署、数据库创建、SSL 证书安装等一系列操作。&lt;/p>
&lt;p>核心特性&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>基于 Docker&lt;/strong>：所有应用和服务都以 Docker 容器形式运行，保证环境的一致性和隔离性。支持上传标准的 &lt;code>docker-compose.yml&lt;/code> 文件，或使用内置模板快速创建多容器应用。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>可视化部署&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Git 集成&lt;/strong>：连接 GitHub、GitLab 或 Bitbucket 仓库，实现持续部署。每次推送代码到指定分支，Dokploy 会自动拉取、构建并重新部署应用。&lt;/li>
&lt;li>&lt;strong>Docker 镜像部署&lt;/strong>：可直接从 Docker Hub 或私有仓库拉取镜像进行部署。&lt;/li>
&lt;li>&lt;strong>环境变量管理&lt;/strong>：在网页界面中轻松添加、编辑和管理敏感配置信息，无需手动编辑文件。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>内置服务支持&lt;/strong>：一键部署常用数据库（MySQL、PostgreSQL、MongoDB、Redis 等）、缓存服务和反向代理（Nginx），无需手动编写配置文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>SSL 证书自动管理&lt;/strong>：集成 Let’s Encrypt，为您的应用域名自动签发和续期免费的 HTTPS 证书，仅需点击几下即可完成配置。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>直观的监控与管理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>实时查看容器状态（运行/停止）、CPU 与内存使用情况。&lt;/li>
&lt;li>查看实时日志流，支持在线启动、停止、重启容器。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>多服务器管理&lt;/strong>：一个 Dokploy 控制面板可同时管理多个远程服务器（节点），便于在不同机器上分布和调度应用。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>开源与可扩展&lt;/strong>：完全开源（采用商业源码许可证），代码透明，社区驱动，支持通过插件或模板扩展功能，便于二次开发与定制。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>典型工作流程&lt;/p>
&lt;ol>
&lt;li>&lt;strong>准备一台 VPS&lt;/strong>：在 DigitalOcean、Linode、阿里云、腾讯云等服务商购买一台安装了 Ubuntu 或 Debian 的虚拟服务器。&lt;/li>
&lt;li>&lt;strong>安装 Dokploy&lt;/strong>：使用官方提供的一键安装脚本，在服务器上部署 Dokploy（其本身也是一个 Docker 容器）。&lt;/li>
&lt;li>&lt;strong>访问控制面板&lt;/strong>：通过浏览器访问服务器 IP 和指定端口，进入 Dokploy 的 Web 界面并完成初始设置。&lt;/li>
&lt;li>&lt;strong>连接 Git 账户&lt;/strong>：在面板中授权您的 GitHub、GitLab 或 Bitbucket 账号。&lt;/li>
&lt;li>&lt;strong>创建新项目&lt;/strong>：点击“部署应用”，选择目标仓库和分支。&lt;/li>
&lt;li>&lt;strong>配置部署参数&lt;/strong>：设置端口映射、环境变量、构建命令等。Dokploy 会自动生成 &lt;code>Dockerfile&lt;/code>（如项目未提供），或使用您上传的 &lt;code>docker-compose.yml&lt;/code>。&lt;/li>
&lt;li>&lt;strong>执行部署&lt;/strong>：点击“部署”按钮，Dokploy 会自动拉取代码、构建镜像、启动容器，并通过内置的 Traefik 或 Nginx 配置好域名访问。&lt;/li>
&lt;li>&lt;strong>持续管理&lt;/strong>：部署完成后，通过面板监控应用状态、查看日志、添加自定义域名并启用 SSL。&lt;/li>
&lt;/ol>
&lt;p>适合谁使用？&lt;/p>
&lt;ul>
&lt;li>&lt;strong>前端/全栈开发者&lt;/strong>：希望快速部署 Next.js、Nuxt.js、React、Vue 或 Node.js 等项目，却不愿花时间处理服务器运维。&lt;/li>
&lt;li>&lt;strong>初创团队和小公司&lt;/strong>：需要成本可控、易于维护的部署方案，同时避免被 Heroku、Railway 等 PaaS 平台绑定或高额费用困扰。&lt;/li>
&lt;li>&lt;strong>注重数据隐私的个人或组织&lt;/strong>：因合规性、安全或数据主权要求，必须将应用部署在自有基础设施上，但仍希望享受现代云平台的便捷体验。&lt;/li>
&lt;li>&lt;strong>Docker 初学者&lt;/strong>：想体验容器化部署的优势，但对命令行、网络配置、存储卷等概念感到困难。&lt;/li>
&lt;/ul>
&lt;p>优点与缺点&lt;/p>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>成本效益高&lt;/strong>：仅需支付 VPS 费用，Dokploy 本身免费，长期使用远低于按需付费的云 PaaS。&lt;/li>
&lt;li>&lt;strong>完全自主可控&lt;/strong>：数据和基础设施由您掌控，可自由定制服务器配置和安全策略。&lt;/li>
&lt;li>&lt;strong>开发者体验友好&lt;/strong>：极大降低了 Docker 和 CI/CD 的入门门槛，部署流程流畅直观。&lt;/li>
&lt;li>&lt;strong>活跃社区&lt;/strong>：项目更新频繁，功能持续迭代，社区支持逐步增强。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>依赖自有服务器&lt;/strong>：您需具备基本的服务器运维能力（如 SSH 登录、防火墙设置），并自行负责安全更新、备份和底层维护。&lt;/li>
&lt;li>&lt;strong>非企业级架构&lt;/strong>：相比 Kubernetes 或商业面板（如 Plesk、cPanel），在集群管理、高可用、自动伸缩等方面功能尚不完善。&lt;/li>
&lt;li>&lt;strong>新兴项目&lt;/strong>：作为较新的开源工具，其长期稳定性、大规模生产环境验证和生态成熟度仍需时间检验。&lt;/li>
&lt;/ul>
&lt;p>与其他工具的对比&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">工具&lt;/th>
&lt;th style="text-align: left">类型&lt;/th>
&lt;th style="text-align: left">核心特点&lt;/th>
&lt;th style="text-align: left">适合场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>Dokploy&lt;/strong>&lt;/td>
&lt;td style="text-align: left">自托管 PaaS 面板&lt;/td>
&lt;td style="text-align: left">开源、可视化、Git 集成、轻量级、基于 Docker&lt;/td>
&lt;td style="text-align: left">个人开发者、小团队自托管应用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>Heroku / Vercel&lt;/strong>&lt;/td>
&lt;td style="text-align: left">云 PaaS&lt;/td>
&lt;td style="text-align: left">极致简化、全托管、生态丰富、按需付费&lt;/td>
&lt;td style="text-align: left">追求效率、不愿管理服务器的用户&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>Portainer&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Docker 管理面板&lt;/td>
&lt;td style="text-align: left">通用型容器、镜像、网络、卷管理&lt;/td>
&lt;td style="text-align: left">需要精细管理 Docker 环境的管理员&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>Coolify / CapRover&lt;/strong>&lt;/td>
&lt;td style="text-align: left">自托管 PaaS 面板&lt;/td>
&lt;td style="text-align: left">与 Dokploy 定位高度重叠，功能相似&lt;/td>
&lt;td style="text-align: left">可作为 Dokploy 的替代选择进行对比&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>Kubernetes&lt;/strong>&lt;/td>
&lt;td style="text-align: left">容器编排平台&lt;/td>
&lt;td style="text-align: left">企业级、高扩展性、功能强大但复杂&lt;/td>
&lt;td style="text-align: left">大型系统、微服务架构、需要弹性伸缩的场景&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>如何开始？&lt;/p>
&lt;ol>
&lt;li>访问 Dokploy 官方网站获取最新文档和安装指南：&lt;a class="link" href="https://dokploy.com" target="_blank" rel="noopener"
>https://dokploy.com&lt;/a>&lt;/li>
&lt;li>查看开源代码和社区贡献：&lt;a class="link" href="https://github.com/Dokploy/dokploy" target="_blank" rel="noopener"
>https://github.com/Dokploy/dokploy&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>总结&lt;/p>
&lt;p>Dokploy 填补了“完全托管的云服务”与“手动服务器运维”之间的空白，让开发者能专注于编写代码，而将部署与运维的复杂性封装在一个美观、易用的界面之后。对于追求自主权、控制权和成本效益的开发者而言，Dokploy 是一个极具吸引力的现代部署解决方案。如果您正在寻找一种比手动操作更高效、比大型云平台更自主的部署方式，Dokploy 绝对值得一试。&lt;/p></description></item><item><title>Coolify</title><link>https://www.zata.cc/p/coolify/</link><pubDate>Sat, 21 Feb 2026 17:19:21 +0800</pubDate><guid>https://www.zata.cc/p/coolify/</guid><description>&lt;img src="https://www.zata.cc/p/coolify/images/index/index.png" alt="Featured image of post Coolify" />&lt;h3 id="一-产品核心定位-product-positioning">一、 产品核心定位 (Product Positioning)
&lt;/h3>&lt;p>Coolify 是一款&lt;strong>开源、可自托管的 PaaS（平台即服务）系统&lt;/strong>。
如果用一句话来向投资人或技术团队推销它：&lt;strong>“它是架设在你自有服务器上的 Vercel、Heroku 或 Render，让你用云主机的底层成本，享受顶级云厂商的 DevOps 自动化体验。”&lt;/strong>&lt;/p>
&lt;p>&lt;strong>核心商业逻辑&lt;/strong>：解耦“软件体验”与“硬件基础设施”。它将底层服务器的计算资源池化，在上面套了一层极简的 UI 和自动化脚本。&lt;/p>
&lt;hr>
&lt;h3 id="二-核心功能矩阵-core-features">二、 核心功能矩阵 (Core Features)
&lt;/h3>&lt;p>Coolify 的功能设计紧紧围绕“研发交付生命周期”展开，极大地压缩了 Time-to-Market（上市时间）：&lt;/p>
&lt;h4 id="1-自动化应用部署-gitops--cicd">1. 自动化应用部署 (GitOps &amp;amp; CI/CD)
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>代码即部署&lt;/strong>：深度集成 GitHub, GitLab, Bitbucket, Gitea。开发人员提交代码（git push）后，Coolify 自动拉取、构建并部署。&lt;/li>
&lt;li>&lt;strong>PR 预览环境&lt;/strong>：当提交 Pull Request 时，可自动生成一个带独立域名的临时预览环境，PR 合并后自动销毁，极大方便 QA 和产品验收。&lt;/li>
&lt;li>&lt;strong>多栈支持（Zero-Config）&lt;/strong>：无论是 Node.js, Python, Go, Rust 还是 PHP，通常不需要手写 Dockerfile，系统会自动识别语言并打包构建。&lt;/li>
&lt;/ul>
&lt;h4 id="2-数据库与存储管理-database-as-a-service">2. 数据库与存储管理 (Database as a Service)
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>一键拉起&lt;/strong>：支持一键部署 PostgreSQL, MySQL, MariaDB, MongoDB, Redis 等主流数据库。&lt;/li>
&lt;li>&lt;strong>自动备份&lt;/strong>：内置备份策略，可配置 Cron 任务，将数据库自动备份至本地或兼容 S3 的云存储（如 AWS S3, Cloudflare R2），解决数据灾备问题。&lt;/li>
&lt;/ul>
&lt;h4 id="3-服务模板市场-1-click-services">3. 服务模板市场 (1-Click Services)
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>内置应用商店&lt;/strong>：内置了上百种热门开源软件模板（如 WordPress, Ghost, Supabase, MinIO, Metabase 等）。产品或运营团队可绕过开发，一键部署所需工具。&lt;/li>
&lt;/ul>
&lt;h4 id="4-基础设施与网络自动化-infra--networking">4. 基础设施与网络自动化 (Infra &amp;amp; Networking)
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>多机管理 (BYOS)&lt;/strong>：支持“自带服务器”。可以在一台主控机上，通过 SSH 挂载管理位于阿里云、AWS 甚至家里的多台不同节点的服务器。&lt;/li>
&lt;li>&lt;strong>智能网关与 SSL&lt;/strong>：自动配置反向代理（Traefik 或 Caddy），全自动申请和续期 Let&amp;rsquo;s Encrypt 的 HTTPS 证书，无需手动改 Nginx 配置。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="三-底层技术架构-technical-underpinnings">三、 底层技术架构 (Technical Underpinnings)
&lt;/h3>&lt;p>理解 Coolify 的底层，有助于评估其技术稳定性和扩展性边界：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>容器化核心 (Docker-based)&lt;/strong>：Coolify 的一切皆容器。它不依赖 Kubernetes 的复杂编排，而是利用底层的 Docker Engine 运行应用，这保证了极低的资源消耗（主控节点 2C2G 即可运行）。&lt;/li>
&lt;li>&lt;strong>构建引擎 (Nixpacks)&lt;/strong>：采用目前非常先进的 Nixpacks（由 Railway 团队开源）替代传统的 Dockerfile 构建。它能更智能、更快速地解析代码库，生成极度优化的容器镜像。&lt;/li>
&lt;li>&lt;strong>控制面与数据面分离&lt;/strong>：
&lt;ul>
&lt;li>&lt;em>Control Plane（控制面）&lt;/em>：Coolify 面板本身，负责下发指令。&lt;/li>
&lt;li>&lt;em>Worker Nodes（工作节点）&lt;/em>：实际跑应用的服务器。即使 Coolify 面板宕机，由于底层是通过 Docker 运行，部署好的业务应用&lt;strong>不受影响&lt;/strong>，继续提供服务。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="四-竞品对比与市场分析-competitive-landscape">四、 竞品对比与市场分析 (Competitive Landscape)
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">比较维度&lt;/th>
&lt;th style="text-align: left">Coolify (自托管)&lt;/th>
&lt;th style="text-align: left">Vercel / Netlify&lt;/th>
&lt;th style="text-align: left">Heroku / Render&lt;/th>
&lt;th style="text-align: left">Kubernetes (K8s)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>成本&lt;/strong>&lt;/td>
&lt;td style="text-align: left">极低（仅需支付廉价 VPS 费用）&lt;/td>
&lt;td style="text-align: left">早期免费，后期扩展成本极高&lt;/td>
&lt;td style="text-align: left">中等偏高&lt;/td>
&lt;td style="text-align: left">极高（需专业运维团队和冗余机器）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>学习门槛&lt;/strong>&lt;/td>
&lt;td style="text-align: left">低（图形化界面）&lt;/td>
&lt;td style="text-align: left">极低&lt;/td>
&lt;td style="text-align: left">较低&lt;/td>
&lt;td style="text-align: left">极高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>扩展性&lt;/strong>&lt;/td>
&lt;td style="text-align: left">中（单机伸缩，暂无自动水平扩容）&lt;/td>
&lt;td style="text-align: left">高（Serverless，全球边缘节点）&lt;/td>
&lt;td style="text-align: left">高&lt;/td>
&lt;td style="text-align: left">极高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>数据隐私&lt;/strong>&lt;/td>
&lt;td style="text-align: left">极高（数据全在自己服务器）&lt;/td>
&lt;td style="text-align: left">低（托管在第三方）&lt;/td>
&lt;td style="text-align: left">低（托管在第三方）&lt;/td>
&lt;td style="text-align: left">极高（可私有化部署）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>适用场景&lt;/strong>&lt;/td>
&lt;td style="text-align: left">独立开发、初创公司、内部系统&lt;/td>
&lt;td style="text-align: left">纯前端、重 SEO 网站、轻量 API&lt;/td>
&lt;td style="text-align: left">快速验证商业模式的 MVP&lt;/td>
&lt;td style="text-align: left">大型企业、高并发、微服务架构&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="五-产品经理的落地实施建议-actionable-strategy">五、 产品经理的落地实施建议 (Actionable Strategy)
&lt;/h3>&lt;p>如果你打算在团队中引入 Coolify，我建议采取以下策略以平衡资源与风险：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>切入场景：先内部后外部&lt;/strong>
&lt;ul>
&lt;li>不要一开始就把核心交易系统放上去。先用 Coolify 部署&lt;strong>内部管理后台、测试环境（Staging）、数据分析工具（Metabase）或官网博客&lt;/strong>。验证团队对其稳定性的掌握度。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>架构部署：隔离主控与生产&lt;/strong>
&lt;ul>
&lt;li>买一台轻量级 VPS 作为“主控节点”专门跑 Coolify 面板。&lt;/li>
&lt;li>将性能更好的服务器作为“工作节点”通过 SSH 挂载上去跑实际的业务和数据库。这样即便折腾面板，也不会影响线上业务。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>风险控制：关注 OS 层面运维&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>劣势预警&lt;/strong>：Coolify 帮你解决了应用层的运维，但&lt;strong>不解决 Linux 操作系统底层的运维&lt;/strong>。服务器的内核升级、防火墙（UFW/iptables）配置、防 DDoS 攻击依然需要你处理。&lt;/li>
&lt;li>&lt;strong>强推备份&lt;/strong>：第一时间配置 S3 数据库自动备份策略。只要数据在，无论面板或服务器出什么问题，都能在 30 分钟内用一台新机器拉起所有服务。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>总结&lt;/strong>：Coolify 是一个典型的“用技术杠杆对抗资本”的优秀产品。它非常适合那些需要快速迭代、又希望把控基础设施成本的小型敏捷团队。&lt;/p></description></item><item><title>PostgreSQL</title><link>https://www.zata.cc/p/postgresql/</link><pubDate>Tue, 30 Dec 2025 12:27:59 +0800</pubDate><guid>https://www.zata.cc/p/postgresql/</guid><description>&lt;img src="https://www.zata.cc/p/postgresql/images/index/index.png" alt="Featured image of post PostgreSQL" />&lt;h2 id="安装">安装
&lt;/h2>&lt;ol>
&lt;li>PG数据库安装&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Docker (最快方式):&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run --name some-postgres -e &lt;span class="nv">POSTGRES_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>mysecretpassword -d -p 5432:5432 postgres
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Linux (Ubuntu/Debian):&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install postgresql postgresql-contrib
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Windows/Mac:&lt;/strong> 推荐直接去官网下载 &lt;a class="link" href="https://www.postgresql.org/download/" target="_blank" rel="noopener"
>PostgreSQL Installer&lt;/a>。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>相关工具的安装&lt;/li>
&lt;/ol>
&lt;p>&lt;a class="link" href="https://www.navicat.com.cn/download/navicat-premium-lite" target="_blank" rel="noopener"
>navicat for PG lite&lt;/a>&lt;/p>
&lt;hr>
&lt;ol start="2">
&lt;li>连接 (使用命令行 psql)&lt;/li>
&lt;/ol>
&lt;p>PostgreSQL 安装后会创建一个默认的超级用户，叫 &lt;code>postgres&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>在 Linux/Mac 终端中登录：&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 切换到 postgres 用户并启动 psql 工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo -u postgres psql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>登录成功后：&lt;/strong> 你会看到提示符变成 &lt;code>postgres=#&lt;/code>，这表示你已经是超级管理员了。&lt;/li>
&lt;/ul>
&lt;h2 id="基础操作实战-crud">基础操作实战 (CRUD)
&lt;/h2>&lt;p>以下命令请在 &lt;code>psql&lt;/code> 命令行或图形化客户端的 SQL 编辑器中执行。**注意：SQL 语句末尾必须加分号 &lt;code>;**&lt;/code>。&lt;/p>
&lt;ol>
&lt;li>数据库操作&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 创建一个新数据库
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">my_app&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 切换/连接到这个数据库 (psql 专用指令，非 SQL)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">my_app&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 提示符会变为 my_app=#
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>创建表 (Create Table)&lt;/li>
&lt;/ol>
&lt;p>PostgreSQL 的数据类型非常丰富。&lt;/p>
&lt;ul>
&lt;li>&lt;code>SERIAL&lt;/code>: 相当于 MySQL 的 &lt;code>AUTO_INCREMENT&lt;/code>（自增主键）。&lt;/li>
&lt;li>&lt;code>TEXT&lt;/code>: PG 中推荐使用 &lt;code>TEXT&lt;/code> 代替 &lt;code>VARCHAR&lt;/code>，性能几乎一样但没有长度限制。&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">SERIAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIMARY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">KEY&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNIQUE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">created_at&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TIMESTAMP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFAULT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">CURRENT_TIMESTAMP&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>插入数据 (Insert)&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 插入单条数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;zhang_san&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;zhang@example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">25&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 插入多条数据
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;li_si&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;li@example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;wang_wu&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;wang@example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">22&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>查询数据 (Select)&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 查询所有
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 条件查询
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">24&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 排序与限制
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DESC&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">LIMIT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>更新与删除 (Update &amp;amp; Delete)&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 更新
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">UPDATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SET&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">26&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;zhang_san&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 删除
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">DELETE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">age&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;code>进阶功能 (PG 的杀手锏)&lt;/code>&lt;/p>
&lt;p>这是大家选择 PG 而不是 MySQL 的主要原因：&lt;strong>对 JSON 的原生支持&lt;/strong>。你可以把它当成 MongoDB 来用。&lt;/p>
&lt;ol>
&lt;li>创建包含 JSON 的表&lt;/li>
&lt;/ol>
&lt;p>假设我们要存用户的“配置信息”，每个人的配置都不一样，且经常变动。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_configs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">user_id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">JSONB&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- JSONB 是二进制存储的 JSON，查询速度极快
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>插入 JSON 数据&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_configs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">user_id&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;{&amp;#34;theme&amp;#34;: &amp;#34;dark&amp;#34;, &amp;#34;notifications&amp;#34;: true, &amp;#34;tags&amp;#34;: [&amp;#34;admin&amp;#34;, &amp;#34;editor&amp;#34;]}&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>查询 JSON 内部的字段&lt;/li>
&lt;/ol>
&lt;p>PG 提供了特殊的运算符 &lt;code>-&amp;gt;&lt;/code> 和 &lt;code>-&amp;gt;&amp;gt;&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 查询 theme 是 dark 的用户
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_configs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="o">-&amp;gt;&amp;gt;&lt;/span>&lt;span class="s1">&amp;#39;theme&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;dark&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 甚至可以查询 JSON 数组中是否包含某个值
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_configs&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="s1">&amp;#39;tags&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;admin&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;code>第五步：常用的 &lt;/code>psql&lt;code> 快捷指令 (作弊条)&lt;/code>&lt;/p>
&lt;p>如果你使用命令行工具 &lt;code>psql&lt;/code>，这些指令必须背下来（注意这些指令前面是反斜杠 &lt;code>\&lt;/code>，且不需要分号）：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>指令&lt;/th>
&lt;th>作用&lt;/th>
&lt;th>对应 MySQL&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>\l&lt;/code>&lt;/td>
&lt;td>列出所有数据库&lt;/td>
&lt;td>&lt;code>SHOW DATABASES;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\c dbname&lt;/code>&lt;/td>
&lt;td>切换到指定数据库&lt;/td>
&lt;td>&lt;code>USE dbname;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\dt&lt;/code>&lt;/td>
&lt;td>列出当前库下的所有表&lt;/td>
&lt;td>&lt;code>SHOW TABLES;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\d tablename&lt;/code>&lt;/td>
&lt;td>查看表结构详细信息&lt;/td>
&lt;td>&lt;code>DESC tablename;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\q&lt;/code>&lt;/td>
&lt;td>&lt;strong>退出 psql&lt;/strong>&lt;/td>
&lt;td>&lt;code>EXIT;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\timing&lt;/code>&lt;/td>
&lt;td>开启/关闭查询计时&lt;/td>
&lt;td>(无)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="概念">概念
&lt;/h2>&lt;h4 id="知识点">知识点
&lt;/h4>&lt;p>PostgreSQL（常被简称为 Postgres 或 PG）是一个功能非常强大的开源数据库。对于刚接触它的人来说，最主要的门槛在于它的&lt;strong>架构概念&lt;/strong>和&lt;strong>命令行工具&lt;/strong>与 MySQL 略有不同。&lt;/p>
&lt;p>这是一个从 0 到 1 的详细上手教程。&lt;/p>
&lt;p>在使用之前，需要理解 PG 的层级结构，这比 MySQL 多了一层：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>MySQL:&lt;/strong> 实例 (Instance) -&amp;gt; 数据库 (Database/Schema) -&amp;gt; 表 (Table)&lt;/li>
&lt;li>&lt;strong>PostgreSQL:&lt;/strong> 实例 (Instance) -&amp;gt; 数据库 (Database) -&amp;gt; &lt;strong>模式 (Schema)&lt;/strong> -&amp;gt; 表 (Table)&lt;/li>
&lt;li>&lt;em>注：默认情况下，一切都会放在名为 &lt;code>public&lt;/code> 的模式下，所以初学者可以暂时忽略“模式”这一层，当作它不存在。&lt;/em>&lt;/li>
&lt;/ul>
&lt;h4 id="推荐的图形化客户端-gui">推荐的图形化客户端 (GUI)
&lt;/h4>&lt;p>如果你不想天天敲命令行，推荐下载以下软件来管理 Postgres：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>pgAdmin 4:&lt;/strong> 官方提供的工具，功能最全，web 风格，但有时候稍微有点慢。&lt;/li>
&lt;li>&lt;strong>DBeaver (强烈推荐):&lt;/strong> 免费开源，支持 PG、MySQL 等所有数据库，界面类似 Eclipse，功能非常强大。&lt;/li>
&lt;li>&lt;strong>Navicat for PostgreSQL:&lt;/strong> 收费软件，好用但贵。&lt;/li>
&lt;/ol></description></item><item><title>redis</title><link>https://www.zata.cc/p/redis/</link><pubDate>Fri, 17 Oct 2025 11:26:56 +0800</pubDate><guid>https://www.zata.cc/p/redis/</guid><description>&lt;img src="https://www.zata.cc/p/redis/images/index/index.png" alt="Featured image of post redis" />&lt;h3 id="目录">目录
&lt;/h3>&lt;ul>
&lt;li>一些问题处理&lt;/li>
&lt;/ul>
&lt;p>&lt;a class="link" href="#Redis%e6%9c%aa%e6%8e%88%e6%9d%83%e8%ae%bf%e9%97%ae%e6%bc%8f%e6%b4%9e%e5%a4%84%e7%90%86" >Redis未授权访问漏洞处理&lt;/a>
&lt;a class="link" href="#%e6%9c%ac%e5%9c%b0mac%e4%b8%8a_%e8%bf%90%e8%a1%8c%e4%b8%80%e4%b8%aaredis%e5%ae%b9%e5%99%a8_%e7%84%b6%e5%90%8e%e6%83%b3%e8%a6%81%e5%9c%a8%e5%8f%a6%e4%b8%80%e4%b8%aa%e5%ae%b9%e5%99%a8%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%bf%99%e4%b8%aaredis%e6%80%8e%e4%b9%88%e5%81%9a" >本地mac上_运行一个redis容器_然后想要在另一个容器中使用这个redis怎么做&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Redis 常用命令总结（适用于 apt install redis/redis-server 安装的场景，包括容器内）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">```&lt;/span>bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 最简单直接启动（前台运行，用于测试）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 使用配置文件后台启动（推荐方式）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-server /etc/redis/redis.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 带常用参数直接启动（不依赖配置文件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-server --port &lt;span class="m">6379&lt;/span> --daemonize yes --protected-mode no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 检查 Redis 是否正常运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli ping &lt;span class="c1"># 返回 PONG 表示成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli -p &lt;span class="m">6379&lt;/span> ping
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. 优雅停止 Redis（强烈推荐，会自动保存数据）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli shutdown &lt;span class="c1"># 默认执行 SAVE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli -p &lt;span class="m">6379&lt;/span> shutdown
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 6. 不保存数据直接停止&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli shutdown nosave
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 7. 强制杀死进程（不推荐，可能丢数据）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">kill&lt;/span> -9 &lt;span class="k">$(&lt;/span>pidof redis-server&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pkill -9 redis-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 8. 重启 Redis&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">redis-cli shutdown &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> redis-server /etc/redis/redis.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 9. 使用 service 管理（你在容器里通过 apt 安装后直接可用！）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis-server start &lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis-server stop &lt;span class="c1"># 停止&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis-server restart &lt;span class="c1"># 重启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis-server status &lt;span class="c1"># 查看状态&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 10. 等价的更短写法（很多系统都支持）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service redis status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 11. 直接调用 init 脚本（永远有效）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/etc/init.d/redis-server start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/etc/init.d/redis-server stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/etc/init.d/redis-server restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/etc/init.d/redis-server status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 12. 查看进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ps aux &lt;span class="p">|&lt;/span> grep redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pgrep -fl redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="什么是-redis">什么是 Redis？
&lt;/h3>&lt;p>Redis (Remote Dictionary Server) 是一个开源的、使用 C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库，并提供多种语言的 API。&lt;/p>
&lt;p>它通常被称为“数据结构服务器”，因为值（value）可以是字符串 (String)、哈希 (Hash)、列表 (List)、集合 (Set) 和有序集合 (Sorted Set) 等类型。&lt;/p>
&lt;p>&lt;strong>Redis 的主要特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>速度快：&lt;/strong> 数据存储在内存中，读写速度非常快。&lt;/li>
&lt;li>&lt;strong>数据类型丰富：&lt;/strong> 支持多种复杂的数据结构。&lt;/li>
&lt;li>&lt;strong>持久化：&lt;/strong> 可以将内存中的数据保存到磁盘中，重启时可以再次加载进行使用。&lt;/li>
&lt;li>&lt;strong>原子性：&lt;/strong> Redis 的所有操作都是原子性的，要么执行成功，要么执行失败，不会出现中间状态。&lt;/li>
&lt;li>&lt;strong>丰富的特性：&lt;/strong> 支持发布/订阅、事务、Lua 脚本等功能。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>常见应用场景：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>缓存：&lt;/strong> 这是 Redis 最常见的用途，用于缓存数据库查询结果、网页、或任何可以被缓存的数据，以减轻数据库压力。&lt;/li>
&lt;li>&lt;strong>计数器：&lt;/strong> 利用 Redis 原子性的 &lt;code>INCR&lt;/code> 命令可以轻松实现高并发的计数功能，例如文章阅读量、点赞数。&lt;/li>
&lt;li>&lt;strong>会话存储：&lt;/strong> 存储用户的会话信息（Session），实现分布式系统的会话共享。&lt;/li>
&lt;li>&lt;strong>排行榜：&lt;/strong> 使用有序集合（Sorted Set）可以轻松实现实时更新的排行榜。&lt;/li>
&lt;li>&lt;strong>消息队列：&lt;/strong> 使用列表（List）的 &lt;code>LPUSH&lt;/code> 和 &lt;code>RPOP&lt;/code> 命令可以实现简单的消息队列。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>第一步：安装 Redis&lt;/p>
&lt;p>你可以通过以下几种方式安装 Redis：&lt;/p>
&lt;p>1. 在 Linux (Ubuntu/Debian) 上安装&lt;/p>
&lt;p>使用包管理器是最简单的方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install redis-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装完成后，Redis 服务会自动启动。你可以使用以下命令检查服务状态：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status redis-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>使用 Docker 安装 (推荐，跨平台)&lt;/li>
&lt;/ol>
&lt;p>如果你安装了 Docker，这是最简单且最干净的安装方式，适用于任何操作系统。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run --name my-redis -p 6379:6379 -d redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个命令会从 Docker Hub 下载最新的 Redis 镜像，并在后台运行一个名为 &lt;code>my-redis&lt;/code> 的容器，将容器的 6379 端口映射到你主机的 6379 端口。&lt;/p>
&lt;p>如果你在一个docker内开发，另一个docker容器安装redis&lt;/p>
&lt;p>&lt;a class="link" href="#%e6%9c%ac%e5%9c%b0mac%e4%b8%8a_%e8%bf%90%e8%a1%8c%e4%b8%80%e4%b8%aaredis%e5%ae%b9%e5%99%a8_%e7%84%b6%e5%90%8e%e6%83%b3%e8%a6%81%e5%9c%a8%e5%8f%a6%e4%b8%80%e4%b8%aa%e5%ae%b9%e5%99%a8%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%bf%99%e4%b8%aaredis%e6%80%8e%e4%b9%88%e5%81%9a" >本地mac上_运行一个redis容器_然后想要在另一个容器中使用这个redis怎么做&lt;/a>&lt;/p>
&lt;hr>
&lt;p>第二步：连接到 Redis&lt;/p>
&lt;p>安装并启动 Redis 后，你可以使用 &lt;code>redis-cli&lt;/code> (Redis Command Line Interface) 连接到它。&lt;/p>
&lt;p>如果你是直接在系统上安装的 Redis，直接在终端输入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">redis-cli
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你是通过 Docker 安装的，你需要进入到容器内部：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it my-redis redis-cli
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>连接成功后，你会看到类似下面的提示符：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>现在，你可以开始输入 Redis 命令了。&lt;/p>
&lt;p>&lt;strong>测试连接：&lt;/strong>&lt;/p>
&lt;p>输入 &lt;code>PING&lt;/code> 命令，如果服务器正常运行，它会返回 &lt;code>PONG&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; PING
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PONG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你的redis是安装在另外一个容器，使用如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 进入你的应用容器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it &amp;lt;你的应用容器名&amp;gt; bash &lt;span class="c1"># 或者 sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 在容器内部，更新包列表并安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">root@&amp;lt;container-id&amp;gt;:/# apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">root@&amp;lt;container-id&amp;gt;:/# apt-get install redis-tools -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 现在你可以使用了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">root@&amp;lt;container-id&amp;gt;:/# redis-cli -h my-redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">my-redis:6379&amp;gt; PING
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PONG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>第三步：学习基本命令和数据结构&lt;/p>
&lt;p>Redis 是一个 Key-Value 数据库。每个 Key 都有一个与之关联的 Value。下面是 Redis 最核心的五种数据结构及其常用命令。&lt;/p>
&lt;ol>
&lt;li>字符串 (String)&lt;/li>
&lt;/ol>
&lt;p>这是最基本的数据类型，一个 key 对应一个 value。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>SET key value&lt;/code>&lt;/strong>: 设置一个键值对。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SET username &amp;#34;gemini&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OK
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>GET key&lt;/code>&lt;/strong>: 获取一个键的值。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; GET username
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;gemini&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>DEL key&lt;/code>&lt;/strong>: 删除一个键。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; DEL username
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>INCR key&lt;/code>&lt;/strong>: 将 key 中储存的数字值增一（如果 key 不存在，则初始化为 0 再执行 INCR 操作）。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SET page_views 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; INCR page_views
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 101
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>2. 哈希 (Hash)&lt;/p>
&lt;p>Hash 是一个 string 类型的 field 和 value 的映射表，它非常适合用于存储对象。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>HSET key field value&lt;/code>&lt;/strong>: 将哈希表 key 中的字段 field 的值设为 value。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; HSET user:1 name &amp;#34;Alice&amp;#34; age 25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>HGET key field&lt;/code>&lt;/strong>: 获取哈希表 key 中给定字段 field 的值。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; HGET user:1 name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;Alice&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>HGETALL key&lt;/code>&lt;/strong>: 获取在哈希表中指定 key 的所有字段和值。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; HGETALL user:1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;name&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;Alice&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;age&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4) &amp;#34;25&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>HDEL key field&lt;/code>&lt;/strong>: 删除哈希表 key 中的一个或多个指定字段。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; HDEL user:1 age
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>3. 列表 (List)&lt;/p>
&lt;p>List 是简单的字符串列表，按照插入顺序排序。你可以添加一个元素到列表的头部（左边）或者尾部（右边）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>LPUSH key element [element ...]&lt;/code>&lt;/strong>: 将一个或多个值插入到列表头部。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; LPUSH tasks &amp;#34;task1&amp;#34; &amp;#34;task2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>RPUSH key element [element ...]&lt;/code>&lt;/strong>: 将一个或多个值插入到列表尾部。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; RPUSH tasks &amp;#34;task3&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>LRANGE key start stop&lt;/code>&lt;/strong>: 获取列表指定范围内的元素。(&lt;code>0&lt;/code> 是第一个元素, &lt;code>-1&lt;/code> 是最后一个元素)。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; LRANGE tasks 0 -1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;task2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;task1&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;task3&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>LPOP key&lt;/code>&lt;/strong>: 移出并获取列表的第一个元素。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; LPOP tasks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;task2&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>RPOP key&lt;/code>&lt;/strong>: 移出并获取列表的最后一个元素。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; RPOP tasks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;task3&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>4. 集合 (Set)&lt;/p>
&lt;p>Set 是 String 类型的无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>SADD key member [member ...]&lt;/code>&lt;/strong>: 向集合添加一个或多个成员。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SADD tags &amp;#34;database&amp;#34; &amp;#34;nosql&amp;#34; &amp;#34;redis&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>SMEMBERS key&lt;/code>&lt;/strong>: 返回集合中的所有成员。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SMEMBERS tags
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;redis&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;nosql&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;database&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>SISMEMBER key member&lt;/code>&lt;/strong>: 判断 member 元素是否是集合 key 的成员。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SISMEMBER tags &amp;#34;redis&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SISMEMBER tags &amp;#34;mysql&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>SREM key member [member ...]&lt;/code>&lt;/strong>: 移除集合中一个或多个成员。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SREM tags &amp;#34;nosql&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>5. 有序集合 (Sorted Set / ZSET)&lt;/p>
&lt;p>和 Set 一样，Sorted Set 也是 string 类型元素的集合，且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数（score）。Redis 正是通过分数来为集合中的成员进行从小到大的排序。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>ZADD key score member [score member ...]&lt;/code>&lt;/strong>: 向有序集合添加一个或多个成员，或者更新已存在成员的分数。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; ZADD leaderboard 100 &amp;#34;player1&amp;#34; 250 &amp;#34;player2&amp;#34; 50 &amp;#34;player3&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>ZRANGE key start stop [WITHSCORES]&lt;/code>&lt;/strong>: 通过索引区间返回有序集合成指定区间内的成员（按分数从小到大）。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; ZRANGE leaderboard 0 -1 WITHSCORES
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;player3&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;50&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;player1&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4) &amp;#34;100&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5) &amp;#34;player2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">6) &amp;#34;250&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>ZREVRANGE key start stop [WITHSCORES]&lt;/code>&lt;/strong>: 返回有序集中指定区间内的成员，通过索引，分数从高到低。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; ZREVRANGE leaderboard 0 1 WITHSCORES
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;player2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;250&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;player1&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4) &amp;#34;100&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>ZREM key member [member ...]&lt;/code>&lt;/strong>: 移除有序集合中的一个或多个成员。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; ZREM leaderboard &amp;#34;player3&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>第四步：一些通用的重要命令&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>KEYS pattern&lt;/code>&lt;/strong>: 查找所有符合给定模式的 key。&lt;strong>注意：&lt;/strong> 在生产环境中要慎用，因为它会遍历所有的键，可能会阻塞服务器。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; KEYS *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1) &amp;#34;tasks&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2) &amp;#34;user:1&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3) &amp;#34;page_views&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>EXPIRE key seconds&lt;/code>&lt;/strong>: 为给定的 key 设置过期时间，以秒计。当 key 过期后，它会被自动删除。这对于实现缓存非常有用。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; SET cache_data &amp;#34;some important data&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; EXPIRE cache_data 60 // 60秒后过期
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>TTL key&lt;/code>&lt;/strong>: 以秒为单位，返回给定 key 的剩余生存时间 (Time To Live)。
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">127.0.0.1:6379&amp;gt; TTL cache_data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(integer) 55 // (还剩55秒)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>&lt;code>FLUSHDB&lt;/code>&lt;/strong>: 删除当前数据库里的所有数据。&lt;strong>极度危险，请谨慎使用！&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;code>FLUSHALL&lt;/code>&lt;/strong>: 删除所有数据库里的所有数据。&lt;strong>极度危险，请谨慎使用！&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>第五步：在你的代码中使用 Redis&lt;/p>
&lt;p>&lt;code>redis-cli&lt;/code> 是一个很好的学习和调试工具，但在实际应用中，你需要在你的编程语言中通过 Redis 客户端库来连接和操作 Redis。&lt;/p>
&lt;p>几乎所有主流语言都有成熟的 Redis 客户端库。例如：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Python&lt;/strong>: &lt;code>redis-py&lt;/code>&lt;/li>
&lt;li>&lt;strong>Java&lt;/strong>: &lt;code>Jedis&lt;/code>, &lt;code>Lettuce&lt;/code>&lt;/li>
&lt;li>&lt;strong>Node.js&lt;/strong>: &lt;code>node-redis&lt;/code>, &lt;code>ioredis&lt;/code>&lt;/li>
&lt;li>&lt;strong>Go&lt;/strong>: &lt;code>go-redis&lt;/code>&lt;/li>
&lt;li>&lt;strong>PHP&lt;/strong>: &lt;code>phpredis&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Python 示例 (&lt;code>redis-py&lt;/code>)&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>安装库:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>连接和使用:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">redis&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 连接到本地 Redis 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">redis&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Redis&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">host&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">6379&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">decode_responses&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;foo&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;bar&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;foo&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="c1"># 输出: bar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Hash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;user-session:123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mapping&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;name&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;John&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;surname&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Smith&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;company&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Redis&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;age&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">29&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hgetall&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;user-session:123&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>总结和后续学习&lt;/p>
&lt;p>恭喜你！你已经完成了 Redis 的入门。你现在应该知道如何安装、连接 Redis，并使用其核心数据结构进行基本操作。&lt;/p>
&lt;p>&lt;strong>下一步可以学习：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Redis 持久化：&lt;/strong> 了解 RDB 和 AOF 两种持久化方式的区别和配置。&lt;/li>
&lt;li>&lt;strong>Redis 事务：&lt;/strong> 学习 &lt;code>MULTI&lt;/code> 和 &lt;code>EXEC&lt;/code> 命令来执行一组原子操作。&lt;/li>
&lt;li>&lt;strong>发布/订阅 (Pub/Sub)：&lt;/strong> 探索 Redis 的消息发布和订阅功能。&lt;/li>
&lt;li>&lt;strong>Redis 安全：&lt;/strong> 学习如何为 Redis 设置密码和配置安全的网络访问。&lt;/li>
&lt;li>&lt;strong>Redis 集群：&lt;/strong> 了解主从复制 (Replication)、哨兵 (Sentinel) 和集群 (Cluster) 模式以实现高可用和扩展性。&lt;/li>
&lt;/ul>
&lt;h3 id="一些操作">一些操作
&lt;/h3>&lt;h4 id="redis未授权访问漏洞处理">Redis未授权访问漏洞处理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">漏洞描述：Redis 未授权访问漏洞
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis 未授权访问漏洞是一个非常严重的安全问题，它通常是因为 Redis 服务器直接暴露在公网或内网中，并且**没有配置密码认证**导致的。攻击者可以利用这个漏洞读取、修改甚至删除数据，更严重的情况下，可以利用 Redis 的一些特性（如写入 &lt;span class="sb">`authorized_keys`&lt;/span> 或计划任务文件）来获取服务器的控制权。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">以下是处理和防御 Redis 未授权访问漏洞的主要步骤和措施：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### 1\. 启用密码认证（最重要）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">在 Redis 配置文件中设置一个**强密码**，启用认证功能。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">*&lt;/span> **修改配置文件：** 找到 &lt;span class="sb">`redis.conf`&lt;/span> 文件（通常在 &lt;span class="sb">`/etc/redis/`&lt;/span> 或 &lt;span class="sb">`/etc/redis/redis.conf`&lt;/span>）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">*&lt;/span> **设置密码：** 找到或添加 &lt;span class="sb">`requirepass`&lt;/span> 这一行，并设置一个复杂的密码。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ``&lt;span class="sb">`conf
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> requirepass yourStrongPasswordHere
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> *记得替换 `&lt;/span>yourStrongPasswordHere&lt;span class="sb">` 为你设置的实际密码。*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **重启 Redis：** 更改配置后，需要重启 Redis 服务使其生效。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> # 例如：
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> sudo systemctl restart redis
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> # 或者
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> sudo service redis-server restart
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **验证：** 使用 `&lt;/span>redis-cli&lt;span class="sb">` 连接后，尝试执行命令，会提示需要认证。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> redis-cli
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> &amp;gt; PING
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> (error) NOAUTH Authentication required.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> &amp;gt; AUTH yourStrongPasswordHere
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> OK
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> &amp;gt; PING
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> PONG
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">### 2\. 限制网络访问（网络隔离）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">Redis 本身的设计是运行在受信任的环境中，因此不应该直接暴露给公网。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **绑定本地或私有 IP：** 仅允许 Redis 监听应用的服务器 IP 或本地回环地址（`&lt;/span>127.0.0.1&lt;span class="sb">`）。在 `&lt;/span>redis.conf&lt;span class="sb">` 中修改 `&lt;/span>bind&lt;span class="sb">` 选项：
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **仅允许本地访问：**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`conf
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> bind 127.0.0.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **允许特定内网 IP 访问：** 绑定内网 IP 地址。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`conf
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> bind 127.0.0.1 192.168.1.100 # 替换为你的应用服务器IP
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **配置防火墙：** 使用防火墙（如 `&lt;/span>iptables&lt;span class="sb">`, `&lt;/span>ufw&lt;span class="sb">`, 安全组等）限制对 Redis 端口（默认是 6379）的访问，**只允许**信任的应用服务器 IP 地址连接。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **网络分段：** 将 Redis 服务器放在一个独立的、只有应用服务器能访问的私有网络段中。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">### 3\. 启用保护模式（Protected Mode）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">Redis 3.2.0 及更高版本引入了保护模式（Protected Mode）。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **检查配置：** 在 `&lt;/span>redis.conf&lt;span class="sb">` 中确保 `&lt;/span>protected-mode&lt;span class="sb">` 设置为 `&lt;/span>yes&lt;span class="sb">`。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`conf
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> protected-mode yes
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> *在默认配置下，如果 Redis 没有设置密码且绑定了非本地回环地址，保护模式会自动开启，阻止外部连接，仅响应本地回环地址（`&lt;/span>127.0.0.1&lt;span class="sb">`）的请求。*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">### 4\. 禁用或重命名危险命令
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">为了防止攻击者利用 Redis 的配置命令进行恶意操作（如写入 `&lt;/span>authorized_keys&lt;span class="sb">`），可以考虑禁用或重命名一些高风险命令。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * **禁用或重命名 `&lt;/span>CONFIG&lt;span class="sb">` 命令：** 在 `&lt;/span>redis.conf&lt;span class="sb">` 中添加：
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`conf
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> # 禁用 CONFIG 命令
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> rename-command CONFIG &amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> # 或者重命名（推荐，防止应用端需要用到）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> rename-command CONFIG aRandomStringForConfig
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> `&lt;/span>`&lt;span class="sb">`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb"> * 其他高危命令如 `&lt;/span>FLUSHALL&lt;span class="sb">`、`&lt;/span>FLUSHDB&lt;span class="sb">`、`&lt;/span>SAVE&lt;span class="sb">`、`&lt;/span>BGSAVE&lt;span class="sb">` 也可以根据需要进行限制。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">### 5\. 使用低权限用户运行 Redis
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">不要使用 `&lt;/span>root&lt;span class="sb">` 用户运行 Redis 服务。创建一个专门的低权限用户来运行 Redis 进程，即使被攻击者攻破，也能限制其在系统上的权限。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">### 总结加固：
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">1. **设置强密码（`&lt;/span>requirepass&lt;span class="sb">`）。**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">2. **限制网络访问（`&lt;/span>bind&lt;span class="sb">` 和防火墙）。**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">3. **确保 `&lt;/span>protected-mode yes&lt;span class="sb">`。**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">4. **禁用或重命名高危命令（`&lt;/span>CONFIG`）。**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">5.&lt;/span> &lt;span class="gs">**使用低权限用户运行。**&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="本地mac上_运行一个redis容器_然后想要在另一个容器中使用这个redis怎么做">本地mac上_运行一个redis容器_然后想要在另一个容器中使用这个redis怎么做
&lt;/h4>&lt;p>在 Mac 本地上，要让一个容器（应用容器）连接到另一个容器（Redis 容器），最推荐和最现代的方法是使用&lt;strong>自定义的 Docker 网络&lt;/strong>。&lt;/p>
&lt;p>这能确保容器之间可以通过一个稳定且易于记的主机名（即你的 Redis 容器名）进行通信，而不需要关心动态变化的 IP 地址。&lt;/p>
&lt;p>这里是详细的步骤，分为两种主要方法：&lt;/p>
&lt;ul>
&lt;li>方法一：使用 Docker CLI 命令（推荐）&lt;/li>
&lt;/ul>
&lt;p>这是最基础和最清晰的方法，分为三步：&lt;/p>
&lt;p>1. 创建一个自定义的 Docker 网络&lt;/p>
&lt;p>首先，创建一个新的“桥接”网络。所有需要相互通信的容器都应该连接到这个网络。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker network create my-app-network
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>my-app-network&lt;/code> 是你给这个网络起的名字，可以自定义。&lt;/li>
&lt;/ul>
&lt;p>2. 启动 Redis 容器并连接到该网络&lt;/p>
&lt;p>在运行 Redis 容器时，使用 &lt;code>--network&lt;/code> 参数指定它加入你刚创建的网络。同时，使用 &lt;code>--name&lt;/code> 给它一个固定的名字（例如 &lt;code>my-redis&lt;/code>），这个名字将作为它在网络内部的主机名。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run -d &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name my-redis &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network my-app-network &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>-d&lt;/code>：在后台运行。&lt;/li>
&lt;li>&lt;code>--name my-redis&lt;/code>：将容器命名为 &lt;code>my-redis&lt;/code>。&lt;/li>
&lt;li>&lt;code>--network my-app-network&lt;/code>：将其连接到 &lt;code>my-app-network&lt;/code>。&lt;/li>
&lt;li>&lt;strong>注意&lt;/strong>：我在这里&lt;strong>没有&lt;/strong>使用 &lt;code>-p 6379:6379&lt;/code>。因为你的应用容器在同一个网络中，它可以直接通过 &lt;code>6379&lt;/code> 端口访问 Redis。只有当你需要从 Mac &lt;em>主机&lt;/em>（例如通过 &lt;code>redis-cli&lt;/code> 或桌面 GUI）访问这个 Redis 时，才需要添加 &lt;code>-p 6379:6379&lt;/code> 来将端口暴露给主机。&lt;/li>
&lt;/ul>
&lt;p>3. 启动你的应用容器并连接到同一网络&lt;/p>
&lt;p>现在，启动你的第二个容器（例如一个 Node.js、Python 或 Java 应用），并同样将它连接到 &lt;code>my-app-network&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run -it &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network my-app-network &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &amp;lt;你的应用镜像名&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>4. 在应用中连接 Redis&lt;/p>
&lt;p>在你的应用代码中，连接 Redis 的主机地址&lt;strong>不再是 &lt;code>localhost&lt;/code> 或 &lt;code>127.0.0.1&lt;/code>&lt;/strong>，而是你在第二步中为 Redis 容器设置的名字：&lt;code>my-redis&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Redis 连接字符串示例&lt;/strong>：&lt;code>redis://my-redis:6379&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Docker 会自动将 &lt;code>my-redis&lt;/code> 这个主机名解析为 Redis 容器在 &lt;code>my-app-network&lt;/code> 网络中的内部 IP 地址。&lt;/p>
&lt;hr>
&lt;ul>
&lt;li>方法二：使用 Docker Compose（更简单的多容器管理）&lt;/li>
&lt;/ul>
&lt;p>如果你需要同时管理 Redis 和你的应用两个（或更多）容器，使用 &lt;code>docker-compose&lt;/code> 是一个更简单、更可维护的方法。它会自动为你创建和管理网络。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>在你的项目根目录创建一个 &lt;code>docker-compose.yml&lt;/code> 文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在该文件中定义你的两个服务（&lt;code>app&lt;/code> 和 &lt;code>redis&lt;/code>）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3.8&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 使用一个较新的版本&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 你的应用程序服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">. &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 假设你的 Dockerfile 在当前目录&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 或者使用 image: &amp;lt;你的应用镜像名&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;8080:80&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 举例：将你应用的80端口映射到主机的8080&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 关键：在这里注入 Redis 的主机名&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">REDIS_HOST=my-redis&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">REDIS_PORT=6379&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 确保你的应用在 redis 启动后再启动&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">depends_on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">my-redis&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 你的 Redis 服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">my-redis&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 服务的名字&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">redis&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 你可以保留这个名字，也可以不写&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">my-redis-container&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 如果需要从主机访问，取消下面这行的注释&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># ports:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># - &amp;#34;6379:6379&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Docker Compose 会自动创建一个默认网络&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 并将 app 和 my-redis 两个服务都加入其中&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>在 &lt;code>docker-compose.yml&lt;/code> 文件所在的目录中，运行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker-compose up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Docker Compose 会自动完成所有操作：&lt;/p>
&lt;ol>
&lt;li>创建一个名为 &lt;code>项目目录名_default&lt;/code> 的网络。&lt;/li>
&lt;li>启动名为 &lt;code>my-redis&lt;/code> 的 Redis 服务。&lt;/li>
&lt;li>启动你的 &lt;code>app&lt;/code> 服务。&lt;/li>
&lt;li>在 &lt;code>app&lt;/code> 容器内部，可以直接使用主机名 &lt;code>my-redis&lt;/code>（即 &lt;code>services:&lt;/code> 下定义的服务名）来连接到 Redis。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;ul>
&lt;li>补充：连接到 Mac &lt;em>主机&lt;/em> 上的 Redis&lt;/li>
&lt;/ul>
&lt;p>如果你的意思是 Redis &lt;strong>没有&lt;/strong>运行在容器里，而是&lt;strong>直接安装在你的 Mac 电脑上&lt;/strong>，而你想从一个 Docker 容器里去连接它，那么情况有所不同。&lt;/p>
&lt;p>在这种情况下，你不能使用 &lt;code>localhost&lt;/code>（因为 &lt;code>localhost&lt;/code> 在容器内部指的是容器自己）。你需要使用一个特殊的 DNS 名称：&lt;code>host.docker.internal&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>连接地址&lt;/strong>：&lt;code>host.docker.internal:6379&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;code>host.docker.internal&lt;/code> 是 Docker for Mac 提供的一个特殊地址，它会解析为你 Mac 主机的 IP 地址。&lt;/p></description></item><item><title>Server Probe</title><link>https://www.zata.cc/p/server-probe/</link><pubDate>Thu, 25 Sep 2025 11:52:44 +0800</pubDate><guid>https://www.zata.cc/p/server-probe/</guid><description>&lt;img src="https://www.zata.cc/p/server-probe/images/index/index.png" alt="Featured image of post Server Probe" />&lt;p>这是一种在IT运维和网站管理中非常常见的工具，对于了解和维护服务器的健康状态至关重要。&lt;/p>
&lt;h3 id="一什么是服务器探针">一、什么是服务器探针？
&lt;/h3>&lt;p>服务器探针，可以理解为安装在服务器上的一个“眼睛”或“健康监测器”。它本质上是一个软件程序或脚本，部署在你的服务器上，用于实时地、自动化地收集服务器的各种状态信息和性能数据。&lt;/p>
&lt;p>这些探针收集到的数据，通常会以一个直观的、可视化的网页界面呈现出来，让服务器管理员（即使是不懂复杂命令行的用户）也能一目了然地了解服务器的当前运行状况。&lt;/p>
&lt;p>你可以把它想象成汽车的仪表盘。仪表盘显示了车速、油量、发动机转速、水温等关键信息，让你知道汽车是否在正常运行。服务器探针就扮演着同样的角色，只不过它监测的是服务器的CPU、内存、硬盘、网络等核心资源。&lt;/p>
&lt;h3 id="二为什么需要服务器探针">二、为什么需要服务器探针？
&lt;/h3>&lt;p>如果没有探针，管理员想要了解服务器状态，就必须登录到服务器后台，手动敲击各种Linux或Windows命令（如 &lt;code>top&lt;/code>, &lt;code>free&lt;/code>, &lt;code>df&lt;/code>, &lt;code>netstat&lt;/code> 等）来查看零散的信息。这个过程非常繁琐、低效，而且不直观。&lt;/p>
&lt;p>服务器探针解决了以下几个核心痛点：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>数据可视化与集中管理&lt;/strong>：将复杂、抽象的命令行数据转换成图表、百分比等易于理解的图形界面，方便快速诊断问题。如果你有多台服务器，探针可以将它们的状态集中到一个面板上进行监控。&lt;/li>
&lt;li>&lt;strong>实时监控与性能分析&lt;/strong>：7x24小时不间断地监控服务器的各项指标。通过观察数据的历史趋势，可以分析服务器的性能瓶颈，例如，是在每天的某个固定时间段CPU负载过高，还是内存占用持续不下。&lt;/li>
&lt;li>&lt;strong>故障预警与快速定位&lt;/strong>：可以设置阈值报警。例如，当CPU使用率连续5分钟超过90%时，或者当硬盘空间低于10%时，探针可以通过邮件、短信或即时通讯工具（如钉钉、Telegram）发送警报。这使得管理员能在问题恶化、影响业务之前就介入处理。&lt;/li>
&lt;li>&lt;strong>降低技术门槛&lt;/strong>：让不熟悉服务器命令的网站开发者或初级运维人员也能轻松掌握服务器的运行状态，进行一些基础的判断。&lt;/li>
&lt;/ol>
&lt;h3 id="三服务器探针主要监测哪些核心指标">三、服务器探针主要监测哪些核心指标？
&lt;/h3>&lt;p>一个功能完善的服务器探针通常会监测以下几类关键数据：&lt;/p>
&lt;p>&lt;strong>1. 系统核心资源 (Hardware &amp;amp; OS)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>CPU 使用率 (CPU Usage)&lt;/strong>：显示当前CPU的负载情况，包括单核和多核的使用率、用户使用、系统使用、空闲比例等。CPU负载过高是导致服务器响应缓慢的最常见原因。&lt;/li>
&lt;li>&lt;strong>内存使用情况 (Memory Usage)&lt;/strong>：显示物理内存（RAM）和交换内存（Swap）的总量、已用量、剩余量。内存耗尽会导致系统运行缓慢甚至崩溃。&lt;/li>
&lt;li>&lt;strong>硬盘空间与I/O (Disk Space &amp;amp; I/O)&lt;/strong>：监测硬盘的分区、总容量、已用空间和可用空间。同时，也会监测硬盘的读写速度（I/O），这是衡量数据存取性能的关键。&lt;/li>
&lt;li>&lt;strong>系统负载 (System Load)&lt;/strong>：通常用 &lt;code>Load Average&lt;/code> 表示，它是一个衡量系统繁忙程度的指标，分别显示过去1分钟、5分钟和15分钟的平均负载。如果这个数值持续高于CPU核心数，说明系统处于超负荷状态。&lt;/li>
&lt;li>&lt;strong>在线时长 (Uptime)&lt;/strong>：服务器从上次开机或重启后，连续运行了多长时间。这是衡量服务器稳定性的一个重要指标。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 网络状态 (Network Status)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>实时网速 (Real-time Network Speed)&lt;/strong>：显示服务器当前的上行和下行带宽速度，单位通常是 Mbps 或 MB/s。&lt;/li>
&lt;li>&lt;strong>总流量统计 (Total Traffic Data)&lt;/strong>：统计自开机以来或过去一段时间内（如月度）的总流出和流入流量。这对于管理服务器的带宽成本非常重要。&lt;/li>
&lt;li>&lt;strong>网络连接信息 (Network Connections)&lt;/strong>：显示当前服务器上有哪些网络连接（TCP/UDP），以及它们的来源IP和端口，有助于排查网络攻击或异常连接。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. 软件与服务环境 (Software &amp;amp; Services)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>操作系统信息&lt;/strong>：显示操作系统的名称、版本、内核版本等。&lt;/li>
&lt;li>&lt;strong>服务器软件&lt;/strong>：显示Web服务器软件（如 Nginx, Apache）、数据库（如 MySQL, PostgreSQL）和编程语言环境（如 PHP, Python, Java）的版本信息。&lt;/li>
&lt;li>&lt;strong>进程管理 (Process Management)&lt;/strong>：可以列出当前正在运行的进程，以及它们对CPU和内存的占用情况，方便找出消耗资源最多的“罪魁祸首”。&lt;/li>
&lt;/ul>
&lt;h3 id="四常见的服务器探针类型与产品">四、常见的服务器探针类型与产品
&lt;/h3>&lt;p>服务器探针主要分为两类：&lt;/p>
&lt;p>&lt;strong>1. 开源轻量级探针 (脚本类)&lt;/strong>&lt;/p>
&lt;p>这类探针通常是一个或一组脚本文件（如PHP、Python、Shell脚本），部署简单，资源占用极小，功能聚焦于核心指标的展示。非常适合个人开发者和中小型网站使用。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>代表产品&lt;/strong>：
&lt;ul>
&lt;li>
&lt;p>&lt;strong>ServerStatus (服盘)&lt;/strong>：一个优秀的开源项目，采用客户端/服务器模式，可以在一个主控端网页上集中监控多台服务器的状态，界面美观，支持状态预警。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>雅黑探针 / an Eris Prober&lt;/strong>：非常经典的PHP探针，界面简洁，上传一个PHP文件即可使用，流传甚广。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>哪吒监控 (Nezha Monitor)&lt;/strong>：功能强大的开源监控面板，同样支持多服务器、多地点监控，并且集成了报警和后台管理功能，是目前非常受欢迎的选项。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 商业化/企业级监控系统&lt;/strong>&lt;/p>
&lt;p>这类系统功能极为强大和全面，不仅限于基础的探针监测，还包括了日志分析、应用性能监控（APM）、故障告警、自动化运维等复杂功能，适用于大型企业和对稳定性要求极高的业务。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>代表产品&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>Zabbix&lt;/strong>：非常强大和灵活的开源企业级监控解决方案，但配置和部署相对复杂。&lt;/li>
&lt;li>&lt;strong>Prometheus + Grafana&lt;/strong>：这是一对黄金组合。Prometheus负责收集和存储时序数据，Grafana负责将数据进行可视化展示。这是云原生时代最主流的监控方案之一。&lt;/li>
&lt;li>&lt;strong>Datadog / New Relic&lt;/strong>：商业SaaS监控服务，开箱即用，功能强大，UI精美，但价格昂贵。&lt;/li>
&lt;li>&lt;strong>云厂商自带监控&lt;/strong>：阿里云的“云监控”、腾讯云的“云监控”等，如果你使用它们的云服务器，这些自带的监控工具通常是首选，因为它们与云平台生态结合得最好。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="总结">总结
&lt;/h3>&lt;p>总而言之，服务器探针是一个连接“服务器物理状态”与“管理员”之间的桥梁。它将冰冷、复杂的后台数据，翻译成直观、易懂的图文信息，极大地简化了服务器的管理和维护工作。&lt;/p>
&lt;ul>
&lt;li>对于&lt;strong>个人站长或开发者&lt;/strong>来说，一个轻量级的开源探针（如哪吒监控、ServerStatus）就足以满足日常需求。&lt;/li>
&lt;li>对于&lt;strong>中大型企业&lt;/strong>来说，则需要部署更专业、更全面的监控系统（如Zabbix, Prometheus），以确保业务的高可用性和稳定性。&lt;/li>
&lt;/ul>
&lt;p>选择合适的服务器探针，是保障线上服务稳定运行的第一步，也是运维工作中不可或缺的一环。&lt;/p></description></item><item><title>bash命令使用教程</title><link>https://www.zata.cc/p/bash%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Fri, 18 Jul 2025 17:41:56 +0800</pubDate><guid>https://www.zata.cc/p/bash%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/bash%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post bash命令使用教程" />&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 常用 BASH 命令精简版&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ==================================&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">all_proxy&lt;/span>&lt;span class="o">=&lt;/span>socks5h://127.0.0.1:7898 &lt;span class="c1"># 设置全局代理，包括 wget, curl 等&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 文件和目录管理 (File &amp;amp; Directory Management) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls -l &lt;span class="c1"># 以长格式列出文件和目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /path/to/dir &lt;span class="c1"># 切换目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">pwd&lt;/span> &lt;span class="c1"># 显示当前工作目录路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir new_dir &lt;span class="c1"># 创建新目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm file.txt &lt;span class="c1"># 删除文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -r old_dir &lt;span class="c1"># 递归删除目录及其内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nb">source&lt;/span> dest &lt;span class="c1"># 复制文件或目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv old_name new_name &lt;span class="c1"># 移动或重命名文件/目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch file.txt &lt;span class="c1"># 创建空文件或更新时间戳&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find . -name &lt;span class="s2">&amp;#34;*.log&amp;#34;&lt;/span> &lt;span class="c1"># 在当前目录及子目录中查找.log文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat file.txt &lt;span class="c1"># 查看整个文件内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">less file.log &lt;span class="c1"># 分页查看文件内容 (按 &amp;#39;q&amp;#39; 退出)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">head -n &lt;span class="m">20&lt;/span> file.txt &lt;span class="c1"># 查看文件前20行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tail -n &lt;span class="m">20&lt;/span> file.txt &lt;span class="c1"># 查看文件后20行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tail -f file.log &lt;span class="c1"># 实时跟踪文件更新&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 文本处理 (Text Processing) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">grep &lt;span class="s2">&amp;#34;pattern&amp;#34;&lt;/span> file.log &lt;span class="c1"># 在文件中搜索模式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ps aux &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;nginx&amp;#34;&lt;/span> &lt;span class="c1"># 管道示例：查找nginx进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed &lt;span class="s1">&amp;#39;s/old/new/g&amp;#39;&lt;/span> file.txt &lt;span class="c1"># 替换文件中的文本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">awk &lt;span class="s1">&amp;#39;{print $1, $3}&amp;#39;&lt;/span> data.txt &lt;span class="c1"># 提取并打印指定列&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sort file.txt &lt;span class="p">|&lt;/span> uniq -c &lt;span class="c1"># 排序并统计不重复的行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wc -l file.txt &lt;span class="c1"># 计算文件的行数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 系统监控与进程管理 (System &amp;amp; Process Management) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ps aux &lt;span class="c1"># 显示所有用户的详细进程信&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">top &lt;span class="c1"># 动态显示进程活动 (按 &amp;#39;q&amp;#39; 退出)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">htop &lt;span class="c1"># 交互式进程查看器 (top的增强版)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">kill&lt;/span> &lt;span class="m">12345&lt;/span> &lt;span class="c1"># 终止指定PID的进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pkill &lt;span class="s2">&amp;#34;process_name&amp;#34;&lt;/span> &lt;span class="c1"># 根据名称终止进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">df -h &lt;span class="c1"># 显示磁盘空间使用情况 (人类可读格式)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">du -sh /path/to/dir &lt;span class="c1"># 显示指定目录的总大小&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">free -m &lt;span class="c1"># 显示内存使用情况 (以MB为单位)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uptime &lt;span class="c1"># 显示系统运行时间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 网络 (Networking) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ping google.com &lt;span class="c1"># 测试网络连通性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip addr show &lt;span class="c1"># 显示网络接口信息 (ifconfig的替代品)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ss -tuln &lt;span class="c1"># 显示监听中的TCP/UDP端口 (netstat的替代品)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -I http://example.com &lt;span class="c1"># 获取URL的HTTP头部信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget http://example.com/file.zip &lt;span class="c1"># 下载文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 权限管理 (Permissions) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x script.sh &lt;span class="c1"># 为脚本添加执行权限&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chown user:group file.txt &lt;span class="c1"># 更改文件所有者和组&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo &lt;span class="nb">command&lt;/span> &lt;span class="c1"># 以超级用户身份执行命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- 重定向 (Redirection) ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">command&lt;/span> &amp;gt; file.txt &lt;span class="c1"># 将输出重定向到文件 (覆盖)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">command&lt;/span> &amp;gt;&amp;gt; file.txt &lt;span class="c1"># 将输出追加到文件末尾&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">command&lt;/span> &amp;lt; file.txt &lt;span class="c1"># 将文件内容作为命令的输入&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">command&lt;/span> 2&amp;gt; error.log &lt;span class="c1"># 将标准错误重定向到文件&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="如何把文件夹里的所有文件移动到同级目录">如何把文件夹里的所有文件移动到同级目录
&lt;/h2>&lt;p>有时候我们想把一个文件夹（比如文件夹A）里的所有文件，移动到它的同级目录（也就是它的上一级目录）。可以按照下面的步骤操作：&lt;/p>
&lt;ol>
&lt;li>打开终端。&lt;/li>
&lt;li>进入文件夹A的上一级目录：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /路径/到/文件夹A的上一级目录
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>执行下面的命令，把文件夹A里的所有文件移动到当前目录：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mv 文件夹A/* .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>这里，&lt;code>文件夹A/*&lt;/code> 表示文件夹A里的所有文件，&lt;code>.&lt;/code> 表示当前目录。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>注意：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>这个命令只会移动文件夹A里的文件，不会移动隐藏文件（以.开头的文件）和子文件夹。&lt;/li>
&lt;li>如果有同名文件，可能会被覆盖，请提前检查。&lt;/li>
&lt;li>移动完成后，文件夹A会变空，可以用 &lt;code>rmdir 文件夹A&lt;/code> 删除它。&lt;/li>
&lt;/ul></description></item><item><title>rustdesk安装使用</title><link>https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</link><pubDate>Mon, 19 May 2025 01:41:21 +0800</pubDate><guid>https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</guid><description>&lt;img src="https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/index.png" alt="Featured image of post rustdesk安装使用" />&lt;p>rustdesk：一款开源的远程控制软件&lt;/p>
&lt;h2 id="docker编排一次性部署好rustdesk-server和rustdesk-api">docker编排一次性部署好rustdesk-server和rustdesk-api
&lt;/h2>&lt;p>开放端口
TCP：21114-21119
UDP：21116&lt;/p>
&lt;p>docker编排如下代码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rustdesk-net&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rustdesk&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21114&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21114&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21115&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21115&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21116&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21116&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21116&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21116&lt;/span>&lt;span class="l">/udp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21117&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21117&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21118&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21118&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21119&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21119&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lejianwen/rustdesk-server-s6:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RELAY=&amp;lt;relay_server[:port]&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">ENCRYPTED_ONLY=1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">MUST_LOGIN=Y&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">TZ=Asia/Shanghai&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_ID_SERVER=&amp;lt;id_server[:21116]&amp;gt; &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 需要修改&amp;lt;&amp;gt;表示必填，[]表示选填，不过这里也填上，例如如改成 RUSTDESK_API_RUSTDESK_ID_SERVER = 182.168.198.1:21116&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_RELAY_SERVER=&amp;lt;relay_server[:21117]&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_API_SERVER=http://&amp;lt;api_server[:21114]&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_JWT_KEY=xxxxxx&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/rustdesk/server:/data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/rustdesk/api:/app/data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#将数据库挂载&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">rustdesk-net&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面是一个示例&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rustdesk-net&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">external&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rustdesk&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21114&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21114&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21115&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21115&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21116&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21116&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21116&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21116&lt;/span>&lt;span class="l">/udp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21117&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21117&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21118&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21118&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="m">21119&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">21119&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lejianwen/rustdesk-server-s6:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RELAY=147.56.53.13:21117&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">ENCRYPTED_ONLY=1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">MUST_LOGIN=N&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">TZ=Asia/Shanghai&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_ID_SERVER=147.56.53.13:21116&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_RELAY_SERVER=147.56.53.13:21117&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_RUSTDESK_API_SERVER=http://147.56.53.13:21114&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">RUSTDESK_API_JWT_KEY= &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 设置MUST_LOGIN=Y填，不然可以不填&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/rustdesk/server:/data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/data/rustdesk/api:/app/data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#将数据库挂载&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">rustdesk-net&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数提示&lt;/p>
&lt;blockquote>
&lt;p>RELAY=&amp;lt;relay_server[:port]&amp;gt; #中继服务器:21117
MUST_LOGIN=N #默认为N，设置为Y 则必须登录才能链接
RUSTDESK_API_RUSTDESK_ID_SERVER=&amp;lt;id_server[:21116]&amp;gt; #ID服务器
RUSTDESK_API_RUSTDESK_RELAY_SERVER=&amp;lt;relay_server[:21117]&amp;gt; #中继服务器
RUSTDESK_API_RUSTDESK_API_SERVER=http://&amp;lt;api_server[:21114]&amp;gt; #API服务器
RUSTDESK_API_JWT_KEY=xxxxxx #随便设置个字符串
cat /data/id_ed25519.pub #进入到容器里面查看 key&lt;/p>
&lt;/blockquote>
&lt;p>api服务的访问地址在&amp;lt;ip或域名&amp;gt;:21114, 默认管理员账户为admin,密码进入容器通过以下命令修改
./apimain reset-admin-pwd &lt;pwd>&lt;/p>
&lt;hr>
&lt;p>&lt;span style="color:red"> 下面的教程是很久之前写的，可能存在失效的情况&lt;/span>&lt;/p>
&lt;hr>
&lt;h2 id="docker编排-可以安装宝塔linux或者ipanel">docker编排 (可以安装宝塔linux或者ipanel)
&lt;/h2>&lt;h3 id="1-如果服务器上面没东西可以选择安装宝塔linux一般云服务器厂商都提供了相应的镜像可以选择安装">1. 如果服务器上面没东西，可以选择安装宝塔linux，一般云服务器厂商都提供了相应的镜像可以选择安装
&lt;/h3>&lt;h3 id="2-安装ipanel">2. 安装ipanel
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo -s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#根据自己的系统选择脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#RedHat / CentOS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sh quick_start.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Ubuntu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo bash quick_start.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Debian&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> bash quick_start.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 随后根据提示安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="搭建中继服务器">搭建中继服务器
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>如果安装了宝塔面板的话，直接进入如下位置，然后再商店里面搜索就有，点击安装，然后查看日志，就可以看见key，记得把ke复制下来
&lt;img src="https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image.png"
width="2552"
height="1314"
srcset="https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image_hu5385903588586230980.png 480w, https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image_hu16340785175199243013.png 1024w"
loading="lazy"
alt="查看日志复制key"
class="gallery-image"
data-flex-grow="194"
data-flex-basis="466px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如果是ipanel的话，可以使用编排进行，在编排日志里面可以看见key&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">services&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rustdesk_Y662&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">image&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">rustdesk&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">rustdesk&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="n">server&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="n">s6&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">VERSION&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">#&lt;/span> &lt;span class="n">container_name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">CONTAINER_NAME&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">deploy&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resources&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">limits&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpus&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">CPUS&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">memory&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">MEMORY_LIMIT&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">environment&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="n">RELAY&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_HOST_ADDR&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_HBBR&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="n">ENCRYPTED_ONLY&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ports&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_NAT&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21115&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_HBBS&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21116&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_HBBS&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21116&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">udp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_HBBR&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21117&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_WEB_CLIENT_1&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21118&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">HOST_IP&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">RUSTDESK_PORT_WEB_CLIENT_2&lt;/span>&lt;span class="p">}:&lt;/span>&lt;span class="m">21119&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">restart&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">always&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">volumes&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">APP_PATH&lt;/span>&lt;span class="p">}/&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">:/&lt;/span>&lt;span class="n">data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">labels&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">createdBy&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s">&amp;#34;bt_apps&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">networks&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span> &lt;span class="n">baota_net&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">networks&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">baota_net&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">external&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>到这一步就可以了，搭建api服务器会很麻烦&lt;/p>
&lt;hr>
&lt;h3 id="搭建api服务器">搭建api服务器
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">networks:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rustdesk-net:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> external: &lt;span class="nb">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">services:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rustdesk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> image: lejianwen/rustdesk-api:full-s6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ports:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - &lt;span class="s2">&amp;#34;【所开发的端口，如：29288】:21114&amp;#34;&lt;/span> &lt;span class="c1"># 添加引号确保端口格式正确第一个是服务器开放的端口，是需要改的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> environment:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RELAY: &lt;span class="s2">&amp;#34;【server_ip】:21117&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ENCRYPTED_ONLY: &lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> TZ: &lt;span class="s2">&amp;#34;Asia/Shanghai&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RUSTDESK_API_RUSTDESK_ID_SERVER: &lt;span class="s2">&amp;#34;【server_ip】:21116&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RUSTDESK_API_RUSTDESK_RELAY_SERVER: &lt;span class="s2">&amp;#34;【server_ip】:21117&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RUSTDESK_API_RUSTDESK_API_SERVER: &lt;span class="s2">&amp;#34;http://【server_ip】:【所开发的端口，如：29288】&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volumes:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - /data/rustdesk/server:/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - /data/rustdesk/server:/app/conf/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - /data/rustdesk/api:/app/data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> networks:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - rustdesk-net
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> restart: unless-stopped
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="关于pc端链接超时或者链接不上的问题以及解决方案--about-the-problem-of-timeout-or-connection-failure-on-pc-and-how-to-solve-it">关于PC端链接超时或者链接不上的问题以及解决方案 | About the problem of timeout or connection failure on PC and how to solve it
&lt;/h3>&lt;p>&lt;a class="link" href="https://github.com/lejianwen/rustdesk-api/issues/92" target="_blank" rel="noopener"
>https://github.com/lejianwen/rustdesk-api/issues/92&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1.png"
width="1324"
height="2183"
srcset="https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1_hu5648767938480681176.png 480w, https://www.zata.cc/p/rustdesk%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1_hu10937570841465580135.png 1024w"
loading="lazy"
alt="PC链接问题issue"
class="gallery-image"
data-flex-grow="60"
data-flex-basis="145px"
>&lt;/p>
&lt;h3 id="参考">参考:
&lt;/h3>&lt;blockquote>
&lt;p>&lt;a class="link" href="https://www.smianao.com/1323.html" target="_blank" rel="noopener"
>https://www.smianao.com/1323.html&lt;/a>
&lt;a class="link" href="https://www.smianao.com/1340.html" target="_blank" rel="noopener"
>https://www.smianao.com/1340.html&lt;/a>
&lt;a class="link" href="https://github.com/lejianwen/rustdesk-api/issues/92" target="_blank" rel="noopener"
>https://github.com/lejianwen/rustdesk-api/issues/92&lt;/a>&lt;/p>
&lt;/blockquote></description></item><item><title>国外服务器扶墙</title><link>https://www.zata.cc/p/%E5%9B%BD%E5%A4%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%89%B6%E5%A2%99/</link><pubDate>Thu, 24 Apr 2025 00:19:47 +0800</pubDate><guid>https://www.zata.cc/p/%E5%9B%BD%E5%A4%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%89%B6%E5%A2%99/</guid><description>&lt;img src="https://www.zata.cc/p/%E5%9B%BD%E5%A4%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%89%B6%E5%A2%99/images/index/index.png" alt="Featured image of post 国外服务器扶墙" />&lt;p>&lt;code>两个实际上都没成功。。。还是很难的，所以以后国外服务器还是别买。。。&lt;/code>
参考 &lt;a class="link" href="https://ry.huaji.store/2020/08/Linux-magic-network/" target="_blank" rel="noopener"
>https://ry.huaji.store/2020/08/Linux-magic-network/&lt;/a>&lt;/p>
&lt;h1 id="v2ray">V2ray
&lt;/h1>&lt;p>安装客户端
参考 ： &lt;a class="link" href="https://v2raya.org/docs/prologue/installation/debian/" target="_blank" rel="noopener"
>https://v2raya.org/docs/prologue/installation/debian/&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ubuntu、Debian &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget -qO - https://apt.v2raya.org/key/public-key.asc &lt;span class="p">|&lt;/span> sudo tee /etc/apt/keyrings/v2raya.asc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;deb [signed-by=/etc/apt/keyrings/v2raya.asc] https://apt.v2raya.org/ v2raya main&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /etc/apt/sources.list.d/v2raya.list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install v2raya v2ray &lt;span class="c1">## 也可以使用 xray 包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start v2raya.service &lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后访问 ip:2017
参考 &lt;a class="link" href="https://v2raya.org/docs/prologue/quick-start/" target="_blank" rel="noopener"
>https://v2raya.org/docs/prologue/quick-start/&lt;/a>
&lt;img src="https://i-blog.csdnimg.cn/direct/cd10adc28cc742ce9295da14a72a3316.png"
loading="lazy"
alt="在这里插入图片描述"
>
在第一次进入页面时，你需要创建一个管理员账号，请妥善保管你的用户名密码，如果遗忘，使用sudo v2raya &amp;ndash;reset-password命令重置。&lt;/p>
&lt;h1 id="shadowsocks">Shadowsocks
&lt;/h1>&lt;p>安装conda&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bash Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> .bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装shadowsocks组件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip -U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">或
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo pip3 install shadowsocks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此外，如果你需要使用 Shadowsocks 新的加密方式的话，比如 Chacha20-Ietf-Poly1305，你还需要装下面这个东西&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ubuntu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install libsodium-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># centos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum -y install epel-release
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum -y install libsodium
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置
新建配置文件夹和配置文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir /etc/shadowsocks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vi /etc/shadowsocks/shadowsocks.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置如下，具体内容自行修改（没有梯子请自行联系工信部申请）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;server&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;your_server_url&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;server_port&amp;#34;&lt;/span>: 23333,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;local_address&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;127.0.0.1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;local_port&amp;#34;&lt;/span>: 1080,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;password&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;your_server_password&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;timeout&amp;#34;&lt;/span>: 60,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;method&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;chacha20-ietf-poly1305&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;workers&amp;#34;&lt;/span>: 1,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;fast_open&amp;#34;&lt;/span>: &lt;span class="nb">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">server：科学上网代理提供商的 Shadowsocks 服务器地址
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">server_port：科学上网代理提供商的 Shadowsocks 服务器端口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">local_address：本地 Sock5 代理地址
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">local_port：本地 Sock5 代理端口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">password：科学上网代理提供商的 Shadowsocks 连接密码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">timeout：超时等待时间（秒）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">method：加密方式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">workers：工作线程数
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fast_open：TCP Fast Open，按需开启
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置完成，之后就可以通过 local_address 和 local_port 走 Sock5 代理了&lt;/p>
&lt;p>启动脚本
创建启动脚本 /etc/systemd/system/shadowsocks.service&lt;/p>
&lt;p>这里请确认你的 sslocal 的所在位置，自行修改脚本文件中的 /usr/local/bin/sslocal，位置不对启动服务时会报 203 错误&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Unit&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">Description&lt;/span>&lt;span class="o">=&lt;/span>Shadowsocks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Service&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TimeoutStartSec&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ExecStart&lt;/span>&lt;span class="o">=&lt;/span>/usr/local/bin/sslocal -c /etc/shadowsocks/shadowsocks.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>Install&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">WantedBy&lt;/span>&lt;span class="o">=&lt;/span>multi-user.target
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>GO! GO! GO!
启动服务或者配置开机自启动&lt;/p>
&lt;h1 id="开机自启动">开机自启动
&lt;/h1>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> shadowsocks.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="启动服务">启动服务
&lt;/h1>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start shadowsocks.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="查看状态">查看状态
&lt;/h1>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status shadowsocks.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="停止服务">停止服务
&lt;/h1>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl stop shadowsocks.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>测试一下，看看你的 ip 地址是否符合预期&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl --socks5 127.0.0.1:1080 https://httpbin.org/ip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>到这里 Shadowsocks 部分就结束了，可以直接跳转后面的 Sock5 代理部分接着搞&lt;/p></description></item><item><title>linux使用教程</title><link>https://www.zata.cc/p/linux%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Sun, 16 Mar 2025 17:16:02 +0800</pubDate><guid>https://www.zata.cc/p/linux%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/linux%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post linux使用教程" />&lt;h2 id="服务器配置">服务器配置
&lt;/h2>&lt;h3 id="ubuntu-初始化配置">Ubuntu 初始化配置
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 1.设置密码并更新软件包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo passwd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 2. 安装ssh-server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install openssh-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 3.配置ssh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 常见配置项示例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port &lt;span class="m">22&lt;/span> &lt;span class="c1"># SSH 端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PermitRootLogin no &lt;span class="c1"># 禁止 root 登录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PasswordAuthentication yes &lt;span class="c1"># 允许密码认证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AllowUsers myuser &lt;span class="c1"># 允许特顶用户登录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port &lt;span class="m">2222&lt;/span> &lt;span class="c1">#修改端口，减少扫描攻击&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 4.重启ssh服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 5.创建用户(避免直接使用root账号)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">adduser myuser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">usermod -aG sudo myuser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 6. 连接服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh root@服务器IP地址 -p &lt;span class="o">[&lt;/span>你自己设置的端口&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="一些问题和解决方案">一些问题和解决方案
&lt;/h2>&lt;h3 id="linux-下更改当前文件夹及所有内容所有者为-zata-用户">Linux 下更改当前文件夹及所有内容所有者为 zata 用户
&lt;/h3>&lt;p>&lt;strong>目标&lt;/strong>&lt;br>
将当前文件夹及其下所有文件和子文件夹的所有者更改为 &lt;code>zata&lt;/code> 用户。&lt;/p>
&lt;p>&lt;strong>步骤&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>打开终端&lt;/strong>：按 &lt;code>Ctrl + Alt + T&lt;/code>，使用 &lt;code>cd /path/to/your/folder&lt;/code> 进入目标文件夹，确认路径：&lt;code>pwd&lt;/code>。&lt;/li>
&lt;li>&lt;strong>更改所有者&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chown -R zata .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>.&lt;/code> 表示当前文件夹，&lt;code>-R&lt;/code> 递归更改所有内容。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>（可选）设置权限&lt;/strong>：只给 &lt;code>zata&lt;/code> 读写权限：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chmod -R &lt;span class="m">700&lt;/span> .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>验证更改&lt;/strong>：检查所有者和权限：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ls -la
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>注意事项&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>确认 &lt;code>zata&lt;/code> 用户存在：&lt;code>id zata&lt;/code>。若不存在，创建：&lt;code>sudo adduser zata&lt;/code>。&lt;/li>
&lt;li>备份数据，避免误操作。&lt;/li>
&lt;li>（可选）分配组：&lt;code>sudo chown -R zata:groupname .&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h3 id="bash-ping-command-not-found--问题">bash: ping: command not found 问题
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install iputils-ping
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install net-tools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>SSH使用教程</title><link>https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Fri, 14 Mar 2025 00:23:43 +0800</pubDate><guid>https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post SSH使用教程" />&lt;h2 id="-ssh常用命令">☆ SSH常用命令
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 连接远程服务器 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh username@hostname &lt;span class="o">[&lt;/span>-p port&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>-i private_key&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#远程服务器上跑了 PostgreSQL（默认端口 5432），但不允许外网直接连接。用这条命令后，你可以在本地用数据库客户端连接：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -L 5433:127.0.0.1:5432 root@远程IP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制公钥到远程服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-copy-id username@hostname &lt;span class="o">[&lt;/span>-p port&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>-i private_key&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Generate ED25519 key (recommended)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -t ed25519 -C &lt;span class="s2">&amp;#34;your_email@example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除已知主机记录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -R &amp;lt;IP address&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Edit SSH config file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nano ~/.ssh/config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Copy file from local to remote&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp localfile.txt username@hostname:/path/to/destination/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Copy file from remote to local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp username@hostname:/path/to/file /var/www/local_dir/destination/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Copy directory recursively&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp -r localdir/ username@hostname:/path/to/destination/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Copy with specific port&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp -P &lt;span class="m">2222&lt;/span> localfile.txt username@hostname:/path/to/destination/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="ssh安装">SSH安装
&lt;/h2>&lt;ol>
&lt;li>ubuntu&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="c1"># 更新仓库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install openssh-server &lt;span class="c1"># 安装openssh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vi /etc/ssh/sshd_config &lt;span class="c1"># 进入配置文件，找到port=22那行，取消注释 ，如果想要root登陆，可以取消PermitRootLogin注释并修改为yes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh restart &lt;span class="c1"># 重启服务，然后就可以连接了，有时候为了安全，上一步的root登陆是不允许的，root用户连不上，可以用普通用户登录再切换到root &lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="1-ssh-连接命令">1. SSH 连接命令
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 通过代理连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -o &lt;span class="s2">&amp;#34;ProxyCommand nc -X 5 -x 127.0.0.1:7897 %h %p&amp;#34;&lt;/span> root@107.172.234.205
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 指定端口连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -p &lt;span class="m">2222&lt;/span> username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用密钥连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -i /path/to/private_key username@hostname
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-ssh-密钥管理">2. SSH 密钥管理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成 SSH 密钥对&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -t rsa -b &lt;span class="m">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制公钥到远程服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-copy-id username@hostname &lt;span class="c1"># 如果是windows可以看问题：在Windows客户机上实现类似ssh-copy-id功能即下次不需要输入密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者， （有些时候上吗会出错）ssh-keygen -R &amp;lt;IP address&amp;gt; to delete history record&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ~/.ssh/id_ed25519.pub &lt;span class="p">|&lt;/span> ssh root@&amp;lt;IP address&amp;gt; &lt;span class="s2">&amp;#34;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看已知主机&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ~/.ssh/known_hosts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(在Windows客户机上实现类似ssh-copy-id功能即下次不需要输入密码)[#在Windows客户机上实现类似ssh-copy-id功能即下次不需要输入密码]&lt;/p>
&lt;h3 id="3ssh传输文件">3.SSH传输文件
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1、从服务器上下载文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scp&lt;/span> &lt;span class="n">username&lt;/span>&lt;span class="nd">@servername&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">filename&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">var&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">www&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">local_dir&lt;/span>&lt;span class="err">（&lt;/span>&lt;span class="n">本地目录&lt;/span>&lt;span class="err">）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 例如scp root@192.168.0.101:/var/www/test.txt 把192.168.0.101上的/var/www/test.txt 的文件下载到/var/www/local_dir（本地目录）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2、上传本地文件到服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scp&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">filename&lt;/span> &lt;span class="n">username&lt;/span>&lt;span class="nd">@servername&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 例如scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/www/目录下的test.php文件上传到192.168.0.101这台服务器上的/var/www/目录中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3、从服务器下载整个目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scp&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span> &lt;span class="n">username&lt;/span>&lt;span class="nd">@servername&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">var&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">www&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">remote_dir&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="err">（&lt;/span>&lt;span class="n">远程目录&lt;/span>&lt;span class="err">）&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">var&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">www&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">local_dir&lt;/span>&lt;span class="err">（&lt;/span>&lt;span class="n">本地目录&lt;/span>&lt;span class="err">）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 例如:scp -r root@192.168.0.101:/var/www/test /var/www/ &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4、上传目录到服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">scp&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">r&lt;/span> &lt;span class="n">local_dir&lt;/span> &lt;span class="n">username&lt;/span>&lt;span class="nd">@servername&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">remote_dir&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 例如：scp -r test root@192.168.0.101:/var/www/ 把当前目录下的test目录上传到服务器的/var/www/ 目录 &lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-ssh-端口转发">4. SSH 端口转发
&lt;/h3>&lt;p>&lt;span style="color :red"> 注意必须要提前配置公网服务器的ssh配置文件 可见ssh问题中的“通过 SSH 反向隧道将本地前后端暴露到公网” &lt;/span>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 本地端口转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -L local_port:target_host:target_port username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 远程端口转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -R remote_port:target_host:target_port username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#不发送任何命令，只用来建立连接。没有这个参数，会在 SSH 服务器打开一个 Shell。会在前台打开&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -R &amp;lt;服务器端口&amp;gt;:localhost:22 -N root@&amp;lt;服务器地址&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 将SSH命令放到后台，如果想要停止需要杀死进程 （ 比较常用 ）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -R &amp;lt;服务器端口&amp;gt;:localhost:22 -Nf root@&amp;lt;服务器地址&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 动态端口转发（SOCKS代理）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -D local_port username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本格式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh &lt;span class="o">[&lt;/span>选项&lt;span class="o">]&lt;/span> username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 常用选项说明&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-L &lt;span class="o">[&lt;/span>本地IP:&lt;span class="o">]&lt;/span>本地端口:目标IP:目标端口 &lt;span class="c1"># 本地端口转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-R &lt;span class="o">[&lt;/span>远程IP:&lt;span class="o">]&lt;/span>远程端口:目标IP:目标端口 &lt;span class="c1"># 远程端口转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-D &lt;span class="o">[&lt;/span>本地IP:&lt;span class="o">]&lt;/span>本地端口 &lt;span class="c1"># 动态端口转发(SOCKS代理)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重要的辅助选项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-N &lt;span class="c1"># 不执行远程命令，仅用于端口转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-f &lt;span class="c1"># 后台运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-C &lt;span class="c1"># 压缩数据传输&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-q &lt;span class="c1"># 安静模式，减少日志输出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-v &lt;span class="c1"># 详细模式，用于调试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-vv &lt;span class="c1"># 更详细的模式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-4 &lt;span class="c1"># 仅使用 IPv4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-6 &lt;span class="c1"># 仅使用 IPv6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 连接相关选项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-p 端口 &lt;span class="c1"># 指定 SSH 服务器端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-i 密钥 &lt;span class="c1"># 指定私钥文件路径&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-ssh-配置管理">5. SSH 配置管理
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑 SSH 配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim ~/.ssh/config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置文件示例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Host myserver
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> HostName hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> User username
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Port &lt;span class="m">2222&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> IdentityFile ~/.ssh/id_rsa
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="常见用途对比">常见用途对比：
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>安全性&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>密码登录：便捷但相对不安全&lt;/li>
&lt;li>密钥登录：更安全，推荐使用&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>传输方式&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>scp&lt;/code>：简单直接，适合临时传输&lt;/li>
&lt;li>&lt;code>rsync&lt;/code>：支持增量传输，适合大量文件同步&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>端口转发&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>本地转发：访问远程内网服务&lt;/li>
&lt;li>远程转发：让远程访问本地服务&lt;/li>
&lt;li>动态转发：创建 SOCKS 代理&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>&lt;strong>连接管理&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>普通连接：一次性使用&lt;/li>
&lt;li>配置文件：适合经常连接的服务器&lt;/li>
&lt;/ul>
&lt;h3 id="使用建议">使用建议：
&lt;/h3>&lt;ol>
&lt;li>优先使用密钥认证&lt;/li>
&lt;li>重要服务器建议修改默认 22 端口&lt;/li>
&lt;li>经常连接的服务器建议配置 &lt;code>~/.ssh/config&lt;/code>&lt;/li>
&lt;li>大文件传输建议使用 &lt;code>rsync&lt;/code> 而不是 &lt;code>scp&lt;/code>&lt;/li>
&lt;li>注意保护好私钥文件的安全&lt;/li>
&lt;/ol>
&lt;p>这些命令和用法覆盖了日常 SSH 使用的大部分场景，建议根据实际需求选择合适的命令使用。&lt;/p>
&lt;h2 id="ubuntu-下-ssh-服务的启动停止和管理方法">Ubuntu 下 SSH 服务的启动、停止和管理方法：
&lt;/h2>&lt;p>安装 SSH 服务&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装 OpenSSH 服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install openssh-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>service 命令（传统方式）&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 停止&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看状态&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>/etc/init.d 脚本方式&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/ssh start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 停止&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/ssh stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/ssh restart
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看状态&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/ssh status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>systemctl 命令（现代 systemd 方式）&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 停止&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl stop sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看状态&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl status sshd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>直接启动 sshd 进程&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 直接启动 sshd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /usr/sbin/sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用特定配置文件启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /usr/sbin/sshd -f /path/to/sshd_config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不同系统的区别：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Ubuntu/Debian&lt;/strong> 系统中服务名通常是 &lt;code>ssh&lt;/code>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo service ssh start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>CentOS/RHEL&lt;/strong> 系统中服务名通常是 &lt;code>sshd&lt;/code>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo service sshd start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意事项：&lt;/p>
&lt;ol>
&lt;li>现代 Linux 系统推荐使用 &lt;code>systemctl&lt;/code> 命令&lt;/li>
&lt;li>&lt;code>service&lt;/code> 命令在新系统中实际上是 &lt;code>systemctl&lt;/code> 的封装&lt;/li>
&lt;li>&lt;code>/etc/init.d&lt;/code> 脚本方式是最传统的方法，但仍被支持&lt;/li>
&lt;li>直接启动 &lt;code>sshd&lt;/code> 进程通常用于调试目的&lt;/li>
&lt;/ol>
&lt;p>选择哪种方式主要取决于：&lt;/p>
&lt;ul>
&lt;li>系统版本&lt;/li>
&lt;li>个人习惯&lt;/li>
&lt;li>具体需求（如调试）&lt;/li>
&lt;/ul>
&lt;p>所有这些方法都能达到相同的目的，只是使用的方式不同。&lt;/p>
&lt;ol start="3">
&lt;li>SSH 配置文件位置&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 主配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vim /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 常见配置项示例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port &lt;span class="m">22&lt;/span> &lt;span class="c1"># SSH 端口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PermitRootLogin no &lt;span class="c1"># 禁止 root 登录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PasswordAuthentication yes &lt;span class="c1"># 允许密码认证&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>检查 SSH 服务&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查 SSH 是否正在运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ps aux &lt;span class="p">|&lt;/span> grep ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查 SSH 端口是否开放&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo netstat -tulpn &lt;span class="p">|&lt;/span> grep ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查防火墙是否允许 SSH&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>防火墙设置&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 允许 SSH 连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 允许特定端口（如果修改了默认端口）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 2222/tcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常见问题解决：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>服务无法启动&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看详细日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo journalctl -u ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查配置文件语法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo sshd -t
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>权限问题&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修复 SSH 目录权限&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod &lt;span class="m">755&lt;/span> /etc/ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod &lt;span class="m">600&lt;/span> /etc/ssh/ssh_host_*_key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod &lt;span class="m">644&lt;/span> /etc/ssh/ssh_host_*_key.pub
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安全建议：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>基本安全配置&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑 SSH 配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vim /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 推荐的安全设置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PermitRootLogin no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PasswordAuthentication no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MaxAuthTries &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Protocol &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>使用密钥认证&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在客户端生成密钥对&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -t rsa -b &lt;span class="m">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 将公钥复制到服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-copy-id username@server_ip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常用维护命令：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>查看连接状态&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看当前 SSH 连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">who
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">w
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 SSH 登录日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cat /var/log/auth.log &lt;span class="p">|&lt;/span> grep ssh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>配置文件备份&lt;/strong>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份 SSH 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>记住，每次修改 SSH 配置文件后，都需要重启 SSH 服务才能生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart ssh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些是 Ubuntu 下管理 SSH 服务的基本操作，建议在修改配置时先备份，并保持一个可用的连接会话，以防配置错误导致无法连接。&lt;/p>
&lt;h1 id="ssh-使用指南">SSH 使用指南
&lt;/h1>&lt;h3 id="使用公网linux服务器为windows电脑做内网穿透">使用公网Linux服务器为Windows电脑做内网穿透
&lt;/h3>&lt;h4 id="方法一使用frp推荐稳定可靠">方法一：使用FRP（推荐，稳定可靠）
&lt;/h4>&lt;p>FRP (Fast Reverse Proxy) 是一款专为此类场景设计的工具，功能强大，支持断线重连，适合长期稳定使用。&lt;/p>
&lt;ol>
&lt;li>服务端配置 (Linux公网服务器)&lt;/li>
&lt;/ol>
&lt;p>下载并解压FRP:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 前往 https://github.com/fatedier/frp/releases 找最新版Linux amd64链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget &lt;span class="o">[&lt;/span>最新版frp的linux_amd64.tar.gz链接&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -zxvf frp_*.tar.gzcd frp_*/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置 frps.ini:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-TOML" data-lang="TOML">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># frps.ini[common]bind_port = 7000 # 用于和客户端通信的端口token = your_secure_password # 连接凭证，请务必修改dashboard_port = 7500 # [可选] 状态仪表盘端口dashboard_user = admin # [可选] 仪表盘用户名dashboard_pwd = admin_password # [可选] 仪表盘密码&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>开放服务器防火墙:&lt;/p>
&lt;p>确保开放 7000 端口以及你计划用于转发的端口（如下文的 7001）和仪表盘端口 7500。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># firewalld示例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --add-port&lt;span class="o">=&lt;/span>7000/tcp --permanent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --add-port&lt;span class="o">=&lt;/span>7001/tcp --permanent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行服务端:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./frps -c ./frps.ini
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建议设置为 systemd 服务以实现开机自启和后台运行。&lt;/p>
&lt;ol start="2">
&lt;li>客户端配置 (Windows内网电脑)&lt;/li>
&lt;/ol>
&lt;p>下载并解压FRP: 前往FRP的GitHub Releases页面，下载对应的 windows_amd64.zip 版本并解压。&lt;/p>
&lt;p>配置 frpc.ini (以穿透远程桌面为例):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-TOML" data-lang="TOML">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># frpc.ini[common]server_addr = 你的服务器公网IPserver_port = 7000token = your_secure_password # 必须和服务端一致[rdp]type = tcplocal_ip = 127.0.0.1local_port = 3389 # Windows远程桌面默认端口remote_port = 7001 # 从公网访问的端口&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行客户端: 打开CMD或PowerShell运行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 进入frp目录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">.\frpc.exe -c .\frpc.ini
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建议使用 nssm 等工具将其注册为Windows服务，实现开机自启。&lt;/p>
&lt;ol start="3">
&lt;li>如何连接&lt;/li>
&lt;/ol>
&lt;p>在任何电脑上打开“远程桌面连接”(mstsc)，计算机名处输入：你的服务器公网IP:7001。&lt;/p>
&lt;h4 id="方法二使用ssh反向隧道轻便快捷">方法二：使用SSH反向隧道（轻便快捷）
&lt;/h4>&lt;p>利用SSH内置功能，无需额外软件，适合临时、快速的连接。&lt;/p>
&lt;ol>
&lt;li>服务端配置 (Linux公网服务器)&lt;/li>
&lt;/ol>
&lt;p>编辑SSH配置文件，允许公网访问隧道端口：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vim /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 找到或添加 GatewayPorts 并设置为 yes：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GatewayPorts yes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重启SSH服务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart sshd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>客户端操作 (Windows内网电脑)&lt;/li>
&lt;/ol>
&lt;p>打开PowerShell或CMD，执行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-PowerShell" data-lang="PowerShell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># -fN 表示后台运行且不执行远程命令，只做隧道# 格式: ssh -fN -R [服务器端口]:[本地IP]:[本地端口] [用户名]@[服务器IP]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ssh&lt;/span> &lt;span class="n">-fN&lt;/span> &lt;span class="n">-R&lt;/span> &lt;span class="mf">7001&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="mf">127.0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mf">1&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="mf">3389&lt;/span> &lt;span class="n">your_user&lt;/span>&lt;span class="nv">@你的服务器公网IP&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>该命令会建立一个长连接隧道，关闭窗口则隧道断开。&lt;/p>
&lt;ol start="3">
&lt;li>如何连接&lt;/li>
&lt;/ol>
&lt;p>与FRP方式相同，在“远程桌面连接”中输入 你的服务器公网IP:7001。&lt;/p>
&lt;p>常见问题：localhost 不行但 127.0.0.1 可以？&lt;/p>
&lt;p>这是一个由于IPv6/IPv4解析优先级导致的问题。&lt;/p>
&lt;p>原因: localhost 可能被系统优先解析为IPv6的 ::1 地址，但你的目标服务（如远程桌面）仅在IPv4的 127.0.0.1 上监听。&lt;/p>
&lt;p>最佳解决方案: 无需排查，在所有配置（无论是FRP还是SSH）中，请始终使用 127.0.0.1 而不是 localhost。127.0.0.1 明确指向IPv4本地环回地址，能保证连接的准确性，是最简单、最可靠的做法。&lt;/p>
&lt;h3 id="通过-ssh-反向隧道将本地前后端暴露到公网">通过 SSH 反向隧道将本地前后端暴露到公网
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>准备公网服务器&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>获取公网服务器（如阿里云），记录 IP（如 &lt;code>203.0.113.1&lt;/code>）。&lt;/li>
&lt;li>确保安装 SSH 服务（OpenSSH）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置公网服务器&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>编辑 &lt;code>/etc/ssh/sshd_config&lt;/code>，启用：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">AllowTcpForwarding yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GatewayPorts yes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>重启 SSH：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart sshd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>开放端口（如 3000、8000）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ufw allow &lt;span class="m">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow &lt;span class="m">8000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>确保本地服务运行&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>前端：运行在 &lt;code>localhost:3000&lt;/code>（如 React）。&lt;/li>
&lt;li>后端：运行在 &lt;code>localhost:8000&lt;/code>（如 Flask）。&lt;/li>
&lt;li>确认本地可通过浏览器访问。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置 SSH 反向隧道&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>在本地运行：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ssh -R 3000:localhost:3000 -R 8000:localhost:8000 user@203.0.113.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>使用 &lt;code>autossh&lt;/code> 保持连接：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">autossh -M &lt;span class="m">0&lt;/span> -R 3000:localhost:3000 -R 8000:localhost:8000 user@203.0.113.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>测试访问&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>访问 &lt;code>http://203.0.113.1:3000&lt;/code>（前端）和 &lt;code>http://203.0.113.1:8000&lt;/code>（后端）。&lt;/li>
&lt;li>确保前端 API 请求指向公网 IP（如 &lt;code>http://203.0.113.1:8000&lt;/code>）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>可选：Nginx 优化&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>安装 Nginx：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>配置 &lt;code>/etc/nginx/sites-available/default&lt;/code>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="mi">203&lt;/span>&lt;span class="s">.0.113.1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://localhost:3000&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/api/&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://localhost:8000/&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>重启 Nginx：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>注意事项&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>保持本地电脑开机和网络稳定。&lt;/li>
&lt;li>配置 SSH 密钥认证提高安全性。&lt;/li>
&lt;li>检查防火墙和 CORS 设置。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="解决-ssh-连接远程主机超时未使用自动断开">解决 ssh 连接远程主机超时未使用自动断开
&lt;/h3>&lt;p>参考：https://blog.csdn.net/Gelomen/article/details/109121069&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="err">这个问题可以通过配置&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">客户端来保持连接活跃。有以下几种解决方案：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">1&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">修改&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">客户端配置文件（推荐方案）：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">编辑&lt;/span> &lt;span class="err">~/.ssh/config&lt;/span> &lt;span class="err">文件（如果没有则创建），添加以下配置：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">Host&lt;/span> &lt;span class="err">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ServerAliveInterval&lt;/span> &lt;span class="mi">60&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ServerAliveCountMax&lt;/span> &lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">这个配置的含义是：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">-&lt;/span> &lt;span class="err">ServerAliveInterval&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="err">:&lt;/span> &lt;span class="err">每&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="err">秒发送一次心跳包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">-&lt;/span> &lt;span class="err">ServerAliveCountMax&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="err">:&lt;/span> &lt;span class="err">如果连续&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="err">次心跳包没有响应，则断开连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">2&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">在建立&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">连接时直接指定参数：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ssh&lt;/span> &lt;span class="err">-o&lt;/span> &lt;span class="err">ServerAliveInterval=&lt;/span>&lt;span class="mi">60&lt;/span> &lt;span class="err">-o&lt;/span> &lt;span class="err">ServerAliveCountMax=&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="err">user@remote-server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">3&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">如果是在使用&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">隧道，可以这样：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ssh&lt;/span> &lt;span class="err">-N&lt;/span> &lt;span class="err">-f&lt;/span> &lt;span class="err">-o&lt;/span> &lt;span class="err">ServerAliveInterval=&lt;/span>&lt;span class="mi">60&lt;/span> &lt;span class="err">-o&lt;/span> &lt;span class="err">ServerAliveCountMax=&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="err">-L&lt;/span> &lt;span class="err">local-port:remote-host:remote-port&lt;/span> &lt;span class="err">user@remote-server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">4&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">如果你是服务器管理员，也可以通过修改服务器端的&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">配置（/etc/ssh/sshd_config）来实现：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ClientAliveInterval&lt;/span> &lt;span class="mi">60&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">ClientAliveCountMax&lt;/span> &lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">修改服务器配置后需要重启&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">服务：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">sudo&lt;/span> &lt;span class="err">systemctl&lt;/span> &lt;span class="err">restart&lt;/span> &lt;span class="err">sshd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">推荐使用第一种方案（修改客户端配置文件），因为：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">1&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">只需配置一次，永久生效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">2&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">对所有&lt;/span> &lt;span class="err">SSH&lt;/span> &lt;span class="err">连接都有效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">3&lt;/span>&lt;span class="err">.&lt;/span> &lt;span class="err">不需要每次手动输入参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">注意：设置的时间间隔不要太短（比如小于&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="err">秒），否则可能会增加不必要的网络开销。&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="err">秒通常是一个比较好的选择。&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="服务器安装ssh服务-linux--windows">服务器安装ssh服务 (linux &amp;amp; windows)
&lt;/h3>&lt;ol>
&lt;li>linux&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="c1"># 更新仓库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install openssh-server &lt;span class="c1"># 安装openssh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service ssh restart &lt;span class="c1"># 重启服务，然后就可以连接了，有时候root用户连不上，可以用普通用户登录再切换到root&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>windows
参考： &lt;a class="link" href="https://blog.csdn.net/weixin_72910567/article/details/132414264" target="_blank" rel="noopener"
>https://blog.csdn.net/weixin_72910567/article/details/132414264&lt;/a>
&lt;img src="https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1.png"
width="851"
height="480"
srcset="https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu14578937242918924772.png 480w, https://www.zata.cc/p/ssh%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu3635559005492360674.png 1024w"
loading="lazy"
alt="安装openssh服务"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="425px"
>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 在设置-应用和功能里安装openssh服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 查看是否安装成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Get-WindowsCapability -Online &lt;span class="p">|&lt;/span> ? Name -like &lt;span class="s1">&amp;#39;OpenSSH*&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 开启服务&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">net start sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 设置开机自启动&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Set-Service -Name sshd -StartupType &lt;span class="s1">&amp;#39;Automatic&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="在windows客户机上实现类似ssh-copy-id功能即下次不需要输入密码">在Windows客户机上实现类似ssh-copy-id功能即下次不需要输入密码
&lt;/h3>&lt;h4 id="问题背景">问题背景
&lt;/h4>&lt;p>Windows 的 CMD 或 PowerShell 默认不支持 &lt;code>ssh-copy-id&lt;/code> 命令。本教程介绍如何在 Windows 上将 SSH 公钥复制到远程服务器（IP: 192.168.110.150，端口: 6001）以实现无密码登录。&lt;/p>
&lt;hr>
&lt;h4 id="方法-1手动复制-ssh-公钥">方法 1：手动复制 SSH 公钥
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>检查本地 SSH 密钥&lt;/strong>：
&lt;ul>
&lt;li>查看公钥：&lt;code>type %USERPROFILE%\.ssh\id_rsa.pub&lt;/code>&lt;/li>
&lt;li>如无密钥，生成：&lt;code>ssh-keygen -t rsa -b 4096&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>登录远程服务器&lt;/strong>：
&lt;ul>
&lt;li>运行：&lt;code>ssh -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;li>确保 &lt;code>~/.ssh&lt;/code> 目录存在：&lt;code>mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>复制公钥&lt;/strong>：
&lt;ul>
&lt;li>在 Windows 复制公钥内容：&lt;code>type %USERPROFILE%\.ssh\id_rsa.pub&lt;/code>&lt;/li>
&lt;li>在远程服务器编辑：&lt;code>vi ~/.ssh/authorized_keys&lt;/code>，粘贴公钥，保存。&lt;/li>
&lt;li>设置权限：&lt;code>chmod 600 ~/.ssh/authorized_keys&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>测试无密码登录&lt;/strong>：
&lt;ul>
&lt;li>运行：&lt;code>ssh -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h4 id="方法-2使用-powershell-模拟-ssh-copy-id">方法 2：使用 PowerShell 模拟 ssh-copy-id
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>确保 OpenSSH 客户端已安装&lt;/strong>：
&lt;ul>
&lt;li>检查：&lt;code>ssh -V&lt;/code>&lt;/li>
&lt;li>未安装则在“设置 &amp;gt; 应用 &amp;gt; 可选功能”中添加 OpenSSH 客户端。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>复制公钥&lt;/strong>：
&lt;ul>
&lt;li>运行：&lt;code>Get-Content $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 6001 root@192.168.110.150 &amp;quot;cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys&amp;quot;&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>验证权限&lt;/strong>：
&lt;ul>
&lt;li>登录服务器：&lt;code>ssh -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;li>运行：&lt;code>chmod 700 ~/.ssh &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>测试无密码登录&lt;/strong>：
&lt;ul>
&lt;li>运行：&lt;code>ssh -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h4 id="方法-3安装-git-bash-或-wsl">方法 3：安装 Git Bash 或 WSL
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>使用 Git Bash&lt;/strong>：
&lt;ul>
&lt;li>安装 Git for Windows，打开 Git Bash。&lt;/li>
&lt;li>运行：&lt;code>ssh-copy-id -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>使用 WSL&lt;/strong>：
&lt;ul>
&lt;li>安装 WSL：&lt;code>wsl --install&lt;/code>&lt;/li>
&lt;li>在 Ubuntu 中安装 openssh-client：&lt;code>sudo apt update &amp;amp;&amp;amp; sudo apt install openssh-client&lt;/code>&lt;/li>
&lt;li>运行：&lt;code>ssh-copy-id -p 6001 root@192.168.110.150&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h4 id="注意事项">注意事项
&lt;/h4>&lt;ul>
&lt;li>确保远程服务器允许密码登录或已配置 root 密码。&lt;/li>
&lt;li>公钥复制后，检查 &lt;code>~/.ssh/authorized_keys&lt;/code> 文件内容和权限。&lt;/li>
&lt;li>测试无密码登录是否成功，如失败，检查 SSH 配置文件 &lt;code>/etc/ssh/sshd_config&lt;/code> 和服务器防火墙设置。&lt;/li>
&lt;/ul>
&lt;h3 id="本地机器生成密钥并复制到远程服务器下次ssh连接就不需要输入密码">本地机器生成密钥并复制到远程服务器（下次ssh连接就不需要输入密码）
&lt;/h3>&lt;p>注意：
ssh-copy-id 是专门为linux系统适配的，windows系统不好用，需要手动复制公钥到.ssh文件夹下面的authorized_keys文件中&lt;/p>
&lt;h4 id="linux">linux
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成 SSH 密钥对&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-keygen -t rsa -b &lt;span class="m">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 复制公钥到远程服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh-copy-id username@hostname
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看已知主机&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ~/.ssh/known_hosts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果是windows服务器，使用如下方式将公钥内容追加&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;你的公钥内容&amp;#34;&lt;/span> &amp;gt;&amp;gt; 你的用户目录/.ssh/authorized_keys
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="windows-下关闭-ssh-后台连接的方法-在使用端口转发设置参数为-f时">Windows 下关闭 SSH 后台连接的方法 （在使用端口转发设置参数为-f时）
&lt;/h3>&lt;ol>
&lt;li>使用任务管理器：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 打开任务管理器的方法：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Ctrl + Shift + Esc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. 右键任务栏 -&amp;gt; 任务管理器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Ctrl + Alt + Delete -&amp;gt; 任务管理器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 在&amp;#34;详细信息&amp;#34;或&amp;#34;进程&amp;#34;标签下找到 ssh.exe 进程并结束&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>使用命令行查找和终止进程：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># PowerShell 命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 查看 SSH 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-Process&lt;/span> &lt;span class="n">ssh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 终止所有 SSH 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-Process&lt;/span> &lt;span class="n">ssh&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Stop-Process&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 或者使用 CMD 命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 查看 SSH 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tasklist&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="n">findstr&lt;/span> &lt;span class="s2">&amp;#34;ssh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 通过 PID 终止进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">taskkill&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="n">PID&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">进程ID&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="n">F&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 终止所有 SSH 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">taskkill&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="n">F&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="n">IM&lt;/span> &lt;span class="n">ssh&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>如果使用 Git Bash：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 SSH 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ps aux &lt;span class="p">|&lt;/span> grep ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 终止进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">kill&lt;/span> &amp;lt;进程ID&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建议：&lt;/p>
&lt;ol>
&lt;li>在使用 &lt;code>-Nf&lt;/code> 启动 SSH 连接时，可以记录下进程 ID：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 将进程 ID 保存到文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -Nf ... &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="nv">$!&lt;/span> &amp;gt; ssh_pid.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>创建一个批处理文件来管理连接：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-batch" data-lang="batch">&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">echo&lt;/span> off
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM start_ssh.bat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh -Nf ... &lt;span class="p">&amp;amp;&lt;/span> &lt;span class="k">echo&lt;/span> &lt;span class="nv">%ERRORLEVEL%&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> ssh_pid.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM stop_ssh.bat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="k">/f&lt;/span> &lt;span class="se">%%&lt;/span>i &lt;span class="k">in&lt;/span> &lt;span class="p">(&lt;/span>ssh_pid.txt&lt;span class="p">)&lt;/span> &lt;span class="k">do&lt;/span> taskkill /PID &lt;span class="se">%%&lt;/span>i /F
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">del&lt;/span> ssh_pid.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>1panel使用教程｜云服务器使用教程</title><link>https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Sun, 09 Mar 2025 16:14:31 +0800</pubDate><guid>https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post 1panel使用教程｜云服务器使用教程" />&lt;h3 id="1panel安装">1panel安装
&lt;/h3>&lt;p>官网：&lt;br>
&lt;a class="link" href="https://1panel.cn/docs/installation/online_installation/" target="_blank" rel="noopener"
>https://1panel.cn/docs/installation/online_installation/&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ubuntu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install curl &lt;span class="c1"># 如果下面一行提示curl没有&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo bash quick_start.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1pctl --help &lt;span class="c1"># 查看是否安装成功&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="实战-----问题和解决方案">实战 &amp;mdash; 问题和解决方案
&lt;/h3>&lt;h4 id="腾讯云的windows服务器做远程hugo的dev服务器的时候出的问题--之前用过华为云的服务器做dev服务器明显腾讯做的不如华为">腾讯云的windows服务器做远程hugo的dev服务器的时候出的问题 （之前用过华为云的服务器做dev服务器，明显腾讯做的不如华为）
&lt;/h4>&lt;ol>
&lt;li>使用腾讯云自带的snv连接，卡的要死，所以用了windows自带的，mac上面又windows app作为远程连接&lt;/li>
&lt;li>使用openssh作为ssh作为服务器之后，存在总是断联问题，增加conf文件解决 &lt;a class="link" href="https://www.zata.cc/p/ssh%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/#%E8%A7%A3%E5%86%B3-ssh-%E8%BF%9E%E6%8E%A5%E8%BF%9C%E7%A8%8B%E4%B8%BB%E6%9C%BA%E8%B6%85%E6%97%B6%E6%9C%AA%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E6%96%AD%E5%BC%80" target="_blank" rel="noopener"
>config文件解决ssh断联&lt;/a>&lt;/li>
&lt;li>git可以使用便携包，然后添加一下环境变量（里面的cmd文件夹），再重启服务器
&lt;img src="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2.png"
width="1226"
height="954"
srcset="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu10924201580597598088.png 480w, https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu7787008948582728156.png 1024w"
loading="lazy"
alt="protable"
class="gallery-image"
data-flex-grow="128"
data-flex-basis="308px"
>&lt;/li>
&lt;li>使用windows远程服务器进行git pull总是卡死，最终给出的解决方案就是：使用github的http地址拉取项目，然后使用ssh地址同步&lt;/li>
&lt;/ol>
&lt;h4 id="云服务器修改时区设置">云服务器，修改时区设置
&lt;/h4>&lt;p>首先查看服务器时间，明显是错误的
&lt;img src="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image.png"
width="953"
height="741"
srcset="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu2535172349089398868.png 480w, https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu3072277793690704435.png 1024w"
loading="lazy"
alt="查看服务器时间"
class="gallery-image"
data-flex-grow="128"
data-flex-basis="308px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1.png"
width="416"
height="72"
srcset="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu6252721194716937711.png 480w, https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu10619994981231364364.png 1024w"
loading="lazy"
alt="修改时区"
class="gallery-image"
data-flex-grow="577"
data-flex-basis="1386px"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查时区&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">date
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 通过手动链接时区文件来更改时区：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果有/etc/timezone 文件，可以更新它以确保一致性，当然不更新也可以&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat /etc/timezone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Asia/Shanghai&amp;#34;&lt;/span> &amp;gt; /etc/timezone
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="我自己使用1panel和云服务器的一些感悟">我自己使用1panel和云服务器的一些感悟
&lt;/h4>&lt;p>&lt;strong>在云服务器部署碰到的麻烦事：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>1panel 的运行环境模式，会自动执行脚本，虽然它创建了一个docker容器，但是如果你进去想要把它的脚本关掉，它会自启动，而如果你把它的这个环境停掉，docker容器就消失了，所以不要用它的环境容器做什么事情&lt;/li>
&lt;li>1panel的docker连接之后要先执行一下su，不然的话命令是不好操作的，比如就没有补全功能&lt;/li>
&lt;li>要去/ect/hosts去设置一下github的ip地址解析，不然会很慢&lt;/li>
&lt;li>云服务器如果是国内厂商的，最好设置一下镜像源，不然的话会下载非常慢，比如pip install的时候&lt;/li>
&lt;/ol>
&lt;h4 id="1panel的反向代理">1panel的反向代理
&lt;/h4>&lt;p>&lt;img src="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3.png"
width="772"
height="954"
srcset="https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu14712500426784273809.png 480w, https://www.zata.cc/p/1panel%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu3321060561341669935.png 1024w"
loading="lazy"
alt="使用OpenResty"
class="gallery-image"
data-flex-grow="80"
data-flex-basis="194px"
>&lt;/p></description></item><item><title>clash 教程</title><link>https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/</link><pubDate>Thu, 06 Mar 2025 10:51:58 +0800</pubDate><guid>https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post clash 教程" />&lt;h2 id="clash">clash
&lt;/h2>&lt;p>项目地址：&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/zzzgydi/clash-verge/tree/main" target="_blank" rel="noopener"
>https://github.com/zzzgydi/clash-verge/tree/main&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="images/index/Clash.Verge_1.3.8_x64-setup.exe" >&lt;img src="https://img.shields.io/badge/Download-Install%20Package-blue"
loading="lazy"
alt="Download"
>&lt;/a>&lt;/p>
&lt;h3 id="clash-基础知识---clash-介绍">clash 基础知识 - clash 介绍
&lt;/h3>&lt;p>参考&lt;/p>
&lt;p>&lt;a class="link" href="https://clashforwindows.org/" target="_blank" rel="noopener"
>Clash for Windows 使用教程快速入门篇&lt;/a>&lt;/p>
&lt;p>Clash for Windows是代理工具Clash在Windows系统的图形客户端，同时还支持Windows、Linux、macOS三大系统，功能强大且支持多种代理协议，如Shadowsocks(SS)、ShadowsocksR(SSR)、Socks、Snell、V2Ray、Trojan等代理协议。通过本文2025最新Clash for Windows使用教程快速入门篇所掌握的技巧，能快速方便配置代理协议进行代理访问。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image.png"
width="850"
height="603"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image_hu5723242471876951279.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image_hu16353066023936449788.png 1024w"
loading="lazy"
alt="clash界面"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="338px"
>&lt;/p>
&lt;p>官方的clash现在已经删库跑路了，不过还是有很多其他人在做，下面是其中一些&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/zzzgydi/clash-verge" target="_blank" rel="noopener"
>clash verge - github&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-1.png"
width="1056"
height="671"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-1_hu4299452486733813318.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-1_hu12227256621396930901.png 1024w"
loading="lazy"
alt="clash verge"
class="gallery-image"
data-flex-grow="157"
data-flex-basis="377px"
>&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/clash-verge-rev/clash-verge-rev" target="_blank" rel="noopener"
>clash verge rev - github&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-2.png"
width="1862"
height="1994"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-2_hu14496175896622416605.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-2_hu15793218829672009114.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="93"
data-flex-basis="224px"
>&lt;/p>
&lt;h4 id="界面介绍">界面介绍
&lt;/h4>&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-3.png"
width="850"
height="603"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-3_hu340565139384527797.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-3_hu12415468841228390024.png 1024w"
loading="lazy"
alt="中文版界面"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="338px"
>&lt;/p>
&lt;ul>
&lt;li>General（常规）：&lt;/li>
&lt;/ul>
&lt;p>Port、Socks Port；分别为 HTTP、SOCKS 代理端口，点击终端图案可以打开一个配置了代理的命令行窗口，点击端口数字可以复制该命令；&lt;/p>
&lt;p>Allow LAN：启用局域网共享代理功能；&lt;/p>
&lt;p>Log Level：日志等级；&lt;/p>
&lt;p>Home Directory：点击下方路径直达 C:\Users\用户名.config\clash 文件夹；&lt;/p>
&lt;p>GeoIP Database：点击下方日期可更新 GeoIP 数据库；&lt;/p>
&lt;p>UWP Loopback ：可以用来使 UWP 应用解除回环代理限制；&lt;/p>
&lt;p>Tap Device ：安装 cfw-tap 网卡，可用于处理不遵循系统代理的软件（实际启动 tap 模式需要更改配置文件）；&lt;/p>
&lt;p>General YML：编辑 config.yml 文件，可用于配置部分 General 页面内容；&lt;/p>
&lt;p>Dark Theme：控制暗色模式；&lt;/p>
&lt;p>System Proxy：启用系统代理；&lt;/p>
&lt;p>Start with Windows：设置开机自启；&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Proxies（代理）：选择代理方式（Global - 全局、Rule - 规则、Direct - 直连）及策略组节点选择；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Profiles（配置管理）：&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>用来下载远端配置文件和创建本地副本，且可在多个配置文件间切换；
对配置进行节点、策略组和规则的管理（添加节点、策略组和规则在各自编辑界面选择 Add, 调整策略组顺序、节点顺序及策略组节点使用拖拽的方式）；&lt;/p>
&lt;ul>
&lt;li>Logs（日志）：显示当前请求命中规则类型和策略；&lt;/li>
&lt;li>Connections (连接): 显示当前的 TCP 连接，可对某个具体连接执行关闭操作；&lt;/li>
&lt;li>Settings（设置）：软件详细设置；&lt;/li>
&lt;li>Feedback（反馈）：显示软件、作者相关信息。&lt;/li>
&lt;/ul>
&lt;h4 id="如何添加订阅">如何添加订阅
&lt;/h4>&lt;ol>
&lt;li>远程订阅地址订阅&lt;/li>
&lt;/ol>
&lt;p>远程订阅地址即通过 URL 链接导入，一般的服务商都会直接提供Clash节点地址，直接复制服务商提供的节点订阅地址即可，如下图所示：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-4.png"
width="540"
height="390"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-4_hu17748451834040001321.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-4_hu5490076711544699695.png 1024w"
loading="lazy"
alt="订阅地址"
class="gallery-image"
data-flex-grow="138"
data-flex-basis="332px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-5.png"
width="700"
height="400"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-5_hu9199528323270839229.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-5_hu10004312046204168959.png 1024w"
loading="lazy"
alt="复制订阅地址"
class="gallery-image"
data-flex-grow="175"
data-flex-basis="420px"
>&lt;/p>
&lt;p>然后点击界面左侧菜单 配置，在顶部输入框填入刚才复制的 URL 连接地址并点击 下载 即可，下载完成后点击对应的配置文件即可添加配置文件，如下图所示。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-6.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-6_hu9683010134631684369.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-6_hu12495572895813965716.png 1024w"
loading="lazy"
alt="下载订阅"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;ol start="2">
&lt;li>本地配置文件&lt;/li>
&lt;/ol>
&lt;p>本地配置文件即通过本地文件拖拽导入，一般为无法通过远程订阅地址导入的情况下使用，可尝试在浏览器中下载配置文件后直接通过拖拽方式导入或点击 Import 导入，如下图所示。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-7.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-7_hu17064154161906770494.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-7_hu1260776055858459337.png 1024w"
loading="lazy"
alt="本地导入"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;h4 id="选择代理节点">选择代理节点
&lt;/h4>&lt;p>在添加完订阅地址之后，需要选择一个代理节点使用，点击软件主界面左侧的 代理 选项卡，软件右上角代理规则处默认保持 规则 即可，代理模式主要有以下四种：&lt;/p>
&lt;ul>
&lt;li>规则：所有请求根据配置文件规则进行分流&lt;/li>
&lt;li>全局：所有请求直接发往代理服务器&lt;/li>
&lt;li>直连：所有请求直接发往目的地，即不使用代理&lt;/li>
&lt;li>脚本：所有请求根据脚本文件规则进行分流&lt;/li>
&lt;/ul>
&lt;p>全局模式可能会导致国内流量也走代理访问，除了网络会变慢外，还会消耗套餐流量。规则模式的好处就是区分国内国外的流量只有在规则内的国外网站才会走代理，这样即不影响国内访问速度，又节省套餐流量，所以如果没有什么特别的需求，一般选择 规则 即可。&lt;/p>
&lt;p>&lt;span style = " color:red "> 有一点值得注意，选择了全局模式，而全局模式中的节点挂掉了，会导致无法访问国内的网站 &lt;/span>&lt;/p>
&lt;p>然后在展开的节点组之中任意单击鼠标左键选择一个节点即可，如下图所示：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-8.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-8_hu13524074272503613618.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-8_hu18235660536431695818.png 1024w"
loading="lazy"
alt="选择代理节点"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;h4 id="启用代理">启用代理
&lt;/h4>&lt;p>启用代理，需要点击界面左侧菜单 主页 选项卡，找到 系统代理 并开启开关即可，开启状态下按钮状态为绿色，如下图所示为开启状态。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-9.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-9_hu221446308958542818.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-9_hu7550422179316775592.png 1024w"
loading="lazy"
alt="启用代理"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;p>启动代理后系统托盘的图标会变色金色猫咪，以下是系统托盘图标颜色说明。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-10.png"
width="899"
height="172"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-10_hu16998137802684130968.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-10_hu14111782866857945369.png 1024w"
loading="lazy"
alt="图标说明"
class="gallery-image"
data-flex-grow="522"
data-flex-basis="1254px"
>&lt;/p>
&lt;h4 id="设置开机启动">设置开机启动
&lt;/h4>&lt;p>设置开机自启动，需要点击界面左侧菜单 主页 选项卡，找到 开机自启动 并开启开关即可，开启状态下按钮状态为绿色，如下图所示为开启状态。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-11.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-11_hu1548277032482433327.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-11_hu393259515982670927.png 1024w"
loading="lazy"
alt="开机启动"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;p>&lt;span style = " color:red "> 有一点值得注意，如果未选择开机启动，而关机的时候直接未退出clash就关机了，会导致下次开机的时候无法连接网络，解决方式是重新打开clash，然后正常退出或者不退出clash都可能 &lt;/span>&lt;/p>
&lt;h4 id="更新配置文件">更新配置文件
&lt;/h4>&lt;p>点击界面左侧菜单 配置，点击 更新全部 即可更新所有配置文件，如下图所示。&lt;/p>
&lt;p>&lt;span style = " color:red "> 这个更新只针对远程导入的订阅 &lt;/span>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-12.png"
width="852"
height="605"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-12_hu7628735218692072487.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-12_hu2023205529685917610.png 1024w"
loading="lazy"
alt="更新配置文件"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="337px"
>&lt;/p>
&lt;h3 id="修改clash中的规则信息">修改clash中的规则信息
&lt;/h3>&lt;p>&lt;span style="color:red"> 改过配置之后不要刷新订阅，不然就没了，不过不更新又不会加载规则，可以通过切换订阅文件的方式加载规则&lt;/span>&lt;/p>
&lt;p>&lt;span style="color:red"> 配置是按照顺序来的，如果说你都用了域名过滤，写在前面的会优先级更高，此外还有DOMAIN-SUFFIX 和DOMAIN的区别，看下面单独的讲解&lt;/span>&lt;/p>
&lt;p>可以复制一个你原有的规则，然后修改里面的内容，然后保存。通过加载本地文件的方式加载&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/index.png"
width="2000"
height="400"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/index_hu16140687705321374886.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/index_hu18110381635948734654.png 1024w"
loading="lazy"
alt="新建内容"
class="gallery-image"
data-flex-grow="500"
data-flex-basis="1200px"
>&lt;/p>
&lt;h4 id="1-获取代理服务器信息">&lt;strong>1. 获取代理服务器信息&lt;/strong>
&lt;/h4>&lt;p>你需要从你的代理服务提供商（比如 V2Ray、Shadowsocks、Trojan 等）那里拿到服务器信息，通常包括：&lt;/p>
&lt;ul>
&lt;li>服务器地址（IP 或域名）&lt;/li>
&lt;li>端口号&lt;/li>
&lt;li>加密方式&lt;/li>
&lt;li>密码或 UUID&lt;/li>
&lt;li>协议类型（如 vmess、vless、ss 等）&lt;/li>
&lt;/ul>
&lt;p>例如，一个简单的 Shadowsocks 服务器信息可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">服务器地址: example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">端口: 8388
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">加密: aes-256-gcm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">密码: yourpassword
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-创建基础配置文件">&lt;strong>2. 创建基础配置文件&lt;/strong>
&lt;/h4>&lt;p>创建一个 &lt;code>config.yaml&lt;/code> 文件，然后用文本编辑器（如 Notepad++、VS Code）打开。以下是一个简单的配置文件模板：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 基本设置&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7890&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 本地 HTTP 代理端口&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">socks-port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7891&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 本地 SOCKS5 代理端口&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">allow-lan&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 是否允许局域网连接，false 表示仅本地使用&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rule &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 工作模式：rule（规则分流）、global（全局代理）、direct（直连）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">log-level&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">info &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 日志级别，可选 silent/info/warning/error/debug&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 代理节点列表&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ss1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 节点名称，自定义即可&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ss &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 协议类型，这里是 Shadowsocks&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">server&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">example.com &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 服务器地址&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">8388&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 端口&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cipher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">aes-256-gcm &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 加密方式&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;yourpassword&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 密码&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 代理组（用于选择节点）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 组名称&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 类型：select 表示手动选择&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;ss1&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 这里引用上面定义的节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 规则&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,google.com,auto &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 匹配 google.com 的流量走 auto 组&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,baidu.com,DIRECT &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 百度直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">MATCH,auto &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 其他未匹配的流量走 auto 组&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3-解释配置文件的主要部分">&lt;strong>3. 解释配置文件的主要部分&lt;/strong>
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>端口设置&lt;/strong>：&lt;code>port&lt;/code> 和 &lt;code>socks-port&lt;/code> 是 Clash 在本地监听的端口，应用程序通过这些端口连接代理。&lt;/li>
&lt;li>&lt;strong>proxies&lt;/strong>：这里列出你的所有代理节点。可以添加多个，比如 &lt;code>ss1&lt;/code>、&lt;code>ss2&lt;/code> 等。&lt;/li>
&lt;li>&lt;strong>proxy-groups&lt;/strong>：代理组用来组织节点，可以手动选择或设置自动选择（如 &lt;code>url-test&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>rules&lt;/strong>：规则决定哪些流量走代理，哪些直连。可以用域名、IP 等条件匹配。&lt;/li>
&lt;/ul>
&lt;h4 id="4-保存并加载配置文件">&lt;strong>4. 保存并加载配置文件&lt;/strong>
&lt;/h4>&lt;ul>
&lt;li>将文件保存为 &lt;code>config.yaml&lt;/code>。&lt;/li>
&lt;li>打开 Clash 客户端，把文件拖进去，或者在设置中指定文件路径。&lt;/li>
&lt;li>启动 Clash，检查是否能正常连接。&lt;/li>
&lt;/ul>
&lt;h4 id="5-测试">&lt;strong>5. 测试&lt;/strong>
&lt;/h4>&lt;ul>
&lt;li>打开浏览器，设置代理为 &lt;code>127.0.0.1:7890&lt;/code>（HTTP）或 &lt;code>127.0.0.1:7891&lt;/code>（SOCKS5）。&lt;/li>
&lt;li>访问一个被代理的网站（比如 google.com），看看是否成功。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="进阶">进阶
&lt;/h3>&lt;h4 id="使用api切换节点">使用api切换节点
&lt;/h4>&lt;p>在clash的设置中打开外部控制&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-14.png"
width="1467"
height="858"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-14_hu10156285051394050468.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-14_hu17922755317052254313.png 1024w"
loading="lazy"
alt="外部控制设置"
class="gallery-image"
data-flex-grow="170"
data-flex-basis="410px"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="c1"># 顶部添加&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">API_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:9097&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SECRET&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;clashapikeyXXXX&amp;#34;&lt;/span> &lt;span class="c1"># 如果设置了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">GROUP_NAME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;🇺🇸 美国&amp;#34;&lt;/span> &lt;span class="c1"># 你的proxy-group名字，必须是type: select的组&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">clash_api_headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;User-Agent&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Accept&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;application/json, text/plain, */*&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Accept-Language&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;en-US,en;q=0.9&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Authorization&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">SECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span> &lt;span class="c1"># &amp;lt;--- 必须加上这一行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在 get_proxies() 后，添加一个 encoded 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ENCODED_GROUP_NAME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">quote&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 先获取所有可用节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_proxies&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">GROUP_NAME&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;Authorization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">SECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">SECRET&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxies_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="s2">&amp;#34;proxies&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Available proxy groups:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># print(proxies_data)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">group_name&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">proxies_data&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">proxies_data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">group_name&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;select&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">group_name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">UnicodeEncodeError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; - [包含特殊字符的组名] (&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">group_name&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> chars)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">GROUP_NAME&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">proxies_data&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Warning: Group &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; not found. Using first available select group.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">group_name&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">proxies_data&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">proxies_data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">group_name&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;select&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GROUP_NAME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">group_name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proxies_data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;all&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="c1"># 返回节点名列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_proxies&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proxies_list&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修改 switch_proxy 函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">switch_proxy&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_proxy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">choice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proxies_list&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;尝试切换到节点: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">new_proxy&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 使用 encoded 的组名在 URL 中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">put&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies/&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ENCODED_GROUP_NAME&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">#如果grounp Name里面有emoji，不用encoded会出错&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">new_proxy&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">clash_api_headers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 关键：检查响应！Clash 切换成功返回 204 No Content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">204&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;成功切换到节点: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">new_proxy&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;切换失败！状态码: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, 响应: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 可选：打印当前实际选中的节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies/&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ENCODED_GROUP_NAME&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">clash_api_headers&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;当前实际节点: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;now&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 等待切换生效（有些节点需要几秒）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;切换异常: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例爬虫循环&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1"># 减少循环次数用于测试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switch_proxy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;User-Agent&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Accept&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;application/json, text/plain, */*&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Accept-Language&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;en-US,en;q=0.9&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 你的爬虫请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;https://httpbin.org/ip&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;当前IP:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exceptions&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;请求失败 (Clash代理未运行?): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 尝试不使用代理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;https://httpbin.org/ip&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7897&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;直连IP:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exceptions&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;直连也失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e2&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-13.png"
width="516"
height="346"
srcset="https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-13_hu4428168326768777320.png 480w, https://www.zata.cc/p/clash-%E6%95%99%E7%A8%8B/images/index/image-13_hu8107863520769347648.png 1024w"
loading="lazy"
alt="使用api切换"
class="gallery-image"
data-flex-grow="149"
data-flex-basis="357px"
>&lt;/p>
&lt;h4 id="domain-suffix-和-domain--顺序影响行为">DOMAIN-SUFFIX 和 DOMAIN （顺序影响行为）
&lt;/h4>&lt;p>&lt;strong>区别&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>DOMAIN-SUFFIX 匹配的是域名后缀，覆盖范围更广（包括所有子域名）。&lt;/li>
&lt;li>DOMAIN 匹配的是精确域名，覆盖范围更窄（仅限指定域名）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>行为&lt;/strong>&lt;/p>
&lt;p>大多数软件的规则解析顺序: 许多工具（如 Surge、Clash、Adblock、uBlock Origin）按配置文件中规则的从上到下顺序进行匹配。也就是说，先出现的规则会优先被检查和应用。如果匹配成功，后续规则可能被忽略（除非软件支持多重匹配）。&lt;/p>
&lt;p>&lt;strong>哪个在前？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>通用实践&lt;/strong>: 在大多数配置文件中，建议将&lt;strong>更具体的规则&lt;/strong>（如 &lt;code>DOMAIN&lt;/code>）写在&lt;strong>前面&lt;/strong>，将&lt;strong>更宽泛的规则&lt;/strong>（如 &lt;code>DOMAIN-SUFFIX&lt;/code>）写在后面。原因如下：
&lt;ul>
&lt;li>精确匹配（&lt;code>DOMAIN&lt;/code>）通常表示用户希望对特定域名进行特殊处理，优先级更高。&lt;/li>
&lt;li>后缀匹配（&lt;code>DOMAIN-SUFFIX&lt;/code>）覆盖范围广，适合作为“兜底”规则，处理未被精确匹配的子域名。&lt;/li>
&lt;li>示例（推荐写法）：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">DOMAIN,youtube.bo,YouTube
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DOMAIN-SUFFIX,youtube.bo,YouTube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>这样可以确保 &lt;code>youtube.bo&lt;/code> 被精确匹配的规则优先处理，而子域名（如 &lt;code>www.youtube.bo&lt;/code>）由后缀规则处理。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>例外情况&lt;/strong>: 如果软件明确要求按某种顺序（例如 Clash 或 Surge 的文档可能指定），需要遵循其规则。有些软件可能要求 &lt;code>DOMAIN-SUFFIX&lt;/code> 优先，因为它覆盖范围更大。&lt;/li>
&lt;/ul>
&lt;h4 id="进阶配置示例">&lt;strong>进阶配置示例&lt;/strong>
&lt;/h4>&lt;p>如果你有多个节点，想自动选择延迟最低的，或者需要更复杂的规则，可以参考以下示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7890&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">socks-port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7891&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">allow-lan&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rule&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">log-level&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">info&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ss1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ss&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">server&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">example1.com&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">8388&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cipher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">aes-256-gcm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;yourpassword1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ss2&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ss&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">server&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">example2.com&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">8388&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cipher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">aes-256-gcm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;yourpassword2&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">url-test &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 自动选择延迟最低的节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;ss1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;ss2&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://www.gstatic.com/generate_204&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 测试延迟的 URL&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">interval&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">300&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 每 300 秒测试一次&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,google.com,auto&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,baidu.com,DIRECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GEOIP,CN,DIRECT &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 中国 IP 直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">MATCH,auto &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 其他走 auto 组&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h4 id="常见问题">&lt;strong>常见问题&lt;/strong>
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>配置文件报错怎么办？&lt;/strong>
&lt;ul>
&lt;li>检查 YAML 格式是否正确，比如缩进必须是 2 个空格，不能用 Tab。&lt;/li>
&lt;li>确保节点信息无误。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>想添加更多规则怎么办？&lt;/strong>
&lt;ul>
&lt;li>可以参考 Clash 的官方文档，或者告诉我你的需求，我帮你写。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>哪里找现成的规则？&lt;/strong>
&lt;ul>
&lt;li>网上有很多开源规则集，比如 GitHub 上，可以通过 Clash 的订阅功能导入。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h4 id="一个clash配置的信息如下">一个clash配置的信息如下
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7890&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">socks-port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">7891&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">allow-lan&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Rule&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">log-level&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">info&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">external-controller&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">9090&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="nt">, server: pfxwhz.cscsgsg.xyz, port: 16007, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="nt">, server: epueyo.gxcvbmj.xyz, port: 58559, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇳🇱 CN2-V238-荷兰-1x-NF*, server: cyjsnl.ghskgvb.xyz, port: 20020, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇨🇦 CN2-V237-加拿大-1x, server: pfxwhz.cscsgsg.xyz, port: 12010, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="nt">, server: fdksxn.kghkjasfh.xyz, port: 12232, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇳🇿 CN2-V339-新西兰-1x-NF*, server: fdksxn.kghkjasfh.xyz, port: 12233, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇸🇬 福利-V345-新加坡-0.1x-15M-NF, server: vdiogsnf.kghkjasfh.xyz, port: 12543, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇭🇰 福利-V234-香港-0.1x-15M-NF, server: vdiogsnf.kghkjasfh.xyz, port: 12544, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">name: 🇭🇰 福利-V114-香港-0.1x-仅限emby, server: vdiogsnf.kghkjasfh.xyz, port: 12545, type: vmess, uuid: 4ed1483a-8bd9-3380-8d28-fa68243292ba, alterId: 0, cipher: auto, tls: false, skip-cert-verify: true, udp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎞️ Prime Video&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 香港&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 美国&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇯🇵 日本&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 新加坡&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇹🇼 台湾&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎮👑👑 HBO MAX&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">📹️ HBOGO Asia&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">💿 AbemaTV&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V316-日本-0.5x-50M-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V315-日本-1x-NF&amp;amp;Abema*（ChatGPT动态解锁测试）&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V353-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V356-日本-4x-家宽-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V364-日本-0.5x-50M-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V365-日本-1x-NF&amp;amp;Abema*（ChatGPT动态解锁测试）&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V366-日本-1x-NF&amp;amp;Abema*（ChatGPT动态解锁测试）&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 IPLC-V240-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🔞 Pornhub&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎶 TikTok&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V241-香港-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V330-新加坡-1x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V347-新加坡-0.5x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎧 Spotify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 CN2-V327-香港-1x-HKBN-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V346-香港-0.6x-HGC-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V241-香港-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V330-新加坡-1x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V347-新加坡-0.5x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎮️ 游戏平台&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🤖 ChatGPT、Claude、Gemini、微软AI&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 美国&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇯🇵 日本&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 新加坡&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇹🇼 台湾&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 CN2-V327-香港-1x-HKBN-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V346-香港-0.6x-HGC-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V241-香港-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V330-新加坡-1x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V347-新加坡-0.5x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Ⓜ️ 微软服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V321-香港-0.6x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V322-香港-0.6x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V325-香港-0.6x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 CN2-V326-香港-1x-HKBN-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 CN2-V327-香港-1x-HKBN-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V346-香港-0.6x-HGC-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V241-香港-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V330-新加坡-1x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V347-新加坡-0.5x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">📲 电报信息&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">♻️ 自动选择&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V346-香港-0.6x-HGC-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 CN2-V241-香港-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V330-新加坡-1x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇸🇬 CN2-V347-新加坡-0.5x-NF&amp;amp;Disney+*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V216-美国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V215-美国-2x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V213-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V212-美国-1x-NF&amp;amp;HBO&amp;amp;Hulu*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 CN2-V217-美国-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V305-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V306-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">📢 谷歌FCM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">♻️ 自动选择&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DIRECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V305-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 IPLC-V101-新加坡-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 IPLC-V102-新加坡-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇰🇷 IPLC-V320-韩国-1x-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇰🇷 IPLC-V230-韩国家宽-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V350-美国-1x-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V351-美国-2x-夏威夷-NF&amp;amp;HBO&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V355-美国-4x-家宽-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V371-美国-1x-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V372-美国-1x-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V373-美国Starlink-8x-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇺🇸 IPLC-V374-美国家宽-4x-NF&amp;amp;HBO&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇺🇸 CN2-V211-美国-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V227-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V228-日本-1x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V328-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇯🇵 CN2-V329-日本-0.5x-NF&amp;amp;Abema*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇬🇧 CN2-V229-英国-1x-NF&amp;amp;BBC*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇱 CN2-V238-荷兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇨🇦 CN2-V237-加拿大-1x&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇦🇺 CN2-V338-澳大利亚-1x-NF&amp;amp;7plus*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">🐟 漏网之鱼&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V301-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V302-香港-1x-NF&amp;amp;Disney&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V303-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;🇭🇰 IPLC-V304-香港-1x-NF&amp;amp;Disney*&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇳🇿 CN2-V339-新西兰-1x-NF*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇸🇬 福利-V345-新加坡-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V234-香港-0.1x-15M-NF&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">🇭🇰 福利-V114-香港-0.1x-仅限emby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,apple.comscoreresearch.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,aaplimg.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,akadns.net,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple-cloudkit.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple-dns.net,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple-mapkit.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple.co,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple.com.cn,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,apple.news,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,appstore.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,cdn-apple.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,crashlytics.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,icloud-content.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,icloud.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,icloud.com.cn,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,itunes.com,🍎 苹果服务&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.112.0/23,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.114.0/24,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.127.232/30,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.155.128/27,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.155.224/27,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.166.128/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.245.166.176/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.248.224.0/21,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.248.232.0/23,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.250.186.0/28,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.250.186.16/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.250.186.128/26,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.250.186.192/28,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,13.250.186.208/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.152.10.0/24,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.152.24.0/26,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.152.24.128/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.160.55.112/29,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.161.66.0/25,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.161.66.128/26,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,15.161.135.64/26,🎥 NETFLIX,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,dlandroid.rcv.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hub5idx.v6.shub.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hub5pn.wap.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hub5pnc.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hub5pr.v6.phub.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hubciddata.sandai.net,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-KEYWORD,mypikpak,🚀 手动切换&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,acl4.ssr,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,ip6-localhost,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR6,::1/128,🎯 全球直连,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR6,fc00::/7,🎯 全球直连,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,instant.arubanetworks.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,setmeup.arubanetworks.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,router.asus.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,www.asusrouter.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,hiwifi.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,leike.cc,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,cm.steampowered.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,steamchina.com,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,8.128.0.0/10,🎯 全球直连,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-SUFFIX,smtp,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN-KEYWORD,aria2,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">PROCESS-NAME,Weiyun.exe,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">PROCESS-NAME,baidunetdisk.exe,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,alt1-mtalk.google.com,📢 谷歌FCM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,alt8-mtalk.google.com,📢 谷歌FCM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">DOMAIN,mtalk.google.com,📢 谷歌FCM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,64.233.177.188/32,📢 谷歌FCM,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">IP-CIDR,64.233.186.188/32,📢 谷歌FCM,no-resolve&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GEOIP,CN,🎯 全球直连&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">MATCH,🐟 漏网之鱼&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Nginx</title><link>https://www.zata.cc/p/nginx%E4%BD%BF%E7%94%A8/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/nginx%E4%BD%BF%E7%94%A8/</guid><description>&lt;img src="https://www.zata.cc/p/nginx%E4%BD%BF%E7%94%A8/image/index/index.png" alt="Featured image of post Nginx" />&lt;h1 id="nginx-详细使用教程">Nginx 详细使用教程
&lt;/h1>&lt;h2 id="引言nginx-核心概念与架构概览">引言：Nginx 核心概念与架构概览
&lt;/h2>&lt;p>Nginx 作为一款高性能的开源 Web 服务器和反向代理服务器，自 2002 年由 Igor Sysoev 创建以来，其设计初衷便是为了解决著名的“C10K 问题”——即如何在单台服务器上同时处理上万个并发连接 [1]。与传统的 Web 服务器相比，Nginx 的核心优势在于其轻量级、高稳定性、低资源占用和强大的高并发处理能力 [1]。它所扮演的角色远不止于 Web 服务器，还广泛应用于反向代理、负载均衡、HTTP 缓存等关键领域 [1]。Nginx 能够实现如此卓越性能的根本原因，在于其底层架构的独特设计，即异步非阻塞事件驱动模型和主/工作进程模型。&lt;/p>
&lt;h3 id="11-异步非阻塞事件驱动模型深度解析">1.1 异步非阻塞事件驱动模型深度解析
&lt;/h3>&lt;p>传统的 Web 服务器通常采用“多进程/多线程阻塞 I/O”模型，即每一个客户端连接都由一个独立的进程或线程来处理 [3]。这种模型在并发连接数较低时工作良好，但当面对海量并发连接时，服务器会因创建和销毁大量进程/线程、以及频繁的上下文切换而导致 CPU 资源被大量消耗在调度而非实际工作上 [3]。&lt;/p>
&lt;p>Nginx 彻底颠覆了这种模式。它采用了一种事件驱动模型，其核心思想是“将等待责任交由应用层”，即服务器不会阻塞等待 I/O 操作（例如从网络套接字读取数据或向磁盘写入文件），而是在 I/O 就绪时，通过操作系统提供的事件通知机制（如 Linux 上的 epoll、BSD 上的 kqueue）来被唤醒并处理 [3]。这意味着 Nginx 的少数几个工作进程（Worker Process）就能够高效地处理成千上万个并发连接。其高性能的本质并非源于单个进程的超高计算能力，而是其架构从根本上避免了传统模型在高并发下必然出现的瓶颈，从而在有限的系统资源下实现了高度的并行处理 [3]。&lt;/p>
&lt;h3 id="12-主工作进程masterworker架构模型">1.2 主/工作进程（Master/Worker）架构模型
&lt;/h3>&lt;p>Nginx 的运行模型由一个主进程（Master Process）和多个工作进程（Worker Process）组成 [4]。主进程的主要职责是管理工作进程、读取和解析配置文件、处理外部信号（如 reload、stop）以及进行无停机升级 [4]。它本身不直接处理任何网络请求，而是作为整个 Nginx 服务的“指挥中心”存在 [4]。&lt;/p>
&lt;p>工作进程则是 Nginx 的“执行者”，每个工作进程都是独立运行的，负责处理来自客户端的所有连接和请求 [4]。由于工作进程之间相互独立，它们在处理请求时无需依赖复杂的加锁机制，这不仅减少了锁带来的开销，也极大地简化了编程和问题排查 [5]。当一个工作进程因某个请求而崩溃时，并不会影响到其他工作进程的正常运行，主进程能够迅速感知到异常并拉起一个新的工作进程来顶替 [5]。这种优雅的进程管理模式不仅提升了服务的稳定性和容错能力，也使得 &lt;strong>无中断配置重载&lt;/strong>（&lt;code>nginx -s reload&lt;/code>）和 &lt;strong>平滑升级&lt;/strong> 成为可能，极大地保障了线上服务的可用性 [5]。&lt;/p>
&lt;h2 id="第一部分nginx-的安装与基础管理">第一部分：Nginx 的安装与基础管理
&lt;/h2>&lt;p>本节将提供在不同主流操作系统上部署 Nginx 的详细指南，并介绍其基础管理命令。&lt;/p>
&lt;h3 id="21-基于包管理器的快速部署">2.1 基于包管理器的快速部署
&lt;/h3>&lt;p>对于大多数 Linux 发行版，使用其自带的包管理器是安装 Nginx 最便捷的方式。&lt;/p>
&lt;p>&lt;strong>在 Ubuntu/Debian 上：&lt;/strong>
首先，更新本地的软件包索引以确保获取最新的软件列表，然后通过 &lt;code>apt&lt;/code> 命令安装 Nginx [8]。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装完成后，如果服务器启用了防火墙（如 &lt;code>ufw&lt;/code>），需要允许 HTTP 和 HTTPS 流量通过。Nginx 在安装时会注册相应的防火墙配置文件，可以使用 &lt;code>sudo ufw allow 'Nginx Full'&lt;/code> 来同时开启 80 和 443 端口 [8]。&lt;/p>
&lt;p>&lt;strong>在 CentOS/RHEL 上：&lt;/strong>
Nginx 在 CentOS 的默认仓库中可能不是最新版本，因此通常建议先添加 EPEL（Extra Packages for Enterprise Linux）软件仓库 [9]。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install epel-release
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum install nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于使用了 &lt;code>firewalld&lt;/code> 的系统，需要手动添加 HTTP/HTTPS 服务的永久规则并重新加载防火墙 [10]。&lt;/p>
&lt;h3 id="22-从源码编译安装定制化与模块化">2.2 从源码编译安装：定制化与模块化
&lt;/h3>&lt;p>源码编译是另一种常见的安装方式，它提供了高度的灵活性和可定制性，能够根据具体需求选择和编译特定的功能模块 [9]。&lt;/p>
&lt;p>在编译前，需要安装一系列依赖库。Nginx 是用 C 语言开发的，因此需要 &lt;code>gcc&lt;/code> 编译环境 [9]。此外，一些核心功能也依赖于外部库：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>PCRE (Perl Compatible Regular Expressions)&lt;/strong>：Nginx 的 http 模块使用 PCRE 库来解析正则表达式，例如在 &lt;code>location&lt;/code> 匹配和 &lt;code>rewrite&lt;/code> 规则中 [9]。&lt;/li>
&lt;li>&lt;strong>zlib&lt;/strong>：用于支持 HTTP 数据包的 Gzip 压缩功能 [9]。&lt;/li>
&lt;li>&lt;strong>OpenSSL&lt;/strong>：Nginx 支持 https 协议，因此需要 OpenSSL 库来提供加密算法和 SSL 协议支持 [9]。&lt;/li>
&lt;/ul>
&lt;p>在 CentOS 下，可以使用 &lt;code>yum&lt;/code> 命令一次性安装所有依赖 [9]：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 Ubuntu 下，则使用 &lt;code>apt&lt;/code> [11]。&lt;/p>
&lt;p>安装依赖后，可以从 Nginx 官网下载源码包，然后进行配置、编译和安装 [9]。在 &lt;code>./configure&lt;/code> 阶段，可以根据需要添加或删除模块。例如，要启用 HTTPS 支持，必须在配置参数中包含 &lt;code>--with-http_ssl_module&lt;/code> [11]。如果编译时缺少该模块，即使在配置文件中正确设置了 HTTPS，Nginx 在启动时也会报错 &lt;code>https protocol requires SSL support&lt;/code> [12]。这揭示了一个重要的事实：仅仅修改配置文件是不够的，理解 Nginx 的模块化设计及其编译依赖关系是解决许多深层次问题的关键 [11]。&lt;/p>
&lt;h3 id="23-nginx-服务基础操作与管理">2.3 Nginx 服务基础操作与管理
&lt;/h3>&lt;p>Nginx 服务可以通过多种方式进行管理。&lt;/p>
&lt;p>&lt;strong>使用 systemctl：&lt;/strong> 这是现代 Linux 系统管理服务的主流方式。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>启动：&lt;/strong> &lt;code>sudo systemctl start nginx&lt;/code> [8]&lt;/li>
&lt;li>&lt;strong>停止：&lt;/strong> &lt;code>sudo systemctl stop nginx&lt;/code> [8]&lt;/li>
&lt;li>&lt;strong>重启：&lt;/strong> &lt;code>sudo systemctl restart nginx&lt;/code> [8]&lt;/li>
&lt;li>&lt;strong>重载：&lt;/strong> &lt;code>sudo systemctl reload nginx&lt;/code>，此命令会在不中断现有连接的情况下，重新加载配置文件并使之生效 [8]。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>使用 Nginx 自身命令：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>nginx -s stop&lt;/code>：快速停止服务 [14]。&lt;/li>
&lt;li>&lt;code>nginx -s reload&lt;/code>：重载配置文件 [7]。&lt;/li>
&lt;/ul>
&lt;p>在进行任何服务重载或重启之前，务必使用 &lt;code>nginx -t&lt;/code> 命令来测试配置文件的语法正确性。该命令不仅会检查语法，还会尝试打开配置文件中引用到的文件 [7]。这是避免因配置错误导致服务中断的关键步骤。&lt;/p>
&lt;h2 id="第二部分精通-nginx-配置文件nginxconf">第二部分：精通 Nginx 配置文件（nginx.conf）
&lt;/h2>&lt;p>Nginx 的核心在于其配置文件 &lt;code>nginx.conf&lt;/code>，它决定了 Nginx 的所有行为。该文件采用 Nginx 自定的语法，以 &lt;code>#&lt;/code> 声明单行注释，每条指令以 &lt;code>;&lt;/code> 结尾 [17]。&lt;/p>
&lt;h3 id="31-配置文件层级结构深度解析">3.1 配置文件层级结构深度解析
&lt;/h3>&lt;p>&lt;code>nginx.conf&lt;/code> 的结构是分层嵌套的，主要分为以下几个区块 [17]：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>main（全局块）：&lt;/strong> 位于配置文件的最外层，用于设置影响 Nginx 服务器整体运行的指令，例如定义运行 Nginx 的用户和用户组（&lt;code>user&lt;/code>），以及工作进程数（&lt;code>worker_processes&lt;/code>）[18]。&lt;/li>
&lt;li>&lt;strong>events：&lt;/strong> 此区块的指令主要影响 Nginx 服务器与用户的网络连接，例如设置每个工作进程可以支持的最大连接数（&lt;code>worker_connections&lt;/code>）和选择事件驱动模型（&lt;code>use epoll&lt;/code>）[18]。&lt;/li>
&lt;li>&lt;strong>http：&lt;/strong> 用于配置 HTTP 协议相关的指令，例如设定 MIME 类型、日志格式、文件编码以及启用 Gzip 压缩等 [19]。&lt;code>http&lt;/code> 块内部可以包含多个 &lt;code>server&lt;/code> 块。&lt;/li>
&lt;li>&lt;strong>server：&lt;/strong> 用于定义一个虚拟主机，它可以监听特定的端口和域名，处理相应的 HTTP 请求 [17]。&lt;code>http&lt;/code> 块中至少需要定义一个 &lt;code>server&lt;/code> 块才能处理请求 [17]。&lt;/li>
&lt;li>&lt;strong>location：&lt;/strong> &lt;code>server&lt;/code> 块中的核心指令，用于根据请求的 URI 对请求进行路由处理 [17]。一个 &lt;code>server&lt;/code> 块中可以包含多个 &lt;code>location&lt;/code> 块 [17]。&lt;/li>
&lt;/ul>
&lt;h3 id="32-location-匹配规则与优先级">3.2 location 匹配规则与优先级
&lt;/h3>&lt;p>&lt;code>location&lt;/code> 指令是 Nginx 配置的精髓，它负责根据请求 URI 来决定如何处理请求。Nginx 的 &lt;code>location&lt;/code> 匹配遵循一套严格的优先级规则，这对于避免配置冲突至关重要。理解这套规则，能够将配置从简单的指令堆砌提升为一种精巧的“路由艺术” [19]。&lt;/p>
&lt;p>Nginx 优先选择精确匹配，其次是前缀匹配，最后是正则表达式匹配。不同前缀的匹配规则和优先级如下：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">匹配前缀&lt;/th>
&lt;th style="text-align: left">匹配规则&lt;/th>
&lt;th style="text-align: left">优先级&lt;/th>
&lt;th style="text-align: left">典型应用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>=&lt;/code>&lt;/td>
&lt;td style="text-align: left">精确匹配。如果 URI 严格匹配，则停止搜索。&lt;/td>
&lt;td style="text-align: left">1&lt;/td>
&lt;td style="text-align: left">快速处理根路径（&lt;code>/&lt;/code>）的请求，例如 &lt;code>location = /&lt;/code>。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>^~&lt;/code>&lt;/td>
&lt;td style="text-align: left">普通字符串前缀匹配。如果匹配成功，则停止搜索。&lt;/td>
&lt;td style="text-align: left">2&lt;/td>
&lt;td style="text-align: left">强制匹配特定目录，例如 &lt;code>location ^~ /images/&lt;/code>，以避免被优先级更低的正则匹配覆盖。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>~&lt;/code>&lt;/td>
&lt;td style="text-align: left">区分大小写的正则表达式匹配。&lt;/td>
&lt;td style="text-align: left">3&lt;/td>
&lt;td style="text-align: left">处理特定的文件类型或包含特定模式的 URI。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>~*&lt;/code>&lt;/td>
&lt;td style="text-align: left">不区分大小写的正则表达式匹配。&lt;/td>
&lt;td style="text-align: left">4&lt;/td>
&lt;td style="text-align: left">匹配文件扩展名，例如 `location ~* .(jpg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">无前缀&lt;/td>
&lt;td style="text-align: left">普通字符串前缀匹配。&lt;/td>
&lt;td style="text-align: left">5&lt;/td>
&lt;td style="text-align: left">默认匹配规则，例如 &lt;code>location /documents/&lt;/code>，但会继续查找更精确的匹配。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>/&lt;/code>&lt;/td>
&lt;td style="text-align: left">通用匹配。任何请求都会匹配到该规则，作为最后的“捕获”规则。&lt;/td>
&lt;td style="text-align: left">6&lt;/td>
&lt;td style="text-align: left">通常用于将所有未被其他规则匹配到的请求转发给后端应用服务器。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>需要注意的是，&lt;code>location&lt;/code> 优先级是初学者最容易犯错的地方。例如，一个看似合理的正则匹配规则（&lt;code>location ~ \.html$&lt;/code>）可能会被一个优先级更高的普通匹配规则（&lt;code>location ^~ /documents/&lt;/code>）覆盖，导致期望的配置无法生效 [22]。而 &lt;code>^~&lt;/code> 的引入正是为了提供这种强制停止匹配的能力，确保某些路径（如静态资源路径）能够被确定性地处理 [19]。&lt;/p>
&lt;h3 id="33-nginx-内置变量与自定义变量">3.3 Nginx 内置变量与自定义变量
&lt;/h3>&lt;p>Nginx 提供了丰富的内置变量，可以用来获取和操作请求、响应、服务器环境等信息 [14]。这些变量以 &lt;code>$&lt;/code> 符号开头。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">变量名&lt;/th>
&lt;th style="text-align: left">描述&lt;/th>
&lt;th style="text-align: left">应用示例&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$request_uri&lt;/code>&lt;/td>
&lt;td style="text-align: left">包含请求参数的原始 URI，如 &amp;ldquo;/foo/bar.php?arg=baz&amp;rdquo;&lt;/td>
&lt;td style="text-align: left">&lt;code>return 200 '$request_uri';&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$uri&lt;/code>&lt;/td>
&lt;td style="text-align: left">不带请求参数的当前 URI，如 &amp;ldquo;/foo/bar.html&amp;rdquo;&lt;/td>
&lt;td style="text-align: left">&lt;code>return 200 '$uri';&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$remote_addr&lt;/code>&lt;/td>
&lt;td style="text-align: left">客户端的 IP 地址&lt;/td>
&lt;td style="text-align: left">&lt;code>proxy_set_header X-Real-IP $remote_addr;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$remote_port&lt;/code>&lt;/td>
&lt;td style="text-align: left">客户端的端口号&lt;/td>
&lt;td style="text-align: left">&lt;code>return 200 '$remote_port';&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$server_name&lt;/code>&lt;/td>
&lt;td style="text-align: left">服务器的名称，取决于 &lt;code>server{}&lt;/code> 模块中配置的 &lt;code>server_name&lt;/code>&lt;/td>
&lt;td style="text-align: left">&lt;code>proxy_set_header Host $server_name;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$server_addr&lt;/code>&lt;/td>
&lt;td style="text-align: left">服务器的 IP 地址&lt;/td>
&lt;td style="text-align: left">&lt;code>return 200 '$server_addr';&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$server_port&lt;/code>&lt;/td>
&lt;td style="text-align: left">请求到达服务器的端口号&lt;/td>
&lt;td style="text-align: left">&lt;code>return 200 '$server_port';&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$request_method&lt;/code>&lt;/td>
&lt;td style="text-align: left">客户端请求的动作，通常为 GET 或 POST&lt;/td>
&lt;td style="text-align: left">&lt;code>if ($request_method = POST) {... }&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>$host&lt;/code>&lt;/td>
&lt;td style="text-align: left">请求头中的 Host 字段&lt;/td>
&lt;td style="text-align: left">&lt;code>proxy_set_header Host $host;&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>除了内置变量，Nginx 也支持使用 &lt;code>set&lt;/code> 指令来自定义变量，例如 &lt;code>set $port_type 8x;&lt;/code> [17]。需要注意的是，&lt;code>set&lt;/code> 指令不能用于给 Nginx 的内置变量赋值 [17]。&lt;/p>
&lt;h2 id="第三部分nginx-核心功能详解与实战">第三部分：Nginx 核心功能详解与实战
&lt;/h2>&lt;p>本节将详细阐述 Nginx 最核心的三大功能，并提供可直接使用的配置示例。&lt;/p>
&lt;h3 id="41-作为-web-服务器静态文件托管与虚拟主机">4.1 作为 Web 服务器：静态文件托管与虚拟主机
&lt;/h3>&lt;p>Nginx 凭借其高效的静态文件服务能力，被广泛用作 Web 服务器。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>静态文件托管：&lt;/strong> 使用 &lt;code>root&lt;/code> 或 &lt;code>alias&lt;/code> 指令可以轻松配置静态文件服务。例如，&lt;code>location /images/ { root /data; }&lt;/code> 将 &lt;code>/images/&lt;/code> 路径下的请求映射到服务器文件系统中的 &lt;code>/data/images/&lt;/code> 目录 [14]。这种 &lt;strong>动静分离&lt;/strong> 的策略是 Nginx 的重要应用，它将动态请求（如 &lt;code>*.php&lt;/code>）交给后端应用服务器处理，而由 Nginx 直接处理静态资源（如图片、CSS、JS），从而显著减轻后端服务器的负载 [1]。&lt;/li>
&lt;li>&lt;strong>虚拟主机配置：&lt;/strong> Nginx 允许在同一台物理服务器上托管多个网站。通过在 &lt;code>http&lt;/code> 块中定义多个 &lt;code>server&lt;/code> 块，每个 &lt;code>server&lt;/code> 块通过 &lt;code>server_name&lt;/code> 和 &lt;code>listen&lt;/code> 指令监听不同的域名或端口，从而实现虚拟主机功能 [21]。&lt;/li>
&lt;/ul>
&lt;h3 id="42-作为反向代理服务器">4.2 作为反向代理服务器
&lt;/h3>&lt;p>反向代理是 Nginx 最强大、最常用的功能之一 [2]。与正向代理（隐藏客户端信息）不同，&lt;strong>反向代理（Reverse Proxy）&lt;/strong> 将客户端的请求转发给其背后的一个或多个后端服务器，从而隐藏了后端服务器的真实信息，并作为客户端与后端服务器之间的“中间人” [2]。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心指令 &lt;code>proxy_pass&lt;/code>：&lt;/strong> 该指令用于将请求转发到指定的后端服务器 URL [21]。例如，将 &lt;code>www.123.com&lt;/code> 的请求代理到本地运行在 8080 端口的 Tomcat 服务器 [21]：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">www.123.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://127.0.0.1:8080&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>代理请求头配置：&lt;/strong> 在进行反向代理时，为了确保后端服务器能正确获取客户端的真实信息，通常需要配置代理请求头 [14]。例如，&lt;code>proxy_set_header Host $host;&lt;/code> 和 &lt;code>proxy_set_header X-Real-IP $remote_addr;&lt;/code> 分别用于将原始的 Host 头和客户端真实 IP 传递给后端服务器 [14]。&lt;/li>
&lt;/ul>
&lt;h3 id="43-作为负载均衡器">4.3 作为负载均衡器
&lt;/h3>&lt;p>在服务器集群环境中，Nginx 的负载均衡功能可以将请求分发到集群中的不同服务器，以实现流量的均衡和高可用性 [2]。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>核心模块 &lt;code>upstream&lt;/code>：&lt;/strong> &lt;code>upstream&lt;/code> 指令用于定义后端服务器集群，并可以配置服务器的 IP 地址、端口和权重等参数 [14]。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">upstream&lt;/span> &lt;span class="s">dramatic-offical-website&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="s">.192.106.133&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="s">.192.106.134&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">test-openai.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://dramatic-offical-website&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上述配置将 &lt;code>test-openai.com&lt;/code> 的请求代理到 &lt;code>dramatic-offical-website&lt;/code> 集群，由 Nginx 根据负载均衡算法分发到 &lt;code>10.192.106.133&lt;/code> 或 &lt;code>10.192.106.134&lt;/code> [14]。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>负载均衡算法：&lt;/strong> Nginx 内置了多种负载均衡算法 [6]：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">算法名称&lt;/th>
&lt;th style="text-align: left">工作原理&lt;/th>
&lt;th style="text-align: left">优缺点&lt;/th>
&lt;th style="text-align: left">典型应用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>轮询 (round-robin)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">默认算法。按时间顺序依次将请求分配给后端服务器，如果某个服务器宕机，会自动剔除。&lt;/td>
&lt;td style="text-align: left">&lt;strong>优点：&lt;/strong> 简单、无需配置。&lt;br>&lt;strong>缺点：&lt;/strong> 无法处理每台服务器的性能差异，容易导致性能较弱的服务器过载。&lt;/td>
&lt;td style="text-align: left">适用于后端服务器性能相同、并发量较小的场景。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>加权轮询 (weight)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">在轮询的基础上，为每个服务器设置一个权重（&lt;code>weight&lt;/code>）。权重越高的服务器，被分配到请求的几率越大。&lt;/td>
&lt;td style="text-align: left">&lt;strong>优点：&lt;/strong> 能够根据服务器的性能差异进行流量分配。&lt;br>&lt;strong>缺点：&lt;/strong> 如果权重设置不合理，仍可能导致流量分配不均。&lt;/td>
&lt;td style="text-align: left">适用于后端服务器性能存在差异，需要手动调整流量分配的场景。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>IP 哈希 (ip_hash)&lt;/strong>&lt;/td>
&lt;td style="text-align: left">根据客户端的 IP 地址进行哈希计算，将同一 IP 的所有请求固定地分发到同一台后端服务器。&lt;/td>
&lt;td style="text-align: left">&lt;strong>优点：&lt;/strong> 完美解决了 session 会话持久化问题。&lt;br>&lt;strong>缺点：&lt;/strong> 如果某些 IP 的请求量特别大，可能导致特定服务器的负载过高，造成负载不均衡。&lt;/td>
&lt;td style="text-align: left">适用于需要保持用户会话状态，且流量分布相对均匀的业务场景，如电商网站的购物车功能。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;/ul>
&lt;h2 id="第四部分高级功能与性能调优">第四部分：高级功能与性能调优
&lt;/h2>&lt;h3 id="51-https-安全配置">5.1 HTTPS 安全配置
&lt;/h3>&lt;p>为网站启用 HTTPS 是保护数据传输安全和提升用户信任度的关键步骤 [25]。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>手动部署 SSL/TLS 证书：&lt;/strong> 首先，需要获取 SSL/TLS 证书文件（&lt;code>.crt&lt;/code> 或 &lt;code>.pem&lt;/code>）和私钥文件（&lt;code>.key&lt;/code>）[11]。然后，在 Nginx 的配置文件中进行如下配置 [11]：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">443&lt;/span> &lt;span class="s">ssl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">your_domain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_certificate&lt;/span> &lt;span class="s">/path/to/your/certificate.crt&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_certificate_key&lt;/span> &lt;span class="s">/path/to/your/private.key&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此配置指示 Nginx 在 443 端口上监听 HTTPS 流量，并使用指定的证书和私钥。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用 Certbot 自动化配置：&lt;/strong> 对于个人网站或小型项目，Let&amp;rsquo;s Encrypt 提供了免费的 SSL/TLS 证书，并且可以通过 Certbot 工具实现自动化申请和续期 [25]。在 Ubuntu 上，可以安装 Certbot 及其 Nginx 插件 [25]：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install certbot python3-certbot-nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后运行以下命令，Certbot 将自动获取证书并配置 Nginx：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo certbot --nginx -d example.com -d www.example.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Certbot 还会自动设置一个定时任务来在证书过期前自动续期，极大地简化了维护工作 [25]。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="52-nginx-缓存机制proxy_cache">5.2 Nginx 缓存机制（proxy_cache）
&lt;/h3>&lt;p>Nginx 的缓存机制是作为反向代理提升性能最有效的手段之一，其核心思想是“用空间换时间” [24]。通过将后端服务器的响应缓存到 Nginx 的磁盘上，可以显著减少对后端服务器的请求次数，从而减轻其负载并缩短响应时间 [24]。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心指令：&lt;/strong> &lt;code>proxy_cache_path&lt;/code> 用于定义缓存目录的路径和配置参数，例如缓存级别（&lt;code>levels&lt;/code>）、共享内存区大小（&lt;code>keys_zone&lt;/code>）、最大缓存空间（&lt;code>max_size&lt;/code>）和缓存项的非活动时间（&lt;code>inactive&lt;/code>）[24]。&lt;code>proxy_cache&lt;/code> 则用于在 &lt;code>http&lt;/code>、&lt;code>server&lt;/code> 或 &lt;code>location&lt;/code> 块中启用缓存 [24]。&lt;/li>
&lt;li>&lt;strong>缓存策略：&lt;/strong> 通过 &lt;code>proxy_cache_valid&lt;/code>、&lt;code>proxy_no_cache&lt;/code>、&lt;code>proxy_cache_bypass&lt;/code> 等指令，可以精细地控制缓存行为，例如设置特定响应码的缓存时间，或者不缓存包含特定 Cookie 的请求 [24]。&lt;/li>
&lt;/ul>
&lt;h3 id="53-性能优化gzip-压缩">5.3 性能优化：Gzip 压缩
&lt;/h3>&lt;p>Gzip 压缩可以显著减少网络传输的数据量，从而加快页面加载速度 [19]。Nginx 提供了 &lt;code>gzip on&lt;/code> 指令来开启此功能 [19]。然而，大多数教程只简单地教导开启 Gzip，而忽略了其在高并发场景下的潜在性能开销。&lt;/p>
&lt;p>对于静态文件，Nginx 默认采用 &lt;strong>动态 Gzip 压缩&lt;/strong>，即在每次请求时实时压缩文件 [28]。当面对海量并发请求时，这种实时压缩会消耗大量的 CPU 资源，从而成为性能瓶颈 [28]。&lt;/p>
&lt;p>一个真实的案例表明，通过将动态 Gzip 压缩改为 &lt;strong>静态 Gzip 压缩&lt;/strong>，可以获得巨大的性能提升 [28]。其核心思想是：在部署时，预先将静态文件压缩成 &lt;code>.gz&lt;/code> 格式，然后配置 Nginx 使用 &lt;code>gzip_static on&lt;/code> 指令 [28]。这样，Nginx 在处理请求时会直接提供预先压缩好的文件，完全避免了实时的压缩计算开销 [28]。这种优化手段可以将 CPU 利用率从 90% 降至 7%，同时将吞吐量（QPS）提升 5 倍以上，是一种极为重要的性能调优手段 [28]。&lt;/p>
&lt;h2 id="第五部分常见问题排查与故障诊断">第五部分：常见问题排查与故障诊断
&lt;/h2>&lt;h3 id="61-日志分析故障排查的起点">6.1 日志分析：故障排查的起点
&lt;/h3>&lt;p>Nginx 的日志文件是排查故障的首要工具。默认情况下，Nginx 的日志文件位于 &lt;code>/var/log/nginx/&lt;/code> 目录下，其中 &lt;code>access.log&lt;/code> 记录所有访问请求，&lt;code>error.log&lt;/code> 记录所有错误和警告信息 [16]。如果日志路径被修改，可以通过 &lt;code>cat /etc/nginx/nginx.conf | grep 'access_log'&lt;/code> 命令来查找 [29]。&lt;/p>
&lt;p>在查看日志时，可以使用不同的命令来满足不同的需求 [16]：&lt;/p>
&lt;ul>
&lt;li>&lt;code>cat&lt;/code>：用于查看整个文件的内容。&lt;/li>
&lt;li>&lt;code>less&lt;/code>：用于分页查看大型日志文件。&lt;/li>
&lt;li>&lt;code>tail -f&lt;/code>：用于实时监控日志文件的更新，这在故障复现和问题诊断时非常有用。&lt;/li>
&lt;/ul>
&lt;h3 id="62-常见错误代码与解决方案">6.2 常见错误代码与解决方案
&lt;/h3>&lt;p>当 Nginx 出现问题时，错误代码是重要的诊断线索。一个结构化的诊断流程能够帮助用户从根本上解决问题，而不是治标不治本。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">错误代码&lt;/th>
&lt;th style="text-align: left">常见原因&lt;/th>
&lt;th style="text-align: left">诊断与解决方案&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>403 Forbidden&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Nginx 进程没有权限访问请求的资源文件或目录。&lt;/td>
&lt;td style="text-align: left">检查 Nginx 配置文件中的 &lt;code>user&lt;/code> 指令是否正确配置，并确保 Nginx 启动用户拥有目标目录的读写权限。如果权限不足，可以使用 &lt;code>sudo chown -R nginx:nginx /path/to/directory&lt;/code> 修改文件或目录的所有者 [12]。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>413 Request Entity Too Large&lt;/strong>&lt;/td>
&lt;td style="text-align: left">客户端上传文件的大小超过了 Nginx 的默认限制。&lt;/td>
&lt;td style="text-align: left">这个错误直接指向 Nginx 的配置问题。需要在 &lt;code>http&lt;/code>、&lt;code>server&lt;/code> 或 &lt;code>location&lt;/code> 块中，增加 &lt;code>client_max_body_size&lt;/code> 指令的值，例如 &lt;code>client_max_body_size 100m;&lt;/code> [13]。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>502 Bad Gateway&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Nginx 作为反向代理，无法从后端服务器获取有效响应。这通常是后端服务器故障的信号，而不是 Nginx 本身的问题。&lt;/td>
&lt;td style="text-align: left">这类问题可能由多种原因引起：&lt;br>1. &lt;strong>后端服务器宕机：&lt;/strong> 检查后端应用服务是否正常运行。&lt;br>2. &lt;strong>磁盘空间不足：&lt;/strong> 后端服务器磁盘空间不足可能导致写缓存失败，使用 &lt;code>df -h&lt;/code> 命令检查磁盘空间 [31]。&lt;br>3. &lt;strong>php-cgi 进程数不够：&lt;/strong> 对于 PHP 网站，后端进程池数量可能不足以处理请求。需要增加 &lt;code>php-fpm.conf&lt;/code> 文件中的 &lt;code>pm.max_children&lt;/code> 参数值 [31]。&lt;br>4. &lt;strong>后端执行超时：&lt;/strong> 如果后端应用处理时间过长，可能导致 Nginx 超时。可以在 Nginx 配置文件中适当增加 &lt;code>proxy_read_timeout&lt;/code> 和 &lt;code>proxy_send_timeout&lt;/code> 等超时时间 [31]。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>504 Gateway Timeout&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Nginx 在指定时间内未从后端服务器获得响应，通常由后端应用执行缓慢或超时引起。&lt;/td>
&lt;td style="text-align: left">检查后端应用的性能和日志。如果后端确实执行缓慢，可以考虑优化应用代码或增加服务器资源。同时，可以在 Nginx 配置文件中增加 &lt;code>proxy_connect_timeout&lt;/code>、&lt;code>proxy_send_timeout&lt;/code> 和 &lt;code>proxy_read_timeout&lt;/code> 等超时时间 [8]。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>腾讯云修改为root登录</title><link>https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/</guid><description>&lt;img src="https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/image/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95.jpg" alt="Featured image of post 腾讯云修改为root登录" />&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo passwd root
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vim /etc/ssh/sshd_config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修改 PermitRootLogin yes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl restart ssh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如果需要通过密钥登录root,最好使用ssh-copy-id, 我试过自己粘贴,很麻烦
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/image/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95.jpg"
width="1034"
height="684"
srcset="https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/image/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95_hu17536468502381269354.jpg 480w, https://www.zata.cc/p/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/image/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BF%AE%E6%94%B9root%E7%99%BB%E5%BD%95_hu2933229082023721869.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="151"
data-flex-basis="362px"
>&lt;/p></description></item></channel></rss>