Skip to content

Nezha server over Argo tunnel 使用 Argo 隧道的哪吒服务端

Notifications You must be signed in to change notification settings

fscarmen2/Argo-Nezha-Service-Container

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Argo-Nezha-Service-Container

使用 Argo 隧道的哪吒服务端

Documentation: English version | 中文版


目录


项目特点:

  • 适用范围更广 --- 只要能连通网络,就能安装哪吒服务端,如 LXC, OpenVZ VPS,Nas 虚拟机 , Container PaaS 等
  • Argo 隧道突破需要公网入口的限制 --- 传统的哪吒需要有两个公网端口,一个用于面板的访问,另一个用于客户端上报数据,本项目借用 Cloudflare Argo 隧道,使用内网穿透的办法
  • IPv4 / v6 具备更高的灵活性 --- 传统哪吒需要处理服务端和客户端的 IPv4/v6 兼容性问题,还需要通过 warp 等工具来解决不对应的情况。然而,本项目可以完全不需要考虑这些问题,可以任意对接,更加方便和简便
  • 一条 Argo 隧道分流多个域名和协议 --- 建立一条内网穿透的 Argo 隧道,即可分流三个域名(hostname)和协议(protocal),分别用于面板的访问(http),客户端上报数据(tcp)和 ssh(可选)
  • Grpc 反向代理的 gRPC 数据端口 --- 配上证书做 tls 终结,然后 Argo 的隧道配置用 https 服务指向这个反向代理,启用http2回源,grpc(nezha)->Grpc Proxy->h2(argo)->cf cdn edge->agent
  • 每天自动备份 --- 数据持久化从本地改为线上,北京时间每天 4 时 0 分自动备份整个哪吒面板文件夹到指定的 github 私库,包括面板主题,面板设置,探针数据和隧道信息,备份保留近 5 天数据;鉴于内容十分重要,必须要放在私库
  • 每天自动更新面板和更新脚本 -- 北京时间每天 4 时 0 分自动检测最新的官方面板版本及备份还原脚本,有升级时自动更新
  • 每天自动优化 SQLite 数据库 --- 北京时间每天 4 时 0 分自动使用 sqlite3 "sqlite.db" 'VACUUM;' 优化瘦身数据库
  • 手/自一体还原备份 --- 每分钟检测一次在线还原文件的内容,遇到有更新立刻还原
  • 默认内置本机探针 --- 能很方便的监控自身服务器信息
image

准备需要用的变量

  • 到 Cloudflare 官网,选择使用的域名,打开 网络 选项将 gRPC 开关打开

image

面板域名加上 https:// 开头,回调地址再加上 /oauth2/callback 结尾

image

image

image

image

image

Argo 认证的获取方式: json 或 token

Argo 隧道认证方式有 json 和 token,使用两个方式其中之一。推荐前者,理由脚本会处理好所有的 Argo 隧道参数和路径,后者需要到 Cloudflare 官网手动设置,容易出错。

(方式 1 - Json):

通过 Cloudflare Json 生成网轻松获取 Argo 隧道 json 信息: https://fscarmen.cloudflare.now.cc

image

(方式 2 - Token): 通过 Cloudflare 官网,手动生成 Argo 隧道 token 信息

  • 进入 zero trust 里生成 token 隧道和信息。
  • 其中数据路径 443/https 为 proto.NezhaService
  • ssh 路径 22/ssh 为 < client id >
image image image image image image image

PaaS 部署实例

镜像 fscarmen/argo-nezha:latest , 支持 amd64 和 arm64 架构

用到的变量

变量名 是否必须 备注
GH_USER github 的用户名,用于面板管理授权
GH_CLIENTID 在 github 上申请
GH_CLIENTSECRET 在 github 上申请
GH_BACKUP_USER 在 github 上备份哪吒服务端数据库的 github 用户名,不填则与面板管理授权的账户 GH_USER 一致
GH_REPO 在 github 上备份哪吒服务端数据库文件的 github 库
GH_EMAIL github 的邮箱,用于备份的 git 推送到远程库
GH_PAT github 的 PAT
REVERSE_PROXY_MODE 默认使用 Caddy 应用来反代,这时可以不填写该变量;如需 Nginx 或 gRPCwebProxy 反代,请设置该值为 nginx grpcwebproxy
ARGO_AUTH Json: 从 https://fscarmen.cloudflare.now.cc 获取的 Argo Json
Token: 从 Cloudflare 官网获取
ARGO_DOMAIN Argo 域名
NO_AUTO_RENEW 默认不需要该变量,即每天定时同步在线最新的备份和还原脚本。如不需要该功能,设置此变量,并赋值为 1
DASHBOARD_VERSION 指定面板的版本,以 v0.00.00 的格式,后续将固定在该版本不会升级,不填则使用默认的 v0.20.13

Koyeb

Deploy to Koyeb

image

image

image

image

image

VPS 部署方式 1 --- docker

  • 注意: ARGO_DOMAIN= 后面需要有单引号,不能去掉
  • 如果 VPS 是 IPv6 only 的,请先安装 WARP IPv4 或者双栈: https://gitlab.com/fscarmen/warp
  • 备份目录为当前路径的 dashboard 文件夹

docker 部署

docker run -dit \
           --name nezha_dashboard \
           --pull always \
           --restart always \
           -e GH_USER=<填 github 用户名> \
           -e GH_EMAIL=<填 github 邮箱> \
           -e GH_PAT=<填获取的> \
           -e GH_REPO=<填自定义的> \
           -e GH_CLIENTID=<填获取的>  \
           -e GH_CLIENTSECRET=<填获取的> \
           -e ARGO_AUTH='<填获取的 Argo json 或者 token>' \
           -e ARGO_DOMAIN=<填自定义的> \
           -e GH_BACKUP_USER=<选填,选填,选填! 如与 GH_USER 一致,可以不要该环境变量> \
           -e REVERSE_PROXY_MODE=<选填,选填,选填! 如想用 Nginx 或 gRPCwebProxy 替代 Caddy 反代的话,请设置该变量并赋值为 `nginx` 或 `grpcwebproxy`> \
           -e NO_AUTO_RENEW=<选填,选填,选填! 如果不需要自动在线同步最新的 backup.sh 和 restore.sh,请设置该变量并赋值为 `1`> \
           -e DASHBOARD_VERSION=<选填,选填,选填! 指定面板的版本,以 `v0.00.00` 的格式,后续将固定在该版本不会升级,不填则使用默认的 `v0.20.13`> \
           fscarmen/argo-nezha

docker-compose 部署

networks:
    nezha-dashboard:
        name: nezha-dashboard
services:
    argo-nezha:
        image: fscarmen/argo-nezha
        pull_policy: always
        container_name: nezha_dashboard
        restart: always
        networks:
            - nezha-dashboard
        environment:
            - GH_USER=<填 github 用户名>
            - GH_EMAIL=<填 github 邮箱>
            - GH_PAT=<填获取的>
            - GH_REPO=<填自定义的>
            - GH_CLIENTID=<填获取的>
            - GH_CLIENTSECRET=<填获取的>
            - ARGO_AUTH=<填获取的 Argo json 或者 token>
            - ARGO_DOMAIN=<填自定义的>
            - GH_BACKUP_USER=<选填,选填,选填! 如与 GH_USER 一致,可以不要该环境变量>
            - REVERSE_PROXY_MODE=<选填,选填,选填! 如想用 Nginx 或 gRPCwebProxy 替代 Caddy 反代的话,请设置该变量并赋值为 `nginx` 或 `grpcwebproxy`>
            - NO_AUTO_RENEW=<选填,选填,选填! 如果不需要自动在线同步最新的 backup.sh 和 restore.sh,请设置该变量并赋值为 `1`>
            - DASHBOARD_VERSION=<选填,选填,选填! 指定面板的版本,以 `v0.00.00` 的格式,后续将固定在该版本不会升级,不填则使用默认的 `v0.20.13`>

VPS 部署方式 2 --- 宿主机

bash <(wget -qO- https://raw.githubusercontent.com/fscarmen2/Argo-Nezha-Service-Container/main/dashboard.sh)

客户端接入

通过gRPC传输,无需额外配置。使用面板给到的安装方式,举例

curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh install_agent nezha.seales.nom.za 443 eAxO9IF519fKFODlW0 --tls

SSH 接入

<file path>/cloudflared access ssh --hostname nezha.seales.nom.za/<GH_CLIENTID>
image image

image

手动备份数据

方法一: 把 Github 备份库里的 README.md 文件内容改为 backup

image

方法二: ssh 进去后,容器版本运行 /dashboard/backup.sh; 非容器版本运行 /opt/nezha/dashboard/backup.sh

手动更新备份和还原脚本

ssh 进去后,容器版本运行 /dashboard/renew.sh; 非容器版本运行 /opt/nezha/dashboard/renew.sh

自动还原备份

  • 把需要还原的文件名改到 github 备份库里的 README.md,定时服务会每分钟检测更新,并把上次同步的文件名记录在本地 /dbfile 处以与在线的文件内容作比对

下图为以还原文件名为 dashboard-2023-04-23-13:08:37.tar.gz 作示例

image

手动还原备份

  • ssh 进入容器后运行,github 备份库里的 tar.gz 文件名,格式: dashboard-2023-04-22-21:42:10.tar.gz
bash /dashboard/restore.sh <文件名>

image

完美搬家

  • 备份原哪吒的 /dashboard 文件夹,压缩备份为 dashboard.tar.gz 文件
tar czvf dashboard.tar.gz /dashboard
  • 下载文件并放入私库,这个私库名要与新哪吒 <GH_REPO> 完全一致,并把该库的 README.md 的内容编辑为 dashboard.tar.gz
  • 部署本项目新哪吒,完整填入变量即可。部署完成后,自动还原脚本会每分钟作检测,发现有新的内容即会自动还原,全程约 3 分钟

主体目录文件及说明

/dashboard/
|-- app                  # 哪吒面板主程序
|-- argo.json            # Argo 隧道 json 文件,记录着使用隧道的信息
|-- argo.yml             # Argo 隧道 yml 文件,用于在一同隧道下,根据不同域名来分流 web, gRPC 和 ssh 协议的作用
|-- backup.sh            # 备份数据脚本
|-- restore.sh           # 还原备份脚本
|-- renew.sh             # 在线更新备份和还原文件的脚本
|-- dbfile               # 记录最新的还原或备份文件名
|-- resource             # 面板主题、语言和旗帜等资料的文件夹
|-- data
|   |-- config.yaml      # 哪吒面板的配置,如 Github OAuth2 / gRPC 域名 / 端口 / 是否启用 TLS 等信息
|   `-- sqlite.db        # SQLite 数据库文件,记录着面板设置的所有 severs 和 cron 等信息
|-- entrypoint.sh        # 主脚本,容器运行后执行
|-- nezha.csr            # SSL/TLS 证书签名请求
|-- nezha.key            # SSL/TLS 证书的私钥信息
|-- nezha.pem            # SSL/TLS 证书文件
|-- cloudflared          # Cloudflare Argo 隧道主程序
|-- grpcwebproxy         # gRPC 反代主程序
|-- caddy                # Caddy 主程序
|-- Caddyfile            # Caddy 配置文件
`-- nezha-agent          # 哪吒客户端,用于监控本地 localhost

鸣谢下列作者的文章和项目:

免责声明:

  • 本程序仅供学习了解, 非盈利目的,请于下载后 24 小时内删除, 不得用作任何商业用途, 文字、数据及图片均有所属版权, 如转载须注明来源。
  • 使用本程序必循遵守部署免责声明。使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责。