<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>豆子内网管家 on 豆子技术站</title><link>https://blog.91demo.top/categories/%E8%B1%86%E5%AD%90%E5%86%85%E7%BD%91%E7%AE%A1%E5%AE%B6/</link><description>Recent content in 豆子内网管家 on 豆子技术站</description><generator>Hugo -- 0.155.1</generator><language>zh-cn</language><lastBuildDate>Thu, 15 Jan 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://blog.91demo.top/categories/%E8%B1%86%E5%AD%90%E5%86%85%E7%BD%91%E7%AE%A1%E5%AE%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>基于 Dufs + Mole-go (FRP) 快速搭建高效的内网穿透开发演示环境</title><link>https://blog.91demo.top/mole-devenv/</link><pubDate>Thu, 15 Jan 2026 18:00:00 +0800</pubDate><guid>https://blog.91demo.top/mole-devenv/</guid><description>&lt;p&gt;最近开发完 Mole-go，想给它做个网站用来展示和下载。但我这个后端糙汉子，样式真搞不定，求助 AI 调了半天还是差点意思。最头疼的是，手机端调试得一遍遍输 IP，给朋友演示也得发一串 IP 端口，太不专业了！于是我一顿折腾，搞出了这套方案……&lt;/p&gt;
&lt;p&gt;为了解决这些痛点，我摸索出了一套“黄金组合”：Dufs + Mole-go + FRP + Caddy。这套方案打通了从本地到公网域名的全链路，实现了自动 HTTPS、域名访问以及极致的访问体验。&lt;/p&gt;
&lt;h2 id="第一步构建本地内容基石dufs"&gt;第一步：构建本地内容基石（Dufs）&lt;/h2&gt;
&lt;p&gt;一切的起点是本地文件服务。我选择使用 Dufs 作为静态文件服务器。它极其轻量，支持上传、搜索、打包下载甚至 WebDAV，是我演示 Web 应用或分发安装包的首选。&lt;/p&gt;
&lt;p&gt;通过下面简单的命令，就能在本地 5000 端口启动了静态文件及Web服务。虽然此时它还被“困”在局域网内，但它为后续的展示提供了稳固的基础。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dufs.exe --render-index
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们这个时候将HTML文件放在启动命令时所在文件夹下就可以了。&lt;/p&gt;
&lt;h2 id="第二步突破局域网束缚frp-与-mole-go"&gt;第二步：突破局域网束缚（FRP 与 Mole-go）&lt;/h2&gt;
&lt;p&gt;为了让公网流量能顺利精准触达内网，我采用了经典的 FRP 方案，但在客户端层面，我使用了自己开发的 Mole-go。它需要以下几部分配合，注意，像FRP Server部署一次就可以一直使用了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;服务端 (FRP Server)：部署在具备公网 IP 的云服务器上，充当流量中转站。这个服务器配置可以很低，因为网站服务在本地电脑，即使本地有数据库，也是消耗的本地主机资源，如果仅作为演示，带宽1MB就可以，这样在公网就可以访问了，非常方便远程调试。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;客户端 (Mole-go)：这是我为 FRP 打造的桌面管理客户端。它封装了 frpc 核心，不仅提供了直观的 UI，还通过系统托盘设计彻底解决了“关闭窗口即断连”的痛点。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用 Mole-go，我可以将本地 5000 端口通过加密隧道安全地映射到云端。它出色的资源管理和连接稳定性，确保了演示过程中即便网络波动，链接依然稳固如初。它的下载地址：&lt;a href="https://91demo.top/tools/"&gt;https://91demo.top/tools/&lt;/a&gt;，中文名称是豆子内网管家。&lt;/p&gt;
&lt;h2 id="第三步优雅的网关入口caddy"&gt;第三步：优雅的网关入口（Caddy）&lt;/h2&gt;
&lt;p&gt;即便流量已到达公网，我也不希望朋友们通过 http://IP:端口 这种生硬的方式访问。我追求的是“域名+HTTPS”的专业感，这不仅是为了美观，更是为了开发环境需求，比如公众号开发，小程序后端服务等必须 HTTPS 环境。仅需配置一次就可以一直使用了。&lt;/p&gt;
&lt;p&gt;我选择了 Caddy 担任“守门人”。Caddy 的魅力在于其近乎零配置的 自动 HTTPS 功能。我看中了它的简单方便，它非常符合我的场景。在 Caddyfile 中，我只需写下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;example.com {   
reverse_proxy localhost:7000  # 指向 FRP 映射出的本地端口
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;仅需这一行配置，Caddy 就会自动搞定 SSL 证书的申请与续签。当访问者输入域名时，映入眼帘的是受信任的绿色小锁头，所有的复杂端口逻辑都被完美隐藏。当然，如果你需要高性能，或者服务器已经有了Nginx，你也可以直接使用它。&lt;/p&gt;</description></item><item><title>深度实战：基于 Wails v3 与 Go 打造跨平台 FRP 桌面客户端 Mole-go 的技术架构与原理</title><link>https://blog.91demo.top/mole-develop/</link><pubDate>Sat, 10 Jan 2026 06:00:00 +0800</pubDate><guid>https://blog.91demo.top/mole-develop/</guid><description>&lt;h2 id="一-缘起为什么需要-mole-go"&gt;一、 缘起：为什么需要 mole-go？&lt;/h2&gt;
&lt;p&gt;在开发微信公众号、调试支付接口、以及演示本地开发网站时，或由于服务器资源限制需要在本地部署服务时，frp 是不可或缺的内网穿透神器。然而，原生的 frpc 存在几个显著的痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;运行隐形性差：必须开启命令行窗口，一旦误关服务即中断。&lt;/li&gt;
&lt;li&gt;配置门槛高：新手难以记忆复杂的 .toml 参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了解决这些问题，我开发了 mole-go。它是一个轻量级、跨平台的桌面客户端，旨在实现 frp 的配置、启动与监控一体化。&lt;/p&gt;
&lt;p&gt;在选择使用哪个语言，哪个库开发时，我尝试了多个，分别为go fyne，rust tauri，rust iced，go wails3。&lt;/p&gt;
&lt;p&gt;放弃Go fyne是因为frp日志列表显示达不到我的要求，放弃rust tauri是因为frp二进制启动和关闭我无法实现，放弃rust iced是因为只开发了部分，界面和进度无法我无法掌控，并且此时我了解到了wails v3版本。我最终选择 Wails v3 则是看中了其原生渲染、系统托盘支持、Go 强力后端以及极小的打包体积。最主要的原因是我熟悉Go，可以用它实现功能。&lt;/p&gt;
&lt;h2 id="二-核心架构go--wails-v3-的化学反应"&gt;二、 核心架构：Go + Wails v3 的化学反应&lt;/h2&gt;
&lt;p&gt;mole-go 采用了经典的“UI-Backend-Service”三层架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wails UI：负责前端展示，通过事件驱动（Event-Driven）与后端交互。&lt;/li&gt;
&lt;li&gt;Go Backend：核心大脑，负责业务逻辑、进程管理与系统级 API 调用。&lt;/li&gt;
&lt;li&gt;frpc 二进制：底层服务，通过 Go 的 embed 特性内嵌到二进制文件中。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三-关键实现细节从命令行到图形化的进化"&gt;三、 关键实现细节：从命令行到图形化的进化&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;前端：从“面条代码”到模块化数据驱动&lt;br&gt;
早期版本中，我直接采用 window.startFrp，window.stopFrp这样的写法，导致代码碎片化严重，以及管理app运行状态不方便。在 mole-go 的正式版中，我将其重构为数据驱动模式，类似Vue，由数据驱动界面：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;模块化封装：定义全局 window.App 对象，将数据状态与行为（Methods）统一封装，使代码结构清晰。&lt;/li&gt;
&lt;li&gt;动态 UI 组件：针对 HTTP、TCP、UDP 等不同代理模型，不再机械地堆砌 HTML 片段，而是通过逻辑判断实现“按需渲染”，大大精简了 DOM 结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;后端：全局实例与事件机制&lt;br&gt;
为了保证服务层（Service）能随时与 UI 通信，我设计了一个全局 App 实例，这样可以方便得调用和管理。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;状态约定：前后端约定一套状态码，通过 Wails v3 的 Events 机制，后端可以主动向前端推送 frpc 的运行状态、日志等信息。&lt;/li&gt;
&lt;li&gt;独立服务层：将 frp 相关逻辑抽离到专门的文件中，通过 Wails 的 Binding 暴露给前端，保持代码的解耦。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;系统深度集成&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;系统托盘（System Tray）：利用 Wails v3 原生的托盘支持，实现了“关闭即隐藏”逻辑。&lt;/li&gt;
&lt;li&gt;外部链接调用：使用 wails3自带的 Browser.OpenURL 方法，确保点击文档链接时能正确唤起系统浏览器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可参考项目源码。&lt;/p&gt;</description></item><item><title>FRP 图形化管理新方案：基于 Wails 3 的 Mole-go 桌面客户端部署指南</title><link>https://blog.91demo.top/mole-help/</link><pubDate>Wed, 07 Jan 2026 06:00:00 +0800</pubDate><guid>https://blog.91demo.top/mole-help/</guid><description>&lt;p&gt;记录自研 FRP 管理工具 Mole-go 的公版部署与使用过程，探讨如何通过 Go + Wails 3 构建极致简单的内网穿透图形化管理体验。&lt;/p&gt;
&lt;p&gt;在介绍部署高性能的内网穿透开发演示环境时，虽然也提到了部署配置，但是不太详细。这次本文将带你详细的快速完成基于 Mole 的内网穿透服务部署，包含服务端 (frps) 与桌面客户端 (Mole/frpc) 的配置与排查要点。&lt;/p&gt;
&lt;h2 id="-核心概念"&gt;📖 核心概念&lt;/h2&gt;
&lt;p&gt;首先，我们了解几个关键概念，只有了解之后我们才能进行扩展，应用到更多的场景中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;什么是 FRP？&lt;br&gt;
FRP (Fast Reverse Proxy) 是一款高性能的反向代理/内网穿透工具，它通过在公网服务器和内网客户端之间建立隧道，使外网可以访问内网服务（如 NAS、树莓派、开发环境等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;什么是 Mole？&lt;br&gt;
Mole 是一款基于 wails3 开发的 FRP 桌面客户端，提供图形化管理界面，简化 frpc 的配置与使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;告别繁琐命令行&lt;/li&gt;
&lt;li&gt;支持系统托盘常驻，防止误关窗口导致中断&lt;/li&gt;
&lt;li&gt;支持 HTTP/HTTPS、TCP、UDP 等多种协议&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-部署前准备"&gt;🛠️ 部署前准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;必须有一台拥有公网 IP 的低配云服务器（例如1核1G内存的&lt;a href="https://www.aliyun.com/minisite/goods?userCode=zrqh6alb"&gt;阿里云&lt;/a&gt;、&lt;a href="https://curl.qcloud.com/XX6que5w"&gt;腾讯云&lt;/a&gt;等），如果你需要提供视频等服务，那么带宽要高，服务器配置视情况进行调高。&lt;/li&gt;
&lt;li&gt;FRP 服务端（frps）建议使用 FRP Releases 的 v0.65.0 或更高版本，可以从&lt;a href="https://91demo.top/tools/"&gt;https://91demo.top/tools/&lt;/a&gt;下载我已经打包好各平台的服务端。&lt;/li&gt;
&lt;li&gt;Mole 桌面客户端安装包，可以从&lt;a href="https://91demo.top/tools/"&gt;https://91demo.top/tools/&lt;/a&gt;直接下载，或者从Github下载源码&lt;a href="https://github.com/littletow/mole-go/releases"&gt;littletow/mole-go&lt;/a&gt;编译。&lt;/li&gt;
&lt;li&gt;需要具备基本网络与防火墙管理知识。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-服务端配置frps"&gt;1. 服务端配置（frps）&lt;/h2&gt;
&lt;p&gt;在你拥有公网IP的云服务器上部署frps服务端：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载并解压 FRP 服务端（以 Linux 为例）&lt;br&gt;
访问 FRP 的 Releases 页面下载对应版本并解压（示例为 v0.65.0 或更高）。&lt;/p&gt;</description></item><item><title>Wails 3 初体验及在FRP管理客户端中的应用</title><link>https://blog.91demo.top/wails3-demo/</link><pubDate>Sat, 01 Nov 2025 07:34:14 +0000</pubDate><guid>https://blog.91demo.top/wails3-demo/</guid><description>&lt;h2 id="为什么选择了wails-3-"&gt;为什么选择了Wails 3 ？&lt;/h2&gt;
&lt;p&gt;Wails 3 最大的改变在于它不再强绑定于某个特定的前端框架，且引入了&lt;strong&gt;多窗口支持&lt;/strong&gt;和&lt;strong&gt;更轻量级的 Runtime&lt;/strong&gt;。它允许你在不启动主窗口的情况下运行后端服务，这正是我们实现“系统托盘”和“后台演示服务”的基础。&lt;/p&gt;
&lt;p&gt;在 v2 中，我们习惯于自动生成的 &lt;code&gt;wailsjs&lt;/code&gt; 文件夹。但在 v3 中，这一逻辑被进一步标准化。&lt;/p&gt;
&lt;p&gt;当你运行开发指令时，Wails 会扫描你的 Go 结构体方法，并将其映射为前端可以调用的 JavaScript 函数。这个过程在 v3 中被称为 &lt;strong&gt;Generate&lt;/strong&gt; 过程。&lt;/p&gt;
&lt;h3 id="wails-3-通信灵魂"&gt;Wails 3 通信灵魂&lt;/h3&gt;
&lt;p&gt;我们在前端调用在后端定义的 HandleConnect 返回自定义结构体，这在 Wails 3 中是前后端通信的灵魂。&lt;/p&gt;
&lt;p&gt;在 Wails 3 开发中，最核心的动作就是：&lt;strong&gt;后端做功，前端表现&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当你调用 &lt;code&gt;MoleService.HandleConnect()&lt;/code&gt; 时，Go 后端会产生一个结果。在本项目中，我们需要同时返回一个 &lt;code&gt;Code&lt;/code&gt;（状态码）和一个 &lt;code&gt;Content&lt;/code&gt;（数据内容）。&lt;/p&gt;
&lt;p&gt;为了实现这一点，我们定义了一个结构体：&lt;br&gt;
&lt;code&gt;type Response struct { Code int; Content string }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;虽然 Go 内部使用的是结构体，但前端 JavaScript 只能读懂 JSON 对象。Wails 3 内部会自动帮你完成这个“翻译”过程。&lt;/p&gt;
&lt;p&gt;但是，如果你想让前端看到的字段名是小写的（例如 &lt;code&gt;res.code&lt;/code&gt; 而不是 &lt;code&gt;res.Code&lt;/code&gt;），你必须在 Go 结构体定义时加上“注解”。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Response&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Code&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;code&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Content&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`json:&amp;#34;content&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;记住，所有通过 bindings 调用的 Go 方法，在前端返回的都是一个 Promise 对象。这意味着你必须使用 await 或者 .then() 来接收数据，否则你拿到的将是一个永不开启的“盲盒”。&lt;/p&gt;</description></item></channel></rss>