实战:为 Hugo 博客开发一个公网 IP 探测 Shortcode

工具说明:在进行内网穿透(如调试 mole-go)或配置服务器白名单时,频繁查询公网 IP 是刚需。为了告别繁琐的登录和搜索,我开发了这个集成在博客中的实时探测组件。 🌐 公网 IP 探测 🌐 当前公网 IP: 正在探测... 复制 🛠️ 核心实现逻辑 这个工具基于 Hugo 的 Shortcode 功能实现,采用了异步加载技术,确保不会影响页面的首屏渲染速度。 ...

2026-02-03 · 2 min · Eagle

从“半夜巡栏”到“智能换气”:我把黑盒搬进了猪舍

一、 那件披在身上的大衣 老家人养猪,冬天的半夜,都要披上厚重的大衣,去猪舍看产床温度。猪舍的墙上挂了一个水银温度计。温度低了猪仔会冻死,温度高了会脱水。氨气重了会生病,感觉味道重了,需要手动打开抽风机。这种“靠人巡、靠鼻闻、靠经验”的原始模式,不仅累,而且风险极高。 供暖烧煤炉,煤炉需要半夜起来加煤,人困得不行;母猪还得使用电热板,电热板是那种电阻丝加热的,没有温控计,只能隔几个小时去关掉,等温度降下去再打开。说到底,还是得靠人去“看着”。 我想,能不能用技术,把家人从这种重复、枯燥且充满风险的体力劳动中解放出来一点点?不用花太多钱,因为他们会心疼。 二、 攻坚方案:黑盒的温控逻辑 可以看到面临的主要是“环境失控风险”。 温度控制的极端性:依靠烧煤和简易电热板,温度分布不均。半夜人工起夜不仅辛苦,且这种“大跨度”的温差变化会导致猪仔腹泻甚至死亡。 空气质量的隐形威胁:氨气超标是诱发呼吸道疾病的主因。仅靠“鼻闻”时,空气质量往往已经恶化到危及健康的程度。 利润被风险蚕食:养猪大头是料钱和药钱,但成活率才是利润的底线。一次深夜的失误,可能让数月的辛苦付诸东流。 能马上想到的临时解决方案: 恒温自动化(解决“半夜加煤”与“手动插拔”) 温控传感器方案:购买带有探头的温控开关,将电热板连接到温控插座上。 效果:设定好区间(如32-35度),温度低了自动通电,够了自动断电。不仅省去了人工看管,还能通过减少无效耗电抵消设备成本。 环境预警系统(解决“鼻闻”与“风险”) 智能监控终端:安装一个集成了温湿度监控与氨气检测的智能传感器,通过 Wi-Fi 或 4G 信号连接手机。 效果:当温度异常或氨气浓度过高时,手机会自动发出警报铃声提醒,避免了老人家整晚不敢闭眼的焦虑。 联动抽风(解决“呼吸道疾病”) 自动排风系统:将原有的抽风机改装为智能联动。 效果:当氨气传感器感应到超标,自动开启抽风机,达标后关闭。这能精准减少热量流失,同时保证猪舍空气清新。 核心硬件选择:务实与成本的平衡 因为猪舍现场环境非常恶劣,湿度,氨气,粉尘等因素,温控开关坏的频率非常高,如果接到料房,又采集不了温度。购买氨气专业设备成本又非常高。现场可以根据温度和通风进行解决,但在冬季,保暖是另一个问题。实际考量后,还是自己动手做比较划算。零部件能够直接买并满足现场需求的,直接购买,满足不了,自己动手制作,需要防腐蚀处理:焊接完成后,用酒精清洗焊渣,然后必须喷涂“三防漆”。外壳选用 IP65 防水接线盒,进线口使用电缆防水密封接头 (PG7),否则氨气会从缝隙钻进去。线路外层加PVC管,防鼠咬,腐蚀,机械损伤。 传感器:水银温度计不行,无法采集。工业级的 RS485 温湿度传感器太贵(动辄上百元),购买不锈钢封装好的民用级的DS18B20数字温度传感器,焊接后要密封好,挂在猪舍合适的位置。它通过一根单总线连接,协议简单,成本极低。 主控:具备 NB-IoT 通信功能的物联网核心板或者采用分布式架构,先接一个STM32控制黑盒,然后再连接物联网黑盒,它集成了主控芯片和 NB-IoT 模块,可以直接连接运营商网络。它负责读取传感器、执行逻辑、控制输出,并具备联网能力。 通信:猪舍没有Wi-Fi,即使有WiFi,也推荐使用RS485线连接,考虑如下:稳定性以及长期收益。布线不方便的地方,可以使用4G或者NBIot模块,用一张物联网卡,可以直接走运营商的网络上传数据,无需在猪舍和住房之间拉网线,年流量费仅需十几元。这是实现“无线化”的关键,需要注意的是,如果在猪舍内加装铁盒,需要接外接天线,防止信号屏蔽。 报警:前期控制投入,不用手机流量卡和云平台。购买一个433MHz无线门铃,使用黑盒驱动,黑盒使用IP65 防水塑料接线盒,把发射模块接在主控板上。当需要报警时,主控板模拟按下门铃按钮,屋里就会“叮咚”响。这是最直接、最可靠的本地告警。 第一阶段:从“定时巡”到“听铃响” 目标:解决“夜间需要频繁固定间隔的去猪舍”的核心痛点,将人工巡检间隔时间拉长到“只在有异常时响应”。 系统架构与原理: 感知:主控板 不断读取 DS18B20 的温度值。 决策:我在主控板的固件里写死一段简单的判断逻辑(例如:if (温度 < 18度 或 温度 > 28度))。 执行:一旦条件满足,主控板 立即驱动 GPIO 引脚,向 433MHz 发射模块发送一个高电平脉冲信号。 告警:433MHz 信号被屋里的门铃接收器捕获,触发响铃。屋里的人听到铃声,就知道猪舍温度异常,需要去查看。 可执行性与落地关键: 硬件连接:仅需将 DS18B20 的数据脚、电源、地线接到主控板对应引脚;将 433MHz 发射模块的信号脚接到另一个 GPIO 引脚。接线简单,无需复杂电路。 ...

2026-02-27 · 1 min · Eagle

水表、电表、热表:一个“黑盒”如何撬动千亿级存量市场中的利旧改造细分蓝海

一、 场景:从“插卡洗澡”到“手机充值”的断层 “洗澡洗一半,卡里没钱了,得湿着身子跑下楼去圈存机充钱。”——这是十年前大学宿舍的常态。 我参与过那个“刷卡时代”的项目。彼时,每个宿舍楼都有一个弱电井,里面几十个水表通过RS-485总线串联。学生用M1卡洗澡,钱存在卡里,水表是“单机版”。宿管中心不知道哪个宿舍快没水了,只能被动等待报修。 核心痛点:用户需要手机充值的便捷,但海量的老式水表(及电表、热表)是“数字孤岛”,只有RS-485接口,不具备任何联网能力。整体更换为物联网表成本极高,且施工影响巨大。 二、 方案:一个“黑盒”,唤醒沉默的数据 我们的方案是添加一个 “黑盒”——一个协议转换网关。它的逻辑很简单:不换表,不改线,只做“翻译官”。 物理部署:在弱电井的485总线汇接处,并联接入“黑盒”。原有的刷卡系统完全保留,作为保底。 核心工作: 采集:黑盒内置高性能Modbus协议栈,主动轮询总线上所有水表,读取余额、用量。 转换:将不同品牌、不同协议的水表数据,统一“翻译”成标准的JSON格式。 上传:通过4G或网线,将数据通过MQTT协议上传至云平台。 手机充值闭环: 学生在小程序支付。 云端将“为XX房号充值XX元”的指令下发给对应黑盒。 关键一步:黑盒将指令“反向翻译”成目标水表能识别的、符合其私有协议的485报文,完成“写卡”操作。 系统确认后,充值到账。 三、 定位:在巨头缝隙中,做“数字化的梯子” 我深知,国家级、城市级的智慧水务/能源项目,是头部玩家的“铁桶阵”,他们依靠专用网络、5G和强大的工程能力构建壁垒。 “黑盒”的目标,是那片被忽略的“长尾市场”: 还未改造的高校宿舍、企业公寓、公租房保留的水表。 城中村的个体房东,管理几栋到十几栋楼房。 中小工厂的宿舍楼。 对他们而言,动辄数十万的整体改造方案是不可承受之重。而一个单价数百元、即插即用、半天可部署、不动原有设施的“黑盒”,是他们迈入数字化管理的唯一可行阶梯。 四、 挑战与壁垒:并非“即插即用”的童话 这个方案在逻辑上自洽,但真实的商业落地远非易事,存在多重壁垒: 工程实施壁垒:“不换表”不等于“零施工”。将黑盒接入弱电井,需要开井、找线、破接、取电、固定,这本身就有一定的技术门槛和安全风险,并非普通用户能独立完成。 协议适配壁垒:水、电、热表协议各异,且大量是厂家私有加密协议。适配、测试每个新协议,都意味着高昂的研发和现场调试成本。这绝非一个“通用字典”就能轻松解决。 性能与稳定性壁垒:RS-485总线是半双工,挂载几十块表后,轮询周期会拉长,数据实时性下降。网络波动、设备干扰可能导致指令执行失败,需要设计复杂的重试、容错和事务一致性机制。 渠道与商务壁垒:如何触达并说服高校后勤、房东这些分散的客户?如何提供及时可靠的现场支持?这比技术开发更难。 五、 结语:技术应俯身解决真问题 从弱电井里满是灰尘的RS-485总线,到云端的MQTT消息;从易丢失的实体卡,到手机里的数字账户。 “黑盒”的价值,不在于它用了多炫的技术,而在于它用极低的成本,为一个真实、广泛但被忽视的需求,提供了一个可行的解决方案。 它像一根“数字化的梯子”,让那些无力承担“电梯”费用的用户,也能攀上智能管理的台阶。 这背后,是对现场通信“脾气”(干扰、雷击、协议冲突)的深刻理解,更是对用户“简单、可靠、别添乱”这一终极诉求的敬畏。 当巨头们仰望星空,构建未来时,总需要一些人,愿意为角落里那些“老旧笨重”的设备,插上一双通往现代的翅膀。 这条路充满挑战,但正因如此,每一步才都踏在真实的需求之上。 后记与邀请 如果你正在寻找低成本的老旧设备数字化方案,欢迎交流。关于“黑盒”项目的固件核心进展、协议文档与配置字典,我将在爱发电https://afdian.com/a/modujson​ 持续同步与更新。

2026-02-26 · 1 min · Eagle

从粮仓 RS485 总线到云端 JSON:一个前实施工程师的数字化反思

“以前看粮仓,那是体力活,现在看粮仓,是技术活。”——一位在粮库工作三十年的老保管员 一、那些年,我在粮库“插钎子” “我年轻时,最怕夏天查粮仓。”老保管员回忆道。三伏天,他得扛着十几斤重、6米长的铁杆,踩着晃晃悠悠的木板,深一脚浅一脚地爬上几米高的粮堆。杆子前端是温度传感器,杆子末端则是一个巴掌大的小型LED显示屏。每到一个检测点,他就得用力把这“铁签子”插进压得结实的粮堆底部,然后低头查看杆子末端的屏幕读数,再抄录到本子上。全部查完、记录完,要爬一整天。粉尘呛人、闷热缺氧,是家常便饭。 “那时靠的是腿,是眼,是经验。”老保管员说得对。他练就了“一看、二闻、三摸”的本事,但这套经验在几千吨的粮堆面前,总有盲区。一旦某个角落的粮食开始发热霉变,等人工发现时,往往损失已不可避免。 这不是故事,这是我的朋友——一位粮库测温系统的实施工程师——告诉我的: 他入行时,老保管员的手艺活已是过去式。他面对的是更“现代”的麻烦:部署一套有线测温系统。 这套系统的核心,是把带有固定传感器的“测温电缆”像神经一样埋入粮堆,取代人工巡检。而他的工作,就是把这套“神经”铺进去,再把“信号”引出来。 这活儿,一点不比爬粮堆轻松。 夏天,粮仓内像个蒸笼,地面温度超过40度。他要在入粮前,或趁着粮堆还不高时,拖着几十米长、拇指粗的测温电缆在仓内布线。电缆里包裹着钢丝,死沉。他得把它沿着预定路径铺好、固定,确保每个传感器都在设计位置。 这仅仅是开始。真正的考验是“拉线”。 粮堆深处的测温电缆,其线头最终要汇集到挂在仓库墙壁或柱子上的“测温分机”(采集器)。他需要扛着梯子,在满是灰尘的仓房里,将几十根从粮堆里引出的线,一根根对号入座,拧到分机箱内的接线端子上。接错一根,整个回路的数据都可能乱掉。 这还没完。仓库里几十台这样的分机,还需要用更粗的“通信总线”(RS-485线)手拉手串联起来,最后拉到机房,接入一台专用电脑。 这,才是他口中“从杆子末端拉出数据线,连接到远处的分线器上”的真实图景:​ 那不是在粮堆上现插现拉的潇洒,而是在高温、高粉尘环境下,重复千百次的枯燥、负重且必须精准的体力与细心活。线要拉得横平竖直,接头要拧得牢靠,还要防鼠咬、防磨损。 刚开始,他觉得这工作充满了技术仪式感。干久了,日复一日地扛电缆、爬高、接线、测通断,只剩下一个字的感受:累。一种被庞杂的物理线缆和复杂现场环境反复折磨的、沉甸甸的疲惫。 然而,正是这种疲惫,让他对“可靠”二字有了刻骨的理解。他见识过雷雨天后烧毁一片的电路板,处理过因一个接头松动导致整仓数据瘫痪的故障,也深知那台机房里孤零零的电脑,就是整个系统最脆弱的“大脑”。 二、技术跃迁:从“有线”到“无线” 我朋友后来参与实施的,正是那套用来取代人工的有线测温系统。它的核心是用预埋测温电缆取代了人工铁钎——技术人员在粮堆中预埋专用电缆,每根电缆上集成数十个温度传感器,像“神经末梢”一样分布。数据通过RS-485总线手拉手串联,即设备像糖葫芦一样串在一条总线上,一个接一个。最终汇总到仓外的监控主机。 除了传统的平房仓,现代化的粮库越来越多地采用立筒仓(圆仓)。这种仓体高大,粮食像瀑布一样从顶部灌入,依靠底部的锥形漏斗和出粮机实现自动化出粮。 在这里,测温电缆不再是“蛇形”铺在底部,而是像垂直的琴弦一样,从仓顶的采集器一直垂到仓底。采集器不再藏在灰尘满布的机房,而是直接安装在仓顶的防雨箱里,通过无线模块将数据发送到云端。 这种结构,让粮仓从“体力活”彻底变成了“自动化工厂”。 再回到我朋友的测温系统,这解决了人工爬仓的问题,但带来了新的、更复杂的麻烦。 当时觉得这套系统很先进,但现在回想,它太“重”了: 怕雷击:几百米纵横交错的485总线,成了感应雷的“引雷针”,雷雨季后,分线器经常烧坏一片。 维护难:专用的监控电脑不能死机,SQL数据库一旦损坏,几年的历史温度数据可能全丢。 数据孤岛:粮库主任想看一眼温度,必须跑到那个满是灰尘的专用监控室。 工程浩大:布线、穿管、调试,一个仓的改造就需要数周,成本高昂。 真正的变革,发生在物联网和无线通信普及之后。 新一代的“黑盒”采集器出现了。它只有巴掌大小,却集成了主控、4G模块和无线传输功能。它直接读取测温电缆的数据,通过MQTT协议将数据打包成JSON格式,一跳直达云平台。 粮库管理员在办公室,甚至用手机,就能看到整个粮堆的立体温度云图。系统自动分析、自动报警。 免布线:每个仓门口挂一个4G黑盒,直接对接原有的分线器。省掉了跨仓位、跨建筑的数千米复杂布线工程。 云端大脑:不再需要机房那台脆弱的专用电脑,数据直接上云,永不丢失,随时随地可查。 三、黑盒的定位:避开红海,寻找蓝海 在深入了解行业后,我发现粮储智能化其实是一个典型的“双轨制市场”。 大公司的“铁桶阵”:资质与工程的护城河 国家级粮储库、大型央企的智能化改造,是标准的“重工程”市场。它被几家头部企业垄断,依靠的是强大的工程化资质(如机电安装、系统集成)和专用设备(如光纤测温、工业级5G网关)。这些方案性能极高,但成本也极其昂贵(单仓改造费用动辄数十万),且施工周期长,需要专业工程队进场。 我的“黑盒”逻辑:低成本与快速响应 我开发的这个黑盒项目(基于ESP32等开源硬件),从一开始就没打算去冲击那个“铁桶阵”。我清醒地认识到,在需要军工级可靠性的战略储备库,我的方案无法与那些天价的专用设备竞争。 黑盒的核心价值在于“降维打击”与“普惠”: 目标市场:中小型粮库、地方储备点、合作社、个体储粮户。这些场景对成本极度敏感,无法承担大型工程的费用,也无需那么严苛的可靠性。 核心优势:极致低成本(硬件成本可能只有大公司方案的百分之一)和极速部署(即插即用,一个人半小时就能装好一个仓)。 价值主张:用“够用”的可靠性,解决“有没有”的问题。对于绝大多数只需要基本温湿度监控、异常报警功能的用户,黑盒是让他们迈入数字化门槛的唯一可行选择。 结语:让技术回归解决问题的本质 技术不应只是大公司的专利和豪华包装下的奢侈品。我的黑盒项目,源于“插钎子”的汗水,目标是证明一件事:在那些大公司不愿弯腰、传统方案贵得用不起的“边缘地带”,廉价的芯片和开源的智慧,同样能默默守护好每一粒粮食。 这不仅是技术实现,更是一种让技术回归普惠、解决真问题的尝试。 四、我的“黑盒”:从痛点里长出来的解决方案 “虽然已离开粮储行业多年,但那些亲自插下的钎子,让我深刻理解了RS485总线的‘脾气’、雷击的刁钻、还有现场对‘简单可靠’的极致渴望。”——这种浸入式的场景理解,是我开发这款“黑盒”固件最硬的底气。 它不是一个实验室里的玩具,而是为了解决 “老旧工业设备低成本上云”​ 这个具体痛点而生的 “数字化插件”​ 。它目前是一个稳定的Modbus/RS485转MQTT网关固件,未来可以扩展为支持多种协议、具备边缘计算能力的核心。 未来黑盒可以集成LoRa,LoRa 最大的优势在于极强的穿透能力和超长的传输距离,非常适合“密闭、大跨度”的粮仓环境。在粮仓这种密闭、充满金属设备和粮堆的环境下,LoRa 依然表现出色。相比于 4G/NB-IoT 在密闭环境信号较弱的特点,LoRa 的信号能够穿透厚厚的墙体,深入到粮堆内部。配合无线测温探杆,使用电池以及太阳能电池板,彻底免布线。 关于合作: 我个人专注于核心固件的研发、算法优化与开源社区建设。硬件生产与制造,我与专业的工业设计伙伴合作,以确保设备的出厂品质。我相信,专业的人做专业的事,才能把产品做到最好。 最终结语 从“汗滴禾下土”的插钎巡检,到“数据云中走”的智能值守,变的不仅仅是工具,更是守护粮食安全的思维与模式。 我朋友的故事,可能只是大时代里一个很小的注脚。但如果这个源于亲身痛苦、成于开源技术的“黑盒”项目,能帮助到某个正在为粮仓温控发愁的中小业主,或者给某个在工业物联网领域摸索的开发者一点启发,那么,那些年在粮堆上流过的汗,就算有了超越它本身的价值。 技术,理应如此踏实而有温度。 后记与邀请 如果你也有过类似的工业现场“血泪史”,或正在寻找低成本的老旧设备数字化方案,欢迎交流。关于“黑盒”项目的固件核心进展、协议文档与配置字典,我将在爱发电https://afdian.com/a/modujson​ 持续同步与更新。

2026-02-25 · 1 min · Eagle

3分钟搞定:用 Headless 模式优雅自动开启 VirtualBox 开发环境

前言:消失的“30秒”与开发者的尊严 作为开发者,我每天开机后的第一个动作就是:打开 VirtualBox UI -> 选中虚拟机 -> 点击启动 -> 等待窗口弹出 -> 最小化窗口。 这套动作耗时约 30 秒,虽然微不足道,但这种重复的机械劳动是消磨创造力的元凶。今天,我决定拔掉这颗“硌脚的沙子”,用最优雅的方式让开发环境随系统静默启动。 技术核心:什么是 Headless 模式? 通常我们启动虚拟机都会弹出一个窗口,但在服务器环境下,我们只需要它的后台服务(如 SSH、Web Server)。VirtualBox 提供的 headless 模式可以实现: 无窗口运行:不占用任务栏,像原生系统服务一样。 低资源占用:省去了图形界面的显存开销。 第一步:编写自动化脚本 (.bat) 为了避免开机瞬间磁盘 IO 占用过高导致启动失败,我们在脚本中加入了 10 秒延迟。AutoStartDev.bat的脚本如下: @echo off title Dev-Server Delayed Starter echo [SYSTEM] System initialized... :: Wait for system stability echo [WAIT] Waiting for 10 seconds to ensure system stability... timeout /t 10 /nobreak echo [SYSTEM] Starting "dev-server" in headless mode... :: Run VirtualBox command :: Ensure VBoxManage is in your System PATH VBoxManage startvm "dev-server" --type headless if %errorlevel% equ 0 ( echo. echo ======================================== echo [SUCCESS] VM "dev-server" is now RUNNING. echo ======================================== timeout /t 5 ) else ( echo. echo [ERROR] Failed to start VM. echo [TIP] Check your VM name or VirtualBox installation. pause ) dev-server是虚拟机的名称,请修改为你自己的虚拟机名称。 ...

2026-02-11 · 1 min · Eagle

从 mdBook 到 Hugo:一位后端开发者的博客架构演进与思考

在数字内容创作的旅程中,工具的选择往往折射出创作者在不同阶段的诉求。从最初的小程序“豆子碎片”,到尝试使用 Rust 生态的 mdBook,再到最终回归并定于 Hugo,这不仅是技术栈的迁移,更是我对内容分发、用户体验以及商业化潜力深度思考后的结果。 1. 痛定思痛:告别移动端封闭生态的束缚 最初,我将大量的笔记和技术心得打造成了一个名为“豆子碎片”的小程序。初衷是利用移动端的便捷性,但随着内容的积累,弊端逐渐显现。 最直观的痛点在于性能与体验。小程序在渲染长篇幅的技术文章,尤其是包含大量代码片段的内容时,卡顿感非常明显。更重要的是,作为一名开发者,我发现小程序在内容搜索与社交分享上存在天然的屏障。技术内容应当是开放的,它需要被搜索引擎检索,也需要方便地在网页端被阅读和引用。 为了打破这种孤岛状态,我决定回归网站博客。 2. 抉择:为什么不是 mdBook? 在回归 Web 的第一站,我首先关注到了 mdBook。作为一个偏爱简洁风格的开发者,mdBook 这种类似文档流的展示方式起初非常吸引我。然而,在深入使用并尝试进行定制化开发时,我遇到了一些瓶颈。 扩展性的局限 mdBook 虽然在文档编写上非常纯粹,但在作为通用博客平台的扩展性上显得略为乏力。由于它主要为 Rust 文档设计,当我试图通过编写插件来处理一些特殊逻辑时(例如将我在小程序中定义的私有格式 type|url|params 自动还原为标准 URL 链接),开发过程并不如预期般顺遂。 技术栈的契合度 作为一名后端开发者,我对 Go 语言 拥有更高的熟悉度。在折腾 mdBook 插件遇到阻碍后,我意识到:用熟不用生不仅是开发经验,更是提升生产力的核心。 3. 回归 Hugo:灵活性与商业化的平衡 最终选择 Hugo,是我在权衡了扩展性、性能与长期维护成本后的决定。 强大的扩展能力与 Go 生态 Hugo 作为基于 Go 语言构建的静态网站生成器,其渲染速度堪称业界天花板。更重要的是,它的模板系统极其灵活。对于我之前在小程序中定义的自定义链接格式,我可以通过 Hugo 的 Shortcodes 或正则表达式替换轻松实现自动化转换。这种“随心所欲”的控制感,是后端开发者最看重的。 布局与精力的分配 在经历了几年的技术折腾后,我悟出了一个道理:开发者的时间应该花在内容创作上,而不是无休止地调整 CSS 布局。 我选择了 PaperMod 主题,因为它精准地命中了我所有的痛点: 极致简洁:没有冗余的装饰,让读者聚焦于文字。 响应式设计:完美适配手机端阅读,填补了告别小程序后的移动端体验。 易于 SEO:内置了完善的 SEO 结构,为后续的流量增长打下基础。 4. 商业化的考量:为了 Google AdSense 之所以选择 Hugo 而非继续留在 mdBook,还有一个非常现实的原因——流量主申请与广告布局。 ...

2026-02-10 · 1 min · Eagle

基于 Go + 小程序创建的“口袋指令中心”

我日常涉及 Hugo 博客发布、客户端打包、Nginx 运维等多种重复性脚本。每次都要 SSH 连服务器并执行命令,操作链过长,也不方便,特别是在身边没有电脑的情况。所以我就想构建一个通用的执行引擎,通过小程序远程触发,且具备零前端修改的扩展能力。 系统架构设计 为了实现“明天增加脚本,小程序不发版”的目标,采用了“配置驱动” 模式。即“配置在云端,指令在指尖”。通过将业务逻辑(脚本路径与名称)完全从前端小程序中解耦,实现一套代码支持无限扩展的运维能力。 核心流程 后端 (Go):维护一个脚本配置列表(数据库或配置文件)。 前端 (小程序):启动时请求后端接口,拉取可用脚本列表。 触发:使用时选择脚本名称,点击执行。 鉴权:后端校验小程序 OpenID,仅允许本人指令生效。 技术实现 系统分为三层,确保安全性与扩展性的统一: 配置层 (Go Config):在服务器端定义脚本的 ID、名称和实际路径。 鉴权层 (WeChat Auth):利用微信小程序 OpenID 建立强一致性的身份白名单。 展示层 (Mini Program UI):动态拉取后端配置,仅负责“展示列表”与“触发指令”。 技术实现方案 A. 后端:动态脚本引擎 (Go) 后端不再硬编码脚本路径,而是定义一个结构体: // 脚本任务定义 type ScriptTask struct { ID string `json:"id"` // 前端传递的任务标识 Name string `json:"name"` // 小程序界面显示的文字 Command string `json:"-"` // 实际执行的脚本路径 (对前端保密) } // 示例配置(可存放在 JSON 文件或数据库中) var tasks = []ScriptTask{ {ID: "hugo-post", Name: "发布 Hugo 文章", Command: "/scripts/deploy_hugo.sh"}, {ID: "build-client", Name: "构建客户端", Command: "/scripts/build_mole_go.sh"}, {ID: "nginx-restart", Name: "重启 Nginx 服务", Command: "systemctl restart nginx"}, } 对外接口定义: ...

2026-02-04 · 3 min · Eagle

巧用Nginx重定向解决云存储文件地址变更的痛点

在移动应用分发、文件共享等场景中,我们常常会遇到这样的困境:云存储平台(如阿里云OSS、腾讯云COS、蓝奏云等)上传的文件地址一旦生成就无法修改,但客户端版本频繁迭代时,每次更新都需要重新生成下载链接和二维码。用户端需要不断更新访问入口,体验极差。我就碰到了此类问题,在上一篇文章,我介绍了自己的客户端,并分享了下载地址。但我发现当我需要重新升级版本时,已经生成的地址将无法变更。在我的文章中,我直接使用了文件下载地址。这就让我急需解决如何实现"一次分发,永久可用"的优雅方案?Nginx反向代理配合301重定向,正是解决这一痛点的利器。 一、问题根源:云存储的地址锁定机制 大多数云存储服务采用"对象存储"模式,文件上传后生成固定URL,该地址包含存储桶名称、地域、文件路径等不可变信息。这种设计虽然保证了数据一致性,却带来了分发难题:每次版本更新,开发者必须重新上传文件、生成新地址、制作新二维码,用户需要重新扫描或获取新链接。对于频繁迭代的应用,这种重复劳动不仅效率低下,更可能因用户未及时更新而影响使用体验。 二、解决方案:Nginx重定向的架构设计 核心思路是地址解耦——将"物理存储地址"与"用户访问入口"分离。通过Nginx服务器作为中间层,用户始终访问固定域名,Nginx根据配置将请求重定向到实际的云存储地址。当文件更新时,只需修改Nginx配置中的目标地址,用户端的访问入口保持不变。 具体架构如下: 用户 → 固定域名/短链接 → Nginx服务器(301重定向) → 云存储实际地址 这种设计实现了三个关键目标: 入口稳定性:用户扫描的二维码或保存的链接永久有效 维护灵活性:后台地址变更只需修改Nginx配置,无需重新分发 成本可控性:Nginx只做重定向,流量消耗极低,普通云服务器即可承载 三、技术实现:从配置到部署 环境准备购买一台云服务器(1核1G配置即可),安装Nginx,将自有域名解析到服务器IP。推荐申请SSL证书启用HTTPS。 Nginx配置示例 server { listen 80; server_name your-domain.com; # 方案一:直接重定向 location /download/app.apk { return 301 https://bucket.oss-cn-region.aliyuncs.com/v2.0/app.apk; } # 方案二:通配符匹配(更灵活) location ~ ^/app/(.*)$ { rewrite ^/app/(.*)$ https://new-bucket.oss-cn-region.aliyuncs.com/$1 permanent; } } 重定向类型选择 301永久重定向:搜索引擎会更新索引,客户端会缓存重定向结果,适合生产环境 302临时重定向:每次请求都会重定向,适合测试阶段频繁变更的场景 二维码生成 将固定地址(如https://your-domain.com/app/v2.0.apk)生成二维码,用户扫描即可下载。后续版本更新时,只需修改Nginx配置中的目标地址,二维码无需重新制作。 四、方案优势与注意事项 核心优势 零用户感知:用户无需关心后台地址变化 维护成本低:修改配置即可,无需重新上传二维码 扩展性强:可支持多版本共存、灰度发布等复杂场景 兼容性好:支持各种客户端(浏览器、APP、微信等) 实施建议 测试先行:在测试环境验证重定向逻辑,确保目标地址正确 监控告警:配置Nginx日志监控,及时发现重定向失败问题 备份机制:保留旧版本配置一段时间,避免新配置问题影响用户 性能优化:虽然重定向开销小,但高并发时需确保服务器性能 五、总结 Nginx重定向方案将复杂的地址管理问题转化为简单的配置变更,实现了"一次分发,永久可用"的理想状态。这种解耦思维不仅适用于文件分发场景,在API网关、微服务路由等场景中同样具有借鉴意义。对于中小型项目而言,这是成本最低、效果最直接的解决方案,值得每一位开发者掌握。 最后推荐一下我的豆子域名管家客户端,这个客户端可以解决域名证书到期忘记更换证书的问题。我是为了解决这个问题而想出来的这个方案。这是我的新的下载地址:https://lab.91demo.top/b011 这样当我修改下载地址时,我不用再变更这个地址,比如我最近刚刚优化了域名扫描逻辑,上传了新的版本,它生成了一个新的下载地址。 当然这个方案还是有一点瑕疵,它需要每次更新都登录服务器修改nginx配置文件,这对于非技术人员非常不方便。后期我还有再次进行优化,我将使用小程序完成新地址的更换。大致思路如下:开发一个轻量的Go服务,提供接口给小程序提交新的地址,然后保存编号和新地址到数据库,例如上面的b011是编号,它对应新的下载URL地址。然后使用Nginx代理这个服务,当用户访问b011时查询它的URL地址,然后返回301和新的地址。这样就不用每次都登录服务器修改Nginx配置,在手机上也方便操作,提供了极大的便利性,也可以交给非技术人员进行维护。

2026-01-29 · 1 min · Eagle

拒绝频繁上传服务器!我用 Dufs + Mole-go 搭建了丝滑的内网穿透演示环境

最近开发完 Mole-go,想给它做个网站用来展示和下载。但我这个后端糙汉子,样式真搞不定,求助 AI 调了半天还是差点意思。最头疼的是,手机端调试得一遍遍输 IP,给朋友演示也得发一串 IP 端口,太不专业了!于是我一顿折腾,搞出了这套方案…… 为了解决这些痛点,我摸索出了一套“黄金组合”:Dufs + Mole-go + FRP + Caddy。这套方案打通了从本地到公网域名的全链路,实现了自动 HTTPS、域名访问以及极致的访问体验。 第一步:构建本地内容基石(Dufs) 一切的起点是本地文件服务。我选择使用 Dufs 作为静态服务器。它极其轻量,支持上传、搜索、打包下载甚至 WebDAV,是我演示 Web 应用或分发安装包的首选。 通过简单的命令,我在本地 5000 端口启动了服务。虽然此时它还被“困”在局域网内,但它为后续的展示提供了稳固的基础。 第二步:突破局域网束缚(FRP 与 Mole-go) 为了让公网流量能精准触达内网,我采用了经典的 FRP 方案,但在客户端层面,我使用了自己开发的 Mole-go。 服务端 (FRP Server):部署在具备公网 IP 的云服务器上,充当流量中转站。这个服务器配置可以很低,网站服务都在本地电脑,如果本地有数据库,也非常方便调试。 客户端 (Mole-go):这是我为 FRP 打造的桌面管理客户端。它封装了 frpc 核心,不仅提供了直观的 UI,还通过系统托盘设计彻底解决了“关闭窗口即断连”的痛点。 使用 Mole-go,我可以将本地 5000 端口通过加密隧道安全地映射到云端。它出色的资源管理和连接稳定性,确保了演示过程中即便网络波动,链接依然稳固如初。 第三步:优雅的网关入口(Caddy) 即便流量已到达公网,我也不希望朋友们通过 http://IP:端口 这种生硬的方式访问。我追求的是“域名+HTTPS”的专业感,这不仅是为了美观,更是为了开发环境需求,下次开发公众号等必须 HTTPS 环境时可以拿来就直接使用。 我选择了 Caddy 担任“守门人”。Caddy 的魅力在于其近乎零配置的 自动 HTTPS 功能。看中了它的简单方便,非常符合我的场景。在 Caddyfile 中,我只需写下: example.com { reverse_proxy localhost:7000 # 指向 FRP 映射出的本地端口 } 仅需这一行配置,Caddy 就会自动搞定 SSL 证书的申请与续签。当访问者输入域名时,映入眼帘的是受信任的绿色小锁头,所有的复杂端口逻辑都被完美隐藏。 ...

2026-01-15 · 1 min · Eagle

把项目做成像 frp 那样的多平台 Release

Mole 项目已经开源,打算把仓库在 GitHub Release 页面中发布各个平台的安装包/二进制(像 frp 那样),已经完成脚本,可参考.github/workflows/release.yml,这个用来记录实现过程与遇到的坑,便于自己回顾。 大致流程 查阅 GitHub Actions、goreleaser、actions/create-release、actions/upload-release-asset 等资料。 在仓库中写一个 matrix workflow,在 Windows / macOS / Ubuntu runner 上分别构建并打包。 修复构建中出现的依赖与环境差异问题。 将构建产物上传为 Release asset(先查找/创建 release,再上传各平台包)。 调试并保证上传在 Release 页面能看到各平台包。 今天遇到并解决的主要问题(按流程顺序) Ubuntu 图形库版本不一致 问题:教程写的是 libwebkit2gtk 4.0,但在新版 Ubuntu runner 上只能安装 4.1。 处理:在 CI 的 apt 安装里兼容 4.0 和 4.1(尝试 4.1,或用 || 逻辑兼容两种包名)。 wails3 安装地址写错导致安装失败 问题:go install 用错了模块路径,安装一直失败。 处理:修正为官方地址(例如 github.com/wailsapp/wails/v3/cmd/wails3@latest),并确保 GOPATH/bin 在 PATH 中。 wails3 的 -platform / -o 参数在我的环境不可用 问题:官方文档的参数在实际运行时报错或不生效(不能指定输出名)。 处理:不完全依赖 CLI 的跨平台参数,在对应 runner 上运行构建命令并从 bin/ 下输出文件打包;如有必要向 upstream 提交 issue。 macOS 的平台特有代码需要 build tag,而不是运行时判断 ...

2026-01-07 · 2 min · Eagle