使用 Chanify 实现往手机上推送消息

陪她去流浪 桃子 2021年05月23日 编辑 阅读次数:3473

一直想找一个可自己运营的通知消息推送方案,一来免费,二来安全。 它可以作为我的博客的通知服务推送到我的手机(比如有新的评论的时候,邮件不及时),也可以把树莓派的状态信息同步到手机上,等等。 早早地把 Telegram Bot 的 API 给看了,能满足需求,但是由于偷懒一直没有写。 几年前也萌生过写 App 的,甚至看完了《Objective-C ……》,没有继续搞下去…… 不然就完全可以自己写一个了。毕竟自己写的最适合了。

Richard Feynman: What I cannot create, I do not understand.

今天突然发现一个叫 Chanify 的消息推送工具:

  • 支持 iOS 系统(不支持安卓)
  • 支持 自定义消息分组(频道)
  • 支持 部署自己的节点服务器
  • 支持 文本 / 图片 / 文件 等多种消息格式
  • 简单(通过 HTTP 接口即可推送消息)
  • 开源(还是我喜欢的 Go 语言)!

一下就来了兴趣,马上下载下来试用,试用体验非常满意!所以写下这篇文章,安利给有同样需求的朋友 😜 。

官方的 README 已经有非常详细的使用文档,每一步的操作我就不赘述了。 但是出于文章开头提到的安全方面的考虑,我按照官方教程自己跑了一个有状态的服务器。 有状态的服务器会直接把我的消息发送给苹果的服务器,而不会走作者们提供的 https://api.chanify.net 代理后发送给苹果的服务器(不是质疑他们的人品,而且个人习惯性只相信自己),这是和无状态服务器在调用链路上的一个主要区别。

鉴于我并不是很懂苹果的消息推送机制,是不是不走作者的代理服务器就安全了?我不知道。 于是我“审查”了一下服务器的代码(看作者代码整体风格有点像是来自微信团队的成员?我不是微信的,但是看过前微信同事写的代码),发现,只有在“作为无状态服务器”时,即由作者的服务器代理帮忙发送消息时,才会访问作者的 API 网站。这样可以确保是“自己运营的”。 另外有一点值得一提的是,我看到代码中使用了作者的私钥来连接苹果的推送服务器,我不知道私钥的所有者是否可以在苹果官网查看“已发送”消息(希望有苹果开发者可以告知一下)。

有状态服务器和无状态服务器的另一个主要区别是,有状态的服务器的“状态”会存储用户信息等到本地数据库(不包含已发送消息)。对我自己的数据持有所有权也是我历来推崇的,所以综合这些考量,我部署了自己的有状态服务器。

下面贴一份我的配置文件,供有需求的朋友参考一下。

  • docker-compose.yaml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    ---
    version: "2"
    services:
      chanify:
        image: wizjin/chanify:latest
        command: --config chanify.yaml serve
        working_dir: /workspace/
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - .:/workspace/
        ports:
          - 1674:1674
        restart: unless-stopped
    
  • chanify.yaml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    server:
        host: 0.0.0.0
        port: 1674
        endpoint: # 你的 API 地址
        name: main
        datapath: /workspace/
        register:
            enable: false
            whitelist:
              - # 从你的手机上拷贝用户 ID