nomdn
|
862717a47e
|
docs: 域名自有化、补四篇 API 文档与 9 张配图
- 域名自有化:全站 ipw.cn 映射到自有域名(站点 nipw.cn;取本机 IP 用 test./4./6.wsmdn.top),
7 篇正文与 6 个 svg 图层名同步替换;纯文本接口的示例代码相应重写。
- 新增 4 篇 API 文档(api/ip/{locate,myip,query}.md、api/whois/query.md):按自有接口实测
重写,给出可直接执行的公开实例(节点直连 + middleware-1 转发),另设 1.2 节引导到拨测
控制台 boce.wsmdn.top 取用已部署的节点与中间件。
- 新增 4 篇文档:tls / dns_dig / code_getip / check_userip_ipv4_ipv6,正文首行徽标一律标
「转载」(本站为转载方)。
- 补齐 9 张原始配图,置于 public/doc/ 下同名覆盖(wayback 仅存 1 张,实际取自 arquivo.pt)。
- 修正 Serverless 部署支持范围的表述,与仓库内实际实现对齐;/info 拆分后正文同步。
|
2026-09-25 20:49:52 +08:00 |
|
nomdn
|
d7cc9d45e7
|
feat: 节点远程运维能力落地——运行时配置/能力协商/OTA 下发 + EO 上报通道
OTA 模型反转:节点不再跟随 GitHub Release 自更新,改为收集中心下发、节点执行
的一次性任务(WS type=ota / HTTP POST /v1/ota),升级时机由管理员掌握。
- 新增 /v1/config(GET/PATCH,?persist=true 写回)与 /v1/config/refresh,WS 同款 type=config;凭据类键遮蔽为 ***,应答带 restartRequired / remoteProtectedKeys 键
- access-token / report-token 列入远端不可覆盖名单,本地 PATCH 不受限
- node-ota 开关支持运行时热改(每次下发 OTA 指令时才读取),非法字面值报 unknown 且不覆盖原值
- 节点上报 capabilities(probe/report/config/ota),收集中心三态门控管理指令
- ws-url 支持热更新(per-URL 连接协程多退少补),node-id/node-key 仍需重启
- EO 边缘函数补齐 HTTP 上报通道(report.go)与 GET / 的版本/能力回报
- 上报循环常驻化;显式持有 http.Server 实现优雅停机
- 修复 block-private-ips 启动期忽略 setting.json 的口径不一致
- OTA 开关键沿用 node-ota / NODE_OTA,语义改为缺省允许、仅显式 false 禁用;install.sh 不再询问自更新
- 文档站新增 节点 API与协议参考 / 公开 API / 功能总览
- Dockerfile 注入 VERSION/COMMIT/BUILD_TIME
|
2026-09-13 21:05:27 +08:00 |
|
nomdn
|
e9b3a75f02
|
feat: v3.3.0 — OTA 优雅交接与中间件自更新、多架构镜像、全项目审计修复
OTA 自更新:
- Windows 改优雅交接:预检新二进制 → 原子替换 → 优雅停机 → 拉起新进程 → 健康检查确认 → 老进程退出,失败自动回滚 .old,不再依赖端口抢占竞态
- 下载增加 Release 资产尺寸精确比对;库缺失慢启动按子进程存活判定(10min 宽限)
- OTA 移植至中间件(middleware-go/ota.go,ota/OTA + gh-proxy 配置)
多架构镜像:
- 新增 docker.yml:amd64 原生 + GitHub 原生 ARM 实例构建 arm64/armv7(无 QEMU),打 v* 标签推送 GHCR(DockerHub 预留注释暂未启用)
- 两个 Dockerfile 支持 buildx 交叉编译(TARGETVARIANT → GOARM 映射),修复 middleware-go Dockerfile 漏拷 ws.go 导致镜像无法构建
审计修复(安全/崩溃/数据正确性):
- SSRF:私网黑名单补齐 CGNAT/ULA/NAT64/组播段;重定向校验检查即将跳转的目标并限 10 跳;边缘函数 tcping 补私网拦截;探针响应体 10MB 上限
- 修复 url.Parse 空指针 ×4、启动解析器初始化崩溃、IP2LOCATION .ZIP 大小写永久缺库、残缺下载覆盖现有库、WHOIS 单次 Read 截断、Bilibili 查询无超时
- 修复中间件 WS 写失败干等 30s、僵死节点永久占位;前端死 catch、路径穿越、toFixed 空指针、首页 IPv4/IPv6 优先判断
- 新增 TRUSTED_PROXIES(后端/中间件)与缓存定期清扫;CORS trim/端口归一化等 20+ 项边缘修复
部署:
- install.sh:curl -f、systemd unit 引号与 env 转义、重跑安装 restart 生效
- CI go-version 对齐 1.26.6
|
2026-08-29 20:17:31 +08:00 |
|
nomdn
|
56c08f3629
|
feat(ota): major 版本变化不自动更新
- 新增 majorSame():latest 与 current 的 major 段不同(如 3.x→4.x)时跳过更新,
记 Warn 日志提示人工升级(minor/patch 仍自动跟进)
- 任一段无法解析(本地构建 VERSION 为空)放行,不影响首次部署升级
|
2026-08-28 22:30:03 +08:00 |
|
nomdn
|
c0a8f7e55c
|
feat(node): 新增 OTA 自更新(node-ota / NODE_OTA 开关)
- 新增 src/ota.go:定期检查 GitHub Release(启动 5 分钟后首次,之后 6h+jitter),
按 GOOS/GOARCH 匹配资产,下载后替换当前二进制并重启
- 替换策略:当前二进制改名备份为 <程序名>.old,新二进制就位,失败自动回滚;
下载文件过小(<1MB)判定为异常丢弃
- 重启:Unix 用 syscall.Exec 原地换镜像(PID 不变),Windows 起新进程后退出
- 版本比较支持 v 前缀与预发布后缀;远端为空/解析失败则不更新
- 默认关闭,需 node-ota:'true' 或 NODE_OTA=true;远端配置可统一开关
- 文档:config.md 配置项 + deploy-node.md「OTA 自更新」章节
|
2026-08-28 22:04:37 +08:00 |
|
nomdn
|
fa9b83c951
|
docs(deploy-node): 修正 IP 数据库下载体积 200MB→450MB
|
2026-08-28 19:57:24 +08:00 |
|
nomdn
|
c81f92bbd4
|
docs: DNS 自动探测兜底与数据库体积说明更新
- config.md / deploy-node.md / getting-started.md:dns-server/dnssec-server
留空时启动自动探测系统 DNS 的说明
- 顺带修正 IP 数据库下载体积 200MB→450MB(含 IP2Location DB11+ASN)
|
2026-08-28 19:57:01 +08:00 |
|
nomdn
|
e1a00236ee
|
chore: 项目结构重组(Go 后端迁入 src/,serverless 迁入 serverless/)
- Go 后端(main.go/ws.go/ipdb/webtest/ssrf/go.mod 等)移入 src/
- EdgeOne/lemon-getip 等 serverless 组件移入 serverless/
- 同步更新 README 结构图、docs 路径引用、GitHub Actions 工作流
(build_and_release 加 working-directory: src;edgeone/workers 触发路径与 cd 更新)
|
2026-08-27 10:28:29 +08:00 |
|
nomdn
|
778ed2bd29
|
refactor: 配置键统一 kebab-case、ip2region 返回 JSON、WS 多活
- 中间件/后端 JSON 配置键统一 kebab-case:APIBaseURL→api-base-url、
IPLocationAPI→ip-location-api、apiKeys→api-keys、wsKeys→ws-keys;
环境变量 APIKEYS/WSKEYS 改下划线 API_KEYS/WS_KEYS;
修正 remote-ingore-config 拼写为 remote-ignore-config(REMOTE_IGNORE_CONFIG)
- ip2region 后端预分割为 JSON(country/administrative_area/city/isp),
前端 location/ipv6 页面与 /ip 路由不再 split 管道串
- WS_URL 多中间件同时连接全部(多活),任一断开只重连自己,不再主备切换
- 新增前端 /ip 归属地查询路由(index/[ip],text/plain 输出)
- 同步更新 docs/install.sh/setting.json.example
|
2026-08-26 23:27:23 +08:00 |
|
nomdn
|
e8ec3757fd
|
fix: 更新文档以支持多个中间件地址同时连接的说明
|
2026-08-24 22:57:30 +08:00 |
|
nomdn
|
069847e11f
|
fix: 统一配置文件中的 access_token 为 access-token
|
2026-08-22 22:36:09 +08:00 |
|
nomdn
|
30ba61bc11
|
refactor(middleware): 拆分 apiKeys/wsKeys 为独立鉴权表
- apiKeys 仅用于 HTTP 转发鉴权(注入 Authorization: Bearer)
- 新增 wsKeys 用于 WS 注册校验(register key 比对,否则 401 断开)
- 两表全局变量(API_KEYS/WS_KEYS)、环境变量(APIKEYS/WSKEYS)相互独立
- 远端配置对 apiKeys/wsKeys 均强制忽略,不随远端覆盖
- 更新 config/deploy 文档与 install.sh 提示,标明两者分开管理
|
2026-08-22 22:19:45 +08:00 |
|
nomdn
|
fa5c2329fe
|
refactor: 配置大重构——节点池统一结构(APIBaseURL 三栈 + IPLocationAPI 纯数组)
将前端与中间件的『一功能一配置项』改为统一节点池结构:
- APIBaseURL:合并原 apiBaseUrls(whois/ssl/detail)、NSLookup(dns/dnssec)、
TCPing、SpeedTest,含 {IPv6,IPv4,DualStack} 三栈;
whois/ssl/detail 用 DualStack,dns/dnssec/tcping/speed 用三栈平铺
- IPLocationAPI:原 IPLocationAPIs,location/asn,纯数组(无栈区分)
- 节点项统一为 {label, id, url, ws?};前端无 ws 字段
- 中间件 handler/readConfig/applyRemoteConfig 改为按池取数,
flattenStack 平铺查找节点,tcping/speed 分页取栈(普通页 DualStack+IPv4、
ipv6 页 DualStack+IPv6)均可在池内命中
- 前端 11 个页面与 server 路由同步改用新池取数
- 文档 config.md / deploy-* 同步;.gitignore 忽略 tmp/(冒烟产物)
- 冒烟验证:whois/ssl/detail/dns/dnssec/location/asn/tcping/udping/speed 分发正确
|
2026-08-22 21:51:32 +08:00 |
|
nomdn
|
957ac5a4c8
|
docs: 安装脚本管道执行警告、统一 GitHub alert 语法、README 安装命令更新
- getting-started.md:交互式部署新增 [!WARNING] 警告——勿用
`curl ... | sudo bash` 管道方式执行(边下载边执行,网络抖动时 bash
读到不完整内容报 syntax error);curl 参数改为 -fsSL -o
- deploy-node.md:方案五命令块补全获取脚本步骤(git clone / curl -fsSL),
版本兼容提醒改为 [!WARNING]
- config.md:两处敏感凭据警告去 emoji(块引用改 [!WARNING],列表项去 ⚠️)
- 全站警告块统一为 GitHub alert 语法([!WARNING] / [!IMPORTANT]),无 emoji
- 快速开始命令补全 git clone 步骤(install.sh 需先从仓库获取)
|
2026-08-22 15:32:29 +08:00 |
|
nomdn
|
0d1a9e5bbd
|
fix:修正一键安装脚本
|
2026-08-22 11:24:20 +08:00 |
|
nomdn
|
10f48f8619
|
feat: 一键安装脚本(install.sh 交互式部署 + systemd),快速开始只保留交互式部署
## install.sh(新增)
一键安装后端节点:自动检测架构 → 下载最新 release 二进制 → 交互式输入配置
(环境变量注入,无需 setting.json)→ 生成并启动 systemd 守护进程。
- 前置检查:root 权限 / systemd 存在 / wget|curl 可用
- 交互式配置项:安装目录、端口、access_token、DNS(主从逗号分隔)、DNSSEC 专用
DNS、ipdb、CORS、远端配置地址、WS 通道接入、其他环境变量
- 下载用 GitHub API 解析最新 tag(releases/download/latest 会 404,latest 非真实 tag)
- WS 接入规则:WS_URL 留空默认 wss://middleware-1.api-ipw.wsmdn.top;
NODE_ID 强制自动生成 UUID(/proc → uuidgen → /dev/urandom 三级降级);
NODE_KEY 必填(不加 key 禁止启用 WS),安装完成提示加入中间件 apiKeys
- 生成 systemd 服务:配置以 Environment="K=V" 注入(仅非空写入),
daemon-reload + enable --now 自动启动
- service 描述使用中性名(Lemon IPW Backend Node),不含站点标识
## 文档
- getting-started.md 重写:只保留交互式一键部署(install.sh),删除手动构建、
配置示例与手写 systemd 章节
- deploy-node.md 新增「方案五:一键安装(install.sh)」:配置项表格、WS 规则、
systemd 管理命令、版本兼容提醒(v1.1.0 读 IPW_ 旧变量名)
- deploy-middleware.md / deploy-node.md / index.md:systemd 指引改指向方案五
## 其他
- setting.json 清理测试残留值(remote-config-url / ws-url 的 ws://localhost)
|
2026-08-21 22:17:52 +08:00 |
|
nomdn
|
694ddac6eb
|
refactor: WS 配置去 IPW 前缀、删除 command 指令、注册被拒 30s 重试
## WS 客户端配置改名(去 IPW 前缀)
- 环境变量:IPW_WS_URL → WS_URL、IPW_NODE_ID → NODE_ID、IPW_NODE_KEY → NODE_KEY
- setting.json / 远端配置键:ipw-ws-url → ws-url、ipw-node-id → node-id、ipw-node-key → node-key
- 同步位置:main.go(env 读取 / viper 键 / 远端 configValue + ignored 判断)、
ws.go(配置注释 / 日志)、setting.json、docs/guide/config.md
- 全局变量名 WS_URL / WS_NODE_ID / WS_NODE_KEY 保持不变
## 删除 WS command 指令(两侧)
- 中间件(middleware-go):删除 handleWSCommand(reload_config 热重载,原本即死代码)、
onCommand 回调字段、newWSServer 参数、Handler 的 case "command" 分支
- 节点侧:撤销未落地的 wsActive / wsSendCommand / /v1/ws-command 路由
- wsCommand 类型保留(register_error 错误消息仍使用)
## 注册被拒重试间隔 3s → 30s
- wsClientOnce 返回值从 bool 改为 time.Duration(重试等待时长):
连接失败/断开/心跳失败 → 3s;注册被拒(register_error,多为 key 配置错误)
→ 30s 避免空转刷日志;配置缺失 → 0 停止
- wsClientLoop 直接使用返回时长,多中间件场景各 URL 独立计间隔
## 文档
- deploy-node.md 新增「WS 通道接入(可选)」:WS_URL/NODE_ID/NODE_KEY 三配置
用法、主备切换、双向心跳、注册 key 校验、NODE_ID 与中间件节点 id 对应关系
- deploy-middleware.md 节点侧接入步骤交叉引用 deploy-node.md WS 章节
- config.md 同步 ws-url/node-id/node-key 新键名(remote-ingore-config 示例、安全说明)
验证:go build/vet 通过;全站文档无 IPW 前缀残留。
|
2026-08-21 18:22:51 +08:00 |
|
nomdn
|
73ecf67c4e
|
feat: WS 通道、探针函数抽取 webtest、统一 viper 配置、DNS 主从 failover
大幅重构与功能扩展,覆盖后端探针、WS 双通道、配置体系与文档四大块。
## 探针核心抽取 webtest 包(按 API 单文件)
- 从 main.go 抽取站点检测核心到 webtest/,每个 API 一个文件:
website.go(CheckWebsite) / speed.go(SpeedTest) / ssl.go(CheckSSL) /
dns.go / dnssec.go / tcping.go / whois.go + types.go / helpers.go / client.go
- 函数签名保持原样 (url, version):HTTP 客户端经 webtest.SetHTTPClient
(V4Client, V6Client) 注入,main.go 启动时接线,不污染签名
- main.go 只留 handler 薄包装(缓存 / SINGLE_STACK / 双栈编排 / c.JSON 都在
handler 内),用户注释、包名、函数名、变量名均未改动
- 删除中途的 probeX 编排层 / 自调用方案(均已被"函数+handler 同源"取代)
## WS 双通道(中间件服务端 + 节点客户端)
中间件(middleware-go/ws.go,新增):
- 独立端口 WS 服务端(ws-port,默认 8092,0=关闭,路径 /ws),与 fiber HTTP
完全分离;节点配置 "ws": true 时拨测请求改走 WS 通道,HTTP 通道保留
- 注册 key 校验:节点在 apiKeys 配了 key 就必须传对,不传/传错返回
register_error {"code":401,"command":"invalid key"} 并断开;未配置开放
- probe/probe_result 按 requestId 异步关联(并发多拨测),未连接/超时返回 502
- 每 20s ping + status 统计上报;新增处理节点主动心跳 ping → 回 pong
节点客户端(ws.go,新增):
- IPW_WS_URL 支持逗号分隔多中间件(第一个为主,故障自动切换下一个)
- 双向心跳:每 10s 发 ping,发送失败重试,连续失败 3 次判定中间件不可用,
断开并切换下一个 URL;收到中间件 ping 回 pong;断线 3s 重连
- 收到 probe 直调 webtest 函数 + 共享缓存,probe_result 上报
- 配置:IPW_WS_URL / IPW_NODE_ID / IPW_NODE_KEY(env > setting.json > 远端)
## 配置体系统一 viper + remote-ingore-config
- middleware-go 从自定义 loader 迁移到 viper 统一读取(先 Getenv 再
viper.GetString,env 优先 > setting.json > 默认值)
- remote-ingore-config(env REMOTE_INGORE_CONFIG):数组中的配置项不被远端
覆盖,applyRemoteConfig 逐键 !ignored(key) 判断跳过(两端 main.go 均已实现)
- 敏感凭据强制忽略:apiKeys(中间件)与 access_token(后端)不随远端配置覆盖
- JSON 键名规则:标量配置项用连接线(http-timeout-seconds / rate-limit /
ws-port / remote-config-url / remote-ingore-config),节点键保留驼峰
(apiBaseUrls / IPLocationAPIs / TCPing / SpeedTest / NSLookup / apiKeys)
- ws-port 与 port 一致用 stringOrNumber(兼容 "8092" 与 8092,"0"=关闭)
## DNS 主从 failover + DNSSEC 专用服务器
- dns-server 支持逗号分隔多地址(第一个为主,主失败自动切换从,超时/网络
错误/SERVFAIL 均触发切换);每项支持 ip:port(UDP)或 https://(DoH)
- 新增 dnssec-server(env DNSSEC_DNS_SERVER):DNSSEC 查询专用 DNS,
未配置则沿用 dns-server;dnssec.go 改用 queryDNSSEC
- EO 兼容版本(edgeone/cloud-functions/webtest)同步:主从列表 +
queryDNSSECMsg(保留带 duration 签名)+ index.go DNSSEC_DNS_SERVER 接线
## 前端
- utils/middleware.ts:RETRY_STATUS_CODES 加入 502——请求中间件收到 502
自动切换下一个候选(config.Middleware 外部节点 + 内置中间件兜底)
- server/routes/middleware/[...slug].get.ts:内置中间件新增单 IP 限流
(rateLimitPerMinute,默认 120,0=不限流)+ Origin/Referer 校验
- config/index.ts:新增 rateLimitPerMinute;新增 IP 直连新节点
(tencent-sh 等 url 留空,仅经独立中间件转发);删除 huawei 节点
## 文档
- 新增 docs/guide/config.md「配置文件」独立页面(后端 setting.json 全字段、
前端 config/index.ts、内置/独立中间件、远端配置详解)
- getting-started.md 只留最小示例 + systemd,配置详解移入 config.md
- deploy-middleware.md 新增「WS 通道」章节(架构/协议表/接入步骤/注册 key
校验);deploy-node/deploy-frontend 链接修正到 config.md
- 侧边栏新增「配置文件」入口;outline 显示 h2+h3
冒烟验证:WS 端到端(注册 key 四场景、拨测 200、断线切换中间件)、DNS 主从
failover、dnssec-server 专用、ws-port 三写法均通过;go build/vet 双端通过。
|
2026-08-20 22:54:08 +08:00 |
|
nomdn
|
b4a18e0fbf
|
feat: 文档站新增简介/部署方案页与 favicon,中间件不再透传 Origin
- docs: 新增 info/overview(项目概述)、guide/getting-started(快速入门:构建/配置/systemd)、deploy-node(EO/Vercel/Docker/二进制 + Serverless IPv4-only 说明)、deploy-middleware(Docker/二进制 + example 复制提示)
- docs: 前端部署页重构为 EdgeOne/Vercel/Cloudflare Workers/直接运行(去掉 Docker,去掉 CF 一键按钮);部署总览改三组件表;首页按钮指向快速开始;侧边栏分简介/部署;移植 favicon.svg/ico
- middleware-go / 前端内置中间件:转发不再携带 Origin,避免上游 CORS 误判(保留 Authorization Bearer 注入)
|
2026-08-19 16:10:39 +08:00 |
|