我给 Pi 做了个 Zig 包:两个 Skill,加上官方 zls 0.16 的诊断工具

最近我把写 Zig 时常用的两份说明,和官方 zls 0.16 的诊断通道,收进了一个 Pi 包:pi-zig-skills。 仓库: https://github.com/luodaoyi/pi-zig-skills 写这篇文章时,已经发到 0.2.2(npm [email protected],主分支提交 0eb8535240843f1d213f0366ef50b949fc3487e0)。一句话概括:装上之后自动出现 zig-0.16 和 zig-tiger-style 两个 skill,扩展再注册 zig_lsp_diagnostics,去问官方 zls 0.16,不依赖别的包有没有 …

我给 TAD6S4N10G 写了个 fnOS 模块:温度、功耗、风扇和机箱按键

最近我把家里那台 TAD6S4N10G 上的飞牛 fnOS 又折腾了一圈,最后做成了一个第三方模块:TAD6S4N模块。 仓库: https://github.com/luodaoyi/TAD6S4N10G-fnos 写这篇文章时,当前版本是 0.10.0。一句话概括:按 RR CPUinfo 的口径看 CPU 核心最高温度,同时把 Package 原始温度、Package 功耗、风扇曲线、物理仓位和机箱 GPIO 按键放进同一个 fnOS 原生界面里。

我用 Zig 重写了 Komari Agent

最近我又折腾了一个小项目,叫 komari-zig-agent。 Komari 现有面板不用改,原来怎么接还怎么接,只把机器上那个 agent 换成 Zig。协议对齐原来的 Go agent,二进制体积和常驻内存压下来。OpenWrt、小内存 VPS、低端 ARM / MIPS 这类机器会比较有感。 项目地址: 1 https://github.com/luodaoyi/komari-zig-agent

我做了一个本地版瑞思迈呼吸机数据分析工具:BreatheLens

最近我做了一个新项目,叫 BreatheLens。 项目地址: 1 https://github.com/luodaoyi/BreatheLens 它是一个专门用来分析 ResMed 瑞思迈 CPAP / APAP 呼吸机 SD 卡数据 的本地工具。目标很直接:把原始治疗数据整理成更容易看懂的图表、表格和建议。 很多人手里其实并不缺数据,缺的是一个足够直接、足够轻量、又不逼你折腾半天的查看方式。BreatheLens 就是朝这个方向做的。

我写了一个证书监控系统,叫 Certwarden

域名一多,证书这事就没法靠人记。哪些快过期、哪些已经异常、该通知谁、有没有一个页面能直接给别人看——脚本能应付一两张,再多就乱。 所以我整理了一个自己之前写的项目,叫 Certwarden。自托管,多租户,持续检测证书、记历史、发通知,每个租户有自己的公开状态页。 仓库: 1 https://github.com/luodaoyi/Certwarden 当前版本 v1.3.4。

给 OpenAI Codex 接上通知:现在用 codex-notify

我最近把这个小工具又整了一轮:仓库还叫 go-codex-notify,本体已经是 Rust,当前最新是 v1.3.23。全局命令和原生程序都叫 codex-notify。 它还是给 Codex 接通知,但渠道不再只有 Telegram。Bark、OpeniLink Hub、Hermes Webhook 都能配,配了几个就同时发。 这个东西本身不复杂,但它解决的是一个很实际的问题:AI 在后台干活的时候,你不想一直盯着终端。 以前最大的别扭是分发。最早是自己下二进制,后来我推过一段时间用 Node 包装拉对应平台。那条路能用,也写进过旧文。现在更稳的做法是:全局装一次原生程序,命令统一用 …

Bilibili 批量取消关注油猴脚本:自动刷新继续下一页

最近想把 B 站关注列表快速清理一下,手动一页一页点太慢,所以写了个油猴脚本。 脚本下载:bilibili-unfollow-simple-refresh.user.js 这个版本走的是 B 站网页接口,不是模拟鼠标疯狂点按钮,整体会稳一些;同时保留了一个很简单的右下角小面板,方便开始和停止。 它的逻辑也很直接: 读取当前页关注列表 逐个取消关注 当前页处理完后自动刷新页面 刷新后自动继续下一页 如果点了停止,就在当前页处理完之后停下来 功能说明 支持批量取消当前账号的关注 支持自动刷新后继续处理下一页 支持失败重试 支持基础防频控延时 支持跳过互粉 / 跳过悄悄关注(默认关闭) 页面右下角会 …

[转载] iptables配置无SNAT转发所有流量,保留来源真实ip

iptables配置无SNAT转发所有流量,保留来源真实IP 前言 在网络架构中,我们经常需要通过中转机转发流量到后端服务器。传统方案通常使用 SNAT/MASQUERADE 来实现,但这会导致一个严重问题:后端服务器看到的来源IP全部变成了中转机的IP,丢失了真实客户端IP信息。 本文将介绍一种无SNAT转发方案,通过 DNAT + 策略路由的组合,在转发所有流量的同时保留客户端的真实IP地址。

tinyfecVPN 全自动部署

这里提供一个“够用且可回滚”的 tinyfecVPN 一键部署脚本:自动安装依赖、拉取/更新源码(含 submodule)、编译 NOLIMIT(无限制)版本、安装二进制到 /usr/local/bin/tinyvpn,并生成/启用 systemd 服务(Server/Client 分开)。脚本全程交互式输入参数,直接写进 ExecStart,重启不丢;部署后默认删除源码目录(带路径保护),机器上只留下 tinyvpn + systemd unit。

利用iptables转发服务器流量

这里提供一个“够用且可回滚”的最小 iptables 转发脚本:安装时交互式输入转发目标 IP、需要排除的不转发端口(可多个),并选择入口网卡;其余 TCP/UDP/ICMP 流量统一 DNAT 到后端。由 systemd 托管,重启不丢;一键卸载,出错可干净撤回。 依赖说明 管理脚本会检测 iptables/ip/sysctl/systemctl,缺失时可自动用 apt/dnf/yum 安装(也可提前设置 AUTO_INSTALL=1 静默安装)。在容器环境仍需 CAP_NET_ADMIN 等权限,否则无法生效。

自建Docker镜像加速服务 mirrors

使用docker compose部署,就俩文件配置好就可以用了 部署镜像仓库代理 (1)创建账号密码【可选】 配置账号密码:设置密码认证后,我们在进行拉取镜像时就需要先 docker login登入到我们的自建的代理镜像仓库,然后才可以拉取镜像 注意:执行htpasswd命令时,请把username和password修改为你自己的账号和密码

用Caddy搭建Docker加速服务

用Caddy搭建Docker加速服务, 不用跑docker什么的,直接用就可以了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 …

Debian和Centos自动更新安全补丁,防止被黑

Debian 12 启用自动更新安全补丁 在 Debian 12 上启用自动更新安全补丁(自动安全更新)通常可以使用 unattended-upgrades 工具来实现。下面是详细步骤: 安装 unattended-upgrades 软件包: 通常 Debian 12 默认源中已经包含此工具,如未安装可执行: 1 2 sudo apt-get update sudo apt-get install unattended-upgrades 通过交互式配置启用自动更新: 安装完成后,可以使用 dpkg-reconfigure 来进行配置: 1 sudo dpkg-reconfigure …

禁用docker的ufw,禁止docker无视ufw规则

默认情况下,创建容器如果绑定了端口,则 docker 会自动修改 iptables 打开这个端口。然而 UFW 并不会显示这个规则,这就导致了不管使用 UFW 做什么限制,docker 绑定的这个端口都是开放的。 问题所在 默认情况下,创建容器如果绑定了端口,则 docker 会自动修改 iptables 打开这个端口。然而 UFW(uncomplicated firewall) 并不会显示这个规则,这就导致了不管使用 UFW 做什么限制,docker 绑定的这个端口都是开放的。

Caddy设置仅允许cloudfalre的ip访问,防止被穿过waf

此配置的主要用途是确保没有人可以绕过Cloudflare或其他安全反向代理提供商对网站发起拒绝服务攻击(DoS)。类似功能可以通过real_ip和其他插件实现,但本文的重点是简化设置,不需要安装插件。 需要注意的是,Cloudflare的IP范围并非静态的,尽管变化频率非常低,仍需要手动更新。有人仍然可以通过Cloudflare Workers作为第三方在Cloudflare IP范围内发起请求,不过要使用这种方式进行大规模拒绝服务攻击难度较大。