
foru17/neko-master
Neko Master
让你的网络流量一目了然。
实时监控 · 流量审计 · 多网关管理
中文 | English
[!IMPORTANT] 免责声明
本项目为 网络流量分析与可视化工具, 用于展示与统计本地网关的流量数据。
本项目 不提供任何网络接入服务、代理订阅或跨网络连接功能。 所有数据均来源于用户自有网络环境。
本项目遵循 MIT 协议开源,不对因使用本软件产生的任何后果承担责任。请在合规范围内使用。
|
|
演示地址: [***]
访问密码: neko2026
演示站为只读展示模式,部分功能受限。
Neko(ねこ)在日语中意为“猫”, 发音为 /ˈneɪkoʊ/(NEH-ko)。
如同猫一般安静而敏锐, Neko Master 专注于对网络流量进行轻量、精确的分析与可视化。
仓库内置的
docker-compose.yml默认映射3000/3001/3002。
下方场景 A/B 是更精简的常见部署模板,可按需选择。
yamlservices: neko-master: image: foru17/neko-master:latest container_name: neko-master restart: unless-stopped ports: - "3000:3000" # Web UI volumes: - ./data:/app/data # 本地 MMDB(可选,文件需自行下载并放到 ./geoip) - ./geoip:/app/data/geoip:ro environment: - NODE_ENV=production - DB_PATH=/app/data/stats.db - COOKIE_SECRET=${COOKIE_SECRET}
建议在
docker-compose.yml同目录的.env中配置:
COOKIE_SECRET=<至少32字节随机字符串>(可用openssl rand -hex 32生成)
该模式完全兼容升级,页面可用。
未打通 WS 时会自动回退到 HTTP 轮询刷新。
yamlservices: neko-master: image: foru17/neko-master:latest container_name: neko-master restart: unless-stopped ports: - "3000:3000" # Web UI - "3002:3002" # WebSocket(供 Nginx / Tunnel 转发) volumes: - ./data:/app/data # 本地 MMDB(可选,文件需自行下载并放到 ./geoip) - ./geoip:/app/data/geoip:ro environment: - NODE_ENV=production - DB_PATH=/app/data/stats.db - COOKIE_SECRET=${COOKIE_SECRET}
启动服务:
bashdocker compose up -d
若你直接使用仓库内置 Compose 文件(默认暴露 3000/3001/3002),执行同一命令即可。
bash# 建议先生成固定 Cookie 密钥(用于会话持久) export COOKIE_SECRET="$(openssl rand -hex 32)"
bash# 最简(仅 3000) docker run -d \ --name neko-master \ -p 3000:3000 \ -v $(pwd)/data:/app/data \ -e COOKIE_SECRET="$COOKIE_SECRET" \ --restart unless-stopped \ foru17/neko-master:latest # 实时 WS(配合反代) docker run -d \ --name neko-master \ -p 3000:3000 \ -p 3002:3002 \ -v $(pwd)/data:/app/data \ -e COOKIE_SECRET="$COOKIE_SECRET" \ --restart unless-stopped \ foru17/neko-master:latest
默认前端 API 走同域
/api,通常不需要额外暴露 3001。
若希望 WebSocket 实时生效,需要让反代层可以访问3002;未打通时会回退到 HTTP 轮询(约 5 秒级)。
docker run修改外部端口时,直接改-p映射即可。
仅在“非反代直连 WS 且外部 WS 端口不是 3002”时,额外传入-e WS_EXTERNAL_PORT=<外部WS端口>。本地 MMDB 查询模式(可选):额外挂载
-v $(pwd)/geoip:/app/data/geoip:ro, 并在面板「设置 -> 偏好设置 -> IP 查询来源」切换到本地。
自动检测端口冲突并配置,适合不熟悉 Docker 的用户:
bash# 使用 curl curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash # 或使用 wget wget -qO- https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash
脚本会自动:
docker-compose.ymlbash# 1. 克隆仓库 git clone https://github.com/foru17/neko-master.git cd neko-master # 2. 安装依赖 pnpm install # 3. 准备 collector 环境变量(源码模式读取 apps/collector/.env) cp apps/collector/.env.example apps/collector/.env # 4. 启动开发服务 pnpm dev
源码模式下:
collector默认监听3001/3002,web默认监听3000。
如果你修改了API_PORT(非 3001),请同步设置API_URL(例如API_URL=http://localhost:4001)供 web 的/api转发使用。
apps/collector/.env.local的优先级高于apps/collector/.env。
当你希望中心化部署一个 Neko Master 服务,并在不同设备(OpenWrt、Linux、macOS)本地采集网关数据时,推荐使用 Agent 模式。Agent 运行在网关旁边,主动拉取数据并上报至面板,面板无需主动连接网关。
支持网关类型:***** / ***(WebSocket 实时)和 ***** v5+(HTTP 轮询)。
Agent 类型后端,选择网关类型(*** 或 ***)bash# Clash / Mihomo 网关示例 curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \ | env NEKO_SERVER='http://your-panel:3000' \ NEKO_BACKEND_ID='1' \ NEKO_BACKEND_TOKEN='ag_xxx' \ NEKO_GATEWAY_TYPE='clash' \ NEKO_GATEWAY_URL='http://127.0.0.1:9090' \ sh # Surge 网关示例 curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \ | env NEKO_SERVER='http://your-panel:3000' \ NEKO_BACKEND_ID='2' \ NEKO_BACKEND_TOKEN='ag_yyy' \ NEKO_GATEWAY_TYPE='surge' \ NEKO_GATEWAY_URL='http://127.0.0.1:9091' \ sh
安装完成后,使用 nekoagent 管理实例:
bashnekoagent list # 列出所有实例 nekoagent status <instance> # 查看运行状态 nekoagent logs <instance> # 实时日志 nekoagent restart <instance> # 重启 nekoagent upgrade # 全局升级(CLI + 二进制)
脚本会自动检测已有安装,若已存在则只添加新实例而不重新下载二进制。 同一主机可同时运行多个实例(不同
NEKO_INSTANCE_NAME),对应不同网关。
!首次使用
Clash / Mihomo192.168.101.1)9090)💡 获取网关地址: 进入网关控制面板(如 Open***) → 打开「外部控制」→ 复制 API 地址
!*** HTTP API 配置
Neko Master 支持接入 *** 网关,实现完整的规则链可视化和流量分析。
在 *** 配置中启用 HTTP 远程 API:
ini[General] http-api = 127.0.0.1:9091 http-api-tls = false http-api-web-dashboard = true
或者通过 *** 的图形界面配置:
设置 → 常规 → HTTP 远程 API9091Surge192.168.1.1 或 127.0.0.1)9091)💡 注意: *** 使用 HTTP 轮询方式获取数据(相比 *** 的 WebSocket 实时流),数据刷新延迟约 2 秒。
如果看到错误提示端口已被占用,有以下几种解决方案:
创建 .env 文件(与 docker-compose.yml 同目录):
envWEB_EXTERNAL_PORT=8080 # 修改 Web UI 端口 API_EXTERNAL_PORT=8081 # 修改 API 端口 WS_EXTERNAL_PORT=8082 # 修改 WebSocket 外部端口(仅直连时需要) COOKIE_SECRET=your-long-random-secret # 强烈建议固定
然后重启:
bashdocker compose down docker compose up -d
yamlports: - "8080:3000" # 外部 8080 → 内部 3000 - "8082:3002" # 外部 8082 → 内部 3002(给反代/Tunnel 转发 WS)
说明:如果你不走反代、直接让浏览器连
ws://host:端口,且外部 WS 端口不是3002,请同时设置WS_EXTERNAL_PORT=<外部端口>。
bashcurl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash
脚本会自动检测并提供可用的端口。
| 端口 | 用途 | 外部必需 | 说明 |
|---|---|---|---|
| 3000 | Web 界面 | ✅ | 前端访问入口 |
| 3001 | API 接口 | 可选 | 前端默认同域 /api,一般无需公网暴露(仓库默认 Compose 会映射) |
| 3002 | WebSocket | 可选 | 实时推送端口,建议仅给反代层转发,不直接公网暴露(仓库默认 Compose 会映射) |
| 变量名 | 默认值 | 作用 | 何时设置 |
|---|---|---|---|
WEB_PORT | 3000 | Web 服务监听端口(容器内) | 一般不改 |
API_PORT | 3001 | API 服务监听端口(容器内) | 一般不改 |
COLLECTOR_WS_PORT | 3002 | WS 服务监听端口(容器内) | 一般不改 |
DB_PATH | /app/data/stats.db | SQLite 文件路径 | 自定义数据目录时 |
WEB_EXTERNAL_PORT | 3000 | docker-compose.yml 的 Web 外部端口映射 | 外部 Web 端口变更时 |
API_EXTERNAL_PORT | 3001 | docker-compose.yml 的 API 外部端口映射 | 需要外部直连 API 时 |
WS_EXTERNAL_PORT | 3002 | docker-compose.yml 的 WS 外部端口映射;同时用于前端直连 WS 端口推断 | 非反代直连 WS 且外部端口变化时 |
NEXT_PUBLIC_API_URL | 空 | 覆盖前端 API 基地址(如 https://api.example.com) | API 不走同域 /api 时 |
NEXT_PUBLIC_WS_URL | 空 | 覆盖前端 WS 地址(支持绝对 URL 或 /custom_ws) | WS 路径/域名自定义时 |
NEXT_PUBLIC_WS_PORT | 3002 | WS 直连端口兜底值(构建时注入) | 非反代直连 WS 且需显式指定端口时 |
API_URL | http://localhost:3001 | Next.js /api rewrite 目标(主要用于源码/自构建) | 你修改了 API 实际监听地址时 |
COOKIE_SECRET | 自动生成 | Cookie 签名密钥;未固定时会自动生成(数据目录不持久化时重启后会话会失效) | 生产环境强烈建议固定配置 |
GEOIP_LOOKUP_PROVIDER | online | IP 地理查询来源(online/local) | 需要默认走本地 MMDB 查询时 |
GEOIP_ONLINE_API_URL | https://api.ipinfo.es/ipinfo | 在线 IP 查询接口地址(需兼容 ipinfo.my 的响应结构) | 仅在你部署了兼容接口时设置 |
FORCE_ACCESS_CONTROL_OFF | false | 强制关闭访问控制(紧急恢复) | 仅忘记密码临时使用 |
SHOWCASE_SITE_MODE | false | 演示只读模式(禁用敏感写操作) | 仅公开演示站点 |
| 变量名 | 默认值 | 说明 |
|---|---|---|
FLUSH_INTERVAL_MS | 30000 | 采集缓冲区落库间隔 |
FLUSH_MAX_BUFFER_SIZE | 5000 | 采集缓冲区最大条目,达到即提前落库 |
REALTIME_MAX_MINUTES | 180 | 实时内存窗口大小(分钟) |
REALTIME_RANGE_END_TOLERANCE_MS | 120000 | 查询结束时间容差,缓解边界抖动 |
SURGE_POLICY_SYNC_INTERVAL_MS | 600000 | *** 策略同步周期 |
DB_RANGE_QUERY_CACHE_TTL_MS | 8000 | 范围查询缓存 TTL |
DB_HISTORICAL_QUERY_CACHE_TTL_MS | 300000 | 历史查询缓存 TTL |
DB_RANGE_QUERY_CACHE_MAX_ENTRIES | 1024 | 范围查询缓存最大条目 |
DB_RANGE_QUERY_CACHE_DISABLED | 空 | 设为 1 可关闭范围查询缓存 |
DEBUG_SURGE | false | *** 采集调试日志开关(true 开启) |
runtime-config.API_URL → NEXT_PUBLIC_API_URL → 默认同域 /api/api 的服务端转发目标:API_URL(默认 http://localhost:3001,在 Next.js rewrite 中生效)runtime-config.WS_URL → NEXT_PUBLIC_WS_URL → 自动候选(生产优先 /_cm_ws,失败再尝试直连端口)runtime-config.WS_PORT(来自 WS_EXTERNAL_PORT)→ NEXT_PUBLIC_WS_PORT → 3002NEXT_PUBLIC_WS_URL;仅当你自定义 WS 路径/域名时再设置envNODE_ENV=production DB_PATH=/app/data/stats.db COOKIE_SECRET=<至少32字节随机字符串> # 可选:默认切换到本地 MMDB 查询 # GEOIP_LOOKUP_PROVIDER=local # 仅紧急恢复时临时开启,平时不要保留 true # FORCE_ACCESS_CONTROL_OFF=false
可使用 openssl rand -hex 32 生成 COOKIE_SECRET。
补充建议:
./data:/app/data),避免数据库与自动生成密钥丢失。3002,务必同步设置 WS_EXTERNAL_PORT。API_URL。./geoip:/app/data/geoip:ro,并在面板「设置 -> 偏好设置 -> IP 查询来源」切换为本地。./geoip,文件名固定为:
GeoLite2-City.mmdb、GeoLite2-ASN.mmdb(必需),GeoLite2-Country.mmdb(可选)。
推荐来源:<[***]>。进阶说明:Agent 模式的安装、参数、发布与兼容策略已迁移到
docs/agent/*,请以文档为准。
SQLite 是 Neko Master 的默认存储引擎,对大多数用户已完全够用。
如果你有以下需求,可以额外启用 ClickHouse:
ClickHouse 完全可选。SQLite 作为配置和元数据存储,无论是否启用 ClickHouse 都不会被移除。
启用 ClickHouse 后,系统进入双写模式:
BatchBuffer.flush() │ ├──→ SQLite(配置 / 元数据,始终写入) └──→ ClickHouse(统计流量数据,双写) └── Buffer 表 → SummingMergeTree 异步合并
读取来源由 STATS_QUERY_SOURCE 控制,默认仍为 sqlite。
仓库内置的 docker-compose.yml 已包含 ClickHouse 服务,通过 profiles: [clickhouse] 隔离,默认不启动。
直接在仓库根目录执行:
bashdocker compose --profile clickhouse up -d
ClickHouse 数据持久化到
./data/clickhouse,与主应用数据分目录存储。
如果你使用的是自定义 docker-compose.yml(如上方场景 A/B),需手动添加 ClickHouse 服务块:
yamlservices: neko-master: # ... 你的现有配置 ... environment: # 在现有 environment 中追加: - CH_ENABLED=${CH_ENABLED:-0} - CH_HOST=${CH_HOST:-clickhouse} - CH_PORT=${CH_PORT:-8123} - CH_DATABASE=${CH_DATABASE:-neko_master} - CH_USER=${CH_USER:-neko} - CH_PASSWORD=${CH_PASSWORD:-neko_master} - CH_WRITE_ENABLED=${CH_WRITE_ENABLED:-0} - STATS_QUERY_SOURCE=${STATS_QUERY_SOURCE:-sqlite} networks: - neko-master-network clickhouse: image: clickhouse/clickhouse-server:24.8 container_name: neko-master-clickhouse restart: unless-stopped profiles: ["clickhouse"] ports: - "${CH_EXTERNAL_HTTP_PORT:-8123}:8123" - "${CH_EXTERNAL_NATIVE_PORT:-9000}:9000" volumes: - ./data/clickhouse:/var/lib/clickhouse environment: - CLICKHOUSE_DB=${CH_DATABASE:-neko_master} - CLICKHOUSE_USER=${CH_USER:-neko} - CLICKHOUSE_PASSWORD=${CH_PASSWORD:-neko_master} - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 networks: - neko-master-network healthcheck: test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:8123/ping || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: neko-master-network: driver: bridge
在 .env 中添加(与 docker-compose.yml 同目录):
env# 开启 ClickHouse 连接 CH_ENABLED=1 # 开启双写 CH_WRITE_ENABLED=1 # 读取来源:sqlite(默认)/ auto(自动选择)/ clickhouse(强制) STATS_QUERY_SOURCE=auto # ClickHouse 连接信息(使用 docker-compose.yml 默认值时,以下无需修改) CH_HOST=clickhouse CH_PORT=8123 CH_DATABASE=neko_master CH_USER=neko CH_PASSWORD=neko_master
重启:
bashdocker compose --profile clickhouse up -d
| 变量名 | 默认值 | 说明 |
|---|---|---|
CH_ENABLED | 0 | 是否启用 ClickHouse 连接(1 开启) |
CH_WRITE_ENABLED | 0 | 是否开启双写(须先开 CH_ENABLED) |
CH_ONLY_MODE | 0 | CH 健康时跳过 SQLite 统计写入(纯 CH 模式) |
CH_HOST | clickhouse | ClickHouse 主机地址 |
CH_PORT | 8123 | ClickHouse HTTP 端口 |
CH_DATABASE | neko_master | 数据库名称 |
CH_USER | neko | 用户名 |
CH_PASSWORD | neko_master | 密码 |
CH_SECURE | 0 | 是否使用 HTTPS 连接 |
CH_REQUIRED | 0 | CH 不可用时拒绝启动(1 开启) |
CH_AUTO_CREATE_TABLES | 1 | 首次启动时自动建表 |
CH_WRITE_MAX_PENDING_BATCHES | 200 | 最大写入积压批次数 |
CH_UNHEALTHY_THRESHOLD | 5 | 连续失败次数超过此值后标记为不健康,自动回退 SQLite |
STATS_QUERY_SOURCE | sqlite | 读取来源:sqlite / auto / clickhouse |
CH_COMPARE_ENABLED | 0 | 开启 SQLite ↔ ClickHouse 数据对账 |
CH_EXTERNAL_HTTP_PORT | 8123 | ClickHouse HTTP 外部端口(Compose 映射) |
CH_EXTERNAL_NATIVE_PORT | 9000 | ClickHouse Native 外部端口(Compose 映射) |
健康回退机制:ClickHouse 连续写入失败超过
CH_UNHEALTHY_THRESHOLD次后,系统自动标记为不健康,SQLite 写入恢复(即使开启了CH_ONLY_MODE)。ClickHouse 恢复正常后自动重新标记为健康。
从纯 SQLite 版本升级时,你的数据不会丢失。
SQLite 文件(./data/stats.db)完整保留,以下是推荐的渐进迁移路径:
envCH_ENABLED=1 CH_WRITE_ENABLED=1 STATS_QUERY_SOURCE=sqlite # 继续读 SQLite,CH 在后台积累数据
启动并观察 [ClickHouse Writer] 日志确认写入正常。
envSTATS_QUERY_SOURCE=auto # 自动选择:最近数据走 CH,历史走 SQLite # 或 STATS_QUERY_SOURCE=clickhouse # 强制读 CH
如需将 SQLite 历史统计数据搬入 ClickHouse:
bash# 标准迁移(清空 CH 后重新导入,附带对账验证) ./scripts/ch-migrate-docker.sh # 追加模式(保留 CH 现有数据,增量导入) ./scripts/ch-migrate-docker.sh --append # 指定时间窗口 ./scripts/ch-migrate-docker.sh --from 2026-02-01T00:00:00Z --to 2026-02-20T00:00:00Z
当 ClickHouse 稳定运行后,可停止 SQLite 统计写入:
envCH_ONLY_MODE=1
即使在
CH_ONLY_MODE=1下,若 ClickHouse 不健康,系统会自动回退到 SQLite 写入,数据不会丢失。
随时可以完全回退:
envCH_ENABLED=0 CH_WRITE_ENABLED=0 CH_ONLY_MODE=0 STATS_QUERY_SOURCE=sqlite
重启后恢复纯 SQLite 模式,历史数据完整保




探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务