免费部署哪吒探针(cloudflare+Github+Koyeb部署)

## 免费部署哪吒探针(cloudflare+Github+Koyeb部署)

先贴下效果
PixPin 2024 06 08 01 04 08![PixPin 2024 06 08 01 04 08](https://s.rmimg.com/2024/06/08/4fa0603f4ee34529ac074af7d530ecee.png)

使用的大佬项目:https://github.com/fscarmen2/Argo-Nezha-Service-Container

前提条件:一个托管了域名的cloudflare账号、一个Github账号,一个Koyeb账号,如果不具备请自行搜索注册

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

github上教程很详细了,一步步跟着走就行,提下需要注意的几个点

1、Koyeb重新部署数据前确定github的仓库中是否更新了数据文件,如果没有,需要进入Koyeb的console面板中手动进行数据备份,也就是执行`backup.sh`脚本

2、重新部署后,如果没有恢复数据,需手动进行数据恢复,执行`restore.sh`脚本

3、github教程中的`完美搬家`我目前没成功过,貌似是因为Koyeb部署后的文件结构不一致,有懂的佬可以说下

最后就是美化代码了,贴下作者的博客地址:https://blog.amzayo.com/archives/na-zha-tan-zhen-mei-hua,可以只使用自定义代码,无需上传`template`文件(可能效果有所缺失?),代码如下,也可以自行下载,压缩包中都有!

```html
<script>
// 动画
window.onload = function () {
$(‘.nb-menu’).css(‘visibility’, ‘visible’);
$(‘.footer’).css(‘visibility’, ‘visible’);
$(‘.nb-menu .right.menu,.nb-menu .item’)
.transition({
animation: ‘fade down in’,
interval: 200,
});
$(‘.footer .container b,.footer .container small’)
.transition({
animation: ‘fade up in’,
interval: 200,
});
$(‘.accordion,.cards .card,table,.table tr,.service-status h2’)
.transition({
animation: ‘scale in’,
interval: 150
});
}
</script>
<style>
:root {
/*
–popup-filter: blur(2px);
–lc-color-light: rgba(235, 235, 235, 0.8);
–bc-color-light: rgba(235, 235, 235, 0.4);
–the-color-light: rgba(235, 235, 235, 0.6);
–he-color-light: rgba(235, 235, 235, 0.8);
–message-color-light: rgb(22, 22, 22, 1);
–popup-color-light:rgba(235, 235, 235, 0.6);

    --bc-color-dark: rgba(0, 0, 0, 0.4);
    --lc-color-dark: rgba(55, 55, 55, 0.8);
    --the-color-dark: rgba(35, 35, 35, 0.3);
    --he-color-dark: rgba(35, 35, 35, 0.8);
    --message-color-dark: rgb(235, 235, 235, 0.8);
    --popup-color-dark:rgba(78, 78, 78, 0.6);

*/

    /* 注释上面一段颜色代码并取消下面注释的代码开启毛玻璃效果(图形性能开销巨大,可能导致掉帧) */

    --popup-filter: blur(10px);
    --bb: blur(15px) brightness(110%);
    --lc-color-light: rgba(255, 255, 255, 0.7);
    --bc-color-light: rgba(255, 255, 255, 0.1);
    --the-color-light: rgba(255, 255, 255, 0.4);
    --he-color-light: rgba(255, 255, 255, 0.5);
    --message-color-light: rgb(22, 22, 22, 1); 
    --popup-color-light:rgba(235, 235, 235, 0.6);

    --bc-color-dark: rgba(0, 0, 0, 0.3);
    --lc-color-dark: rgba(55, 55, 55, 0.8);
    --the-color-dark: rgba(70, 70, 70, 0.1);
    --he-color-dark: rgba(35, 35, 35, 0.7);
    --message-color-dark: rgb(235, 235, 235, 0.8);
    --popup-color-dark:rgba(78, 78, 78, 0.6);
    
}

/* 暗色模式适配 */
@media (prefers-color-scheme: dark) {
    *:not(.icon, i) {
        color: rgba(220, 220, 220, 0.95) !important;
    }

    .ui.menu .ui.dropdown .menu&gt;.item {
        color: rgba(220, 220, 220, 0.95) !important;
    }


    .ui .cards&gt;.card {
        background-color: var(--lc-color-dark) !important;
        border-color: var(--lc-color-dark) !important;
    }

    .ui .cards&gt;.card i:not(.flag) {
        filter: saturate(60%) !important;
    }


    .ui.table thead th,
    .ui.table thead {
        background-color: var(--the-color-dark) !important;
    }

    .ui.table {
        background-color: none !important;
    }

    .ui.large.menu,
    .right.menu .menu,
    .service-status h2,
    .footer,
    .floating.message.warning,
    .floating.message.success {
        background-color: var(--he-color-dark) !important;
    }

    .floating.message.warning,
    .floating.message.success {
        color: var(--message-color-dark) !important;
    }

    #app .ui.fluid.accordion,
    .table {
        background-color: var(--bc-color-dark) !important;
    }

    .ui.content.popup {
        background-color: var(--popup-color-dark) !important;
    }
    .ui.content.popup:before{
        background-color: var(--popup-color-dark) !important;
    }

    .ui.progress small,
    td:not(.button):not(.bar):not(:has(.button, .bar)):not(:has(&gt; small)) {
        filter: brightness(115%);
    }

    .ui.progress .bar,
    .nb-container .ui.icon.button,
    .service-status .delay-today&gt;i {
        filter: brightness(85%);
    }

    .ui.button:hover {
        filter: brightness(100%) !important;
    }

    .ui.popup:before {
        background-color: var(--popup-color-dark) !important;
        box-shadow: 0px 0px 0 0 #ffffff !important;
    }

    .amzayo-custom-button {
        background-color: #4d4d4d8f !important;
        color: rgba(178, 178, 178, 0.95) !important;
        border: 2px solid #292929ae !important;
    }

    .amzayo-custom-button:hover {
        background-color: #ff8457 !important;
        color: #ffffffbd !important;
        font-weight: bolder !important;
    }

    i.amzayo-secondary-font {
        color: #727272ae !important;
    }

    .ui.popup {
        background-color: rgba(78, 78, 78, 1) !important;
    }

    .ui.menu .item:before {
        background: rgba(125, 125, 125, 0.15);
    }

    .ui.menu .active.item {
        background: rgba(10, 10, 10, 0.2);
    }

    .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)&gt;.container&gt;.item:not(.right):not(.borderless):first-child {
        border-left: 1px solid rgba(125, 125, 125, 0.15);
    }
}

/* 屏幕适配 */

@media (min-width: 320px) {
    .ui-alerts.top-center {
        margin-left: 0px !important;
        left: 50%;
        transform: translate(-50%, -0%);
    }
}

@media (min-width: 766px) {
    .ui.container {
        width: 80%;
    }

    /* 表格样式 */
    .ui.table thead th {
        backdrop-filter:var(--bb);
        background-color: var(--the-color-light);
    }

    thead tr :first-child {
        border-radius: 1rem 0 0 1rem !important;
    }

    thead tr :last-child {
        border-radius: 0 1rem 1rem 0 !important;
    }

    /* 小卡片 */
    .ui .cards&gt;.card {
        border-radius: 1rem;
        border: none !important;
        background-color: var(--lc-color-light);
        padding: .25rem .25rem !important;
        margin: .5rem .3rem !important;
        visibility: hidden;
    }

    /* 小卡片头部调整 */
    .ui.card&gt;.content&gt;.header,
    .ui.cards&gt;.card&gt;.content&gt;.header {
        padding-top: 0;
        display: flex;
        color: rgba(0, 0, 0, .85);
        align-items: center;
        padding-bottom: .2em;
        border-bottom: 1px solid rgba(0, 0, 0, .2);
    }

    .header_info {
        font-size: 1rem !important;
        line-height: 1rem !important;
        margin-top: .3rem !important;
        padding-right: .38rem !important;
    }
}

@media (max-width: 766px) {

    /* 表格样式 */
    .ui.table thead {
        backdrop-filter:var(--bb);
        background-color: var(--the-color-light);
    }

    thead {
        border-radius: 1rem !important;
    }

    thead tr {
        padding: 0 !important;
    }

    /* 小卡片 */
    .ui .cards&gt;.card {
        border-radius: 1rem;
        background-color: var(--lc-color-light);
        outline: none !important;
        visibility: hidden;
    }

    /* 小卡片头部调整 */
    .ui.card&gt;.content&gt;.header,
    .ui.cards&gt;.card&gt;.content&gt;.header {
        padding-top: 0.5rem;
        display: flex;
        color: rgba(0, 0, 0, .85);
        align-items: center;
        padding-bottom: .2em;
        border-bottom: 1px solid rgba(0, 0, 0, .2);
    }

    .header_info {
        font-size: 1rem !important;
        line-height: 1rem !important;
        padding-top: -.1rem !important;
        padding-right: .38rem !important;
    }
}

/* 自定义字体 */
@font-face {
    font-family: 'Harmony Hans';
    src: url(https://cdn.amzayo.top/static/fonts/HarmonyOSHans-Medium.woff2) format('woff2');
}

* {
    font-family: 'Harmony Hans';
}

*:not(.content) {
    transition: all .2s;
}

/* 背景图片 */
body::before {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: -1;
    background: url(https://cdn.amzayo.top/static/public/luban/Luban_time_tour_poster.webp) center/cover no-repeat;
}

/* 初始隐藏元素,用于动画效果,关闭动画效果请删除 */
.nb-menu,
.nb-menu .right.menu,
.nb-menu .item,
.accordion,
.footer,
.footer .container b,
.footer .container small,
.table,
.table tr,
.service-status h2 {
    visibility: hidden;
}

/* 菜单颜色 */
.ui.large.menu {
    backdrop-filter:var(--bb);
    background-color: var(--he-color-light);
    border-radius: 0 0 1rem 1rem !important;
}

.ui.menu .item:last-child {
    padding: 0 1.142em !important;
}

/* 登录按钮区域 */
.ui.simple.dropdown {
    height: 100%;
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: center;
}

/* 登录之后的下拉菜单 */
.right.menu .menu {
    border-radius: 0 0 1rem 1rem !important;
    position: absolute;
    top: 0 !important;
    background-color: var(--he-color-light);
    padding: 0 0.3em !important;
}

/* 登录按钮颜色(需要使用配套自定义主题) */
.amzayo-custom-button {
    backdrop-filter:var(--bb);
    background-color: #ffffff8f;
    color: #000000cf;
    border: 2px solid #ebe1d9;
    border-radius: 1rem;
    padding: 10px 20px;
    font-size: 16px;
}

.amzayo-custom-button:hover {
    background-color: #ff8457;
    color: #ffffffbd;
    font-weight: bolder;
}

/* 大卡片 */
#app .ui.fluid.accordion {
    backdrop-filter:var(--bb);
    background-color: var(--bc-color-light);
    border-radius: 1rem;
}

#app :last-child.accordion {
    margin-bottom: 0 !important;
}

/* 小卡片靠哪个方向对齐 */
.cards {
    justify-content: center;
}

.ui.card,
.ui.cards&gt;.card {
    box-shadow: none !important;
}

/* 取消下方注释调整下面的数字以调整卡片宽度(非移动端页面,移动端页面让它自适应吧) */
.ui.card,
.ui.cards&gt;.card {
    width: 300px !important;
}

/* 小卡片右上角的图标 */

i.amzayo-secondary-font {
    margin-left: auto;
    color: rgba(255, 153, 1, 0.65);
}

/* 头部配置信息样式 */
.header_info i {
    margin-top: .25rem;
    margin-right: .3rem;
    margin-left: .3rem;
}

/* 更多信息卡片 */
.ui.content.popup {
    backdrop-filter:var(--popup-filter);
    border: none !important;
    border-radius: 1rem;
    margin: 0;
    padding: 1em !important;
    background-color: var(--popup-color-light);
    width: max-content;
    height: max-content;
}

.ui.popup {
    border: none !important;
}

/* 小三角 */
.ui.content.popup:before {
    background-color: var(--popup-color-light);
    z-index: 9999 !important;
    border: none !important;
    box-shadow: 0px 0px 0 0 #ffffff !important;
}

.ui.bottom.popup:before {
    clip-path: polygon(0 0, 100% 0, 50% 50%, 0 100%);
}

.ui.top.popup:before {
    clip-path: polygon(100% 100%, 0% 100%, 100% 0);
}

/* 进度条圆角和颜色 */
.ui.progress {
    border-radius: 50rem;
    height: 1.5rem;
}

/* 卡片内间距,如需调整小卡片高度,可以修改下面的2rem的数字 */
.status.cards .wide.column {
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    height: 4rem !important;
}

.bi::before,
[class^="bi-"]::before,
[class*=" bi-"]::before {
    vertical-align: middle;
    margin-bottom: .2rem;
}

/* 状态进度条 */
.card .bar {
    height: 1.5rem;
}

.card .bar small {
    vertical-align: super;
    line-height: 1.5rem;
}

.card .ui.progress .bar {
    min-width: 1.8em !important;
    border-radius: 13px;
    line-height: 1.65em;
    height: 1.5rem;
}

table .ui.progress .bar {
    border-radius: 13px;
}

/* 正常状态进度条颜色 */
.nb-container .ui.progress.fine .bar {
    background-image: linear-gradient(to right, rgba(125, 252, 0, 0.6), rgba(50, 205, 50, 0.6));
}

/*有点累状态进度条颜色 */
.nb-container .ui.progress.warning .bar {
    background-image: linear-gradient(to right, rgba(255, 215, 0, 0.6), rgba(255, 125, 80, 0.6));
}

/*高负载状态进度条颜色 */
.nb-container .ui.progress.error .bar {
    background-image: linear-gradient(to right, rgba(255, 160, 120, 0.6), rgba(255, 70, 0, 0.6));
}

/* 离线状态进度条颜色 */
.ui.progress.offline .bar {
    background-color: #000;
}

/* 上传下载图标颜色 */
i.arrow.alternate.circle.down.outline.icon {
    color: rgb(0, 157, 255);
}

i.arrow.alternate.circle.up.outline.icon {
    color: #ff0000;
}

/*服务状态*/
.nb-container .service-status .good {
    background: rgba(50, 205, 50, 0.75);
}

.nb-container .service-status .warning {
    background: rgba(250, 155, 40, 0.75);
}

.nb-container .service-status .danger {
    background: rgba(255, 35, 0, 0.75);
}

/* 服务页面大表格背景 */
.table {
    backdrop-filter:var(--bb);
    background-color: var(--bc-color-light);
    border-radius: 1rem !important;
}

.ui.table {
    background-color: var(--bc-color-light);
}

.ui.button:not(.good):not(.warning):not(.danger):hover {
    background: #e0e1e2 none;
}

.ui.button:hover {
    filter: brightness(0.9);
}

.service-status .delay-today {
    vertical-align: sub;
}

/* 循环流量统计标题 */
.service-status h2 {
    backdrop-filter:var(--bb);
    background-color: var(--he-color-light);
    border-radius: 1rem !important;
    margin: 0 !important;
}

/*底部*/
.footer {
    backdrop-filter:var(--bb);
    background-color: var(--he-color-light);
    position: fixed !important;
    bottom: 0 !important;
    left: 0 !important;
    right: 0 !important;
    border-radius: 1rem 1rem 0 0 !important;
}

.ui.inverted.segment,
.ui.primary.inverted.segment {
    background-color: var(--he-color-light);
}

.footer .container,
.footer .container a {
    color: var(--message-color-light);
}

.footer .container a:hover {
    color: #ff8457 !important;
}

/* 提示消息 */
.floating.message.success {
    backdrop-filter: blur(15px) brightness(110%);
    background-color: var(--he-color-light);
    border: 3px solid rgba(255.255.255.0.5);
    border-radius: 1rem !important;
    color: var(--message-color-light);
    box-shadow: 0 0 15px rgba(1, 132, 255, 0.65);
}

.floating.message.success .header {
    color: var(--message-color-light);
}

.floating.message.warning {
    backdrop-filter: blur(15px) brightness(110%);
    background-color: var(--he-color-light);
    border: 1px solid rgba(255.255.255.0.5);
    border-radius: 1rem !important;
    color: var(--message-color-light);
    box-shadow: 0 0 15px rgba(255, 153, 1, 0.65);
}

.floating.message.warning .header {
    color: var(--message-color-light);
}

.cpucontent {
    display: inline-block;
}

.rollanimation {
    animation: scroll 10s cubic-bezier(.2, 0, .8, 1) infinite;
}

@keyframes scroll {

    0% {
        transform: translateX(0%);
    }

    30% {
        transform: translateX(0%);
    }

    100% {
        transform: translateX(-100%);
    }

}


/*

以下样式为部分原版主题样式,由于原版主题样式有些强制性,不方便二次修改,故拿出来

*/

.ui.mini.message {
    width: 17rem;
}

.ui-alerts {
    padding: 23px 0 !important;
}

td {
    word-wrap: break-word;
    word-break: break-all;
}

.nb-container {
    padding-top: 75px;
    min-height: 100vh;
    padding-bottom: 65px;
    margin-bottom: -47px;
}

#app .ui.fluid.accordion {
    margin-bottom: 1rem;
}

.login.nb-container {
    display: flex;
    align-items: center;
    padding-top: unset;
}

.login.nb-container&gt;.grid {
    width: 100%;
    margin: 0 auto;
}

.login.nb-container&gt;.grid .column {
    max-width: 450px;
}

.status.cards .flag {
    margin-right: 0 !important;
}

.status.cards .header&gt;.info.icon {
    float: right;
    margin-right: 0;
}

.status.cards .wide.column {
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    height: 2rem !important;
}

.status.cards .three.wide.column {
    padding-right: 0 !important;
}

.status.cards .wide.column:nth-child(1) {
    margin-top: 1rem !important;
}

.status.cards .wide.column:nth-child(2) {
    margin-top: 1rem !important;
}

.status.cards .description {
    padding-bottom: 1rem !important;
}

.status.cards .ui.content.popup {
    min-width: 250px;
}

.status.cards .outline.icon {
    margin-right: 0 !important;
}

.ui.progress .bar {
    min-width: 1.26em !important;
    text-align: right;
    padding-right: 0.4em;
    line-height: 1.75em;
    color: rgba(255, 255, 255, 0.7);
    font-weight: 700;
    max-width: 100% !important;
}

.service-status .delay-today {
    display: flex;
    align-items: center;
}

.service-status .delay-today&gt;i {
    display: inline-block;
    width: 1.2em;
    height: 1.2em;
    border-radius: 0.6em;
    background-color: grey;
    margin-right: 0.3em;
}

</style>

```

这个才是项目地址: https://github.com/fscarmen2/Argo-Nezha-Service-Container

>

1、Koyeb 重新部署数据前确定 github 的仓库中是否更新了数据文件,如果没有,需要进入 Koyeb 的 console 面板中手动进行数据备份,也就是执行 backup.sh 脚本

即使不手动,每天凌晨4点也会备份的。建议可先少量加数据,等自动备份生效,第二天再大量加数据,这样较稳妥,主要是怕有的变量值设置错或者漏,导致自动备份不成功,就浪费了大量时间去设置各小鸡了。

>

2、重新部署后,如果没有恢复数据,需手动进行数据恢复,执行 restore.sh 脚本

不用手动恢复的,crontab 有个检测机制,每分钟自动检测一次的,发现需要还原就自动处理了。

>

3、github 教程中的完美搬家我目前没成功过,貌似是因为 Koyeb 部署后的文件结构不一致,有懂的佬可以说下

这个不用刻意的,像我之前部署在 koyeb ,有了备份数据,再搬到 https://app.northflank.com 也是所有数据及自定义主题自动还原,不需要人工干预。

@“fscarmen”#p35683 到底哪个是真的,一个用户名多了一个2,就怕李鬼加料。

@“James”#p35687

你看哪个 fork 哪个就知道了。

@“fscarmen”#p35689 看了下用户名,你不会就是作者本人吧?:huaji09:

不错,收藏

@“fscarmen”#p35683 学到了:+1::+1::+1:

@“fscarmen”#p35683


>

这个才是项目地址: https://github.com/fscarmen2/Argo-Nezha-Service-Container

我看koyeb部署的容器镜像是docker.io/fscarmen/argo-nezha,没注意fork,以为https://github.com/fscarmen/Argo-Nezha-Service-Container是原作了

这个部署过就是koyeb老是重启重置很烦不是很稳的,可是还是得感谢一下作者 @“fscarmen”#p35683 这个项目帮助了很多:xhj03:

@“fscarmen”#p35683 F佬?

@“金子会发光”#p35822 koyeb还算稳定的哦,很多用户部署在该平台的。同时项目有 vps 的 docker 版本还有非docker版本,如果在 vps 是 nat 鸡或者 IPv6 only 的,就特殊适合了。

这个探针需要agent的吧,资源占用多不多

@“zhuli8”#p35988 容器版本,会下载最新版本的 agent ,用于默认的第一个服务器 — ”Local 本地“;而 VPS 版本的没有。

资源占用方面,一般,128MB内存+0.1 u都可以应付。

image.png![image.png](https://img.imgdd.com/f210f3.8920ab9e-f1a2-44b8-b363-8616cb84fd8b.png)

F佬确实6

@“fscarmen”#p36023 agent占用128内存?那么多

@“zhuli8”#p36037 他是说128MB 内存 + 0.1 u 都可以应付

@“金子会发光”#p36086 那还好。