<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>短巷与雨</title>
  
  
  <link href="https://www.hudi.space/rss.xml" rel="self"/>
  
  <link href="https://www.hudi.space/"/>
  <updated>2026-05-09T14:27:40.734Z</updated>
  <id>https://www.hudi.space/</id>
  
  <author>
    <name>Hudi(唱唱反调)</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>用免费域名，搭建一个自己的临时邮箱服务保护您的真实邮箱地址</title>
    <link href="https://www.hudi.space/posts/fe93e64/"/>
    <id>https://www.hudi.space/posts/fe93e64/</id>
    <published>2026-01-14T03:00:50.197Z</published>
    <updated>2026-05-09T14:27:40.734Z</updated>
    
    <content type="html"><![CDATA[<h1 id="用免费域名，搭建一个自己的临时邮箱服务保护您的真实邮箱地址，远离垃圾邮件和不必要的订阅"><a href="#用免费域名，搭建一个自己的临时邮箱服务保护您的真实邮箱地址，远离垃圾邮件和不必要的订阅" class="headerlink" title="用免费域名，搭建一个自己的临时邮箱服务保护您的真实邮箱地址，远离垃圾邮件和不必要的订阅"></a>用免费域名，搭建一个自己的临时邮箱服务保护您的真实邮箱地址，远离垃圾邮件和不必要的订阅</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>好久没有认真去写文章了，2025年年末那会真的好忙，不过现在已经提离职了，真的很开心。离职了。可能也是一种解脱，一个人忙了大半年。不提这些事了。</p><p>分享一个临时邮箱服务MoeMail，搭建一个自己的临时邮箱服务保护您的真实邮箱地址，远离垃圾邮件和不必要的订阅，这个项目目前在github上获得了1.8k的star,这是一个界面简洁，样式美观的，基于 NextJS + Cloudflare 技术栈构建的可爱临时邮箱服务。也就是你可以完全免费托管到 Cloudflare 上。然后再用免费的域名就能实现全免费的临时邮箱服务了。</p><blockquote><p>GitHub地址：<a href="https://github.com/beilunyang/moemail">https://github.com/beilunyang/moemail</a></p><p>官方文档：<a href="https://docs.moemail.app/">https://docs.moemail.app/</a></p><p>官方在线演示地址：<a href="https://moemail.app/">https://moemail.app/</a></p></blockquote><h2 id="项目预览"><a href="#项目预览" class="headerlink" title="项目预览"></a>项目预览</h2><blockquote><p>我自己搭建了一个<a href="https://mail.hudi.cc.cd/">https://mail.hudi.cc.cd/</a>   不想搭建的朋友可以直接使用我的，或者是官方的。由于 <strong>Cloudflare</strong>免费额度有限，我还是建议私有化搭建。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_00001.png" alt="image-20260112092203608"></p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000003.png" alt="image-20260112092625879"></p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_00002.png" alt="image-20260112092302058"></p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_00004.png" alt="image-20260112092351716"></p><h2 id="项目特点"><a href="#项目特点" class="headerlink" title="项目特点"></a>项目特点</h2><ul><li><strong>隐私保护</strong>：隐藏真实邮箱，防止垃圾邮件。</li><li><strong>高效便捷</strong>：实时收件通知、自动清理过期邮件，支持1小时至永久的灵活有效期。</li><li><strong>多端适配</strong>：响应式设计+PWA支持，兼容桌面&#x2F;移动设备；亮暗色主题切换。</li><li><strong>高级扩展</strong>：支持发送邮件（基于Resend）、Webhook通知、角色权限控制及OpenAPI访问。</li><li><strong>用户友好</strong>：免费自部署（Cloudflare）、中英双语界面、萌系UI设计。</li></ul><h3 id="技术栈总结"><a href="#技术栈总结" class="headerlink" title="技术栈总结"></a><strong>技术栈总结</strong></h3><p>Next.js (App Router) 框架，部署于 Cloudflare Pages。数据库使用 Cloudflare D1 ，<strong>认证采用 NextAuth 支持 GitHub 登录</strong>。样式基于 Tailwind CSS，UI 组件由 Radix UI 定制。<strong>邮件处理依赖 Cloudflare Email Workers</strong>，开发使用 TypeScript 确保类型安全，ORM 选用 Drizzle，国际化通过 next-intl 实现。全栈TypeScript、<strong>边缘部署、轻量高效、开发者友好</strong>。</p><h2 id="免费域名"><a href="#免费域名" class="headerlink" title="免费域名"></a>免费域名</h2><p>这里使用DNSHE的<strong>四个免费域名且可以托管 Cloudflare免费计划</strong>来做域名邮箱，目前DNSHE可使用的免费域名有，<code>de5.net</code>，<code>cc.cd</code>，<code>ccwu.cc</code>，<code>us.ci</code>，无需实名认证即可免费注册。注册步骤域名和托管Cloudflare步骤可以看一下这篇文章</p><p>占位符</p><h2 id="临时邮箱搭建"><a href="#临时邮箱搭建" class="headerlink" title="临时邮箱搭建"></a>临时邮箱搭建</h2><p>前置条件</p><blockquote><p>1、GitHub账号、 Cloudflare账号</p><p>2、域名自己的域名或者是免费的二级域名</p></blockquote><p>1、官方推荐使用工作流去部署，这也是用工作流。首先fork MoeMail项目的的源码到自己的GitHub。</p><p>2、在仓库的【Settings】-&gt;【Secrets and variables】-&gt;【Action】中去添加环境部署所需要的变量。点击【New repository secret】按钮可以添加了如下。</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_000008.png" alt="image-20260509215406091"></p><p>需要填写的变量如下.</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_00005.png" alt="image-20260112094459622"></p><p>环境变量如下，<em><strong>实际只用填写前五个环境变量就可以了</strong></em>。</p><table><thead><tr><th>变量名</th><th>变量值</th></tr></thead><tbody><tr><td><code>CLOUDFLARE_API_TOKEN</code></td><td>Cloudflare API 令牌</td></tr><tr><td><code>CLOUDFLARE_ACCOUNT_ID</code></td><td>Cloudflare 账户 ID</td></tr><tr><td><code>AUTH_GITHUB_ID</code></td><td>GitHub OAuth App ID</td></tr><tr><td><code>AUTH_GITHUB_SECRET</code></td><td>GitHub OAuth App Secret</td></tr><tr><td><code>AUTH_SECRET</code></td><td>NextAuth Secret，用来加密 session，请设置一个随机字符串</td></tr><tr><td><code>CUSTOM_DOMAIN</code></td><td>网站自定义域名，用于访问 MoeMail（可选）</td></tr><tr><td><code>PROJECT_NAME</code></td><td>Cloudflare Pages 项目名（可选，默认 moemail）</td></tr><tr><td><code>DATABASE_NAME</code></td><td>D1 数据库名称（可选，默认 moemail-db）</td></tr><tr><td><code>KV_NAMESPACE_NAME</code></td><td>Cloudflare KV namespace 名称，用于存储网站配置（可选，默认 moemail-kv）</td></tr></tbody></table><blockquote><p> 变量获取方式看步骤3-步骤7，知道怎么获取可以跳过</p></blockquote><p>3、<code>CLOUDFLARE_API_TOKEN</code>和<code>CLOUDFLARE_ACCOUNT_ID</code>获取方式是在CLOUDFLARE的控制面板点击【账户管理】-&gt;【账户API令牌】-&gt;【创建令牌】</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_00001.png" alt="image-20260509214035431"></p><p>4、在权限策略中，编辑策略，这里需要有cloudflare worker的权限和D1数据库的权限，建议勾选所有与worker相关的权限。点击Developer Platform中勾选如下两个图：</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_00002.png" alt="image-20260509214448748"></p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_00003.png" alt="image-20260509214530668"></p><p>然后点击【审核令牌】按钮。</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_00004.png" alt="image-20260509214702795"></p><p>这时系统会列出这个令牌所有的权限，继续点击【创建令牌】。</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_0000006.png" alt="image-20260509214849184"></p><p>5、就能看到<code>CLOUDFLARE_API_TOKEN</code>令牌的信息和<code>CLOUDFLARE_ACCOUNT_ID</code>的信息，把这两个都填入到GitHub的【Secrets and variables】中的变量中就行了。</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_00007.png" alt="image-20260509215000420"></p><p>6、<code>AUTH_GITHUB_ID</code>、<code>AUTH_GITHUB_SECRET</code>、<code>AUTH_SECRET</code> 这三个变量是用于接入GitHub授权登录的。点击GitHub右上交的头像按钮，点击【Settings】-&gt;在最下边选择【Developer setting】，在【OAuth apps】点击新建认证应用按钮，找不到的点下面链接🤣。</p><blockquote><p>地址如下：<a href="https://github.com/settings/applications/new">https://github.com/settings/applications/new</a></p></blockquote><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000010.png" alt="image-20260112102242143"></p><p>需要填写的信息有，Application name、Homepage URL、Authorization callback URL这三项。</p><table><thead><tr><th>填写项</th><th>值</th></tr></thead><tbody><tr><td><strong>Application name</strong></td><td>moemail(可以自定义)</td></tr><tr><td><strong>Homepage URL</strong></td><td>网站自定义域名，用于访问 MoeMail 例如我的<a href="https://mail.hudi.cc.cd/">https://mail.hudi.cc.cd</a></td></tr><tr><td><strong>Authorization callback URL</strong></td><td>同Homepage URL一样就行。</td></tr></tbody></table><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000011.png" alt="image-20260112102843739"></p><p>创建完成后，就可以得到<code>AUTH_GITHUB_ID</code>了、点击【generate a new client secret】按钮就可以生成一个<code>AUTH_GITHUB_SECRET</code>的值了如下，至于<code>AUTH_SECRET</code>用来加密 session，请设置一个随机字符串，就行。</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000012.png" alt="image-20260112103315072"></p><p>6、<code>DATABASE_NAME</code>在cloudflare的【存储和数据库】-&gt;【D1 SQL数据库】，点击右上角的【创建数据库实例】，</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000013.png" alt="image-20260112103646597"></p><p>数据库的实例名称填写 <strong>moemail 或者是自定义，但是要和GitHub仓库中的变量值对应对应。</strong></p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000014.png" alt="image-20260112103731874"></p><p>7、<code>KV_NAMESPACE_NAME</code> 也是在【存储和数据库】-&gt;【workers KV】中去添加同上一步骤一样，添加D1数据库，KV名称填写<strong>moemail 或者是自定义，但是要和GitHub仓库中的变量值对应</strong>。</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000015.png" alt="image-20260112104025109"></p><p>8、所有的步骤完成以后，在GitHub仓库中，找到【Actions】选项，找到部署按钮，然后跑一个部署的工作流，等待部署完毕。</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000016.png" alt="image-20260112104617004"></p><p>9、部署工作流✅完成以后，回到cloudflare界面的【计算和AI】-&gt;【workers and pages】出现两个worker 一个pages项目，就部署成功了cleanup-worker是清除过期邮箱的worker。email-receiver-worker是接受电子邮件的。moemail这个就是web服务了。</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000017.png" alt="image-20260112105235715"></p><p>10、绑定自己的域名，以我在DNSHE上申请的<strong>maiar.cc.cd</strong>域名的域名为例，点击cloudflare界面的【计算和AI】-&gt;【workers and pages】中moemail服务进去。点击自定义域名按钮进去，添加域名就行了。</p><blockquote><p>这里绑定的域名要和<strong>Homepage URL</strong>、<strong>Authorization callback URL</strong>  域名一致，不然无法使用GitHub授权登录。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000021.png" alt="image-20260112111358441"></p><p>绑定验证完成以后，就可以通过mail.maiar.cc.cd访问临时邮箱服务了。</p><h2 id="域名电子邮件配置"><a href="#域名电子邮件配置" class="headerlink" title="域名电子邮件配置"></a>域名电子邮件配置</h2><p>把需要配置的临时邮箱的域名，开启邮件的配置服务。例如<strong>maiar.cc.cd</strong>域名，配置邮件服务，其他的域名是相同的配置步骤。如下点击域名进去</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000018.png" alt="image-20260112105629055"></p><p>然后在左边的【电子邮件】-&gt;【电子邮件路由】,去启用电子路由和配置Catch-all 地址的地址如下。</p><blockquote><p>如果你出现的不是这界面,而是新手引导界面,直接点右下角的跳过就行了.</p></blockquote><p>在路由规则界面启用【Catch-all 】，点击【编辑按钮】进入配置界面</p><p><img src="https://bitiful.hudi.space/posts/2026/05/09/mail_0000091.png" alt="image-20260509221609279"></p><p>在操作中选择【发送到worker】目标为email-receiver-worker</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_000020.png" alt="image-20260112110234116"></p><p>把需要配置电子邮件服务的域名都完成上述操作。这点很重要，很重要，很重要不然收不到邮件</p><h2 id="临时邮箱配置"><a href="#临时邮箱配置" class="headerlink" title="临时邮箱配置"></a>临时邮箱配置</h2><p>通过绑定的自定义域名进入临时邮箱服务。首先注册一个账号登录系统或者是使用GitHub登录系统，完成以后调用下面接口，成为王章的所有者，就可以开启获得管理员权限了。</p><blockquote><p> 第一个访问 <code>/api/roles/init-emperor</code> 接口的用户将成为皇帝，即网站所有者。</p></blockquote><p>在网站中点击头像就可以对整个站点进行配置了。在网站配置中的【邮箱域名】填入配置好电子邮件服务的域名就行了，如下多个域名用<strong>逗号</strong>隔开就行了。</p><p><img src="https://bitiful.hudi.space/posts/2026/01/12/moemail_0000023.png" alt="image-20260112112504509"></p><p>当然你也可以在这里配置一些其他东西。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我觉得这个真的很不错，很喜欢这种小清新的界面，拿来自己和朋友使用，能保护自己的真实邮箱地址，远离垃圾邮件和不必要的订阅。还能在申请小号时有更多的选择。</p>]]></content>
    
    
    <summary type="html">介绍了如何使用免费域名搭建一个自己的临时邮箱服务，以保护真实的邮箱地址并远离垃圾邮件和不必要的订阅。作者分享了MoeMail项目，这是一个基于NextJS和Cloudflare技术栈构建的免费临时邮箱服务，具有隐私保护、高效便捷、多端适配、高级扩展和用户友好等特点。文章详细说明了搭建临时邮箱服务的步骤，包括准备条件、技术栈总结、免费域名选择、临时邮箱搭建流程以及域名电子邮件和临时邮箱的配置方法。总之，这个项目为用户提供了一个安全、便捷且功能丰富的临时邮箱解决方案。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="开源项目" scheme="https://www.hudi.space/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="临时邮件" scheme="https://www.hudi.space/tags/%E4%B8%B4%E6%97%B6%E9%82%AE%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>PakePlus打包程序的使用体验</title>
    <link href="https://www.hudi.space/posts/e28f7153/"/>
    <id>https://www.hudi.space/posts/e28f7153/</id>
    <published>2025-12-31T11:33:08.122Z</published>
    <updated>2025-12-31T11:38:00.767Z</updated>
    
    <content type="html"><![CDATA[<h2 id="PakePlus打包程序的使用体验"><a href="#PakePlus打包程序的使用体验" class="headerlink" title="PakePlus打包程序的使用体验"></a>PakePlus打包程序的使用体验</h2><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>明天元旦了，在这里提前祝大家新年快乐呀。 年底真的忙的不知道天地为何物了，两眼一睁就是干，每天都很忙，但是又不知道自己在忙什么。最近看到一个很火的开源项目PakePlus打包程序。</p><p>官方宣称——“轻松将任意网站&#x2F;HTML&#x2F;Vue&#x2F;React等项目构建为轻量级(小于5M)多端桌面应用和手机应用仅需几分钟”。</p><p>下载了一个试试。主要是想测试一下能否把静态资源非常多的项目，也一并打包到桌面应用中。之前有一个朋友问我，就是【Type Words】这个一个是不是有桌面版本，但是非常遗憾的是，他官方没有提供。于是我就想着能把他挂载到EdgeOne Pages、Vercel或者是CloudFlare上也是好的，但是测试了一下，由于静态资源太大了，导致多个平台部署都失败了，用Vercel部署成功了，但是页面点击跳转会报错。</p><blockquote><p>Type Words: 一个英语学习的开源项目。</p></blockquote><p>于是就想着PakePlus这个打包程序了，直接打包成桌面应用，也是非常不错的选择。</p><h2 id="项目介绍"><a href="#项目介绍" class="headerlink" title="项目介绍"></a>项目介绍</h2><p>PakePlus 是一个基于 Tauri2 和 Github 的打包工具，可以将任意网站&#x2F;html&#x2F;Vue&#x2F;React 等项目的 dist 静态文件打包为跨平台桌面软件和手机软件，体积小巧(小于 5M)并且性能还高，而且 PakePlus 本身也才仅仅 10M 左右。</p><blockquote><p>GitHub：<a href="https://github.com/Sjj1024/PakePlus">https://github.com/Sjj1024/PakePlus</a></p><p>官方地址：<a href="https://pakeplus.com/">https://pakeplus.com/</a></p><p>官方声明：PakePlus 仅作为打包工具使用，不支持软件签名，打包后的软件仅限自己使用，请勿传播或商业用途，否则后果自负。</p></blockquote><p>PakePlus是使用 Rust Tauri 构建，截图。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0001.png" alt="image-20251231175421303"></p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0002.png" alt="image-20251231175511907"></p><h2 id="使用体验"><a href="#使用体验" class="headerlink" title="使用体验"></a>使用体验</h2><blockquote><p>该项目支持云上打包和本地打包两种方式。</p><p>云上打包：这一步就是在云端将你的项目编译成跨平台的软件，所以这里只需要选择对应的打包方式和平台即可。</p><p>本地打包：本地发布模式支持在本地不联网的情况下打包发布，并且也不用安装任何环境，而且打包时间仅需 30 秒左右。</p></blockquote><h3 id="桌面版本体验"><a href="#桌面版本体验" class="headerlink" title="桌面版本体验"></a>桌面版本体验</h3><h4 id="1、静态文件打包"><a href="#1、静态文件打包" class="headerlink" title="1、静态文件打包"></a>1、静态文件打包</h4><p>这里我已经把【Type Words】产物构建好了，产物的总大小是1.04 GB (1,122,530,084 字节) 最多的是音频文件。这里我选择本地打包方式。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0003.png" alt="image-20251231184049592"></p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0004.png" alt="image-20251231184221464"></p><p>打包完成以后，文件夹的大小变成了1.08 GB (1,160,029,796 字节) 文件夹里面有一个exe程序和一个config文件夹，config文件夹的www目录存放的是原本的构建产物。exe程序是一个绿色的程序。无需安装点开就能使用了。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0006.png" alt="image-20251231184709352"></p><p>就是exe程序模拟了服务器的角色。让他能够直接点击就运行。我一直以为他会打包成一个安装包。然后资源文件全部都放到安装包里面呢。</p><h4 id="2、URL链接直接打包"><a href="#2、URL链接直接打包" class="headerlink" title="2、URL链接直接打包"></a>2、URL链接直接打包</h4><p>这个URL打包我感觉就是模拟了浏览器的角色哈哈哈哈。我打包了我的博客，这样子的。感觉好搞笑🤪。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/31/pake_0007.png" alt="image-20251231190743732"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我一直以为他是打包成一个安装包的，安装在自己的电脑上，不过这样子好像也还不错。但是有一个问题就是他是限制项目的个数的，项目最多3个，每小时发布1次。我也不知道是不是我还没太会使用这个打包软件。还有就是窗口模式会误以为是能打包成安卓或者是ios端的程序。但是我看好像是只支持桌面版本的。祝大家元旦快乐呀。</p>]]></content>
    
    
    <summary type="html">介绍了PakePlus打包程序的使用体验。作者分享了使用PakePlus将一个英语学习项目从静态资源打包成桌面应用的经过。PakePlus是一个基于Tauri2和Github的打包工具，可以创建小于5M的多端应用。作者提到，尽管官方未提供桌面版本，但通过PakePlus成功打包成桌面应用，并解决了之前使用Vercel部署时遇到的资源过大问题。文章还对比了云上打包和本地打包的方式，强调了PakePlus在本地打包时的快速效率和无需安装的优势。最后，作者对PakePlus的限制（如项目数量限制和窗口模式的误判）提出了疑问，希望未来能更深入地掌握该工具的使用。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="开源项目" scheme="https://www.hudi.space/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="打包" scheme="https://www.hudi.space/tags/%E6%89%93%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>给你的office上AI</title>
    <link href="https://www.hudi.space/posts/ae8cc2f9/"/>
    <id>https://www.hudi.space/posts/ae8cc2f9/</id>
    <published>2025-12-07T08:19:07.765Z</published>
    <updated>2025-12-09T07:31:16.673Z</updated>
    
    <content type="html"><![CDATA[<h1 id="给你的office上AI"><a href="#给你的office上AI" class="headerlink" title="给你的office上AI"></a>给你的office上AI</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>​最近上班挺忙的，也很少学习，一堆事。由于最近老是写文档，有些时候会用到AI的润色和续写的功能，就一边在在word里面写，一边又拷贝到豆包或者是KIMI里面去润色和续写。感觉有点麻烦，就想着能不能有个什么插件，直接能帮我完成这个活，我不用来回切换，结果还真让我找到了一款免费的产品可以实现这个功能。就是Office AI助手，下面就是这个插件的使用。</p><h2 id="产品特色"><a href="#产品特色" class="headerlink" title="产品特色"></a>产品特色</h2><p><em><strong>效率提升</strong></em>：通过强大的AI技术，助您轻松提升工作效率。再也不必为每周繁琐的周报制作而烦恼，也不必通宵加班策划文案。让AI成为您的得力助手，自动化任务，释放您的时间和创造力，让您专注于更重要的事情。</p><p><em><strong>化繁为简</strong></em>：不再需要百度搜索或记住各种复杂操作步骤！只需告诉AI您需要什么，它将瞬间为您解决问题。无论是插入特殊字符还是去除文本格式，一切都变得轻而易举，节省您的时间和精力</p><p><em><strong>极速创作</strong></em>：借助AI技术与现成模板的强大结合，让内容创作更加省时省力，效率倍增。</p><h2 id="产品预览"><a href="#产品预览" class="headerlink" title="产品预览"></a>产品预览</h2><p>官方地址：<a href="https://www.office-ai.cn/">https://www.office-ai.cn/</a></p><p>Word中AI助手的主要功能有：AI对话、AI校对、AI润色、AI排版、AI续写、AI写作、AI翻译、总结、知识库、AI画图等等。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0001.png" alt="image-20251207145651832"></p><p>Excel中AI助手的主要功能有：AI对话、Excel AI公式通、数据分析、单元格格式等等</p><p><img src="https://downloadcdn.office-ai.cn/bin/office-ai-main-images/officeai/feature2.webp"></p><h2 id="免费AI大模型引擎"><a href="#免费AI大模型引擎" class="headerlink" title="免费AI大模型引擎"></a>免费AI大模型引擎</h2><p>目前 OfficeAI 自带以下大模型引擎，这些大模型引擎均面向个人用户免费使用：</p><table><thead><tr><th>模型名</th><th>公司</th><th></th><th>隐私协议地址</th></tr></thead><tbody><tr><td>豆包 1.5 Pro</td><td>字节跳动</td><td>默认</td><td><a href="https://team.doubao.com/zh/privacy-policy">豆包隐私政策</a></td></tr><tr><td>Deepseek V3</td><td>深度求索</td><td>可选</td><td>由豆包提供</td></tr><tr><td>文心一言</td><td>百度</td><td>可选</td><td><a href="https://yiyan.baidu.com/ER7FX3ATERRQT6">文言一心隐私政策</a></td></tr><tr><td>通义千问</td><td>阿里</td><td>可选</td><td><a href="https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-privacy-policy">通义千问隐私政策</a></td></tr></tbody></table><h2 id="自定义AI大模型"><a href="#自定义AI大模型" class="headerlink" title="自定义AI大模型"></a>自定义AI大模型</h2><p>如果你是不想使用office AI自带的免费大模型，当然你可以自己定义模型厂商。以window office为例，接入腾讯的混元AI lite版本。</p><p>1、首先进去腾云的混元大模型控制面板如下</p><p>地址：<a href="https://console.cloud.tencent.com/hunyuan/start">https://console.cloud.tencent.com/hunyuan/start</a></p><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0002.png" alt="image-20251207151610501"></p><p>2、点击创建API KEY 如下</p><blockquote><p>注意token安全，防止泄露</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0003.png" alt="image-20251207153156410"></p><p>3、回到office界面，点击office AI栏目，在点击【设置】-&gt;【大模型】-&gt;【ApiKey】。服务厂商选择【自定义Open AI服务协议】，然后填入API地址如下，然后填写申请的APIKEY。然后选择模型【huanyuan-lite】。点击保存就行了。</p><blockquote><p>混元AI地址：<a href="https://api.hunyuan.cloud.tencent.com/">https://api.hunyuan.cloud.tencent.com</a></p><p>注意模型选择一定要是huanyuan-lite，只有这个是免费的。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0005.png" alt="image-20251207153825959"></p><p>4、完成上面的设置，我们可以在office AI助手对话栏看到模型已经更改成了huanyuan-lite了。如下：</p><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0006.png" alt="image-20251207154451669"></p><h2 id="其他的免费大模型"><a href="#其他的免费大模型" class="headerlink" title="其他的免费大模型"></a>其他的免费大模型</h2><p>下面再列举一些免费的大模型。</p><p><img src="https://bitiful.hudi.space/posts/2025/12/07/office_0008.png" alt="image-20251207160940874"></p><p>这里是直接截图Liushen的这篇<a href="https://blog.liushen.fun/posts/40702a0d/">https://blog.liushen.fun/posts/40702a0d/</a> 文章里面的表格，有兴趣的可以看看。</p><p>当然你还可以使用其他厂商大模型，很多都有赠送额度的，例如华为云、七牛云等等。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>总之，使用下来，我感觉还是很不错的，尤其是word里面，要润色或者续写什么，不用单独的复制到其他的AI里面了，直接鼠标选中就能完成这些功能。嘿嘿。有兴趣的朋友👭可以试试。</p>]]></content>
    
    
    <summary type="html">本文介绍了一款名为Office AI助手的免费插件，可帮助用户在Word和Excel中直接使用AI功能，避免频繁切换应用。该插件支持AI对话、润色、续写、翻译、排版等功能，并内置多个免费大模型（如豆包、Deepseek、文心一言等）。用户也可自定义接入其他AI服务（如腾讯混元大模型）。文章详细提供了插件安装、模型切换及免费API配置的步骤，并推荐了其他可用的大模型资源。作者认为该工具显著提升了文档处理效率，尤其适合需要频繁使用AI辅助办公的用户。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="AI" scheme="https://www.hudi.space/tags/AI/"/>
    
    <category term="office" scheme="https://www.hudi.space/tags/office/"/>
    
  </entry>
  
  <entry>
    <title>Vercel &amp; Cloudflare 项目分享</title>
    <link href="https://www.hudi.space/posts/f8fd81f6/"/>
    <id>https://www.hudi.space/posts/f8fd81f6/</id>
    <published>2025-11-18T10:15:53.346Z</published>
    <updated>2025-11-20T02:58:37.478Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Vercel-Cloudflare-项目分享"><a href="#Vercel-Cloudflare-项目分享" class="headerlink" title="Vercel &amp; Cloudflare 项目分享"></a>Vercel &amp; Cloudflare 项目分享</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>​最近好久没有写笔记了，一来是因为工作比较忙，二来是也没有想好具体要写什么。再加上我个人比较焦虑，也是摆烂了一两个月了，也没有好好学习，周末就在家里躺着。有些迷茫，学习也是漫无目的的，东一榔头西一棒槌的。后面会好好调整一下心态。</p><h2 id="NeuraPress编辑器"><a href="#NeuraPress编辑器" class="headerlink" title="NeuraPress编辑器"></a>NeuraPress编辑器</h2><h3 id="1、项目介绍"><a href="#1、项目介绍" class="headerlink" title="1、项目介绍"></a>1、项目介绍</h3><p>​NeuraPress 是一个现代化的 Markdown 编辑器，专注于提供优质的微信公众号排版体验。响应式设计，支持移动设备。搭配 DeepSeek和微信公众号助手使用，碎片时间也能用手机发有排版的文章了。还支持小红书排版，微信文章转化成markdown格式。样式定制、实时预览、一键复制等等。</p><p>官方地址：<a href="https://md.leti.ltd/">https://md.leti.ltd/</a></p><p>GitHub地址：<a href="https://github.com/suxichuan/neurapress">https://github.com/suxichuan/neurapress</a></p><h3 id="2、项目预览"><a href="#2、项目预览" class="headerlink" title="2、项目预览"></a>2、项目预览</h3><p>预览地址：<a href="https://mark.hudifd.qzz.io/wechat">https://mark.hudifd.qzz.io/wechat</a></p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_01.webp" alt="image-20251118135021265"></p><blockquote><p>由于我不使用小红书所以界面就不展示，有需要的可以看看这<a href="https://mark.hudi.cloud-ip.cc/xiaohongshu">https://mark.hudi.cloud-ip.cc/xiaohongshu</a> 。</p><p>该项目还支持直接把微信公众号的文章转化成markdown，有需要的可以看看这<a href="https://mp2md.leti.ltd/">https://mp2md.leti.ltd/</a> 。</p><p>注意：网络链接🔗有风险，请注意甄别。保护个人信息和财产安全。</p></blockquote><h2 id="3、项目部署"><a href="#3、项目部署" class="headerlink" title="3、项目部署"></a>3、项目部署</h2><h4 id="EdgeOne-Pages部署"><a href="#EdgeOne-Pages部署" class="headerlink" title="EdgeOne Pages部署"></a>EdgeOne Pages部署</h4><p>该项目支持直接部署到腾讯云的EdgeOne Pages上，也可以部署到vercel上。这里讲解EdgeOne Pages部署，vercel是一样的操作方式。</p><blockquote><p> 首选先fork代码到自己GitHub上</p></blockquote><p>1、在EdgeOne Pages上创建项目，选择从GitHub导入</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_cloudflare_02.webp" alt="image-20251118162453201"></p><p>2、选择本项目</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_03.webp" alt="image-20251118162600546"></p><p>3、自定义项目名称，构建设置和环境变量默认即可，点击部署。等待部署完成就行了。</p><blockquote><p>加速地区，若是大陆有域名备案的，选择【全球可用区】（含中国大陆），没有备案的选择不含中国大陆的。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_04.webp" alt="image-20251118162656970"></p><p>4、自定义域名绑定</p><p>在项目部署完成✅页面点击左边的【项目设置】-&gt;域名管理中点击【添加自定义域名按钮】，添加自己的域名就行了。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_cloudflare_05.webp" alt="image-20251118163521469"></p><h4 id="其他方式部署"><a href="#其他方式部署" class="headerlink" title="其他方式部署"></a>其他方式部署</h4><p> 当然你有nas或者是服务器的内存有多余的可以直接使用dokcer部署。</p><h2 id="文本转语音"><a href="#文本转语音" class="headerlink" title="文本转语音"></a>文本转语音</h2><h3 id="1、项目介绍-1"><a href="#1、项目介绍-1" class="headerlink" title="1、项目介绍"></a>1、项目介绍</h3><p>edgetts-cloudflare-workers-webui 这是一个部署在 Cloudflare Workers 上的高性能文本转语音（TTS）代理服务。它巧妙地将微软 Edge 强大且自然的语音合成服务，封装成了一个兼容 OpenAI API 格式的接口。这使得开发者可以无缝地将各种现有应用对接到这个免费、高质量的 TTS 服务上。</p><p>GitHub地址：<a href="https://github.com/icheer/edgetts-cloudflare-workers-webui">https://github.com/icheer/edgetts-cloudflare-workers-webui</a></p><h3 id="2、项目部署"><a href="#2、项目部署" class="headerlink" title="2、项目部署"></a>2、项目部署</h3><p>预览地址：<a href="https://tts.hudifd.qzz.io/">https://tts.hudifd.qzz.io</a></p><blockquote><p>由于我没有域名托管到cloudflare上，所以只能使用免费域名了。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_06.webp" alt="image-20251118164709122"></p><p>首先需要有cloudflare账号，免费注册一下。</p><p>1、在Workers and Pages创建应用程序如下。选择从【从 Hello World! 开始】就行了，然后点击开始。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_08.webp" alt="image-20251118165348357"></p><p>2、定义一下项目名称，然后直接点击部署。等待部署完成✅就行了。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_09.webp" alt="image-20251118165535666"></p><p>3、然后在项目界面，点击【编辑代码】将helloworld的代码替换成edgetts-cloudflare-workers-webui 项目中的worker.js中的代码。</p><p>workers.js代码：<a href="https://github.com/icheer/edgetts-cloudflare-workers-webui/blob/master/workers.js">https://github.com/icheer/edgetts-cloudflare-workers-webui/blob/master/workers.js</a> 。替换完成后，点击重新部署如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_10.webp" alt="image-20251118165941820"></p><p>4、设置环境变量，在项目左上角点击【设置】按钮，在【变量和机密】添加API_KEY的信息，点击保存会自动重新部署项目，等待完成重新部署以后，就可以使用了。如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_011.webp" alt="image-20251118170235624"></p><blockquote><p>api_key的值自定义就行了</p></blockquote><p>5、在界面的API配置中有两个配置选项分别是API Base URL和API Key，API Key就是上一步设置的，API Base URL可以是cloudflare分配的域名，也可以是自定义域名。</p><p><img src="https://bitiful.hudi.space/posts/2025/11/18/vercel_couldflare_012.webp" alt="image-20251118170446488"></p><blockquote><p>自定义域名也是在设置中添加，前提是你有域名托管到cloudflare上了。</p></blockquote><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>​反正是可以免费托管到vercel或者是cloudflare上的，可以拿来玩玩。这个TTS文本转语音的项目，我还是觉得比较ok的，因为有时候我会帮朋友录课程，或者是发布短视频，不想自己配音，那就直接文本转语音吧，然后微信公众号排版的这个项目，我其实是不怎么写公众号的。我朋友要写，所以就搭建一个了。</p>]]></content>
    
    
    <summary type="html">文章主要介绍了Vercel和Cloudflare项目的分享，包括NeuraPress编辑器、文本转语音项目以及它们的部署方法。NeuraPress是一个现代化的Markdown编辑器，专注于微信公众号排版，支持响应式设计和多种格式转换。文本转语音项目则是一个高性能的TTS代理服务，部署在Cloudflare Workers上，可以无缝对接现有应用。文章还提供了项目部署的具体步骤和注意事项，并对这两个项目进行了简要总结，认为它们具有一定的实用价值。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="cloudflare" scheme="https://www.hudi.space/tags/cloudflare/"/>
    
    <category term="文字转语音" scheme="https://www.hudi.space/tags/%E6%96%87%E5%AD%97%E8%BD%AC%E8%AF%AD%E9%9F%B3/"/>
    
    <category term="排版" scheme="https://www.hudi.space/tags/%E6%8E%92%E7%89%88/"/>
    
  </entry>
  
  <entry>
    <title>Linux日志查找</title>
    <link href="https://www.hudi.space/posts/b192bb3/"/>
    <id>https://www.hudi.space/posts/b192bb3/</id>
    <published>2025-11-04T10:40:52.659Z</published>
    <updated>2025-11-10T01:16:15.522Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Linux日志查找"><a href="#Linux日志查找" class="headerlink" title="Linux日志查找"></a>Linux日志查找</h1><p>​在Linux系统中，日志文件是记录系统运行状态、错误信息和各种事件的关键资源。正确地查找和分析日志对于系统维护和故障排除至关重要。下面是一些常用的方法和技术来查找。</p><p>Linux查看日志的命令有多种:grep、tail、head，cat、tac、less等，本文只介绍几种常用的方法。</p><h2 id="一、grep命令"><a href="#一、grep命令" class="headerlink" title="一、grep命令"></a>一、grep命令</h2><p>​在Linux系统中，grep是一个非常强大的文本搜索工具，它用于搜索文件内容中匹配特定模式的行。如果你想使用grep来查找日志文件中的内容，你可以按照以下几种常见方法进行操作</p><h3 id="1、搜索包含特定文本的行"><a href="#1、搜索包含特定文本的行" class="headerlink" title="1、搜索包含特定文本的行"></a>1、搜索包含特定文本的行</h3><p>假设你想要搜索所有包含”error”的行，可以使用：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep &quot;error&quot; filename.log</span><br></pre></td></tr></table></figure><p>其中<code>filename.log</code>是你要搜索的日志文件名。</p><h3 id="2、搜索不区分大小写的文本"><a href="#2、搜索不区分大小写的文本" class="headerlink" title="2、搜索不区分大小写的文本"></a>2、搜索不区分大小写的文本</h3><p>使用<code>-i</code>选项可以让搜索不区分大小写：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -i &quot;error&quot; filename.log</span><br></pre></td></tr></table></figure><h3 id="3、计算匹配行的数量"><a href="#3、计算匹配行的数量" class="headerlink" title="3、计算匹配行的数量"></a>3、计算匹配行的数量</h3><p>使用<code>-c</code>选项可以计算匹配行的数量：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -c &quot;error&quot; filename.log</span><br></pre></td></tr></table></figure><h3 id="4、显示匹配行及其行号"><a href="#4、显示匹配行及其行号" class="headerlink" title="4、显示匹配行及其行号"></a>4、显示匹配行及其行号</h3><p>使用<code>-n</code>选项可以显示匹配行的行号：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -n &quot;error&quot; filename.log</span><br></pre></td></tr></table></figure><h3 id="5、在多个文件中搜索"><a href="#5、在多个文件中搜索" class="headerlink" title="5、在多个文件中搜索"></a>5、在多个文件中搜索</h3><p>你可以在多个文件中搜索相同的模式，只需将文件名作为参数列出：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep &quot;error&quot; file1.log file2.log file3.log</span><br></pre></td></tr></table></figure><h3 id="6、递归地在目录中搜索"><a href="#6、递归地在目录中搜索" class="headerlink" title="6、递归地在目录中搜索"></a>6、递归地在目录中搜索</h3><p>使用<code>-r</code>或<code>-R</code>选项可以在一个目录及其子目录中递归地搜索文件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -r &quot;error&quot; /path/to/logs/</span><br></pre></td></tr></table></figure><h3 id="7、使用正则表达式"><a href="#7、使用正则表达式" class="headerlink" title="7、使用正则表达式"></a>7、使用正则表达式</h3><p><code>grep</code>支持正则表达式，可以用来执行更复杂的搜索：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">grep &quot;^ERROR&quot; filename.log  # 匹配以ERROR开头的行</span><br><span class="line">grep &quot;ERROR [0-9]\&#123;4\&#125;&quot; filename.log  # 匹配ERROR后跟四位数字的行</span><br></pre></td></tr></table></figure><h3 id="8、结合其他命令使用"><a href="#8、结合其他命令使用" class="headerlink" title="8、结合其他命令使用"></a>8、结合其他命令使用</h3><p>你可以将<code>grep</code>与其他命令（如<code>awk</code>, <code>sed</code>, <code>cut</code>等）结合使用，以处理和转换搜索结果。例如，使用<code>awk</code>打印匹配行的详细信息：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep &quot;error&quot; filename.log | awk &#x27;&#123;print $0, NR&#125;&#x27;  # 打印行内容和行号</span><br></pre></td></tr></table></figure><h3 id="9、使用egrep或grep-E进行扩展正则表达式搜索"><a href="#9、使用egrep或grep-E进行扩展正则表达式搜索" class="headerlink" title="9、使用egrep或grep -E进行扩展正则表达式搜索"></a>9、使用<code>egrep</code>或<code>grep -E</code>进行扩展正则表达式搜索</h3><p>如果你需要使用扩展正则表达式（如<code>|</code>表示“或”），可以使用<code>egrep</code>或<code>grep -E</code>：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -E &quot;error|warning&quot; filename.log  # 搜索包含error或warning的行</span><br></pre></td></tr></table></figure><h3 id="10、忽略大小写并计算匹配次数"><a href="#10、忽略大小写并计算匹配次数" class="headerlink" title="10、忽略大小写并计算匹配次数"></a>10、忽略大小写并计算匹配次数</h3><p>结合使用<code>-i</code>和<code>-c</code>选项：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -ic &quot;error&quot; filename.log  # 不区分大小写，并计算匹配次数</span><br></pre></td></tr></table></figure><p>​通过这些基本和高级技巧，你可以高效地使用<code>grep</code>命令来搜索和分析日志文件中的信息。也可以在查询结果的基础上继续使用管道或者是重定向等命令对结果进行进一步筛选。</p><h2 id="二、tail命令"><a href="#二、tail命令" class="headerlink" title="二、tail命令"></a>二、tail命令</h2><p>在Linux操作系统中，<code>tail</code>命令用于输出文件的最后部分内容。它非常有用，比如在查看日志文件时，只需要关注最新的日志条目。</p><blockquote><p>tail默认显示最后10行的数据，如果指定了多个文件，则会在显示的每个文件内容前面加上文件名来加以区分。</p></blockquote><h3 id="1、显示文件末尾内容"><a href="#1、显示文件末尾内容" class="headerlink" title="1、显示文件末尾内容"></a>1、显示文件末尾内容</h3><p><code>-n</code> 或 <code>--lines=[+]K</code>：显示文件的最后 K 行内容。如果 K 前面加上 <code>+</code>，则从第 K 行开始显示。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">tail -n 5 filename  # 显示文件的最后 5 行</span><br><span class="line">tail -n +5 filename # 从第 5 行开始显示</span><br></pre></td></tr></table></figure><p><code>-c</code> 或 <code>--bytes=[+]K</code>：显示文件的最后 K 个字节。如果 K 前面加上 <code>+</code>，则从第 K 个字节开始显示。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">tail -c 100 filename  # 显示文件的最后 100 个字节</span><br><span class="line">tail -c +100 filename # 从第 100 个字节开始显示</span><br></pre></td></tr></table></figure><h3 id="2、实时显示文件末尾内容"><a href="#2、实时显示文件末尾内容" class="headerlink" title="2、实时显示文件末尾内容"></a>2、实时显示文件末尾内容</h3><p><code>-f</code>实时显示文件的新添加内容，常用于监控日志文件。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -f filename</span><br></pre></td></tr></table></figure><p><code>-F</code>类似于<code>-f</code>文件被重命名或删除后会继续跟踪新的文件。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -F filename</span><br></pre></td></tr></table></figure><h3 id="3、不显示文件名"><a href="#3、不显示文件名" class="headerlink" title="3、不显示文件名"></a>3、不显示文件名</h3><p><code>-q</code> 或 <code>--quiet</code> 或 <code>--silent</code>不显示文件名（当处理多个文件时）。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -q filename1 filename2</span><br></pre></td></tr></table></figure><h3 id="4、始终显示文件名"><a href="#4、始终显示文件名" class="headerlink" title="4、始终显示文件名"></a>4、始终显示文件名</h3><p><code>-v</code> 或 <code>--verbose</code>：始终显示文件名（即使只处理一个文件）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -v filename</span><br></pre></td></tr></table></figure><h3 id="5、结合进程监控"><a href="#5、结合进程监控" class="headerlink" title="5、结合进程监控"></a>5、结合进程监控</h3><p>与<code>-f</code>选项连用，当指定的进程号的进程终止后，自动退出tail命令</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -f --pid=PID filename</span><br></pre></td></tr></table></figure><h3 id="5、按时间间隔刷新"><a href="#5、按时间间隔刷新" class="headerlink" title="5、按时间间隔刷新"></a>5、按时间间隔刷新</h3><p><code>-s</code> 或 <code>--sleep-interval=S</code> 与 <code>-f</code> 选项一起使用，指定每次检查文件变化的间隔时间（秒）。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -f filename -s 5  #如每5秒刷新一次</span><br></pre></td></tr></table></figure><blockquote><p>文件大小：对于非常大的文件，使用 tail 命令通常不会导致性能问题，因为它只读取文件的末尾部分。<br>权限问题：如果文件没有读取权限，tail 命令会报错。确保你有适当的权限来读取文件。<br>输出重定向：使用 &gt; 重定向输出时，会覆盖目标文件的内容。使用 &gt;&gt; 追加内容时，会在目标文件末尾添加内容。<br>实时监控：使用 -f 或 -F 选项时，可以通过按 Ctrl+C 终止实时监控。</p><p>原文链接：<a href="https://blog.csdn.net/weixin_56303229/article/details/143818005">https://blog.csdn.net/weixin_56303229/article/details/143818005</a></p></blockquote><h2 id="三、head命令"><a href="#三、head命令" class="headerlink" title="三、head命令"></a>三、head命令</h2><p>he‌ad命令是LInux系统中用于显示文件开头部分内容的命令。</p><blockquote><p>默认情况下，head命令会显示文件的前10行内容。如果文件内容不足10行，则会显示全部内容。‌</p></blockquote><h3 id="1、显示文件前面的内容"><a href="#1、显示文件前面的内容" class="headerlink" title="1、显示文件前面的内容"></a>1、显示文件前面的内容</h3><p><code>-n</code> 或 <code>--lines=[-]K</code>：指定显示文件的行数。如果K是负数，则从文件的开头跳过K行后开始显示。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">head -n 5 filename #会显示文件的前5行</span><br><span class="line">head -n -5 filename #会显示除了最后5行之外的所有内容</span><br></pre></td></tr></table></figure><p><code>-c</code> 或 <code>--bytes=[-]K</code>：指定显示文件的字节数。如果K是负数，则从文件的开头跳过K个字节后开始显示。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">head -c 100 filename #会显示文件的前100个字节</span><br><span class="line">head -c -100 filename #会显示除了前100个字节之外的所有内容</span><br></pre></td></tr></table></figure><h3 id="2、多文件不显示文件名"><a href="#2、多文件不显示文件名" class="headerlink" title="2、多文件不显示文件名"></a>2、多文件不显示文件名</h3><p><code>-q</code> 或 <code>--quiet</code>：不显示文件名。这在处理多个文件时很有用，可以避免输出中包含文件名信息。‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">head -q file1 file2 file3</span><br></pre></td></tr></table></figure><h3 id="3、始终显示文件名"><a href="#3、始终显示文件名" class="headerlink" title="3、始终显示文件名"></a>3、始终显示文件名</h3><p><code>-v</code> 或 <code>--verbose</code>：始终显示文件名，即使只处理一个文件也会显示。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">head -v filename</span><br></pre></td></tr></table></figure><blockquote><p>注意事项<br>文件大小：对于非常大的文件，使用 head 命令通常不会导致性能问题，因为它只读取文件的开头部分。<br>权限问题：如果文件没有读取权限，head 命令会报错。确保你有适当的权限来读取文件。<br>输出重定向：使用 &gt; 重定向输出时，会覆盖目标文件的内容。使用 &gt;&gt; 追加内容时，会在目标文件末尾添加内容。</p><p>原文链接：<a href="https://blog.csdn.net/weixin_56303229/article/details/143817695">https://blog.csdn.net/weixin_56303229/article/details/143817695</a></p></blockquote><h2 id="四、cat命令"><a href="#四、cat命令" class="headerlink" title="四、cat命令"></a>四、cat命令</h2><p>​<code>cat</code>命令是Linux系统中一个非常常用的命令，全称为“concatenate”，主要用于查看、连接和创建文件。以下是<code>cat</code>命令的主要功能和使用方法。</p><h3 id="1、‌查看文件内容"><a href="#1、‌查看文件内容" class="headerlink" title="1、‌查看文件内容"></a>1、‌查看文件内容</h3><p>基本用法</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat filename #可以显示指定文件的内容到终端上</span><br></pre></td></tr></table></figure><p>显示行号：使用 <code>-n</code> 选项可以在输出的每一行前加上行号，包括空行；而 <code>-b</code> 选项则只对非空行进行编号</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cat -n filename</span><br><span class="line">cat -b filename</span><br></pre></td></tr></table></figure><p>‌显示特殊字符：<code>-E</code> 选项在每行末尾显示 <code>$</code> 符号，<code>-T</code> 选项将制表符显示为 <code>^I</code>，<code>-v</code> 选项显示非打印字符</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cat -E filename</span><br><span class="line">cat -T filename</span><br></pre></td></tr></table></figure><h3 id="3、连接文件"><a href="#3、连接文件" class="headerlink" title="3、连接文件"></a>3、连接文件</h3><p>‌合并文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat file1 file2 &gt; combined_file  #可以将 file1 和 file2 的内容合并到 combined_file 中</span><br></pre></td></tr></table></figure><p>显示多个文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat file1 file2</span><br></pre></td></tr></table></figure><p>创建文件:可以从标准输入创建文件，输入完成后按 <code>Ctrl+D</code> 保存并退出。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat &gt; test.txt</span><br></pre></td></tr></table></figure><p>‌追加内容‌：可以将标准输入的内容追加到文件的末尾。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat &gt;&gt; filename</span><br></pre></td></tr></table></figure><h3 id="‌4、与管道结合使用"><a href="#‌4、与管道结合使用" class="headerlink" title="‌4、与管道结合使用"></a>‌4、与管道结合使用</h3><p>与其他命令结合‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -l | cat</span><br></pre></td></tr></table></figure><p>‌查看文件最后几行‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat filename | tail -n 10 #可以显示文件的最后10行。</span><br></pre></td></tr></table></figure><h2 id="五、tac命令"><a href="#五、tac命令" class="headerlink" title="五、tac命令"></a>五、tac命令</h2><p>​tac 将文件内容‌从最后一行开始逐行反向输出，可视为 <code>cat</code> 命令的逆序版本‌。支持通过自定义分隔符（如正则表达式）分割内容，灵活处理非换行符分隔的文本‌。</p><h3 id="1、反向显示文件内容"><a href="#1、反向显示文件内容" class="headerlink" title="1、反向显示文件内容"></a>1、反向显示文件内容</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tac /etc/passwd </span><br></pre></td></tr></table></figure><h3 id="2、指定分隔符处理文本"><a href="#2、指定分隔符处理文本" class="headerlink" title="2、指定分隔符处理文本"></a>2、指定分隔符处理文本</h3><p><code>-s</code>或者<code>--separator</code> :指定自定义分隔符（默认换行符 <code>\n</code>）‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tac -s &#x27;#&#x27; data.txt  以 `#` 为分隔符反向输出内容</span><br></pre></td></tr></table></figure><h3 id="3、正则表达式分隔内容"><a href="#3、正则表达式分隔内容" class="headerlink" title="3、正则表达式分隔内容"></a>3、正则表达式分隔内容</h3><p><code>-r</code> 或者 <code>--regex</code>:启用正则表达式匹配分隔符（需与 <code>-s</code> 配合使用）‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tac -sr &#x27;^[0-9]+&#x27; log.txt   #以数字开头的行作为分隔符反向输出‌</span><br></pre></td></tr></table></figure><h2 id="六、less命令"><a href="#六、less命令" class="headerlink" title="六、less命令"></a>六、less命令</h2><h3 id="1、基本用法"><a href="#1、基本用法" class="headerlink" title="1、基本用法"></a>1、基本用法</h3><p>它支持上下滚动浏览，按页显示文本，比<code>more</code>命令更灵活强大</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less filename.txt</span><br></pre></td></tr></table></figure><h3 id="2、常用操作"><a href="#2、常用操作" class="headerlink" title="2、常用操作"></a>2、常用操作</h3><p><strong>移动光标</strong>‌：使用方向键<code>↑</code>、<code>↓</code>可上下移动一行；<code>Page Up</code>和<code>Page Down</code>键可上下翻页。‌</p><p><strong>搜索文本</strong>‌：输入<code>/</code>后接搜索词，按<code>Enter</code>键可向下搜索；输入<code>?</code>后接搜索词，按<code>Enter</code>键可向上搜索。按<code>n</code>键查找下一个匹配项，按<code>N</code>键查找上一个匹配项。‌</p><p><strong>退出命令</strong>‌：按<code>q</code>键可退出less命令。</p><h3 id="3、常用选项"><a href="#3、常用选项" class="headerlink" title="3、常用选项"></a>3、常用选项</h3><p><code>-N</code>：显示行号，方便查看和定位文本内容。‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less -N filename.txt</span><br></pre></td></tr></table></figure><p><code>-S</code>：当文本行过长时，将超出屏幕宽度的部分截断显示，避免文本换行影响查看。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less -S filename.txt</span><br></pre></td></tr></table></figure><p><code>-m</code>：显示文件的百分比位置，以及当前显示的行范围，便于了解查看进度。‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less -m filename.txt</span><br></pre></td></tr></table></figure><h3 id="4、高级功能"><a href="#4、高级功能" class="headerlink" title="4、高级功能"></a>4、高级功能</h3><p><strong>标记和跳转</strong>‌：使用<code>m</code>后接一个字母设置标记，使用<code>&#39;</code>后接字母跳转到标记位置。‌</p><p><strong>查看多个文件</strong>‌：可以同时打开多个文件，使用<code>:n</code>切换到下一个文件，<code>:p</code>切换到上一个文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less -Nm filename1.txt filename2.txt</span><br></pre></td></tr></table></figure><p><strong>持续监测文件</strong>：使用<code>F</code>选项，类似于<code>tail -f</code>，持续监测并显示文件末尾的新内容。‌</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less -F filename.txt</span><br></pre></td></tr></table></figure><h3 id="5、适用场景"><a href="#5、适用场景" class="headerlink" title="5、适用场景"></a>5、适用场景</h3><p>查看大型日志文件：快速定位错误信息或特定事件记录。</p><p>‌阅读长篇文档：如程序代码、配置文件等，方便浏览和搜索。</p>]]></content>
    
    
    <summary type="html">介绍了Linux系统中日志查找的各种命令和方法。首先，文章详细阐述了grep命令的多种用法，包括搜索特定文本、不区分大小写、计算匹配行数、显示匹配行及其行号、在多个文件中搜索、递归搜索目录以及使用正则表达式等。接着，文章解释了tail命令的功能，如显示文件末尾内容、实时监控文件变化、不显示文件名等，并提供了相关选项和示例。然后，文章描述了head命令的作用，包括显示文件开头内容、多文件不显示文件名、始终显示文件名等，并提醒了权限问题和输出重定向的注意事项。最后，文章简要介绍了cat、tac和less命令的基本用法和常用操作，以及它们的选项和高级功能</summary>
    
    
    
    <category term="工具" scheme="https://www.hudi.space/categories/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="Linux" scheme="https://www.hudi.space/tags/Linux/"/>
    
    <category term="日志" scheme="https://www.hudi.space/tags/%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>IPV6.ARPA域名申请并托管到Cloudflare</title>
    <link href="https://www.hudi.space/posts/2706f9f7/"/>
    <id>https://www.hudi.space/posts/2706f9f7/</id>
    <published>2025-10-25T12:49:20.938Z</published>
    <updated>2025-10-25T12:53:04.947Z</updated>
    
    <content type="html"><![CDATA[<h1 id="IPV6-ARPA域名申请并托管到Cloudflare"><a href="#IPV6-ARPA域名申请并托管到Cloudflare" class="headerlink" title="IPV6.ARPA域名申请并托管到Cloudflare"></a>IPV6.ARPA域名申请并托管到Cloudflare</h1><p>​在这之前其实我申请过不少免费的二级域名，比如在<a href="https://www.cloudns.net/">cloudns</a> 、<a href="https://zoneabc.net/">zoneabc</a>、<a href="https://desec.io/">desec</a> 等都申请到了免费的域名。但是这些网站申请的域名没办法托管到cloudflare上，也申请过eu.org的域名，申请提交了了一个月就没有回应了。这段时间看到LiuShen申请了一个ip6.arpa的域名。其实我不是非要也申请一个的，但是有的话，可以拿来玩玩，主要是准备抄作业的。在这以前我看一个很不错的子域名作为开发使用很不错 <a href="https://docs.is-a.dev/">is-a.dev</a> 。但是倒腾了半天，又是fork仓库，又是添加配置的弄的我有点烦🤣，就想着先放放，后面看到有一个ip6.arpa域名可以申请，于是就申请了一个，喜欢的朋友可以注册一个玩玩。</p><h2 id="IPV6-ARPA域名注册"><a href="#IPV6-ARPA域名注册" class="headerlink" title="IPV6.ARPA域名注册"></a>IPV6.ARPA域名注册</h2><h3 id="域名注册"><a href="#域名注册" class="headerlink" title="域名注册"></a>域名注册</h3><p>申请页面：<a href="https://tb.netassist.ua/reg.php">https://tb.netassist.ua/reg.php</a> </p><blockquote><p>1、使用谷歌邮箱一直收不到消息，我就用了QQ邮箱抱着试一下的心态，竟然意外的收到了</p><p>2、如果上面的不能注册了可以进入：<a href="https://tunnelbroker.net/register.php">https://tunnelbroker.net/register.php</a> 注册。</p></blockquote><p>在email处输入自己的邮箱，点击Register按钮就行了。会收到一封激活账户的邮件，点击链接激活，就能获取到账户的登录密码了。</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ip6_arpa_01.webp" alt="image-20251025194457923"></p><p>输入账号和密码<a href="https://tb.netassist.ua/index.php">登录</a> 以后。进入到主页面如下：</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_02.webp" alt="image-20251025195323306"></p><p>在【Set reverse (backresolve) DNS】栏我们就能看到分配给我们的ipv6.arpa域名了。如我的 d.9.f.f.0.d.0.0.1.0.a.2.ip6.arpa 这个域名是</p><p>随机分配的。</p><blockquote><p>如果需要注册多个ipv6.arpa域名，注意切换网络环境。</p></blockquote><h2 id="Cloudflare托管"><a href="#Cloudflare托管" class="headerlink" title="Cloudflare托管"></a>Cloudflare托管</h2><p>注册完ipv6-arpa域名以后，就是添加nameserver服务，托管到cloudflare了，在cloudflare的<a href="https://dash.cloudflare.com/">控制台</a>中，点击右上角的【添加按钮】👉【连接域】👉【输入现由域】，然后点击继续</p><h3 id="添加域名"><a href="#添加域名" class="headerlink" title="添加域名"></a>添加域名</h3><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_03.webp" alt="image-20251025200214748"></p><p>在计划选择中，选择【免费计划】。</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_04.webp" alt="image-20251025200349391"></p><p>这时候cloudflare会要求你添加nameserver到ipv6.arpa的DNS解析中如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_05.webp" alt="image-20251025200816097"></p><h3 id="修改IP6-ARPA的NameServer"><a href="#修改IP6-ARPA的NameServer" class="headerlink" title="修改IP6.ARPA的NameServer"></a>修改IP6.ARPA的NameServer</h3><p>cloudflare分配了两个nameserver，分别是emely.ns.cloudflare.com、huxley.ns.cloudflare.com 注意你的可能和我的不一样，以你自己的为准。添加到【Set reverse (backresolve) DNS】处，如下。点击【change】就行了。</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_06.webp" alt="image-20251025201150182"></p><p>回到cloudflare中，点击立即检查名称服务器即可。等待cloudflare校验通过，会有邮件提示。</p><h2 id="IPV6-ARPA域名添加SSL证书"><a href="#IPV6-ARPA域名添加SSL证书" class="headerlink" title="IPV6.ARPA域名添加SSL证书"></a>IPV6.ARPA域名添加SSL证书</h2><p>​为IPV6.ARPA域名添加SSL证书，并且证书托管到cloudflare上。链接：<a href="https://ssl.5.8.7.b.0.d.0.0.1.0.a.2.ip6.arpa/">https://ssl.5.8.7.b.0.d.0.0.1.0.a.2.ip6.arpa/</a> ，点击进入页面。如下</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_07.webp" alt="image-20251025202803993"></p><p>填写cloudflare的邮箱地址、区域ID、全局API密钥，选择 CA证书颁发机构。</p><blockquote><p>注意账号安全非必要情况不要随便填写全局API密钥。或者是使用完成后及时更换</p></blockquote><p>全局API密钥获取点<a href="https://dash.cloudflare.com/profile/api-tokens">这里</a>。没有就创建一个，有的话可以点查看就行了。</p><p>区域ID在域名处可以看到，如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/10/25/ipv6_arpa_08.webp" alt="image-20251025203404191"></p><p>证书添加完成✅后，可以在cloudflare的控制台的SSL&#x2F;TLS栏点击【边缘证书】看到。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>​通过上面的步骤，可以两到三分钟就注册一个IP6.ARPA域名。其实比起这个，其实我更喜欢<a href="https://docs.is-a.dev/">is-a.dev</a> 域名。感兴趣的小伙伴👭，可以注册一个来玩玩。</p>]]></content>
    
    
    <summary type="html">申请并托管一个IPv6.ARPA域名到Cloudflare。作者首先分享了自己申请免费域名的经历，并提到IPv6.ARPA域名的特殊性。接着，详细说明了域名注册的过程，包括使用不同邮箱和注册商的方法。在Cloudflare托管部分，作者提供了具体的操作步骤，包括添加nameserver服务和修改NameServer。最后，文章还讲解了如何为IPv6.ARPA域名添加SSL证书，并托管到Cloudflare上。整个过程简单快捷</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="域名" scheme="https://www.hudi.space/tags/%E5%9F%9F%E5%90%8D/"/>
    
    <category term="cloudflare" scheme="https://www.hudi.space/tags/cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>再见，普莫雍措</title>
    <link href="https://www.hudi.space/posts/216f8ab9/"/>
    <id>https://www.hudi.space/posts/216f8ab9/</id>
    <published>2025-10-09T10:54:57.588Z</published>
    <updated>2025-11-10T01:04:04.077Z</updated>
    
    <content type="html"><![CDATA[<h1 id="再见，普莫雍措"><a href="#再见，普莫雍措" class="headerlink" title="再见，普莫雍措"></a>再见，普莫雍措</h1><p>​本来计划的是和同事去墨脱玩，但是想到明年我就准备回家了，准备带着亲朋好友在这边好好玩玩，也是不错的选择，于是就想着再去一次心心念念的普莫雍措。在这之前，我是去过一次，大概是2024年的4月份，由于是坐同事的车，行程比较赶，没有好好玩玩。还有一个原因是没有拍出很满意的照片。因为她真的很美，可以说是我见过湖泊中，最美的。当让也有很多朋友认为纳木措才是最美，这也是不可否认。</p><p>​我们本次的自驾行程是走G349国道从<code>拉萨</code>出发→<code>曲水县</code>→<code>贡嘎县</code>→<code>扎囊县</code>→<code>浪卡子县</code>→<code>洛扎县</code>到洛扎县的色乡。沿途中的景点也是不少，值得去给大家罗列一下。</p><p>拉萨→雅江南岸→羊卓雍措→恰央措→卡若拉冰川→普莫雍措 → 库拉岗日峰 →朱措白玛林湖</p><p>但是实际上我们是没有去恰央措的，路过了三四次都没有去。</p><blockquote><p>day01:拉萨→雅江南岸→羊卓雍措→卡若拉冰川 住宿浪卡子县</p><p>day02:浪卡子县→普莫雍措→ 库拉岗日峰观景台-&gt;朱措白玛林湖 住宿色乡民宿</p><p>day03:朱措白玛林湖→库拉岗日峰观景台→普莫雍措→浪卡子县 住宿浪卡子县</p><p>day04:浪卡子县→拉萨</p></blockquote><h2 id="羊卓雍措（Yamdrok-Lake"><a href="#羊卓雍措（Yamdrok-Lake" class="headerlink" title="羊卓雍措（Yamdrok Lake)"></a>羊卓雍措（Yamdrok Lake)</h2><p>​其实羊卓雍措我已经来过7-8次了，他是西藏三大圣湖之一，被誉为”天上的仙境”。藏语名<strong>“羊卓雍措”</strong>（ཡར་འབྲོག་གཡུ་མཚོ།），意为“碧玉湖”或“天鹅之湖”。位于西藏山南市<strong>浪卡子县</strong>，距拉萨约<strong>70公里</strong>。湖面海拔<strong>4441米</strong>，是世界上海拔最高的淡水湖之一。面积约<strong>675平方公里</strong>，湖岸线长<strong>250公里</strong>。湖水呈现梦幻的蓝绿色，因光线和季节变化呈现不同色彩。被雪山环绕，湖中有多个小岛，藏传佛教圣地。</p><h3 id="从拉萨出发"><a href="#从拉萨出发" class="headerlink" title="从拉萨出发"></a>从拉萨出发</h3><ul><li>路线：<strong>G349国道</strong>，翻越<strong>岗巴拉山口（海拔4990米）</strong>后即可俯瞰羊湖全景。</li><li>车程：约<strong>2小时</strong>（拉萨 → 曲水县 → 岗巴拉山 → 羊湖观景台）。</li></ul><h3 id="最佳的观景点"><a href="#最佳的观景点" class="headerlink" title="最佳的观景点"></a>最佳的观景点</h3><ul><li>岗巴拉山口观景台（经典机位，俯瞰羊湖全景）。</li><li>羊湖1号观景台（官方售票处，海拔高）。</li><li>羊湖3-4号观景台（靠近湖边，可近距离接触湖水）。</li></ul><h3 id="夏季羊湖风景"><a href="#夏季羊湖风景" class="headerlink" title="夏季羊湖风景"></a>夏季羊湖风景</h3><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20240804.webp"></p><p>在羊湖2号观景台拍摄的。</p><h3 id="羊湖冬季风景"><a href="#羊湖冬季风景" class="headerlink" title="羊湖冬季风景"></a>羊湖冬季风景</h3><p><img src="https://bitiful.hudi.space/posts/2025/10/09/202404.webp"></p><p>这个是羊湖的四号观景台。可以直接走到湖边上去。</p><h2 id="卡若拉冰川（Karo-La-Glacier）"><a href="#卡若拉冰川（Karo-La-Glacier）" class="headerlink" title="卡若拉冰川（Karo La Glacier）"></a>卡若拉冰川（Karo La Glacier）</h2><p>​卡若拉冰川是西藏最易接近的冰川，电影《红河谷》取景地。位于西藏山南市<strong>浪卡子县</strong>与日喀则市<strong>江孜县</strong>交界处（G349国道旁）。海拔约<strong>5020米</strong>（冰川前沿）,属于大陆性冰川（悬冰川）是西藏<strong>唯一公路旁可直接触摸</strong>的冰川。</p><h3 id="从拉萨出发-1"><a href="#从拉萨出发-1" class="headerlink" title="从拉萨出发"></a>从拉萨出发</h3><ul><li>车程:拉萨 → 羊卓雍措（浪卡子县） → 卡若拉冰川（约200公里，车程4小时）。</li><li>坐标:冰川位于<strong>G349国道</strong>旁，无需徒步即可近距离观看。</li></ul><h3 id="最佳的观景点-1"><a href="#最佳的观景点-1" class="headerlink" title="最佳的观景点"></a>最佳的观景点</h3><ul><li>冰舌从乃钦康桑雪山（海拔7191米）延伸至公路边，夏季可见冰塔林，冬季覆盖积雪。冰川前沿因消融形成冰湖(之前可以直接到湖边上去,现在不行了)，反射蓝光，适合拍照。</li><li>冰川下立有《红河谷》拍摄纪念碑。</li><li>冰川前悬挂经幡祈福，增添人文气息。</li></ul><blockquote><p> 海拔超5000米，避免剧烈运动，备好氧气瓶和高反药物。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20241003001.webp" alt="20241003001"></p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20241003002.webp" alt="20241003002"></p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20241003005.webp" alt="20241003005"></p><p>每次去卡若拉，我感觉天气都不好🤣，去年国庆去也是没有太阳，还下了冰雹。今年去我们在酒店耽搁了，也是太阳快落下去了。</p><h2 id="普莫雍措（Puma-Yumco）"><a href="#普莫雍措（Puma-Yumco）" class="headerlink" title="普莫雍措（Puma Yumco）"></a>普莫雍措（Puma Yumco）</h2><p>​好了,终于到我最喜欢的湖了🤣,看到了她，我真的体会到惊鸿一瞥这个词含义，原谅我不擅长写作，普莫藏语少女湖的意思，她位于西藏南部(山南市浪子卡县)，靠近不丹边境，距拉萨约210公里，是喜马拉雅山脉北麓的一个<strong>淡水湖</strong>，湖面海拔约<strong>5010</strong>米，被誉为“<strong>世界海拔最高的淡水湖</strong>”之一。面积约<strong>290</strong>平方公里，冬季湖面结冰，冰层晶莹剔透，形成“<strong>蓝冰</strong>”奇观。冰层湛蓝如镜，被称为“中国的贝加尔湖”。夏季湖水清澈，可看到库拉岗日雪山（<strong>海拔7538米</strong>）的倒影。因海拔高、光污染少，是观星和拍摄<strong>星空</strong>的绝佳地点，偶有极光现象。湖畔有藏族村落（如推村），村民保留传统生活方式，冬季<strong>赶羊群到湖心岛吃草</strong>的习俗尤为独特。附近的<strong>推寺</strong>（悬崖上的小寺庙）拍摄湖景的经典机位(很可惜我们没去😭)。我是非常想冬季去的,可以看蓝冰,但是我怕路上有雪或者是暗冰,开车不安全就一直没去。</p><h3 id="从拉萨出发-2"><a href="#从拉萨出发-2" class="headerlink" title="从拉萨出发"></a>从拉萨出发</h3><p>沿G349国道自驾或包车约5-6小时，途经羊卓雍措（可组合游览）。</p><blockquote><p>去普莫雍措需要去办理边防通行证(最好是西藏全境),带个人身份证即可。</p></blockquote><h3 id="最佳季节"><a href="#最佳季节" class="headerlink" title="最佳季节"></a>最佳季节</h3><p>冬季(12月-2月):观赏蓝冰，但气温极低（夜间可达-30℃）。</p><p>夏季(6月-9月):气候温和，适合徒步和摄影。</p><blockquote><p>海拔较高避免剧烈运动，备好氧气瓶和高反药物。</p><p>湖区生态脆弱，禁止乱扔垃圾或破坏环境。</p><p>推村有简易民宿，条件艰苦；建议当日往返或住浪卡子县。</p><p>气候多变，携带防风保暖衣物。</p></blockquote><h3 id="最佳的观景点-2"><a href="#最佳的观景点-2" class="headerlink" title="最佳的观景点"></a>最佳的观景点</h3><ul><li>推瓦村（推村）位于湖的南岸，海拔5070米（世界最高行政村落之一）。俯瞰普莫雍措全景的最佳位置，湖水与远处的库拉岗日雪山相映。村里的推瓦寺（悬崖寺庙）是拍摄湖景的绝佳机位。</li><li>环湖公路从浪卡子县到洛扎县的G219国道沿湖而建。推荐停靠点湖东岸可拍摄湖水与库拉岗日雪山的倒影。湖北侧视野开阔，适合拍摄湖岸曲线。</li><li>蒙达拉山口G219国道前往洛扎县的途中，海拔约5363米。远眺普莫雍措和喜马拉雅山脉的绝佳高点，适合航拍。</li></ul><p><img src="https://bitiful.hudi.space/album/20251001001.webp"></p><p><img src="https://bitiful.hudi.space/album/20251001006.webp"></p><p><img src="https://bitiful.hudi.space/album/20251001005.webp"></p><p>比较遗憾的就是没有去普莫雍措的推寺看看,攻略做的不够，再加上有朋友高反。本来已经往那边走了,但是凭着我第一次去的直觉,我调了一个头🤣。如果,我是说如果还有下次,我一定冬天去看看蓝冰,去看看湖心岛上的牛羊。但是可能不在有机会去了,再见,普莫。</p><h2 id="库拉岗日（Kula-Kangri）"><a href="#库拉岗日（Kula-Kangri）" class="headerlink" title="库拉岗日（Kula Kangri）"></a><strong>库拉岗日</strong>（Kula Kangri）</h2><p>​库拉岗日是位于中国西藏自治区<strong>山南市洛扎县</strong>与不丹边境的一座著名雪山，海拔<strong>7,538米</strong>（不同测绘数据略有差异），是<strong>藏族四大神山之一</strong>（与冈仁波齐、梅里雪山、阿尼玛卿并列），也是山南地区最高峰。其名字在藏语中意为“<strong>鸟的翅膀</strong>”，形容山脊如展翅的雄鹰，极具神圣与壮美感。从普莫到朱措白玛林湖的沿途有库拉岗日的观景台。库拉岗日归属于喜马拉雅山脉中段，与不丹的“卓木拉日峰”隔谷相望。山体周围发育多条冰川，山脚有著名的<strong>朱措白玛林湖</strong>、<strong>介久措</strong>等高原湖泊，湖水湛蓝，与雪山交相辉映。库拉岗日徒步线被列为“<strong>西藏经典徒步路线之一</strong>”，沿途可近距离观赏雪山、冰川、湖泊，适合中级户外爱好者。</p><h3 id="从拉萨出发-3"><a href="#从拉萨出发-3" class="headerlink" title="从拉萨出发"></a>从拉萨出发</h3><p>从拉萨出发，经羊卓雍措、普莫雍措至洛扎县，车程约8小时。</p><blockquote><p>需要去办理边防通行证(最好是西藏全境),带个人身份证即可。</p></blockquote><h3 id="文化与宗教意义"><a href="#文化与宗教意义" class="headerlink" title="文化与宗教意义"></a>文化与宗教意义</h3><ul><li>藏传佛教圣地被苯教和藏传佛教视为神山，常有信徒转山祈福。</li><li>相传莲花生大师曾在此修行，山下的白马林措被视为“神湖”，湖中倒影能预示吉凶。</li><li>因位于中不边境，不丹亦主张库拉岗日归属权，但实际控制权在中国西藏境内。</li></ul><h3 id="旅行与徒步攻略"><a href="#旅行与徒步攻略" class="headerlink" title="旅行与徒步攻略"></a>旅行与徒步攻略</h3><ul><li>白马林措环湖：拍摄库拉岗日倒影的经典机位。</li><li>介久措营地：近距离观赏冰川和雪峰。</li><li>折公三措：三个相连的高山湖泊，色彩奇幻。</li></ul><p>最佳季节：5-10月（夏季湖水解冻，秋季晴朗少雨）</p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20251001000000001.webp" alt="20251001000000001"></p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/20251001000000002.webp" alt="20251001000000002"></p><p>由于拍摄水平和设备有限，所有就只能将就一下了😄。</p><h2 id="朱措白玛林湖（Drum-tso-Padma-Ling）"><a href="#朱措白玛林湖（Drum-tso-Padma-Ling）" class="headerlink" title="朱措白玛林湖（Drum-tso Padma Ling）"></a>朱措白玛林湖（Drum-tso Padma Ling）</h2><p>​<strong>朱措白玛林湖</strong>藏语意为“<strong>莲花隐藏的湖泊</strong>”，传说与<strong>莲花生大师</strong>（藏传佛教宁玛派祖师）有关。简称<strong>白马林措</strong>，是位于中国<strong>西藏山南市洛扎县</strong>的一座高山湖泊，坐落在库拉岗日雪山南麓，靠近不丹边境。湖面海拔约<strong>4,500米</strong>。湖水呈现<strong>梦幻的蓝绿色</strong>，因矿物质和光线折射而变化（夏季偏蓝，冬季偏绿）。它是藏传佛教的<strong>圣湖</strong>之一，与库拉岗日神山共同构成西藏山南最震撼的“神山圣湖”景观，也是<strong>库拉岗日徒步路线</strong>的核心景点。</p><h3 id="从拉萨出发-4"><a href="#从拉萨出发-4" class="headerlink" title="从拉萨出发"></a>从拉萨出发</h3><p>拉萨 → 羊卓雍措 → 普莫雍措 → 洛扎县 → 色乡（徒步起点）。</p><blockquote><p>需要去办理边防通行证(最好是西藏全境),带个人身份证即可。</p></blockquote><h3 id="文化与宗教意义-1"><a href="#文化与宗教意义-1" class="headerlink" title="文化与宗教意义"></a>文化与宗教意义</h3><ul><li>被认为是<strong>观湖</strong>（可预示吉凶的圣湖），信徒相信湖中能看到自己的前世今生。</li><li>湖边有莲花生大师的修行洞，常有信徒前来朝拜。</li><li>传说湖底有一座神秘的“<strong>莲花宫殿</strong>”，只有修行极高的人才能看到。</li></ul><h3 id="旅行与徒步攻略-1"><a href="#旅行与徒步攻略-1" class="headerlink" title="旅行与徒步攻略"></a>旅行与徒步攻略</h3><h4 id="白马林措环湖徒步（约4-6小时）"><a href="#白马林措环湖徒步（约4-6小时）" class="headerlink" title="白马林措环湖徒步（约4-6小时）:"></a>白马林措环湖徒步（约4-6小时）:</h4><ul><li>从色乡乘车至处迂村（白马林措起点），徒步约2小时可到湖边。</li><li>环湖路线约8公里，可近距离观赏库拉岗日雪山和冰川。</li></ul><h4 id="进阶路线"><a href="#进阶路线" class="headerlink" title="进阶路线"></a>进阶路线</h4><ul><li>白马林措→介久措→折公三措（2-3天轻装徒步）。</li><li>库拉岗日大环线（5-7天，适合资深徒步者）。</li></ul><p>最佳季节：5-10月（夏季湖水解冻，秋季天气稳定，雪山倒影最美）。</p><blockquote><p>海拔4,500米，需提前适应，避免剧烈运动。</p><p>禁止污染湖水，带走所有垃圾。</p><p>边境地区禁飞，需遵守规定。</p></blockquote><h3 id="最佳观景点"><a href="#最佳观景点" class="headerlink" title="最佳观景点"></a>最佳观景点</h3><ul><li>湖边东侧：日出时拍摄“日照金山”倒影。</li><li>半山观景台：俯瞰整个湖面与库拉岗日同框。</li></ul><p><img src="https://bitiful.hudi.space/posts/2025/10/09/202510040000001.webp" alt="202510040000001"></p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/202510040000005.webp" alt="202510040000005"></p><p><img src="https://bitiful.hudi.space/posts/2025/10/09/202510040000004.webp" alt="202510040000004"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>​如果大家不想跑这么远，纳木错离拉萨很近也是一个不错的选择，但是来都来了不如多玩几个景点不是，最主要的是这些景点除了洋湖(今年开始收费的🤣)，其他的都不收费哦，嘿嘿。去库拉岗日下的湖泊徒步真的是一个不错的选择。为啥要写这篇文章呢，一是因为真的太爱普莫了，她真的就静静的呆在那里，你去或者不去，你见或者不见她就在那里，寂寥，宁静，悠远。二是因为，我再过几个月就要回内地，恐怕没有机会再去普莫了。如果，我是说如果，还有机会，我一定会看看普莫的冬天，看看湖心岛上的羊群，看看蓝冰，再见，普莫雍措。</p>]]></content>
    
    
    <summary type="html">本文记录了作者从拉萨出发，沿G349国道自驾前往普莫雍措、库拉岗日及朱措白玛林湖的旅程。原计划前往墨脱，因即将离开西藏，决定重访“西藏最美湖泊”普莫雍措。行程途经羊卓雍措、卡若拉冰川，最终抵达库拉岗日脚下的圣湖白马林措。羊卓雍措的四季风光、卡若拉冰川的震撼冰舌、普莫雍措的“惊鸿一瞥”与库拉岗日神山的壮美，构成了一幅藏地秘境画卷。作者遗憾未能冬季探访普莫雍措的蓝冰与推寺，但沿途的雪山、湖泊与徒步体验已足够难忘。文章结合实用攻略（边防证、高反提示、最佳机位）与个人感悟，表达了对这片土地的眷恋与告别之情。若有机会，作者仍想再见一次普莫雍措的冬天——那寂寥宁静的“少女湖”。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="游玩" scheme="https://www.hudi.space/tags/%E6%B8%B8%E7%8E%A9/"/>
    
  </entry>
  
  <entry>
    <title>CNB迁移和UI定制</title>
    <link href="https://www.hudi.space/posts/f3c02a84/"/>
    <id>https://www.hudi.space/posts/f3c02a84/</id>
    <published>2025-09-13T14:22:48.462Z</published>
    <updated>2025-09-13T14:23:59.236Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CNB迁移和UI定制"><a href="#CNB迁移和UI定制" class="headerlink" title="CNB迁移和UI定制"></a>CNB迁移和UI定制</h1><p>​我自己目前在使用的两个代码仓库平台分别是GitHub和CNB。我自己写的代码基本在CNB上，GitHub一般是我Fork的大佬们写的代码。如何才能把其他的代码平台的仓库迁移到CNB上呢，CNB官方也提供了好多种，有CNB Code Import代码仓库批量迁移工具、Git Sync多平台同步工具、还有制品迁移的工具。有了这些工具就可以把GitHub上一些大佬写的代码迁移到CNB上来。自己如果是想要修改，直接在云开发中去修改，也是不错的，也就没必要去clone到本地了，还要安装一堆环境依赖显得很繁琐。</p><h2 id="CNB仓库迁移"><a href="#CNB仓库迁移" class="headerlink" title="CNB仓库迁移"></a>CNB仓库迁移</h2><h3 id="一、仓库批量迁移工具"><a href="#一、仓库批量迁移工具" class="headerlink" title="一、仓库批量迁移工具"></a>一、仓库批量迁移工具</h3><p>​CNB Code Import工具支持从支持 <code>CODING</code>、<code>Github</code>、<code>Gitlab</code>、<code>Gitee</code>、<code>阿里云效</code>以及<code>通用第三方</code>代码托管平台的代码仓库批量迁移至 CNB</p><blockquote><p>svn不支持，需要转化成git再做迁移。</p></blockquote><p>工具地址：<a href="https://cnb.cool/cnb/plugins/cnbcool/code-import">https://cnb.cool/cnb/plugins/cnbcool/code-import</a> ，先fork这个仓库。</p><h4 id="迁移前置准备"><a href="#迁移前置准备" class="headerlink" title="迁移前置准备"></a>迁移前置准备</h4><blockquote><p>这里我使用CNB Code Import工具将GitHub仓库迁移到CNB上</p></blockquote><p>在做仓库迁移前需要完成以下三步骤，分别是创建源平台访问令牌、CNB 创建根组织、创建 CNB 访问令牌。</p><p>1、创建GitHub平台访问令牌</p><p>在GitHub页面点击【setting】-&gt;然后在左边的菜单栏点击【<a href="https://github.com/settings/apps">Developer Settings</a>】选择【Personal access tokens (classic)】点击【Generate new token】按钮创建<a href="https://github.com/settings/tokens/new">token</a>，如下</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_02.webp" alt="image-20250913210723813"></p><p>点击创建token按钮后，Note随便填写，token过期时间也按照你的需求选择就行，☑️勾选repo就行了。然后点击【Generate token】即可，然后复制生成的token，如下</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_03.webp" alt="image-20250913210957612"></p><p>2、CNB 创建根组织</p><p>在前面的有关CNB的章节中有讲过组织的概念和创建方式，这里省略。</p><p>3、创建CNB访问令牌</p><p>在【个人设置】-&gt;【访问令牌】中<a href="https://cnb.cool/profile/token">创建CNB访问令牌</a>，常用场景☑️勾选迁移工具凭证如下，令牌名自定义点击创建就行了。创建完成后会有令牌的token信息，注意保存。</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_01.webp" alt="image-20250913210149122"></p><p>完成上述操作准备工作就做好了。</p><h4 id="迁移代码仓库"><a href="#迁移代码仓库" class="headerlink" title="迁移代码仓库"></a>迁移代码仓库</h4><p>进入fork的code import仓库界面，可以看到提供了两种迁移代码仓库的方法，一种是通过cnb流水线，一种是dokcer，他们本质是相同的，都是使用的同一个docker镜像，在前面有关cnb的章节提到过，cnb的所有插件，都是一个docker镜像。</p><h5 id="通过流水线迁移"><a href="#通过流水线迁移" class="headerlink" title="通过流水线迁移"></a>通过流水线迁移</h5><p>1、点击code import仓库上的【执行】按钮，会出现一个下拉菜单，选择GitHub，如果你从其他平台迁移，选择对应的就行了。如下</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_04.webp" alt="image-20250913211809247"></p><p>2、点击源平台以后会出现一个对话框如下，需要填写的就是源平台访问令牌、根组织名、CNB 访问令牌。直接填写对应的栏目就行了。然后点击GitHub按钮，如下</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_05.webp" alt="image-20250913212356251"></p><p>这时候就会立马触发批量同步仓库的流水线，可以在云原生构建栏目查看迁移日志，在日志中可以查看到一共迁移了多少个仓库成功了多少，失败了多少，等待仓库迁移完成✅就行了。</p><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_06.webp" alt="image-20250913212636912"></p><p>在仓库列表就可以看到GitHub仓库所有的都迁移过来了。</p><h5 id="通过docker命令迁移"><a href="#通过docker命令迁移" class="headerlink" title="通过docker命令迁移"></a>通过docker命令迁移</h5><p>创建空的CNB仓库这里省略，进入云原生开发环境中，执行以下命令,其他平台迁移参数可以点<a href="https://cnb.cool/hudi22/code-import/-/blob/main/doc/docker-usage.md">这里</a> 查看。迁移的核心参保可以看<a href="https://cnb.cool/hudi22/code-import/-/blob/main/doc/parameters.md">这里</a> 。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">docker run --<span class="built_in">rm</span>  \</span><br><span class="line">  -e PLUGIN_SOURCE_TOKEN=<span class="string">&quot;xxx&quot;</span>  \   <span class="comment">#替换GitHub的token</span></span><br><span class="line">  -e PLUGIN_SOURCE_URL=<span class="string">&quot;https://github.com&quot;</span> \</span><br><span class="line">  -e PLUGIN_SOURCE_PLATFORM=<span class="string">&quot;github&quot;</span> \ </span><br><span class="line">  -e PLUGIN_CNB_ROOT_ORGANIZATION=<span class="string">&quot;xxx&quot;</span> \  <span class="comment">#替换cnb仓库的根组织如我的hudi22</span></span><br><span class="line">  -e PLUGIN_CNB_TOKEN=<span class="string">&quot;xxx&quot;</span>  \  <span class="comment">#替换cnb的token</span></span><br><span class="line">  -v $(<span class="built_in">pwd</span>):$(<span class="built_in">pwd</span>) -w $(<span class="built_in">pwd</span>) \</span><br><span class="line">  cnbcool/code-import</span><br></pre></td></tr></table></figure><h3 id="二、Git-Sync工具"><a href="#二、Git-Sync工具" class="headerlink" title="二、Git Sync工具"></a>二、Git Sync工具</h3><p>一个用于在不同 Git 平台之间同步代码的插件。支持通过 HTTPS 或 SSH 方式同步代码到其他 Git 托管平台。</p><p>插件地址：<a href="https://cnb.cool/cnb/plugins/tencentcom/git-sync%E3%80%82%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F%E5%86%99%E7%9A%84%E5%BE%88%E6%B8%85%E6%A5%9A%E4%BA%86%E3%80%82%E9%9C%80%E8%A6%81%E5%B0%86cnb%E7%9A%84%E4%BB%A3%E7%A0%81%E5%90%8C%E6%AD%A5%E5%88%B0GitHub%E4%B9%9F%E5%8F%AA%E9%9C%80%E8%A6%81%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%B0%B1%E8%A1%8C%E3%80%82%E5%A6%82%E4%B8%8B%E5%88%9B%E5%BB%BAcnb.yml%E6%B5%81%E6%B0%B4%E7%BA%BF%EF%BC%8C%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E5%A6%82%E4%B8%8B">https://cnb.cool/cnb/plugins/tencentcom/git-sync。官方文档使用方式写的很清楚了。需要将cnb的代码同步到GitHub也只需要简单的配置流水线就行。如下创建cnb.yml流水线，配置信息如下</a></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">main:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">sync</span> <span class="string">to</span> <span class="string">github</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">tencentcom/git-sync</span></span><br><span class="line">          <span class="attr">settings:</span></span><br><span class="line">            <span class="attr">target_url:</span> <span class="string">https://github.com/username/repo.git</span>   <span class="comment">#日前在GitHub创建一个空的仓库</span></span><br><span class="line">            <span class="attr">auth_type:</span> <span class="string">https</span></span><br><span class="line">            <span class="attr">username:</span> <span class="string">$&#123;GIT_USERNAME&#125;</span></span><br><span class="line">            <span class="attr">password:</span> <span class="string">$&#123;GIT_ACCESS_TOKEN&#125;</span></span><br></pre></td></tr></table></figure><p>或者是要把GitHub和cnb相互同步，可以配置GitHub Actions来实现。或者使用docker命令来完成同步操作。这里省略。</p><p>若是需要同步制品，可以看这个插件：<a href="https://cnb.cool/cnb/plugins/cnbcool/artifact-migrate">https://cnb.cool/cnb/plugins/cnbcool/artifact-migrate</a> 。</p><h2 id="UI定制"><a href="#UI定制" class="headerlink" title="UI定制"></a>UI定制</h2><p>可以通过在仓库根目录新增 <code>.cnb/settings.yml</code> 配置文件对页面部分 UI 进行定制。例如可以给按钮添加一个hover的gif动图。</p><blockquote><p>云原生开发配置，读取云原生启动按钮所在页面当前分支的 .cnb&#x2F;settings.yml 配置</p></blockquote><p>例如在启动云原生开发环境时让他自动进入webIDE,不在出现让我选择编辑器的页面可以在settings.yml中添加以下配置。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">workspace:</span></span><br><span class="line">  <span class="attr">launch:</span></span><br><span class="line">    <span class="attr">button:</span></span><br><span class="line">      <span class="comment"># 按钮名称</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">自定义的启动云原生开发</span></span><br><span class="line">      <span class="comment"># 按钮描述</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">点击此按钮启动云原生开发环境</span></span><br><span class="line">      <span class="comment"># 鼠标悬浮在按钮上显示的图片（只能用仓库中当前分支的图片，填写相对仓库根目录的路径，如 .cnb/launch-hover.gif）</span></span><br><span class="line">      <span class="attr">hoverImage:</span> <span class="string">.cnb/launch-hover.gif</span> </span><br><span class="line">    <span class="comment"># CPU 核心数，默认为：8。仅对默认模版有效，如果有自定义云原生开发启动流水线，则此配置无效</span></span><br><span class="line">    <span class="attr">cpus:</span> <span class="number">4</span></span><br><span class="line">    <span class="comment"># 是否禁用默认按钮。默认为：false 表示不禁用。true 表示禁用</span></span><br><span class="line">    <span class="attr">disabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># 环境创建完是否自动打开 WebIDE，默认为 false</span></span><br><span class="line">    <span class="attr">autoOpenWebIDE:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><blockquote><p>  当开发环境中未安装 openssh(仅支持 WebIDE)：无论此参数配置为 true 还是 false，环境创建完都将自动打开 WebIDE</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/09/13/cnbsync_08.webp" alt="image-20250913222058096"></p><p>还可以自定义设置fork仓库的按钮，定义点赞功能等详细可以看<a href="https://docs.cnb.cool/zh/repo/settings.html#pei-zhi-wen-jian-shuo-ming">这里</a> 。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>​代码仓库同步工具还是蛮方便的，可以快速批量的同步源平台的代码仓库，可以省去不少时间，至于这个UI自定义，目前还没有找到更好的玩法，除了能增加一点自定义化的东西外，没有看到啥实质的功能🤣。</p>]]></content>
    
    
    <summary type="html">本文介绍了如何将其他代码平台（如GitHub）的仓库迁移到CNB平台，并探讨了CNB的UI定制功能。CNB提供了多种迁移工具，包括CNB Code Import（支持批量迁移GitHub、GitLab等平台）、Git Sync（支持HTTPS/SSH同步）以及制品迁移工具。迁移步骤包括生成源平台和CNB的访问令牌、创建根组织，并通过流水线或Docker命令完成同步。此外，通过.cnb/settings.yml文件可定制UI，例如修改云开发启动按钮的样式、自动打开WebIDE等。这些工具简化了代码迁移流程，但UI定制功能目前实用性有限。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="CNB" scheme="https://www.hudi.space/tags/CNB/"/>
    
    <category term="仓库迁移" scheme="https://www.hudi.space/tags/%E4%BB%93%E5%BA%93%E8%BF%81%E7%A7%BB/"/>
    
    <category term="ui定制" scheme="https://www.hudi.space/tags/ui%E5%AE%9A%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>ZFile工具</title>
    <link href="https://www.hudi.space/posts/ee3b4d8a/"/>
    <id>https://www.hudi.space/posts/ee3b4d8a/</id>
    <published>2025-09-08T09:15:42.326Z</published>
    <updated>2025-09-09T09:17:54.445Z</updated>
    
    <content type="html"><![CDATA[<h2 id="ZFile工具"><a href="#ZFile工具" class="headerlink" title="ZFile工具"></a>ZFile工具</h2><h3 id="一、工具介绍"><a href="#一、工具介绍" class="headerlink" title="一、工具介绍"></a>一、工具介绍</h3><p>产品介绍： ZFile基于 Java 的在线网盘程序，支持对接 S3、OneDrive、SharePoint、又拍云、本地存储、FTP 等存储源，支持在线浏览图片、播放音视频，文本文件等文件类型。</p><p>目前情况：有的时候，我们需要把图片视频音乐或者是其他什么文件上传到对象存储服务器上，可能会涉及到多个服务商，或者是上传自建的本地存储，MINIO等。这时候，可能需要来回折腾好几个对象存储。在picgo或者piclist上需要切换每次上传的目标服务器。来回切换也有点繁琐。而且在登录对象存储服务器时，我们只能看到文件的名字，有的时候不好确定该文件的信息。比如文件类型我们只能通过文件后缀去判断，并且很多文件类型是没办法在线预览的就很不方便。</p><p>这个ZFile工具就可以完美解决上面所说的所有痛点。</p><p>ZFile官网：<a href="https://zfile.vip/">https://zfile.vip/</a></p><p>GitHub地址：<a href="https://github.com/zfile-dev/zfile">https://github.com/zfile-dev/zfile</a></p><h3 id="二、工具安装"><a href="#二、工具安装" class="headerlink" title="二、工具安装"></a>二、工具安装</h3><blockquote><p>官网提供了很多安装方式、一键脚本安装、宝塔面板直接安装、docker安装等等，这里简单介绍几种。</p></blockquote><h4 id="1、一键脚本安装"><a href="#1、一键脚本安装" class="headerlink" title="1、一键脚本安装"></a>1、一键脚本安装</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -sSL https://docs.zfile.vip/install.sh -o install.sh &amp;&amp; <span class="built_in">chmod</span> +x install.sh &amp;&amp; ./install.sh</span><br></pre></td></tr></table></figure><h4 id="2、docker-安装"><a href="#2、docker-安装" class="headerlink" title="2、docker 安装"></a>2、docker 安装</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">docker run -d --name=zfile --restart=always \</span><br><span class="line">    -p 8080:8080 \</span><br><span class="line">    -v /root/zfile/db:/root/.zfile-v4/db \</span><br><span class="line">    -v /root/zfile/logs:/root/.zfile-v4/logs \</span><br><span class="line">    -v /root/zfile/file:/data/file \</span><br><span class="line">    zhaojun1998/zfile:latest</span><br></pre></td></tr></table></figure><p>docker安装若需要自动更新可以通过以下命令启动容器。</p><blockquote><p>每 3600 秒 （1小时）自动检测更新名称为 <code>zfile-pro</code> 的容器。</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line">    --name watchtower \</span><br><span class="line">    --restart always \</span><br><span class="line">    -v /var/run/docker.sock:/var/run/docker.sock \</span><br><span class="line">    containrrr/watchtower \</span><br><span class="line">    --cleanup \</span><br><span class="line">    zfile-pro \</span><br><span class="line">    -i 3600</span><br></pre></td></tr></table></figure><p>由于该项目是Java语言编写的，在启动容器实例时最好加上项目的配置文件，获取如下将配置文件下载到&#x2F;root&#x2F;zfile&#x2F;目录下。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -k -o /root/zfile/application.properties https://c.jun6.net/ZFILE/application.properties</span><br></pre></td></tr></table></figure><p>若需要修改端口，可以修改配置文件的项</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">server.port=8080</span><br></pre></td></tr></table></figure><p>该程序可以使用sqlite数据库，若是使用mysql，数据库连接字符串和数据库驱动看这里：<a href="https://docs.zfile.vip/config/config-db">https://docs.zfile.vip/config/config-db</a> 。相应修改docker启动容器的命令或者是使用docker-compose去安装，这里省略。</p><h4 id="3、请人帮忙安装"><a href="#3、请人帮忙安装" class="headerlink" title="3、请人帮忙安装"></a>3、请人帮忙安装</h4><p>还可以提交Github Issue(推荐)、邮件、QQ 私聊(付费)等方式找人帮你安装🤣。</p><blockquote><p>应用还支持自建Google Drive API、OneDrive API、OnlyOffice可以看这里：<a href="https://docs.zfile.vip/">https://docs.zfile.vip/</a> 。高级功能部分</p><p>所以这几个是干嘛的❓。不懂就问</p></blockquote><h3 id="三、工具使用"><a href="#三、工具使用" class="headerlink" title="三、工具使用"></a>三、工具使用</h3><p>安装完成后。后端界面如下，在线演示：<a href="https://demo.zfile.vip/">https://demo.zfile.vip/</a></p><p><img src="https://bitiful.hudi.space/posts/2025/09/08/zfile_01.webp" alt="image-20250908170021588"></p><p>前端界面如下</p><p><img src="https://bitiful.hudi.space/posts/2025/09/08/zfile_02.webp" alt="image-20250908170137390"></p><p>各云服务厂商配置方法可以看这里：<a href="https://docs.zfile.vip/category/%E5%AD%98%E5%82%A8%E6%BA%90%E7%A4%BA%E4%BE%8B%E9%85%8D%E7%BD%AE/">https://docs.zfile.vip/category/%E5%AD%98%E5%82%A8%E6%BA%90%E7%A4%BA%E4%BE%8B%E9%85%8D%E7%BD%AE/</a> 。官方写的非常的详细了，生怕你不会。</p><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>​使用了一下，支持特别多种类型的文件在线预览，这个功能真的特别棒。画廊模式可以展示图片，也很喜欢。有需要的小伙伴可以试试！</p><blockquote><p>有些朋友测试过了，说是有些吃内存。</p></blockquote>]]></content>
    
    
    <summary type="html">ZFile是一款多功能文件管理工具，支持对接多个对象存储服务（如MINIO、云厂商存储），解决多平台切换繁琐、文件预览不便等痛点。提供一键脚本、Docker等多种安装方式，支持SQLite/MySQL数据库，并可配置Google Drive等高级功能。其亮点在于丰富的文件在线预览与画廊模式，界面友好，配置文档详尽，适合需要统一管理多存储源的用户体验。官网提供在线演示与详细教程。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="工具" scheme="https://www.hudi.space/tags/%E5%B7%A5%E5%85%B7/"/>
    
    <category term="云存储服务" scheme="https://www.hudi.space/tags/%E4%BA%91%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1/"/>
    
    <category term="zfile" scheme="https://www.hudi.space/tags/zfile/"/>
    
  </entry>
  
  <entry>
    <title>CNB刷新EO缓存和插件化</title>
    <link href="https://www.hudi.space/posts/a15f6ee1/"/>
    <id>https://www.hudi.space/posts/a15f6ee1/</id>
    <published>2025-08-30T09:26:02.214Z</published>
    <updated>2025-08-30T09:34:15.039Z</updated>
    
    <content type="html"><![CDATA[<h2 id="CNB刷新EO缓存和插件化"><a href="#CNB刷新EO缓存和插件化" class="headerlink" title="CNB刷新EO缓存和插件化"></a>CNB刷新EO缓存和插件化</h2><p>​使用了EO以后，写文章或者博客UI更新以后，刷新缓存不是那么方便了。我看CNB只有实现CDN刷新的插件。就想着能不能提交变更以后自动刷新，问了<a href="https://blog.liushen.fun/">LiuShen</a>，才想起肯定有API能够实现刷新。于是就去翻了翻官方文档，果不其然，找了好一些方式可以去实现EO的缓存刷新，这下子整个更新就方便多。其中找到了两个还算比较简单的方法，一是使用腾讯云自带的TCCLI，二是自己通过API编写刷新脚本。</p><h3 id="一、使用ssh-shell脚本"><a href="#一、使用ssh-shell脚本" class="headerlink" title="一、使用ssh+shell脚本"></a>一、使用ssh+shell脚本</h3><p>​这个方法就是在提交代码后，通过CNB的流水线去远程登录服务器，并在服务器里执行刷新EdgeOne的shell脚本，来完成缓存刷新的。</p><h4 id="1、获取腾讯云的API密钥"><a href="#1、获取腾讯云的API密钥" class="headerlink" title="1、获取腾讯云的API密钥"></a>1、获取腾讯云的API密钥</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://console.cloud.tencent.com/cam/capi</span><br></pre></td></tr></table></figure><h4 id="2、获取shell脚本信息"><a href="#2、获取shell脚本信息" class="headerlink" title="2、获取shell脚本信息"></a>2、获取shell脚本信息</h4><blockquote><p>当然linux系统自带Python的解析器，也可以编写Python的脚本，这里就是用shell脚本。这里也不编写了，因为不是太熟悉🤣直接去直接去<a href="https://console.cloud.tencent.com/api/explorer?Product=teo&Version=2022-09-01&Action=CreatePurgeTask">API Explorer</a> 找就行了，当然这里还有SDK的示例代码，需要的可以看看。</p></blockquote><p>在<a href="https://console.cloud.tencent.com/api/explorer?Product=teo&Version=2022-09-01&Action=CreatePurgeTask">API Explorer</a>中找到【边缘安全加速平台TEO】。在【示例代码】-&gt;【HTTP Request】中找到shell拷贝就行了。，shell获取步骤如下：</p><p><img src="https://bitiful.hudi.space/posts/2025/08/30/cnb_edgeone_f_01.webp" alt="image-20250830140031091"></p><h4 id="3、创建刷新EO的shell脚本"><a href="#3、创建刷新EO的shell脚本" class="headerlink" title="3、创建刷新EO的shell脚本"></a>3、创建刷新EO的shell脚本</h4><p>把上面获取的脚本放在服务器的指定目录下，例如&#x2F;root&#x2F;bash&#x2F;目录下创建flush.sh。脚本内容就是上面的获取到的。</p><blockquote><p>注意：需要替换<code>secret_id</code>和<code>secret_key</code>。还需要替换payload请求体的内容如下：</p><p>payload&#x3D;”{&quot;ZoneId&quot;:&quot;zone-xxxxxxxxxxx”,&quot;Type&quot;:&quot;purge_host&quot;,&quot;Method&quot;:&quot;invalidate&quot;,&quot;Targets&quot;:[&quot;<a href="http://www.hudi.space/%22]%7D">www.hudi.space\&quot;]}</a>“</p><p>ZoneId: 站点ID。在EdgeOne的控制台可以看到。</p><p>Type：节点缓存清除类型，purge_host 表示刷新整个域名。</p><p>Method：节点缓存清除方法，invalidate仅刷新目录下产生了更新的资源。</p><p>Targets：需清除缓存的资源列表。</p><p>更多的配置选项看这里：<a href="https://cloud.tencent.com/document/product/1552/80703">https://cloud.tencent.com/document/product/1552/80703</a></p></blockquote><h4 id="4、创建cnb-yml流水线。"><a href="#4、创建cnb-yml流水线。" class="headerlink" title="4、创建cnb.yml流水线。"></a>4、创建cnb.yml流水线。</h4><p>这里使用到了cnb的ssh插件。插件地址，点<a href="https://docs.cnb.cool/zh/plugin/#public/tencentcom/ssh">这里</a>。需要了解详细配置的话可以看看</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">master: #分支名</span><br><span class="line">  push:</span><br><span class="line">    - stages:</span><br><span class="line">        - name: 刷新缓存的任务</span><br><span class="line">          image: tencentcom/ssh</span><br><span class="line">          settings:</span><br><span class="line">            host:</span><br><span class="line">              - x.x.x.x #服务器的IP地址</span><br><span class="line">            username: #目标主机用户名</span><br><span class="line">            password: #木边主机密码</span><br><span class="line">            port: 22</span><br><span class="line">            script:</span><br><span class="line">              - sh /root/bash/flush.sh #需要执行的脚本</span><br></pre></td></tr></table></figure><p>完成上述✅提交代码到cnb仓库，就可以自动实现EdgeOne缓存的刷新了。</p><h3 id="二、腾讯云命令行工具"><a href="#二、腾讯云命令行工具" class="headerlink" title="二、腾讯云命令行工具"></a>二、腾讯云命令行工具</h3><p>TCCLI：通过腾讯云命令行工具，您可以快速轻松的调用腾讯云 API来管理您的腾讯云资源。</p><p>官方文档：<a href="https://cloud.tencent.com/document/product/440">https://cloud.tencent.com/document/product/440</a></p><p>同样这个也是CNB的一个插件，插件地址，点<a href="https://docs.cnb.cool/zh/plugin/#public/open-source/tencentyun/tccli">这里</a> 。</p><h4 id="1、确定刷新EO的TCCLI代码"><a href="#1、确定刷新EO的TCCLI代码" class="headerlink" title="1、确定刷新EO的TCCLI代码"></a>1、确定刷新EO的TCCLI代码</h4><p>由于该插件只给出了<code>cvm创建实例</code>和<code>tsf部署容器应用</code>两个案例，没有我们需要的TEO的案例，所以我们同样去<a href="https://console.cloud.tencent.com/api/explorer?Product=teo&Version=2022-09-01&Action=CreatePurgeTask">API Explorer</a> 找。找到CLI代码如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tccli teo CreatePurgeTask --cli-unfold-argument</span><br></pre></td></tr></table></figure><p>详细的子命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tccli teo CreatePurgeTask  --cli-unfold-argument --ZoneId &quot;zone-XXXXX&quot; --Type &quot;purge_host&quot; --Method &quot;invalidate&quot; --Targets &quot;www.hudi.space&quot;</span><br></pre></td></tr></table></figure><blockquote><p>可以通过Python去安装tccli,但是注意Python的版本需要大于2.7。</p><p>详细tccli安装步骤看一下这里：<a href="https://github.com/TencentCloud/tencentcloud-cli%E3%80%82">https://github.com/TencentCloud/tencentcloud-cli。</a></p></blockquote><h4 id="2、构建CNB流水线"><a href="#2、构建CNB流水线" class="headerlink" title="2、构建CNB流水线"></a>2、构建CNB流水线</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">master:</span><br><span class="line">  push:</span><br><span class="line">    # 引入 env.yml，导入其声明的环境变量</span><br><span class="line">    - imports: https://xxx/env.yml #引用密钥仓库的信息。</span><br><span class="line">      stages:</span><br><span class="line">        - name: 刷新EO</span><br><span class="line">          image: tencentcom/tencentcloud-cli</span><br><span class="line">          script: |</span><br><span class="line">            tccli configure set secretId $T_SECRET_ID</span><br><span class="line">            tccli configure set secretKey $T_SECRET_KEY</span><br><span class="line">            tccli teo CreatePurgeTask  --cli-unfold-argument --ZoneId &quot;zone-XXXXX&quot; --Type &quot;purge_host&quot; --Method &quot;invalidate&quot; --Targets &quot;www.hudi.space&quot;</span><br></pre></td></tr></table></figure><blockquote><p>同样需要获取腾讯云的API密钥，并把密钥保存在密钥仓库中这里省略。</p></blockquote><p>使用tccli去刷新EO的缓存只需要简单的两步，是不是很简单。</p><p>通过脚本或者是命令行刷新缓存成功后会有如下反馈：</p><p><img src="https://bitiful.hudi.space/posts/2025/08/30/cnb_edgeone_f_02.webp" alt="image-20250830161657454"></p><h3 id="三、插件化"><a href="#三、插件化" class="headerlink" title="三、插件化"></a>三、插件化</h3><p>有的时候我们会觉得直接在服务器使用bash脚本不好，因为它直接把腾讯云的API密钥暴露在外面了。所以可以将我们写的脚本直接插件化，在通过CNB的密钥仓库去保存密钥，传值到插件中可能更加稳妥一些。</p><p>在云原生构建中，一个插件就是一个 <code>Docker</code> 镜像。 下面以shell脚本制作插件为例。</p><h4 id="1、创建空的CNB仓库"><a href="#1、创建空的CNB仓库" class="headerlink" title="1、创建空的CNB仓库"></a>1、创建空的CNB仓库</h4><p>用来构建流水线和保存docker镜像的制品。</p><h4 id="2、容器传参"><a href="#2、容器传参" class="headerlink" title="2、容器传参"></a>2、容器传参</h4><p>首先要了解的是在cnb.yml流水线中，所设置的参数需要设置在settings下，如下</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">main:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">CNB自定义插件刷新缓存</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">docker.cnb.cool/hudi22/teo_refresh/refresh:1.0</span></span><br><span class="line">          <span class="attr">imports:</span> <span class="string">https://cnb.cool/hudi22/hudikey/-/blob/main/cdn_env.yml</span></span><br><span class="line">          <span class="attr">settings:</span></span><br><span class="line">            <span class="attr">SecretId:</span> <span class="string">$SecretId</span></span><br><span class="line">            <span class="attr">SecretKey:</span> <span class="string">$SecretKey</span></span><br></pre></td></tr></table></figure><blockquote><p>这些入参将会以环境变量的形式传给容器，不同的是，他们将会变成大写且辅以 <code>PLUGIN_</code> 前缀。</p><p>SecretId和SecretKey参数将转化为如下环境变量：PLUGIN_SECRETID和PLUGIN_SECRETKEY。</p></blockquote><h4 id="3、编写容器的入口文件"><a href="#3、编写容器的入口文件" class="headerlink" title="3、编写容器的入口文件"></a>3、编写容器的入口文件</h4><p>这里的脚本名字为entrypoint.sh，或者是自己定义，脚本信息如下这里：<a href="https://cnb.cool/hudi22/teo_refresh/-/blob/main/entrypoint.sh">https://cnb.cool/hudi22/teo_refresh/-/blob/main/entrypoint.sh</a></p><blockquote><p>注意修改payload里面的ZoneId值，和其他请求体信息。</p></blockquote><h4 id="4、编写Dockerfile文件如下"><a href="#4、编写Dockerfile文件如下" class="headerlink" title="4、编写Dockerfile文件如下"></a>4、编写Dockerfile文件如下</h4><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">24.04</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; apt-get install -y openssl curl</span></span><br><span class="line"><span class="keyword">ADD</span><span class="language-bash"> entrypoint.sh /bin/</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> <span class="built_in">chmod</span> +x /bin/entrypoint.sh</span></span><br><span class="line"><span class="keyword">ENTRYPOINT</span><span class="language-bash"> /bin/entrypoint.sh</span></span><br></pre></td></tr></table></figure><h4 id="5、构建docker镜像"><a href="#5、构建docker镜像" class="headerlink" title="5、构建docker镜像"></a>5、构建docker镜像</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker build -t docker.cnb.cool/hudi22/teo_refresh/refresh:1.0 .</span><br><span class="line">docker push docker.cnb.cool/hudi22/teo_refresh/refresh:1.0</span><br></pre></td></tr></table></figure><blockquote><p>docker制品：docker.cnb.cool&#x2F;hudi22&#x2F;teo_refresh&#x2F;refresh:1.0  配置cnb.yml以后可以直接使用。</p></blockquote><h4 id="6、引用插件"><a href="#6、引用插件" class="headerlink" title="6、引用插件"></a>6、引用插件</h4><p>只要在cnb.yml流水线中引用打包的镜像就行了，就能实现通过自定义插件去刷新EO缓存了。使用流水线刷新EO缓存的时候注意查看构建日志，看工作流是否成功。</p><p>当然还可以编写其他编程语言的脚本，可以看<a href="https://console.cloud.tencent.com/api/explorer?Product=teo&Version=2022-09-01&Action=CreatePurgeTask">API Explorer</a> 这个。</p><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>我个人比较喜欢tccli命令刷新缓存因为直接配置流水线使用插件就好了🤣，其他的配置感觉过于繁琐了。自从用了腾讯云的产品以后感觉自己的站点访问速度快了好多，更新也方便了一些。最近也是在看这些文档、插件、api的使用，可能还会写一些相关的文章。</p>]]></content>
    
    
    <summary type="html">本文介绍了在腾讯云EdgeOne（EO）环境下实现缓存自动刷新的两种方法。首先，通过SSH+Shell脚本方式，利用CNB流水线远程执行服务器脚本刷新缓存；其次，使用腾讯云命令行工具TCCLI，通过简单命令实现缓存刷新；最后，提出插件化方案，将脚本封装为Docker镜像，通过CNB密钥仓库管理敏感信息，提升安全性。三种方法均基于腾讯云API，其中TCCLI方式最为简便。文章详细展示了每种方法的配置步骤，包括密钥获取、脚本编写和流水线部署，帮助用户优化站点更新流程，提升EO缓存刷新效率。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="CNB" scheme="https://www.hudi.space/tags/CNB/"/>
    
    <category term="EdgeOne" scheme="https://www.hudi.space/tags/EdgeOne/"/>
    
    <category term="缓存刷新" scheme="https://www.hudi.space/tags/%E7%BC%93%E5%AD%98%E5%88%B7%E6%96%B0/"/>
    
    <category term="插件" scheme="https://www.hudi.space/tags/%E6%8F%92%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>CNB远程部署和EdgeOne Pages</title>
    <link href="https://www.hudi.space/posts/5726eddb/"/>
    <id>https://www.hudi.space/posts/5726eddb/</id>
    <published>2025-08-24T09:26:10.402Z</published>
    <updated>2025-08-24T09:52:51.264Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CNB远程部署和EdgeOne-Pages"><a href="#CNB远程部署和EdgeOne-Pages" class="headerlink" title="CNB远程部署和EdgeOne Pages"></a>CNB远程部署和EdgeOne Pages</h1><p>​由于我目前已经把我的博客项目从GitHub迁移到腾讯云的CNB上了，并且最近也是在一直倒腾这个CNB。写这篇文章的主要目的是，去解决一些重复性的工作。在这之前我的站点，主要是依靠Hexo提供的<code>hexo-deployer-git</code>这个插件去部署的静态页面。既需要部署更新后的页面。又需要提交新的代码到GitHub，觉得有些繁琐，后面我看了青萍老哥写的一些devops的文章，就在想可以把页面打包成docker镜像，但是我发现我得自己去搭建持续集成和部署的那些平台。耗费服务器资源不说(没那么大的服务器)，还费时费力。后来看到Liushen写了一篇<a href="https://blog.liushen.fun/posts/327826ac/">『1Panel自动同步Github仓库』</a> 的文章，我也尝试去操作了，但是我的工作流提示成功，静态产物也上传到CNB仓库了，不知道什么原因没同步到服务去上去。所以我索性把博客项目直接迁移到CNB上了。这样直接上传代码到CNB工作流自动部署。</p><p>​下面就介绍用cnb代码仓库+hexo+rsync远程部署项目，由hexo，hugo等框架生成的静态站点均可这样部署。</p><h2 id="CNB远程部署站点"><a href="#CNB远程部署站点" class="headerlink" title="CNB远程部署站点"></a>CNB远程部署站点</h2><h3 id="一、密钥仓库"><a href="#一、密钥仓库" class="headerlink" title="一、密钥仓库"></a>一、密钥仓库</h3><blockquote><p>CNB创建代码仓库，上传博客代码，这里省略。注意：博客项目配置文件需要一并上传，博客代码仓库私有化。</p></blockquote><p>​密钥仓库是 <code>云原生构建</code> 提供的安全型代码仓库，专为存储敏感信息（如密码、API密钥、证书等）设计。 通过严格的访问控制、页面水印、审计追踪等机制，实现敏感数据的安全存储与合规使用。</p><h4 id="1、创建密钥仓库"><a href="#1、创建密钥仓库" class="headerlink" title="1、创建密钥仓库"></a>1、创建密钥仓库</h4><p>创建链接地址：<a href="https://cnb.cool/new/repos">https://cnb.cool/new/repos</a> 。公开性选择：密钥仓库即可。如下：</p><p><img src="https://bitiful.hudi.space/posts/2025/08/24/rsync_cnb_deploy_01.webp" alt="image-20250824142837146"></p><blockquote><p>创建完仓库后，在仓库中新建env.yml。文件名称自拟,但时语法必须是yml或者是json。</p></blockquote><p>密钥仓库还有按需使用，限定流水线引用等详细教程说明看这里：<a href="https://docs.cnb.cool/zh/repo/secret.html">https://docs.cnb.cool/zh/repo/secret.html</a> 。</p><h4 id="2、配置ssh免密登录"><a href="#2、配置ssh免密登录" class="headerlink" title="2、配置ssh免密登录"></a>2、配置ssh免密登录</h4><p>在远程服务器创建ssh密钥。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa  <span class="comment">#后面一直回车即可</span></span><br></pre></td></tr></table></figure><p>将公钥 <code>id_rsa.pub</code> 文件的内容添加到远程机器的 <code>~/.ssh/authorized_keys</code> 文件中或者执行以下命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id -p 22 root@服务器ip</span><br></pre></td></tr></table></figure><h4 id="3、配置密钥仓库"><a href="#3、配置密钥仓库" class="headerlink" title="3、配置密钥仓库"></a>3、配置密钥仓库</h4><p>复制私钥到密钥仓库的env.yml文件中，</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /root/.ssh/id_rsa</span><br></pre></td></tr></table></figure><p>将<code>~/.ssh/</code>目录下的id_rsa文件内容复制到env.yml。格式如下</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># env.yml</span></span><br><span class="line"><span class="attr">RSYNC_KEY:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    id_rsa的内容</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="attr">RSYNC_USER:</span> <span class="string">root</span></span><br></pre></td></tr></table></figure><h3 id="二、rsync插件使用"><a href="#二、rsync插件使用" class="headerlink" title="二、rsync插件使用"></a>二、rsync插件使用</h3><p>​CNB还提供了还很多插件，包括之前讲到的知识库插件，还有webhook，微信\QQ小程序构建、CNB自动部署Edgeone Pages、Helm单元测试等等。更多的插件内容和用法看这里<a href="https://docs.cnb.cool/zh/plugins.html">https://docs.cnb.cool/zh/plugins.html</a> 。</p><p>在博客代码仓库中添加流水线.cnb.yml内容如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">master:</span>  <span class="comment">#master分支，写分支名就行了</span></span><br><span class="line">  <span class="attr">push:</span>  <span class="comment">#push操作后触发流水线</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">node:20</span> <span class="comment">#镜像版本</span></span><br><span class="line">        <span class="attr">volumes:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="string">/root/.npm:cow</span></span><br><span class="line">      <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">yarn</span> <span class="string">install</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">yarn</span> <span class="string">install</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">build</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">yarn</span> <span class="string">build</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">rsync</span> <span class="string">上传到服务器</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">tencentcom/rsync</span></span><br><span class="line">          <span class="comment">#引用密钥仓库配置文件,导入环境变量：https://docs.cnb.cool/build/env.html#dao-ru-huan-jing-bian-liang</span></span><br><span class="line">          <span class="attr">imports:</span> <span class="string">https://cnb.cool/***/-/blob/main/envs.yml</span></span><br><span class="line">          <span class="attr">settings:</span></span><br><span class="line">            <span class="attr">user:</span> <span class="string">$RSYNC_USER</span> <span class="comment">#密钥仓库中的值通过$符号引用。</span></span><br><span class="line">            <span class="attr">key:</span> <span class="string">$RSYNC_KEY</span></span><br><span class="line">            <span class="attr">port:</span> <span class="number">22</span></span><br><span class="line">            <span class="attr">hosts:</span></span><br><span class="line">              <span class="bullet">-</span> <span class="string">服务器IP</span></span><br><span class="line">              <span class="bullet">-</span> <span class="string">服务器IP</span></span><br><span class="line">            <span class="comment">#相对路径末尾带斜线表示同步文件夹里面的内容。不带斜线表示通过这个目录</span></span><br><span class="line">            <span class="attr">source:</span> <span class="string">./public/*</span></span><br><span class="line">            <span class="attr">target:</span> <span class="string">/root/hexo/</span></span><br><span class="line">            <span class="attr">script:</span></span><br><span class="line">              <span class="bullet">-</span> <span class="string">echo</span> <span class="string">&quot;after script&quot;</span>  <span class="comment">#该操作是指文件同步完成后的操作，当然若是还有后续操做，可以继续添加 -name script 再去指定相关命令。</span></span><br><span class="line">              <span class="bullet">-</span> <span class="string">ls</span> <span class="string">/root/hexo</span></span><br></pre></td></tr></table></figure><p>上面的配置文件只需要修改以下内容：</p><blockquote><p>1、imports：引用密钥仓库配置文件，修改成你的密码仓库路径即可 例如 <a href="https://cnb.cool/hudi22/hudikey/-/blob/main/env.yml">https://cnb.cool/hudi22/hudikey/-/blob/main/env.yml</a></p><p>2、hosts：服务器的IP列表  注意：远程主机中需要已安装 rsync</p><p>3、source：表示你的博客项目静态构建产物的目录 例如 .&#x2F;dist</p><p>4、target：需要部署到服务的哪个目录下 例如 &#x2F;root&#x2F;hexo</p></blockquote><p>完成上述并提交修改后，就会自动触发构建静态产物并同步到远程服务器的相应目录中了。🎉🎉🎉</p><h2 id="CNB部署到EdgeOne-Pages"><a href="#CNB部署到EdgeOne-Pages" class="headerlink" title="CNB部署到EdgeOne Pages"></a>CNB部署到EdgeOne Pages</h2><p>​最简单的就是再EdgeOne Pages控制台界面去关联CNB仓库，但是也可以通过CNB的流水线去部署产物到Pages。下面就通过CNB的流水线去部署。</p><blockquote><p>前提：已有 EdgeOne 账号并创建了 Pages 项目, 注意这个项目必须是 <strong>直接上传</strong> 类型。(有点鸡肋既然都要登录EdgeOne Pages创建项目,为什么不直接关联仓库🤣)。API Token不能直接创建项目吗？</p></blockquote><p>1、在Pages创建一个<strong>直接上传</strong>类型的项目。上传一个空文件夹就行，它会自动部署，如下 项目名字：自定义即可。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/24/cnb_deploy_02.webp" alt="image-20250824155457707"></p><p>2、创建API Token,并添加到cnb的密钥仓库中。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/24/cnb_deploy_03.webp" alt="image-20250824155755511"></p><p>密钥仓库信息如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">EDGEONE_API_TOKEN: sn8dgNgl**********n4Gy7Cs=</span><br></pre></td></tr></table></figure><p>3、创建.cnb.yml流水线。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 触发器：推送到main分支</span></span><br><span class="line"><span class="attr">main:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="comment"># 从私有仓库导入环境变量：</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">imports:</span> <span class="string">https://cnb.cool/***/-/blob/main/envs.yml</span></span><br><span class="line">      <span class="attr">stages:</span></span><br><span class="line">        <span class="comment"># 构建当前项目</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">Current</span> <span class="string">Project</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">node</span> <span class="string">-v</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line">        <span class="comment"># 将构建输出部署到 EdgeOne Pages</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">EdgeOne</span> <span class="string">Pages</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">npx</span> <span class="string">edgeone</span> <span class="string">pages</span> <span class="string">deploy</span> <span class="string">&lt;outputDirectory&gt;</span> <span class="string">-n</span> <span class="string">&lt;projectName&gt;</span> <span class="string">-t</span> <span class="string">$EDGEONE_API_TOKEN</span></span><br></pre></td></tr></table></figure><blockquote><p><outputDirectory>: 项目构建后产物所在的文件夹（必填） 例如我的是 .&#x2F;public</p><p>-n, –name: 需要部署的项目名称 ，例如 blogc根据第一步创建的为准。项目必须存在，他官方说的没有会自动创建，但是我试过了没有创建时会出错，应该是个api的bug还没有修复，要不然就是文档给错了。</p></blockquote><p>构建完成后，就会把构建产物部署到EdgeOne Pages上了。进去控制台通过临时域名就能访问。</p><p>cnb的部署EdgeOne Pages插件还提供了预发以及生产两个环境部署方法有需要的可以看一下这里：<a href="https://docs.cnb.cool/zh/plugin/#public/tencentcom/deploy-eopages">https://docs.cnb.cool/zh/plugin/#public/tencentcom/deploy-eopages</a> 。</p><p>​其实很早就在看EdgeOne Pages，因为我想部署一些由前端编写的工具。但是我前段时间使用流水线去部署到Pages的时候，一直提示获取项目ID错误,如下图。但是官方给出的说是没有项目会自动创建项目，手动创建以后就不会报这个错误❌了。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/24/cnb_deploy_06.webp" alt="image-20250824170339443"></p><h2 id="多条流水线"><a href="#多条流水线" class="headerlink" title="多条流水线"></a>多条流水线</h2><p>​有的时候时候，我们会需要一次提交代码做好几个任务，比如修改完源码提交仓库以后，需要把当前的项目构建的产物部署到Edgo Pages上。并且帮我打包成一个docker镜像。这时候我们可以使用多流水线去完成这个操作。更多关于流水线的内容看这里： <a href="https://docs.cnb.cool/zh/build/grammar.html">https://docs.cnb.cool/zh/build/grammar.html</a> 。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">main:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">services:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">docker</span> <span class="comment">#声明后，流水线内可以直接使用docker命令</span></span><br><span class="line">          <span class="attr">stages:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">set</span> <span class="string">docker</span> <span class="string">tag</span></span><br><span class="line">              <span class="attr">script:</span> <span class="string">echo</span> <span class="string">-n</span> <span class="string">&quot;$&#123;CNB_DOCKER_REGISTRY&#125;/$&#123;CNB_REPO_SLUG_LOWERCASE&#125;:latest&quot;</span></span><br><span class="line">              <span class="attr">exports:</span></span><br><span class="line">                <span class="attr">info:</span> <span class="string">IMAGE_TAG</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docker</span> <span class="string">build</span></span><br><span class="line">              <span class="attr">script:</span> <span class="string">docker</span> <span class="string">build</span> <span class="string">-t</span> <span class="string">$IMAGE_TAG</span> <span class="string">.</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">push</span> <span class="string">image</span></span><br><span class="line">              <span class="attr">script:</span> <span class="string">docker</span> <span class="string">push</span> <span class="string">$IMAGE_TAG</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">imports:</span> <span class="string">https://cnb.cool/***/-/blob/main/envs.yml</span></span><br><span class="line">          <span class="attr">stages:</span></span><br><span class="line">            <span class="comment"># 构建当前项目</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">Current</span> <span class="string">Project</span></span><br><span class="line">              <span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line">              <span class="attr">script:</span> <span class="string">node</span> <span class="string">-v</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line">            <span class="comment"># 将构建输出部署到 EdgeOne Pages</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">EdgeOne</span> <span class="string">Pages</span></span><br><span class="line">              <span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line">              <span class="attr">script:</span> <span class="string">npx</span> <span class="string">edgeone</span> <span class="string">pages</span> <span class="string">deploy</span> <span class="string">./public</span> <span class="string">-n</span> <span class="string">blogc</span> <span class="string">-t</span> <span class="string">$EDGEONE_API_TOKEN</span></span><br></pre></td></tr></table></figure><p>构建信息如下：可以看到pipeline-1和pipeline-2两条流水线。一条流水线是将产物打包成docker镜像，一条流水线将产物发布到EdgeOne Pages上。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/24/cnb_deploy_05.webp" alt="image-20250824165706896"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>​比起GitHub国内限制，CNB确实要快的多，又有免费的云开发环境。免费的制品库，最近还免费白嫖到了EdgeOne的CDN加速，还有Pages可以用，那既然要白嫖，那就贯彻到底咯🤣。尤其是CNB和EdgeOne才起步难免还会有很多问题。但是我还是坚信，他能够做的更好。</p><p>​再哔哔一下，CNB有一个云原生桌面项目，我fork了一个看这里：<a href="https://cnb.cool/hudi22/Desktop">https://cnb.cool/hudi22/Desktop</a> 。就是直接在浏览器使用Debian桌面版开发环境。有兴趣的朋友可以看看。但是注意免费额度🤣。</p>]]></content>
    
    
    <summary type="html">文章介绍了如何使用腾讯云的CNB（云原生构建）进行远程部署，并通过EdgeOne Pages进行静态网站托管。作者原本使用GitHub和Hexo进行部署，但发现这样做过于繁琐。后来，他尝试使用Docker和RSync进行自动化部署，但遇到了一些问题。最终，作者决定将项目迁移到CNB，并通过CNB的流水线实现了自动化部署。文章还详细说明了如何配置SSH免密登录、使用RSync插件以及如何通过CNB的流水线部署到EdgeOne</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="CNB" scheme="https://www.hudi.space/tags/CNB/"/>
    
    <category term="rsync" scheme="https://www.hudi.space/tags/rsync/"/>
    
  </entry>
  
  <entry>
    <title>CNB切换默认开发环境</title>
    <link href="https://www.hudi.space/posts/3c9ad839/"/>
    <id>https://www.hudi.space/posts/3c9ad839/</id>
    <published>2025-08-23T08:21:21.348Z</published>
    <updated>2025-08-24T05:48:41.817Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CNB切换默认开发环境"><a href="#CNB切换默认开发环境" class="headerlink" title="CNB切换默认开发环境"></a>CNB切换默认开发环境</h1><p>​有的时候在CNB云原生开发中，默认的开发环境不是最佳的选择，需要自定义WebIDE的开发环境，官方提供了自定义的环境切换方法，通过声明式的语法，去指定你需要的版本镜像即可。或者是使用Dockerfile定义系统的环境。</p><h2 id="一、云原生开发环境"><a href="#一、云原生开发环境" class="headerlink" title="一、云原生开发环境"></a>一、云原生开发环境</h2><p>基于云原生构建的远程开发解决方案，支持通过 WebIDE、VSCode 客户端、Cursor 客户端连接远程开发环境进行远程开发。</p><p>具有以下特点：</p><ul><li>声明式：基于 Docker 生态，Dockerfile 声明开发环境，与代码同源管理</li><li>快速启动：即使是超大仓库，也可以数秒准备好代码和环境</li><li>按需使用：按需获取开发资源，闲时快速回收，避免资源浪费</li></ul><p>官方文档地址：<a href="https://docs.cnb.cool/zh/workspaces/intro.html">https://docs.cnb.cool/zh/workspaces/intro.html</a></p><h2 id="二、默认环境说明"><a href="#二、默认环境说明" class="headerlink" title="二、默认环境说明"></a>二、默认环境说明</h2><p>默认操作系统：Debian GNU&#x2F;Linux 12 (bookworm)</p><p>CNB默认的云原生开发镜像是 <code>cnbcool/default-dev-env:latest</code></p><p>其中包括如下软件：<code>git</code>、<code>rsync</code>、 <code>jqgit-lfs</code>、<code> vimcurlwget</code>、 <code>unzip</code>、 <code>lsofnload</code>、 <code>htop</code>、 <code>net tools</code>、 <code>dnsutils</code> 、<code>openssh-server</code></p><p>vscode的默认插件：<code>coding-copilot</code>、 <code>vscode-yaml</code> 、<code>githistory</code>、 <code>gitblame</code> 、<code>git-graph</code>、 <code>vscode-yaml</code>、 <code>live-server</code></p><p>包含 oh-my-zsh 插件：<code>git</code> <code>zsh-autosuggestions</code>, <code>zsh-syntax-highlighting</code></p><p>官方默认镜像地址：<a href="https://cnb.cool/cnb/cool/default-dev-env">https://cnb.cool/cnb/cool/default-dev-env</a></p><h2 id="三、自定义镜像"><a href="#三、自定义镜像" class="headerlink" title="三、自定义镜像"></a>三、自定义镜像</h2><blockquote><p>在cnb控制台去创建一个空的仓库，然后在仓库创建一个.cnb.yml即可。</p></blockquote><h3 id="直接指定镜像"><a href="#直接指定镜像" class="headerlink" title="直接指定镜像"></a>直接指定镜像</h3><p>直接指定开发环境系统镜像如下。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">ubuntu:24.04</span>  <span class="comment">#指定开发环境镜像，可以是任意可访问的镜像。</span></span><br><span class="line">        <span class="attr">service:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">docker</span></span><br><span class="line">        <span class="comment"># 开发环境启动后会执行的任务</span></span><br><span class="line">        <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">ls</span></span><br><span class="line">            <span class="attr">script:</span> <span class="string">ls</span> <span class="string">-al</span></span><br></pre></td></tr></table></figure><blockquote><p>该方式所指定的系统环境是不具备开发环境的。可以进入系统后再做安装(不方便)。</p></blockquote><p>进入云开发环境以后可以通过以下命令查看操作系统版本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/os-release</span><br></pre></td></tr></table></figure><p><img src="https://bitiful.hudi.space/posts/2025/08/22/cnb_env_01.webp" alt="image-20250822104740915"></p><h3 id="通过Dockerfile自定义系统环境"><a href="#通过Dockerfile自定义系统环境" class="headerlink" title="通过Dockerfile自定义系统环境"></a>通过Dockerfile自定义系统环境</h3><p>​由于直接指定镜像，是不具备开发环境的依赖和软件的，所以还可以通过Dockerfile自己定义系统环境。</p><p>​在仓库的根目录去添加<code>.ide/Dockerfile</code>文件目录。如果未自定义启动流水线，启动开发环境时使用默认流水线创建开发环境。 默认流水线会优先使用 <code>.ide/Dockerfile</code> 构建一个镜像，作为开发环境基础镜像。</p><blockquote><p>启动开发环境的默认流水线中，同时配置了 <code>默认镜像</code> 和 <code>.ide/Dockerfile</code>， 如果 <code>.ide/Dockerfile</code> 不存在或构建失败，会使用 <code>默认镜像</code>作为开发环境基础镜像。 如果遇到启动的环境不符合预期，可以查看构建日志 <code>prepare</code> 阶段 <code>.ide/Dockerfile</code> 是否构建成功</p></blockquote><p>1、官方默认docker自定义系统镜像示例地址，点<a href="https://docs.cnb.cool/zh/workspaces/custom-dev-env.html#tong-guo-dockerfile-zi-ding-yi-kai-fa-huan-jing">这里</a>。他是基于node的镜像。这里还是使用ubuntu:24.04做演示。dockerfile文件内容如下：</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">24.04</span>    </span><br><span class="line"><span class="comment"># 指定字符集支持命令行输入中文（根据需要选择字符集）</span></span><br><span class="line"><span class="keyword">ENV</span> LANG=C.UTF-<span class="number">8</span></span><br><span class="line"><span class="keyword">ENV</span> LANGUAGE=C.UTF-<span class="number">8</span></span><br></pre></td></tr></table></figure><p>2、修改.cnb.yml文件如下。完成后直接点击【云原生开发】按钮，就可以通过Dockerfile去启动一个ubuntu：24.04的系统镜像了。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">build:</span> <span class="string">.ide/Dockerfile</span></span><br><span class="line">        <span class="attr">service:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">docker</span></span><br></pre></td></tr></table></figure><p>3、通过上述定义的系统镜像仍然是没有开发环境依赖和软件的，通过以下内容可以添加依赖和软件。</p><p>.ide&#x2F;Dockerfile文件内容</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">24.04</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装软件 官方指定的默认软件</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; \ </span></span><br><span class="line">apt-get install -y wget curl unzip lsof nload htop net-tools dnsutils openssh-server zsh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装vscode和vscode的插件，以下是官方指定的vscode默认插件</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> curl -fsSL https://code-server.dev/install.sh | sh &amp;&amp;  \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension cnbcool.cnb-welcome &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension redhat.vscode-yaml &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension waderyan.gitblame &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension mhutchie.git-graph &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension donjayamanne.githistory &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension cloudstudio.live-server &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension tencent-cloud.coding-copilot &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension Vue.volar  <span class="comment">#自定义插件</span></span></span><br><span class="line">    </span><br><span class="line"> <span class="comment"># 指定字符集支持命令行输入中文（根据需要选择字符集）</span></span><br><span class="line"><span class="keyword">ENV</span> LANG=C.UTF-<span class="number">8</span></span><br><span class="line"><span class="keyword">ENV</span> LANGUAGE=C.UTF-<span class="number">8</span></span><br></pre></td></tr></table></figure><blockquote><p>当然也完全可以进入开发环境以后再去安装相应的软件和插件。</p></blockquote><p>4、可以根据自己的需要自定vscode的插件，在vscode的客户端中去扩展界面查看插件的ID。复制完插件ID到Dockerfile的相应位置即可。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/22/cnb_env_02.webp" alt="image-20250822122805316"></p><p>5、提交会自动触发系统的构建，可以在【云原生构建】模块查看构建日志。进入云原生开发界面中，可以验证软件和插件安装如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/22/cnb_env_04.webp" alt="image-20250822184021130"></p><h3 id="制作成docker镜像"><a href="#制作成docker镜像" class="headerlink" title="制作成docker镜像"></a>制作成docker镜像</h3><p>​使用上述方法每次打开云开发环境的时候，都会去创建一个新的镜像，然后安装软件和依赖，这可能会花费好几分钟的时间，可以把环境构建成docker镜像，这样几秒中就可以启动云开发环境了。这里把开发环境制作成镜像推送到CNB的制品库中。</p><h4 id="方式一：使用默认系统环境构建自定义镜像。"><a href="#方式一：使用默认系统环境构建自定义镜像。" class="headerlink" title="方式一：使用默认系统环境构建自定义镜像。"></a>方式一：使用默认系统环境构建自定义镜像。</h4><p>1、先修改.cnb.yml文件使整个云开发环境是默认的debian系统。才有docker环境。修改完成后，进入云开发环境。.cnb.yml修改如下</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">cnbcool/default-build-env:latest</span>  <span class="comment">#云原生开发默认的环境镜像</span></span><br><span class="line">        <span class="attr">service:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">docker</span></span><br></pre></td></tr></table></figure><p>2、在云开发环境终端中去构建镜像，首先进入.ide&#x2F;目录，Dockerfile文件内容和第三小节一致，输入以下指令。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd .ide</span><br><span class="line">docker build -t docker.cnb.cool/hudi22/test001/ubuntu:24.04 .</span><br><span class="line">docker push docker.cnb.cool/hudi22/test001/ubuntu:24.04</span><br></pre></td></tr></table></figure><blockquote><p>docker build -t docker.cnb.cool&#x2F;{组织名}&#x2F;{仓库明}&#x2F;{镜像名称}:{版本} .</p><p>整个镜像的构建和推送速度都是非常快的。</p></blockquote><p>3、构建完成后可以在仓库的制品栏目去看到系统的镜像如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/22/cnb_env_05.webp" alt="image-20250822223850824"></p><p>4、使用制作好的镜像，直接在.cnb.yml中声明就行了，如下。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">docker.cnb.cool/hudi22/test001/ubuntu:24.04</span></span><br><span class="line">        <span class="attr">service:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">docker</span></span><br></pre></td></tr></table></figure><blockquote><p>但是这种方式构建的系统镜像是不具备docker环境。也就是在云开发环境中是没办法使用docker服务。</p></blockquote><h4 id="方式二：基于默认开发环境仓库构建自定义镜像"><a href="#方式二：基于默认开发环境仓库构建自定义镜像" class="headerlink" title="方式二：基于默认开发环境仓库构建自定义镜像"></a>方式二：基于默认开发环境仓库构建自定义镜像</h4><p>​为了使我们自定义的开发环境具备docker服务，可以先fork这个官方的默认环境仓库，点<a href="https://cnb.cool/cnb/cool/default-dev-env">这里</a>fork。fork仓库完成后只需要修改Dockerfile少部分内容。</p><blockquote><p>系统默认的Dockerfile文件内容点<a href="https://cnb.cool/cnb/cool/default-dev-env/-/blob/main/Dockerfile">这里</a>查看。</p></blockquote><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">- FROM cnbcool/default-build-env:latest #将这行替换成FROM ubuntu:24.04,或者是其他的镜像如node等</span></span><br><span class="line"><span class="addition">+ FROM ubuntu:24.04</span></span><br><span class="line"><span class="addition">+ RUN curl -fsSL https://code-server.dev/install.sh | sh &amp;&amp;\ #根据需要去安装相应的vscode插件</span></span><br><span class="line"><span class="addition">+ RUN apt-get update &amp;&amp; apt-get install -y wget unzip lsof nload htop net-tools dnsutils openssh-server zsh #根据需要安装相应的软件</span></span><br></pre></td></tr></table></figure><p>修改完成后✅，进入云原生开发环境中去构建系统开发环境镜像。构建docker镜像的命令同上。</p><p>构建完成后需要在其他项目使用这个自定义的系统镜像。需要修改.cnb.yml如下即可。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># .cnb.yml</span></span><br><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">docker.cnb.cool/hudi22/test001/ubuntu:24.04</span></span><br><span class="line">          <span class="attr">by:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">settings.json</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">cnb-init-from</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">cnb-init-from-without-lfs</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">gitconfig</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">scripts/add-zsh-plugins.sh</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">scripts/set-zsh-env.sh</span></span><br><span class="line">      <span class="attr">services:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">docker</span></span><br></pre></td></tr></table></figure><h2 id="四、构建Python开发环境"><a href="#四、构建Python开发环境" class="headerlink" title="四、构建Python开发环境"></a>四、构建Python开发环境</h2><p>​可以直接通过Python的镜像去指定开发环境，但是这里我们在默认系统镜像上去修改，把debian改成ubuntu:24.04的基础上去添加Python的环境。在Dockerfile中去声明安装python3和pip3还有UV包管理器。再指定vscode支持Python的插件。然后在环境启动的时候直接启动MySQL、Redis。</p><p>Dockerfile信息如下：</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">24.04</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ENV</span> UV_INSTALL_DIR=/usr/local/bin <span class="comment">#设置UV包管理工具路径</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 ssh 服务，用于支持 VSCode 客户端通过 Remote-SSH 访问开发环境，开发环境需保留 apt-get 缓存</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; apt-get install -y git curl wget unzip lsof nload htop net-tools dnsutils openssh-server zsh python3.6 python3-pip  <span class="comment">#安装Python3和pip包</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装vscode和插件</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> curl -fsSL https://code-server.dev/install.sh | sh &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension cnbcool.cnb-welcome &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension redhat.vscode-yaml &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension waderyan.gitblame &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension mhutchie.git-graph &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension donjayamanne.githistory &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension cloudstudio.live-server &amp;&amp;\</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension tencent-cloud.coding-copilot &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    code-server --install-extension ms-python.python &amp;&amp; \   <span class="comment">#安装Python的插件</span></span></span><br><span class="line">    code-server --install-extension ms-python.debugpy <span class="comment">#安装Python的插件</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 uv</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> sh -c <span class="string">&quot;<span class="subst">$(curl -LsSf https://astral.sh/uv/install.sh)</span>&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> scripts ./scripts</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)</span>&quot;</span> &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-autosuggestions &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="variable">$&#123;ZSH_CUSTOM:-~/.oh-my-zsh/custom&#125;</span>/plugins/zsh-syntax-highlighting &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    <span class="built_in">chmod</span> +x ./scripts/*.sh &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    ./scripts/add-zsh-plugins.sh zsh-autosuggestions zsh-syntax-highlighting &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    ./scripts/set-zsh-env.sh &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    <span class="built_in">echo</span> <span class="string">&#x27;setopt NO_AUTO_REMOVE_SLASH&#x27;</span> &gt;&gt; /root/.zshrc &amp;&amp; \</span></span><br><span class="line"><span class="language-bash">    chsh -s $(<span class="built_in">which</span> zsh)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 在最开始 source /etc/profile </span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> sed -i <span class="string">&#x27;1isetopt NULL_GLOB 2&gt;/dev/null\nsource /etc/profile\nunsetopt NULL_GLOB 2&gt;/dev/null&#x27;</span> <span class="variable">$HOME</span>/.zshrc</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> settings.json /root/.vscode-server/data/Machine/settings.json</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> settings.json /root/.local/share/code-server/Machine/settings.json</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> cnb-init-from /bin/cnb-init-from</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> cnb-init-from-without-lfs /bin/cnb-init-from-without-lfs</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> gitconfig /root/.gitconfig</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定字符集支持命令行输入中文（根据需要选择字符集）</span></span><br><span class="line"><span class="keyword">ENV</span> LANG=C.UTF-<span class="number">8</span></span><br><span class="line"><span class="keyword">ENV</span> LANGUAGE=C.UTF-<span class="number">8</span></span><br></pre></td></tr></table></figure><p>现在去修改.cnb.yml的内容如下</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">main:</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">services:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">docker</span></span><br><span class="line">      <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">docker</span> <span class="string">build</span> <span class="string">.</span></span><br><span class="line"><span class="comment"># .cnb.yml</span></span><br><span class="line"><span class="string">$:</span></span><br><span class="line">  <span class="attr">vscode:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">docker:</span></span><br><span class="line">        <span class="attr">build:</span></span><br><span class="line">          <span class="attr">dockerfile:</span> <span class="string">.ide/Dockerfile</span></span><br><span class="line">          <span class="attr">by:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">settings.json</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">cnb-init-from</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">cnb-init-from-without-lfs</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">gitconfig</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">scripts/add-zsh-plugins.sh</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">scripts/set-zsh-env.sh</span></span><br><span class="line">      <span class="attr">env:</span></span><br><span class="line">        <span class="attr">CNB_WELCOME_CMD:</span> <span class="string">echo</span> <span class="string">&quot;Welcome to 短巷与雨 CNB 😊&quot;</span></span><br><span class="line">      <span class="attr">services:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">vscode</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">docker</span></span><br><span class="line">      <span class="comment"># 开发环境启动后会执行的任务</span></span><br><span class="line">      <span class="attr">stages:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">start</span> <span class="string">mysql</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">docker</span> <span class="string">run</span> <span class="string">-d</span> <span class="string">-p</span> <span class="number">3306</span><span class="string">:3306</span> <span class="string">-v</span> <span class="string">/workspace/mysql/log:/var/log/mysql</span> <span class="string">-v</span> <span class="string">/workspace/mysql/data:/var/lib/mysql</span> <span class="string">-v</span> <span class="string">/workspace/mysql/conf:/etc/mysql/conf.d</span> <span class="string">-e</span> <span class="string">MYSQL_ROOT_PASSWORD=123456</span>  <span class="string">--name</span> <span class="string">mysql</span> <span class="string">mysql:5.7</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">start</span> <span class="string">redis</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">docker</span> <span class="string">run</span> <span class="string">--name</span> <span class="string">redis</span> <span class="string">-p</span> <span class="number">6379</span><span class="string">:6379</span> <span class="string">-d</span> <span class="string">-v</span> <span class="string">/workspace/redis/data:/data</span> <span class="string">redis:6.0.8</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">创建项目虚拟环境</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">uv</span> <span class="string">venv</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">激活虚拟环境</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">.</span> <span class="string">/workspace/.venv/bin/activate</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装项目所需依赖包</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">uv</span> <span class="string">pip</span> <span class="string">install</span> <span class="string">mysql.connector</span> <span class="comment">#根据项目实际情况安装即可，你懂的</span></span><br></pre></td></tr></table></figure><blockquote><p>把Mysql和Redis的数据卷目录写到&#x2F;workspace&#x2F;目录下。这样在提交代码时，数据文件也会跟着提交到代码仓库就能起到一个持久化数据的目的。注意：这里Mysql和Redis都没有指定配置文件，你可以自行在&#x2F;workspace目录下编写Mysql和Redis的配置文件，当然可以在stages中可以指定任意你需要的软件。注意：这里的持久化目录会提交到代码仓库，重要数据不要这么操作。或者是私有化仓库。</p></blockquote><p>启动云开发环境完成后，在vscode的终端栏可以看到启动了Mysql和Redis两个服务。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/23/cnb_env_06.webp" alt="image-20250823005302964"></p><p>这里我直接进入mysql的容器中使用sql命令去创建的测试数据库和表还有数据。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it mysql /bin/sh #进入容器</span><br><span class="line">mysql -uroot -p123456 #进入mysql</span><br><span class="line">#创建数据库和表</span><br><span class="line">create database test02;</span><br><span class="line">use test02;</span><br><span class="line">create table test02(id int,name varchar(30));</span><br><span class="line">#插入测试数据</span><br><span class="line">insert into test02(id,name)values(1,&#x27;hudi&#x27;);</span><br><span class="line">insert into test02(id,name)values(2,&#x27;xiaohong&#x27;);</span><br><span class="line">insert into test02(id,name)values(3,&#x27;xiaolan&#x27;);</span><br><span class="line">quit</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>编写一个test.py文件，去读取test02表的数据。内容如下。</p><blockquote><p>在执行测试脚本前，要用uv工具安装Python连接mysql的包,uv pip install mysql.connector</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> mysql.connector </span><br><span class="line"><span class="comment"># 配置数据库连接参数</span></span><br><span class="line">config = &#123;</span><br><span class="line">    <span class="string">&#x27;user&#x27;</span>: <span class="string">&#x27;root&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;password&#x27;</span>: <span class="string">&#x27;123456&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;host&#x27;</span>: <span class="string">&#x27;localhost&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;database&#x27;</span>: <span class="string">&#x27;test02&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;raise_on_warnings&#x27;</span>: <span class="literal">True</span></span><br><span class="line">&#125; </span><br><span class="line"><span class="comment"># 创建连接</span></span><br><span class="line">cnx = mysql.connector.connect(**config) </span><br><span class="line"><span class="comment"># 创建一个cursor对象</span></span><br><span class="line">cursor = cnx.cursor() </span><br><span class="line"><span class="comment"># 执行查询</span></span><br><span class="line">query = <span class="string">&quot;SELECT * FROM test02&quot;</span></span><br><span class="line">cursor.execute(query) </span><br><span class="line"><span class="comment"># 获取所有结果</span></span><br><span class="line"><span class="keyword">for</span> row <span class="keyword">in</span> cursor:</span><br><span class="line">    <span class="built_in">print</span>(row)</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 关闭cursor和连接</span></span><br><span class="line">cursor.close()</span><br><span class="line">cnx.close()</span><br></pre></td></tr></table></figure><p>在test.py中右击，【Run Python】-&gt;【Run Python File In Terminal】就可以运行Python程序了，测试结果如下图。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/23/cnb_env_08.webp" alt="image-20250823014648989"></p><blockquote><p>再修改完代码后记得在终端中去提交代码。这里仅测试mysql，redis就不测试了😄。</p></blockquote><p>​在完成上述操作以后，可以将构建的Python开发环境去打包成一个镜像，命令同上面的一样。构建好以后，在.cnb.yml可以直接指定镜像名称，这样启动时就省去了构建系统镜像的时间。</p><p>​文章演示的这个Python开发环境这里构建了一个镜像，地址：<a href="https://cnb.cool/hudi22/python_dev/-/packages/docker/python_dev/ubuntu">https://cnb.cool/hudi22/python_dev/-/packages/docker/python_dev/ubuntu</a> 。  测试代码上面也有，或者直接看代码仓库。在.cnb.yml中直接指定镜像名字和版本就能直接使用Mysql和Redis服务了。感兴趣的朋友👭可以去试试。其次就是这个环境只做测试使用，你们可以根据自己的开发习惯定义属于自己的云开发集成环境。后面在写关于服务端口转发和环境变量的内容吧。</p><p>另外在哔哔一下，就是CNB官方还提供了一些示例，有需要的朋友可以看这个连接：<a href="https://cnb.cool/examples/showcase">https://cnb.cool/examples/showcase</a> 。</p>]]></content>
    
    
    <summary type="html">CNB云原生开发支持自定义WebIDE开发环境，用户可通过声明式语法或Dockerfile灵活配置。默认环境基于Debian 12，预装Git、VSCode插件及Zsh工具。自定义方式包括：直接指定镜像（如Ubuntu 24.04），通过.ide/Dockerfile构建环境，可扩展软件（如Python、MySQL）和插件；3）将环境打包为Docker镜像加速启动。文章以Python开发为例，演示了集成MySQL、Redis及UV包管理器的配置，并提供了镜像构建与复用方法，优化开发效率。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="CNB" scheme="https://www.hudi.space/tags/CNB/"/>
    
  </entry>
  
  <entry>
    <title>CNB创建知识库</title>
    <link href="https://www.hudi.space/posts/6e67246c/"/>
    <id>https://www.hudi.space/posts/6e67246c/</id>
    <published>2025-08-09T14:34:43.626Z</published>
    <updated>2025-08-12T02:02:23.778Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CNB搭建知识库"><a href="#CNB搭建知识库" class="headerlink" title="CNB搭建知识库"></a>CNB搭建知识库</h1><p>​为啥使用这个腾讯云的CNB来搭建知识库呢，主要就是比传统方式搭建AI知识库方便快捷太多了。传统方式是自己编码或者是使用第三方平台，而CNB就是只要你会Git操作就可以直接通过工作流去搭建AI知识库。只需要简单得几步操作。</p><p>传统方式得痛点：</p><p>自己编码搭建知识库：需要掌握向量数据库技术、文档处理切片、模型部署调用、向量存储、检索系统开发等等。</p><p>第三方平台搭建知识库：语雀、Notion很多功能受限、Dify等配置复杂，并且成本高昂、功能扩展困难等。</p><blockquote><p>以上光是学习成本，环境搭建，后期维护成本都是非常大。</p></blockquote><h2 id="CNB简介"><a href="#CNB简介" class="headerlink" title="CNB简介"></a>CNB简介</h2><p>​腾讯云 CNB 是云原生构建（Cloud Native Build）的简称，是腾讯云推出的新一代开发者工具。它基于 Docker 生态，为开发者提供代码托管、流水线、云上开发空间、制品管理等能力，通过声明式的语法帮助开发者更高效地构建软件。后面写CNB学习笔记的时候还会专门介绍CNB的代码托管、云原生构建、云原生开发等部分。这里就大致说一下这是个什么东西就行了。</p><p>官方地址：<a href="https://docs.cnb.cool/zh/">https://docs.cnb.cool/zh/</a></p><h2 id="组织"><a href="#组织" class="headerlink" title="组织"></a>组织</h2><p>在创建代码仓库的时候需要创建一个组织，CNB是以<code>顶级组织</code> 独立结算<strong>按量计费</strong>。如下</p><p><img src="https://bitiful.hudi.space/posts/2025/08/09/CNB_01.png" alt="image-20250809211535608"></p><p>也就是说在云原生构建时需要使用资源的，免费的额度一般来说就非常够用了。8核云服务器使用1小时用量为 <code>8核 x 1小时</code> 即8核时。这里免费的有每月160核时，相当不错了。比你租一个按时计费的弹性云服务器便宜的多吧。就算超了，这个0.125&#x2F;核时，也是相当便宜了。还有就是需要玩大模型的也可以直接云原生开发、搭建环境。免费1600核时的GPU使用额度。次月清零，也不叠加。构建时消耗构建的额度，WebIDE开发时消耗开发的额度，但是有一说一，创建docker服务真的快好多。比起自己的开发环境。</p><blockquote><p>退一万步讲，如果你的免费资源不够用，那你多用几个微信登录，然后通过组织成员加入进去，有几个微信号就可以在免费的额度上*几倍。白嫖老多了。别说是我说的🙂。再说目前还有周年庆的赠送额度。</p></blockquote><p>点击右上角【+】号 -&gt; 【创建组织】-&gt;填写组织名即可。若是提示：该组织名称已被保护，请完成下方域名验证创建认证组织。在组织名后面带上数字。或者重新选一个组织名，每年一个账号只能创建一个组织。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/09/cnb_01.webp"></p><h2 id="知识库搭建"><a href="#知识库搭建" class="headerlink" title="知识库搭建"></a>知识库搭建</h2><p>​这个CNB的仓库就和GitHub类似的使用方法这里省略，点击右上角【+】号 -&gt; 【创建仓库】即可。创建完成后。若是要在线开发直接点仓库界面的【云原生开发】按钮。这时候会在新的页面打开一个如下。直接点击WebIDE即可这时会打开一个浏览器版本的vscode。这个环境中集成了很多必要的环境依赖如git、openssh-server等，操作系统版本是Debian GNU&#x2F;Linux 12 (bookworm)，或者是你也可以在本地的vscode或者curor里面打开。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/09/cnb_02.webp"></p><p>在代码仓库的 <code>.cnb.yml</code> 中配置流水线，使用知识库插件。 如下配置，当仓库的 main 分支有代码提交时，会触发流水线，自动使用知识库插件对 Markdown 文件进行切片、分词、向量化等处理，并将处理后的内容上传到 CNB 的知识库中。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">main:</span><br><span class="line">  push:</span><br><span class="line">    - stages:</span><br><span class="line">        - name: build knowledge base</span><br><span class="line">          image: cnbcool/knowledge-base</span><br><span class="line">          settings:</span><br><span class="line">            include: &quot;**/**.md&quot;</span><br></pre></td></tr></table></figure><p>如是在WebIDE中开发，直接在workspace中创建.cnb,yml文件，然后需要在终端中去提交代码到cnb仓库。直接push即可，不然不会生效。</p><blockquote><p>当然你可以直接在本地去创建这个.cnb.yml文件。然后再连同知识库所需的文档一并push到仓库中。</p></blockquote><p>参数说明如下：</p><table><thead><tr><th>参数名</th><th>说明</th><th>默认值</th><th>是否必填</th><th>备注</th></tr></thead><tbody><tr><td>include</td><td>指定需要包含的文件</td><td>空</td><td>是</td><td>使用 glob 模式匹配，默认包含所有文件。支持逗号分隔多个模式，如 <code>*.md,*.mdx,*.docx,*.txt,*.pdf</code></td></tr><tr><td>exclude</td><td>指定需要排除的文件</td><td>空</td><td>否</td><td>使用 glob 模式匹配，默认不排除任何文件。支持逗号分隔多个模式</td></tr><tr><td>embedding_model</td><td>嵌入模型</td><td>hunyuan</td><td>否</td><td>目前只支持 <code>hunyuan</code></td></tr><tr><td>chunk_size</td><td>指定文本分块大小</td><td>1500</td><td>否</td><td></td></tr><tr><td>chunk_overlap</td><td>指定相邻两个分块之间的重叠token数量</td><td>0</td><td>否</td><td></td></tr></tbody></table><p>上传知识库所需要的文档。注意文档格式，例如我给我的博客网站生成一个知识库文档。在blogcode目录下，直接git push上传到CNB仓库后就会触发流水线构建知识库了。在仓库的【云原生构建】模块可以看到知识库的构建日志如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/08/09/cnb_03.webp"></p><p>构建完成后直接在仓库的任意模块界面按下 <code>/</code> 键 再按 <code>？</code>键 。就可以唤醒知识库AI助手，如下：</p><p><img src="https://bitiful.hudi.space/posts/2025/08/09/cnb_04.webp"></p><h2 id="外部调用"><a href="#外部调用" class="headerlink" title="外部调用"></a>外部调用</h2><p>​这个知识库AI助手不只是能在你的CNB页面直接调出，还可以接受外部的调用。知识库构建完成后，可以通过 Open API 对该仓库所属知识库进行查询检索，召回后的内容可以结合 LLM 模型生成回答。使用示例可以直接看<a href="https://docs.cnb.cool/zh/ai/knowledge-base.html#bu-zhou-2-shi-yong-zhi-shi-ku">这里</a>。我本来是想做一个博客网站AI的导航的，但是我自己网站的知识库文档不知道应该怎么去生成，就自己写了一个简陋的md文档🤣。后面再想想使用这个知识库做一个网站的AI助手吧。</p>]]></content>
    
    
    <summary type="html">文章介绍了使用腾讯云CNB搭建AI知识库的相关内容。相比传统方式（需掌握多种技术或受第三方平台限制），CNB只需会Git操作，通过简单步骤即可搭建，且成本低、资源有免费额度。文中还说明了CNB的组织创建、知识库搭建（包括仓库创建、流水线配置、文档上传等）及外部调用方式。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="CNB" scheme="https://www.hudi.space/tags/CNB/"/>
    
    <category term="知识库" scheme="https://www.hudi.space/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>小工具</title>
    <link href="https://www.hudi.space/posts/1c0373de/"/>
    <id>https://www.hudi.space/posts/1c0373de/</id>
    <published>2025-07-13T06:37:57.943Z</published>
    <updated>2025-11-20T04:32:56.962Z</updated>
    
    <content type="html"><![CDATA[<h1 id="小工具"><a href="#小工具" class="headerlink" title="小工具"></a>小工具</h1><p>​平时不太喜欢去搜罗一些好用的工具，但是看到自己感兴趣的还是会记下来，有的是github上的开源项目，有的是一些直接在线的工具。主要是除了工作时间也不知道去干点什么，或者是和朋友玩玩游戏，或者是city walk一下。在要不然就知道待在家里看看电视了，刷刷抖音，看看朋友们写的博客文章，不然就是睡觉都能睡一天。本来是想写一个征期巡检提醒的机器人的。可以涵盖企微，钉钉，邮箱等的定时提醒，已经完成了一小部分了，但是又想到github上肯定有开源的项目，可以直接拿来改吧改吧用的，后来又想起之前看到的工具，都没拿来用过，还不如趁这个时间拿来运行看看。</p><h2 id="一、DCM工具"><a href="#一、DCM工具" class="headerlink" title="一、DCM工具"></a>一、DCM工具</h2><h3 id="项目介绍"><a href="#项目介绍" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​为啥介绍这个工具呢，主要是我自己不太会写docker-compose.yaml配置文件📕。虽然是能看懂配置，但是让我自己去写一个感觉是有点困难的。所以使用这个工具去快去生成一个模版出来，再在模版上修改，比自己去手动写，或者是看文档要快的多。</p><p>​DCM（Docker Compose Maker）是一款简单却功能强大的工具，可帮助您为docker应用创建 docker-compose.yaml 文件。从精选的热门容器列表中进行选择，只需点击几下，就能生成可直接使用的配置文件。大多数容器都预先配置了最佳实践和合理的默认设置，为您节省数小时阅读文档和调整配置的时间。</p><p>​生成的 compose 文件适用于任何支持 docker-compose 语法的工具，如 Docker Desktop、Rancher、Yacht 或命令行工具。</p><blockquote><p>使用 Portainer 管理docker时，您需要手动添加环境变量或上传 .env 文件，因为 Portainer 并非在所有配置中都会自动读取 .env 文件。</p></blockquote><p>GitHub地址：<a href="https://github.com/ajnart/dcm">https://github.com/ajnart/dcm</a></p><h3 id="项目预览"><a href="#项目预览" class="headerlink" title="项目预览"></a>项目预览</h3><p>如果自己不想部署，点击这里：<a href="https://compose.ajnart.dev/%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E3%80%82">https://compose.ajnart.dev/可以直接使用。</a></p><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tools_dcm_01.webp" alt="image-20250712234609103"></p><h3 id="项目部署"><a href="#项目部署" class="headerlink" title="项目部署"></a>项目部署</h3><p>提供了两种部署方案，一种是通过docker快速去部署，还有就是通过源码。</p><p>docker部署方法</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -p 7576:7576 --name dcm -d ghcr.io/ajnart/dcm</span><br></pre></td></tr></table></figure><p>或者是使用docker-compose部署</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">services:</span><br><span class="line">  dcm:</span><br><span class="line">    image: ghcr.io/ajnart/dcm</span><br><span class="line">    container_name: dcm</span><br><span class="line">    ports:</span><br><span class="line">      - &quot;7576:7576&quot;</span><br><span class="line">    restart: unless-stopped</span><br></pre></td></tr></table></figure><p>通过源码去部署，他的github上源码是用bun去安装，这是个啥，感兴趣的朋友可以试试看。这里就不使用这种方式去部署了。</p><blockquote><p>主要是我不知道这个bun是什么，服务器注意开放端口。</p></blockquote><h2 id="二、QwertyLearner工具"><a href="#二、QwertyLearner工具" class="headerlink" title="二、QwertyLearner工具"></a>二、QwertyLearner工具</h2><h3 id="项目介绍-1"><a href="#项目介绍-1" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​这个项目主要是我拿来上班摸鱼学习使用😂。</p><p>​工具是用来在线学习英语的，主要的设计理念为以英语作为主要工作语言的键盘工作者。部分人会出现输入母语时的打字速度快于英语的情况，因为多年的母语输入练就了非常坚固的肌肉记忆 💪，而英语输入的肌肉记忆相对较弱，易出现输入英语时“提笔忘字”的现象。</p><p>​内置了程序员工作常用单词的词库，方便练习工作中常用的单词、提高输入速度。也内置了诸多语言的 API 的练习，帮助以程序员快速熟悉常用的 API，更多语言的 API 正在逐步添加中…</p><p>以下亮点：</p><ul><li>丰富的词库。</li><li>音标显示、发音功能</li><li>默写模式</li><li>速度、正确率显示</li></ul><p>GitHub地址：<a href="https://github.com/suxichuan/qwertylearner">https://github.com/suxichuan/qwertylearner</a></p><h3 id="项目预览-1"><a href="#项目预览-1" class="headerlink" title="项目预览"></a>项目预览</h3><p>由于该项目是支持vercel快速部署，我这里部署了一个，可以点击查看：<a href="https://word.hudifd.qzz.io/">https://word.hudifd.qzz.io</a></p><p><img src="https://bitiful.hudi.space/posts/2025/07/12/tools_qwertylearner.png" alt="image-20250712232242356"></p><h3 id="项目部署-1"><a href="#项目部署-1" class="headerlink" title="项目部署"></a>项目部署</h3><p>实在不想去自己部署，可以直接使用别人已经搭建好的，地址如下：<a href="https://qwerty.kaiyi.cool/">https://qwerty.kaiyi.cool/</a></p><p>同时该项目是支持使用vercel快速部署的。(😊这就意味你可以轻松快速的白嫖了)，或者是把源码clone到本地，在本地去部署也可以。</p><p>使用vercel部署，只需要fork仓库，然后再<code>Vercel Build &amp; Development Settings</code>栏将<code>Output Directory</code>改为：”build”，然后点击部署即可，如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/07/12/tools_qwerty_01.png" alt="image-20250712233236061"></p><h2 id="三、AllinSSL工具"><a href="#三、AllinSSL工具" class="headerlink" title="三、AllinSSL工具"></a>三、AllinSSL工具</h2><h3 id="项目介绍-2"><a href="#项目介绍-2" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​相同功能的产品太多了，总能找到更多更好的替代品。这个项目就和Certimate是一样，几乎一模一样。用于🚀 一站式SSL证书生命周期管理解决方案 | 支持Let’s Encrypt、ZeroSSL、Google、SSL.COM、BuyPass等多家CA | 多平台部署 | 自动化运维等。</p><p><em><strong>LiuShen</strong></em>之前写了一个这个Certimate文章，地址：<a href="https://blog.liushen.fun/posts/3a813929/">https://blog.liushen.fun/posts/3a813929/</a></p><p>GitHub地址：<a href="https://github.com/allinssl/allinssl">https://github.com/allinssl/allinssl</a></p><h3 id="项目预览-2"><a href="#项目预览-2" class="headerlink" title="项目预览"></a>项目预览</h3><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tools_allinssl_01.webp" alt="image-20250713000912545"></p><h3 id="项目部署-2"><a href="#项目部署-2" class="headerlink" title="项目部署"></a>项目部署</h3><p>项目提供了多种部署方式</p><p>通过命令行安装</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -sSO http://download.allinssl.com/install_allinssl.sh &amp;&amp; bash install_allinssl.sh allinssl</span><br></pre></td></tr></table></figure><p>docker快速构建</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">docker run -itd \</span><br><span class="line">  --name allinssl \</span><br><span class="line">  -p 7979:8888 \</span><br><span class="line">  -v /www/allinssl/data:/www/allinssl/data \</span><br><span class="line">  -e ALLINSSL_USER=allinssl \</span><br><span class="line">  -e ALLINSSL_PWD=allinssldocker \</span><br><span class="line">  -e ALLINSSL_URL=allinssl \</span><br><span class="line">  -e TZ=Asia/Shanghai \</span><br><span class="line">  allinssl/allinssl:latest</span><br></pre></td></tr></table></figure><blockquote><p>实际部署时注意去替换ALLINSSL_USER和ALLINSSL_PWD。</p></blockquote><p>或者是直接使用二进制包或者是源码安装。</p><p>安装完成后浏览器输入即可跳转登录后台了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://ip:7979/allinssl</span><br></pre></td></tr></table></figure><h2 id="四、BMM项目"><a href="#四、BMM项目" class="headerlink" title="四、BMM项目"></a>四、BMM项目</h2><h3 id="项目介绍-3"><a href="#项目介绍-3" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​官方说bmm是你的专属书签管家，我前面也提到我的浏览器的书签是特别多且混乱的，非常需要一个书签管理工具，但是找来找去没有发现适合自己的，这个项目我觉得是一般的🤣。感觉有些鸡肋，说是书签🔖管理，不如说是自己弄一个导航站。为什么说他有点鸡肋呢，就是你得一个站点一个站点录入到系统里面去，或者是通过浏览器的书签导入。使用书签工具不就是为了方便快捷吗。比如一键保存书签他是没有的。为啥介绍他呢，但是可拿来做一个导航站🤣。所以还是建议去接入一下AI的功能，不然显得有点不够智能。</p><p>项目亮点：</p><ul><li>搜索书签、标签、根据标签筛选书签</li><li>基于 Github OAuth 的身份认证</li><li>导入浏览器导出的书签、标签、书签的增删改查、标签间的相互关联</li><li>爬取网站标题、图标、简介</li><li>AI 智能解析网站标题、图标、简介、关联标签、AI 为标签关联标签、多个 API 自动获取网站图标</li></ul><p>GitHub地址：<a href="https://github.com/Y80/bmm">https://github.com/Y80/bmm</a></p><h3 id="项目预览-3"><a href="#项目预览-3" class="headerlink" title="项目预览"></a>项目预览</h3><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tools_bmm_01.webp" alt="image-20250713002144725"></p><h3 id="项目部署-3"><a href="#项目部署-3" class="headerlink" title="项目部署"></a>项目部署</h3><p>项目提供了多中部署方式，有源码、vercel、或者是docker。</p><p>由于该项目使用GitHub认证登录，所以需要配置AUTH_GITHUB_ID、AUTH_URL以及AUTH_GITHUB_SECRET。配置 Github OAuth，登录GitHub，访问<a href="https://github.com/settings/applications/new%EF%BC%8C%E5%A6%82%E4%B8%8B">https://github.com/settings/applications/new，如下</a></p><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tool_bmm_github_auth.webp" alt="image-20250713013332137"></p><p>其他内容可随意填写，最重要的是 <code>Authorization callback URL</code> 这一项，请保证它和你的项目最终部署的 <strong>线上访问地址</strong> 一致。然后创建一个 Client secret。Github OAuth App 的 Client ID 和 Client Secret 将分别用作环境变量 <code>AUTH_GITHUB_ID</code> 和 <code>AUTH_GITHUB_SECRET</code>，填写的 Authorization callback URL 要和环境变量 <code>AUTH_URL</code> 保持一致。</p><p>docker部署：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"># 启动容器（使用本地 SQLite， 通过 docker volume bmm 查看数据库文件地址）其实这个sqlite完全够用了。</span><br><span class="line">docker run -d  \</span><br><span class="line">-e DB_DRIVER=sqlite \</span><br><span class="line">-e DB_CONNECTION_URL=file:/app/volume/sqlite.db \</span><br><span class="line">-e AUTH_URL=http://ip:3000 \ #若是部署在本地的话省略这行</span><br><span class="line">-e AUTH_GITHUB_ID=Ov23lixxxxxxxxmMDhsj5 \  #填写GitHub中Client ID的内容 若是部署在本地的话省略这行</span><br><span class="line">-e AUTH_GITHUB_SECRET=4c9b4db7b4xxxxx077f0a33eb1c1d8 \ #填写GitHub中Client Secret的内容 若是部署在本地的话省略这行</span><br><span class="line">-v bmm:/app/volume \</span><br><span class="line">-p 3000:3000 \</span><br><span class="line">lcclcc/bmm \</span><br><span class="line">pnpm start</span><br><span class="line"></span><br><span class="line"># 启动容器（使用 PostgreSQL ）数据库驱动换成如下即可。</span><br><span class="line">DB_CONNECTION_URL=postgresql://数据库地址 \</span><br></pre></td></tr></table></figure><p>vercel部署</p><p>首先fork仓库，登录vercel,然后创建新项目，关联仓库，在当前项目下的 Environment Variables 栏目中添加环境变量： <code>DB_DRIVER</code>、<code>DB_CONNECTION_URL</code>、<code>AUTH_URL</code>、<code>AUTH_GITHUB_SECRET</code> 和 <code>AUTH_GITHUB_ID</code>。然后点击部署即可。vercel部署会使用数据库，一些免费的数据库<a href="https://juejin.cn/post/7411047482651951119">点击这里查看</a>。不太推荐这个vercel部署，因为会很慢。但是如果作为可有可无的资源，那就另当别论了。</p><h2 id="五、Compose项目"><a href="#五、Compose项目" class="headerlink" title="五、Compose项目"></a>五、Compose项目</h2><h3 id="项目介绍-4"><a href="#项目介绍-4" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​这个项目是分享Compose模板，方便新人，老手快速部署docker容器的。其中包括了众多的模板，🗣️ 一站式通用 NAS Docker Compose 模板，实现跨平台容器快速部署。之前说过，会买个NAS来玩，所以这个省去了自己去找项目的时间。</p><p>GitHub地址：<a href="https://github.com/FrozenGEE/compose">https://github.com/FrozenGEE/compose</a></p><h3 id="项目预览-4"><a href="#项目预览-4" class="headerlink" title="项目预览"></a>项目预览</h3><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tools_compose_01.webp" alt="image-20250713133811357"></p><h2 id="六、MoonTv项目"><a href="#六、MoonTv项目" class="headerlink" title="六、MoonTv项目"></a>六、MoonTv项目</h2><h3 id="项目介绍-5"><a href="#项目介绍-5" class="headerlink" title="项目介绍"></a>项目介绍</h3><p>​🎬 <strong>MoonTV</strong> 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 14+ Tailwind CSS + TypeScript构建，支持多资源搜索、在线播放、收藏同步、播放记录、本地&#x2F;云端存储，让你可以随时随地畅享海量免费影视内容。</p><p>​功能特性可以直接看GitHub介绍，这里不再罗列了。</p><p>GitHub地址：<a href="https://github.com/senshinya/MoonTV">https://github.com/senshinya/MoonTV</a></p><h3 id="项目预览-5"><a href="#项目预览-5" class="headerlink" title="项目预览"></a>项目预览</h3><p>我用cloudflare部署了一个，地址：<a href="https://moovtv.hudifd.qzz.io/">https://moovtv.hudifd.qzz.io</a></p><p><img src="https://bitiful.hudi.space/posts/2025/07/13/tools_moontv_01.webp" alt="image-20250713120616161"></p><p>项目部署</p><p>该项目提供了多种部署方式，docker，vercel，couldflare等。且该项目GitHub上的部署教程非常详细，自行查看就行了😄然后跟着做就行了。</p><h2 id="七、其他项目"><a href="#七、其他项目" class="headerlink" title="七、其他项目"></a>七、其他项目</h2><p>​还有一些在线的工具直接可以使用无需去部署。当然也有一些开源的打包好的项目，这里就不推荐了。这里就推荐几个在线使用的工具。</p><blockquote><p>网络连接注意甄别，谨防点入钓鱼链接🔗，上当受骗。</p></blockquote><p>1、如果你想把markdown笔记转化成思维导图。可以试试这个<a href="https://markmap.js.org/">https://markmap.js.org/</a> 。</p><p>2、或者是你想把markdown转化成小卡片。那么可以看看这个 <a href="https://md2card.com/zh">https://md2card.com/zh</a> 。个人版本完全免费的，在线就可以使用，当然还可以配置mcp调用，可以自己部署试试。同时也支持Coze，不过API调用是需要积分的，一次一积分而已。</p><p>3、工具箱：<a href="https://www.udtool.com/toolbox">https://www.udtool.com/toolbox</a> 这里涵盖了生活工具、网页收藏、加密解密工具、编码转码、格式、图片、文本、颜色、pdf、养生、数学等众多的工具，可以看看。</p><p>​以后还是会留意一些好用的开源工具。这上面的工具，都是我平时刷抖音或者是看b站的时候看到了。觉得还不错，就收藏起来了。当然在使用有些工具时，还是需要注意<em><strong>版权©️</strong></em>问题。</p>]]></content>
    
    
    <summary type="html">平时不太喜欢去搜罗一些好用的工具，但是看到自己感兴趣的还是会记下来，有的是github上的开源项目，有的是一些直接在线的工具。主要是除了工作时间也不知道去干点什么，或者是和朋友玩玩游戏，或者是city walk一下。在要不然就知道待在家里看看电视了，刷刷抖音，看看朋友们写的博客文章。本来是想写一个征期巡检提醒的机器人的。可以涵盖企微，钉钉，邮箱等的定时提醒，已经完成了一小部分了，但是又想到github上肯定有开源的项目，可以直接拿来改吧改吧用的，后来又想起之前看到的工具，都没拿来用过，还不如趁这个时间拿来运行看看。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="工具" scheme="https://www.hudi.space/tags/%E5%B7%A5%E5%85%B7/"/>
    
    <category term="学习笔记" scheme="https://www.hudi.space/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>maxwell学习笔记</title>
    <link href="https://www.hudi.space/posts/1a244a1c/"/>
    <id>https://www.hudi.space/posts/1a244a1c/</id>
    <published>2025-07-12T12:04:04.043Z</published>
    <updated>2025-08-12T02:02:23.885Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Maxwell"><a href="#Maxwell" class="headerlink" title="Maxwell"></a>Maxwell</h1><p>​最新不知道记录些什么，本来说是写一个整理浏览器书签的笔记，浏览器的书签实在太乱了，注册了太多官网的账号，收藏了好多别人写的博客文章，资源等等，有用的没用的好几百个，有的时候找起来太费时间了。想用一些工具去分类整理一下的，但是没有找到合适的产品。所以就没写成，于是乎就整理了一下之前写的关于maxwell数据同步的笔记。</p><h2 id="一、Maxwell简介"><a href="#一、Maxwell简介" class="headerlink" title="一、Maxwell简介"></a>一、Maxwell简介</h2><p>‌Maxwell是一款开源的MySQL数据同步工具，通过实时读取MySQL的binlog日志，将数据变更以JSON格式发送至Kafka、RabbitMQ等流数据处理平台，支持全量与增量同步，适用于各种ETL、缓存维护等场景。</p><p>官网地址：<a href="https://maxwells-daemon.io/">https://maxwells-daemon.io/</a></p><p>核心优点：</p><ul><li>轻量级：无需依赖额外组件，直接输出JSON数据，简化下游处理。‌‌</li><li>易用性：相比Canal等工具，无需编写客户端解析数据。‌‌</li><li>灵活性：支持按库、表、列分区，解决数据倾斜问题。‌‌</li></ul><h2 id="二、Maxwell原理"><a href="#二、Maxwell原理" class="headerlink" title="二、Maxwell原理"></a>二、Maxwell原理</h2><p>​Maxwell的工作原理是实时读取MySQL数据库的二进制日志（Binlog），从中获取变更数据，再将变更数据以JSON格式发送至Kafka等流处理平台。</p><blockquote><p>Maxwell伪装为MySQL的从库（Slave），通过主从复制协议捕获binlog事件，解析后转换为JSON格式输出</p></blockquote><h3 id="输出说明"><a href="#输出说明" class="headerlink" title="输出说明"></a>输出说明</h3><p>maxwell输出数据格式有三种。对应得json中type分别为insert,update，delete。插入删除格式如下，不同的是type，更新时或多出一个old属性记录更改前的数据值。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">   <span class="attr">&quot;database&quot;</span><span class="punctuation">:</span><span class="string">&quot;test&quot;</span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;table&quot;</span><span class="punctuation">:</span><span class="string">&quot;test&quot;</span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span><span class="string">&quot;insert&quot;</span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;ts&quot;</span><span class="punctuation">:</span><span class="number">1477053217</span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;xid&quot;</span><span class="punctuation">:</span><span class="number">23396</span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;commit&quot;</span><span class="punctuation">:</span><span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">   <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span>&#x27;zs&#x27;</span><br><span class="line">   <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>字段</th><th>解释</th></tr></thead><tbody><tr><td>database</td><td>变更数据所属的数据库</td></tr><tr><td>table</td><td>表更数据所属的表</td></tr><tr><td>type</td><td>数据变更类型</td></tr><tr><td>ts</td><td>数据变更发生的时间</td></tr><tr><td>xid</td><td>事务id</td></tr><tr><td>commit</td><td>事务提交标志，可用于重新组装事务</td></tr><tr><td>data</td><td>对于insert类型，表示插入的数据；对于update类型，标识修改之后的数据；对于delete类型，表示删除的数据</td></tr><tr><td>old</td><td>对于update类型，表示修改之前的数据，只包含变更字段</td></tr></tbody></table><h3 id="二进制日志"><a href="#二进制日志" class="headerlink" title="二进制日志"></a>二进制日志</h3><p>​在MySQL中，二进制日志（Binary Log）是一种用于记录所有修改了数据库数据的操作（不包括SELECT和SHOW这类操作）的日志文件。它主要用于复制和数据恢复。启用二进制日志可以帮助你进行数据的复制和恢复，尤其是在使用MySQL复制或进行数据灾难恢复时。</p><h3 id="主从复制"><a href="#主从复制" class="headerlink" title="主从复制"></a>主从复制</h3><p>​MySQL的主从复制就是，通过主数据库的二进制日志去建立一个与主数据库环境一样的从数据库。</p><h4 id="主从应用场景"><a href="#主从应用场景" class="headerlink" title="主从应用场景"></a>主从应用场景</h4><ul><li>做数据库的热备：主数据库服务器故障后，可切换到从数据库继续工作。</li><li>读写分离：主数据库只负责业务数据的写入操作，而多个从数据库只负责业务数据的查询工作，在读多写少场景下，可以提高数据库工作效率。</li></ul><h4 id="主从复制原理"><a href="#主从复制原理" class="headerlink" title="主从复制原理"></a>主从复制原理</h4><ol><li>Master主库将数据变更记录，写到二进制日志(binary log)中</li><li>Slave从库向mysql master发送dump协议，将master主库的binary log 通过IO线程将它写入中继日志(relay log)</li><li>Slave从库的SQL线程解析中继日志中的事件并执行，完成数据同步</li></ol><p>主从复制如下图：</p><p><img src="https://bitiful.hudi.space/posts/2025/06/04/image-mysql-slave-master.png" alt="image-20250604110829698"></p><h2 id="三、Maxwell部署"><a href="#三、Maxwell部署" class="headerlink" title="三、Maxwell部署"></a>三、Maxwell部署</h2><p>​maxwell官方提供了多种安装方式，源码，docker等。在安装Maxwell前需要配置MySQL。</p><h3 id="配置MySQL"><a href="#配置MySQL" class="headerlink" title="配置MySQL"></a>配置MySQL</h3><p>1、启用MySQL的binlog，修改MySQL的配置文件如下 &#x2F;etc&#x2F;my.cnf</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[mysqld]</span><br><span class="line">#数据库id</span><br><span class="line">server-id = 1</span><br><span class="line">#启动binlog，该参数的值会作为binlog的文件名</span><br><span class="line">log-bin=mysql-bin</span><br><span class="line">#binlog类型，maxwell要求为row类型</span><br><span class="line">binlog_format=row</span><br><span class="line">#启用binlog的数据库，需根据实际情况作出修改</span><br><span class="line">binlog-do-db=test</span><br></pre></td></tr></table></figure><blockquote><p>binlog的类型有三种分别为row,statement和mixed</p><p>row：基于行，Binlog会记录每次写操作后被操作行记录的变化。优点是保持数据的绝对一致性。缺点是占用较大空间。</p><p>statement：基于语句，Binlog会记录所有写操作的SQL语句，包括insert、update、delete等。优点是节省空间。缺点是有可能造成数据不一致，例如insert语句中包含now()函数。</p><p>mixed：混合模式，默认是statement，如果SQL语句可能导致数据不一致，就自动切换到row。</p></blockquote><p>Maxwell要求MySQL的binlog必须是row模式。</p><p>修改完配置以后需要重启数据库服务。</p><p>2、创建Maxwell数据库用户</p><p>​Maxwell需要在MySQL中存储其运行过程中的所需的一些数据，包括binlog同步的断点位置（Maxwell支持断点续传）等等，故需要在MySQL为Maxwell创建数据库及用户。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">CREATE DATABASE maxwell; #创建数据库</span><br><span class="line"></span><br><span class="line">set global validate_password_policy=0; #设置密码的安全级别</span><br><span class="line">set global validate_password_length=4;</span><br><span class="line"></span><br><span class="line">CREATE USER &#x27;maxwell&#x27;@&#x27;%&#x27; IDENTIFIED BY &#x27;maxwell&#x27;; 创建maxwell用户并为其赋予权限</span><br><span class="line">GRANT ALL ON maxwell.* TO &#x27;maxwell&#x27;@&#x27;%&#x27;;</span><br><span class="line">GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO &#x27;maxwell&#x27;@&#x27;%&#x27;;</span><br></pre></td></tr></table></figure><h3 id="安装运行"><a href="#安装运行" class="headerlink" title="安装运行"></a>安装运行</h3><p>源码安装</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">curl -sLo - https://github.com/zendesk/maxwell/releases/download/v1.41.2/maxwell-1.41.2.tar.gz \</span><br><span class="line">       | tar zxvf -</span><br><span class="line">cd maxwell-1.41.2</span><br></pre></td></tr></table></figure><blockquote><p>该软件是使用Java开发的，会依赖Java的环境，再此之前需要安装Java的环境</p></blockquote><p>在解压完以后，可以直接用过bin目录中的脚本文件启动maxwell。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bin/maxwell --user=&#x27;maxwell&#x27; --password=&#x27;XXXXXX&#x27; --host=&#x27;127.0.0.1&#x27; --producer=stdout</span><br></pre></td></tr></table></figure><p>以上dome是指将数据库的数据直接通过maxwell同步以后，输出到控制台。该项一般只是做测试使用</p><p>或者是直接通过命令行去启动一个将数据同步到kafka的进程</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">bin/maxwell --user=&#x27;maxwell&#x27; --password=&#x27;XXXXXX&#x27; --host=&#x27;127.0.0.1&#x27; \</span><br><span class="line">   --producer=kafka --kafka.bootstrap.servers=localhost:9092 --kafka_topic=maxwell</span><br></pre></td></tr></table></figure><blockquote><p>–user: 数据库的用户名</p><p>–password：数据库的密码</p><p>–host:数据库所在服务器的ip地址</p><p>–producer&#x3D;指定将数据同步到哪里，例如：kafka、nats、pubsub、bigquery、rabbitmq、redis等</p><p>1、若是同步到kafka需要指定kafka集群的ip和端口号，以及主题</p><p>2、若是将数据同步到Google Cloud Pub&#x2F;Sub平台需要指定pubsub_project_id和主题</p><p>所需要同步的平台根据官方给出的信息配置即可。</p></blockquote><p>上面是通过命令行的方式去同步的数据，接下介绍的是使用maxwell配置文件去启动守护进程将数据同步到kafka。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">log_level=info</span><br><span class="line">producer=kafka  #指定将数据同步到kafka</span><br><span class="line">kafka.bootstrap.servers=192.168.128.4:9092,192.168.128.5:9092  #kafka集群的地址，可以写多个</span><br><span class="line"></span><br><span class="line">#kafka topic配置</span><br><span class="line">kafka_topic= kafka_topic_name #kafka集群中的主题名</span><br><span class="line"></span><br><span class="line"># mysql的信息</span><br><span class="line">host=192.168.128.16  #MySQL所在服务器IP</span><br><span class="line">user=maxwell #MySQL用户名</span><br><span class="line">password=maxwell #MySQL密码</span><br><span class="line">jdbc_options=useSSL=false&amp;serverTimezone=Asia/Shanghai</span><br></pre></td></tr></table></figure><blockquote><p>若是自己搭建kafka需要注意的是2.8版本以下的kafka是依赖于zookeeper的所以需要在linux上安装zookeeper。</p><p>kafka_topic: 可以静态配置，如maxwell_test,或者是直接使用动态配置去%{database}_%{table}。则在kafka中的主题名为”数据库名 下划线 表名” 如：trade_order。</p></blockquote><p>配置完成后启动maxwell，在启动前确保kafak集群已经启动。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/bin/maxwell --config maxwell/config.properties --daemon</span><br></pre></td></tr></table></figure><blockquote><p>通过该命令启动maxwell以后，会在后台新建一个名叫maxwell的守护程序，可以 ps -ef | grep maxwell 去查看。也可以用过jps去查看。启动完成后，就会实时同步增量数据。</p></blockquote><p>maxwell没有写停止的脚本，只能通过kill去杀掉后台进程，停止maxwell。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps -ef | grep maxwell | grep -v grep | grep maxwell | awk &#x27;&#123;print $2&#125;&#x27; | xargs kill -9</span><br></pre></td></tr></table></figure><p>或者是直接使用docker去快速部署一个maxwell应用，将MySQL的数据同步到kafka</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --rm zendesk/maxwell bin/maxwell --user=$MYSQL_USERNAME \</span><br><span class="line">    --password=$MYSQL_PASSWORD --host=$MYSQL_HOST --producer=kafka \</span><br><span class="line">    --kafka.bootstrap.servers=$KAFKA_HOST:$KAFKA_PORT --kafka_topic=maxwell</span><br></pre></td></tr></table></figure><blockquote><p>kafka消息队列也可以使用docker快速搭建这里省略</p></blockquote><p>有时只有增量数据是不够的，我们可能需要使用到MySQL数据库中从历史至今的一个完整的数据集。这就需要在进行增量同步之前，先进行一次历史数据的全量同步。这样就能保证得到一个完整的数据集。</p><p>Maxwell提供了bootstrap功能来进行历史数据的全量同步</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bin/maxwell-bootstrap --database 数据库名 --table 表名 --config maxwell/config.properties</span><br></pre></td></tr></table></figure><blockquote><p>同步json中我们可以发现，type有bootstrap-start、bootstrap-insert、bootstrap-complete三种类型，其中bootstrap-start与bootstrap-complete是bootstrap开始和结束的标志，不包含任何数据，数据都存在于type为bootstrap-insert的类型中。</p></blockquote>]]></content>
    
    
    <summary type="html">最新不知道记录些什么，本来说是写一个整理浏览器书签的笔记，浏览器的书签实在太乱了，注册了太多官网的账号，收藏了好多别人写的博客文章，资源等等，有用的没用的好几百个，有的时候找起来太费时间了。想用一些工具去分类整理一下的，但是没有找到合适的产品。所以就没写成，于是乎就整理了一下之前写的关于maxwell数据同步的笔记。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="数据同步" scheme="https://www.hudi.space/tags/%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/"/>
    
    <category term="运维" scheme="https://www.hudi.space/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>飞牛云NAS搭建</title>
    <link href="https://www.hudi.space/posts/d65eddde/"/>
    <id>https://www.hudi.space/posts/d65eddde/</id>
    <published>2025-06-25T05:50:59.301Z</published>
    <updated>2025-08-12T02:02:23.696Z</updated>
    
    <content type="html"><![CDATA[<h1 id="飞牛云NAS搭建"><a href="#飞牛云NAS搭建" class="headerlink" title="飞牛云NAS搭建"></a>飞牛云NAS搭建</h1><p>​最近老是刷到飞牛云的视频，一度怀疑是不是投了广告了，但是又对他的系统特别感兴趣。想装一个来玩玩，本来是准备买个j1900四核的小主机来玩的。又想到家里还有一个闲置的树莓派，朋友送的那个还一直在吃灰，这个板子架构不支持，没法安装飞牛云OS，就很可惜，等这个劲头过去了，估计也不想倒腾了。所以就先自己在虚拟机玩了玩。如果还是很喜欢，就准备趁着国补入手一个贵一点的NAS成品，或者是买个性能好一点主机自己搭建。</p><h2 id="一、飞牛云"><a href="#一、飞牛云" class="headerlink" title="一、飞牛云"></a>一、飞牛云</h2><h3 id="飞牛云介绍"><a href="#飞牛云介绍" class="headerlink" title="飞牛云介绍"></a>飞牛云介绍</h3><p>​飞牛的FnOS的系统完全免费的，这一点我觉得很不错，当然有一部分服务是收费的。FnOS是基于最新Linux内核(Debian发行版)深度开发,硬件兼容性强支持主流 x86 硬件,可以自由组装 NAS，灵活扩展外部存储。可以直接装在X86的主机上，所有如果有闲置的电脑都可以装来玩玩。除此之外还支持智能影视，AI相册等功能，还提供内网穿透一站式解决方案(该功能部分付费)。当然最重要的是FnOS这个系统是支持docker的。这就意味着可以安装任何你喜欢的应用，可以有无限种玩法。</p><p>官网：<a href="https://www.fnnas.com/">https://www.fnnas.com/</a></p><h3 id="飞牛云安装"><a href="#飞牛云安装" class="headerlink" title="飞牛云安装"></a>飞牛云安装</h3><p>由于我这里是使用虚拟机(因为实在是太想玩，又没有现成的主机或者是旧笔记本)去安装飞牛云，若是安装在主机上的话，U盘引导盘制作这里不讲了。看以下文章即可。</p><p><a href="https://help.fnnas.com/articles/fnosV1/start/install-os.md">https://help.fnnas.com/articles/fnosV1/start/install-os.md</a></p><blockquote><p>记得bios里面去设置首选U盘启动，就能安装了。</p></blockquote><p>1、虚拟机去安装飞牛云OS，在创建新虚拟机选择FnOS镜像如下</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-01.png" alt="image-20250624190505838"></p><p>2、在系统选择中可以选择Debian版本的系统或者是Ubuntu的。磁盘容量等根据自己情况设置即可。其他操作直接下一步就行了。这里我选择Ubuntu。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-02.png" alt="image-20250624190809377"></p><p>3、启动虚拟机之后界面如下、直接回车即可。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-03.png" alt="image-20250624191013632">4、<strong>进入镜像安装位置设置</strong>，<strong>系统分区大小设置</strong>，<strong>swap分区大小设置</strong>等设置直接点下一步即可。然后就会进入系统安装的过程。安装好以后会出现网络配置如下，这里也是直接点保存就行了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-04.png" alt="image-20250624192105155"></p><p>5、系统会重启，然后启动一个FnOS Web UI的服务程序一般运行在5666端口界面如下。通过IP和端口就可以访问了，http访问5666端口，https访问5667端口。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-05.png" alt="image-20250624192303128"></p><p>6、进入Web UI界面以后，设置管理员账号密码，点击进入FnOS按钮即可，以上步骤不清楚的可以看飞牛云官方的镜像安装文档。</p><blockquote><p>注意创建账户的时候不要使用root用户名，系统本身安装时会创建这个用户。</p></blockquote><p>7、整个Web UI界面如下，存储空间的创建和账号的绑定自行去操作即可。</p><blockquote><p>这里需要注意的是虚拟机体验的话需要使用一个U盘或者是SD卡，因为在创建存储空间的时候，需要使用到这个空间。他不会使用虚拟机分配的安装系统的空间去做存储空间。不然在创建存储空间的时候会提示当前暂无可用于创建存储空间的硬盘。后续安装软件等可以基于这个存储空间。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-06.png" alt="image-20250624192920639"></p><h2 id="二、内网穿透"><a href="#二、内网穿透" class="headerlink" title="二、内网穿透"></a>二、内网穿透</h2><p>​由于飞牛云支撑docker,所以可以安装自己喜欢的docker程序。这里我以LibreTV为例。去做一个内网穿透。飞牛云本身是带有内网穿透这个功能的。但是免费版本只能实现基础外网访问 NAS、备份相册等场景。若是docker部署的程序，是无法通过免费版本的FN Connect去实现外网访问的。付费版本的可以看<a href="https://www.fnnas.com/fn-connect">这里</a>。</p><h3 id="自带内网穿透"><a href="#自带内网穿透" class="headerlink" title="自带内网穿透"></a>自带内网穿透</h3><p>飞牛云自带免费的内网穿透功能实现。</p><p>1、直接点击UI界面的绑定飞牛云账号的登录按钮。注册飞牛云登录即可。</p><p>2、在系统设置的远程访问中开启FN Connect,开启时会让你填写FN ID，其实就是子域名，如下。等待一会证书申请完毕后就开启了远程访问功能了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-07.png" alt="image-20250624204047553"></p><p>3、创建完毕如下图，这时候是可以搭配飞牛云的app去使用飞牛云的相关功能如相册，备份，存储等。app的使用只需要登录账号输入FN ID就可以连接你的NAS了。只是这个免费版本的有带宽等险种。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/24/FnOS-08.png" alt="image-20250624204355690"></p><blockquote><p>当然也可以付费使用飞牛云提供的DDNS功能。</p></blockquote><h3 id="lucky内网穿透"><a href="#lucky内网穿透" class="headerlink" title="lucky内网穿透"></a>lucky内网穿透</h3><p>​使用飞牛云应用中心就有的lucky应用去实现内网穿透功能(我觉得挺良心的)。这里我使用的是IPV6的公网做穿透。在应用中心搜索lucky点击安装即可，这时候Web UI界面会出现lucky的图标。点击就能进去。同样的这个是一个web应用。</p><blockquote><p>记得在路由器的设置界面关闭IPV6的防火墙。</p></blockquote><p>这里我通过docker部署LibreTV应用再使用lucky实现外网可访问。docker安装LibreTV的步骤这里省略。因为飞牛云的Web UI界面中是可以直接去创建docker应用的。</p><p>lucky官方网站：<a href="https://lucky666.cn/">https://lucky666.cn/</a></p><p>1、在lucky管理页面中的<strong>动态域名</strong>解析中去添加任务。任务名称随意填写，任务开关和操作模式默认即可。在DNS服务商设置中，选择你域名所属的服务商。并点击创建<a href="https://ram.console.aliyun.com/manage/ak?spm=5176.12818093.nav-right.dak.488716d0mHaMgg"> AccessKey</a>根据提示去创建，创建完成后填写<strong>AccessKey ID</strong>和<strong>AccessKey Secret</strong>栏目。类型选择<strong>IPV6</strong>，获取公网方式选择通过<strong>网卡获取</strong>如下，在域名列表中填写匹配的域名信息。*.suxichuan.icu这个域名表示匹配这个域名下的所有子域名。然后点击添加任务按钮。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/27/FnOS-09.png" alt="image-20250627082406013"></p><p>2、添加成功完成后，在任务列表在IPV6的栏目中可以看到dns信息与记录值一致。表示配置完成了，两个项都可以查看配置成功。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-10.png" alt="image-20250625103503584"></p><p>3、这时候在阿里云的域名解析中就可以看到两条指向IPV6的信息如下，其实就是lucky通过AccessKey去创建的。当然你也可以直接通过手动添加的方式去添加域名解析的记录值。IPV6的地址可以直接在系统设置的网络设置中看到。</p><blockquote><p>其实直接在域名中加上IPV6的解析以后，在外网访问域名时就可以访问了，由于我的LibreTV程序开放的端口是8899。<a href="http://tv.suxichuan.icu:8899就能直接访问了。只是通过http的协议去访问的。所以最好是使用https。">http://tv.suxichuan.icu:8899就能直接访问了。只是通过http的协议去访问的。所以最好是使用https。</a></p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-11.png" alt="image-20250625110159962"></p><p>4、在<strong>安全管理</strong>中去添加证书。添加方式勾选：<strong>ACME</strong>，证书的颁发机构选择：<strong>Let‘s Encrypt</strong>，验证方式选择<strong>阿里云</strong>。这里同样是需要填写阿里云的<strong>AccessKey ID</strong>和<strong>AccessKey Secret</strong>栏目的，根据上面添加任务一样填写，<strong>更多设置</strong>栏目和<strong>代理设置</strong>栏目默认即可。稍等片刻证书就是生成成功如下图</p><blockquote><p>一般来说是可以成功的，但是我这使用zerossl失败了，所以直接登录了<a href="https://app.zerossl.com/signup">zerossl的官网去</a>直接申请证书。申请完成然后下载证书，并把证书上传到lucky的安全管理模块。</p><p>如果你遇到一些问题可以直接在日志中去查看什么原因失败，然后接合lucky官方文档的<a href="https://lucky666.cn/docs/modules/ssl">SSL证书模块</a>去排查错误即可。或者是像我一样直接去官方手动申请。</p></blockquote><p><img src="https://bitiful.hudi.space/posts/2025/06/27/FnOS-12.png" alt="image-20250627082503219"></p><p>啰嗦一下zerossl手动创建证书，在Certificates模块点击创建新的证书，Domains：填写所要申请证书的域名。Validity：选择90days。因为免费版本只有90天。Add-Ons：全部默认即可。Encryption Algorithm：默认RSA 2048 (Maximum Compatibility)选项。Finalize Your Order：默认使用免费的。点击下一步之后会验证域名。这里使用DNS(CNAME)的方式去验证。这时zerossl会给出一个<strong>NAME</strong>值和一个<strong>Point To</strong>如下</p><p>Name</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">_305ed2250d13b86bb719d9685ff1338e.tv</span><br></pre></td></tr></table></figure><p>Point To</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">4e75be2a79807b9e211c74247ff292e7.f0d69c69b62a4f51b4dae23beb378e46.062f030c9a70d74.comodoca.com</span><br></pre></td></tr></table></figure><p>在域名解析模块去添加一条记录，如下，然后在验证模块点击验证即可，验证完毕就可以下载证书了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-13.png" alt="image-20250625084425454"></p><p>5、设置反向代理。在Web服务中去添加<strong>Web服务规则</strong>。Web服务规则名称随意填写。<strong>操作模式</strong>默认简易模式，<strong>监听类型</strong>勾选IPV6，监听端口填写未被使用的端口，开启防火墙自动放行。在<strong>Web子规则</strong>中去添加规则。Web服务子规则中，Web服务子规则名称随意填写，子规则开关【启用】，Web服务类型选择【反向代理】，<strong>前端域名&#x2F;地址</strong>即域名访问地址tv.suxichuan.icu，<strong>后端地址</strong>就是LibreTV程序的IP地址和端口就行，其他选项默认。完成这些操作就可以在外网访问飞牛云部署的docker应用程序了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-14.png" alt="image-20250625091609290"></p><blockquote><p>不过这里还是有一个问题就是必须手动输入https。否则浏览器默认还是http，造成无法访问，所以可以在Web规则中去添加新的规则。操作模式选定制模式，监听类型选择IPV4，监听端口和前面的反代端口保持一致，TLS一定要禁用！然后点击”默认子规则”。Web服务类型：选择【重定向】，默认目标地址：填写https:&#x2F;&#x2F;{host}:{port} ，其他的默认。这样直接输入二级域名加端口号就可以直接访问服务了。</p></blockquote><p>实际上，https协议默认的端口为443。但是目前绝大多数家庭宽带80和443端口都是被运营商封闭的，所以只能选择其他端口。</p><h3 id="cloudfare穿透"><a href="#cloudfare穿透" class="headerlink" title="cloudfare穿透"></a>cloudfare穿透</h3><p>1、登录Cloudflarea官网在Zero Trust模块选择Networks，在该栏目中选择Tunnels，点击创建Tunnels。界面如下</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-15.png" alt="image-20250625122134364"></p><p>2、隧道类型选择Cloudflare，然后填入隧道名称(随意)，保存就行。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-16.png" alt="image-20250625122331895"></p><p>3、选择docker部署连接器。然后去飞牛云部署连接器</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiNzQxZDE4YTg5NGZiOTRiOWZjMjIzNzY3MzRkNzBmMjAiLCJ0IjoiYzcxOWYwY2ItYWNjNy00MTM3LTkwNTAtMjAyYmVmOTUwMTRhIiwicyI6Ik9XSmhPVGMzWkdNdFkySXdaaTAwT1RReExUaGxNakl0TXpZeE4yWmhPVEl3WXpJdyJ9</span><br></pre></td></tr></table></figure><p>或者使用docker-compose，注意替换token</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">version: &#x27;3&#x27;</span><br><span class="line">services:</span><br><span class="line">  cloudflared:</span><br><span class="line">    image: cloudflare/cloudflared:latest</span><br><span class="line">    command: tunnel --no-autoupdate run --token eyJhIjoiNzQxZDE4YTg5NGZiOTRiOWZjMjIzNzY3MzRkNzBmMjAiLCJ0IjoiYzcxOWYwY2ItYWNjNy00MTM3LTkwNTAtMjAyYmVmOTUwMTRhIiwicyI6Ik9XSmhPVGMzWkdNdFkySXdaaTAwT1RReExUaGxNakl0TXpZeE4yWmhPVEl3WXpJdyJ9</span><br><span class="line">    restart: unless-stopped</span><br></pre></td></tr></table></figure><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-17.png" alt="image-20250625131156851"></p><p>4、运行成功以后，连接器列表会显示，点击下一步配置子域名如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/25/FnOS-18.png" alt="image-20250625131107155"></p><p>5、完成上述步骤，也可以通过外网去访问飞牛云里的docker程序。</p><h2 id="三、总结"><a href="#三、总结" class="headerlink" title="三、总结"></a>三、总结</h2><p>​飞牛云应用商城还有很多好用的工具可以使用，一个不错的NAS系统，准备后面自己买个小主机去搭建。那个树莓派还不知道要怎么去发挥它的作用。等后面用空再看看，可以怎么去玩吧。</p><p>参考文章：<a href="https://blog.csdn.net/csdnshutdown/article/details/147247379?spm=1001.2014.3001.5506">https://blog.csdn.net/csdnshutdown/article/details/147247379?spm=1001.2014.3001.5506</a></p>]]></content>
    
    
    <summary type="html">本文记录飞牛云NAS搭建过程，其FnOS系统基于Linux开发，支持x86硬件与Docker，功能丰富且部分免费。作者因树莓派架构不兼容，在虚拟机完成部署，详述镜像安装、Web UI配置等步骤，并介绍FN Connect、Lucky、Cloudflare三种内网穿透方案，总结系统灵活性及后续硬件搭建计划。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="容器" scheme="https://www.hudi.space/tags/%E5%AE%B9%E5%99%A8/"/>
    
    <category term="nas" scheme="https://www.hudi.space/tags/nas/"/>
    
  </entry>
  
  <entry>
    <title>kubernetes学习笔记(一)</title>
    <link href="https://www.hudi.space/posts/31f698ea/"/>
    <id>https://www.hudi.space/posts/31f698ea/</id>
    <published>2025-06-20T12:29:58.845Z</published>
    <updated>2025-08-12T02:02:23.763Z</updated>
    
    <content type="html"><![CDATA[<h1 id="kubernetes学习笔记-一"><a href="#kubernetes学习笔记-一" class="headerlink" title="kubernetes学习笔记(一)"></a>kubernetes学习笔记(一)</h1><h2 id="kubernetes简介"><a href="#kubernetes简介" class="headerlink" title="kubernetes简介"></a>kubernetes简介</h2><p>​Kubernetes是Google开源的一个容器编排引擎，它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时，通常要部署该应用的多个实例以便对应用请求进行负载均衡。</p><p>​在Kubernetes中，我们可以创建多个容器，每个容器里面运行一个应用实例，然后通过内置的负载均衡策略，实现对这一组应用实例的管理、发现、访问，而这些细节都不需要运维人员去进行复杂的手工配置和处理。</p><p>官方网站：<a href="https://kubernetes.io/">https://kubernetes.io/</a></p><h2 id="kubernetes特点"><a href="#kubernetes特点" class="headerlink" title="kubernetes特点"></a>kubernetes特点</h2><p><strong>自动化部署和扩展：</strong>Kubernetes可以自动部署容器应用，并根据需要自动扩展或缩减应用实例的数量。</p><p><strong>服务发现和负载均衡</strong>：Kubernetes提供了服务发现机制，使得容器中的应用可以容易地找到彼此并与之通信。同时，它支持内置的负载均衡，可以将流量分发到多个实例。</p><p><strong>存储编排</strong>：Kubernetes支持多种存储系统，包括本地存储、网络存储（如NFS、Ceph等），以及持久卷（Persistent Volumes），使得存储的管理更加灵活和高效。</p><p><strong>自动回滚和自我修复</strong>：如果应用实例失败，Kubernetes可以自动重启它们。此外，它还可以根据定义的策略自动回滚应用版本。</p><p><strong>密钥和配置管理</strong>：Kubernetes支持配置管理，允许应用以环境变量的形式或通过配置文件的方式获取所需的配置信息。此外，它还支持密钥管理，可以安全地存储和管理敏感信息。</p><p><strong>批处理和定时任务</strong>：Kubernetes支持批处理作业和定时任务，可以通过Cron Jobs等功能实现。</p><p><strong>自我修复能力</strong>：Kubernetes能够监控应用的状态，并在节点故障或应用故障时自动采取措施（如重启、替换实例等）。</p><p><strong>可扩展性和灵活性</strong>：Kubernetes架构设计允许它在不同的基础设施上运行（如物理机、虚拟机、公有云、私有云等），具有很高的可扩展性和灵活性。</p><p><strong>社区和生态系统</strong>：Kubernetes拥有一个非常活跃的社区和生态系统，有大量的插件、工具和集成解决方案（如Helm、Istio、Prometheus等），可以满足各种不同的需求。</p><p><strong>安全性</strong>：Kubernetes提供了多层次的安全特性，包括网络策略、角色基础访问控制（RBAC）、密钥管理等，确保容器应用的安全性。</p><h2 id="kubernetes安装"><a href="#kubernetes安装" class="headerlink" title="kubernetes安装"></a>kubernetes安装</h2><blockquote><p>在安装kubernetes之前需要安装docker。这里只提供centos安装方式，其他平台可以看前面<a href="https://www.hudi.space/posts/cdabacca/">docker的学习笔记</a>。</p></blockquote><h3 id="centos官方安装"><a href="#centos官方安装" class="headerlink" title="centos官方安装"></a>centos官方安装</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装一些系统必要的工具</span></span><br><span class="line">sudo yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">添加软件源信息</span></span><br><span class="line">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查/etc/yum.repos.d/docker-ce.repo 中的ur[地址是不是都是阿里云的]</span></span><br><span class="line">vi /etc/yum.repos.d/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果不是，那么把download-stage.docker.com全部替换为mirrors。aliyun.com/docker-ce/</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">更新并安装Docker-CE</span></span><br><span class="line">sudo yum makecache fast</span><br><span class="line">sudo yum -y install docker-ce</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">使用docker version可以看到client端的信息</span></span><br><span class="line">docker version</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">启动服务器再次使用docker version 就可以看到服务器端和客户端的docker信息了</span></span><br><span class="line">systemctl start docker</span><br></pre></td></tr></table></figure><h3 id="kubernetes集群规划"><a href="#kubernetes集群规划" class="headerlink" title="kubernetes集群规划"></a>kubernetes集群规划</h3><p>​这里是使用虚拟机去创建了3个centos7.5的主机。分别为其分配2h2g的资源。按理来说master节点的至少2h4g的资源。work节点至少需要1h2g的资源，但是由于电脑资源有限，所以就为每一个节点包括master节点2h2g的资源。至于磁盘的话20-30G就行了，当然资源肯定是越多越好了，也可以使用阿里云或者是其他云厂商的按需付费的云服务器(抢占式实例)，实例按小时收费那种。做完实验以后就可以回收停止付费，也是一种不错的选择，也还比较便宜。</p><blockquote><p>这不介绍master和work的区别，我认为至少需要把集群搭起来，才能更好的学习kubernetes。</p><p>这里搭建的测试学习环境有太多的主观因素，生产环境配置还请斟酌。</p></blockquote><h4 id="1、基础环境"><a href="#1、基础环境" class="headerlink" title="1、基础环境"></a>1、基础环境</h4><ul><li><p>为每台主机安装kubelet、kubeadm、kubectl</p></li><li><p>节点之中不可以有重复的主机名、MAC 地址或 product_uuid。</p></li><li><p>开启机器上的某些端口</p></li><li><p>禁用交换分区。为了保证 kubelet 正常工作，你必须禁用交换分区。</p></li><li><p>设置防火墙规则、设置不同的hostname、互信</p></li></ul><h4 id="2、虚拟机网络配置"><a href="#2、虚拟机网络配置" class="headerlink" title="2、虚拟机网络配置"></a>2、虚拟机网络配置</h4><p>这里使用NAT模式的网络，为其指定的私网网段是172.31.26.X如下</p><p><img src="https://bitiful.hudi.space/posts/2025/06/20/k8s-01.png" alt="image-20250620191116061"></p><blockquote><p>为master分配IP为172.31.26.3主机域名master，node01的IP为172.31.26.4主机域名node01，node02的IP为172.31.26.5主机域名node02</p></blockquote><p>若是使用云主机以阿里云的ECS为例，可以在一下栏目去创建专有网络，</p><p><img src="https://bitiful.hudi.space/posts/2025/06/20/k8s-02.png" alt="image-20250620191231082"></p><p>在创建专有网络时选择IPV4，网段为172.16.0.0&#x2F;16如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/20/k8s-03.png" alt="image-20250620191521184"></p><p>由于这个172.16.0.0&#x2F;16这个网络范围太大可以有65536-2个主机地址，所以可以通过交换机进一步去划分子网如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/20/k8s-04.png" alt="image-20250620191651168"></p><p>创建实例的时候选择对应得专有网络和交换机即可。</p><h4 id="3、基础环境设置"><a href="#3、基础环境设置" class="headerlink" title="3、基础环境设置"></a>3、基础环境设置</h4><p>设置各个主机自己的主机名</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hostnamectl set-hostname xxxx</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">master节点 hostnamectl set-hostname master</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">work节点hostnamectl set-hostname node01</span></span><br></pre></td></tr></table></figure><p>将 SELinux 设置为 permissive 模式（SELinux仍然监控和记录所有的安全违规事件，但不会强制执行任何拒绝操作。这意味着即使某些操作违反了策略，系统也会允许这些操作继续进行，但是会在日志中记录下来，但是有的教程说是必须把SELinux设置成disabled。有的说是 permissive就行。这里设置成permissive</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo setenforce 0  #临时关闭</span><br><span class="line">sudo vi /etc/selinux/config #修改config如下 需重启电脑生效</span><br><span class="line">SELINUX=permissive</span><br></pre></td></tr></table></figure><p>关闭swap分区，注释&#x2F;etc&#x2F;fstab文件中所有swap分区相关的挂载配置</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">swapoff -a  </span><br><span class="line">sed -ri &#x27;s/.*swap.*/#&amp;/&#x27; /etc/fstab</span><br></pre></td></tr></table></figure><p>允许 iptables 检查桥接流量</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cat &lt;&lt;EOF | sudo tee /etc/modules-load.d/k8s.conf</span><br><span class="line">br_netfilter</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &lt;&lt;EOF | sudo tee /etc/sysctl.d/k8s.conf</span><br><span class="line">net.bridge.bridge-nf-call-ip6tables = 1</span><br><span class="line">net.bridge.bridge-nf-call-iptables = 1</span><br><span class="line">EOF</span><br><span class="line">sudo sysctl --system</span><br></pre></td></tr></table></figure><p>安装kubelet、kubeadm、kubectl，首先添加kubelet的yum源。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">cat &lt;&lt;EOF | sudo tee /etc/yum.repos.d/kubernetes.repo</span><br><span class="line">[kubernetes]</span><br><span class="line">name=Kubernetes</span><br><span class="line">baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64</span><br><span class="line">enabled=1</span><br><span class="line">gpgcheck=0</span><br><span class="line">repo_gpgcheck=0</span><br><span class="line">gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg</span><br><span class="line">   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</span><br><span class="line">exclude=kubelet kubeadm kubectl</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes</span><br><span class="line">systemctl enable --now kubelet</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">使用systemctl status kubelet查看时每隔几秒就会重启，因为它陷入了一个等待 kubeadm 指令的死循环</span></span><br></pre></td></tr></table></figure><p>下载kubelet需要的镜像，这里的镜像地址是我阿里云的容器服务的地址，上面已经有kubelet需要的镜像了，可以直接使用我的，也可以其他。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">sudo tee ./images.sh &lt;&lt;-&#x27;EOF&#x27;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">images=(</span><br><span class="line">kube-apiserver:v1.20.9</span><br><span class="line">kube-proxy:v1.20.9</span><br><span class="line">kube-controller-manager:v1.20.9</span><br><span class="line">kube-scheduler:v1.20.9</span><br><span class="line">coredns:1.7.0</span><br><span class="line">etcd:3.4.13-0</span><br><span class="line">pause:3.2</span><br><span class="line">)</span><br><span class="line">for imageName in $&#123;images[@]&#125; ; do</span><br><span class="line">docker pull registry.cn-hangzhou.aliyuncs.com/sxc-k8s-images/$imageName</span><br><span class="line">done</span><br><span class="line">EOF</span><br><span class="line">   </span><br><span class="line">chmod +x ./images.sh &amp;&amp; ./images.sh</span><br></pre></td></tr></table></figure><p>首先为所有的机器添加主机域名映射如下,这里根据实际情况填写即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/hosts</span><br><span class="line">172.31.26.3 cluster-master</span><br><span class="line">172.31.26.4 node01</span><br><span class="line">172.31.26.5 node02</span><br></pre></td></tr></table></figure><blockquote><p>虚拟机的话可以直接关闭防火墙</p></blockquote><h3 id="kubernetes集群安装"><a href="#kubernetes集群安装" class="headerlink" title="kubernetes集群安装"></a>kubernetes集群安装</h3><h4 id="1、master节点初始化。"><a href="#1、master节点初始化。" class="headerlink" title="1、master节点初始化。"></a>1、master节点初始化。</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在master节点执行以下命令</span></span><br><span class="line">kubeadm init \</span><br><span class="line">--apiserver-advertise-address=172.31.26.3 \ #apiserver的地址。</span><br><span class="line">--control-plane-endpoint=cluster-master \   #主节点的域名。</span><br><span class="line">--image-repository registry.cn-hangzhou.aliyuncs.com/sxc-k8s-images \ #镜像地址</span><br><span class="line">--kubernetes-version v1.20.9 \  #kubernetes-version版本</span><br><span class="line">--service-cidr=10.96.0.0/16 \ #k8s为service所分配的私网IP范围</span><br><span class="line">--pod-network-cidr=192.168.0.0/16 #k8s为pod所分配的私网IP范围</span><br></pre></td></tr></table></figure><blockquote><p>保证所有网络范围不重叠</p></blockquote><p>执行完上诉命令显示如下表示主节点初始化成功。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">出现以下证明master节点初始化成功</span></span><br><span class="line">Your Kubernetes control-plane has initialized successfully!</span><br><span class="line"></span><br><span class="line">To start using your cluster, you need to run the following as a regular user:</span><br><span class="line"><span class="meta prompt_">  #</span><span class="language-bash">执行以下三条命令</span></span><br><span class="line">  mkdir -p $HOME/.kube   </span><br><span class="line">  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config</span><br><span class="line">  sudo chown $(id -u):$(id -g) $HOME/.kube/config</span><br><span class="line"></span><br><span class="line">Alternatively, if you are the root user, you can run:</span><br><span class="line"></span><br><span class="line">  export KUBECONFIG=/etc/kubernetes/admin.conf  #执行该命令</span><br><span class="line"></span><br><span class="line">You should now deploy a pod network to the cluster.</span><br><span class="line">Run &quot;kubectl apply -f [podnetwork].yaml&quot; with one of the options listed at:</span><br><span class="line">  https://kubernetes.io/docs/concepts/cluster-administration/addons/</span><br><span class="line"></span><br><span class="line">You can now join any number of control-plane nodes by copying certificate authorities</span><br><span class="line">and service account keys on each node and then running the following as root:</span><br><span class="line"></span><br><span class="line">  kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \</span><br><span class="line">    --discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8 \</span><br><span class="line">    --control-plane </span><br><span class="line"></span><br><span class="line">Then you can join any number of worker nodes by running the following on each as root:</span><br><span class="line"></span><br><span class="line">kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \</span><br><span class="line">    --discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8</span><br></pre></td></tr></table></figure><h4 id="2、work节点加入"><a href="#2、work节点加入" class="headerlink" title="2、work节点加入"></a>2、work节点加入</h4><p>在node01和node02节点执行以下命令，该信息是由初始化master节点成功后直接给出的。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \</span><br><span class="line">    --discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8</span><br></pre></td></tr></table></figure><h4 id="3、安装网络组件calico"><a href="#3、安装网络组件calico" class="headerlink" title="3、安装网络组件calico"></a>3、安装网络组件calico</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O</span><br><span class="line">kubectl apply -f calico.yaml</span><br></pre></td></tr></table></figure><blockquote><p>该组件是用于节点之间通信的，calico镜像可能会拉取失败可以直接通过docker直接拉取。</p></blockquote><p>网络组件安装好以后通过如下命令去查看pod，有如下信息</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@cluster-master ~]# kubectl get pod -A</span><br><span class="line">NAMESPACE     NAME                                       READY   STATUS                  RESTARTS   AGE</span><br><span class="line">kube-system   calico-kube-controllers-577f77cb5c-pl9gh   1/1     Running                 0          55m</span><br><span class="line">kube-system   calico-node-n9t97                          1/1     Running                 0          55m</span><br><span class="line">kube-system   coredns-584db6f4bf-fhg9z                   1/1     Running                 0          58m</span><br><span class="line">kube-system   coredns-584db6f4bf-fmhkx                   1/1     Running                 0          58m</span><br><span class="line">kube-system   etcd-cluster-master                        1/1     Running                 1          58m</span><br><span class="line">kube-system   kube-apiserver-cluster-master              1/1     Running                 1          58m</span><br><span class="line">kube-system   kube-controller-manager-cluster-master     1/1     Running                 4          58m</span><br><span class="line">kube-system   kube-proxy-l89mb                           1/1     Running                 0          9m40s</span><br><span class="line">kube-system   kube-proxy-pm96g                           1/1     Running                 1          58m</span><br><span class="line">kube-system   kube-proxy-z2lh6                           1/1     Running                 0          10m</span><br><span class="line">kube-system   kube-scheduler-cluster-master              1/1     Running                 3          58m</span><br></pre></td></tr></table></figure><h4 id="4、查看节点是否就绪"><a href="#4、查看节点是否就绪" class="headerlink" title="4、查看节点是否就绪"></a>4、查看节点是否就绪</h4><p>使用以下命令查看，status为Ready表示节点的已经就绪了，若是是有节点挂了，status状态是NotReady。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@cluster-master ~]# kubectl get nodes  </span><br><span class="line">NAME             STATUS   ROLES                  AGE   VERSION</span><br><span class="line">cluster-master   Ready    control-plane,master   67m   v1.20.9</span><br><span class="line">node01           Ready    &lt;none&gt;                 18m   v1.20.9</span><br><span class="line">node02           Ready    &lt;none&gt;     </span><br></pre></td></tr></table></figure><h4 id="5、部署一个DashBoard"><a href="#5、部署一个DashBoard" class="headerlink" title="5、部署一个DashBoard"></a>5、部署一个DashBoard</h4><p>使用yaml配置的方式去快速部署一个bashboard。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O</span><br><span class="line">kubectl apply -f recommended.yaml</span><br></pre></td></tr></table></figure><p>修改访问端口</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将<span class="built_in">type</span>: ClusterIP 改为 <span class="built_in">type</span>: NodePort</span></span><br></pre></td></tr></table></figure><p>查看dashboard运行在哪个端口</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"> kubectl get svc -A |grep kubernetes-dashboard</span><br><span class="line">kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.44.83    &lt;none&gt;        8000/TCP                 7m3s</span><br><span class="line">kubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.250.52   &lt;none&gt;        443:30592/TCP            7m4s</span><br></pre></td></tr></table></figure><blockquote><p>云服务器的记得在安全组开放这个端口，通过集群中任意集群的IP加端口都可以访问。这个端口是随机分配的，根据实际情况为准。</p><p>另外该地址需要通过https方式访问。</p></blockquote><p>创建访问账号，任然是通过yaml的方式去创建</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">root@cluster-master</span> <span class="string">~</span>]<span class="comment"># vi dash.yaml</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kubernetes-dashboard</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">rbac.authorization.k8s.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterRoleBinding</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line"><span class="attr">roleRef:</span></span><br><span class="line">  <span class="attr">apiGroup:</span> <span class="string">rbac.authorization.k8s.io</span></span><br><span class="line">  <span class="attr">kind:</span> <span class="string">ClusterRole</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">cluster-admin</span></span><br><span class="line"><span class="attr">subjects:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kubernetes-dashboard</span></span><br></pre></td></tr></table></figure><p>创建令牌访问</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath=&quot;&#123;.secrets[0].name&#125;&quot;) -o go-template=&quot;&#123;&#123;.data.token | base64decode&#125;&#125;&quot;</span><br></pre></td></tr></table></figure><p>会的到一个token如下，就可以在dashboard中通过token登录了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eyJhbGciOiJSUzI1NiIsImtpZCI6IjVibVBCMTByTjZxcFdkZFlhTFgzV3FtbDdER0xmd1pTelZUN1YwT1pEdUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTl3NndjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxNmYxMDQ3MS00YWVhLTQxMWYtOTM5Yi1mY2JmMGJhNjg4MWIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.aqNjyfbQkTwYKQmT9Uga0rPUfHOH8qDFZyXhGLnmWkTGgfAgESZwJLzXpWcMtEtAQapYY_vehRmHg_cZ0LDTbiHqqsb45gOtjxjuHXSFPV2lDd9Pn2Adeq8ALWOXTwOgHM6xEBjrCCfuT9hdIz1WNfWlSbbb5XugZvM9jhjI6qQ0s2MSkXYP7kb1graeGkgOzaZiM9-qVxoQf0D0wUJIa4yPW-BYlVme_O8ZXArfTss7LgmlAKz14deGbvyY_sKuRJIoZgiojLZtYBu0L1fzci36TXrOckbRlFDpcCf68_CRp0SzI7eyoczxSJ9RxixDKavaqRXMsIeMxHmD8I2TzA</span><br></pre></td></tr></table></figure><p>界面如下，输入token就可以登陆了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/20/k8s-06.png" alt="image-20250620201412863"></p><p>完成上述一个用来学习的kubernetes集群就安装好了。</p><h2 id="kubernetes安装总结"><a href="#kubernetes安装总结" class="headerlink" title="kubernetes安装总结"></a>kubernetes安装总结</h2><p>集群安装常见问题</p><p>1、在安装calico组件是k8s提示Pod出现Init:ImagePullBackOff</p><blockquote><p>出现这个问题的话是镜像拉取失败了，可以通过一下命令查看 pod安装失败的原因</p><p>kubectl  describe pod  pod名字 -n 名称空间</p><p>若是镜像没有拉取成功，可以使用docker手动拉取镜像。一般来说是docker的镜像仓库配置的问题。</p></blockquote><p>2、work节点加入时报错如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error execution phase preflight: couldn&#x27;t validate the identity of the API Server: Get &quot;https://cluster-master:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s&quot;: dial tcp 172.31.26.3:6443: connect: no route to host</span><br></pre></td></tr></table></figure><blockquote><p>存在这个问题的话，虚拟机搭建的集群记得关闭防火墙，若是服务器的话需要在安全组中放行6443端口号。</p><p>systemctl disable firewalld –now</p><p>setenforce 0</p><p>还有可能是token过期了，重新获取token</p><p>kubeadm token create –print-join-command</p></blockquote><p>3、在访问dashboard时页面提示</p><p>您的连接不是私密连接</p><p>攻击者可能会试图从 <strong>172.31.26.3</strong> 窃取您的信息（例如：密码、消息或信用卡信息）。详细了解此警告</p><blockquote><p>方法一：添加到Chrome快捷方式标志 –ignore-certificate-errors ，然后重新打开并浏览到您的网站。在快捷方式的目标栏目的后面添加上述</p><p>方法二：当查看“您的连接不是私密”屏幕时：输入 thisisunsafe，当Chrome不允许通过点击设置例外时，例如对于此HSTS案例，这将允许安全例外。(亲测有效)</p></blockquote><p>​完成上面的步骤，就可以搭建一个学习测试的kubernetes集群了。其实很早就接触了这个东西，但是一直没去学习，这次就准备好好的去学习一下。</p>]]></content>
    
    
    <summary type="html">本文为Kubernetes入门学习笔记，涵盖核心概念、特点及CentOS环境下的集群搭建流程。Kubernetes是Google开源的容器编排引擎，具备自动化部署、服务发现与负载均衡、存储编排、自我修复等特性，支持多环境部署与丰富的生态工具。安装部分详细介绍了CentOS系统中通过kubeadm搭建三节点集群的步骤，包括基础环境配置、网络规划、master节点初始化、work节点加入，以及Calico网络组件和Dashboard可视化界面的部署。最后总结了安装中常见的镜像拉取失败、节点连接异常等问题及解决方案，为初学者提供了完整的入门实践指南。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="运维" scheme="https://www.hudi.space/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="容器" scheme="https://www.hudi.space/tags/%E5%AE%B9%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>SSH免密登录</title>
    <link href="https://www.hudi.space/posts/baa1a241/"/>
    <id>https://www.hudi.space/posts/baa1a241/</id>
    <published>2025-06-03T12:26:58.856Z</published>
    <updated>2025-08-12T02:02:23.770Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前置条件"><a href="#一、前置条件" class="headerlink" title="一、前置条件"></a>一、前置条件</h2><p>​需要使用两台虚拟机，并且在同一个网段下，才能实现免密登录。实验使用192.168.254.X网段，为两台虚拟机分别配置静态IP为192.168.254.28和192.168.254.29。分别使用主机名test001和test002。配置步骤如下。</p><p>1、在修改虚拟机的网络配置信息时需要配置前，需要查看VM虚拟网络编辑器，编辑-&gt;虚拟网络编辑器-&gt;VMnet8。当然也可以自行选择虚拟网卡，或者是直接添加一个虚拟网络。我的虚拟机VMnet8信息如下</p><p><img src="https://bitiful.hudi.space/posts/2025/06/03/image-01.png" alt="image-20250603190718977"></p><blockquote><p>确保虚拟机能够使用虚拟网卡即可。</p></blockquote><p>2、修改虚拟机的为静态IP</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens33</span><br></pre></td></tr></table></figure><p>以其中一台主机为例修改信息如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">TYPE=Ethernet</span><br><span class="line">PROXY_METHOD=none</span><br><span class="line">BROWSER_ONLY=yes</span><br><span class="line">BOOTPROTO=static  #修改为静态IP</span><br><span class="line">DEFROUTE=yes</span><br><span class="line">IPV4_FAILURE_FATAL=no</span><br><span class="line">NAME=ens33</span><br><span class="line">DEVICE=ens33</span><br><span class="line">ONBOOT=yes</span><br><span class="line">IPADDR=192.168.254.29 #自行分配一个IP。控制好IP的范围即可</span><br><span class="line">GATEWAY=192.168.254.1</span><br></pre></td></tr></table></figure><p>3、修改虚拟机的主机名</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hostnamectl --static set-hostname 主机名</span><br><span class="line">#例如：hostnamectl --static set-hostname test002</span><br><span class="line">或者是在/etc/hostname文件中添加</span><br><span class="line">test002</span><br></pre></td></tr></table></figure><p>4、配置其他虚拟机主机名称映射hosts文件，在&#x2F;etc&#x2F;hosts文件中添加以下信息</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">192.168.254.28 test001</span><br><span class="line">192.168.254.29 test002</span><br></pre></td></tr></table></figure><blockquote><p>192.168.254.28这台虚拟机也是相同的配置，只需要注意主机名应该是test001。&#x2F;etc&#x2F;hosts的IP和主机名需要对应配置。</p></blockquote><h2 id="二、免密登录"><a href="#二、免密登录" class="headerlink" title="二、免密登录"></a>二、免密登录</h2><p>1、基本语法</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh 另一台虚拟机的IP或者是主机名</span><br><span class="line">#例如在192.168.254.28虚拟机上登录192.168.254.29</span><br></pre></td></tr></table></figure><p>输入ssh 192.168.254.29或者是ssh test002以后出现一下信息，在输入yes和密码后显示登录成功。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">(base) [root@test001 ~]# ssh test002</span><br><span class="line">The authenticity of host &#x27;test002 (192.168.254.29)&#x27; can&#x27;t be established.</span><br><span class="line">ECDSA key fingerprint is SHA256:rRiA8fosNYtYf/JZ4nzkKcgvxBVtQqJkjeyjiyxJutg.</span><br><span class="line">ECDSA key fingerprint is MD5:ae:e6:d2:fd:f7:31:d2:7e:c7:61:87:c2:83:93:9c:63.</span><br><span class="line">Are you sure you want to continue connecting (yes/no)? yes</span><br><span class="line">Warning: Permanently added &#x27;test002,192.168.254.29&#x27; (ECDSA) to the list of known hosts.</span><br><span class="line">root@test002&#x27;s password: </span><br><span class="line">Last login: Tue Jun  3 07:21:35 2025 from 192.168.254.2</span><br><span class="line">(base) [root@test002 ~]#</span><br></pre></td></tr></table></figure><p>2、免密登录原理</p><ul><li><p>在A虚拟机使用ssh-key-gen生成秘钥对即公钥和私钥。</p></li><li><p>将A虚拟机生成的公钥拷贝给B虚拟机。</p></li><li><p>A虚拟机通过ssh访问B虚拟机的时候，数据使用A的私钥加密。</p></li><li><p>B虚拟机收到数据以后，去授权的key中找到A的公钥，对数据解密。</p></li><li><p>B虚拟机使用A的公钥加密数据返回给A虚拟机。</p></li><li><p>A虚拟机接受到数据后，用A虚拟机的私钥解密数据。</p></li></ul><p>通过以上步骤就可以使通信双方确认身份，也就可以实现免密登录了。</p><p><img src="https://bitiful.hudi.space/posts/2025/06/03/image-02.png" alt="image-20250603200905606"></p><p>3、生成公钥私钥</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure><p>连续敲三次回车即可，就会生成公钥和私钥了。id_rsa(私钥)，id_rsa.pub（公钥）。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file in which to save the key (/root/.ssh/id_rsa): </span><br><span class="line">Enter passphrase (empty for no passphrase): </span><br><span class="line">Enter same passphrase again: </span><br><span class="line">Your identification has been saved in /root/.ssh/id_rsa.</span><br><span class="line">Your public key has been saved in /root/.ssh/id_rsa.pub.</span><br><span class="line">The key fingerprint is:</span><br><span class="line">SHA256:AWsqE9PU19WrU09tDR6I+qBOCfNwFHcCQaFNBpEpPh4 root@test001</span><br><span class="line">The key&#x27;s randomart image is:</span><br><span class="line">+---[RSA 2048]----+</span><br><span class="line">|    +BX=o..o.o   |</span><br><span class="line">|  .oo=o+.oo . +  |</span><br><span class="line">| .o.o.+...   . +o|</span><br><span class="line">|  Eo+o. o.    + =|</span><br><span class="line">| .oo.* oSo   o + |</span><br><span class="line">|  .o  =   . o   .|</span><br><span class="line">|     o       .   |</span><br><span class="line">|      .          |</span><br><span class="line">|                 |</span><br><span class="line">+----[SHA256]-----+</span><br></pre></td></tr></table></figure><blockquote><p>生成的公钥和私钥是在&#x2F;root&#x2F;.ssh目录下如下</p><p>(base) [root@test001 ~]# cd .ssh<br>(base) [root@test001 .ssh]# ls<br>id_rsa  id_rsa.pub  known_hosts</p></blockquote><p>4、拷贝公钥到test002虚拟机上</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id test002</span><br></pre></td></tr></table></figure><p>拷贝时需要输入test002的密码，输入即可如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">(base) [root@test001 .ssh]# ssh-copy-id test002</span><br><span class="line">/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/root/.ssh/id_rsa.pub&quot;</span><br><span class="line">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed</span><br><span class="line">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys</span><br><span class="line">root@test002&#x27;s password: </span><br><span class="line"></span><br><span class="line">Number of key(s) added: 1</span><br><span class="line">Now try logging into the machine, with:   &quot;ssh &#x27;test002&#x27;&quot;</span><br><span class="line">and check to make sure that only the key(s) you wanted were added.</span><br></pre></td></tr></table></figure><p>5、.ssh文件夹下子文件介绍</p><table><thead><tr><th>文件名称</th><th>含义</th></tr></thead><tbody><tr><td>id_rsa</td><td>生成的私钥</td></tr><tr><td>id_rsa.pub</td><td>生成的公钥</td></tr><tr><td>authorized_keys</td><td>存放授权过的无密登录主机的公钥</td></tr><tr><td>known_hosts</td><td>记录ssh访问过主机的公钥(public key)</td></tr></tbody></table><p>6、然后使用ssh test002就可以免密登录了</p>]]></content>
    
    
    <summary type="html">梳理思路、加深记忆，便于复盘知识，为学习工作积累经验与灵感。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="运维" scheme="https://www.hudi.space/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="ssh" scheme="https://www.hudi.space/tags/ssh/"/>
    
  </entry>
  
  <entry>
    <title>UV和Mamba包管理工具</title>
    <link href="https://www.hudi.space/posts/b60b70cc/"/>
    <id>https://www.hudi.space/posts/b60b70cc/</id>
    <published>2025-05-21T03:13:45.937Z</published>
    <updated>2025-08-12T02:02:23.852Z</updated>
    
    <content type="html"><![CDATA[<h1 id="UV和Mamba包管理工具"><a href="#UV和Mamba包管理工具" class="headerlink" title="UV和Mamba包管理工具"></a>UV和Mamba包管理工具</h1><p>​最近看朋友写的文章提到UV，UV这个最开始我是以为是User Visit的缩写，是指用户访问网站的行为，结果后来才知道，Python有一款包管理工具也叫这个名字。还有这个Mamba也是最新才发现的，在dy也是看到过次。最近才了解到Python的一个包管理器也叫这个名字。目前我自己在用的是pip和conda。所以就试试看。</p><h2 id="一、UV"><a href="#一、UV" class="headerlink" title="一、UV"></a>一、UV</h2><h3 id="1、关于UV"><a href="#1、关于UV" class="headerlink" title="1、关于UV"></a>1、关于UV</h3><p>UV是一款极其快的Python包管理工具，是由rust语言开发的。旨在替代传统的 <code>pip</code>、<code>pip-tools</code>、<code>virtualenv</code> 等工具。有以下亮点。</p><ul><li>提供更快的依赖解析和安装速度（比 <code>pip</code> 快 10-100 倍）</li><li>提供全面的项目管理，具有通用的锁文件</li><li>运行脚本，支持内联依赖元数据</li><li>安装和管理Python的版本</li><li>包括一个pip兼容接口，可通过熟悉的CLI提高性能。</li><li>支持可扩展项目的Cargo风格工作区。</li><li>无需Rust或Python即可通过curl或pip安装。</li></ul><p>官方网站：<a href="https://docs.astral.sh/uv/">https://docs.astral.sh/uv/</a></p><p>github地址：<a href="https://github.com/astral-sh/uv">https://github.com/astral-sh/uv</a></p><h3 id="2、UV安装"><a href="#2、UV安装" class="headerlink" title="2、UV安装"></a>2、UV安装</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">mac和linux</button><button type="button" class="tab">window</button></div><div class="tab-contents"><div class="tab-item-content active"><p>官方的推荐方式是直接运行安装脚本进行安装</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br><span class="line"><span class="comment">#如果系统中没有curl命令，可以使用wget</span></span><br><span class="line">wget -qO- https://astral.sh/uv/install.sh | sh</span><br><span class="line"><span class="comment">#需要指定UV的版本可以使用一下命令</span></span><br><span class="line">curl -LsSf https://astral.sh/uv/0.6.17/install.sh | sh</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><p>window 操作系统使用powershell去安装</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">powershell -ExecutionPolicy ByPass -c <span class="string">&quot;irm https://astral.sh/uv/install.ps1 | iex&quot;</span></span><br><span class="line"><span class="comment">#安装指定版本使用如下命令</span></span><br><span class="line">powershell -ExecutionPolicy ByPass -c <span class="string">&quot;irm https://astral.sh/uv/0.6.17/install.ps1 | iex&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p>尽量使用管理员身份去运行powershell，不然可能导致命令运行失败。</p></blockquote></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><p>安装完成后输入一下命令来验证是否成功</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv --version</span><br></pre></td></tr></table></figure><h3 id="3、UV使用"><a href="#3、UV使用" class="headerlink" title="3、UV使用"></a>3、UV使用</h3><h4 id="Python版本"><a href="#Python版本" class="headerlink" title="Python版本"></a>Python版本</h4><p>UV安装Python可以在各版本之间切换。可以使用uv的二级子命令去对Python的版本进行管理，有以下相关子命令</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Commands:</span><br><span class="line">  list       #显示左右可以安装的Python版本</span><br><span class="line">  install    #安装一个Python版本</span><br><span class="line">  find       #搜索一个Python版本</span><br><span class="line">  pin        #指定一个本地Python的版本到uv中</span><br><span class="line">  dir        #显示uv下载的Python版本所在的目录</span><br><span class="line">  uninstall  #卸载一个Python版本</span><br></pre></td></tr></table></figure><p>如果需要安装多个Python版本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv python install <span class="number">3.10</span> <span class="number">3.11</span></span><br></pre></td></tr></table></figure><p>卸载python版本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv python uninstall 3.11</span><br></pre></td></tr></table></figure><p>在当前文件夹使用指定 Python 版本：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ uv python pin 3.11</span><br><span class="line">Pinned `.python-version` to `3.11`</span><br></pre></td></tr></table></figure><p>uv可以缓存多个python解析的版本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv python <span class="built_in">list</span></span><br></pre></td></tr></table></figure><h4 id="项目管理"><a href="#项目管理" class="headerlink" title="项目管理"></a>项目管理</h4><p>直接使用uv init 命令就可以去创建一个基于uv管理的新项目。二级命令如下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Options:</span><br><span class="line">  --name &lt;NAME&gt;                    #项目的名字</span><br><span class="line">  --bare                           #仅创建一个配置文件</span><br><span class="line">  --package                        #将要构建的项目设置为Python包</span><br><span class="line">  --no-package                     #不为构建的项目设置为Python包</span><br><span class="line">  --app                            #为项目创建一个应用程序</span><br><span class="line">  --script                         #创建一个脚本</span><br><span class="line">  --description &lt;DESCRIPTION&gt;      #设置一个项目描述</span><br><span class="line">  --no-description                 #不需要项目描述</span><br><span class="line">  --vcs &lt;VCS&gt;                      #为项目初始化一个版本控制系统[possible values: git, none]</span><br><span class="line">  --build-backend &lt;BUILD_BACKEND&gt;  #为项目初始化所选的构建后端[possible values: hatch, flit, pdm, poetry, setuptools, maturin, scikit]</span><br><span class="line">  --no-readme                      #不去创建readme文件</span><br><span class="line">  --author-from &lt;AUTHOR_FROM&gt;      #填写作者信息到配置文件中[possible values: auto, git, none]</span><br><span class="line">  --no-pin-python                  #不为项目创建`.python-version`文件</span><br><span class="line">  --no-workspace                   #避免工作区冲突，会创建独立的工作区</span><br></pre></td></tr></table></figure><p>使用init去初始化一个项目</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">uv init hello-world</span><br><span class="line">uv工程默认会生成4个文件：</span><br><span class="line">.python-version：记录当前工程的Python版本。</span><br><span class="line">main.py：主脚本。</span><br><span class="line">pyproject.toml：记录当前uv工程的依赖情况。</span><br><span class="line">README.md：工程的说明文件。</span><br></pre></td></tr></table></figure><p>可以在创建工程的时候直接指定python解析的版本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv init test -p <span class="number">3.11</span></span><br></pre></td></tr></table></figure><p>激活虚拟环境</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.venv\Scripts\activate</span><br></pre></td></tr></table></figure><h4 id="库管理"><a href="#库管理" class="headerlink" title="库管理"></a>库管理</h4><p>下载第三方的库可以使用</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv add pandas</span><br></pre></td></tr></table></figure><p>移除某个库</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv remove pandas</span><br></pre></td></tr></table></figure><p>查看虚拟环境中的环境依赖树</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv tree</span><br></pre></td></tr></table></figure><p>也可以通过uv pip去下载三方库</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip install pandas</span><br></pre></td></tr></table></figure><p>注：通过uv pip安装的库，需要通过uv pip list去查看</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip list</span><br></pre></td></tr></table></figure><blockquote><p>使用uv pip安装的第三方库是不会记录在pyproject.toml文件中的。</p></blockquote><p>在使用别人的工程项目时可以一键克隆别人的环境</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv sync</span><br></pre></td></tr></table></figure><h2 id="二、Mamba"><a href="#二、Mamba" class="headerlink" title="二、Mamba"></a>二、Mamba</h2><h3 id="1、关于Mamba"><a href="#1、关于Mamba" class="headerlink" title="1、关于Mamba"></a>1、关于Mamba</h3><p>​Mamba 是一个用 C++ 重新实现的 Conda 包管理器。它旨在提供比传统 Conda 更快的包管理和依赖解析速度。Mamba 的核心部分使用 C++ 编写，以确保高效性和性能。同时，Mamba 也使用了 Python 和其他一些辅助语言来实现其功能。</p><p>官方地址：<a href="https://mamba.readthedocs.io/">https://mamba.readthedocs.io/</a></p><p>github地址：<a href="https://github.com/mamba-org/mamba">https://github.com/mamba-org/mamba</a></p><blockquote><p>使用了一段时间个人感觉还不错。</p></blockquote><h3 id="2、Mamba安装"><a href="#2、Mamba安装" class="headerlink" title="2、Mamba安装"></a>2、Mamba安装</h3><p>​因为这些工具基本都在国外的网站上。uv安装也是，挺慢的，所以这里的mamba的安装我们直接使用国内的镜像去安装。mamba官方是提供了安装脚本去安装，这里就不在去使用脚本，直接用国内镜像比较快速。</p><p>安装最新的 Mamba，建议通过安装 Miniforge 来实现，因为 Miniforge 默认包含 Mamba。</p><p>miniforge的github地址：<a href="https://github.com/conda-forge/miniforge%E3%80%82">https://github.com/conda-forge/miniforge。</a></p><p>miniforge下载南京大学镜像：<a href="https://mirror.nju.edu.cn/github-release/conda-forge/miniforge/LatestRelease/%E3%80%82%E4%B8%8B%E8%BD%BD%E5%AF%B9%E5%BA%94%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%89%E8%A3%85%E5%8C%85%E5%8D%B3%E5%8F%AF%E3%80%82">https://mirror.nju.edu.cn/github-release/conda-forge/miniforge/LatestRelease/。下载对应操作系统的安装包即可。</a></p><p>miniforge不仅包括 Mamba，还包括 Python、conda 和其他工具，适合数据科学项目。</p><blockquote><p>如果已有 Anaconda，建议先卸载，以避免渠道冲突。</p></blockquote><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">window安装mamba</button><button type="button" class="tab">Linux安装mamba</button></div><div class="tab-contents"><div class="tab-item-content active"><p>这里以window操作系统为例，选择x86的exe文件直接下载安装即可</p><p><img src="https://bitiful.hudi.space/posts/2025/04/30/UV_MAMBA_01.png" alt="image-20250430153514546"></p><blockquote><p>在安装的时候尽量不要选择C盘，因为后面这个文件目录会越来越大。</p><p>安装成功之后，需要把mamba的安装目录的bin文件目录和script目录添加到系统的环境变量中方便后续在命令行直接使用。</p></blockquote></div><div class="tab-item-content"><p>1、下载miniforge的Linux安装脚本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -qO- https://mirror.nju.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-25.3.0-1-Linux-x86_64.sh</span><br></pre></td></tr></table></figure><p>或者是直接去镜像站下载Linux版本的安装脚本，如下。</p><p><img src="https://bitiful.hudi.space/posts/2025/04/30/UV_MAMBA_02.png" alt="image-20250430162752594"></p><p>2、给脚本赋予可执行权限</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x Miniforge3-25.3.0-1-Linux-x86_64.sh</span><br></pre></td></tr></table></figure><p>3、执行安装脚本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh Miniforge3-25.3.0-1-Linux-x86_64.sh</span><br></pre></td></tr></table></figure><p>根据提示进行安装即可。</p><p>4、验证安装是否成功，运行一下命令，出现mamba的版本信息就安装成功了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba info</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="3、Mamba使用"><a href="#3、Mamba使用" class="headerlink" title="3、Mamba使用"></a>3、Mamba使用</h3><p>创建和激活一个虚拟环境。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba create -n test python=3.9</span><br></pre></td></tr></table></figure><p>激活环境</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba activate test</span><br></pre></td></tr></table></figure><p>退出当前激活的环境</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">deactivate</span><br></pre></td></tr></table></figure><p>安装软件包</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba install 包名</span><br></pre></td></tr></table></figure><p>查看当前环境中已经安装的包</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba list</span><br></pre></td></tr></table></figure><p>查看环境信息</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mamba info --envs</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">最近看朋友写的文章提到UV，UV这个最开始我是以为是User Visit的缩写，是指用户访问网站的行为，结果后来才知道，Python有一款包管理工具也叫这个名字。还有这个Mamba也是最新才发现的，在dy也是看到过次。最近才了解到Python的一个包管理器也叫这个名字。目前我自己在用的是pip和conda。所以就试试看。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Python" scheme="https://www.hudi.space/tags/Python/"/>
    
    <category term="包管理工具" scheme="https://www.hudi.space/tags/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>消息摘要(Message Digest)</title>
    <link href="https://www.hudi.space/posts/aeb53373/"/>
    <id>https://www.hudi.space/posts/aeb53373/</id>
    <published>2025-03-31T03:40:42.164Z</published>
    <updated>2025-08-12T02:02:23.877Z</updated>
    
    <content type="html"><![CDATA[<h1 id="消息摘要"><a href="#消息摘要" class="headerlink" title="消息摘要"></a>消息摘要</h1><p>​最开始本来是想写一篇关于信息去重的文章，想把这些去重方案归集一下，但是因为最近很忙，所以来不及去写相关的笔记，正巧又在看hash函数和信息摘要的文章，所以就勉强写了这篇笔记。</p><h2 id="一、基础概念"><a href="#一、基础概念" class="headerlink" title="一、基础概念"></a>一、基础概念</h2><p>​消息摘要（数字摘要）是密码学中用于验证数据完整性和真实性的核心技术。通过哈希函数（如MD5、SHA系列）将任意长度的输入转换为固定长度的唯一字符串，又称hash值，单向hash函数用于产生消息摘要，具有不可逆性，无法通过摘要反推原始数据‌。</p><p>hash函数主要解决一下问题：</p><p>1、在一特定的时间内，无法查找经hash函数操作后生成特定hash值的原报文信息。也无法查找两个经hash操作后生成相同hash值的不同报文。</p><p>2、在数字签名中可以解决验证签名和用户身份验证、不可抵赖性的问题。</p><p>特点：</p><blockquote><p>消息摘要简要地描述了一份较长的信息或文件，它可以被看作一份长文件的“数字指纹”。</p><p>对于特定的信息或者是文件而言，计算出来的消息摘要的长度总是固定且唯一的。（如MD5为128位，SHA-256为256位）‌</p><p>不同输入必然产生不同摘要，相同输入始终生成相同结果，且极难找到两个不同输入生成相同摘要‌。</p><p>消息摘要是单向的和不可逆的，无法通过摘要逆向推导原始数据‌。</p></blockquote><h2 id="二、常见算法及演进"><a href="#二、常见算法及演进" class="headerlink" title="二、常见算法及演进"></a>二、常见算法及演进</h2><p>1、MD5(Message-Digest Algorithm 5)是一种广泛使用的加密散列函数，可以将任意长度的数据转化为一个128位的哈希值。</p><p>2、SHA（Secure Hash Algorithm）系列包括SHA-1、SHA-256、SHA-3等。</p><table><thead><tr><th>算法</th><th>输出长度</th><th>安全性现状</th><th>典型应用场景</th></tr></thead><tbody><tr><td>MD5</td><td>128位</td><td>已不安全（易碰撞）</td><td>遗留系统校验</td></tr><tr><td>SHA-1</td><td>160位</td><td>被破解（理论层面）</td><td>逐步淘汰中</td></tr><tr><td>SHA-256</td><td>256位</td><td>当前安全</td><td>区块链、数字证书</td></tr><tr><td>SHA-3</td><td>可变长</td><td>新一代安全标准</td><td>高安全需求领域</td></tr></tbody></table><p>注意：hash算法得出的结果本质上是一串数值，如MD5的128位是指二进制的长度，16进制的长度是32位。</p><p>在选择哈希算法时，需结合安全性、性能、用途及标准化等多维度评估。</p><h2 id="三、核心应用场景"><a href="#三、核心应用场景" class="headerlink" title="三、核心应用场景"></a>三、核心应用场景</h2><p>1、数据完整性验证</p><p>通过对比传输前后数据的摘要值，判断是否被篡改(如文件下载校验、数据库备份验证)。</p><p>2、数字签名</p><p>对消息摘要进行加密形成签名，接收方解密后比对摘要验证身份和内容真实性(如SSL&#x2F;TLS证书)。</p><p>数字签名主要一下几个步骤：</p><p>(1)、信息发送者使用一个单向散列函数(Hash 函数)对信息生成信息摘要<br>(2)、信息发送者使用自己的私钥签名信息摘要。<br>(3)、信息发送者把信息本身和已签名的信息摘要一起发送出去。<br>(4)、信息接收者通过使用与信息发送者使用的同一个单向散列函数(Hash 函数)对接收的信息本身生成新的信息摘要，再使用信息发送者的公钥对信息摘要进行验证，以确认信息发送者的身份和信息是否被修改过。</p><p>数字加密主要经过以下几个过程:<br>(1)、当信息发送者需要发送信息时，首先生成一个对称密钥，用该对称密钥加密要发送的报文。<br>(2)、信息发送者用信息接收者的公钥加密上述对称密钥。<br>(3)、信息发送者将第(1)步和第(2)步的结果结合在一起传给信息接收者，称为数字信封。<br>(4)、信息接收者使用自己的私钥解密被加密的对称密钥，再用此对称密钥解密被发送方加密的密文，得到真正的原文。</p><blockquote><p>​数字签名和数字加密的过程虽然都使用公开密钥体系，但实现的过程正好相反，使用的密钥对也不同。数字签名使用的是发送方的密钥对，发送方用自己的私有密钥进行加密，接收方用发送方的公开密钥进行解密，这是一个一对多的关系，任何拥有发送方公开密钥的人都可以验证数字签名的正确性。数字加密则使用的是接收方的密钥对，这是多对一的关系，任何知道接收方公开密钥的人都可以向接收方发送加密信息，只有唯一拥有接收方私有密钥的人才能对信息解密。另外，数字签名只采用了非对称密钥加密算法，它能保证发送信息的完整性、身份认证和不可否认性;而数字加密采用了对称密钥加密算法和非对称密钥加密算法相结合的方法，它能保证发送信息的保密性。</p></blockquote><p>3、‌密码安全存储</p><p>存储用户密码的摘要而非明文，即使数据库泄露也无法直接获取原始密码‌。可以防止用户信息被非法盗取。</p><p>4、快速数据比对</p><p>​利用摘要固定长度特性，快速判断大规模数据集是否重复（如云存储去重）‌。也可以使用在爬虫领域，对全站的爬取时可以对请求的URL链接进行去重。利用信息摘要算法可以大幅度降低去重容器的存储空间使用率，并提高判断速度。由于其强唯一性的特点，几乎不存在误判。</p><blockquote><p>大量文本数据如新闻，文章等时，可以使用相似文本去重。</p></blockquote><h2 id="四、案例"><a href="#四、案例" class="headerlink" title="四、案例"></a>四、案例</h2><p>案例通过Python代码去生成信息摘要。</p><p>1、通过MD5函数去生成指定文本的消息摘要</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> md5</span><br><span class="line">md=md5()</span><br><span class="line">md.update(<span class="string">&quot;消息摘要简要地描述了一份较长的信息或文件，它可以被看作一份长文件的“数字指纹”。&quot;</span>.encode())</span><br><span class="line">hex_num=md.hexdigest()</span><br><span class="line"><span class="built_in">print</span>(hex_num)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">len</span>(hex_num))</span><br><span class="line"></span><br><span class="line"><span class="comment">#结果：</span></span><br><span class="line"><span class="comment">#1daebd5ddf5efb4c6ecf2b97c8045b07</span></span><br><span class="line"><span class="comment">#32</span></span><br></pre></td></tr></table></figure><p>通过结果可以看出是一个32位的16进制信息。由于一位16进制可以转化为4位2进制。所以32*4&#x3D;128位二进制数据。</p><p>2、通过sha3_256函数去生成<strong>SHA-256</strong>的信息摘要</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha3_256</span><br><span class="line">sha3_obj=sha3_256()</span><br><span class="line">sha3_obj.update(<span class="string">&quot;消息摘要简要地描述了一份较长的信息或文件，它可以被看作一份长文件的“数字指纹”。&quot;</span>.encode())</span><br><span class="line">hex_num=sha3_obj.hexdigest()</span><br><span class="line"><span class="built_in">print</span>(hex_num)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">len</span>(hex_num))</span><br><span class="line"><span class="comment">#结果：</span></span><br><span class="line"><span class="comment">#f8293734fd529da436a893963a72b56fe5565a62517b73795cfade66fc5ea54d</span></span><br><span class="line"><span class="comment">#64</span></span><br></pre></td></tr></table></figure><p>同样的会得到64位的16进制数。64*4&#x3D;256位。</p>]]></content>
    
    
    <summary type="html">消息摘要是密码学技术，用哈希函数生成固定长度、唯一的 hash 值，单向不可逆。常见算法有 MD5、SHA 系列，安全性各有不同。应用于数据完整性验证、数字签名、密码存储、快速数据比对等场景。</summary>
    
    
    
    <category term="学习笔记" scheme="https://www.hudi.space/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="密码学" scheme="https://www.hudi.space/tags/%E5%AF%86%E7%A0%81%E5%AD%A6/"/>
    
    <category term="加密" scheme="https://www.hudi.space/tags/%E5%8A%A0%E5%AF%86/"/>
    
  </entry>
  
</feed>
