你们要的反向 Server 酱来了

Muninn 16天前 13

前一段时间看到有人问有没有反向 Server 酱,我发现我也挺需要的,最近两个月就动手写了一个。

它能通过微信公众号控制你的服务器,但不是直接控制的,为了安全,是在云端存储了消息,等着服务器上的 Agent 去拉取。这样同时也有了内网穿透的能力。

这样,就可以在服务号里通过简单的消息让服务器执行重启服务之类的动作。
我甚至把它集成到了我的某些服务里当成了一个业务控制台,体验也不错。

当然它也有正向 Server 酱的通知功能。

项目文档在: https://letserver.run

Github: https://github.com/hack-fan/skadi

当作控制台的公众号:

qrcode

只写好了主要的功能和文档,其他的会根据大家的建议慢慢更新吧。

看 V 站看了很多年,每次有什么都先发这里,附带一个暗号吧,对着公众号说 v2ex 就可以增加两个 Agent 数量配额~

最新回复 (53)
  • styang 14天前
    引用 2
    看起来还可以
  • Sunyanzi 14天前
    引用 3
    玩了半天 ... 很有趣 ... 比 ServerChan 更简单实用 ... 希望能坚持下去 ...

    另外一些问题 ... 一是我同一个 job id 可以 fail 或 succeed 无数次 ... 这是有意设计为之的还是个 bug ..?

    我感觉可以加个 proceed 作为中间态 ... 一旦到 fail 或 succeed 感觉 job 就能删了 ... 不然留着有啥用 ..?

    另外 ... 两个消息通知接口 /agent/info 和 /agent/warning ... 显示的消息好像没区别 ... 那为啥分开咧 ..?
  • tcfenix 14天前
    引用 4
    老哥...你的.idea 冒出来了.,...处理一下
  • oldcai 14天前
    引用 5
    挺有意思,给我了一些启发。
  • 楼主 Muninn 14天前
    引用 6
    @tcfenix 现在.idea 就是需要同步的呀,里边是项目级别的配置,不需要同步的个别文件有忽略列表的。
  • enotx 14天前
    引用 7
    看上去很棒,马克一下回家试试
  • 楼主 Muninn 14天前
    引用 8
    @Sunyanzi 可以 fail 多次是个 bug,谢谢。

    历史 job 本来想提供 log 功能供回顾一下最近的。不过可以考虑默认删了,用户需要打开 log 再保留。

    info 和 warning 的模版不一样,默认颜色也不一样~ 一个是蓝色的一个是红色的
  • Sunyanzi 14天前
    引用 9
    @Muninn 其实微信的聊天窗口就是个简陋的 log ... 如果要做详细 ... 可以考虑比如只保留最近三个月 ...

    但保留归保留 ... 「已完成」的状态还是不能更改的 ... 如果对已完成的任务执行 fail / succeed 可返 405 ...

    同时强烈建议引入 proceed 态用于耗时操作的反馈 ... 否则现在只能调 /message/info 感觉不太对 ...

    至于 info 和 warning 是我的问题了 ... 我是老版本微信 ... 包括 message 在内三种模板显示都没区别 ...

    另发现的公号 bug ... plan 里面已有 agent 和最大 agent 数量显示颠倒了 ...

    以及「每分钟最多发起一次查询」这句话感觉也有哪里不太对 ... 一来实测并没有这个限制 ...

    二来这不是「最多」而是「必须」 ... 如果我不每分钟发起一次查询的话会离线的 ...

    说到这个 ... 离线则不吃任务这事儿也怪怪的 ... 如果是我我会设计成离线状态吃且仅吃一个任务 ...

    离线状态无未拉取任务正常提示等待拉取 ... 如果有未拉取任务则提示队列非空之类的 ... 不过这都是后话了 ...
  • guog 14天前
    引用 10
    @Muninn 里面有 IDE 的配置,一般都有个人习惯
  • eason1874 14天前
    引用 11
    不错。我也用企业微信+云函数+API 网关做了些简单的应用,可以在微信上查询和修改一些服务器配置。

    挺好用的,缓解流量焦虑症尤其有效。
  • 楼主 Muninn 14天前
    引用 12
    @Sunyanzi 谢谢反馈这么多。已完成的肯定不能更改的,这个会很快修复的。

    proceed 的状态在服务端看来就是取走的状态。耗时我来统计一下吧,会显示在成功失败的反馈中。

    plan 的文本确实错了~

    查询的 rate limit 因为是有 api 的怕有人自己写 Agent 的时候疯狂调用。 准备给普通版一分钟高级版做到三秒之类的。 但是我发现我会的 rate limit 是用 redis 实现的,而取 job 也只是一个 redis 操作,这时候 rate limit 消耗的资源不不 limit 还大…… 但是放在 web server 那一层又会误伤,所以还没想好。

    离线是否接受任务我再想想,这个只是设定问题。 有的任务也许发起的人就想现在执行,过一阵等在线了取走执行也许会出事。感觉还是不接受比较好。
  • wyf001912hp 14天前
    引用 13
    有可能和其他人共享某些 agent 的控制权限吗,看了下文档貌似没有提及相关功能
  • ashuai 14天前
    引用 14
    /plan
    你可以创建 0 个 Agent,已经创建 3 个
    /status
    您的所有 Agent: 无

    -。-
  • 楼主 Muninn 14天前
    引用 15
    @wyf001912hp 这个暂时不准备,后面会出一个用 企业微信 /dingding/飞书 /slack/team 任选的,那时候才支持共享之类的。 这个只准备给个人用~
  • ashuai 14天前
    引用 16
    @wyf001912hp 这个想法不错。但貌似会有商业化的 bug
    我邀来 10 个同事,每人 3 个,共 30 个,我们共享着玩 lol
  • Sunyanzi 14天前
    引用 17
    @Muninn 因为实际上同样的东西我好几年前就琢磨着要做来着 ... 但因为舍不得三百块一直就没做 ...

    所以这些设计其实一直在我脑子里 ... 我甚至考虑了有用户量之后疯狂推广告养自己的可能性一类的 ...

    跑题了 ... 关于 proceed 我想要实现的功能是针对一个任务可以推送多条文字消息 ... 和被取走还不太一样 ...

    现在如果我取了不做或压根不取会产生自动超时 ... 而 proceed 状态实际上就是 cancel 掉这个超时 ...

    说到底我想要实现的效果是可以不受模板消息六十分钟五条的限制给自己推送多条文本消息 ...

    和现在 bug 中的 fail / succeed 行为类似 ... 即如果我有一个已被拉取处理状态标记为 proceed 的任务 ...

    那么我在后续比较长一段时间里 ... 可以一直用同一个 job id 给自己发消息 ... 直到该任务标记完成为止 ...

    rate limit 这事情 ... 实际上是个「要不要为了可能存在的恶意用户增大所有人消耗」的问题 ...

    我觉得可以先不做 ... 如果真的有人不以测试为目的高并发压机器的话再说 ... 感觉上应该不会 ...

    至于离线任务 ... 现在的在线状态其实只能保证一分钟内 Agent 活过 ... 之后会不会取其实是不可控的 ...

    而且如果对任务的时效性没有要求 ... 我大可以把一分钟拉一次改成三分钟拉一次 ... 避免超时还降低机器压力 ...

    细想了想这种场景是存在的 ... 但如果要改的话涉及还挺多的 ... 对我而言不是刚需 ... 还是看你的计划啦 ...
  • xushanli 14天前
    引用 18
    Server 酱转型了吗
  • 楼主 Muninn 14天前
    引用 19
    @ashuai 哈哈 低级失误
  • 楼主 Muninn 14天前
    引用 20
    @Sunyanzi 持续发消息这个我理解你的意思了。

    微信限制收到一句话最多回复 5 条。现在及时反馈 /取走 /结果 用了三条。 其实只剩两条额度了。 我可以考虑怎么节约一下,然后再允许发两条中间状态。
  • Sunyanzi 14天前
    引用 21
    @Muninn 事实上不用节约的 ... 在我的测试里 ... 最多回复五条指的是「五条内容不一样的消息」 ...

    连续且内容相同的消息可以疯狂回复 ... 不受这个限制 ...

    再者说所有消息都有五条额度 ... 我可以随便发个不在命令列表里的消息 ... 接下来坐等收消息就好 ...

    其实不需要为了这个功能改动太多 ... 只需要一个可以产生消息且不将任务标记完成的动作就好 ...

    或者一个更简单的办法 ... 保留现在 bug 中的 fail / succeed 但改个消息内容改个名字 ... 就齐了 ...
  • 楼主 Muninn 14天前
    引用 22
    @Sunyanzi 应该是你测试的原因,我这报了不少错哈哈。我还真没硬尝试过微信文档中声明的限制,可如果一直发一样的消息又有什么意义呢?

    其实我本来准备做个计数,优先使用客服消息发,没有额度了再用模版消息的。但是因为格式不统一不好表达没做。

    下午我再加个利用客服消息回复的接口吧。
  • Sunyanzi 14天前
    引用 23
    @Muninn 啊哈报错可能是因为我完成了好多次一个已经超时的任务名字叫「第四条」 ...

    不过 API 表现上一切正常 ... 虽然确实已超时的任务不该可操作 ... 但我这边完全感知不到报错了 ...

    一直发同样的消息意义在于时间 ... 比如消息文字 1 代表某个定时任务启动 ... 然后我预期每五分钟收到个 1 ...

    消息的内容在这种时候其实不重要 ... 关键是在某个时间点上我只要收到消息就好 ... 这功能就拜托啦 ...
  • emmettwoo 14天前
    引用 24
    挺有意思的,已经在体验了。
    另外,觉得 [快速开始] 的教程可以写得更直观易懂。
  • 楼主 Muninn 14天前
    引用 25
    @emmettwoo 谢谢 我会努力的……毕竟传说中程序员都不擅长写文档

    还有很多文档没写 这几天一直在抽空写文档
  • ysicing 14天前
    引用 26
    期待文档嘿嘿
  • lswlray 14天前
    引用 27
    @Muninn 团队是在西安吗?有兴趣认识一下
  • xia0chun 14天前
    引用 28
    是穿越了吗?
    文档页面的最后修订时间是 2021 年 5 月 4 日
  • 楼主 Muninn 14天前
    引用 29
    @lswlray 这是个人项目 木有团队 当然我确实是西安的……
  • 楼主 Muninn 14天前
    引用 30
    @xia0chun 哇,你好细心。 真是很诡异呢。 我怀疑 github 的 ci 服务器表不对? 或者就是 hugo 的问题了。coding.net 的问题可能性更大。 我去看看有没有构建日志。
  • 楼主 Muninn 14天前
    引用 31
    @xia0chun 好吧 冤枉他们了。是我的锅。我竟然粗心的把 golang 本地化字符串格式写错了……
  • NewYear 14天前
    引用 32
    目测不支持 Windows……
  • 楼主 Muninn 14天前
    引用 33
    @NewYear 理论支持的

    但是说实话还没想好在 windows 能干什么,我也没试过用 golang 能不能唤起 GUI 应用,所以在 release 里就没发布 windows 的。

    其实只是几个 HTTP API 文档这两天很快就出来了…… 完了看着 api 自己随便用什么语言都能调用的。
  • MrWhite 14天前
    引用 34
    @Sunyanzi 因为实际上同样的东西我好几年前就琢磨着要做来着 ... 但因为舍不得三百块一直就没做 ...

    我有个认证的公众号。一直在吃灰,如果需要的话我可以提供开发测试用哈。。
  • 楼主 Muninn 14天前
    引用 35
    @MrWhite 哈哈 开发测试不要认证的呢

    而且这个是每年 300 还不是一次 300……吃灰一阵子就过期了 不像树莓派可以一直吃

    想要和小程序联动,还要注册开放平台,那个是一次性 300.
  • wpyfawkes 14天前
    引用 36
    名字来源是那个六星战神斯卡蒂么
  • 楼主 Muninn 14天前
    引用 37
    @wpyfawkes 是的 征集蒂蒂+gopher 的图~ 将来有钱了找人去画一个
  • NewYear 14天前
    引用 38
    @Muninn

    确实很多语言随便写写就出来了……但是懒啊,哈哈哈哈……
    发送个命令行啊,重启电脑啊,关机电脑啊,发送一段 vbs 啊还是非常有用的。。。
  • 楼主 Muninn 14天前
    引用 39
    @NewYear 好的后面会考虑 windows 和 Mac 的。

    我本来一开始做了 Mac 的,结果发现 MacOS 最新的版本里,连命令行程序都要用花钱的开发者账号签名。 我没有苹果开发者账号诶。Windows 做一个自启动服务应该挺简单的,确实可以用来看是否开机,然后关机,哈哈。
  • Sunyanzi 14天前
    引用 40
    @MrWhite 好意确实的收到啦 ... 大感谢 ... 但现在已经有楼主珠玉在前 ... 感觉没必要重造个轮子啦 ...

    @NewYear Windows 确认可以 ... 我也没用楼主的 skadi 系列 Service 而是自己实现了一个 client ...

    实际上截止到目前为止就是六个 HTTP API 调用 ... GET POST PUT 各两个 ... 只要能 cURL 就能用 ...
  • sicflre 14天前
    引用 41
    虽然已经改行两年 但是看到这样和谐友好的交流氛围 属实让人动容 加油
  • fatelight 14天前
    引用 42
    其实 telegram 更方便,二次开发,bot 控制,轮子也多,扩展性足够
  • 楼主 Muninn 14天前
    引用 43
    @fatelight 几乎所有的 IM 都比微信开发起来方便呢 奈何微信有着人手一个不需要额外安装的优势。 后面会有一个版本支持其他的 IM 。
  • telami 14天前
    引用 44
    有趣
  • 楼主 Muninn 14天前
    引用 45
    刚有同学触发了一个 bug,在添加 Agent 的时候,名字和别名都不能重复。发命令的时候用名字和别名都可以的。

    但是我忘了翻译这个错误返回提示了,重复了会收到系统错误。

    等稍后把 API 文档写完发布出来再修吧。
  • cheung 14天前
    引用 46
    我竟然有个 server.run 域名!
  • 楼主 Muninn 14天前
    引用 47
    @cheung 哇 这么厉害啊…… 我有个 server.fan 准备英文版用这个。
  • zhshch 14天前
    引用 48
    这个……之前找反向 server 酱的人可能是我
  • 楼主 Muninn 14天前
    引用 49
    @zhshch 哈哈 感谢感谢 给了我做出来的动力 希望多提建议
  • easychen 14天前
    引用 50
    这项目挺有意思。

    其实 server 酱是支持语音上行的,http://sc.ftqq.com/5.version 不过只支持 webhook 。实际用的人数并不太多,后来就没有进一步开发了。
  • 楼主 Muninn 14天前
    引用 51
    @easychen 考虑过语音,现在语音识别很成熟。但是要用户写规则并不易用,就放弃了。

    其实我觉得类似的项目 下发消息 最重要的是送达可靠性。国内厂商都给微信开绿灯,微信是最稳的。

    上传消息最重要的是入口的便捷。 微信置顶服务号我觉得是最便捷的,只有在 Mac 客户端会被折叠……

    我手机上的 slack,企业微信,飞书,tg 放进白名单还是经常收不到消息。
  • 楼主 Muninn 14天前
    引用 52
    @Sunyanzi Hello,你要的接口已经更新完成啦,在文档里找 text 关键字的几个接口。用户和 Agent 都可以发哦。不过你想要的功能也可以用 running 那个接口。

    我自己做了测试,在公众号互动后,可以 48 小时内发送 20 条普通消息。

    https://letserver.run/ref/
  • Sunyanzi 14天前
    引用 53
    @Muninn 哈哈哈哈我昨天晚上就看到啦 ... 而且我还测试了 Finished 状态 ... 毕竟我超关注这项目来着 ...

    就 ... 一定要坚持下去啊 ...
  • 楼主 Muninn 14天前
    引用 54
    @Sunyanzi 放心吧 我自己一直要用的。而且我用 golang 特别不费服务器资源。 我的一大堆吃灰服务器永远也不会被这些小众项目用完的。
  • 游客
    55
返回