Neko Master 是一个现代化、优雅的网络流量可视化与分析仪表盘
Neko Master 详细部署教程
项目概述
Neko Master 是一个现代化、优雅的网络流量可视化与分析仪表盘。它专注于本地网关环境的流量监控、审计和多网关支持,提供实时监控、趋势分析、域名分析、IP 分析和代理统计等功能。
重要声明:本项目是一个本地网关环境的流量分析与可视化工具,不提供任何网络访问服务、代理订阅或跨网络连接功能。所有数据均从用户自己的网络环境中采集。
核心特性:
- 实时监控(WebSocket 毫秒级延迟)
- 多维度趋势分析(30分钟 / 1小时 / 24小时)
- 域名分析与 IP 分析(ASN、地理位置)
- 代理节点流量统计
- PWA 支持,可安装为桌面应用
- 深色模式与中英文双语支持
- 多后端支持,可同时监控多个 OpenClash 实例
技术栈:Next.js 16 + React 19 + TypeScript + Tailwind CSS + Node.js (Fastify) + SQLite + ClickHouse(可选)
部署前准备
系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows / macOS / Linux |
| Docker | 20.10+(推荐部署方式) |
| Docker Compose | v2.0+ |
| 内存 | 最低 512MB,推荐 1GB+ |
| 磁盘空间 | 最低 1GB(不含 ClickHouse 数据) |
| 网络 | 需能访问你的网关设备(如 OpenClash) |
支持的网关类型
- Clash / Mihomo:通过 WebSocket 实时采集
- Surge v5+:通过 HTTP 轮询采集
准备工作
确保 Docker 和 Docker Compose 已安装:
1
2docker --version
docker compose version确保你的网关设备已启用外部控制接口(如 OpenClash 的”外部控制”功能),并记录下 API 地址、端口和 Token(如有配置)。
方案一:Docker Compose 部署(推荐)
这是最简单、最稳定的部署方式。
场景 A:最小化部署(仅暴露 3000 端口)
适合大多数用户,无需反向代理即可使用全部核心功能。
步骤 1:创建项目目录
1 | mkdir neko-master |
步骤 2:创建 docker-compose.yml 文件
1 | services: |
步骤 3:创建 .env 文件
1 | # 生成至少 32 字节的随机字符串 |
步骤 4:启动服务
1 | docker compose up -d |
步骤 5:访问仪表盘
打开浏览器访问 http://localhost:3000。
此模式下,如果 WS 未路由,应用会自动回退到 HTTP 轮询模式(约 5 秒延迟)。
场景 B:实时 WebSocket 部署(推荐配合反向代理)
适合需要毫秒级实时推送的场景。
步骤 1:创建 docker-compose.yml 文件
1 | services: |
步骤 2:创建 .env 文件
1 | COOKIE_SECRET=$(openssl rand -hex 32) |
步骤 3:启动服务
1 | docker compose up -d |
步骤 4:访问
打开 http://localhost:3000。
方案二:Docker Run 部署
如果你不习惯使用 Compose,可以直接用 Docker 命令部署。
最小化部署(仅 3000)
1 | # 生成固定的 cookie secret(用于会话持久化) |
实时 WebSocket 部署
1 | export COOKIE_SECRET="$(openssl rand -hex 32)" |
本地 MMDB 查询(可选)
1 | docker run -d \ |
然后进入 Settings -> Preferences -> IP Lookup Source 切换为本地查询。
方案三:一键脚本部署
官方提供了一键部署脚本,会自动检测端口冲突并配置一切。
1 | # 使用 curl |
脚本会自动完成以下操作:
- ✅ 下载
docker-compose.yml - ✅ 检查默认端口(3000/3001/3002)是否被占用
- ✅ 建议可用的替代端口
- ✅ 创建配置文件并启动服务
方案四:源码部署
适合需要修改源码或参与开发的用户。
步骤 1:克隆仓库
1 | git clone https://github.com/foru17/neko-master.git |
步骤 2:安装依赖
1 | pnpm install |
如未安装 pnpm,先安装:
1 | npm install -g pnpm |
步骤 3:准备采集器环境变量
1 | cp apps/collector/.env.example apps/collector/.env |
步骤 4:启动开发服务
1 | pnpm dev |
步骤 5:访问
打开 http://localhost:3000 进行配置。
源码模式下:collector 默认监听
3001/3002,web 监听3000。如果修改了API_PORT,需要相应设置API_URL。
首次使用配置
连接 Clash / Mihomo 网关
- 打开
http://localhost:3000 - 首次访问时会弹出网关配置对话框
- 填写你的网关连接信息:
- 名称:自定义名称(如 “Home Gateway”)
- 类型:选择
Clash / Mihomo - 主机:网关后端地址(如
192.168.101.1) - 端口:网关后端端口(如
9090) - Token:如果配置了 Secret 则填写,否则留空
- 点击 Add Backend 保存
- 系统会自动开始采集和分析流量数据
💡 获取网关地址:进入网关控制面板(如 OpenClash)→ 启用”外部控制” → 复制 API 地址
连接 Surge 网关
步骤 1:启用 Surge HTTP API
在 Surge 配置中启用 HTTP 远程 API:
1 | [General] |
或通过 Surge 图形界面配置:
- HTTP Remote API:
Settings→General→HTTP Remote API - 端口:默认
9091 - 认证:建议设置密码以增强安全性
步骤 2:在 Neko Master 中添加 Surge 后端
- 打开 Neko Master 设置对话框
- 点击 Add Backend
- 填写连接信息:
- 名称:自定义名称(如 “Surge Home”)
- 类型:选择
Surge - 主机:Surge 运行的 IP 地址(如
192.168.1.1或127.0.0.1) - 端口:HTTP API 端口(默认
9091) - Token:HTTP API 密码(如已配置)
- 点击 Test Connection 验证配置
- 保存配置
💡 注意:Surge 使用 HTTP 轮询获取数据(相比 Clash 的 WebSocket 实时流),数据刷新延迟约 2 秒。
Agent 远程部署
当你需要一个中心化的 Neko Master 服务,同时从多个远程设备(OpenWrt、Linux、macOS)采集本地网关数据时,使用 Agent 模式。
工作原理
Agent 运行在网关附近,拉取数据并上报到面板——面板从不直接连接网关。
快速安装(UI 生成命令)
- 在仪表盘中进入
Settings → Backends,添加一个Agent后端,选择网关类型 - 点击 “View Agent Script” 复制一行安装命令,然后在目标主机上运行:
Clash / Mihomo 网关示例:
1 | curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \ |
Surge 网关示例:
1 | curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \ |
管理 Agent 实例
1 | nekoagent list # 列出所有实例 |
脚本会自动检测现有安装——如果
neko-agent已存在,只添加新实例而不重新下载。同一主机可运行多个实例(不同NEKO_INSTANCE_NAME)。
端口配置与冲突解决
端口说明
| 端口 | 用途 | 是否需要外部暴露 | 说明 |
|---|---|---|---|
| 3000 | Web UI | ✅ 必需 | 前端入口 |
| 3001 | API | 可选 | 前端默认使用同源 /api,通常无需公开暴露 |
| 3002 | WebSocket | 可选 | 实时推送端点,建议仅用于反向代理/隧道转发 |
解决端口冲突
方法 1:使用 .env 文件
在 docker-compose.yml 同目录创建 .env 文件:
1 | WEB_EXTERNAL_PORT=8080 # 修改 Web UI 端口 |
然后重启:
1 | docker compose down |
现在访问 http://localhost:8080。
方法 2:直接修改 docker-compose.yml
1 | ports: |
注意:如果使用直接 WS 访问(无反向代理)且外部 WS 端口不是
3002,需设置WS_EXTERNAL_PORT=<外部WS端口>。
方法 3:使用一键脚本
1 | curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash |
环境变量参考
部署核心变量
| 变量 | 默认值 | 用途 | 何时设置 |
|---|---|---|---|
WEB_PORT |
3000 |
Web 监听端口(容器内) | 通常不变 |
API_PORT |
3001 |
API 监听端口(容器内) | 通常不变 |
COLLECTOR_WS_PORT |
3002 |
WS 监听端口(容器内) | 通常不变 |
DB_PATH |
/app/data/stats.db |
SQLite 数据路径 | 自定义数据路径 |
WEB_EXTERNAL_PORT |
3000 |
外部 Web 端口映射 | 外部 Web 端口变化 |
WS_EXTERNAL_PORT |
3002 |
外部 WS 端口映射 | 直接 WS 访问且端口变化 |
COOKIE_SECRET |
自动生成 | Cookie 签名密钥 | 生产环境强烈建议设置 |
GEOIP_LOOKUP_PROVIDER |
online |
IP 地理定位源(online / local) |
默认使用本地 MMDB 查询 |
生产环境基线配置
1 | NODE_ENV=production |
使用 openssl rand -hex 32 生成 COOKIE_SECRET。
反向代理与隧道配置
推荐做法:将 Web 和 WS 保持在同一域名下,使用路径路由:/ → 3000,/_cm_ws → 3002。
Nginx 标准示例
1 | server { |
Cloudflare Tunnel 标准示例
~/.cloudflared/config.yml:
1 | tunnel: <your-tunnel-name-or-id> |
运行:
1 | cloudflared tunnel --config ~/.cloudflared/config.yml run <your-tunnel-name-or-id> |
关键注意事项
- 不要使用
ws(无前导斜杠)作为 WS 路径,可能过度匹配导致/_next/static/...出现426 Upgrade Required - WS 路由必须在捕获所有
/\*之上 NEXT_PUBLIC_WS_URL默认可选;如自定义,修改后需重启前端/容器- 只映射
3000仍可工作,但会回退到 HTTP 轮询(约 5 秒),实时性较差 - 大多数设置无需额外的
/api反向代理规则,前端使用同源/api,应用内部处理转发到3001
ClickHouse 可选部署
SQLite 是 Neko Master 的默认存储引擎,适用于大多数用户。如果你需要处理非常大的数据集(数十万域名/IP 条目)或对长时间范围(≥ 7 天)进行快速聚合查询,可以考虑启用 ClickHouse。
步骤 1:启动 ClickHouse 容器
仓库内置的 docker-compose.yml 已包含 ClickHouse 服务,通过 profiles: [clickhouse] 控制,默认不启动:
1 | docker compose --profile clickhouse up -d |
步骤 2:配置环境变量
添加到 .env:
1 | # 启用 ClickHouse 连接 |
步骤 3:重启服务
1 | docker compose --profile clickhouse up -d |
迁移路径(从 SQLite 升级)
阶段 1:双写(观察期,推荐起点)
1 | CH_ENABLED=1 |
阶段 2:切换读取源
1 | STATS_QUERY_SOURCE=auto |
阶段 3(可选):迁移历史数据
1 | ./scripts/ch-migrate-docker.sh |
阶段 4(可选):CH-only 模式
1 | CH_ONLY_MODE=1 |
即使设置
CH_ONLY_MODE=1,如果 ClickHouse 变得不健康,系统会自动回退到 SQLite 写入——不会丢失数据。
回退到纯 SQLite
1 | CH_ENABLED=0 |
认证与安全
生产安全基线
- 设置固定的
COOKIE_SECRET(否则重启后会话可能失效) - 正常运行中不要保持
FORCE_ACCESS_CONTROL_OFF=true - 仅在公开演示环境使用
SHOWCASE_SITE_MODE=true
启用/禁用认证
- 打开仪表盘,点击左下角侧边栏的 “Settings”
- 进入 “Security” 标签页
- 启用/禁用访问控制并设置 Token
忘记 Token(紧急重置)
如果忘记 Token,临时设置 FORCE_ACCESS_CONTROL_OFF=true 进入紧急模式:
Docker Compose:
在
docker-compose.yml中添加:1
2environment:
- FORCE_ACCESS_CONTROL_OFF=true重启:
1
docker compose up -d
打开仪表盘,在 “Settings -> Security” 中重置 Token
立即移除此环境变量并重启
常见问题排查
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 仅暴露 3000 能否正常使用 | 核心功能受限 | 可以。WS 未路由时自动回退 HTTP 轮询;完整实时体验需将 /_cm_ws 路由到 3002 |
| 端口冲突或修改后无法访问 | 连接失败 | 在 .env 中设置 WEB_EXTERNAL_PORT=8080 等,然后 docker compose down && docker compose up -d |
| 重启后登录/会话消失 | 会话失效 | 设置固定 COOKIE_SECRET,并挂载 ./data:/app/data |
| 本地 MMDB 查询需要哪些文件 | 地理定位失败 | 放置 GeoLite2-City.mmdb(必需)、GeoLite2-ASN.mmdb(必需)、GeoLite2-Country.mmdb(可选)到 ./geoip |
| 无法连接 OpenClash / 网关 | 连接超时 | 检查网关侧是否启用外部控制、主机/端口是否正确、Token/Secret 是否正确、容器网络能否到达网关 |
| 如何备份和恢复数据 | 数据丢失 | 备份:cp -r ./data ./data-backup-$(date +%Y%m%d);恢复:停止容器,复制备份,重启 |
数据持久化与更新
数据持久化
数据存储在容器内的 /app/data 目录。挂载到主机可防止数据丢失:
1 | volumes: |
更新到最新版本
1 | docker compose pull |
总结
| 部署方案 | 适用场景 | 难度 | 推荐度 |
|---|---|---|---|
| Docker Compose 场景 A | 大多数用户,无需反向代理 | ⭐ | ⭐⭐⭐⭐⭐ |
| Docker Compose 场景 B | 需要实时 WebSocket | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| Docker Run | 不习惯 Compose | ⭐⭐ | ⭐⭐⭐⭐ |
| 一键脚本 | 快速自动化部署 | ⭐ | ⭐⭐⭐⭐ |
| 源码部署 | 开发或定制需求 | ⭐⭐⭐⭐ | ⭐⭐ |
| Agent 部署 | 多远程网关集中管理 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
对于大多数用户,Docker Compose 场景 A 是最简单直接的选择:
1 | # 创建目录和配置文件 |
访问 http://localhost:3000,配置网关连接,即可开始监控网络流量。如需实时推送,使用场景 B 并配合反向代理路由 /_cm_ws 到 3002。




