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
Dec 18, 2023
Dec 18, 2024
Apr 4, 2024
Dec 18, 2024
Dec 18, 2024
Dec 17, 2024
Dec 17, 2024
Apr 24, 2023

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 小时内删除, 不得用作任何商业用途, 文字、数据及图片均有所属版权, 如转载须注明来源。
  • 使用本程序必循遵守部署免责声明。使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责。