环境要求

  • 飞牛NAS已安装 Docker + Docker Compose(Docker版本≥20.10,无需root权限);
  • 已开通NAS SSH访问(或能通过文件管理器编辑配置文件);
  • 防火墙放行 5501 端口(仅需这1个对外端口)。

前期操作

  • 记录NAS本地IP(如 192.168.5.134,在NAS网络设置中查看);
  • 确保Cloudflare Tunnel已在NAS安装(若未安装,先完成Tunnel客户端部署)。

Fnos本地操作

创建部署目录

通过NAS SSH或文件管理器创建统一目录(方便维护):

# 登录NAS SSH执行(或手动创建对应文件夹)
mkdir -p /vol1/1000/Docker/nezha/{data,nginx-logs}
cd /vol1/1000/Docker/nezha

最终目录结构:

/vol1/1000/Docker/nezha/
├── docker-compose.yml  # 容器编排文件
├── nginx.conf          # Nginx代理配置
├── data/               # 面板数据目录
└── nginx-logs/         # Nginx日志目录

编写配置文件

全部可直接复制即可

文件路径:/vol1/1000/Docker/nezha/docker-compose.yml

networks:
  nezha-net:
    driver: bridge

services:
  nezha-dashboard:
    image: ghcr.io/nezhahq/nezha:v1.12.0  # 哪吒面板的程序版本
    container_name: nezha-dashboard        # 容器名字,方便识别
    restart: unless-stopped                # 开机自动启动,崩溃了自动重启
    volumes:
      - ./data:/dashboard/data             # 把面板数据存到咱们创建的 data 文件夹
    environment:
      - TZ=Asia/Shanghai                   # 时区设为上海(时间准确)
    networks:
      - nezha-net
    expose:
      - "8008"                             # 面板内部端口,不用对外暴露

  nginx-proxy:
    image: nginx:alpine                    # 轻量版 Nginx 反向代理
    container_name: nezha-nginx            # Nginx 容器名字
    restart: unless-stopped                # 开机自动启动
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 加载咱们的 Nginx 配置
      - ./nginx-logs:/var/log/nginx        # 日志存到 nginx-logs 文件夹
    ports:
      - "5501:80"                          # 对外暴露 5501 端口,前面是 NAS 端口,后面是容器端口
    networks:
      - nezha-net
    environment:
      - TZ=Asia/Shanghai                   # 时区设为上海

文件路径:/vol1/1000/Docker/nezha/nginx.conf

underscores_in_headers on;  # 允许请求头里有下划线,避免报错

# 下面两行是让面板能看到真实访问 IP(用 Cloudflare 时有用)
set_real_ip_from 0.0.0.0/0;
real_ip_header CF-Connecting-IP;

# 指向哪吒面板的内部地址
upstream dashboard {
    server nezha-dashboard:8008;
    keepalive 256;  # 保持连接,提升速度
}

server {
    listen 80;  # Nginx 内部监听 80 端口(和上面 ports 里的 80 对应)
    server_name localhost;  # 本地访问,不用改

    # 支持 gRPC(监控代理和面板通信要用,必须有)
    location ^~ /proto.NezhaService/ {
        grpc_set_header Host host;
        grpc_set_header nz-realiphttp_CF_Connecting_IP;
        grpc_pass grpc://dashboard;
    }

    # 支持 Websocket(远程控制、实时数据要用,必须有)
    location ~* ^/api/v1/ws/(server|terminal|file)(.*){
        proxy_set_header Connection "upgrade";
        proxy_set_header Upgradehttp_upgrade;
        proxy_pass http://dashboard;
    }

    # 网页访问(打开面板的页面要用)
    location / {
        proxy_set_header Host $host;
        proxy_pass http://dashboard;
    }
}

文件路径:/vol1/1000/Docker/nezha/data/config.yaml

debug: false
language: zh-CN
site:
    brand: 哪吒监控面板
httpport: 8008
grpcport: 8008
grpchost: nezha-dashboard
tls: false
location: Asia/Shanghai

🔐 默认账号密码:admin/admin

# 启动容器
cd /vol1/1000/Docker/nezha
docker-compose pull
docker-compose up -d
docker-compose ps

两个容器都为 Up 即成功。

Cloudflar操作

注意:

Cloudflare 默认 不启用 HTTP/2,哪吒 Agent 的 gRPC 会失败。必须在 cloudflared 的 systemd 服务里添加:

--protocol http2

Cloudflare 隧道的安装非常简单这里就不讲了,主要讲解Cloudflared 服务配置。

文件路径(大多数系统):

/etc/systemd/system/cloudflared.service

打开:

sudo vim /etc/systemd/system/cloudflared.service

按「i」进入编辑模式,删除文件里原来的内容,粘贴下面的示例配置(注意改「<你的 CloudflareTunnelToken>」为你刚才复制的 Token):

[Unit]
Description=cloudflared 隧道服务(哪吒监控用)
After=network-online.target  # 网络通了之后再启动
Wants=network-online.target

[Service]
TimeoutStartSec=0  # 取消启动超时(避免网络慢导致启动失败)
Type=notify
# 核心命令:启动隧道,开启 HTTP/2,用 Token 登录(不用其他配置文件)
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --protocol http2 --token <你的CloudflareTunnelToken>
Restart=on-failure  # 隧道失败时自动重启
RestartSec=5s  # 5 秒后重启

[Install]
WantedBy=multi-user.target  # 多用户模式下启动

无注释版本:

[Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --protocol http2 --token <你的CloudflareTunnelToken>
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

修改 systemd 后必须执行:

sudo systemctl daemon-reload
sudo systemctl restart cloudflared
sudo systemctl status cloudflared

看到:Active: active (running) 即代表隧道正常。

面板设置

Agent对接地址【域名/IP:端口】填写应当与穿透的网址一致,直接填:scendr.de5.net:443

  • 解释:
    • 域名:scendr.de5.net(你提供的 CF 绑定域名,不用加 https:// 或后面的 /dashboard/settings 路径!)
    • 端口:443(HTTPS/TLS 的默认端口,Cloudflare 隧道自动映射,不用填 5501!)

局域网对接(仅同一 WiFi 下用)

填:NAS局域网IP:5501(比如 192.168.5.134:5501) 适合:公网出问题时临时对接,不用 TLS(局域网安全)