哪吒探针搭建教程

哪吒探针

官方GitHub地址

主面板仓库(核心项目,现在官方组织地址):https://github.com/colbymchenry/codegraph

旧地址(已迁移归档,不再更新):https://github.com/naiba/nezha

Agent 客户端仓库(各服务器探针程序):https://github.com/nezhahq/agent

一键安装脚本仓库:https://github.com/nezhahq/scripts

官方文档:https://nezha.wiki/

Gitee 国内镜像:https://gitee.com/naibahq/nezha(国内下载脚本提速用)

服务器配置

1核1g芝加哥服务器

可以购买以下服务商的服务器,价格比较实惠:

https://cloud.colocrossing.com/cart.php?a=confproduct&i=1

https://my.racknerd.com/cart.php?a=confproduct&i=0

1.连接服务器

我使用的是MobaXterm连接服务器,可能会出现网络问题,这个就需要自己开魔法解决。

2.配置服务器,安装docker

安装 Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 更新系统软件源索引
sudo apt update

# 2. 安装必备依赖:证书、下载工具
sudo apt install -y ca-certificates curl

# 3. 创建 Docker 密钥存储目录(权限 0755:仅管理员可写)
sudo install -m 0755 -d /etc/apt/keyrings

# 4. 下载 Docker 官方 GPG 密钥(验证软件包合法性,防止篡改)
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

# 5. 给所有用户添加读取密钥的权限
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 6. 添加 Docker 官方软件源到系统(自动识别系统版本、架构)
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# 7. 刷新软件源(加载刚添加的 Docker 源)
sudo apt update

# 8. 安装 Docker 核心组件 + Compose 插件
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动并验证 Docker

1
2
3
4
5
6
7
8
9
10
11
# 开机自启
sudo systemctl enable docker

# 启动 Docker
sudo systemctl start docker

# 测试是否安装成功
sudo docker run hello-world

# 查看 Docker Compose 版本
docker compose version

看到 hello-world 输出欢迎信息 = 安装成功

可选:让普通用户不用 sudo 也能用 Docker

1
2
3
4
5
6
sudo usermod -aG docker $USER
newgrp docker

# 之后使用以下命令就不会报权限错误了
docker ps
docker compose version

3.拉取哪吒探针镜像

先放行8008端口,先检查系统有没有安装ufw或者有没有防火墙配置,我这里没找到,所以我选择直接安装ufw而不是在网页配置防火墙规则这样比较简单,注意需要先放行 SSH(22端口)然后再启动,防止远程链接断开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 安装 UFW(如果没有)
sudo apt update && sudo apt install -y ufw

# 2. 先放行 SSH(22端口),防止锁死
sudo ufw allow 22/tcp

# 3. 放行 8008 端口
sudo ufw allow 8008/tcp

# 4. 开启防火墙
echo "y" | sudo ufw enable

# 5. 检查状态
sudo ufw status verbose

下一步我们就可以去拉取镜像了

1
2
3
4
5
6
7
8
# 1. 下载哪吒面板官方安装脚本到服务器,命名为 nezha.sh
curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh

# 2. 给脚本添加 可执行权限(必须加,否则无法运行)
chmod +x nezha.sh

# 3. 执行安装脚本(运行后按提示输入数字安装服务端即可)
./nezha.sh

然后它会询问你的安装方式,选择Docker安装,然后选择1进行面板的安装

安装界面

4.配置域名

可以自己在阿里云或腾讯云购买个便宜的域名,我是在下面买的

https://www.namesilo.com/

买了个域名之后,我们将域名绑定到我们的服务器。

点击下面这个小球:

点击小球

在DNS这里进行配置一下域名解析,将域名绑定到我们的服务器,上面是主域名,底下是子域名:

DNS配置

然后我们用域名访问一下,出现画面说明成功:

域名访问成功

5.配置Caddy反代

首先开放443端口

1
2
3
4
5
#开放443端口
ufw allow 443/tcp

#重新加载
ufw reload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 更新系统软件源列表(获取最新的软件版本信息)
apt update

# 安装必要的依赖包:密钥、https传输、curl下载工具
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 下载并导入 Caddy 官方 GPG 密钥(保证软件安全、官方正版)
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 添加 Caddy 官方软件源(让系统能从官方仓库安装最新版 Caddy)
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

# 再次更新软件源(让系统识别刚添加的 Caddy 源)
apt update

# 安装 Caddy 网页服务器(自动配HTTPS、反向代理、超简单)
apt install -y caddy

# 查看 Caddy 运行状态(确认是否成功启动)
systemctl status caddy --no-pager

# 检查 80/443/8008 端口是否被监听(确认网站/面板端口正常开放)
ss -tlnp | grep -E ':80|:443|:8008'

下一步就是让 Caddy 接管 域名,反代到 127.0.0.1:8008,它会自动申请 HTTPS 证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
先确认一件事:云服务器安全组里已经放行这 3 个端口:

- 80/tcp
- 443/tcp
- 8008/tcp

如果没放行,先放行 80 和 443。

然后按下面做。

第 1 步:备份 Caddy 配置

cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak

第 2 步:编辑配置

nano /etc/caddy/Caddyfile

把里面内容改成下面这样(需要根据你们自己域名去修改):
#上面那个就是把请求转发给本机8008端口,下面的是www 跳转到主域名

域名 {
reverse_proxy 127.0.0.1:8008
}

www.域名 {
redir https://域名{uri}
}

改完后:

- Ctrl + O 保存
- 回车确认
- Ctrl + X 退出

第 3 步:检查并重载 Caddy

#格式化 Caddy 配置文件(自动排版、纠错、变整齐)
caddy fmt --overwrite /etc/caddy/Caddyfile

#检查配置文件语法是否正确(有没有写错、少括号)
caddy validate --config /etc/caddy/Caddyfile

#重新加载 Caddy(让新配置生效,不掉线、不中断服务)
systemctl reload caddy

第 4 步:看证书是否申请成功

journalctl -u caddy -n 50 --no-pager

然后再看端口:

ss -tlnp | grep -E ':80|:443|:8008'

正常的话,这时你应该能看到 443 也开始监听了。

第 5 步:浏览器测试
打开:

https://daxiaohuo.top/dashboard

如果能正常打开,说明 HTTPS 已经成功。

我们再优化一下Caddy配置,把真实 IP 头和 gRPC 兼容规则补上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 1. 写入【哪吒面板专用】Caddy配置文件(覆盖原有配置)
cat > /etc/caddy/CaddyFile <<'EOF'
# 主域名配置(你的域名:daxiaohuo.top)
daxiaohuo.top {
# 匹配哪吒探针 gRPC 通信规则(必须配置,否则探针无法连接)
@grpcProto {
path /proto.NezhaService/*
}

# gRPC 协议转发(给哪吒客户端/探针用)
reverse_proxy @grpcProto {
header_up Host {host} # 传递真实域名
header_up nz-realip {remote_host} # 传递真实访问IP
transport http {
versions h2c # gRPC 必须使用 h2c 协议
read_buffer 4096 # 数据缓冲大小
}
to 127.0.0.1:8008 # 转发到本机哪吒面板 8008 端口
}

# Web 面板访问转发(给你浏览器登录后台用)
reverse_proxy {
header_up Host {host}
header_up Origin https://{host}
header_up nz-realip {remote_host}
transport http {
read_buffer 16384
}
to 127.0.0.1:8008 # 同样转发到 8008 端口
}
}

# WWW 域名自动 301 跳转到主域名(统一网址、利于SEO)
www.daxiaohuo.top {
redir https://daxiaohuo.top{uri}
}
EOF

# 2. 格式化配置文件(自动排版、修正语法错误)
caddy fmt --overwrite /etc/caddy/Caddyfile

# 3. 检查配置是否合法(验证无误才能继续)
caddy validate --config /etc/caddy/Caddyfile

# 4. 平滑重载 Caddy(让配置立即生效,不中断服务)
systemctl reload caddy

# 5. 查看 Caddy 最近30条日志(检查是否启动成功、有无报错)
journalctl -u caddy -n 30 --no-pager

接下来修改面板配置(目前还没挂 Cloudflare 代理,所以不要填 CF-Connecting-IP):

- Agent 连接地址:域名:443

- 通过 TLS 连接 Agent:y

- 前端真实IP请求头:nz-realip

- Agent真实IP请求头:nz-realip

无需勾选直连ip,使用直连 IP 适合的是哪吒直接暴露公网、没有反代头处理的场景。

nz-realip是我们自己在 Caddy 里约定的一个请求头名字

流程大概如下:

- 访问者先到 Caddy

- Caddy 再把请求转发给哪吒

- 转发时,Caddy 顺手把“真实客户端 IP”塞进一个请求头

- 这个请求头名字就叫 nz-realip

常见的几种请求头:

- CF-Connecting-IP:Cloudflare 传来的头

- X-Real-IP / X-Forwarded-For:很多反代常见头

- nz-realip:我们当前这份 Caddy 配置里专门传给哪吒的头

6.给自身服务器安装探针服务并关闭公网8008

安装探针

点击上面的安装命令就会生成对应的命令,然后去自己服务器里去执行那条命令,就可以看到自己的机器了,

别忘了配置对游客隐藏。

隐藏配置

最后就是关闭公网8008了

1
2
ufw deny 8008/tcp
ufw reload

接下来把 Docker 的 8008 只绑定到本机:

先看配置文件:

cat /opt/nezha/dashboard/docker-compose.yaml

找到类似这一段:

ports:

​ - “8008:8008”

把它改成:

ports:

​ - “127.0.0.1:8008:8008”

1
2
3
4
5
6
7
8
# 1. 用 nano 编辑器打开哪吒面板的 docker 配置文件
nano /opt/nezha/dashboard/docker-compose.yaml

# 2. 进入哪吒面板的安装目录(必须进入目录才能执行 docker 命令)
cd /opt/nezha/dashboard

# 3. 重启/启动 docker 容器(让配置修改生效)
docker compose up -d

然后检查端口:

ss -tlnp | grep -E ‘:80|:443|:8008’

期望看到的是:

- 80 被 caddy 监听

- 443 被 caddy 监听

- 8008 只监听在 127.0.0.1

然后就配置好了可以在其他的机器上也都用命令下载

7.配置Cloudflare代理

  1. 去 Cloudflare 注册账号并添加自己的域名

https://dash.cloudflare.com/

  1. Cloudflare 会给你两条 Nameserver
  2. 去你的域名注册商后台,把域名的 NS 改成 Cloudflare 给的那两条
  3. 等生效
  4. 生效后,在 Cloudflare DNS 里新加一条子域名配置(子域名用于给网页登录,主域名用于给 Agent 通信),不再去原服务商那里配

接下来修改Caddy配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cat > /etc/caddy/Caddyfile <<'EOF'
# ==============================================
# 1. 主域名:给 哪吒Agent 客户端连接用
# DNS 灰色云(DNS only)→ 直连服务器,真实IP
# ==============================================
daxiaohuo.top {
# gRPC 代理(Agent 通信)
@grpcProto {
path /proto.NezhaService/*
}
reverse_proxy @grpcProto {
header_up Host {host}
header_up nz-realip {remote_host} # 直连 → 取真实IP
transport http {
versions h2c
read_buffer 4096
}
to 127.0.0.1:8008
}

# Web 代理
reverse_proxy {
header_up Host {host}
header_up Origin https://{host}
header_up nz-realip {remote_host} # 直连 → 取真实IP
transport http {
read_buffer 16384
}
to 127.0.0.1:8008
}
}

# ==============================================
# 2. 子域名:给 浏览器面板 访问使用
# DNS 橙色云(Proxied)→ 走 Cloudflare
# ==============================================
panel.daxiaohuo.top {
reverse_proxy {
header_up Host {host}
header_up Origin https://{host}
header_up nz-realip {header.CF-Connecting-IP} # ✅ CF 正确取真实IP
transport http {
read_buffer 16384
}
to 127.0.0.1:8008
}
}
EOF

验证并重新加载caddy配置

1
2
3
4
5
6
7
8
# 1. 自动格式化 Caddy 配置文件(排版整齐、修正语法)
caddy fmt --overwrite /etc/caddy/Caddyfile

# 2. 检查 Caddy 配置是否合法(验证无误才能继续)
caddy validate --config /etc/caddy/Caddyfile

# 3. 平滑重载 Caddy(让新配置立即生效,不中断服务)
systemctl reload caddy

Cloudflare 面板里改这两个设置

到 SSL/TLS:

- Overview -> 设为 Full (strict)

到 Network:

- WebSockets -> 开启

SSL配置

WebSockets配置

配置 核心作用 不设的后果
SSL/TLS → Full (strict) 全程 HTTPS 加密,适配 Caddy 反代 面板无限跳转、打不开
Network → WebSockets 开启 支持 WebSocket 穿透,保障面板实时功能 监控、终端、Agent 全失效

然后就可以访问了