Cane's Blog

Cane

【Docker】Docker+ NPM 安装哪吒面板

5
2025-10-14

背景

Nginx Proxy Manager 运行在一个名为: "Nginx" 的网络里,我想要将「哪吒面板」安装在 Docker 中,并使用 NPM 进行反向代理,同时希望 Agent 能通过反代后的域名和443端口进行连接。

安装

services:
  nezha:
    image: registry.cn-shanghai.aliyuncs.com/naibahq/nezha-dashboard:latest
    container_name: nezha
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /home/nezha/dashboard:/dashboard/data
    networks:
      - nginx
networks:
  nginx:
    external: true

NPM 配置

Details

nezha_npm_detail.png

注: 必须开启 Websockets Support

SSL

nezha_npm_ssl.png

注: 必须开启 HTTP/2 Support,否则 Agent 连接不上 Dashboard

Advance

underscores_in_headers on; 
location ^~ /proto.NezhaService/ { 
    grpc_set_header Host $host;
    grpc_set_header nz-realip $remote_addr;
    grpc_read_timeout 600s;
    grpc_send_timeout 600s;
    grpc_socket_keepalive on;
    client_max_body_size 10m;
    grpc_buffer_size 4m;
    grpc_pass grpc://nezha:8008;
}

注: underscores_in_headers on; 必不可少,否则 Agent 连接不上 Dashboard

Dashboard 配置

nezha_npm_config.png

注: 这里的端口号必不可少,否则使用后台的生成的 Agent 命令 连接不上 Dashboard

Dashboard 添加三网测速

后台服务添加

nezha_npm_service.png

补充

容易出问题的点,是在使用 NPM 设置错误的时候,grpc 连不上。因为 NPM 的 Location 默认只支持 HTTP/HTTPS 两种 Scheme,要像支持 grpc 只能在 Advance 里面手动设置,需要注意的是必须启用 HTTP/2 Support,否则即使 Advance 设置正确, Agent 也是连接不上 Dashboard 的。

调试 grpc 连接,可以在控制台输入

curl https://xxxx/proto.NezhaService/ -H "Content-Type:application/grpc" -X POST -v

一切正常的话,输出类似于

root@ubuntu:~# curl https://xxxxxx/proto.NezhaService/ -H "Content-Type:application/grpc" -X POST -v
* Host xxxx:443 was resolved.
* IPv6: (none)
* IPv4: xxxx
*   Trying xxxx:443...
* Connected to xxxxx (xxxxx) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):