1. Project Overview & Quickstart (nezhahq/nezha)
>> Telegram Channel: 哪吒监控(中文通知频道)
>> Telegram Group: Nezha Monitoring Global (English Only), 哪吒监控(中文群组)
>> Use Cases | 我们的用户 (Google)
User Guide
Contributing
Translation
Is Nezha not in your language, or the translation is incorrect or incomplete? Get involved in the translations on Hosted Weblate.
Screenshots
| 用户前台 @hamster1963 | 管理后台 @nezhahq |
|---|---|
| hamster1963/nezha-dash | nezhahq/admin-frontend |
add your theme to service/singleton/frontend-templates.yaml
Contributors
Special Thanks
- IPInfo for providing an accurate GeoIP Database.
Star History
2. Official Technical Reference & Guides (nezhahq/nezhahq.github.io)
File: README.md
Nezha Monitoring V2 Documentation
Official Chinese and English documentation for Nezha Monitoring V2, an open-source, self-hosted server monitoring and operations platform.
The documentation covers:
- Dashboard and Agent installation
- Multi-server metrics and availability
- HTTP, Ping, TCP, and TLS certificate checks
- Alerts and notification providers
- Terminal, files, tasks, DDNS, NAT, REST API, and MCP
- Architecture, security, version compatibility, and troubleshooting
Official projects
Local development
npm ci
npm run devBuild and audit generated SEO metadata:
npm testWhen adding or changing documentation, keep the Chinese and English pages synchronized.
File: docs/guide/agent.md
outline: deep
安装 Agent
哪吒监控的被控端服务被称为 Agent,本文档将介绍如何在被控端服务器上安装 Agent,并与 Dashboard 连接。
::: tip
Agent 二进制文件仓库地址为:https://github.com/nezhahq/agent/releases
:::
一键安装 Agent
哪吒监控支持在 Windows、macOS 和 Linux 上一键安装 Agent。遵循本文档的步骤,你可以轻松地在服务器上部署它。
准备工作
在安装前,需要提前在管理面板中设置通信域名,该域名不建议接入 CDN。本文档以示例通信域名 “data.example.com” 为例。
- 在后台管理面板点击头像,进入“系统设置”页。
- 在“Agent 对接地址【域名/IP:端口】”项中填入通信域名和端口 “data.example.com:8008”。
- 点击“确认”保存设置。
一键安装步骤
- 在
服务器页面中,点击安装命令并选择对应操作系统,安装命令将自动复制到你的剪贴板。 - 在被控端服务器中运行安装命令,等待安装完成后返回到
服务器页面查看是否上线。 - 如果安装成功,页面中将自动弹出新的服务器,你可以点击编辑按钮为其设置名称。
平台特有说明
Windows 特殊说明
- 在 Windows 服务器中,运行 PowerShell。
- 在 PowerShell 中粘贴并运行安装命令。
- 如遇到「执行策略变更」确认提示,输入
Y并回车。
其他方式安装 Agent
在群晖系统中安装 Agent(DSM 7)
点击展开/收起
由于群晖(Synology NAS)设备的系统基于特定版本的 Linux,其 shell 环境和软件包管理与标准 Linux 系统有所不同,因此不支持一键安装脚本。需要手动安装 Agent,具体步骤如下:
1. 准备工作
确保拥有管理员权限
- 登录群晖的管理界面,或通过 SSH 使用管理员账户登录设备。
安装必要的依赖
确定群晖设备已安装wget、unzip或curl
:::tip
也可以提前下载并解压好 Nezha Agent 的二进制文件,通过群晖的 DSM File Station 手动上传,免去安装依赖的步骤。
:::
2. 下载 Nezha Agent
确定群晖的 CPU 架构
使用以下命令获取设备的架构信息:bashuname -m常见架构对应关系:
x86_64对应amd64armv7l或aarch64对应arm
下载适配的 Nezha Agent 二进制文件
根据设备架构选择正确的下载链接。例如,对于amd64架构:bashwget -O nezha-agent.zip https://github.com/nezhahq/agent/releases/latest/download/nezha-agent_linux_amd64.zip解压文件
将下载的压缩包解压到指定目录,例如/opt/nezha:bashmkdir -p /opt/nezha unzip nezha-agent.zip -d /opt/nezha赋予运行权限
bashchmod +x /opt/nezha/nezha-agent
3. 创建配置文件
- 创建并编辑配置文件
在/opt/nezha目录下创建config.yml文件,并添加以下内容:yamlclient_secret: your_agent_secret debug: false disable_auto_update: false disable_command_execute: false disable_force_update: false disable_nat: false disable_send_query: false gpu: false insecure_tls: false ip_report_period: 1800 report_delay: 3 server: data.example.com:8008 skip_connection_count: false skip_procs_count: false temperature: false tls: false use_atomgit_to_upgrade: false use_gitee_to_upgrade: false use_ipv6_country_code: false uuid: your_uuid- 字段说明:
server:替换为 Dashboard 地址和端口,如data.example.com:80081.1.1.1:8008"[2606:4700:4700::1111]:8008"。client_secret:替换为 Dashboard 中对应用户的连接密钥。当前前台没有单独的连接密钥复制入口,建议直接使用服务器页面生成的安装命令,或从命令中的NZ_CLIENT_SECRET提取。uuid:为该 Agent 生成一个唯一标识符,不要与同一个 Dashboard 中其他的 Agent 重复,可使用uuidgen命令生成:bashuuidgen
- 保存文件:将文件保存至
/opt/nezha/config.yml。
- 字段说明:
4. 创建 systemctl 服务文件
创建服务文件
在/etc/systemd/system/目录下创建nezha-agent.service文件:bashsudo nano /etc/systemd/system/nezha-agent.service添加以下内容:
ini[Unit] Description=Nezha Agent After=network.target [Service] Type=simple User=root Group=root ExecStart=/opt/nezha/nezha-agent -c /opt/nezha/config.yml Restart=always RestartSec=5 [Install] WantedBy=multi-user.target保存文件并重新加载服务配置:
bashsudo systemctl daemon-reload
5. 启动 Agent
启动服务
使用以下命令启动 Agent:bashsudo systemctl start nezha-agent设置开机自启动
bashsudo systemctl enable nezha-agent查看服务状态
确保 Agent 已成功启动:bashsudo systemctl status nezha-agent
6. 验证 Agent 连接
- 登录 Dashboard,检查是否有新设备上线。
- 如果服务运行正常且日志中无报错,则安装完成。
在 Windows 系统中手动安装 Agent
点击展开/收起
Windows 系统除了一键脚本,也可以下载对应的二进制文件并手动配置,以下是详细步骤:
1. 准备工作
确保管理员权限
使用管理员账户登录 Windows 系统。安装必要工具
- 确保有解压工具(如
7-Zip或WinRAR)。
- 确保有解压工具(如
2. 下载 Nezha Agent
确认系统架构
- Windows 系统一般为
amd64架构,可直接下载对应的二进制文件。
- Windows 系统一般为
下载 Nezha Agent 文件
- 访问 Nezha Agent Releases,下载适用于
Windows的版本,例如:plaintextnezha-agent_windows_amd64.zip
- 访问 Nezha Agent Releases,下载适用于
解压文件
- 将下载的压缩包解压到指定目录,例如:
C:\nezha。
- 将下载的压缩包解压到指定目录,例如:
3. 创建配置文件
创建并编辑配置文件
在解压目录中创建config.yml文件,内容如下:yamlclient_secret: your_agent_secret debug: false disable_auto_update: false disable_command_execute: false disable_force_update: false disable_nat: false disable_send_query: false gpu: false insecure_tls: false ip_report_period: 1800 report_delay: 3 server: data.example.com:8008 skip_connection_count: false skip_procs_count: false temperature: false tls: false use_atomgit_to_upgrade: false use_gitee_to_upgrade: false use_ipv6_country_code: false uuid: your_uuid- 字段说明:
server:替换为您的 Dashboard 地址和端口,例如data.example.com:80081.1.1.1:8008"[2606:4700:4700::1111]:8008"。client_secret:替换为 Dashboard 中对应用户的连接密钥。当前前台没有单独的连接密钥复制入口,建议直接使用服务器页面生成的安装命令,或从命令中的NZ_CLIENT_SECRET提取。uuid:可以通过在线工具生成。
- 字段说明:
保存文件
将文件保存为config.yml,存放在 Agent 的目录中。
4. 运行 Agent
以管理员权限运行 Agent
打开命令提示符,进入 Agent 的目录并运行以下命令:powershellnezha-agent.exe -c config.yml验证连接
- 登录 Dashboard,查看是否有新设备上线。
- 如果日志中没有报错信息,说明安装成功。
5. 设置为服务运行
安装为服务
- 进入 Agent 的目录,在命令提示符中运行:powershell
nezha-agent.exe service install
- 进入 Agent 的目录,在命令提示符中运行:
启动服务
- 安装成功后,Agent 会自动以服务形式启动,重启系统时也会自动运行。
卸载服务
- 如需卸载服务,运行以下命令:powershell
nezha-agent.exe service uninstall
- 如需卸载服务,运行以下命令:
在 OpenWrt 系统中安装 Agent
点击展开/收起
OpenWrt 是轻量级 Linux 系统,需通过手动下载和配置安装 Nezha Agent。
1. 准备工作
确保管理员权限
- 通过 SSH 登录到 OpenWrt,使用
root账户操作。
- 通过 SSH 登录到 OpenWrt,使用
安装必要工具
- 更新软件包列表并安装必要工具:bash
opkg update opkg install wget unzip
- 更新软件包列表并安装必要工具:
2. 下载 Nezha Agent
确定系统架构
使用以下命令获取架构信息:bashuname -m常见架构对应关系:
x86_64对应nezha-agent_linux_amd64.ziparm或aarch64对应nezha-agent_linux_arm.zip
下载适配的 Nezha Agent
bashwget -O nezha-agent.zip https://github.com/nezhahq/agent/releases/latest/download/nezha-agent_linux_<arch>.zip解压文件
解压文件至/etc/nezha目录:bashmkdir -p /etc/nezha unzip nezha-agent.zip -d /etc/nezha
3. 创建配置文件
创建配置文件
创建并编辑/etc/nezha/config.yml文件并填入以下内容:bashtouch /etc/nezha/config.yml vi /etc/nezha/config.ymlyamlclient_secret: your_agent_secret debug: false disable_auto_update: false disable_command_execute: false disable_force_update: false disable_nat: false disable_send_query: false gpu: false insecure_tls: false ip_report_period: 1800 report_delay: 3 server: data.example.com:8008 skip_connection_count: false skip_procs_count: false temperature: false tls: false use_atomgit_to_upgrade: false use_gitee_to_upgrade: false use_ipv6_country_code: false uuid: your_uuid- 字段说明:
server:替换为您的 Dashboard 地址和端口,例如data.example.com:80081.1.1.1:8008"[2606:4700:4700::1111]:8008"。client_secret:替换为 Dashboard 中对应用户的连接密钥。当前前台没有单独的连接密钥复制入口,建议直接使用服务器页面生成的安装命令,或从命令中的NZ_CLIENT_SECRET提取。uuid:可以通过在线工具生成。
- 字段说明:
保存配置文件
确保配置文件路径正确:/etc/nezha/config.yml。
4. 运行 Agent
赋予执行权限并启动 Agent
bashchmod +x /etc/nezha/nezha-agent /etc/nezha/nezha-agent -c /etc/nezha/config.yml验证 Agent 连接
- 登录 Dashboard 检查是否有新设备上线。
- 确认 Agent 运行状态正常。
5. 设置为开机自启动
在 OpenWrt 上,可以通过创建服务脚本的方式实现 Nezha Agent 开机自启动。
创建服务脚本
在/etc/init.d/nezha-service中创建一个服务脚本:bashvi /etc/init.d/nezha-service添加以下内容
将以下内容复制到文件中,并根据需求修改nezha-agent的路径和配置文件路径:bash#!/bin/sh /etc/rc.common START=99 USE_PROCD=1 start_service() { procd_open_instance procd_set_param command /etc/nezha/nezha-agent -c /etc/nezha/config.yml procd_set_param respawn procd_close_instance } stop_service() { killall nezha-agent } restart() { stop sleep 2 start }赋予执行权限
保存文件后,赋予脚本执行权限:bashchmod +x /etc/init.d/nezha-service启用服务
运行以下命令启用并启动服务:bash/etc/init.d/nezha-service enable /etc/init.d/nezha-service start验证启动状态
使用以下命令检查服务是否正常运行:bashps | grep nezha-agent
注意事项
- 配置文件路径:确保脚本中配置文件的路径(如
/etc/nezha/config.yml)正确。 - 服务管理:可以使用以下命令管理服务:
- 手动启动服务:bash
/etc/init.d/nezha-service start - 停止服务:bash
/etc/init.d/nezha-service stop - 重启服务:bash
/etc/init.d/nezha-service restart
- 手动启动服务:
- 日志排查:如 Agent 无法正常启动,可通过
logread检查相关日志。
卸载 Agent
卸载 Agent 包括停止服务、卸载服务,以及删除相关文件。以下是 Ubuntu 系统的卸载步骤:
停止并卸载服务:
bashcd /opt/nezha/agent/ ./nezha-agent service uninstall删除 Agent 文件夹:
bashrm -rf /opt/nezha/agent/
如果安装了多个服务并想要全部卸载,可以使用 Agent 安装脚本的卸载功能:
./agent.sh uninstall重新安装并指定 Agent 的 UUID
添加参数 UUID 让新的 Agent 连接后会继承原有的服务器记录和配置。
操作步骤
复制服务器的 UUID
进入 Dashboard,找到目标服务器并获取其对应的 UUID。生成安装命令并添加 UUID
在生成的安装命令中,添加NZ_UUID=服务器的UUID参数。这样可以确保 Agent 正确绑定到指定的服务器记录。确认是否卸载旧 Agent
如果服务器上已有 Agent,请确保卸载旧的 Agent,避免重复注册或冲突。
示例安装命令
以下是一个带有 UUID 参数的完整安装命令示例:
curl -L https://raw.githubusercontent.com/nezhahq/scripts/main/agent/install.sh -o agent.sh && chmod +x agent.sh && env NZ_SERVER=dashboard.example.com:8008 NZ_TLS=false NZ_CLIENT_SECRET=EXAMPLE NZ_UUID=your_server_uuid ./agent.sh将 your_server_uuid 替换为目标服务器的实际 UUID。
NZ_CLIENT_SECRET 需要使用目标用户的连接密钥,不是 Dashboard 配置文件中的全局 agent_secret_key。当前前台没有单独的连接密钥复制入口,优先以服务器页面生成的安装命令为准;管理员需要批量处理时,可通过管理接口读取对应用户的 agent_secret。
下一步
File: docs/guide/agentq.md
outline: deep
Agent 常见问题
Dashboard 搭建在只有 IPv6 的服务器上 / 使用 IPv6 地址, Agent 该怎么使用 IPv6 连接面板?
解决办法:
- 修改
server字段,例如"[2606:4700:4700::1111]:8008" - 为 Dashboard 使用的域名添加 IPv6 解析(DNS AAAA 记录)
后台显示的 IP 和 Agent 实际 IP 不一致?
如果后台显示的 IP 和 Agent 的实际 IP 不一致,请参考 Dashboard 相关 - 为什么管理面板中显示的 IP 和 Agent 实际 IP 不一致?。
该问题的详细解决方法已在相关文档中说明,此处不再赘述。
一键脚本安装时出错
1. `curl: Failed to connect to raw.githubusercontent.com......`
此问题多发生在中国大陆的服务器上,原因是 Github 的连接不稳定。解决方法:
- 多次尝试:直接多尝试几次运行一键脚本。
- 手动安装:按照 手动安装 Agent 的指南完成安装。
- 使用加速服务:可使用第三方 Github 加速服务或镜像。找到加速地址后,在一键安装脚本中进行替换。
2. `sudo: command not found`
如果提示 sudo: command not found,说明目标服务器未安装 sudo 工具。解决方法:
- 手动安装 sudo:
- 对于 Ubuntu 系统,可以运行以下命令:shell
apt install sudo - 对于 CentOS 系统,可以运行以下命令:shell
yum install sudo
- 对于 Ubuntu 系统,可以运行以下命令:
- 检查安装成功:安装完成后,再次运行一键脚本进行安装。
Agent 安装目录出现多个配置文件,系统被安装了多个 Agent 服务
为重复运行 Agent 安装脚本所致。Agent 支持根据不同的配置文件安装多个系统服务,故脚本不会覆盖安装而是会安装新的配置到系统服务。
可以使用 Agent 脚本的卸载功能清除所有配置文件和对应的服务:
./agent.sh uninstallAgent 有 Docker 镜像吗?
Agent 目前没有推出 Docker 镜像。
Agent 的设计思路和 Dashboard 相反:Dashboard 的目标是尽量减少对宿主机的干扰,而 Agent 则需要深度与宿主机集成以执行监控服务和命令任务。
虽然将 Agent 放入容器中可以继续执行监控任务,但 WebShell 等功能将无法正常运行,因此官方不提供 Docker 镜像支持。
File: docs/guide/api.md
outline: deep
API 接口
哪吒监控 V2 Dashboard 当前主要使用 /api/v1 路径;这里的 v1 是 API 路由版本,并不表示产品仍是 V1。接口返回 JSON,适合自定义前端、机器人、自动化脚本和内部运维工具使用。
如果需要完整、随源码同步的接口列表,建议优先使用 Dashboard 内置 Swagger 文档;本页保留常用接口和调用规则,方便快速上手。
获取完整 API 文档
Dashboard 在调试模式下会挂载 Swagger UI:
编辑 Dashboard 配置文件,开启调试模式:
yamldebug: true重启 Dashboard。
查看 Dashboard 日志中的提示,默认地址类似:
texthttp://localhost:8008/swagger/index.html
如果你是从源码开发,也可以在仓库根目录生成 Swagger 文件:
./script/bootstrap.sh生成结果位于 cmd/dashboard/docs。
::: warningdebug: true 会额外暴露调试信息和 Swagger UI,不建议在公网生产环境长期开启。需要线上排查时,建议临时开启,完成后关闭并重启 Dashboard。
:::
认证方式
登录获取 Token
请求:
POST /api/v1/login
Content-Type: application/json请求体:
{
"username": "admin",
"password": "your-password"
}成功后返回:
{
"success": true,
"data": {
"token": "JWT_TOKEN",
"expire": "2026-05-18T12:00:00+02:00"
}
}后续需要登录的接口,在请求头中携带:
Authorization: Bearer JWT_TOKENPersonal Access Token (PAT)
JWT 主要用于浏览器和管理前端的登录态;自动化脚本、CI、LLM 工具和 MCP 客户端建议使用 Personal Access Token(PAT)。PAT 请求头格式为:
Authorization: Bearer nzp_<secret>可以在管理前端的 系统设置 → API Tokens 中创建和吊销 PAT。创建 PAT 时需要填写:
name:Token 名称,最长 128 个字符。scopes:权限列表,至少 1 项,最多 32 项。server_ids:可选的服务器 ID 白名单,最多 1000 项;留空表示不在用户原有服务器权限之外再加限制。expires_in_days:可选的过期天数,留空或0表示永不过期,最大值为3650。
创建成功后,明文 Token 只会在响应中返回一次,请立即复制并妥善保存。之后列表接口只会返回脱敏后的 Token 元信息,例如权限、服务器白名单、过期时间、最后使用时间和最后使用 IP。
::: warning/api/v1/api-tokens 这组 Token 管理接口只能使用登录 JWT 调用,不能用 PAT 自己创建、更改或删除 PAT。
:::
PAT 权限范围
PAT 使用 nezha:{resource}:{verb} 命名权限范围。JWT 登录请求不走 PAT scope 校验;PAT 请求必须携带对应接口所需的 scope。
资源名包括:
serverservicealertrulecronddnsnatnotificationnotification-grouptransferadmin
动作名包括:
readwritedeleteexec
常见示例:
nezha:inventory:read:列出服务器与服务器分组(server.list、GET /api/v1/server、GET /api/v1/server-group)。nezha:inventory:delete:删除服务器与服务器分组(batch-delete/server、batch-delete/server-group)。nezha:server:read:查看单台服务器、读取其指标与文件,以及服务器相关服务监控。nezha:server:exec:创建在线终端或调用 MCP 的远程执行工具。nezha:cron:exec:手动触发计划任务。nezha:transfer:write:取消或重试服务器转移任务。nezha:admin:*:用户、WAF、在线用户、系统设置和维护等管理员资源。
通配 scope:
nezha:<resource>:*:允许某个资源下的所有动作,例如nezha:server:*。nezha:admin:*:允许管理员资源,只有管理员可以签发。nezha:*:完整权限,只有管理员可以签发。
PAT 禁用接口
以下接口属于个人账户自我管理流程,会显式拒绝 PAT,必须使用登录 JWT 调用:
POST /api/v1/refresh-tokenGET /api/v1/profilePOST /api/v1/profilePOST /api/v1/oauth2/{provider}/unbindGET /api/v1/api-tokensPOST /api/v1/api-tokensDELETE /api/v1/api-tokens/{id}
游客可访问接口
部分只读接口支持游客访问,但会受到站点配置和服务器隐藏设置限制:
- 开启
force_auth后,游客不能访问服务器和服务监控数据。 - 如果服务器启用了“对游客隐藏”,游客不能访问该服务器的数据。
- 服务历史和服务器指标接口中,游客只能查询
1d周期数据。
API Token (PAT)
API Token 是同一套 /api/v1 REST API 的另一种认证方式,也可以称为 PAT(Personal Access Token)。它和登录接口返回的 JWT 共用 Authorization: Bearer ... 请求头,也共用下方的接口返回格式和路由;区别是 JWT 面向浏览器登录会话,API Token 面向脚本、自动化工具和 MCP 客户端。
明文 Token 统一以 nzp_ 开头。Dashboard 只保存哈希,明文只会在创建成功后显示一次;关闭弹窗后无法再次查看,需要重新创建。
登录管理前端,进入 设置 > API Tokens,点击 Create API Token 创建。创建时需要填写:
| 字段 | 说明 |
|---|---|
| 名称 | 便于识别用途,例如 homepage-readonly、mcp-maintenance。最长 128 个字符。 |
| Scopes | Token 可以调用哪些资源和动作。至少选择一个。 |
| Server IDs | 可选的服务器 ID 白名单,使用英文逗号分隔,例如 1,2,3。留空表示不额外限制服务器,但仍受用户自身权限限制。 |
| Expires in days | 可选过期天数。默认前端填入 90;留空或填 0 表示永不过期。最大 3650 天。 |
普通用户可以创建、查看和吊销自己的 Token。管理员同样通过该页面管理自己的 Token,并且只有管理员可以签发 nezha:admin:* 或 nezha:* 这类管理员 scope。
REST API 调用方式与 JWT 相同:
Authorization: Bearer nzp_xxxxxxxxxxxxxxxxxxxxAPI Token 使用 nezha:{resource}:{verb} scope 控制权限,且只会收窄当前用户原本拥有的权限;即使 Token 带有某个 scope,仍然不能越过用户本身的服务器、管理员或资源归属限制。创建 Token 时还可以填写服务器 ID 白名单,空白表示不额外限制服务器。
常见错误:
| 状态码 | 含义 |
|---|---|
401 Unauthorized |
Token 无效、已过期、所属用户不存在,或 Authorization 头格式错误。 |
403 Forbidden |
Token 有效,但缺少当前接口需要的 scope,服务器不在白名单内,用户没有该服务器权限,或接口明确禁止 API Token 调用。 |
常用 scope:
| Scope | 说明 |
|---|---|
nezha:inventory:read |
读取服务器清单、服务器分组和实时服务器状态流 |
nezha:inventory:delete |
删除服务器和服务器分组 |
nezha:server:read |
读取已知服务器详情、指标、服务状态和文件列表/文件内容 |
nezha:server:write |
修改服务器、下发配置、强制更新、迁移服务器和写入文件 |
nezha:server:delete |
删除服务器上的文件 |
nezha:server:exec |
打开在线终端、执行命令 |
nezha:service:read/write/delete |
读取、创建/修改、删除服务监控 |
nezha:alertrule:read/write/delete |
读取、创建/修改、删除警报规则 |
nezha:cron:read/write/delete/exec |
读取、创建/修改、删除、手动触发计划任务 |
nezha:ddns:read/write/delete |
读取、创建/修改、删除 DDNS 配置 |
nezha:nat:read/write/delete |
读取、创建/修改、删除 NAT 规则 |
nezha:notification:read/write/delete |
读取、创建/修改、删除通知方式 |
nezha:notification-group:read/write/delete |
读取、创建/修改、删除通知组 |
nezha:transfer:read/write/delete |
读取、取消/重试、删除服务器迁移记录 |
nezha:<resource>:* |
某个资源的全部动作,例如 nezha:server:* |
nezha:admin:* |
用户、WAF、设置、在线用户等管理员接口,仅管理员可用 |
nezha:* |
全部权限,仅管理员可用 |
inventory 与 server 是两个不同的资源域:前者管“能看到和删除哪些机器清单”,后者管“对已知服务器执行运行态操作”。因此只给 nezha:server:exec 的 Token 可以执行指定服务器命令,但不能枚举服务器列表;需要列表时还要授予 nezha:inventory:read。
REST 路由常见 scope 对照:
| 路由 | API Token 所需 scope |
|---|---|
GET /api/v1/server、GET /api/v1/ws/server、GET /api/v1/server-group |
nezha:inventory:read |
POST /api/v1/batch-delete/server、POST /api/v1/batch-delete/server-group |
nezha:inventory:delete |
PATCH /api/v1/server/{id}、GET /api/v1/server/config/{id}、POST /api/v1/server/config、POST /api/v1/batch-move/server、POST /api/v1/force-update/server |
nezha:server:write |
POST /api/v1/file、GET /api/v1/ws/file/{id} |
同时需要 nezha:server:read、nezha:server:write、nezha:server:delete |
GET /api/v1/transfer、GET /api/v1/ws/transfer |
nezha:transfer:read |
POST /api/v1/transfer/{id}/cancel、POST /api/v1/transfer/{id}/retry |
nezha:transfer:write |
GET/POST/PATCH/DELETE 各资源管理接口 |
对应资源的 read、write、delete scope |
/api/v1/user、/api/v1/waf、/api/v1/online-user、PATCH /api/v1/setting、POST /api/v1/maintenance |
nezha:admin:* 或 nezha:*,且调用用户必须是管理员 |
常见授权组合:
| 场景 | 建议 scope |
|---|---|
| 外部看板只读展示服务器清单 | nezha:inventory:read |
| 外部看板读取服务器详情和指标 | nezha:inventory:read、nezha:server:read |
| MCP 客户端查询服务器和读取小文件 | nezha:inventory:read、nezha:server:read |
| MCP 客户端执行维护命令 | nezha:inventory:read、nezha:server:read、nezha:server:exec,并设置服务器 ID 白名单 |
| MCP 客户端写入或上传文件 | nezha:server:read、nezha:server:write,并设置服务器 ID 白名单 |
| CI/CD 只触发指定计划任务 | nezha:cron:read、nezha:cron:exec |
| 运维脚本管理服务监控 | nezha:service:read、nezha:service:write,需要删除时再加 nezha:service:delete |
| 管理员自动化维护设置 | nezha:admin:*,仅管理员 Token 可用 |
如果 Token 用于单台或少量服务器,建议始终填写 Server IDs 白名单。这样即使 scope 较宽,也只能作用于指定服务器。
旧版 mcp:* scope 不再作为运行时权限使用。创建 Token 时,mcp:server:read、mcp:server:exec、mcp:fs:read 会被兼容重写为对应的 nezha:* scope;mcp:fs:write、mcp:fs:delete、mcp:* 会被拒绝。启动迁移会清理数据库中残留的危险旧 scope,清理后没有任何 scope 的 Token 会被删除。
::: warning
API Token 不能调用账号自管理接口,例如 /api/v1/profile、/api/v1/refresh-token、/api/v1/oauth2/{provider}/unbind 和 /api/v1/api-tokens。这些接口只能使用网页登录产生的 JWT。
:::
在 设置 > API Tokens 列表中点击 Revoke 可以吊销 Token。吊销后,新请求会立即失败;使用该 Token 的长连接会被取消,包括服务器实时状态流、迁移流、在线终端、文件管理连接,以及正在执行的 MCP tools/call、文件上传/下载传输和临时传输 URL。
MCP 接入
Dashboard 提供独立的 MCP 入口:
POST /mcp
Authorization: Bearer nzp_<secret>MCP 不在 /api/v1 下,并且只接受 PAT,不接受 JWT。启用前需要在 Dashboard 配置或管理前端中打开 enable_mcp。关闭后,Dashboard 会拒绝新的 MCP 调用,并中断相关的 MCP 传输任务。
为兼容 Streamable HTTP 客户端,GET /mcp 和 DELETE /mcp 会明确返回 method-not-allowed;实际调用应使用 POST /mcp。文件传输类工具会使用 GET /mcp/download/:token 和 POST /mcp/upload/:token 作为临时传输地址。
MCP 入口带有 Origin 防护,用于降低浏览器跨站调用和 DNS rebinding 风险。仍然建议只给 MCP 客户端签发最小权限 PAT,并在不使用 MCP 时关闭 enable_mcp。
MCP 工具权限
| 工具 | 所需 scope |
|---|---|
meta.whoami |
任意有效 PAT |
server.list |
nezha:inventory:read |
server.get |
nezha:server:read |
server.exec |
nezha:server:exec |
fs.list / fs.read / fs.download_url |
nezha:server:read |
fs.write / fs.upload_url |
nezha:server:write |
fs.delete |
nezha:server:delete |
返回格式
普通接口返回:
{
"success": true,
"data": {}
}失败时通常返回:
{
"success": false,
"error": "error message"
}带分页的列表接口返回:
{
"success": true,
"data": {
"value": [],
"pagination": {
"offset": 0,
"limit": 10,
"total": 100
}
}
}常用接口
获取系统设置
请求:
GET /api/v1/setting说明:
- 可用于读取站点名称、语言、前端模板、OAuth2 提供方、TSDB 是否启用等基础信息。
- 未登录访问时只返回允许游客读取的配置。
获取服务器列表
请求:
GET /api/v1/server
Authorization: Bearer JWT_TOKEN说明:
- 返回当前用户有权限管理的服务器列表。
- 管理员可见所有服务器,普通用户只能看到自己名下的服务器。
- 如需实时状态流,请使用
GET /api/v1/ws/serverWebSocket 接口。
获取服务器实时状态流
请求:
GET /api/v1/ws/server
Authorization: Bearer JWT_TOKEN说明:
- 返回 WebSocket 数据流,用于实时刷新服务器在线状态和资源占用。
- 如果站点未开启
force_auth,游客也可以连接,但隐藏服务器不会出现在游客数据中。
获取服务监控概览
请求:
GET /api/v1/service说明:
- 返回服务监控当前状态和周期流量统计。
- 登录用户可以看到自己有权限查看的数据;游客访问会受到
force_auth和隐藏配置限制。
获取服务监控历史
请求:
GET /api/v1/service/{id}/history?period=1d参数:
id:服务监控 ID。period:查询周期,可选1d、7d、30d,默认1d。
1d 周期使用 30 秒粒度,适合展示最近 24 小时的细粒度曲线;7d 和 30d 周期会使用更粗的聚合粒度,以减少查询和传输开销。
返回示例:
{
"success": true,
"data": {
"service_id": 1,
"service_name": "HTTPS",
"servers": [
{
"server_id": 1,
"server_name": "Server 1",
"stats": {
"avg_delay": 68.2,
"up_percent": 99.9,
"total_up": 1440,
"total_down": 1,
"data_points": [
{
"ts": 1760000000000,
"delay": 68.2,
"status": 1
}
]
}
}
]
}
}::: tip
如果 Dashboard 未启用 TSDB,服务监控历史会从数据库读取;启用 TSDB 后会从 TSDB 查询。
:::
获取服务器指标历史
请求:
GET /api/v1/server/{id}/metrics?metric=cpu&period=1d参数:
id:服务器 ID。metric:指标名称,必填。period:查询周期,可选1d、7d、30d,默认1d。
1d 周期使用 30 秒粒度,适合展示最近 24 小时的细粒度曲线;7d 和 30d 周期会使用更粗的聚合粒度,以减少查询和传输开销。
支持的 metric:
cpumemoryswapdisknet_in_speednet_out_speednet_in_transfernet_out_transferload1load5load15tcp_connudp_connprocess_counttemperatureuptimegpu
返回示例:
{
"success": true,
"data": {
"server_id": 1,
"server_name": "Server 1",
"metric": "cpu",
"data_points": [
{
"ts": 1760000000000,
"value": 12.34
}
]
}
}::: warning
该接口依赖 TSDB。未启用 TSDB 时,接口仍会返回成功,但 data_points 为空。TSDB 配置详见 管理面板配置。
:::
获取服务下的服务器
请求:
GET /api/v1/service/{id}/server说明:
- 返回某个服务监控关联的服务器列表。
- 常用于自定义前端展示某个监控项的节点维度状态。
获取服务器下的服务监控
请求:
GET /api/v1/server/{id}/service说明:
- 返回某台服务器关联的服务监控列表。
- 常用于服务器详情页展示该服务器参与的 HTTP、TCP、Ping 等监控项。
管理类接口
管理类接口均需要登录。使用 JWT 时按用户角色和资源归属判断权限;使用 PAT 时,还会额外校验所需 scope。常见路径和 PAT scope 如下,字段和请求体请以 Swagger 文档为准。
| 功能 | 常见路径 | PAT scope |
|---|---|---|
| 用户和个人资料 | /api/v1/profile、/api/v1/user、/api/v1/batch-delete/user |
个人资料接口禁止 PAT;用户管理需要 nezha:admin:* |
| 服务器台账 | GET /api/v1/server、/api/v1/batch-delete/server、GET /api/v1/server-group、/api/v1/batch-delete/server-group |
nezha:inventory:read / delete |
| 服务器 | /api/v1/server/config、/api/v1/batch-move/server、/api/v1/force-update/server、PATCH /api/v1/server/{id} |
nezha:server:read / write |
| 服务器分组 | POST /api/v1/server-group、PATCH /api/v1/server-group/{id} |
nezha:server:write |
| 服务器转移 | /api/v1/transfer、/api/v1/transfer/{id}/cancel、/api/v1/transfer/{id}/retry、/api/v1/ws/transfer |
nezha:transfer:read / write |
| 通知方式 | /api/v1/notification、/api/v1/batch-delete/notification |
nezha:notification:read / write / delete |
| 通知组 | /api/v1/notification-group、/api/v1/batch-delete/notification-group |
nezha:notification-group:read / write / delete |
| 警报规则 | /api/v1/alert-rule、/api/v1/batch-delete/alert-rule |
nezha:alertrule:read / write / delete |
| 服务监控 | /api/v1/service/list、/api/v1/service、/api/v1/batch-delete/service |
nezha:service:read / write / delete |
| 定时任务 | /api/v1/cron、/api/v1/cron/{id}/manual、/api/v1/batch-delete/cron |
nezha:cron:read / write / exec / delete |
| DDNS | /api/v1/ddns、/api/v1/ddns/providers、/api/v1/batch-delete/ddns |
nezha:ddns:read / write / delete |
| NAT | /api/v1/nat、/api/v1/batch-delete/nat |
nezha:nat:read / write / delete |
| 在线终端 | /api/v1/terminal、/api/v1/ws/terminal/{id} |
nezha:server:exec |
| 文件管理 | /api/v1/file、/api/v1/ws/file/{id} |
同时需要 nezha:server:read、nezha:server:write、nezha:server:delete |
| WAF 和在线用户 | /api/v1/waf、/api/v1/batch-delete/waf、/api/v1/online-user、/api/v1/online-user/batch-block |
nezha:admin:* |
| 系统设置和维护 | PATCH /api/v1/setting、POST /api/v1/maintenance |
nezha:admin:* |
直接写管理类自动化脚本前,建议先在测试环境验证,避免批量修改服务器、通知、任务或用户配置。
通知方式和 DDNS 的读取接口会对敏感字段脱敏:通知方式不会返回已保存的 url、request_header、request_body,DDNS 不会返回已保存的 access_secret、webhook_headers。更新这些对象时,省略相应字段或传入空值会保留数据库中的原值,不会将其清空。自动化脚本不应把读取到的空值当作真实配置再覆盖回去;如需清空这些敏感字段,请删除并重新创建对象。
MCP 入口
Dashboard 内置一个面向自动化客户端和 LLM 工具调用的 MCP (Model Context Protocol) HTTP 入口:
完整的客户端配置、工具参数示例和文件传输说明,见 MCP 使用指南。
POST /mcp
Authorization: Bearer nzp_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json使用前需要在 Dashboard 配置或管理前端中启用 enable_mcp。该入口只接受 API Token,不接受 JWT;GET /mcp 和 DELETE /mcp 会返回 405。
当前实现支持 Streamable HTTP 的 POST 请求/响应,不提供 SSE 会话。JSON-RPC 请求体最大为 8 MiB,每个 Token 默认限制约为每秒 10 次、每分钟 120 次请求。常用 JSON-RPC 方法:
initializetools/listtools/callnotifications/initializedping
tools/list 会返回每个工具的 inputSchema 和 outputSchema。tools/call 成功时,结构化结果放在 structuredContent,并在 content[0].text 中提供同一结果的 JSON 文本;工具报错时只返回 isError: true 和文本错误信息,避免严格 MCP 客户端用成功输出 schema 校验错误对象。
已注册的 MCP 工具和所需 scope:
| 工具 | 所需 scope |
|---|---|
meta.whoami |
任意有效 API Token |
server.list |
nezha:inventory:read |
server.get |
nezha:server:read |
server.exec |
nezha:server:exec |
fs.list、fs.read、fs.download_url |
nezha:server:read |
fs.write、fs.upload_url |
nezha:server:write |
fs.delete |
nezha:server:delete |
需要调用 Agent 的 MCP 工具要求目标 Agent 版本不低于 v2.1.0。server.exec 是非交互一次性命令,不分配 PTY,默认超时 30 秒,timeout_seconds 硬上限 300 秒;需要管道、重定向等 shell 语法时,请显式使用 cmd: "sh" 和 args: ["-c", "..."]。
文件工具分为两类:
fs.read/fs.write适合小文件或分段读取写入。fs.read默认最多返回约 1 MiB,可使用offset、length和encoding: "utf8" | "base64"。fs.download_url/fs.upload_url会签发一次性临时 URL,通过GET /mcp/download/{token}或POST /mcp/upload/{token}走 Dashboard 到 Agent 的 IOStream 传输,单文件硬上限 100 MiB,ttl_seconds范围为 30 到 600 秒。上传时必须发送Content-Length,可在 URL 查询参数追加sha256=<64位十六进制>做端到端校验;fs.upload_url还支持mode、create_dirs、if_match_sha256。- 同一目标服务器最多同时承载 40 条活跃 IOStream。MCP 文件传输会与在线终端、文件管理和内网穿透共同计入该上限;达到上限时应结束不用的流后重试。
MCP 调用同时受 API Token 的服务器 ID 白名单和用户原本权限限制。临时上传/下载 URL 在使用时还会重新校验 Token、scope、服务器白名单和服务器归属;Token 被撤销或关闭 enable_mcp 时,Dashboard 会撤销 MCP 传输流、清理临时 URL 并取消正在执行的 MCP RPC。
使用案例
获取服务器列表
import requests
base_url = "https://nezha.example.com"
token = "JWT_TOKEN_OR_NZP_API_TOKEN"
response = requests.get(
f"{base_url}/api/v1/server",
headers={"Authorization": f"Bearer {token}"},
timeout=10,
)
response.raise_for_status()
payload = response.json()
if not payload.get("success"):
raise RuntimeError(payload.get("error", "unknown error"))
for server in payload["data"]:
print(server["id"], server["name"])查询 24 小时 CPU 历史
import requests
base_url = "https://nezha.example.com"
server_id = 1
response = requests.get(
f"{base_url}/api/v1/server/{server_id}/metrics",
params={"metric": "cpu", "period": "1d"},
timeout=10,
)
response.raise_for_status()
payload = response.json()
if not payload.get("success"):
raise RuntimeError(payload.get("error", "unknown error"))
for point in payload["data"]["data_points"]:
print(point["ts"], point["value"])相关文档
- 版本与兼容性:区分产品 V2、组件 Release 与
/api/v1。 - 安全与隐私:PAT 最小 scope、到期、存储与 MCP 风险。
- 架构与数据流:API、WebSocket、gRPC、任务与 IOStream 的关系。
File: docs/guide/architecture.md
title: 哪吒监控 V2 架构与数据流 outline: deep
哪吒监控 V2 架构与数据流
哪吒监控 V2 使用“一个 Dashboard 管理多个 Agent”的集中式拓扑。Dashboard 是控制面和展示入口,Agent 是部署在被监控节点上的数据采集与任务执行端。理解这条边界有助于正确设计域名、反向代理、权限、备份和故障排查。
逻辑拓扑
浏览器 / API 客户端
|
| HTTPS / WebSocket
v
+------------------------+ 通知提供商 / DNS API
| Dashboard |---------------------> 外部集成
| - 用户与管理前端 |
| - REST API / MCP |
| - 告警与任务调度 |
| - 实时状态与权限控制 |
+-----------+------------+
| |
| +------> SQLite(配置、用户和业务数据)
| +------> 可选 TSDB(指标与服务监控历史)
|
| gRPC(可由 HTTPS 反向代理承载)
v
+------+------+------+
| Agent | Agent | ... |
+-------+-------+-----+
| |
+-------> 本机指标、网络检查、授权任务这是逻辑关系,不要求每个组件位于同一网络。关键条件是浏览器能够访问 Dashboard,且每个 Agent 能够访问 Dashboard 的 Agent 对接地址。
Dashboard 是什么角色?
Dashboard 承担以下职责:
- 验证用户、API Token 和 Agent 连接身份。
- 接收 Agent 上报的主机信息、实时状态和任务结果。
- 维护服务器、分组、用户、服务、通知、任务、DDNS 和系统配置。
- 向用户前端、管理前端、REST API 和可选 MCP 入口提供数据。
- 评估服务状态与告警条件,并调用已配置的通知方式。
- 将终端、文件、任务、NAT 等授权请求转交到目标 Agent。
因此,Dashboard 不只是只读图表。启用远程运维能力后,它属于高权限控制面,应限制管理入口、使用 TLS、保护密钥并保持更新。
Agent 是什么角色?
Agent 运行在每台被监控设备上,主要负责:
- 读取操作系统可提供的主机和网络状态。
- 使用连接密钥与自身 UUID 接入 Dashboard。
- 按
report_delay等配置报告状态。 - 执行被分配的 HTTP、Ping 或 TCP 服务检查。
- 在没有被禁用且调用者有权限时执行终端、文件、任务、更新或 NAT 相关操作。
不需要远程操作的节点应使用 Agent 的 disable_command_execute、disable_force_update、disable_nat 等配置缩小能力范围。完整字段见 Agent 配置。
连接与反向代理
V2 的 Web 访问和 Agent 通信可以共用 Dashboard 监听端口,默认是 8008。实际部署通常有两种方式:
- 直接访问 Dashboard 端口:浏览器和 Agent 连接
host:8008。 - 通过反向代理提供 HTTPS:代理将普通 HTTP、WebSocket 和 gRPC 请求转发到 Dashboard。
反向代理必须正确支持 gRPC 和 WebSocket。当前 Agent/Dashboard 兼容 Authorization 和 Grpc-Metadata-Authorization 两种 gRPC 认证头;完整 Nginx、Caddy 和 CDN 注意事项见 Dashboard 反向代理配置及 WebSocket 排障。
如果公开访问域名和 Agent 通信域名不同,应分别设置 dashboard_host 和 install_host。它们还参与 OAuth2 回调 Host 与 NAT 保留域名判断,详见 Dashboard 配置。
状态数据如何流动?
主机状态
Agent 将主机信息和状态流发送给 Dashboard。Dashboard 在内存中维护实时状态供页面和 API 查询;启用 TSDB 后,服务器历史指标会写入本地 TSDB。没有启用 TSDB 时,实时状态仍可使用,但服务器历史指标不可用,前端会锁定相应历史周期。
服务监控
Dashboard 根据服务的覆盖范围和特定服务器配置,将检查任务分配给 Agent。Agent 从自身网络位置访问 HTTP、ICMP 或 TCP 目标并返回结果。这样可以比较不同线路或地域到同一目标的可用性与延迟。
未启用 TSDB 时,服务监控历史从 SQLite 读取;启用 TSDB 后改为从 TSDB 查询。启用步骤和迁移限制见如何启用 TSDB。
远程操作
浏览器或 API 发起终端、文件、任务等请求后,Dashboard 先验证用户或 Token 权限,再通过 Agent 的任务或 IOStream 通道转发。终端、文件管理、NAT 和 MCP 文件传输会使用有限的 IOStream 配额;需要时应关闭闲置会话。
数据存在哪里?
- SQLite:Dashboard 默认使用本地 SQLite 文件保存用户、配置和业务数据。
- 内存:当前在线状态和运行时对象会在 Dashboard 内存中维护,进程重启后由 Agent 重新连接并报告。
- 可选 TSDB:配置
tsdb.data_path后启用内置时序存储,用于服务器指标和服务监控历史。 - 外部服务:只有在配置相应通知、OAuth2 或 DDNS 提供商时,Dashboard 才会向这些服务发送请求;发送内容取决于具体模板和配置。
备份时不能只保存容器定义。安装脚本部署通常需要备份 /opt/nezha,并在迁移前停止 Dashboard 以获得一致数据,见备份与恢复。
常见架构选择
单域名部署
同一 HTTPS 域名同时服务浏览器和 Agent,配置最简单。反向代理必须同时正确处理 WebSocket 和 gRPC。
访问域名与通信域名分离
公开访问域名可接入 CDN,Agent 通信域名直接回源或使用明确支持 gRPC 的代理。该方式能绕开部分 CDN 对长连接或 gRPC 的限制,但需要正确设置两个 Host。
私有 Dashboard
通过 VPN、私有网络或访问控制层限制 Dashboard,适合不需要公开状态页的场景。必须确保所有 Agent 和管理员客户端仍能到达所需入口。
上线前检查
- 安装 Dashboard并替换默认密码。
- 为公开入口启用 HTTPS,正确配置真实 IP 请求头和可信 Host。
- 只向必要用户开放终端、文件、任务、NAT、API 与 MCP 权限。
- 为 Agent 关闭不需要的执行能力。
- 备份 SQLite、配置和 TSDB 目录,并验证恢复过程。
- 阅读安全与隐私和版本与兼容性。
File: docs/guide/comparison.md
title: 哪吒监控 V2 与其他监控工具怎么选? outline: deep
哪吒监控 V2 与其他监控工具怎么选?
哪吒监控 V2 适合希望在一套自托管 Web 界面中同时完成多服务器状态、网络服务探测、告警和常用远程运维的人。 如果需求更集中在公开状态页、秒级深度可观测性、可编程指标查询或企业网络与资产监控,Uptime Kuma、Netdata、Prometheus/Grafana 或 Zabbix 可能更贴近主要目标。
这些工具并非只能互相替代。例如,可以用哪吒管理 VPS 和远程操作,同时用 Prometheus/Grafana 观察应用指标,或用 Uptime Kuma 提供独立公开状态页。
一页对比
| 工具 | 官方定位与主要关注点 | 典型架构 | 更适合优先评估的场景 |
|---|---|---|---|
| 哪吒监控 V2 | 自托管服务器监控与运维:主机状态、HTTP/Ping/TCP 检查、告警、终端、文件、任务、DDNS、API | 中央 Dashboard + 每节点 Agent | VPS、多地域服务器、家庭实验室和小型团队,需要简洁状态视图与运维闭环 |
| Uptime Kuma | 易用的自托管可用性监控,覆盖 HTTP(S)、TCP、Ping、DNS、Push、WebSocket、Docker 等目标,并提供多状态页和多种通知 | 中央服务主动检查目标,也支持 Push 等监控类型 | 网站与端口可用性、证书、通知和公开状态页是核心需求 |
| Netdata | 分布式实时可观测性,采集系统和应用指标与日志,提供自动仪表板、告警和异常检测 | 每节点 Agent,可选 Parent 聚合与 Netdata Cloud 控制面 | 需要高粒度实时指标、自动发现、深入主机/应用排障或日志关联 |
| Prometheus + Grafana | Prometheus 采集和存储带标签的时序指标并用 PromQL 查询;Grafana 查询、可视化和告警多种指标、日志与追踪数据源 | Prometheus、exporter、服务发现、Alertmanager 与 Grafana 等可组合组件 | 云原生、微服务、自定义应用指标、复杂查询和可组合可观测性平台 |
| Zabbix | 企业级分布式开源监控,覆盖服务器、网络、虚拟机、应用、服务、数据库和网站,支持轮询、接收、模板、告警与可视化 | Server + 数据库 + Web 前端,可加入 Proxy 和 Agent | 需要广泛协议、模板、网络设备、自动发现、代理分层和企业流程的环境 |
表格只概括主要关注点,不表示某工具完全不具备其他能力。功能和许可会变化,决策前应查看各项目当前官方文档。
哪吒监控 V2 vs Uptime Kuma
两者都能自托管并检查 HTTP、Ping 和 TCP 目标,也都提供通知和易读的 Web 界面。区别主要在默认问题域:
- 选择哪吒优先:你还需要每台服务器的 CPU、内存、磁盘、流量与在线状态,并希望使用终端、文件、任务、DDNS 或服务器 API。
- 选择 Uptime Kuma 优先:主要目标是多类型端点可用性、证书和面向访客的多个状态页,不需要在所有服务器安装运维 Agent。
- 组合使用:用哪吒观察和管理主机,用独立 Uptime Kuma 从外部检查公开服务,降低“监控系统和被监控服务同故障域”的风险。
Uptime Kuma 的当前类型和状态页能力以其官方 README为准。
哪吒监控 V2 vs Netdata
两者都在节点安装 Agent,但采集深度和操作模型不同:
- 选择哪吒优先:需要低门槛的多服务器总览、基础资源与流量、服务可用性、通知和远程运维功能。
- 选择 Netdata 优先:需要每秒级实时指标、广泛自动采集、自动仪表板、异常检测,以及面向主机和应用的深度排障。
- 组合使用:哪吒负责资产总览和日常操作,Netdata 负责出现性能问题后的高粒度调查。
Netdata 的 Agent、Parent、Cloud 和数据边缘存储设计见其官方概览。某些集中管理或协作能力可能涉及 Netdata Cloud 与对应方案,选型时应单独核对。
哪吒监控 V2 vs Prometheus/Grafana
Prometheus/Grafana 通常是一套可组合生态,而不是与哪吒一一对应的单体工具:
- 选择哪吒优先:主要管理服务器和网络检查,希望安装后很快获得固定的数据模型与运维界面,不准备设计 exporter、标签、PromQL、告警和仪表板体系。
- 选择 Prometheus/Grafana 优先:需要采集自定义应用或业务指标、使用多维标签和 PromQL、接入 Kubernetes/服务发现,或跨指标、日志、追踪数据源建立仪表板。
- 组合使用:Prometheus/Grafana 负责应用和平台可观测性,哪吒作为独立的主机在线状态、线路检查和授权运维入口。
Prometheus 的拉取模型、时序数据和适用边界见官方 Overview;Grafana 的数据源、可视化和告警定位见官方 Introduction。
哪吒监控 V2 vs Zabbix
两者都能使用 Agent 监控服务器并提供告警,但默认规模与配置模型不同:
- 选择哪吒优先:服务器数量与网络结构相对直接,重视快速部署、现代简洁界面和终端/文件/任务等日常运维入口。
- 选择 Zabbix 优先:需要 SNMP、IPMI、JMX、VMware、网络发现、模板继承、Proxy 分布式采集、复杂触发器或企业级权限与流程。
- 组合使用:Zabbix 管理网络与企业资产,哪吒提供部分 VPS 或独立节点的轻量视图与操作入口。
Zabbix 的轮询与接收、资产范围和分布式能力见官方介绍及功能列表。
用需求做最终选择
按顺序回答以下问题:
- 监控对象是什么? 主要是服务器、外部端点、应用指标、日志,还是网络设备?
- 需要什么分辨率和保留期? 不要把“能显示 CPU”误认为与秒级完整可观测性相同。
- 是否需要远程操作? 终端和文件管理能提升效率,也会扩大权限与攻击面。
- 谁使用结果? 个人、访客、小团队、SRE 还是企业网络运维,其权限和审计要求不同。
- 愿意维护多少组件? 更可组合的系统通常也需要更多数据模型、存储、查询和升级设计。
- 故障域是否独立? 如果监控服务和被监控目标部署在同一台机器或同一网络,整体故障时可能无法告警。
决定使用哪吒后,继续阅读产品概览、架构与数据流、安装 Dashboard和安全与隐私。
对比依据
本页只使用项目官方资料描述其主要定位:
本页不提供未经同一环境复现的性能、资源占用或成本排名。
File: docs/guide/dashboard.md
outline: deep
安装 Dashboard
准备工作
搭建哪吒监控的 Dashboard,你需要:
- 一台可以连接公网的服务器。防火墙和安全策略需放行 8008 端口,否则无法访问或接收数据。单核 512MB 内存的服务器即可满足大多数使用场景。
- 一个已设置好 A 记录,指向 Dashboard 服务器 IP 的域名。
::: tip
如果你想使用 CDN,请准备两个域名:
- 一个配置好 CDN,用作公开访问,CDN 需支持 WebSocket 协议;
- 另一个域名不使用 CDN,用作 Agent 与 Dashboard 的通信。
当前 V2 的访问和 Agent 通信可以共用同一端口;但不同 CDN 对 gRPC 和长连接的支持可能导致通信异常,因此仍建议按上述方式准备两个域名(非强制要求)。
本文档以 "dashboard.example.com" 和 "data.example.com" 为例。
:::
在服务器中安装 Dashboard
在面板服务器中,运行以下安装脚本:
curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh如果你的服务器位于中国大陆,可以使用镜像:
curl -L https://gitee.com/naibahq/scripts/raw/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo CN=true ./nezha.sh以 Docker 安装为例,安装完成后按提示输入以下信息:
请输入站点标题:- 自定义站点标题。请输入暴露端口:- 公开访问端口(默认 8008,可自定义)。请指定后台语言:- 选择语言偏好。
输入完成后,等待拉取 Docker 镜像。安装结束后,如果一切正常,你可以通过域名和端口号访问 Dashboard,例如:http://dashboard.example.com:8008
如果需要再次运行安装脚本,可输入以下命令:
./nezha.sh打开管理脚本。
登录到 Dashboard 配置界面
后台管理界面的路径为 /dashboard,你只需访问:http://dashboard.example.com:8008/dashboard
首次登录的默认用户名和密码均为 admin。
::: warning
默认密码为弱密码,对于高权限的面板来说,使用弱密码非常危险!
建议安装后立即进入管理页面:点击头像 → “个人信息” → “更新个人资料”修改密码。
建议密码长度至少 18 位,并混合大小写字母、数字及符号。
:::
配置反向代理
更新 Dashboard
运行脚本:
./nezha.sh选择重启面板并更新。
下一步
File: docs/guide/dashboardq.md
outline: deep
Dashboard 常见问题
为什么管理面板中显示的 IP 和 Agent 实际 IP 不一致?
管理面板中显示的 IP 是 Agent 使用 IP-API 检测并上报的出口 IP。
如显示的 IP 与服务商提供的 IP 不一致,可能原因如下:
- 服务商使用入口 IP:服务商提供的 IP 为高防或映射后的入口 IP,而非实际出口 IP。
- 多线路或专线环境:多线服务器或 IPLC 专线可能导致出口 IP 与预期不一致。
验证出口 IP
在 Agent 服务器中运行以下命令测试出口 IP:
curl https://ipapi.co/ip/
curl ip.sb
curl ip-api.com面板安装/重启/更新失败:`iptables ......`
重启 Docker
运行以下命令重启 Docker:shellsystemctl status docker systemctl restart docker systemctl status docker关闭或移除 iptables
若问题仍未解决,尝试关闭或移除iptables。更换官方内核
部分问题可能与内核有关,切换到官方内核后再尝试操作。
面板布局错误、CSS 资源无法被加载
通常由 CSS 文件丢失或无法加载导致。解决方法如下:
重启并更新面板
执行一键脚本选择更新面板。检查 Nginx 配置
若问题未解决,检查并修改 Nginx 的 vhost 文件:- 在宝塔面板中找到安装 Dashboard 时配置的站点,点击
设置→配置文件。 - 删除以下内容:nginx
location ~ .*\.(js|css)?$ { expires 12h; error_log /dev/null; access_log /dev/null; } - 保存配置,并清空浏览器、Nginx 和 CDN 的缓存。
- 在宝塔面板中找到安装 Dashboard 时配置的站点,点击
刷新页面
此时页面应恢复正常。
面板无法启动:`panic:无法找到配置的 DDNS 提供者...`
DDNS 提供者配置错误。支持的值包括:webhook、cloudflare、tencentcloud 和 dummy。请确认配置正确。
面板更新 DDNS 崩溃:`panic:interface conversion: interface {} is nil, not []interface {}`
DDNS AccessID 或 AccessSecret 填写有误,请检查并更正。
面板警告:`NEZHA>> 错误的服务监控上报...`
此问题通常由于 Dashboard 和 Agent 的版本不匹配导致。
解决方法:更新 Dashboard 和 Agent 至最新版本。
服务器网络监控页显示空白
此错误说明:
- 未在服务页中设置
TCP-Ping或ICMP-Ping类型的监控。 - 数据尚未生成。
解决方法:完成设置后等待一段时间,再查看监控数据。
启用 HTTPS 后 `/terminal` 或 `/ws` 无法正常连接
此问题多因证书不完整导致:
- 查看日志是否出现:plaintext
x509:certificate signed by unknown authority - 若有该错误,更换完整证书即可解决。
数据修改/功能扩展需求
若需对 Dashboard 提供的数据进行修改(如批量新建 Agent),可直接操作数据库。
注意事项:
- 数据库类型为
sqlite3,位于/opt/nezha/dashboard/data/sqlite.db。 - 修改数据前,请备份数据库。
- 修改时,务必 停止面板容器。
::: danger
请勿随意修改数据库!错误修改可能导致数据混乱或无法启动 Dashboard。
:::
Dashboard 是否会自动更新?
Dashboard 不会自动更新,需要手动运行脚本进行更新。
Agent 在默认情况下会自动更新。
连接在线终端时提示:`Agent 信令下发失败`
此问题可能由于以下原因导致:
- Agent 离线:检查 Agent 是否正常运行。
- 连接不稳定:确认 Agent 与 Dashboard 的连接是否稳定,并排除网络问题。
复制安装命令时提示:`You have not specify the installed host.`
错误原因
此错误表示您尚未在设置页面中配置 Agent 对接地址【域名/IP:端口】。
该项配置是生成安装命令的必要条件,未配置时无法正确生成安装命令。
解决方法
进入设置页面
登录 Dashboard,点击右上角头像,选择系统设置。配置服务器域名/IP
在Agent 对接地址【域名/IP:端口】项中填写 Agent 连接 Dashboard 使用的地址。
示例:- 域名:
data.example.com:8008 - IP:
123.123.123.123:8008
- 域名:
保存设置
完成配置后,保存设置并返回安装命令页面,重新复制安装命令。
File Manager 下载/上传时卡住
问题原因
缓冲区设置问题
File Manager (FM) 在传输文件时,每次发送的数据块大小为 1 MiB。如果代理的缓冲区小于 1 MiB,可能会导致传输卡住。CDN 影响性能
使用 CDN 可能会严重降低文件传输性能,甚至导致卡顿。
解决方法
1. 检查并调整代理缓冲区
对于常见的代理服务器(如 Nginx 和 Caddy),确保其缓冲区大于 1 MiB:
Nginx 配置示例:
proxy_buffer_size 2m;
proxy_buffers 4 2m;
proxy_busy_buffers_size 4m;- 将以上配置添加到 Nginx 的站点配置中,保存后重新加载配置:bash
sudo nginx -s reload
Caddy 配置示例:
reverse_proxy {
transport http {
read_buffer 2MB
write_buffer 2MB
}
}- 将缓冲区大小设置为至少 2 MiB,保存配置并重启 Caddy 服务。
2. 尝试直接连接
如果使用 CDN,建议绕过 CDN,直接连接到源服务器进行文件传输。
检查连接方式是否直接指向源服务器的 IP 或域名,并确保网络畅通。
使用 Nginx 反代 gRPC 无法连接 Agent
当前版本的 Agent 会同时发送连字符形式的 client-secret、client-uuid 和旧版下划线形式的认证 Header,Dashboard 也同时兼容两种形式。因此,当 Dashboard 为 v2.2.1 或更高版本、Agent 为 v2.2.2 或更高版本时,通常不再需要为下划线 Header 设置 underscores_in_headers 或 ignore_invalid_headers。
如果仍无法连接,请优先确认:
- Dashboard 与 Agent 均已升级,并重新生成或核对安装命令中的连接地址、UUID 和密钥。
- Nginx 的 gRPC location 使用
grpc_pass,且没有清除client-secret或client-uuid。 - TLS 开关与代理入口协议一致,并查看 Dashboard、Agent 和 Nginx 错误日志。
只有在必须兼容旧版 Agent 或 Dashboard 时,才需要保留旧配置:在 server 块启用 underscores_in_headers on; 和 ignore_invalid_headers off;,并按需转发 client_secret、client_uuid。升级完成后可移除这组兼容设置。
在线终端、文件管理或内网穿透提示并发流过多
Dashboard 会限制活跃 IOStream 数量,避免大量终端、文件传输或穿透连接占满资源:
too many concurrent streams for this user:同一用户已占用 20 条在线终端或文件管理流。too many concurrent streams for this server:同一目标服务器已占用 40 条流;此统计包括在线终端、文件管理、内网穿透和 MCP 文件传输。
关闭已经不用的终端、文件管理窗口、穿透连接或文件传输后再重试。若数量看起来不符,请先确认相关客户端确实已断开,再检查 Dashboard 日志定位未结束的连接。
File: docs/guide/ddns.md
outline: deep
DDNS
DDNS 功能适用于使用动态 IP 的服务器。当 Agent 上报一个新 IP 时,Dashboard 会根据配置自动更新 DNS 记录。
为什么使用哪吒监控的 DDNS 功能?
- 集中管理:方便在 Dashboard 中集中管理 DDNS 设置,无需在每台服务器上部署单独的 DDNS 服务。
- 更高安全性:机密信息仅存储在面板服务器中,降低泄露风险。
配置说明
可以直接在 Dashboard 的管理页面中添加 DDNS 配置。
- 进入动态域名解析配置页面
点击菜单栏中的“动态域名解析”,进入配置页面。 - 新建配置
点击“新配置”按钮,在弹出窗口中填写相关信息:- 名称:配置的名称,便于管理。
- DDNS 供应商:选择提供服务的供应商类型。
- 域名(逗号分隔):填写需要更新的域名,多个域名用逗号分隔。支持 IDN(国际化域名)。
- 最大重试次数:DDNS 更新的最大尝试次数,默认为 3,可设置范围为 1-10 的整数。
- DDNS 凭据 1 和 DDNS 凭据 2:凭据选填,具体需求参见供应商列表。
- Webhook 特殊说明
如果使用webhook供应商,请根据Webhook 配置说明填写相关选项。 - 启用选项
至少勾选 启用 DDNS IPv4 或 启用 DDNS IPv6,否则不会进行更新。 - 关联服务器
添加配置后,需要修改服务器设置以启用 DDNS 功能:- 启用 DDNS:在
服务器页面中为目标服务器启用 DDNS。 - DDNS 配置:选择适用的 DDNS 配置 ID,支持通过名称搜索。
- 启用 DDNS:在
Webhook 配置说明
Webhook 支持自定义 HTTP 请求,适用于第三方供应商或其他定制化需求。
选项说明
- Webhook URL:目标请求的 URL,支持占位符替换。
- Webhook 请求方式:支持
GET、POST、PATCH、DELETE和PUT。 - Webhook 请求类型:请求体格式,可选择
JSON或Form。 - Webhook 请求头:以 JSON 格式填写请求头,注意不支持嵌套。
- Webhook 请求体:
GET和DELETE不使用请求体;如果使用嵌套格式,请选择JSON类型。
读取 DDNS 配置时,API 和管理前端会隐藏凭据 2(access_secret)及 Webhook 请求头。编辑时将这些敏感字段留空会保留原值;如果需要清空已保存的值,请删除并重新创建该 DDNS 配置。
占位符说明
| 占位符 | 含义 |
|---|---|
#ip# |
主机 IP 地址 |
#domain# |
域名(每次单独请求) |
#type# |
IP 类型:"ipv4" 或 "ipv6" |
#record# |
记录类型:"A" 或 "AAAA" |
#access_id# |
DDNS 凭据 1 |
#access_secret# |
DDNS 凭据 2 |
花生壳 Webhook 示例
点击展开/收起
- URL:
http://ddns.oray.com/ph/update?hostname=#domain#&myip=#ip# - 请求方式:
GET - 请求头: 其中json
{ "Authorization": "Basic pass" }pass是 Base64 编码后的用户名和密码(例如,user:pass转换为dXNlcjpwYXNzCg==)。 - 注意:花生壳仅支持 A 记录,因此只需启用 IPv4。
供应商列表
| 供应商 | 凭据1(ID) | 凭据2(Secret) |
|---|---|---|
dummy |
❌️ | ❌️ |
webhook |
可选 | 可选 |
cloudflare |
❌️ | ✅ |
tencentcloud |
✅ | ✅ |
he |
❌️ | ✅ |
`cloudflare` Token 权限
Token 需要为目标域名分配以下权限:
区域.区域:读取, 区域.DNS:编辑
`he` Secret 获取
he 供应商使用每个记录独有的 DDNS 密钥作为 Secret,因此必须先创建对应 A/AAAA 记录,勾选 Enable entry for dynamic dns,之后再在对应的 DDNS 栏中设置新的 DDNS 密钥。
查看日志
在 Dashboard 的日志页面,可以查看 DDNS 更新的详细记录。如果配置正确,日志中会显示更新状态。例如:
dashboard_1 | 2024/03/16 23:16:25 NEZHA>> 正在尝试更新域名(ddns.example.com)DDNS(1/3)
dashboard_1 | 2024/03/16 23:16:28 NEZHA>> 尝试更新域名(ddns.example.com)DDNS成功File: docs/guide/group.md
outline: deep
分组管理
分组管理允许用户更高效地组织服务器和通知设置,提高 Dashboard 的可读性和操作便捷性。
服务器分组
功能说明
服务器分组用于在 Dashboard 中为服务器分类管理。分组后的服务器会在不同的标签页中展示,便于快速查找和区分。
配置步骤
进入服务器页面
在服务器页面中完成服务器的基础配置。设置分组
为服务器设置分组名称,相同分组名称的服务器会被归类到同一个标签页。
应用场景
- 区域划分:按地理位置(如
中国区、海外区)对服务器进行分组。 - 用途划分:按服务器用途(如
数据库、Web服务)分组。 - 部门划分:按使用部门(如
研发部、运营部)分组。
通知分组
功能说明
通知分组允许用户将多个通知方式组合成一个通知组,通知组可用作任务或告警的通知目标,实现一键发送多种方式的通知。
配置步骤
进入通知页面
在通知页面中配置所需的通知方式(如 Telegram、邮件、钉钉等)。创建通知组
将一个或多个通知方式添加到同一个通知组中,命名该分组便于识别。应用通知组
在任务或告警规则中选择通知组作为通知目标,触发时会同时通过分组内的所有通知方式发送通知。
应用场景
- 多渠道通知:通过 Telegram 和邮件同时接收服务器告警。
- 分级通知:针对不同告警类型或服务器分组,设置不同的通知组(如
高优先级通知组与普通通知组)。