准备不再用哪吒监控V1了,于是打算记录一下,免得日后需要。

本文以最安全的步骤为教程:

  • 关闭直连端口,使用域名进行访问,且开启CDN。

  • 被控端使用TLS的方式与主控进行通信。

  • 关闭被控端命令执行。

  • 关闭密码访问,使用github的oauth2认证。

本文内集成的美化教程:

  • 自定义页面背景图、logo、人物插图、字体、卡片样式。

  • 自定义展示服务器到期时间等各种备注信息。

其他集成:

  • Umami的访问统计

安装之前

官方文档

在安装之前,你需要满足如下要求:

拥有一台VPS(不要位于中国大陆)

拥有一个域名(可选,本文需要)

域名托管在cloudflare上,且开启小黄云(CDN)(可选,本文需要)

本文默认您已经安装1panel,若未安装请查看1panel官网文档

开始安装

使用官方一键脚本进行安装:

curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh

运行后选择使用docker安装

相关参数如下:

image.png

此处一切均可后期更改。不知道如何填写别着急。

关闭端口

来到1panel的容器管理处,编辑哪吒容器的配置:

将映射端口改为127.0.0.1:8008:8008

Lsky-Right_Upload

image.png

域名配置

将你准备好的域名在CF上添加一个A记录,指向安装哪吒监控面板的主控VPS,且开启小黄云(CDN)

Lsky-normal

来到SSL/TLS页面,将SSL/TLS加密改为完全

image.png

来到网络页面,开启gRPC与WebSockets

image.png

配置反代

前往1panel的网站页面,创建新的反向代理:

image.png

创建好之后,点进去,为其配置好SSL证书,如果没有配置证书,请在1panel面板申请证书。

image.png

记得开启禁止http访问

点击配置文件,将如下内容添加到其中:

upstream dashboard {
    keepalive 512; 
    server 127.0.0.1:8008; 
}

image.png

此处端口为你自己设置的映射端口,也就是127.0.0.1:任意端口

来到反向代理界面,选择已有的反向代理配置,点击源文

image.png

将源文全部删除,然后替换成以下内容:

location ^~ / {
    proxy_pass http://127.0.0.1:8008; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header nz-realip $http_cf_connecting_ip; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    proxy_read_timeout 3600s; 
    proxy_send_timeout 3600s; 
    proxy_buffer_size 128k; 
    proxy_buffers 4 128k; 
    proxy_busy_buffers_size 256k; 
    proxy_max_temp_file_size 0; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
    add_header Strict-Transport-Security "max-age=31536000"; 
}
underscores_in_headers on; 
set_real_ip_from 0.0.0.0/0; # CDN 回源 IP 地址段
real_ip_header CF-Connecting-IP; # CDN 私有 header,此处为 CloudFlare 默认
# gRPC 服务
location ^~ /proto.NezhaService/ {
    grpc_set_header Host $host; 
    grpc_set_header nz-realip $http_CF_Connecting_IP; 
    grpc_read_timeout 600s; 
    grpc_send_timeout 600s; 
    grpc_socket_keepalive on; 
    client_max_body_size 10m; 
    grpc_buffer_size 4m; 
    grpc_pass grpc://dashboard; 
}
# WebSocket 服务
location ~* ^/api/v1/ws/(server|terminal|file)(.*)$ {
    proxy_set_header Host $host; 
    proxy_set_header nz-realip $http_cf_connecting_ip; 
    proxy_set_header Origin https://$host; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_read_timeout 3600s; 
    proxy_send_timeout 3600s; 
    proxy_pass http://127.0.0.1:8008; 
}

image.png

配置被控端访问地址

访问域名,登录哪吒面板,建议先更改一下密码!!!来到系统设置页面,往下滑

image.png

填写连接地址,为你准备的域名:443 ,真实IP请求头填写CF-Connecting-IP

image.png

配置oauth2登录方式

让我们打开github的开发者页面,新建一个OAuth 应用

image.png

之后生成新的客户端秘钥,来到1panel的文件管理处,进入/opt/nezha/dashboard/data 文件夹中,打开config.yaml

在文件中添加如下内容:

oauth2:
  GitHub:
    client_id: 客户端ID
    client_secret: 客户端秘钥
    endpoint:
      auth_url: https://github.com/login/oauth/authorize
      token_url: https://github.com/login/oauth/access_token
    user_id_path: id
    user_info_url: https://api.github.com/user

image.png

保存后到容器页面,重启哪吒面板,之后回到哪吒面板的个人中心。

绑定oauth2账号,然后就可以关闭密码登录了。

注意!!!一定要先绑定,再关闭密码登录。

image.png

被控端安装

全部配置完成后,点击后台的一键安装命令,在需要监控的VPS上执行即可。

image.png

被控端关闭命令执行

点击已经上线的被控端的按钮

image.png

勾选禁止命令执行

image.png

或者进入被控端主机执行一键命令:

sed -i 's/disable_command_execute: false/disable_command_execute: true/' /opt/nezha/agent/config.yml && systemctl restart nezha-agent

被控端备注生成

使用哪吒备注生成器

image.png

将生成的json数据填写到公开备注处即可

image.png

image.png

效果如图所示:

image.png

美化代码

此处包含如下内容:

  • Umami的访问统计

  • 自定义页面背景图、logo、人物插图、字体、卡片样式。

因为在同一段代码中,所以请按照注释添加即可。

添加在后台自定义代码处

image.png

代码如下:

<script>
// 以下为umami统计代码,如不需要,删掉即可
try {

    const umamiTrackerScript = document.createElement('script');
    umamiTrackerScript.defer = true; 
    umamiTrackerScript.src = 'https://umami的script.js的URL'; //注意URL更改
    umamiTrackerScript.setAttribute('data-website-id', 'umami的ID参数'); //注意ID更改
    if (document.head) {
        document.head.appendChild(umamiTrackerScript);
    } else {
        document.body.appendChild(umamiTrackerScript);
    }
    console.log('Umami script dynamically added.'); 
} catch (e) {
    console.error('Error dynamically adding Umami script:', e);
}
// 以上为umami统计代码,如不需要,删掉即可
//以下为美化代码,如不需要,删掉即可
window.CustomBackgroundImage = "页面背景图URL"; /* 页面背景图 */
window.CustomLogo = "自定义LOGO的URL"; /* 自定义Logo */
window.ShowNetTransfer = "false"; /* 卡片显示上下行流量 */
window.DisableAnimatedMan = "true"; /* 关掉动画人物插图 */
window.CustomIllustration = 'https://img.028029.xyz/1734592545615.png'; /* 替换人物插图。如果需要关闭请把上面一行取消注释 */
window.CustomDesc = "自定义描述"; /* 自定义描述 */
window.FixedTopServerName = true; /* 固定顶部显示服务器名称 */
//以上为美化代码,如不需要,删掉即可
</script>
//以下为字体美化代码,如不需要,删掉即可
<style>
    /* 引入小米字体 */
    @import url('https://cdn-font.hyperos.mi.com/font/css?family=MiSans:400,500,600,700:Chinese_Simplify,Latin&display=swap');

    /* 设置页面字体 */
    * {
        font-family: 'MiSans', sans-serif !important; /* 设置所有元素使用小米字体 */
    }
    h1, h2, h3, h4, h5 {
        font-family: 'MiSans', sans-serif !important; /* 设置标题使用小米字体 */
        font-weight: 600; /* 标题使用粗体 */
    }
</style>
//以上为字体美化代码,如不需要,删掉即可

更多美化效果请善用搜索引擎,此处为个人常用代码。