acme官方支持比如邮件、IFTTT、Telegram等一共二十多种通知方式,如果恰好有一种是自己常用的,那么按照wiki配置是非常简单的,我就不多余再写一遍了。

我既然单独写一篇文章出来,显然我并没有选择现成的方案,这就要稍微麻烦一点点🤏了。

搭建message-pusher

目前我使用message-pusher来作为我的消息推送服务,关于这个服务就不过多介绍了,有需要自行查看项目README,都是中文的。这里直接放一下我的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# docker-compose.yaml
services:
  message-pusher:
    image: justsong/message-pusher
    container_name: message-pusher
    restart: always
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      - TZ=Asia/Shanghai
      - SESSION_SECRET=自己生成
    volumes:
      - ./data:/data
 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
# nginx 配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name msg.my.domain;

    ssl_certificate /etc/nginx/certs/msg.my.domain.pem;
    ssl_certificate_key /etc/nginx/certs/msg.my.domain.key;

    access_log  /var/log/nginx/msg_access.log;
    error_log   /var/log/nginx/msg_error.log;

    location / {
        proxy_pass http://127.0.0.1:3000;
        client_max_body_size  64m;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Accept-Encoding gzip;

        proxy_http_version 1.1;
        proxy_set_header   Connection        $connection_upgrade;
        proxy_set_header   Upgrade           $http_upgrade;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}

自定义通知脚本

尽管wiki中有一个customscript的选项,但是在我写此文的这个时间节点实际上不可用,倒是看到有人提了PR,但是官方也没合并。

然后我又在这个issue中看到维护者说,只需要把自己写的脚本放到notify文件夹下面,然后把hook的名字改成对应的就可以了。所以倒也不难。

脚本写起来并不复杂,直接仿照telegram.sh写就可以,我给脚本起的名字是msgpusher.sh,那么在文件内写一个msgpusher_send的函数即可,这个函数接收三个参数, 分别是subject message status code。当然,不写函数也行,参数不变,在脚本中用$1 $2 $3直接引用对应参数即可。

照猫画虎,下面是我写的脚本:

配置通知

首先把上面的脚本下载到~/.acme.sh/notify目录下,然后就如同配置官方其他的配置一样,配置下面几个环境变量,

1
2
3
4
5
6
7
8
# 消息推送 API URL:https://<domain>/push/<username>,例如:https://push.mydomain.cn/push/admin
export MSG_PUSHER_ENDPOINT=""
# 此处填的是消息通道的名称,而非类型
export MSG_PUSHER_CHANNEL=""
# 后台设置的推送token
export MSG_PUSHER_TOKEN=""
# 可选,值可以是title或description或content,默认为content
export MSG_PUSHER_FIELD="content"

最后,在~/.acme.sh目录下,运行acme.sh --set-notify --notify-hook msgpusher即可,会立刻运行一次,没问题的话是可以收到通知的。

另外,官方还支持几个选项,虽然一般不用改,这里还是提一下,

  • --notify-level: 默认为2,有错误或成功renew时发送,0为禁用,1为仅出错通知,3为每次运行cron任务都通知
  • --notify-mode: 默认为0,Bulk mode,即多张证书成功renew时合并到一条消息发送。可以修改为1,Cert mode,即每个证书发送一条通知
  • --notify-source: 默认为安装acme的主机名,按喜好修改,有多台主机都安装了acme的时候好区分是谁发的消息

总结

至此,acme的通知就配置完成了,即便自定义脚本也挺简单的,没什么好说的,下篇文章来设置证书续订之后的自动部署。