无APP推送服务PushDeer的搭建

周六休息了一天,周日继续


本文是应网友 水杯与蚂蚁 的要求折腾的;

PushDeer 是什么?

PushDeer 是一个开源的无 APP 推送解决方案,使用 gorush作为推送中间件。其特色包括:「易用」、「可控」和「渐进」。PushDeer 是一个商业开源项目,采用「开放源码」、「自用免费」、「在线服务收费」的方式进行运作。

gorush 是什么?

gorush 是使用 Go (Golang) 编写的 Gin 框架的推送通知微服务器。

申明

【注意】:

  1. 本文只是记录了老苏折腾的过程,不要将这个镜像运用到生产环境,因为老苏没有时间进行测试;
  2. 之所以折腾是因为官方的安装方式虽然简单,但是过程中需要通过 composer 包管理系统安装依赖库,但因为众所周知的原因,存在很大的失败几率;
  3. 老苏只是试图解决安装失败的问题,没有时间深入研究 PushDeer ,相关的问题建议看官方的文档说明;
  4. 以下记录不一定适用于 PushDeer 未来的版本;

所以,如果你按照本文安装后遇到问题,建议改用官方的方式进行安装;你可以通过留言的方式提问,但老苏最近无法保证一定能回复,见谅~

构建镜像

如果你不想自己构建,可以跳过,直接阅读下一章节

官方的 Dockerfiledocker/web 目录下,老苏增加了两行 COPY api ./apiCOPY push ./push

这个 api 不仅仅是源代码中的 api 目录中的内容,老苏还把安装成功后的 vendor 目录放进去了;

和官方的源代码构建相比,好处是你在安装之前不需要先下载源代码,安装过程中也不用从网上下载依赖库

所以不存在失败的情况,但是坏处是:

  1. 不能跟随官方使用最新的代码;
  2. 基础镜像 webdevops/php-apache:8.0-alpine 本来就比较大,现在塞进了源代码和依赖库,所以体积更大了,安装完成后有 1.2G
  3. 大概率老苏不会再更新镜像了,想要新版本只能自己动手了 😁,主要是工作忙(其实是懒)。反正老苏已经把都给了大家;

下面的 Dockerfile 是已经修改之后的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FROM webdevops/php-apache:8.0  

# 复制 api 和 push 目录到容器内
COPY api ./api
COPY push ./push

# 首先配置 vhost
COPY vhost.conf /opt/docker/etc/httpd/vhost.conf
# COPY web.vhost.conf /opt/docker/etc/httpd/vhost.common.d/

# 然后运行初始化脚本
# https://dockerfile.readthedocs.io/en/latest/content/Customization/provisioning.html
COPY init.sh /opt/docker/provision/entrypoint.d/
#CMD chmod +x /opt/docker/provision/entrypoint.d/init.sh
RUN echo "session.save_handler = redis\n" >> /opt/docker/etc/php/php.webdevops.ini
RUN echo "session.save_path = 'tcp://redis:6379'\n" >> /opt/docker/etc/php/php.webdevops.ini
RUN echo "session.gc_maxlifetime = '259200'\n" >> /opt/docker/etc/php/php.webdevops.ini

# ADD supervisord-proxy.conf /opt/docker/etc/supervisor.d/prism-proxy.conf
RUN mkdir /data
COPY gorush /data/gorush
RUN chmod +x /data/gorush

ADD supervisord-ios.conf /opt/docker/etc/supervisor.d/push-ios.conf
ADD supervisord-clip.conf /opt/docker/etc/supervisor.d/push-clip.conf

ADD larave-cron /etc/cron.d
RUN chmod +x /etc/cron.d/larave-cron

# 配置 https
# 在本目录下创建ssl目录,放入证书(server.crt,server.key),然后去掉下一行的注释
# ADD ssl /app/ssl

EXPOSE 80

另一个需要修改的文件是 init.sh 文件,主要是新增了:

  1. cp -r /api ./app/cp -r /push ./app/ 是把容器内的 apipush代码目录复制到映射的卷;
  2. 增设了国内源,这个作用有限,因为实际上导致失败的原因是有些库在 github 上;
  3. beginend 是老苏为了调试看着方便加的;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# 将容器内的 api 目录复制到 /app 目录中
echo "------begin------"
cp -r /api ./app/
cp -r /push ./app/

# 设置国内源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 初始化 laravel
cd /app/api && composer install && cp -n .env.example .env && php artisan key:generate && php artisan migrate --seed

mkdir -p /app/api/storage
chmod -R 0777 /app/api/storage

mkdir -p /app/api/bootstrap/cache/
chmod -R 0777 /app/api/bootstrap/cache/
echo "------end------"

接下来就可以开始构建了,构建的基本命令如下👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 下载代码(国内)
git clone https://gitee.com/easychen/pushdeer.git

# 下载代码(国外)
git clone https://github.com/easychen/pushdeer.git

# 进入目录
cd pushdeer/docker/web/

# 复制 api 和 push 到当前目录的 web 目录中
cp -r ../../api ./
cp -r ../../push ./

# 从安装成功的机器上,将 vendor 目录复制到 api 目录中

# 修改 Dockerfile 文件,增加了将 api 目录(包含 vendor 目录)和 push 目录复制容器中的动作;

# 修改 init.sh
## 1、将容器内的 api 目录 复制到 app/api 和 push 目录复制到 app/push 的动作 ;
## 2、增加国内源 https://mirrors.aliyun.com/composer/;

# 构建镜像
docker build -t wbsu2003/pushdeer:v1 .

docker-compose 安装

将下面的内容保存为 docker-compose.yml 文件,这个文件是在官方的 docker-compose.self-hosted.yml 基础上改的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
version: '2.1'

services:
mariadb:
image: mariadb:10.6
container_name: pushdeer_mariadb
healthcheck:
test: ["CMD", "mysqladmin", "ping", "--silent","--password=$$MYSQL_ROOT_PASSWORD"]
timeout: 10s
retries: 3
volumes:
- ./data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=theVeryp@ssw0rd
- MYSQL_DATABASE=pushdeer
- MYSQL_USER=pushdeer
- MYSQL_PASSWORD=123456

redis:
image: redis:6.2
container_name: pushdeer_redis
healthcheck:
test: ["CMD", "redis-cli","ping"]
environment:
- ALLOW_EMPTY_PASSWORD=yes

app:
image: wbsu2003/pushdeer:latest
#build: './docker/web/'
container_name: pushdeer_app
ports:
- 8820:80
volumes:
- ./app:/app
depends_on:
mariadb:
condition: service_healthy
redis:
condition: service_healthy
environment:
- DB_HOST=mariadb
- DB_PORT=3306
- DB_USERNAME=pushdeer
- DB_DATABASE=pushdeer
- DB_PASSWORD=123456
- GO_PUSH_IOS_TOPIC=com.pushdeer.self.ios
- GO_PUSH_IOS_CLIP_TOPIC=com.pushdeer.self.ios.Clip
- APP_DEBUG=true

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 pushdeer 和 子目录
mkdir -p /volume2/docker/pushdeer/{app,data}

# 进入 pushdeer 目录
cd /volume2/docker/pushdeer

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

如提示 docker服务未安装/找不到/未启动,可在 docker-compose 前加 sudo 再试

运行

虽然不用再下载依赖库,但是启动还是要花点时间的,理论上要在日志中看到 end才行

群晖上也可以看到的

在浏览器中输入 http://群晖IP:8820 就能看到主界面,如果还是不行,那就多刷几次

按照官方的说法,看到这个界面表示容器已经启动。

⚠️ 自架服务器端需每年2月拉取一次更新推送证书

这是官方的提示,至于怎么更新,老苏没去研究

测试

因为 Android 的快应用还在开发,所以老苏测试了 Android APPiphone

Android

Android 客户端下载地址:

  • 国外用户:https://github.com/easychen/pushdeer/releases

  • 国内用户:https://gitee.com/easychen/pushdeer/releases

但是发现不支持自架版,没有找到入口

后来发现官方已经关闭了

iOS

虽然还不支持 Android 的快应用,但是已经支持 iOS App Clips,老苏借了一台 iphone 测试,只要用摄像头扫描主页的二维码即可

要求 ios14+ 系统

懒得截图,直接盗了官方的动图

先注册设备后才可以获得 key

然后你可以在浏览器中用后面的地址直接给 iphone 发消息 http://192.168.0.197:8820/message/push?pushkey=<key>&text=要发送的内容

例如:http://192.168.0.197:8820/message/push?pushkey=PDU1TN1WUQ1AbO34A09dhe7D57nuwjES93WSF&text=老苏随便发的

发送成功或者失败,都会有返回值

如果是 okiOS 手机上会看到发送的消息

因为反复重装调试,所以老苏遇到过下面这样的错误,这是因为注册设备用到了device token,应用一旦重装,device token会变,所以需要重新注册一次

API

这个应该是对二次开发有用,官方有 Swagger格式的在线文档:https://ilovintit.github.io/pushdeer-api-doc

顶部有个 PushDeerOS.json 的地址,建议将这个文件下载到本地,然后用 API 调试工具,比如 PostmanApiPostApifox,直接导入了下载的 PushDeerOS.json文件

这次老苏用了 Apifox,各种操作所需要的token 可以在日志中获找到

参考文档

pushdeer.com
地址:http://pushdeer.com/

pushdeer: 此为PushDeer在国内的镜像仓库,pr和issue请提交到GitHub
地址:https://gitee.com/easychen/pushdeer

appleboy/gorush: A push notification server written in Go (Golang).
地址:https://github.com/appleboy/gorush