UniFi Network「Site Overview」风格的爱快(iKuai)控制台。仓库分为两个独立工程:
frontend/ Vite + React + TypeScript,轮询爱快 v4.0 REST API
backend/ Node.js ISP 连通性探测服务,数据存 MySQL
openapi/ 爱快 v4.0 规范(98 份,字段依据)
前后端各自有独立的 package.json 与 .env,可分别安装、运行、部署。
⚠️ 系统要求:仅支持 iKuai(爱快)4.0 及以上版本的系统 —— 依赖 iKuai v4.0 REST API(/api/v4.0/...),旧版固件(3.x 及更早,仅有/Action/call接口)不兼容。
⚠️ 必须部署数据库(MySQL): 后端用 MySQL 持久化 ISP 探测历史以及登录账号,因此 MySQL 是必需依赖,运行后端前请先准备好(见下方「MySQL」)。如只是本地试跑前端,可不连库,但 ISP 历史与登录将不可用。
⚠️ 关于定位:为了防止不必要的问题,当前版本设置为「只读看板」 —— 所有页面只做数据展示(监控、统计、状态总览),不提供任何写入/修改设备配置的操作。 后续会逐步加入可写功能,请留意后续更新。
截图取自真机(爱快 4.0.222),界面为 UniFi Network 风格,支持浅色 / 深色主题,右上角
LIVE表示实时轮询中。
![]() 总览 · 全网健康度 / WiFi / 互联网流量 / ISP 延迟 / AP 负载 |
![]() 拓扑 · 网络拓扑图 + 线路实时监控 |
![]() 设备 · 网关 / 周边设备列表与状态 |
![]() 客户端 · 在线终端、接口、实时上下行 |
![]() 物理网口 · 网口连接 / 速率 / 双工 |
![]() 接口 · WAN / LAN 配置总览 |
![]() DHCP 策略 · 地址池 / 网关 / DNS / 租期 |
![]() 静态分配 · IP-MAC 绑定 |
![]() DHCP 租约 · 当前已分配地址 |
![]() DNS 设置 · 代理 / 缓存 / 防护状态 |
![]() 路由 · 负载分流 / 域名分流 / QoS / 静态路由 |
![]() VPN · WireGuard / IPSec / OpenVPN / L2TP 等 |
![]() 认证 · 在线认证用户 / 账号 / 套餐 / WEB 认证 |
![]() 对象库 · IP / MAC / 域名 / 端口 / 时间对象 |
![]() 流量 · 应用 / 终端流量 TOP 排行 |
![]() 射频 · AP 射频 / 信道在用终端统计 |
![]() 负载 · 性能 / 网络 / 在线终端 / 收发包趋势 |
![]() 审计 · 行为审计、协议占比与终端排行 |
![]() 服务 · FTP / Samba / SNMP / HTTP 服务总览 |
![]() 安全 · MAC / 域名 / URL 访问控制、ACL |
![]() 安全 · 高级防护(禁 PING / DoS / TCP MSS 等) |
![]() 系统 · 系统信息、版本、维护与性能 |
截图中部分敏感字段(客户端名称、MAC、DNS、公网地址等)已做打码处理。
# 1) 安装依赖(两个工程)
npm run install:all # 等价于在 frontend/ 与 backend/ 各 npm install
# 2) 准备数据库(必需,见下方「MySQL」)并填好 backend/.env
# 3) 启动(两个终端)
npm run backend # 终端 A:ISP 探测后端 (:5274)
npm run frontend # 终端 B:前端 (http://localhost:5273)
# 4) 浏览器打开 http://localhost:5273,用首次启动的默认账号 admin / admin 登录,并尽快改密:
# cd backend && npm run user passwd admin 你的新密码也可直接进入子目录运行:cd frontend && npm run dev / cd backend && npm start。
登录与 ISP 历史都依赖后端 + MySQL;只跑前端时这两项不可用,其余真实数据照常。
前端 frontend/.env:
| 变量 | 说明 |
|---|---|
VITE_IKUAI_TOKEN |
API 密钥,作为 Authorization: Bearer <token> 发送 |
VITE_IKUAI_BASE |
爱快设备地址(Vite 把 /api 代理到这里) |
VITE_POLL_MS |
轮询间隔(毫秒),默认 2000 |
VITE_ALLOW_MOCK |
1 时设备不可达回落模拟数据;0 只用真机 |
SVC_PORT |
后端端口,Vite 把 /svc 代理到这里 |
后端 backend/.env:
| 变量 | 说明 |
|---|---|
IKUAI_BASE / IKUAI_TOKEN |
爱快设备地址与密钥(用于读取 WAN 网关做 ISP 延迟探测) |
SVC_PORT |
后端监听端口,默认 5274 |
PROBE_INTERVAL_MS |
探测间隔,默认 300000(5 分钟) |
ISP_LOOKUP_URL |
解析当前 ISP 名称的 geo-IP 服务(默认 ip-api.com) |
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAME |
MySQL 连接 |
AUTH_ENABLED |
是否开启登录(1 开启,0 关闭),默认 1 |
AUTH_SECRET |
会话 Cookie 的 HMAC 签名密钥;留空则每次启动随机生成(重启后登录失效) |
AUTH_USER / AUTH_PASSWORD |
首次启动的初始账号(仅在 users 表为空时创建);默认 admin / admin |
AUTH_SESSION_HOURS |
登录会话有效期(小时),默认 168(7 天) |
secure:false的 Vite 代理兼容自签名证书;浏览器只与 Vite 同源通信,无 CORS/混合内容。 ISP 名称解析会把路由器公网 IP 发送给第三方(ip-api.com),可通过ISP_LOOKUP_URL更换或自建。
必需依赖。 后端用 MySQL(
mysql2)持久化探测历史(probes表)与登录账号(users表),所以运行后端前必须先部署 MySQL(5.7+ / 8.x);已弃用 SQLite。
# 初始化数据库与表(MySQL 5.7+ / 8.x)
mysql -u root -p < backend/sql/init.sqlbackend/sql/init.sql 会创建 ikuai_console 库与 probes / users 表(脚本里附带可选的最小权限账号)。
若 backend/.env 中的账号具备建库权限,后端启动时也会自动建库建表;连不上时会重试并照常对外服务(但登录需要数据库就绪)。
probes:每个探测周期一行 ——ts(unix 秒,主键)、online、isp、ip、以及到运营商/Cloudflare/Google/GitHub/Microsoft 的延迟(ms)。users:登录账号 ——username(唯一)、password(scrypt 哈希,绝不明文)、创建/更新时间。
控制台带一个简单的登录门:账号存在 MySQL 的 users 表里,密码用 scrypt 加盐哈希(node:crypto,无第三方依赖,绝不明文存储)。登录态是一枚 HttpOnly、HMAC 签名的会话 Cookie(AUTH_SECRET 签名),后端对 /api(转发到爱快)与 /svc/isp/* 数据接口做鉴权拦截。
-
首次启动默认
admin/admin(users表为空时,后端按AUTH_USER/AUTH_PASSWORD创建初始账号并在日志告警)。请尽快改密:cd backend && npm run user passwd admin 你的新密码
-
管理账号(在
backend/下运行):npm run user add <用户名> <密码> # 新建用户 npm run user passwd <用户名> <新密码> # 改密码 npm run user list # 列出用户
-
建议设置固定的
AUTH_SECRET(在backend/.env里),否则每次重启都要重新登录。生成一个:node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" -
关闭登录:设
AUTH_ENABLED=0(适合内网可信环境)。 -
修改密码:登录后点右上角头像即可弹窗改密(也可用上面的
npm run user passwd)。
接口:POST /svc/auth/login、POST /svc/auth/logout、GET /svc/auth/me、POST /svc/auth/password(改密,需登录态)。
开发模式(Vite)下
/api由 Vite 直接代理到设备、不经后端,因此登录拦截只在“单进程/Docker 部署”(后端转发/api)时对/api生效;前端 UI 始终有登录门。
GET /svc/isp/summary— 当前 ISP 名称、公网 IP、各目标延迟、24h/7d 在线率GET /svc/isp/history?buckets=60&hours=24— 分段在线率(驱动「ISP 性能」长条)
零运行时依赖之外仅 mysql2:node:http + node:net + 系统 ping。
同一个镜像跑两个角色(ROLE),通过 MySQL 解耦:
| 服务 | 网络 | 职责 |
|---|---|---|
probe |
network_mode: host |
ISP 检测 + 延迟探测(走宿主网卡,延迟准、能 ICMP、能到 WAN 网关),写 MySQL |
web |
1panel-network |
托管前端 + 反代 /api + 提供 /svc,读 MySQL;映射 60001:5274 |
# 复用 backend/.env;1panel-network 必须已存在(external)
docker compose up -d --build
# 浏览器访问 http://<宿主机>:60001- iKuai token 由 web 后端注入(
IKUAI_TOKEN),不进前端包。 probe加了cap_add: NET_RAW,运营商(网关)延迟才不为空。- MySQL 解析:
web在桥接网里解析不了Rasp-Mysql这种主机名 —— 把backend/.env的DB_HOST改成 MySQL 的 IP(对两个容器都最省事),或在web用extra_hosts映射。 1panel-network需先存在(由 1Panel 创建);compose 里声明为external: true。
单进程模式:不设
ROLE(默认all)即 probe+web 合一;再设FRONTEND_DIR=<dist 路径>就能一个进程托管前端 + 反代/api+ 探测(适合不分网络的简单部署)。
- 总览 UniFi 风格:顶栏 + 左侧设备/ISP 面板 + 主健康区;浅色主题,右上角切换深色。
- ISP 卡片 — 真实 ISP 名称 + 到运营商/Cloudflare/Google/GitHub/Microsoft 的真实延迟。
- ISP 性能 — 后端 MySQL 历史在线率。
- 无线 / AC — 先查
GET /network/ac/services的ac_status;未开启 AC 显示「未开启 AC 功能」, 开启后按wireless-score/wireless-statistics/ac/ap-config真实渲染。
frontend/
src/lib/ api.ts(iKuai 端点) svc.ts(后端客户端) auth.ts(登录) format.ts usePoll.ts mock.ts
src/components/ Header Sidebar DevicePanel charts(纯SVG) ui icons
src/pages/ Dashboard.tsx … Login.tsx(登录页)
vite.config.ts tsconfig*.json index.html .env
backend/
src/index.mjs HTTP 接口 + 探测调度 + 登录鉴权
src/lib/ env.mjs db.mjs(mysql2) ikuai.mjs probe.mjs auth.mjs(scrypt 哈希 + 会话签名)
src/cli/user.mjs 账号管理 CLI(npm run user)
sql/init.sql 建库建表脚本(probes + users)
.env





















