自建 Bark 后端服务

2022/04/08 bark bark-server self-hosting

Bark 是一款可以给 iPhone 发送自定义推送的服务,你可以利用 Bark 做一些有趣的事情,比如我之前分享的:配合 SmsForward 转发 Android 设备的短信至 iPhone。Bark 本身提供后端服务,同时也开源了服务端代码,你可以利用 docker 轻松在服务器端部署私有化 Bark 后端服务。

之前在博客有提到过我闲置了一个腾讯云虚拟主机,由于域名备案的关系,现在无法正常使用。我想与其闲置在那里,不如拿来做点有趣的事情。

我本身对服务器这方面不是特别了解,看到 Bark 后端只提供了 docker 这一种部署方式。本来可以在腾讯云服务器的管理面板中直接重置系统镜像为 docker,这时忽然想起来,之前建站经常要用到的宝塔面板就可以安装 docker 管理器,宝塔面板里编辑服务器里的文件也比较方便,所以就先安装了宝塔面板,方便我后续进行操作。

按照官方的教程,我成功地在服务器中部署好了 Bark 后端服务。本来想解析一个二级域名push.iduan.me在这台服务器上,方便配置。谁知解析生效还没过 10 分钟,就被腾讯云拦截了,由于这个域名还没有备案,按照相关法律法规的要求,解析是无法生效的,因此在配置后端服务时,只能填写 IP 地址,不过影响也不大~

最麻烦的是给这个自建的后端服务添加 SSL 支持,官方教程只是阐述了怎么部署支持 http 访问的后端,根本没提 SSL 的事情。以前在宝塔面板里为网站开启 https 访问的方法在这里完全行不通,为此又耗费大量时间去网络中搜索,等这套后端服务彻底搞好的时候已经是半夜两点了……

以下是服务搭建过程中开启 SSL 的一点点笔记:

✍🏻为 IP 地址申请 SSL 证书

大部分云服务商不支持为 IP 地址申请 SSL 证书,可以访问 ZeroSSL 申请 IP 地址的SSL证书,免费账户申请的证书有效期只有三个月,而且不支持自动续签。

将签发的证书(两个.crt文件,一个.key文件)上传至/www/server/nginx/conf/cert目录下(没有 cert 文件夹就新建一个)

✍🏻为服务器启用 SSL

修改 /www/server/nginx/conf 路径下 nginx.conf 配置文件,添加以下内容:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name 1.2.3.4;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
    ssl_certificate cert/certificate.crt;
    ssl_certificate_key cert/private.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate cert/ca_bundle.crt;
    location / {
       proxy_pass http://127.0.0.1:8080;
    }

注意:

✍🏻解决部分 Android App 连接 Bark 后端服务时报错的问题

开启 SSL 之后,在部分 Android 应用内访问服务器后端地址时可能会报错“java security cert.CertPathValidatorException: Trust anchor for certification path not found”,原因是后端服务在部署 SSL 时缺少了中间证书。

你可以利用 https://www.myssl.cn/tools/downloadchain.html 这个工具,使用已有的cert/certificate.crt文件快速生成中间证书,最后会得到chain.crt这个文件。

用文本编辑器打开certificate.crt,在所有代码后面依次添加ca_bundle.crtchain.crt这两个文件里的内容,最后的效果应该是这样的:

-----BEGIN CERTIFICATE-----
这里是 certificate.crt 原本的所有内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这里是 ca_bundle.crt 文件中的所有内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这里是 chain.crt 文件中的所有内容
-----END CERTIFICATE-----

保存文件,用这个编辑之后的certificate.crt文件替换服务器中之前上传的的certificate.crt,个别应用中报错的问题即可解决。