V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Muninn
V2EX  ›  分享创造

你们要的反向 Server 酱来了

  •  2
     
  •   Muninn · 245 天前 · 9008 次点击
    这是一个创建于 245 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    当作控制台的公众号:

    qrcode

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

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

    第 1 条附言  ·  245 天前
    对了,这个项目是用 Golang 写的,初学的同学可以参考哦,也欢迎高手拍砖。

    https://github.com/hack-fan/skadi 可以当作服务端实现参考

    https://github.com/hack-fan/skadi-agent-shell 可以当作一个发布 systemd 服务的案例

    https://github.com/hack-fan/skadigo 是写 0 依赖 sdk 的实践
    第 2 条附言  ·  244 天前
    API 文档来啦

    可以自己随意集成哦
    第 3 条附言  ·  244 天前
    汗 忘记 API 附上地址

    [https://letserver.run/ref/]( https://letserver.run/ref/)
    第 4 条附言  ·  244 天前

    惨 APPEND 不能删除啊 忘记选md语法了

    https://letserver.run/ref/

    第 5 条附言  ·  244 天前
    从现在开始 V2EX 暗号的配额增加改为 1 个了哦
    60 条回复    2021-10-17 23:39:47 +08:00
    styang
        1
    styang  
       245 天前
    看起来还可以
    Sunyanzi
        2
    Sunyanzi  
       245 天前
    玩了半天 ... 很有趣 ... 比 ServerChan 更简单实用 ... 希望能坚持下去 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    plan 的文本确实错了~

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    就 ... 一定要坚持下去啊 ...
    Muninn
        53
    Muninn  
    OP
       243 天前
    @Sunyanzi 放心吧 我自己一直要用的。而且我用 golang 特别不费服务器资源。 我的一大堆吃灰服务器永远也不会被这些小众项目用完的。
    themiscloud
        54
    themiscloud  
       243 天前
    一站式无编程 IM 通知工具叮兔 https://ding.to 过来声援
    Muninn
        55
    Muninn  
    OP
       243 天前
    @themiscloud 哈哈 之前我也想过做这个通知工具,因为自己之前切团队工具的时候很麻烦。

    后来研究了一下觉得各家差异还挺大的,统一化之后放弃的特色功能太多了没有下手。

    你们现在做了我也不想了。
    themiscloud
        56
    themiscloud  
       242 天前
    @Muninn 确实,只能通过放弃差异化达到统一化。
    bequt
        57
    bequt  
       51 天前
    我可以充钱吗, 喜欢 text 这种简洁模式, 但是每天配额太少了. 我想一次性发 100 条左右信息配额.有充钱资格么
    Muninn
        58
    Muninn  
    OP
       51 天前
    @bequt 抱歉啊 因为还很简陋 所以也没到做充钱的版本。 目前我们的配额是你可以配置多少个 Agent 。 向 Agent 发命令是无限的。

    用接口发信息配额是受限于微信公众号的问题,没准备提高。

    下个版本我会开源一个用 tg 的,并在云服务版本支持绑定 tg,slack,企业微信,飞书等几个 IM 。 每个绑定的 IM 都可以给 Agent 发命令。 调用接口发消息给这些渠道都会是无限的。 现在的每天消息数限制是因为公众号的限制。
    bequt
        59
    bequt  
       51 天前
    @Muninn tg 苹果手机要翻墙吧, 估计只能走企业微信了. 企业微信估计是下个不错选择
    Muninn
        60
    Muninn  
    OP
       51 天前 via Android
    @bequt 嗯 很快会支持企业微信的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1070 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    ♥ Do have faith in what you're doing.