<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>我的笔记</title>
  <id>https://blog.196000.xyz/</id>
  <link href="https://blog.196000.xyz" />
  <link href="https://blog.196000.xyz/atom.xml" rel="self" />
  <author>
    <name>196000.xyz</name>
  </author>
  <updated>2026-02-16T16:20:58+08:00</updated>

  <entry><id>https://blog.196000.xyz/2026/2026-02-16-develop-ssh.html</id><title>SSH 密码爆破的三层境界</title><link href="https://blog.196000.xyz/2026/2026-02-16-develop-ssh.html"/><updated>2026-02-16T10:00:00+08:00</updated><summary>第一层，手动输密码</summary><content type="html"><![CDATA[<h1 id="ssh-密码爆破的三层境界">SSH 密码爆破的三层境界</h1>
<p><strong>第一层，手动输密码</strong></p>
<p>手撸，地球人都知道的原始方式。</p>
<pre class="bash"><code>ssh -p 20026 root@38.148.243.111
# 参数说明
# -p 20026 指定 SSH 连接的端口 20026
# root@38.148.243.111 登录目标主机 38.148.243.111，以 root 用户身份</code></pre>
<p><strong>第二层，自动输密码</strong></p>
<p>把密码字典枚举后，自动输入密码。</p> <p><a href="https://blog.196000.xyz/2026/2026-02-16-develop-ssh.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2026/2026-02-15-develop-memos-android.html</id><title>源码编译开源项目 Memos 安卓版 APK</title><link href="https://blog.196000.xyz/2026/2026-02-15-develop-memos-android.html"/><updated>2026-02-15T17:00:00+08:00</updated><summary>windows11下编译开源项目 https://github.com/mudkipme/MoeMemosAndroid 的 0.8.5（对应 Memos-v0.24.0） 版本 APK 步骤。</summary><content type="html"><![CDATA[<h1 id="源码编译开源项目-memos-安卓版-apk">源码编译开源项目 Memos 安卓版 APK</h1>
<p>windows11下编译开源项目 <code>https://github.com/mudkipme/MoeMemosAndroid</code> 的 <code>0.8.5</code>（对应 <code>Memos-v0.24.0</code>） 版本 APK 步骤。</p>
<h2 id="检出源码"><strong>1. 检出源码</strong></h2>
<p>```bash # 1）clone 项目 git clone https://github.com/mudkipme/MoeMemosAndroid.git cd MoeMemosAndroid # 2）拉取远端标签（若还没拉过） git fetch origin –tags # 3）查看是否有 0.8.5 的 tag git tag -l “<em>0.8.5</em>” # 4）切换到 0.8.5 对应版本（对应 memos-v0.24.0）</p> <p><a href="https://blog.196000.xyz/2026/2026-02-15-develop-memos-android.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2026/2026-01-25-develop-rsync.html</id><title>rsync 常用用法</title><link href="https://blog.196000.xyz/2026/2026-01-25-develop-rsync.html"/><updated>2026-01-25T23:30:00+08:00</updated><summary>假设本地目录结构如下，需要同步到线上服务器 root@74.48.1.2:/opt/backup/dst/ 目录下</summary><content type="html"><![CDATA[<h1 id="rsync-常用用法">rsync 常用用法</h1>
<p>假设本地目录结构如下，需要同步到线上服务器 <code>root@74.48.1.2:/opt/backup/dst/</code> 目录下</p>
<pre class="bash"><code>/mnt/d/src/
├── dir_a
│   ├── dir_a1
│   ├── dir_a2
│   │   ├── dir_aa1
│   │   └── file_aa1.txt
│   ├── dir_a3
│   └── file_a1.txt
├── dir_b
├── dir_c
└── file_a.txt</code></pre> <p><a href="https://blog.196000.xyz/2026/2026-01-25-develop-rsync.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2026/2026-01-18-develop-ollama.html</id><title>Docker 环境部署 Ollama + Open WebUI</title><link href="https://blog.196000.xyz/2026/2026-01-18-develop-ollama.html"/><updated>2026-01-18T08:00:00+08:00</updated><summary>我的环境：Win11 + WSL2 Ubuntu 22.04 + Docker，使用 Docker 部署 Ollama（模型服务）+ Open WebUI（网页界面）</summary><content type="html"><![CDATA[<h1 id="docker-环境部署-ollama-open-webui">Docker 环境部署 Ollama + Open WebUI</h1>
<p>我的环境：Win11 + WSL2 Ubuntu 22.04 + Docker，使用 Docker 部署 <strong>Ollama（模型服务）+ Open WebUI（网页界面）</strong></p>
<hr />
<h2 id="先确认-dockercompose-ok">1、先确认 Docker/Compose OK</h2>
<p>在 WSL 的 Ubuntu 里执行：</p>
<pre class="bash"><code>docker version
docker compose version</code></pre>
<p>都能输出版本号就行。</p>
<hr /> <p><a href="https://blog.196000.xyz/2026/2026-01-18-develop-ollama.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2026/2026-01-01-life-hello-2026.html</id><title>你好，2026</title><link href="https://blog.196000.xyz/2026/2026-01-01-life-hello-2026.html"/><updated>2026-01-01T00:00:00+08:00</updated><summary>再见，2025，你好，2026</summary><content type="html"><![CDATA[<h1 id="你好2026">你好，2026</h1>
<p>再见，2025，你好，2026</p> <p><a href="https://blog.196000.xyz/2026/2026-01-01-life-hello-2026.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-12-28-develop-node.js-fnm.html</id><title>Node.js 多版本使用和管理</title><link href="https://blog.196000.xyz/2025/2025-12-28-develop-node.js-fnm.html"/><updated>2025-12-28T23:30:00+08:00</updated><summary>fnm 是一款快速简单跨平台的 Node.js 版本管理器，使用 Rust 构建。</summary><content type="html"><![CDATA[<h1 id="node.js-多版本使用和管理">Node.js 多版本使用和管理</h1>
<p>fnm 是一款快速简单跨平台的 Node.js 版本管理器，使用 Rust 构建。</p>
<h2 id="先用-fnm-安装启用-nodepowershell">先用 fnm 安装/启用 Node（PowerShell）</h2>
<p>先确认有没有 node/npm：</p>
<pre class="powershell"><code>node -v
npm -v</code></pre>
<p>如果提示找不到命令，就用 fnm 装一个 LTS（比如 Node 24）：</p>
<p>```powershell fnm env –use-on-cd –shell powershell | Out-String | Invoke-Expression fnm install 24 fnm use 24</p> <p><a href="https://blog.196000.xyz/2025/2025-12-28-develop-node.js-fnm.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-12-27-life-2025.html</id><title>2025 年度总结</title><link href="https://blog.196000.xyz/2025/2025-12-27-life-2025.html"/><updated>2025-12-27T09:00:00+08:00</updated><summary>2025 对我来说，不是做了多少“新东西”，而是把过去那些靠记忆和运气维持的东西，一点点变成可以长期运行的系统。</summary><content type="html"><![CDATA[<h1 id="年度总结">2025 年度总结</h1>
<p>2025 对我来说，不是做了多少“新东西”，而是把过去那些靠记忆和运气维持的东西，<strong>一点点变成可以长期运行的系统</strong>。</p>
<p>这一年我写了 29 篇笔记。它们看起来很杂：VPS、Docker、证书、备份、Cloudflare、k3s、rsync、前端打包、上传组件、AI、会计、权限……但串起来其实只有一个主题：<strong>让事情能稳定地跑下去，并且下次还能更轻松地跑起来。</strong></p>
<h2 id="把服务当成要长期维护的东西">1、把“服务”当成要长期维护的东西</h2>
<p>我给自己的小服务做了更完整的“生存保障”：</p>
<ul>
<li><strong>备份</strong>不再是临时手动，而是有结构、有保留策略、甚至考虑安全边界（异地机主动拉取）。</li>
<li><strong>证书</strong>不再靠手工续，而是用 Cloudflare DNS API 做自动化签发/续期，和容器化部署配合起来。</li>
<li>反代、Cloudflare 相关的坑也不再是“碰到再说”，而是能解释原理、能落地配置。</li>
</ul>
<p>我越来越能接受一个事实：真正的“上线”，不是能访问，而是<strong>能恢复、能迁移、能迭代</strong>。</p>
<h2 id="从会用-docker到能控制-docker">2、从会用 Docker，到能控制 Docker</h2> <p><a href="https://blog.196000.xyz/2025/2025-12-27-life-2025.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-12-22-develop-python-py-pyenv-uv.html</id><title>Python 多版本使用和管理</title><link href="https://blog.196000.xyz/2025/2025-12-22-develop-python-py-pyenv-uv.html"/><updated>2025-12-22T23:30:00+08:00</updated><summary>Python 多版本管理最佳实践，包括 Windows、Linux (Debian) 传统方案以及新兴工具 uv 的使用指南。</summary><content type="html"><![CDATA[<h1 id="python-多版本使用和管理">Python 多版本使用和管理</h1>
<p><strong>Python 多版本管理最佳实践</strong>，包括 Windows、Linux (Debian) 传统方案以及新兴工具 <code>uv</code> 的使用指南。</p>
<h3 id="核心原则">核心原则</h3>
<p>无论在哪个平台，现代 Python 开发的铁律：</p>
<ol type="1">
<li><strong>隔离项目</strong>：每个项目必须有独立的虚拟环境 (<code>.venv</code>)。</li>
<li><strong>隔离工具</strong>：全局命令行工具（如 <code>black</code>, <code>ruff</code>）不装在系统 Python 里，而是用 <code>pipx</code> 或 <code>uv tool</code> 管理。</li>
<li><strong>不污染系统</strong>：尽量不动操作系统的默认 Python（尤其是 Linux）。</li>
</ol>
<h3 id="windows-环境最佳实践">1. Windows 环境最佳实践</h3>
<p>Windows 的核心优势是官方提供的 <strong>Python Launcher (<code>py.exe</code>)</strong>。</p>
<ul>
<li><strong>多版本管理</strong>：</li>
</ul> <p><a href="https://blog.196000.xyz/2025/2025-12-22-develop-python-py-pyenv-uv.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-12-14-develop-rbac.html</id><title>RBAC 权限控制模型</title><link href="https://blog.196000.xyz/2025/2025-12-14-develop-rbac.html"/><updated>2025-12-14T23:30:00+08:00</updated><summary>RBAC（Role-Based Access Control，基于角色的访问控制）是目前 Web 系统中最通用、最成熟的权限架构。它的核心思想是：用户不直接与权限关联，而是通过“角色”作为中间层。</summary><content type="html"><![CDATA[<h1 id="rbac-权限控制模型">RBAC 权限控制模型</h1>
<p>RBAC（Role-Based Access Control，基于角色的访问控制）是目前 Web 系统中最通用、最成熟的权限架构。它的核心思想是：<strong>用户不直接与权限关联，而是通过“角色”作为中间层。</strong></p>
<h2 id="核心设计思路">1. 核心设计思路</h2>
<p>在 RBAC 模型中，我们需要处理三类实体和两组多对多关系：</p>
<ul>
<li><strong>用户 (User)</strong>：系统的使用者。</li>
<li><strong>角色 (Role)</strong>：用户在系统中的身份（如管理员、财务、编辑）。</li>
<li><strong>权限 (Permission)</strong>：具体的操作许可（如“发布文章”、“审核财务”）。</li>
</ul>
<p><strong>关系流转：</strong> <code>用户</code> -&gt; <code>拥有角色</code> -&gt; <code>角色关联权限</code> -&gt; <code>用户获得权限</code></p>
<hr />
<h2 id="数据库设计">2. 数据库设计</h2>
<p>这是 RBAC 的<strong>最小完备集</strong>（Minimum Viable Product），由 5 张表构成。</p> <p><a href="https://blog.196000.xyz/2025/2025-12-14-develop-rbac.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-11-27-develop-wsl-docker.html</id><title>WSL2 和 Hyper-V 中安装 Docker 实践</title><link href="https://blog.196000.xyz/2025/2025-11-27-develop-wsl-docker.html"/><updated>2025-11-27T09:30:00+08:00</updated><summary>WSL 全称 Windows Subsystem for Linux，即运行在 Windows 上的 Linux 子系统。在 WSL 上部署 Docker ，实现 Windows 上运行 Docker 的功能。</summary><content type="html"><![CDATA[<h1 id="wsl2-和-hyper-v-中安装-docker-实践">WSL2 和 Hyper-V 中安装 Docker 实践</h1>
<p>WSL 全称 <code>Windows Subsystem for Linux</code>，即运行在 Windows 上的 Linux 子系统。在 WSL 上部署 Docker ，实现 Windows 上运行 Docker 的功能。</p>
<h2 id="如何判断电脑是否支持硬件虚拟化">如何判断电脑是否支持硬件虚拟化</h2>
<p>打开任务管理器，如果处理器支持硬件虚拟化，能看到”虚拟化“和”Hyper-v“选项的（启用或者禁用），否则就是处理器不支持虚拟化。</p>
<p><img src="https://blog.196000.xyz/uploads/images/2025/windows-explorer.png?t=1771230058" loading="lazy" /></p>
<p>如果是“禁用”状态，进入 BIOS 来打开虚拟化支持。重启电脑，F2 进入 BIOS 设置，可以看到 Intel Virtualization Technology 选项默认是 Disabled 状态，我把它改成 Enabled，然后保存，重启电脑。</p>
<h2 id="windows-11家庭版安装-docker">Windows 11家庭版安装 Docker</h2>
<p>Hyper-V 功能仅在 Windows 专业版、企业版和教育版中可用，家庭版不支持 Hyper-V 功能（也可以直接使用 WSL 来虚拟 Linux 环境则可以忽略此操作）。</p> <p><a href="https://blog.196000.xyz/2025/2025-11-27-develop-wsl-docker.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-11-02-develop-cursor.html</id><title>Cursor编码约束管理</title><link href="https://blog.196000.xyz/2025/2025-11-02-develop-cursor.html"/><updated>2025-11-02T09:30:00+08:00</updated><summary>使用 Cursor 进行 AI 辅助开发，用于配置或约束 Cursor 遵循的各种规则的文件及位置如下</summary><content type="html"><![CDATA[<h1 id="cursor编码约束管理">Cursor编码约束管理</h1>
<p>使用 Cursor 进行 AI 辅助开发，用于配置或约束 Cursor 遵循的各种规则的文件及位置如下</p>
<p>```bash src/ ├── AGENTS.md # 项目规范 ├── .cursor/ │ ├── mcp.json # mcp 配置文件 │ └── rules/ │ ├── code.mdc # 编码规则 │ └── workflow.mdc # 工作流程规则 ├── docs_ai/ │ ├── summaries/ # AI开发计划文档 │ └── requirements/ # AI开发需求文档 ├── docs/ # 项目文档 ├── finance/ # 财务系统功能文件，所有二次开发的功能文件目录 │ ├── xxx.php # xxx 功能文件</p> <p><a href="https://blog.196000.xyz/2025/2025-11-02-develop-cursor.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-10-18-develope-bookkeeping.html</id><title>企业理账系统开发笔记</title><link href="https://blog.196000.xyz/2025/2025-10-18-develope-bookkeeping.html"/><updated>2025-10-18T18:00:00+08:00</updated><summary>本文档旨在记录开发类似【浪潮云代账】https://vip.eyun.cn/eyun3/html/#/ 的企业理账系统时，涉及的编程之外的会计相关知识。</summary><content type="html"><![CDATA[<h1 id="企业理账系统开发笔记">企业理账系统开发笔记</h1>
<p>本文档旨在记录开发类似【浪潮云代账】<code>https://vip.eyun.cn/eyun3/html/#/</code> 的企业理账系统时，涉及的编程之外的会计相关知识。</p>
<h2 id="会计做账数据示例">会计做账数据示例</h2>
<p>一切系统的设计都源于数据。假设一个新成立的小微企业如下：</p>
<p>```bash ## 1. 账套启用与期初数据 202404 ## 期初数据 借：1001 库存现金 10000.00 1002 银行存款 30000.00 1405 库存商品 10000.00 贷：3001 实收资本 50000.00</p>
<h2 id="交易明细-凭证">2. 交易明细 (凭证)</h2>
<h2 id="月交易明细">1月交易明细</h2> <p><a href="https://blog.196000.xyz/2025/2025-10-18-develope-bookkeeping.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-10-16-develope-ai-codex.html</id><title>Codex 使用教程</title><link href="https://blog.196000.xyz/2025/2025-10-16-develope-ai-codex.html"/><updated>2025-10-16T21:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="codex-使用教程">Codex 使用教程</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2025/chatgpt-plus-codex.png?t=1771230058" loading="lazy" /></p>
<h2 id="windows-环境使用">Windows 环境使用</h2>
<p>``<code>PowerShell # 1.1 在 PowerShell 先执行一次（只对当前窗口生效） fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression # 1.2 安装并启用 Node 24 LTS fnm install 24 fnm use 24 fnm default 24 # 验证 node -v npm -v #</code>fnm default` 用来设置默认版本（不在项目目录时也能用） # 1.3 让它“永久生效”（每次打开 PowerShell 都自动有 node/npm） # 编辑 PowerShell Profile：</p> <p><a href="https://blog.196000.xyz/2025/2025-10-16-develope-ai-codex.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-10-11-develope-docker-commit.html</id><title>容器更改后打包成新镜像</title><link href="https://blog.196000.xyz/2025/2025-10-11-develope-docker-commit.html"/><updated>2025-10-11T08:00:00+08:00</updated><summary>```bash # 1. 进入容器 ~ # docker exec -it app_nodejs_selfhosted /bin/sh # 2. 新增 myfile.txt，要求镜像导出后，文件 myfile.txt 还在 # 注意：挂载的卷不会也打包进去 /app # history 0 ls 1 npm add -D vitepress 2 npx vitepress init 3 npx vitepress –version 4 npm run docs:dev – –host 0.0.0.0 –port 5173 5 touch myfile.txt /app # exit # 3. 查看所有容器名 ~ # docker ps –format “{{.Names}}” app_nodejs_selfhosted</summary><content type="html"><![CDATA[<h1 id="容器更改后打包成新镜像">容器更改后打包成新镜像</h1>
<p>```bash # 1. 进入容器 ~ # docker exec -it app_nodejs_selfhosted /bin/sh # 2. 新增 myfile.txt，要求镜像导出后，文件 myfile.txt 还在 # 注意：挂载的卷不会也打包进去 /app # history 0 ls 1 npm add -D vitepress 2 npx vitepress init 3 npx vitepress –version 4 npm run docs:dev – –host 0.0.0.0 –port 5173 5 touch myfile.txt /app # exit # 3. 查看所有容器名 ~ # docker ps –format “{{.Names}}” app_nodejs_selfhosted</p> <p><a href="https://blog.196000.xyz/2025/2025-10-11-develope-docker-commit.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-10-07-develope-element-plus-el-upload.html</id><title>element-plus控件el-upload使用总结</title><link href="https://blog.196000.xyz/2025/2025-10-07-develope-element-plus-el-upload.html"/><updated>2025-10-07T15:00:00+08:00</updated><summary>官方文档 https://element-plus.org/zh-CN/component/upload</summary><content type="html"><![CDATA[<h1 id="element-plus控件el-upload使用总结"><code>element-plus</code>控件<code>el-upload</code>使用总结</h1>
<p>官方文档 https://element-plus.org/zh-CN/component/upload</p>
<p>el-upload 控件完整功能手册</p>
<p>从<strong>属性 (Attributes)</strong>、<strong>生命周期钩子/事件 (Events)</strong>、<strong>插槽 (Slots)</strong> 和<strong>方法 (Methods)</strong> 四个方面解析<code>el-upload</code>控件。</p>
<hr />
<h2 id="属性-attributes---控制组件行为与外观">1. 属性 (Attributes) - 控制组件行为与外观</h2>
<table>
<thead>
<tr class="header">
<th style="text-align: left;">属性 (Attribute)</th>
<th style="text-align: left;">类型 (Type)</th>
<th style="text-align: left;">说明与核心用途</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><strong>核心功能</strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;"></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>action</code></td>
<td style="text-align: left;"><code>string</code></td>
<td style="text-align: left;"><strong>必填</strong>，上传的目标服务器 URL 地址。</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>v-model:file-list</code></td>
<td style="text-align: left;"><code>array</code></td>
<td style="text-align: left;">绑定文件列表，实现对列表的完全控制（加载、删除、更新）。</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>name</code></td>
<td style="text-align: left;"><code>string</code></td>
<td style="text-align: left;">上传文件时，文件在表单中的字段名。默认为 <code>file</code>。可以设置为 <code>files[]</code> 以支持多文件数组。</td>
</tr>
</tbody>
</table> <p><a href="https://blog.196000.xyz/2025/2025-10-07-develope-element-plus-el-upload.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-09-18-develop-rsync-include-exclude.html</id><title>rsync里–include/–exclude用法总结</title><link href="https://blog.196000.xyz/2025/2025-09-18-develop-rsync-include-exclude.html"/><updated>2025-09-18T21:00:00+08:00</updated><summary>rsync 的匹配逻辑是：</summary><content type="html"><![CDATA[<h1 id="rsync里--include--exclude用法总结"><code>rsync</code>里<code>--include/--exclude</code>用法总结</h1>
<h2 id="背景规则">📌 背景规则</h2>
<p>rsync 的匹配逻辑是：</p>
<ol type="1">
<li><p>遍历目录时，如果某个目录被排除了，<strong>它下面的文件/目录就不会再被扫描</strong>。</p></li>
<li><p>所以如果你只写 <code>--include='uploads/***'</code>，但没有告诉 rsync 要“保留进入 uploads 目录”，那 rsync 可能根本不会进入这个目录。</p></li>
<li><p>因此要写两个 include：</p>
<ul>
<li><code>--include='uploads/'</code> → 允许进入 <code>uploads</code> 目录本身</li>
<li><code>--include='uploads/***'</code> → 允许 <code>uploads</code> 目录下的所有内容</li>
</ul></li>
</ol>
<hr />
<h2 id="include-推荐写法">✅ <code>--include</code> 推荐写法</h2>
<p>如果是“排除其它，只保留 uploads”，写法通常是：</p> <p><a href="https://blog.196000.xyz/2025/2025-09-18-develop-rsync-include-exclude.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-09-17-develop-ssh-controlmaster-rsync.html</id><title>rsync 通过 ssh -o ControlMaster=auto 复用连接</title><link href="https://blog.196000.xyz/2025/2025-09-17-develop-ssh-controlmaster-rsync.html"/><updated>2025-09-17T23:30:00+08:00</updated><summary>需要执行一个包含多个 rsync 命令的脚本，但是每次执行 rsync 命令都要输入密码，使用 AI 写了一个，只需要执行脚本，首次输入密码，之后同一轮任务内都复用同一连接。</summary><content type="html"><![CDATA[<h1 id="rsync-通过-ssh--o-controlmasterauto-复用连接">rsync 通过 <code>ssh -o ControlMaster=auto</code> 复用连接</h1>
<p>需要执行一个包含多个 rsync 命令的脚本，但是每次执行 rsync 命令都要输入密码，使用 AI 写了一个，只需要执行脚本，首次输入密码，之后同一轮任务内都复用同一连接。</p>
<h2 id="提示词">提示词</h2>
<pre><code>写一个 Debian12 下运行的脚本 `job.sh`，运行 `job.sh` 输入一次密码可以执行脚本内配置的多行 rsync 完整命令，即不用每次都需要输入密码。

要求： 

1. 执行脚本 `job.sh` 只需要输入一次密码，可以执行多次 rsync 命令
2. 脚本运行时间不确定，脚本中断、或者异常退出、或者 `Ctrl+C` 主动退出，就整个脚本也退出，包括但不限于连接
3. rsync 命令中输出的日志，实时在终端输出
4. 简单英文注释，禁止中文注释
5. 保持脚本简洁明了，不做过多比如命令不存在等检查——执行脚本，调用命令执行即可

伪代码如下

```bash</code></pre> <p><a href="https://blog.196000.xyz/2025/2025-09-17-develop-ssh-controlmaster-rsync.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-09-13-develop-www-rsync.html</id><title>Web 和 Ftp 协作文件目录权限问题</title><link href="https://blog.196000.xyz/2025/2025-09-13-develop-www-rsync.html"/><updated>2025-09-13T10:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="web-和-ftp-协作文件目录权限问题">Web 和 Ftp 协作文件目录权限问题</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2025/rsync-www-owner.png?t=1771230058" loading="lazy" /></p>
<p>服务器配置仅允许 git 用户使用 rsa 密钥登录，web 的目录及子目录和文件所有者为 www，755 权限，并且 git 已经添加到 www 组，在当前用户为 git 的情况下。</p>
<p>执行</p>
<p><code>rsync -avpz -e "ssh -i ~/.ssh/id_rsa -p 22" --exclude '.git' --exclude '.git/*' ./local/ git@server:/www/wwwroot/site/</code></p>
<p>提示</p>
<p><code>rsync: failed to set times on "/www/wwwroot/site/theme/images/left": Operation not permitted (1) rsync</code></p>
<p>报错的根因是：<strong>rsync 在 <code>-a</code>（归档）模式下会保留时间戳（<code>-t</code>），而“修改目录/文件时间戳”在 Linux 上需要</strong>“<strong>所有者</strong>”<strong>权限</strong>或特权（<code>CAP_FOWNER</code>）。</p>
<p>远端目录/文件的 <strong>owner=www</strong>，用的是 <strong>git 用户</strong>（虽在 <code>www</code> 组，但不是 owner），于是在设置时间戳时就出现：</p> <p><a href="https://blog.196000.xyz/2025/2025-09-13-develop-www-rsync.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-08-18-develop-gemini-key-check.html</id><title>校验 Google Gemini API Key 有效/无效/付费的原理</title><link href="https://blog.196000.xyz/2025/2025-08-18-develop-gemini-key-check.html"/><updated>2025-08-18T09:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="校验-google-gemini-api-key-有效无效付费状态的原理">校验 Google Gemini API Key 有效/无效/付费状态的原理</h1>
<h2 id="校验原理">校验原理</h2>
<ol type="1">
<li><strong>Key 有效性校验流程</strong>
<ul>
<li>首先调用 Gemini 的 <code>generateContent</code> 接口（如 <code>models/gemini-2.0-flash-lite:generateContent</code>），判断 Key 是否有效（基础有效性）</li>
<li>如果返回 200，说明 Key 有效，标记为 Free，进入下一步</li>
<li>如果返回 400/401/403/429，则判定 Key 无效，将其标记为 Invalid</li>
<li>其它错误则记录为未知或异常状态</li>
</ul></li>
<li><strong>Key 是否为付费 Key 原理</strong>
<ul>
<li>对每个通过基础校验的 Key，构造大文本请求体向 <code>cachedContents</code> 接口（如 <code>models/gemini-2.5-flash:cachedContents</code>）发起请求</li>
<li>如果请求成功返回 200（无报错），则认为该 Key 具备付费权限（可访问缓存 API），将其标记为 Paid</li>
<li>如果返回 429（Too Many Requests），则认为该 Key 仅为免费 Key（有速率限制），标记为 Free</li>
<li>其它错误则记录为未知或异常状态</li>
</ul></li>
</ol> <p><a href="https://blog.196000.xyz/2025/2025-08-18-develop-gemini-key-check.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-08-02-develop-beancount-quick-start.html</id><title>beancount 使用入门</title><link href="https://blog.196000.xyz/2025/2025-08-02-develop-beancount-quick-start.html"/><updated>2025-08-02T08:00:00+08:00</updated><summary>beancount 是用 python 写的。装好 python 后，Windows 下包命令安装。</summary><content type="html"><![CDATA[<h1 id="beancount-使用入门">beancount 使用入门</h1>
<p>beancount 是用 python 写的。装好 python 后，Windows 下包命令安装。</p>
<h2 id="安装软件">安装软件</h2>
<p><strong>pip3 方式安装</strong></p>
<pre class="bash"><code># 直接安装 beancount
pip3 install beancount
# 或者安装 fava 自动安装 beancount
pip3 install fava
fava main.bean --host 0.0.0.0</code></pre>
<p><strong>docker方式安装</strong></p> <p><a href="https://blog.196000.xyz/2025/2025-08-02-develop-beancount-quick-start.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-07-27-develop-shell-curl.html</id><title>Shell Curl</title><link href="https://blog.196000.xyz/2025/2025-07-27-develop-shell-curl.html"/><updated>2025-07-27T09:30:00+08:00</updated><summary>```bash # 提交 json # see https://www.endpoints.dev/ curl -X POST –url https://xxxxx.endpoints.dev –header ‘Content-Type: application/json’ –data ‘{“site”:“blog.196000.xyz”,“date”:“2025-07-27”}’</summary><content type="html"><![CDATA[<h1 id="shell-curl">Shell Curl</h1>
<h2 id="使用例子">使用例子</h2>
<ul>
<li><code>curl --socks5 192.168.0.104:10808 https://api.ipify.org/?format=json</code></li>
<li><code>curl --proxy http://192.168.0.104:10809 https://api.ipify.org/?format=json</code></li>
<li><code>curl -m 30 --retry 3 --socks5 127.0.0.1:10808 https://api.ipify.org/?format=json</code></li>
<li><code>curl -m 30 --retry 3 --socks5 192.168.163.1:10808 https://api.ipify.org/?format=json</code></li>
<li><code>curl telnet://34.22.88.102:8888 -v</code></li>
</ul>
<p>```bash # 提交 json # see https://www.endpoints.dev/ curl -X POST –url https://xxxxx.endpoints.dev –header ‘Content-Type: application/json’<br />
–data ‘{“site”:“blog.196000.xyz”,“date”:“2025-07-27”}’</p>
<h1 id="上传文件enctypemultipartform-data">上传文件，enctype=‘multipart/form-data’</h1>
<p>curl –form upload=<span class="citation" data-cites="localfilename">@localfilename</span> –form press=OK [URL]</p> <p><a href="https://blog.196000.xyz/2025/2025-07-27-develop-shell-curl.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-07-17-develop-weixin-notify.html</id><title>利用企业微信API搭建个人消息提醒服务</title><link href="https://blog.196000.xyz/2025/2025-07-17-develop-weixin-notify.html"/><updated>2025-07-18T23:30:00+08:00</updated><content type="html"><![CDATA[<h1 id="利用企业微信api搭建个人消息提醒服务">利用企业微信API搭建个人消息提醒服务</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2025/weixin-notify-flow.png?t=1771230058" loading="lazy" /></p>
<p>微信是一个比较完美的消息提醒工具——基本手机必备、常驻后台、大厂免被进程被杀，不打开应用也能收到消息，利用企业微信API搭建个人微信消息提醒服务，其实比想象中要简单得多。</p>
<h2 id="准备工作">准备工作</h2>
<p>注册企业微信账号，<strong>个人不需要企业也免费注册</strong>。官网 (<code>https://work.weixin.qq.com/wework_admin/register_wx</code>) 填写基本信息就好。</p>
<p><img src="https://blog.196000.xyz/uploads/images/2025/weixin-notify-qyregister.png?t=1771230058" loading="lazy" /></p>
<h2 id="加入企业">加入企业</h2>
<p>注册成功后进入管理后台，加入企业。</p>
<h2 id="开启微信插件">开启微信插件</h2> <p><a href="https://blog.196000.xyz/2025/2025-07-17-develop-weixin-notify.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-06-29-develop-weixin-miniprogram-pay.html</id><title>微信小程序境外支付</title><link href="https://blog.196000.xyz/2025/2025-06-29-develop-weixin-miniprogram-pay.html"/><updated>2025-07-18T20:00:00+08:00</updated><summary>```php class WechatPayV3 { // 支付 public static function pay($body, $sn, $money, $openid, $notify_url) { $mchid = ‘你的商户号’;</summary><content type="html"><![CDATA[<h1 id="微信小程序境外支付">微信小程序境外支付</h1>
<h2 id="官方sdk安装php版">官方SDK安装（PHP版）</h2>
<pre class="bash"><code># API V2 V3 对比
# https://pay.weixin.qq.com/doc/global/v3/zh/4012354999
composer require wechatpay/wechatpay</code></pre>
<h2 id="支付和回调">支付和回调</h2>
<p>```php class WechatPayV3 { // 支付 public static function pay($body, $sn, $money, $openid, $notify_url) { $mchid = ‘你的商户号’;</p> <p><a href="https://blog.196000.xyz/2025/2025-06-29-develop-weixin-miniprogram-pay.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-06-05-develop-ai-pdf-to-json.html</id><title>使用 AI 将 PDF 文档转为 JSON 数据</title><link href="https://blog.196000.xyz/2025/2025-06-05-develop-ai-pdf-to-json.html"/><updated>2025-06-05T22:00:00+08:00</updated><summary>最近使用 AI　实现的一个功能，分析 PDF 银行账单文件，将流水明细输出为 JSON 格式结果。一句话就是实现 PDF 转 JSON。</summary><content type="html"><![CDATA[<h1 id="使用-ai-将-pdf-文档转为-json-数据">使用 AI 将 PDF 文档转为 JSON 数据</h1>
<p>最近使用 AI　实现的一个功能，分析 PDF 银行账单文件，将流水明细输出为 JSON 格式结果。一句话就是实现 PDF 转 JSON。</p>
<p>分享一下实现过程的心得：</p>
<ol type="1">
<li>模型的选择</li>
<li>让 AI 输出可控的 JSON 格式</li>
<li>提示语</li>
</ol>
<h2 id="模型的选择">1. 模型的选择</h2>
<p>选择的模型需要符合：<strong>API 方式调用、支持 PDF 文件输入</strong>。</p>
<p>直接把 PDF 发给模型，模型同时看到文字和坐标，能推断单元格，这样能够保持向量文本和边框结构，而转换为图片或者其它格式或者自己 OCR 后，可能会丢失这些信息。</p>
<p>测试的几个模型：</p> <p><a href="https://blog.196000.xyz/2025/2025-06-05-develop-ai-pdf-to-json.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-05-18-develop-windows-php-tools.html</id><title>Windows 下 PHP 开发环境及工具</title><link href="https://blog.196000.xyz/2025/2025-05-18-develop-windows-php-tools.html"/><updated>2025-05-18T18:00:00+08:00</updated><summary>Windows 规格</summary><content type="html"><![CDATA[<h1 id="windows-下-php-开发环境及工具">Windows 下 PHP 开发环境及工具</h1>
<p><strong>Windows 规格</strong></p>
<p>版本：<code>Windows 10 专业版</code> 版本号：<code>22H2</code> 操作系统内部版本：<code>19045.3086</code></p>
<h2 id="开发环境">开发环境</h2>
<ul>
<li>Laragon（<strong>v7之后收费</strong>） https://github.com/leokhoa/laragon/releases/tag/6.0.0</li>
<li>小皮面板 phpStudy https://www.xp.cn/phpstudy</li>
<li>扩展
<ul>
<li>xlswriter https://pecl.php.net/package/xlswriter/1.5.8/windows</li>
</ul></li>
</ul> <p><a href="https://blog.196000.xyz/2025/2025-05-18-develop-windows-php-tools.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-05-03-develop-favicon-svg.html</id><title>网页 favicon 使用 svg 图片</title><link href="https://blog.196000.xyz/2025/2025-05-03-develop-favicon-svg.html"/><updated>2025-05-03T14:00:00+08:00</updated><summary>多个替换</summary><content type="html"><![CDATA[<h1 id="网页-favicon-使用-svg-图片">网页 favicon 使用 svg 图片</h1>
<h2 id="使用-url-编码">使用 url 编码</h2>
<ol type="1">
<li><p><code>sed ':a;N;$!ba;s/
//g' favicon.svg</code></p>
<p>把 favicon.svg 文件所有行合并成一行</p>
<ul>
<li><code>:a</code> 定义标签 a</li>
<li><code>N</code> 读取下一行并追加到 pattern space 中（带换行符）</li>
<li><code>$!ba</code> 如果不是最后一行，跳转到标签 a，不断循环实现全文拼接</li>
<li><code>s/
//g</code> 把所有换行符删除，变成一整行字符串</li>
</ul></li>
<li><p><code>sed 's/"/'\''/g'</code></p>
<p>把双引号 <code>"</code> 替换成单引号 <code>'</code></p></li>
<li><p>多个替换</p></li>
</ol> <p><a href="https://blog.196000.xyz/2025/2025-05-03-develop-favicon-svg.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-05-01-develop-k3s-vps-jsq.html</id><title>跨网异地 k3s 集群部署 vps 剩余价值计算器</title><link href="https://blog.196000.xyz/2025/2025-05-01-develop-k3s-vps-jsq.html"/><updated>2025-05-02T08:45:00+08:00</updated><summary>便宜收了一台配置 3C2G cloudcone，正好上两天的 VPS 剩余价值计算器做了一个公共镜像，用来组集群玩一下 k3s。</summary><content type="html"><![CDATA[<h1 id="跨网异地-k3s-集群部署-vps-剩余价值计算器">跨网异地 k3s 集群部署 vps 剩余价值计算器</h1>
<p>便宜收了一台配置 <a href="https://tools.196000.xyz/server/">3C2G cloudcone</a>，正好上两天的 <a href="https://github.com/hahabye/vps_jsq">VPS 剩余价值计算器</a>做了一个公共镜像，用来组集群玩一下 k3s。</p>
<p>PS：开始从节点用的 <code>cstserver hk</code>，服务到从机一直不响应，换另一台 <code>cloudcone us</code> 后正常，可能是跟 VPS 厂商网络有关系。</p>
<h2 id="主机规划">主机规划</h2>
<table>
<thead>
<tr class="header">
<th>角色</th>
<th>主机名</th>
<th>外网IP</th>
<th>版本</th>
<th>配置</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Master Node</td>
<td>cloudcone-167</td>
<td>148.xxx.xxx.167</td>
<td>debian11</td>
<td>3C/2G/26G</td>
</tr>
<tr class="even">
<td>Worker Node 1</td>
<td>cloudcone-31</td>
<td>74.xxx.xxx.31</td>
<td>debian12</td>
<td>1C/1G/40G</td>
</tr>
</tbody>
</table>
<p>部署完后，主节点内存、负载如下</p>
<p><img src="https://blog.196000.xyz/uploads/images/2025/jsq-master-top.png?t=1771230058" loading="lazy" /></p>
<h2 id="安装-k3s-集群">安装 k3s 集群</h2> <p><a href="https://blog.196000.xyz/2025/2025-05-01-develop-k3s-vps-jsq.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-04-22-develop-vite-packaging-css-js.html</id><title>Vite 非模块化文件打包</title><link href="https://blog.196000.xyz/2025/2025-04-22-develop-vite-packaging-css-js.html"/><updated>2025-04-22T08:00:00+08:00</updated><summary>VPS 剩余价值计算器 是一个普通的 HTML + CSS + 非模块化函数式 JS 项目，使用 Vite 作为构建工具来打包 JS 和 CSS 文件，把 JS 和 CSS 代码内联形式到 HTML 文件，既通过 Vite 打包压缩减少页面大小，又满足打包后，多文件项目变为无依赖的单文件，方便各种环境部署的需求。</summary><content type="html"><![CDATA[<h1 id="vite-非模块化文件打包">Vite 非模块化文件打包</h1>
<p><a href="https://github.com/hahabye/vps_jsq">VPS 剩余价值计算器</a> 是一个普通的 HTML + CSS + 非模块化函数式 JS 项目，使用 Vite 作为构建工具来打包 JS 和 CSS 文件，把 JS 和 CSS 代码内联形式到 HTML 文件，既通过 Vite 打包压缩减少页面大小，又满足打包后，多文件项目变为无依赖的单文件，方便各种环境部署的需求。</p>
<p><strong>简化版本目录结构如下：</strong></p>
<p>```shell app/ ├── static/ │ ├── css/ │ │ ├── 1.css │ │ ├── 2.css │ │ ├── 3.css │ │ └── main.css │ └── js/ │ ├── 1.js │ ├── 2.js │ └── 3.js</p> <p><a href="https://blog.196000.xyz/2025/2025-04-22-develop-vite-packaging-css-js.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-04-11-develop-python-selenium-chrome.html</id><title>使用 Python 和 Selenium 实现 Chrome 自动化</title><link href="https://blog.196000.xyz/2025/2025-04-11-develop-python-selenium-chrome.html"/><updated>2025-04-11T23:00:00+08:00</updated><summary>Selenium 通过 ChromeDriver 控制 Chrome 浏览器执行自动化操作。安装 Google Chrome 和 ChromeDriver，并且保证两者的大版本号相同，版本号不同无法驱动浏览器。</summary><content type="html"><![CDATA[<h1 id="使用-python-和-selenium-实现-chrome-自动化">使用 Python 和 Selenium 实现 Chrome 自动化</h1>
<ul>
<li><p>Google Chrome Google Chrome 是一种由 Google 开发的网页浏览器，用于访问和查看网页。</p></li>
<li><p>ChromeDriver ChromeDriver 是一个独立的服务器，用于与 Google Chrome 浏览器进行通信。它实现了 WebDriver 协议，允许程序自动控制 Chrome 浏览器。当使用 Selenium 进行自动化测试时，ChromeDriver 充当 Selenium WebDriver 和浏览器之间的桥梁。</p></li>
<li><p>Selenium Selenium 是一个广泛使用的自动化测试框架，支持多种浏览器（如 Chrome、Firefox、Safari 等）。通过 Selenium，开发者可以编写脚本来模拟用户在浏览器中的操作，例如打开网页、点击按钮、输入文本等。<strong>Selenium 通过 WebDriver 接口与浏览器进行交互</strong>，而在使用 Chrome 时则需要 ChromeDriver 来实现这一功能。</p></li>
</ul>
<p>Selenium 通过 ChromeDriver 控制 Chrome 浏览器执行自动化操作。安装 Google Chrome 和 ChromeDriver，并且保证两者的大版本号相同，版本号不同无法驱动浏览器。</p>
<h2 id="windows-软件">windows 软件</h2>
<ul>
<li>Google Chrome</li>
</ul> <p><a href="https://blog.196000.xyz/2025/2025-04-11-develop-python-selenium-chrome.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-04-05-develop-docker-compose-command.html</id><title>docker-compose.yml 的 command 应用</title><link href="https://blog.196000.xyz/2025/2025-04-05-develop-docker-compose-command.html"/><updated>2025-04-05T18:00:00+08:00</updated><summary>在 docker-compose.yml 文件中，command 指令会覆盖容器的默认命令（entrypoint）。但注意的是，这并不影响容器的入口点（entrypoint），而只会替代默认的命令部分。</summary><content type="html"><![CDATA[<h1 id="docker-compose.yml-的-command-应用">docker-compose.yml 的 command 应用</h1>
<p>在 docker-compose.yml 文件中，command 指令会覆盖容器的默认命令（entrypoint）。但注意的是，这并不影响容器的入口点（entrypoint），而只会替代默认的命令部分。</p>
<ul>
<li>entrypoint: 容器启动时执行的主命令。</li>
<li>command: 传递给 entrypoint 的参数，或者在没有自定义 entrypoint 时，作为容器的主命令执行。</li>
</ul>
<pre class="yaml"><code>version: &#39;3&#39;
services:
  app:
    image: myapp:latest
    entrypoint: [&quot;python&quot;, &quot;app.py&quot;]  # 自定义入口点
    command: [&quot;--arg1&quot;, &quot;value1&quot;]     # 替代默认命令</code></pre>
<p>在这个例子中，容器启动时会执行：</p> <p><a href="https://blog.196000.xyz/2025/2025-04-05-develop-docker-compose-command.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-03-23-develop-nginx-proxy-cloudflare.html</id><title>Nginx 反向代理 Cloudflare 的网站</title><link href="https://blog.196000.xyz/2025/2025-03-23-develop-nginx-proxy-cloudflare.html"/><updated>2025-03-23T22:00:00+08:00</updated><summary>假设域名 backend.196000.xyz 在 Cloudflare 打开了代理使用 CDN，现在用 fast.196000.xyz 来进行加速，如果直接通过 nginx 进行反向代理 Cloudflare 的 https，通常会出现 “dns points to prohibited ip” 错误，其原因归根结底是 Cloudflare 开启了 SNI 识别回源。解决思路是通过 nginx 的 SNI 覆写和 host 覆写来让 nginx 改掉这两个 Cloudflare CDN 回源的参数，从而可以达到 Cloudflare CDN 的效果。</summary><content type="html"><![CDATA[<h1 id="nginx-反向代理套-cloudflare-的网站">Nginx 反向代理套 Cloudflare 的网站</h1>
<p>假设域名 backend.196000.xyz 在 Cloudflare 打开了代理使用 CDN，现在用 fast.196000.xyz 来进行加速，如果直接通过 nginx 进行反向代理 Cloudflare 的 https，通常会出现 “dns points to prohibited ip” 错误，其原因归根结底是 Cloudflare 开启了 SNI 识别回源。解决思路是通过 nginx 的 SNI 覆写和 host 覆写来让 nginx 改掉这两个 Cloudflare CDN 回源的参数，从而可以达到 Cloudflare CDN 的效果。</p>
<p>```shell server { listen 80; listen [::]:80; server_name fast.196000.xyz;</p>
<pre><code>location / {
    # 反向代理到目标地址，替换为你的
    proxy_pass https://backend.196000.xyz;
    # 设置回源主机名，替换为你的
    proxy_set_header Host backend.196000.xyz;

    # 设置头部传递真实 IP
    proxy_set_header X-Real-IP $remote_addr;</code></pre> <p><a href="https://blog.196000.xyz/2025/2025-03-23-develop-nginx-proxy-cloudflare.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-03-07-docker-certbot-dns-cloudflare.html</id><title>【玩 docker】certbot 申请泛域名证书与续期</title><link href="https://blog.196000.xyz/2025/2025-03-07-docker-certbot-dns-cloudflare.html"/><updated>2025-03-07T14:00:00+08:00</updated><summary>docker 下使用 certbot 申请泛域名证书与续期。</summary><content type="html"><![CDATA[<h1 id="玩-dockercertbot-申请泛域名证书与续期">【玩 docker】certbot 申请泛域名证书与续期</h1>
<p>docker 下使用 <code>certbot</code> 申请泛域名证书与续期。</p>
<p>配置文件</p>
<pre class="yaml"><code># /opt/docker/data/certbot/cloudflare.ini
# chmod 700 /opt/docker/data/certbot
# touch /opt/docker/data/certbot/cloudflare.ini
# chmod 600 /opt/docker/data/certbot/cloudflare.ini

# Cloudflare API credentials used by Certbot
# How to generate API token:
# https://developers.cloudflare.com/api/tokens/create
# https://dash.cloudflare.com/profile/api-tokens
dns_cloudflare_api_token = XXXXXXXXXXXXXXXXXXXX</code></pre> <p><a href="https://blog.196000.xyz/2025/2025-03-07-docker-certbot-dns-cloudflare.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-03-01-develop-vps-app-backup.html</id><title>我的 VPS 文件备份</title><link href="https://blog.196000.xyz/2025/2025-03-01-develop-vps-app-backup.html"/><updated>2025-03-01T15:30:00+08:00</updated><content type="html"><![CDATA[<h1 id="我的-vps-文件备份">我的 VPS 文件备份</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2025/backup-telegram.png?t=1771230058" loading="lazy" /></p>
<p>为了降低成本，决定把服务迁移到闲置的<a href="https://tools.196000.xyz/server/">1C1.3G 40G rackNerd 小鸡</a>上，迁移服务器后，优化了一直使用的 VPS 资料备份的脚本，增加结果发送到 telegram，使用配置文件等一些优化，跟大家分享一下。</p>
<p>在我的小鸡上跑着 mjj 三件套（探针、图床、博客）和一些个人折腾的小脚本，所有服务已经 docker 化，外网入口到服务器后，由 docker 版 nginx 代理转发内部 dockge 管理的各个 docker 服务。</p>
<p>需要备份的文件主要有：</p>
<ul>
<li>网站项目程序代码 <code>/var/www/html</code></li>
<li>数据库，MySQL 数据导出 sql 文件</li>
<li>Docker 应用配置 <code>/opt/docker/data</code></li>
<li>服务器的应用配置</li>
<li>镜像压缩包，一些自定义 Docker 镜像的压缩包</li>
</ul>
<p>数据每日备份，为了避免备份时间过长，出现锁文件，导致应用程序响应过长，影响用户体验或数据丢失等异常情况，没有<del>直接源文件打包</del>，而是<strong>复制备份文件到指定目录</strong>，然后在目录使用 tar 打包，数据库使用 mysqldump 导出 sql 文件，全程放在 cron job 里定时运行。</p>
<p>每日备份保存最近七天 tar.gz 备份文件，<del>并且 rsync 同步推送到异地备份</del>，后面出于安全考虑，避免通过入侵 Web 机对免密登录的异地机执行脚本，改成<strong>异地机主动拉取同步 Web 机七天备份文件夹</strong>。</p> <p><a href="https://blog.196000.xyz/2025/2025-03-01-develop-vps-app-backup.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-02-26-develop-vps-ipv4-first.html</id><title>Debian 双栈网络时开启 IPv4 优先</title><link href="https://blog.196000.xyz/2025/2025-02-26-develop-vps-ipv4-first.html"/><updated>2025-02-26T22:00:00+08:00</updated><summary>Xray 设置 IPv4 优先</summary><content type="html"><![CDATA[<h1 id="debian-双栈网络时开启-ipv4-优先">Debian 双栈网络时开启 IPv4 优先</h1>
<p>Xray 设置 IPv4 优先</p>
<pre class="bash"><code># 面板设置 - Xray 相关设置
&quot;outbounds&quot;: [
    {
      &quot;protocol&quot;: &quot;freedom&quot;,
      &quot;settings&quot;: {
        &quot;domainStrategy&quot;: &quot;UseIPv4v6&quot;  # &lt;---  xray 出口要 outbound 配置 IPv4 优先
      }
    }
    ...
  ],</code></pre>
<p>双协议栈技术就是指在一台设备上同时启用 IPv4 协议栈和 IPv6 协议栈，这样就可以同时使用 IPv4 和 IPv6 的网络。</p> <p><a href="https://blog.196000.xyz/2025/2025-02-26-develop-vps-ipv4-first.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-02-22-develop-iperf3.html</id><title>iperf3 测速</title><link href="https://blog.196000.xyz/2025/2025-02-22-develop-iperf3.html"/><updated>2025-02-22T22:00:00+08:00</updated><summary>使用 iperf3 来测试不同主机之间的连接速度。</summary><content type="html"><![CDATA[<h1 id="iperf3-测速">iperf3 测速</h1>
<p>使用 iperf3 来测试不同主机之间的连接速度。</p>
<ol type="1">
<li>安装 iperf3</li>
</ol>
<p>```bash # CentOS yum -y install iperf3 dnf install iperf3 # Ubuntu apt-get -y install iperf3 # Alpine apk add iperf3 # Arch Linux pacman -S iperf3 # Windows 版 iperf3 下载地址 # https://files.budman.pw/ # https://github.com/ar51an/iperf3-win-builds</p> <p><a href="https://blog.196000.xyz/2025/2025-02-22-develop-iperf3.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2025/2025-01-01-life-hello-2025.html</id><title>你好，2025</title><link href="https://blog.196000.xyz/2025/2025-01-01-life-hello-2025.html"/><updated>2025-01-01T00:00:00+08:00</updated><summary>再见，2024，你好，2025</summary><content type="html"><![CDATA[<h1 id="你好2024">你好，2024</h1>
<p>再见，2024，你好，2025</p>
<!-- 
夏天减肥

博客



maccms
vuepress
pbootcms 
--> <p><a href="https://blog.196000.xyz/2025/2025-01-01-life-hello-2025.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-12-08-develop-cloudflare-https.html</id><title>Cloudflare 配置域名始终 https 访问</title><link href="https://blog.196000.xyz/2024/2024-12-08-develop-cloudflare-https.html"/><updated>2024-12-08T15:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="cloudflare-配置域名始终-https-访问">Cloudflare 配置域名始终 https 访问</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/cloudflare-https-http.png?t=1771230058" loading="lazy" /></p>
<p>源服务器无论是否支持 HTTPS，配置通过 Cloudflare 将所有 HTTP 访问自动重定向到 HTTPS 步骤：</p>
<p>cloudflare 会员中心选择域名后</p>
<ol type="1">
<li><p>设置 SSL/TLS 加密模式</p>
<p><code>SSL/TLS  --&gt; 概述 -- &gt; 配置</code>，更改为<code>灵活</code>模式，即用户浏览器使用 https 可以通过代理访问到服务器 http 的服务。</p></li>
<li><p>启用“自动重写 HTTPS”</p>
<ul>
<li>进入 SSL/TLS 设置：点击顶部菜单中的 “SSL/TLS” 标签。<br />
</li>
<li>启用“Always Use HTTPS”： 在 “Edge Certificates” 部分，找到 “Always Use HTTPS” 选项。将其切换为 “On”。</li>
<li>地址 <code>https://dash.cloudflare.com/84f14c09be73681c22d318e5990xxxxx/196000.xyz/ssl-tls/edge-certificates</code></li>
</ul></li>
</ol> <p><a href="https://blog.196000.xyz/2024/2024-12-08-develop-cloudflare-https.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-12-01-develop-docker-vue.html</id><title>基于 Docker 构建统一的 Vue 开发环境</title><link href="https://blog.196000.xyz/2024/2024-12-01-develop-docker-vue.html"/><updated>2025-01-14T18:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="基于-docker-构建统一的-vue-开发环境">基于 Docker 构建统一的 Vue 开发环境</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/docker_vue.png?t=1771230058" loading="lazy" /></p>
<p>基于 Docker 构建统一的 Vue 开发环境，运行后组件版本如下</p>
<p>```bash # /app # npm -v # 10.8.2 # /app # pnpm -v # 9.14.2 # /app # node -v # v22.6.0 # /app # yarn -v # 1.22.22 # /app # vue -V # <span class="citation" data-cites="vue/cli">@vue/cli</span> 5.0.8 # /app # create-vue –version</p> <p><a href="https://blog.196000.xyz/2024/2024-12-01-develop-docker-vue.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-11-21-docker-maddy.html</id><title>【玩 docker】使用 maddy 自建邮件服务器</title><link href="https://blog.196000.xyz/2024/2024-11-21-docker-maddy.html"/><updated>2024-11-21T10:30:00+08:00</updated><content type="html"><![CDATA[<h1 id="玩-docker使用-maddy-自建邮件服务器">【玩 docker】使用 maddy 自建邮件服务器</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/maddy.webp?t=1771230058" loading="lazy" /></p>
<p><a href="https://github.com/foxcpp/maddy">Maddy</a> 是一款用 Go 语言开发的邮件服务器，部署方便，资源占用少，是一款适合个人使用的邮箱服务器。</p>
<p><img src="https://blog.196000.xyz/uploads/images/2024/maddy-mem.png?t=1771230058" loading="lazy" /></p>
<p>在我的 <a href="https://tools.196000.xyz/server/">CloudCone</a> 1C1G 机 docker 搭建后查看容器，CPU 使用 0.03%，内存使用 20M，所以 1C1G 跑起来毫无压力。</p>
<h2 id="准备">准备</h2>
<ul>
<li>一台 VPS，支持开启 25 (<code>telnet smtp.qq.com 25</code>) 端口和 rDNS</li>
<li>一个域名，支持管理 A/AAAA 记录、MX 记录、TXT 记录等</li>
<li>邮箱域名的证书和密钥（使用 Certbot 申请）</li>
</ul>
<h2 id="安装-docker">安装 docker</h2> <p><a href="https://blog.196000.xyz/2024/2024-11-21-docker-maddy.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-11-13-develop-linux-port.html</id><title>Linux 端口号范围及检测</title><link href="https://blog.196000.xyz/2024/2024-11-13-develop-linux-port.html"/><updated>2024-11-13T10:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="linux-端口号范围及检测">Linux 端口号范围及检测</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/netstat.png?t=1771230058" loading="lazy" /></p>
<p>在 Linux 系统中，端口号的范围从 0 到 65535。根据用途，端口号可分为三类：</p>
<ol type="1">
<li>知名端口（Well-known Ports）：
<ul>
<li>范围：0–1023</li>
<li>用途：通常用于系统级和知名服务，如 HTTP (80)、HTTPS (443)、FTP (21)、SSH (22) 等。</li>
<li>说明：这些端口通常需要超级用户权限 root 才能使用，它们紧密绑定与一些常见服务，例如 FTP 服务使用端口 21，我们可以 <code>/etc/services</code> 里面查看到对应的映射关系。</li>
</ul></li>
<li>注册端口（Registered Ports）：
<ul>
<li>范围：1024–49151</li>
<li>用途：用于用户进程或程序，这些端口可以由应用程序自行分配。例如 MySQL (3306)、PostgreSQL (5432) 等。</li>
</ul></li>
<li>动态/私有端口（Dynamic/Private Ports）：
<ul>
<li>范围：49152–65535</li>
<li>用途：通常用于短暂连接和客户端分配，比如 NAT 设备和临时网络连接。这些端口不固定分配给任何特定服务。</li>
<li>说明：Linux 中有限定端口的使用范围，如果要为程序预留某些端口，需要控制这个端口范围。<code>/proc/sys/net/ipv4/ip_local_port_range</code> 定义了本地 <code>TCP/UDP</code> 的端口范围，我们可以在 <code>/etc/sysctl.conf</code> 里面定义 <code>net.ipv4.ip_local_port_range = 1024 65000</code></li>
</ul></li>
</ol> <p><a href="https://blog.196000.xyz/2024/2024-11-13-develop-linux-port.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-11-11-homelab-debian-template.html</id><title>在 PVE 使用 Debian 云镜像创建虚拟机</title><link href="https://blog.196000.xyz/2024/2024-11-11-homelab-debian-template.html"/><updated>2024-11-11T10:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="在-pve-使用-debian-云镜像创建虚拟机">在 PVE 使用 Debian 云镜像创建虚拟机</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/pve-vm-static-ip.png?t=1771230058" loading="lazy" /></p>
<p>在 PVE 中使用 Debian 云镜像创建虚拟机，并将其转换为模板，以便为批量创建统一配置的 Debian 12 系统提供基础。</p>
<h2 id="debian-官方提供的云镜像">Debian 官方提供的云镜像</h2>
<p><a href="https://cloud.debian.org/images/cloud/">Debian 官方</a> 提供以下版本云镜像</p>
<ul>
<li>azure：针对 Microsoft Azure 环境进行了优化</li>
<li>ec2：针对 Amazon EC2 进行了优化</li>
<li>generic：应该在任何使用 cloud-init 的环境中运行，例如 OpenStack、DigitalOcean 和裸机</li>
<li>genericcloud：类似于通用。应该在任何虚拟化环境中运行。通过排除物理硬件的驱动程序而小于“通用”</li>
<li>nocloud：主要用于测试构建过程本身。没有安装 cloud-init，而是允许没有密码的 root 登录</li>
</ul>
<h2 id="选择哪一个版本">选择哪一个版本？</h2> <p><a href="https://blog.196000.xyz/2024/2024-11-11-homelab-debian-template.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-10-28-develop-mkcert.html</id><title>本地 https 解决方案</title><link href="https://blog.196000.xyz/2024/2024-10-28-develop-mkcert.html"/><updated>2024-10-28T14:30:00+08:00</updated><content type="html"><![CDATA[<h1 id="本地-https-解决方案">本地 https 解决方案</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/mkcert-https.png?t=1771230058" loading="lazy" /></p>
<p>mkcert 是一个用于生成本地自签名 SSL 证书的开源工具，项目基于 Golang 开发，可跨平台使用，支持多域名以及自动信任 CA。</p>
<p><strong>准备工作</strong></p>
<p>局域网内访问 Web 服务的场景，因此开始前需要：</p>
<ul>
<li>服务器：用于提供 Web 服务，安装 nginx 并开启 SSL，系统为 CentOS7。</li>
<li>客户端：一台 Windows 电脑，或者一台 手机，用于测试访问，与服务器处于同一局域网。</li>
</ul>
<h2 id="centos7">CentOS7</h2>
<p>```shell # 下载安装 wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 chmod +x mkcert</p> <p><a href="https://blog.196000.xyz/2024/2024-10-28-develop-mkcert.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-10-24-develop-rsync.html</id><title>rsync 的使用</title><link href="https://blog.196000.xyz/2024/2024-10-24-develop-rsync.html"/><updated>2025-08-07T19:00:00+08:00</updated><content type="html"><![CDATA[<h1 id="rsync-的使用">rsync 的使用</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/rsync.png?t=1771230058" loading="lazy" /></p>
<p>rsync（Remote Sync，远程同步） 是一个开源的快速备份工具，可以在不同主机之间镜像同步整个目录树，支持增量备份，并保持链接和权限，且采用优化的同步算法，传输前执行压缩，因此非常适用于异地备份、镜像服务器等应用。</p>
<h2 id="安装">1. 安装</h2>
<p>```bash # Red Hat sudo yum install rsync # Debian/Ubuntu sudo apt-get install rsync sudo systemctl enable rsync.service sudo systemctl stop rsync.service sudo systemctl start rsync.service sudo systemctl status rsync.service # Arch Linux sudo pacman -S rsync</p> <p><a href="https://blog.196000.xyz/2024/2024-10-24-develop-rsync.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-10-21-develop-crontab.html</id><title>crontab 使用总结及在线工具</title><link href="https://blog.196000.xyz/2024/2024-10-21-develop-crontab.html"/><updated>2024-10-21T11:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="crontab-使用总结及在线工具">crontab 使用总结及在线工具</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/crontab-guru.png?t=1771230058" loading="lazy" /></p>
<p>cron 是一个在后台运行调度的守护进程，而 crontab 是一个设置 cron 的工具。</p>
<p>本文总结一下笔者使用 crontab 过程中常遇到的问题和一些经验技巧，希望可以帮助到大家。</p>
<h2 id="安装-cron-服务">1. 安装 cron 服务</h2>
<p>安装服务</p>
<pre class="bash"><code># Debian/Ubuntu 系统
sudo apt-get install cron
# CentOS/RHEL 系统中
sudo yum install cronie</code></pre> <p><a href="https://blog.196000.xyz/2024/2024-10-21-develop-crontab.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-10-05-develop-vps-calculator.html</id><title>VPS 剩余价值计算器</title><link href="https://blog.196000.xyz/2024/2024-10-05-develop-vps-calculator.html"/><updated>2024-10-05T11:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="vps-剩余价值计算器">VPS 剩余价值计算器</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/jsq-pc.webp?t=1771230058" loading="lazy" /></p>
<p>对一名<a href="https://tools.196000.xyz/server">鸡进鸡出</a>如家常事的 mjj 玩家来说，一枚好用的 VPS 剩余价值计算器让你在交易中得心应手。</p>
<p>而现有的 VPS 剩余价值计算器，使用下来每款总有那么一点点不足，要么不太符合自己的口味，要么交互一点欠缺，要么功能稍有缺失，或者颜值不足…</p>
<p>本着自己动手，丰衣足食，于是有了这个 <a href="https://tools.196000.xyz/jsq">VPS 剩余价值计算器</a>：</p>
<ul>
<li>交互合理</li>
<li>简洁清晰的计算结果</li>
<li>汇率每日自动更新，并且支持自定义汇率计算</li>
<li>更准确的算法，比如大小月非直接取30天计算</li>
<li>一键导出计算结果为图片，支持分享</li>
<li>适应不同的屏幕，电脑和手机浏览器体验良好</li>
</ul>
<p>线上体验地址是 https://tools.196000.xyz/jsq</p> <p><a href="https://blog.196000.xyz/2024/2024-10-05-develop-vps-calculator.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-09-17-vps-rsa-ssh.html</id><title>SSH 使用密钥免密码登录服务器</title><link href="https://blog.196000.xyz/2024/2024-09-17-vps-rsa-ssh.html"/><updated>2025-02-16T18:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="ssh-使用密钥免密码登录服务器">SSH 使用密钥免密码登录服务器</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/vps-rsa-ssh.png?t=1771230058" loading="lazy" /></p>
<p>为了简化 SSH 登录过程, 实现从客户机 Client 登录服务机 Upgrade 只需要运行 <code>ssh hostname</code> 即可, 即不需要输入用户名和密码。</p>
<p>免密码登录服务器设置步骤</p>
<p><strong>1. 在客户机生成 SSH 密钥和公钥</strong></p>
<p>假设客户机 Client(<code>192.168.0.104</code>) 和远程服务机 Upgrade(<code>148.135.123.140</code>) 拥有相同的用户，名为 root。</p>
<p><strong>Client 客户机执行</strong></p>
<p>```bash ssh-keygen -t rsa</p> <p><a href="https://blog.196000.xyz/2024/2024-09-17-vps-rsa-ssh.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-27-homelab-zfs-rename.html</id><title>zfs 更改卷名和挂载点</title><link href="https://blog.196000.xyz/2024/2024-08-27-homelab-zfs-rename.html"/><updated>2024-08-27T11:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="zfs-更改卷名和挂载点">zfs 更改卷名和挂载点</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/zfs-rename-and-mountpoint.png?t=1771230058" loading="lazy" /></p>
<p>PVE 下的 LXC 虚拟机，使用备份还原操作后，根磁盘挂载点从原来的 <code>Drives:subvol-117-disk-0</code> 变成 <code>Drives:subvol-117-disk-1</code> 了，并且表单是灰色的，不能编辑名称。</p>
<p>使用 <code>zfs list</code> 可以查看到卷名和挂载点 <code>NAME</code> 和 <code>MOUNTPOINT</code> 是对应的名字：</p>
<pre class="bash"><code>root@pve:~# zfs list
NAME                                 USED  AVAIL     REFER  MOUNTPOINT
tank/pve/drives/subvol-117-disk-1    126M  29.9G      126M  /tank/pve/drives/subvol-117-disk-1</code></pre>
<p>将 zfs 卷的名称和挂载点从 <code>tank/pve/drives/subvol-117-disk-1</code> 更改为 <code>tank/pve/drives/subvol-117-disk-0</code></p>
<h2 id="更改配置文件">更改配置文件</h2> <p><a href="https://blog.196000.xyz/2024/2024-08-27-homelab-zfs-rename.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-21-docker-tips.html</id><title>docker 使用集锦</title><link href="https://blog.196000.xyz/2024/2024-08-21-docker-tips.html"/><updated>2024-08-01T11:27:31-04:00</updated><content type="html"><![CDATA[<h1 id="docker-使用集锦">docker 使用集锦</h1>
<ul>
<li>按照 CPU 使用率列出容器</li>
</ul>
<pre class="bash"><code>docker stats --no-stream --format &quot;table {{.Container}}	{{.Name}}	{{.CPUPerc}}	{{.MemUsage}}	{{.NetIO}}	{{.BlockIO}}	{{.PIDs}}&quot; | (read -r; printf &quot;%s
&quot; &quot;$REPLY&quot;; sort -k3 -hr)</code></pre>
<ul>
<li>停止除 dockge 之外的所有容器</li>
</ul>
<pre class="bash"><code>docker ps -q | grep -v $(docker ps -qf &quot;name=dockge&quot;) | xargs docker stop</code></pre>
<ul>
<li>查看使用的全部端口</li>
</ul>
<pre class="bash"><code>netstat -lnptu | awk &#39;NR&gt;2{print $4}&#39; | grep -E &#39;(0.0.0.0:|127.0.0.1:|:::)&#39; | sed &#39;s/.*://&#39; | sort -n | uniq</code></pre> <p><a href="https://blog.196000.xyz/2024/2024-08-21-docker-tips.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-11-docker-easyimage2.0.html</id><title>【玩 docker】 简单图床 easyImage2.0</title><link href="https://blog.196000.xyz/2024/2024-08-11-docker-easyimage2.0.html"/><updated>2024-08-18T11:27:35-04:00</updated><content type="html"><![CDATA[<h1 id="玩-docker-简单图床-easyimage2.0">【玩 docker】 简单图床 easyImage2.0</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/easyimage2.0-picgo.webp?t=1771230058" loading="lazy" /></p>
<p>如果你根我一样，自己拥有 VPS 但是服务器性能不高或者硬盘不大，想部署属于自己的图床给博客或网络贴图使用——纯自用、上传图片随时随地、使用方便、图片自助管理、删除备份，但是又不想公开为公共图床。</p>
<p>推荐自己在用的方案：<code>EasyImage2.0 + PicGo</code></p>
<ul>
<li><p>Docker 部署开源图床程序 EasyImage2，后台设置</p>
<ul>
<li>“登录上传” —— 确保纯个人使用，保护小鸡鸡小硬盘</li>
<li>“开启 API 上传” —— 配合 PicGo 不用每次上传图片都要打开浏览器</li>
</ul></li>
<li><p>PicGo 开源图床客户端，支持很多平台，拖进去上传图片，完成右下角通知，复制即可使用</p></li>
</ul>
<h2 id="简单图床">简单图床</h2> <p><a href="https://blog.196000.xyz/2024/2024-08-11-docker-easyimage2.0.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-05-vps-docker-clean.html</id><title>清理 docker 占用的硬盘空间</title><link href="https://blog.196000.xyz/2024/2024-08-05-vps-docker-clean.html"/><updated>2024-08-05T11:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="清理-docker-占用的硬盘空间">清理 docker 占用的硬盘空间</h1>
<h2 id="如何确认实际使用的空间">如何确认实际使用的空间</h2>
<ol type="1">
<li>查看所有硬盘的剩余空间</li>
</ol>
<pre class="bash"><code># 查看所有硬盘的剩余空间
df -hT  
du /var/log -h -d 1 | sort -h</code></pre>
<ol start="2" type="1">
<li>查看实际使用空间</li>
</ol>
<pre class="bash"><code># 显示 Docker 使用的镜像、容器、卷和构建缓存的实际大小
docker system df</code></pre> <p><a href="https://blog.196000.xyz/2024/2024-08-05-vps-docker-clean.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-04-vps-k8s-install.html</id><title>debian12 中使用 kubeadm 搭建 k8s 集群</title><link href="https://blog.196000.xyz/2024/2024-08-04-vps-k8s-install.html"/><updated>2025-04-30T11:27:27-04:00</updated><summary>本文将介绍国内网络环境下，如何在 debian12 系统，使用 Kubeadm 搭建基于 containerd 容器运行、包含 Master 和 Worker 两节点的、目前（2024.08.12）最新最新版本（v1.30.3）的 kubernetes 集群。</summary><content type="html"><![CDATA[<h1 id="debian12-中使用-kubeadm-搭建-k8s-集群">debian12 中使用 kubeadm 搭建 k8s 集群</h1>
<p>本文将介绍国内网络环境下，如何在 debian12 系统，使用 Kubeadm 搭建基于 containerd 容器运行、包含 Master 和 Worker 两节点的、目前（2024.08.12）最新最新版本（v1.30.3）的 kubernetes 集群。</p>
<h2 id="主机规划">主机规划</h2>
<table>
<thead>
<tr class="header">
<th>角色</th>
<th>主机名</th>
<th>IP</th>
<th>版本</th>
<th>配置</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Master Node</td>
<td>k8s-master</td>
<td>192.168.0.210</td>
<td>debian12</td>
<td>2C/4G/30G</td>
</tr>
<tr class="even">
<td>Worker Node 1</td>
<td>k8s-worker01</td>
<td>192.168.0.211</td>
<td>debian12</td>
<td>2C/4G/30G</td>
</tr>
</tbody>
</table>
<h2 id="软件版本">软件版本</h2>
<table>
<thead>
<tr class="header">
<th>软件名称</th>
<th>版本</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>PVE</td>
<td>v7.4-18</td>
<td></td>
</tr>
<tr class="even">
<td>KVM</td>
<td>debian12</td>
<td>PVE 虚拟主机使用 <a href="https://cloud.debian.org/images/cloud/bookworm/20240717-1811/debian-12-generic-amd64-20240717-1811.qcow2">debian12 cloud qcow2 镜像</a></td>
</tr>
<tr class="odd">
<td>containerd</td>
<td>v1.6.20</td>
<td><a href="https://kubernetes.io/zh-cn/blog/2022/04/07/upcoming-changes-in-kubernetes-1-24/">官方公布</a>从 1.24 版本开始移除 dockershim</td>
</tr>
<tr class="even">
<td>kubernetes</td>
<td>v1.30.3</td>
<td>docker 可 v1.23.6，其它推荐<a href="https://kubernetes.io/releases/">官方仍在维护的版本</a></td>
</tr>
</tbody>
</table> <p><a href="https://blog.196000.xyz/2024/2024-08-04-vps-k8s-install.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-08-01-docker-dockge.html</id><title>【玩 docker】 docker compose 可视化管理器 dockge</title><link href="https://blog.196000.xyz/2024/2024-08-01-docker-dockge.html"/><updated>2024-08-01T11:27:28-04:00</updated><content type="html"><![CDATA[<h1 id="玩-docker-docker-compose-可视化管理器-dockge">【玩 docker】 docker compose 可视化管理器 dockge</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/docker-dockge.webp?t=1771230058" loading="lazy" /></p>
<p>Dockge 是一个自托管的面向 docker <code>compose.yaml</code> 管理工具，允许用户管理其 <code>compose.yaml</code> 文件、更新 Docker 镜像。它还支持多个代理，允许在一个应用上管理多个主机上的 docker 镜像，支持将 docker run 命令转换为 <code>compose.yaml</code> 文件。</p>
<p>Dockge 是 Uptime Kuma 作者的新作品，主打的是简单易上手，与 Potainer 相比界面简洁易用，对新手使用更加友好。</p>
<p><strong>创建文件夹和文件</strong></p>
<pre class="bash"><code>mkdir -p /opt/docker/data/dockge
mkdir -p /opt/docker/build/dockge
mkdir -p /opt/dockge
vi /opt/dockge/compose.yaml</code></pre>
<ul>
<li><code>/opt/docker/data/dockge</code></li>
</ul> <p><a href="https://blog.196000.xyz/2024/2024-08-01-docker-dockge.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-07-25-vps-tz-nezha-docker.html</id><title>哪吒监控服务端搭建——手工 docker 版</title><link href="https://blog.196000.xyz/2024/2024-07-25-vps-tz-nezha-docker.html"/><updated>2024-07-25T11:27:27-04:00</updated><content type="html"><![CDATA[<h1 id="哪吒监控服务端搭建手工-docker-版">哪吒监控服务端搭建——手工 docker 版</h1>
<p><img src="https://blog.196000.xyz/uploads/images/2024/tz.webp?t=1771230058" loading="lazy" /></p>
<p>哪吒监控 Dashboard 之前使用的官方一键安装脚本，选择 standalone 方式部署的。</p>
<p>主控端更换服务器，想在 ServerStatus 主题上进行一些页面修改，服务器已经运行 docker 服务，不使用官方一键脚本，直接 docker 下部署 Dashboard。</p>
<h2 id="域名解析">域名解析</h2>
<p>哪吒需要有两个公网端口，默认一个 8008 端口用于面板的访问 ，另一个 5555 端口用于客户端上报数据。</p>
<p>8008 端口绑定域名为 <code>tz.196000.xyz</code>，可打开小黄云开启 CDN 隐藏源站 IP。</p>
<p>5555 端口绑定域名为 <code>tzrpc.196000.xyz</code>，不能打开小黄云。</p> <p><a href="https://blog.196000.xyz/2024/2024-07-25-vps-tz-nezha-docker.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-07-21-homelab-hardware-temperature.html</id><title>使用 Telegraf + InfluxDB + Grafana 实时监控主机硬件温度</title><link href="https://blog.196000.xyz/2024/2024-07-21-homelab-hardware-temperature.html"/><updated>2024-08-28T11:27:27+08:00</updated><summary>主机温度</summary><content type="html"><![CDATA[<h1 id="使用-telegraf-influxdb-grafana-实时监控主机硬件温度">使用 Telegraf + InfluxDB + Grafana 实时监控主机硬件温度</h1>
<figure>
<img src="https://blog.196000.xyz/uploads/images/2024/proxmox-temperature.webp?t=1771230058" loading="lazy" alt="" /><figcaption>主机温度</figcaption>
</figure>
<p>通过前面大家知道我有一台安装 PVE 系统的 <a href="../2023/2023-10-21-homelab-architecture.html">N00 小主机</a>。今天跟跟大家分享一下我使用 Telegraf 收集主机 CPU、固态硬盘、机械硬盘硬件温度数据，然后把数据存储在 InfluxDB 上，并在 Grafana 实时显示硬件数据的过程。</p>
<p>软件功能作用简介</p>
<ul>
<li>Telegraf，数据采集工具，可以采集多种组件运行信息，而不需自己手写脚本定时采集，降低数据获取难度。</li>
<li>InfluxDB，数据存储工具，时间序列数据库，适合存储设备性能、日志、物联网传感器等带有时间戳的数据。</li>
<li>Grafana，数据可视化工具，帮助用户将数据源中的数据图形化的展示和实时监控，便于用户直观地理解数据。</li>
</ul>
<h2 id="打开-pve-指标数据">打开 PVE 指标数据</h2>
<p>将 Proxmox 指标收集重定向到 Telegraf 可以使用的本地 Socket。</p> <p><a href="https://blog.196000.xyz/2024/2024-07-21-homelab-hardware-temperature.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-07-20-docker-prometheus-grafana.html</id><title>【玩 docker】监控平台 Prometheus + Grafana 的部署</title><link href="https://blog.196000.xyz/2024/2024-07-20-docker-prometheus-grafana.html"/><updated>2025-04-25T11:27:27-04:00</updated><summary>Grafana，Prometheus 和 Node Exporter 是一套流行的开源监控工具，用于收集，存储，查询系统和应用程序的各种使用率，并可视化显示。每个工具都有特定的功能：</summary><content type="html"><![CDATA[<h1 id="玩-docker监控平台-prometheus-grafana-的部署">【玩 docker】监控平台 Prometheus + Grafana 的部署</h1>
<p>Grafana，Prometheus 和 Node Exporter 是一套流行的开源监控工具，用于收集，存储，查询系统和应用程序的各种使用率，并可视化显示。每个工具都有特定的功能：</p>
<ul>
<li>Grafana：是一款可视化程序，提供开源版和企业版。 Grafana 不从客户端收集任何数据，也不存储，它的功能是以直观且优美的格式显示 Prometheus 或其他数据源（SQL 等）收集的数据。 它允许用户自定义面板，支持警报、注释、仪表板变量、插件和身份验证。</li>
<li>Prometheus：是一个开源的系统监控和警告程序，它使用 HTTP 协议轮询客户端以获取所需数据。维护结果的时间序列数据库，以预定义的时间间隔轮询每个客户端，进而能够构建客户端长期性能的概览。</li>
<li>Node Exporter：在客户端节点上能使用各种收集器，但 Prometheus 推荐使用自己的 Node Exporter 工具。 它收集大量硬件和内核指标，如 CPU，磁盘 I/O，内存，网络等。</li>
</ul>
<p>Prometheus 用于数据收集和监控，Grafana 用于数据可视化。</p>
<h2 id="使用-docker-compose-安装-prometheus-grafana">使用 docker compose 安装 Prometheus + Grafana</h2>
<p><code>docker-compose.yaml</code></p>
<p>```yaml version: ‘3’ services: # influxdb</p> <p><a href="https://blog.196000.xyz/2024/2024-07-20-docker-prometheus-grafana.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-02-19-vps-linux-proxy.html</id><title>Linux 使用代理</title><link href="https://blog.196000.xyz/2024/2024-02-19-vps-linux-proxy.html"/><updated>2024-07-21T11:27:27-04:00</updated><summary>假设已存在 socks5/http 代理服务器，需要在 Linux 使用代理服务器的流量：</summary><content type="html"><![CDATA[<h1 id="linux-使用代理">Linux 使用代理</h1>
<p>假设已存在 socks5/http 代理服务器，需要在 Linux 使用代理服务器的流量：</p>
<ul>
<li>某 ui入站列表 - 添加入站，协议选择 “socks”，可以打开密码认证，则对外提供代理服务地址为 <code>socks5://IP:PORT</code></li>
<li>本地安装有某 N 也可以开启本地 socks 监听端口，并且打开“允许来自局域网的连接”，则可对局域网提供代理服务地址为 <code>socks5://192.168.0.104:10808</code> 和 <code>http://192.168.0.104:10809</code></li>
</ul>
<h2 id="临时为部分软件启用代理当前-shell-下">临时为部分软件启用代理(当前 shell 下)</h2>
<p>适合软件支持读取环境变量中的代理设置，常用软件大多数支持自动读取代理，如 curl、wget 等工具。如果不确定或不支持请参考后续的强制代理部分。</p>
<p>```bash # 首选 export all_proxy=socks5://192.168.0.104:10808 # 不推荐，可能会遇到问题 export http_proxy=http://192.168.0.104:10809 &amp;&amp; export https_proxy=http://192.168.0.104:10809 &amp;&amp; export no_proxy=“localhost, 127.0.0.1, ::1” # 检查设置 env | grep -i proxy</p> <p><a href="https://blog.196000.xyz/2024/2024-02-19-vps-linux-proxy.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-01-16-vps-ipv6-browser-ssh.html</id><title>ttyd 网页 ssh</title><link href="https://blog.196000.xyz/2024/2024-01-16-vps-ipv6-browser-ssh.html"/><updated>2024-01-17T11:27:27-04:00</updated><summary>纯 IPv6 LXC 容器使用备忘 连接 SSH，需要本地网络支持 IPv6，或者连接支持 IPv6 的 VPS 连接通后使用。</summary><content type="html"><![CDATA[<h1 id="ttyd-网页-ssh">ttyd 网页 SSH</h1>
<p><a href="../2024/2024-01-04-vps-only-ipv6.html">纯 IPv6 LXC 容器使用备忘</a> 连接 SSH，需要本<strong>地网络支持 IPv6</strong>，或者连接支持 IPv6 的 VPS 连接通后使用。</p>
<pre class="bash"><code>ssh root@2400:xxx:xxx:xxx::xxx
# 指定端口
ssh root@2400:xxx:xxx:xxx::xxx -p5422</code></pre>
<p>另外，可以通过 ttyd 实现网页 SSH，并且<strong>使用 cloudflare 打开代理，使支持 ipv4 和 ipv6</strong>，随时随地访问，完美！</p>
<p>```bash # 1. 安装 ttyd wget https://github.com/tsl0922/ttyd/releases/download/1.7.4/ttyd.x86_64 -O /usr/sbin/ttyd chmod +x /usr/sbin/ttyd # 查看版本号 ttyd -v</p> <p><a href="https://blog.196000.xyz/2024/2024-01-16-vps-ipv6-browser-ssh.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-01-04-vps-only-ipv6.html</id><title>纯 IPv6 LXC 容器使用备忘</title><link href="https://blog.196000.xyz/2024/2024-01-04-vps-only-ipv6.html"/><updated>2024-07-23T11:27:27-04:00</updated><summary>```bash # 1. wapac 系统模板 Debian11 root@wap:~# uname -a # Linux wap 6.5.11-4-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-4 (2023-11-20T10:19Z) x86_64 GNU/Linux root@wap:~# cat /proc/version # Linux version 6.5.11-4-pve (fgruenbichler@yuna) (gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-4 (2023-11-20T10:19Z) # 2. ping root@wap:~# ping -4 google.com # 纯 IPv6 不能访问 IPv4 网络，如下提示，解决看 2. 实现访问 ipv4 功能 # ping: connect: Network is unreachable root@wap:~# ping -6 google.com</summary><content type="html"><![CDATA[<h1 id="纯-ipv6-lxc-容器使用备忘">纯 IPv6 LXC 容器使用备忘</h1>
<blockquote>
<p>本文内容在 wapac 的 HK IPv6 年付 1 刀机，系统选择 “Debian11” 环境下检验成功，如有错误可以重装对应系统尝试一下。 最后更新时间：2024/07/23</p>
</blockquote>
<h2 id="了解机器信息">1. 了解机器信息</h2>
<p>```bash # 1. wapac 系统模板 Debian11 root@wap:~# uname -a<br />
# Linux wap 6.5.11-4-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-4 (2023-11-20T10:19Z) x86_64 GNU/Linux root@wap:~# cat /proc/version # Linux version 6.5.11-4-pve (fgruenbichler@yuna) (gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-4 (2023-11-20T10:19Z) # 2. ping root@wap:~# ping -4 google.com # 纯 IPv6 不能访问 IPv4 网络，如下提示，解决看 2. 实现访问 ipv4 功能 # ping: connect: Network is unreachable root@wap:~# ping -6 google.com</p> <p><a href="https://blog.196000.xyz/2024/2024-01-04-vps-only-ipv6.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2024/2024-01-01-life-hello-2024.html</id><title>你好，2024</title><link href="https://blog.196000.xyz/2024/2024-01-01-life-hello-2024.html"/><updated>2024-01-01T11:27:27-04:00</updated><summary>再见，2023，你好，2024</summary><content type="html"><![CDATA[<h1 id="你好2024">你好，2024</h1>
<p>再见，2023，你好，2024</p> <p><a href="https://blog.196000.xyz/2024/2024-01-01-life-hello-2024.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-12-29-develop-cloudflare-real-ip.html</id><title>Nginx 获取经 Cloudflare CDN 后访客真实 IP</title><link href="https://blog.196000.xyz/2023/2023-12-29-develop-cloudflare-real-ip.html"/><updated>2023-12-29T11:27:27+08:00</updated><summary>Cloudflare IP</summary><content type="html"><![CDATA[<h1 id="nginx-获取经-cloudflare-cdn-后访客真实-ip">Nginx 获取经 Cloudflare CDN 后访客真实 IP</h1>
<figure>
<img src="https://blog.196000.xyz/uploads/images/2023/cloudflare-ip.webp?t=1771230058" loading="lazy" alt="" /><figcaption>Cloudflare IP</figcaption>
</figure>
<p>网站使用 Cloudflare CDN 后，Nginx 的访问日志客户端 IP 是 Cloudflare 转发服务器的代理 IP，并非用户端真实的 IP，获取访客真实 IP 需要额外处理一下，<a href="https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/">官方文档</a> 处理方法。</p>
<p>获取 Cloudflare 的服务器 IP，生成 <code>real-ip-header</code> 配置文件，并在 Nginx 配置文件的 <code>http {}</code> 适当地方 include 进来即可。</p>
<h2 id="cloudflare-real-ip.sh"><code>cloudflare-real-ip.sh</code></h2>
<p>```bash #!/usr/bin/env bash</p> <p><a href="https://blog.196000.xyz/2023/2023-12-29-develop-cloudflare-real-ip.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-12-27-develop-google-analytics.html</id><title>使用 Google Analytics 统计代码</title><link href="https://blog.196000.xyz/2023/2023-12-27-develop-google-analytics.html"/><updated>2023-12-27T11:27:27+08:00</updated><summary>首先 注册 GA（UA 以及 GA4 版本）https://analytics.google.com 。</summary><content type="html"><![CDATA[<h1 id="使用-google-analytics-统计代码">使用 Google Analytics 统计代码</h1>
<h2 id="注册-ga">注册 GA</h2>
<p>首先 注册 GA（UA 以及 GA4 版本）https://analytics.google.com 。</p>
<p>创建账号 - 输入账号名称&amp;勾选所有 - 显示高级选项，选择 <strong>同时创建 Google Analytics（分析）4 和 Universal Analytics 媒体资源</strong>，勾选 <strong>为 Google Analytics 4 媒体资源启用增强型衡量功能</strong> - 选择公司规模，打算如何使用 Google Analytics（分析）勾选除其他之外的所有选项 - 创建</p>
<h2 id="加速-ga">加速 GA</h2>
<p>使用 Cloudflare Worker 加速访问速度 https://dash.cloudflare.com 。</p>
<p>新建 Worker 代码如下，保存后部署（可先提交部署后可修改）：</p>
<p>```javascript addEventListener(‘fetch’, (event) =&gt; { // 这里可以加 filter</p> <p><a href="https://blog.196000.xyz/2023/2023-12-27-develop-google-analytics.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-12-20-homelab-ipv6-ddns.html</id><title>家庭宽带 IPv6 公网地址被外网访问</title><link href="https://blog.196000.xyz/2023/2023-12-20-homelab-ipv6-ddns.html"/><updated>2023-12-20T11:27:27+08:00</updated><summary>宽带没有公网 IPv4 但是有 IPv6，路由器经过前面《路由器防火墙开放指定后缀的动态 IPv6 并永久保存》的设置后，我们可以随时随地地访问家里有 IPv6 地址的内部设备，而且只开放需要的指定设备，安全可控、速度也不错。</summary><content type="html"><![CDATA[<h1 id="家庭宽带-ipv6-公网地址被外网访问">家庭宽带 IPv6 公网地址被外网访问</h1>
<p>宽带没有公网 IPv4 但是有 IPv6，路由器经过前面<a href="2023-11-26-homelab-nx30pro-iptables.html">《路由器防火墙开放指定后缀的动态 IPv6 并永久保存》</a>的设置后，我们可以随时随地地访问家里有 IPv6 地址的内部设备，而且只开放需要的指定设备，安全可控、速度也不错。</p>
<p>联通宽带分配的 IPv6 地址虽然是公网的，但是是动态的、变化的，如果我们要访问内网设备，需要知道当前的地址是什么？</p>
<h2 id="直接访问">直接访问</h2>
<figure>
<img src="https://blog.196000.xyz/uploads/images/2023/ipv6-notify.webp?t=1771230058" loading="lazy" alt="" /><figcaption>地址变化实时通知提醒</figcaption>
</figure>
<p><strong>最简单的是每次地址变化后，通知用户，用户使用最新变化后地址访问。</strong></p>
<p>此方法耗人力，每次地址不一样，使用需要更改到最新地址，优点是不用其它额外费用，比如宽带需要公网IPv4、额外购买公网VPS、购买域名等等额外费用。</p>
<p>```bash # 伪代码</p> <p><a href="https://blog.196000.xyz/2023/2023-12-20-homelab-ipv6-ddns.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-12-08-homelab-wireguard.html</id><title>使用 WireGuard 实现内网穿透</title><link href="https://blog.196000.xyz/2023/2023-12-08-homelab-wireguard.html"/><updated>2023-12-18T11:27:32+08:00</updated><summary>使用 WireGuard 内网穿透，实现在外面手机卡上网的手机，以公网机充当中转机，对家庭中非公网的内网设备进行访问。</summary><content type="html"><![CDATA[<h1 id="使用-wireguard-实现内网穿透">使用 WireGuard 实现内网穿透</h1>
<p>使用 WireGuard 内网穿透，实现在外面手机卡上网的手机，以公网机充当中转机，对家庭中非公网的内网设备进行访问。</p>
<p><strong>如结构图：</strong></p>
<ul>
<li>手机端（下文统称为“<code>手机</code>”）在外面使用中国移动上网</li>
<li>家庭网络中，家庭网关主机（下文统称为“<code>家庭网关主机</code>”）可以互联网访问，其它为内部设备，只能局域网访问</li>
<li>家庭局域网 IP 段为 <code>192.168.0.0/24</code></li>
<li>公网机（下文统称为“<code>公网机</code>”）公网 IP 为 <code>1.1.1.1</code></li>
<li>WireGuard 的隧道内网 IP 网段为 <code>10.96.0.0/24</code></li>
<li>实现手机跟家庭网关主机一样，访问家庭网络内部设备，例如手机访问“内网设备A”的 Web <code>http://192.168.0.6</code>，服务可用</li>
</ul>
<p><strong>此外，建立 WireGuard 隧道组建局域网外，手机端网络是公网代理上网的，如果公网机网络自带科学，手机也能科学上网的。</strong></p>
<h2 id="结构图">结构图</h2>
<p><img src="https://blog.196000.xyz/uploads/images/2023/wireguard.webp?t=1771230058" loading="lazy" /></p> <p><a href="https://blog.196000.xyz/2023/2023-12-08-homelab-wireguard.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-11-26-homelab-nx30pro-iptables.html</id><title>路由器防火墙开放指定后缀的动态 IPv6 并永久保存</title><link href="https://blog.196000.xyz/2023/2023-11-26-homelab-nx30pro-iptables.html"/><updated>2023-12-18T11:27:31+08:00</updated><summary>新购买的 H3C NX30Pro 路由器，默认防火墙是关闭 IPv6 的， 即外网不能通过 IPv6 地址访问内部设备。</summary><content type="html"><![CDATA[<h1 id="路由器防火墙开放指定后缀的动态-ipv6-并永久保存">路由器防火墙开放指定后缀的动态 IPv6 并永久保存</h1>
<p>新购买的 H3C NX30Pro 路由器，默认防火墙是关闭 IPv6 的， 即外网不能通过 IPv6 地址访问内部设备。</p>
<p>官方售后提供开启 IPv6 版本的固件，但是没有关闭开关，即对外全部开放。</p>
<p>对需要某些服务通过 IPv6 对外提供服务，但是又不想内网其它设备全部曝露在互联网之下的人来说，可以指定对外开放某台设备，比如设备A ，其它保持默认的禁止外网访问，这样是最好的。</p>
<p>联通宽带出于安全考虑，分配给用户的 IPv6 地址是动态的，每隔一段时间内网设备的 IPv6 地址会变化，观察如下：</p>
<pre class="bash"><code># 真实数据
2023/12/17 05:57:01 2408:9174:678b:2fc5:7sd:61ff:fa9e:2a84
2023/12/10 11:45:06 2408:9174:678b:5baa:7sd:61ff:fa9e:2a84
2023/12/03 14:03:01 2408:9174:6786:18b8:7sd:61ff:fa9e:2a84</code></pre> <p><a href="https://blog.196000.xyz/2023/2023-11-26-homelab-nx30pro-iptables.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-11-24-vps-getting-started.html</id><title>新购 VPS 服务器必做的那些事</title><link href="https://blog.196000.xyz/2023/2023-11-24-vps-getting-started.html"/><updated>2023-12-18T11:27:29+08:00</updated><summary>检查 IP 是否被墙，风险检测，酌情挑选，替换为 VPS 的 IP 后查看。</summary><content type="html"><![CDATA[<h1 id="新购-vps-服务器必做的那些事">新购 VPS 服务器必做的那些事</h1>
<h2 id="ip-检查">IP 检查</h2>
<p>检查 IP 是否被墙，风险检测，酌情挑选，替换为 VPS 的 IP 后查看。</p>
<pre class="bash"><code># 全球 ping
https://ping.pe/142.171.77.131
# 全国 ping
https://www.itdog.cn/ping/142.171.77.131
# 风险检测
https://scamalytics.com/ip/142.171.77.131
https://www.ipqualityscore.com/ip-reputation-check/lookup/142.171.77.131
https://ipdata.co/
https://ip.guide/142.171.77.131</code></pre> <p><a href="https://blog.196000.xyz/2023/2023-11-24-vps-getting-started.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-10-21-homelab-architecture.html</id><title>第一台迷你主机 - 系统篇</title><link href="https://blog.196000.xyz/2023/2023-10-21-homelab-architecture.html"/><updated>2023-10-06T11:27:27+08:00</updated><summary>PVE</summary><content type="html"><![CDATA[<h1 id="第一台迷你主机---系统篇">第一台迷你主机 - 系统篇</h1>
<figure>
<img src="https://blog.196000.xyz/uploads/images/2023/pve.webp?t=1771230058" loading="lazy" alt="" /><figcaption>PVE</figcaption>
</figure>
<p>自从购入<a href="./2023-10-06-homelab-hardware.html">第一台迷你主机</a>后，装上 PVE系统后，开始虚拟环境安装旁路由系统、装虚拟机各种系统、安装黑群晖、安装各种应用，忙的不亦乐乎。</p>
<p>9 月底在 Windows 直通核显，HDIM 接到电视输出的时候，遇到一个折腾几天没有解决的问题：电视不能输出声音，Windows 硬件下提示没有声卡，甚至非 PVE 直接在硬件安装 Windows 系统也一样，怀疑硬件问题，联系畅网售后技术远程调试后，答应可以各自出快递费用寄回工厂售后，检查有问题免费更换无问题原件寄回。</p>
<p>考虑马上国庆放假寄送可能会假后才寄回不太返厂，毕竟除了没怎么用上的声卡其它是没有问题，尝试各种测试和解决方法无解，尝试更换 Windows Lite 版本，使用完整版本安装的时候，正常了！于是继续折腾之路。</p>
<p>现在基本熟悉机器的硬件特性和如何使用，比如需要散热的部件、需要多大存储、容灾备份方案等，也逐渐了解在这台机器上可以提供什么功能，现在总结一下主机的使用、系统架构等方面。</p>
<!-- more -->
<h2 id="虚拟机规划">虚拟机规划</h2> <p><a href="https://blog.196000.xyz/2023/2023-10-21-homelab-architecture.html">点击阅读全文</a></p>]]></content></entry>
  <entry><id>https://blog.196000.xyz/2023/2023-10-06-homelab-hardware.html</id><title>第一台迷你主机 - 硬件篇</title><link href="https://blog.196000.xyz/2023/2023-10-06-homelab-hardware.html"/><updated>2024-07-11T11:27:27+08:00</updated><summary>n100</summary><content type="html"><![CDATA[<h1 id="第一台迷你主机---硬件篇">第一台迷你主机 - 硬件篇</h1>
<figure>
<img src="https://blog.196000.xyz/uploads/images/2023/n100.webp?t=1771230058" loading="lazy" alt="" /><figcaption>n100</figcaption>
</figure>
<h2 id="更新">更新</h2>
<ul>
<li>2024年7月11日，更新接入米家智能插座3功耗统计、年度耗电费用及主机温度等监控数据。</li>
</ul>
<p>很多人看到迷你主机，就说是软路由，其实这只是一小部分人的爱好，可以尝试作软路由，也可以拿来当作 AIO 主机。</p>
<p>2023 年 7 月 19 日购入第一台迷你主机准系统，其它配件后续断断续续到货，开箱安装上配置，安装 PVE 系统点亮后，到现在已经快 3 个月，复盘一下使用的这台迷你主机。</p>
<!-- more -->
<h2 id="购买理由">购买理由</h2>
<blockquote>
<p>Intel N100 采用 Intel 7 工艺，4 核 4 线程，睿频 3.4GHz，核显为 24EU，基本功耗（TDP）仅为 6W，适合无风扇冷却。于 2023 年初发布，性能大致相当于 i3-8100/i5-7440EQ 水平。</p>
</blockquote> <p><a href="https://blog.196000.xyz/2023/2023-10-06-homelab-hardware.html">点击阅读全文</a></p>]]></content></entry>
</feed>
