Mozilla Autopush-rs 部署与配置全攻略
目录
本文档基于 autopush-rs 项目配置与 Sunup 客户端集成实践整理,涵盖核心原理、架构图示及关键配置。
1. 架构原理与调用逻辑
Autopush-rs 采用双端解耦设计,通过 Redis 共享状态,实现从“公网推送请求”到“私有长连接下发”的回路。
1.1 服务组件分工
- Autoconnect (WebSocket): 负责维护与手机客户端的长连接。
- Autoendpoint (HTTP API): 接收来自应用服务器(如 Mastodon/Matrix)的 WebPush 消息。
- Redis: 存储路由表(哪个用户连接在哪个节点)和待发消息。
1.2 交互流程图 (Mermaid)
2. 关键配置详解
密钥可通过
openssl rand -base64 32命令行生成
2.1 Autoconnect 配置 (autoconnect.toml)
此文件决定了客户端如何找到你,以及 autoendpoint 如何回调你。
# --- 内部识别 (至关重要) ---
# 此 hostname 会存入 Redis。Autoendpoint 必须能通过此名称访问到本容器。
# 在 Docker 环境下,填入 Autoconnect 的容器服务名。
hostname = "autoconnect"
port = 8080 # 暴露给手机的 WS 端口
router_port = 8081 # 暴露给 Autoendpoint 的内部回调端口
# --- 推送地址生成 (给手机客户端看) ---
# 告诉手机:外部推送请求应该发往哪个公网域名和端口。
endpoint_scheme = "https"
endpoint_hostname = "push-api.example.com"
endpoint_port = 443 # 通常是 Nginx/Caddy 的外网端口
# --- 存储与安全 ---
db_dsn = "redis://valkey:6379"
# 必须是 32 字节 Base64 字符串,且两端配置必须一致
crypto_key = "[mqCGb8D-N7mqx6iWJov9wm70Us6kA9veeXdb8QUuzLQ=]"2.2 Autoendpoint 配置 (autoendpoint.toml)
此文件配置推送 API 的接收规则。
host = "0.0.0.0" # 监听所有网卡以接收代理转发
port = 8000 # 映射到外网 https://push-api.example.com 的端口
db_dsn = "redis://valkey:6379"
# 必须与 autoconnect 的 crypto_key 保持一致,否则无法解密请求
crypto_keys = "[mqCGb8D-N7mqx6iWJov9wm70Us6kA9veeXdb8QUuzLQ=]"
scheme = "http"
human_logs = true3. 部署核心 Checklist
- 域名绑定分工:
- WebSocket 域名 (
push.domain.com): 绑定到 Autoconnect 的8080端口。 - Push API 域名 (
push-api.domain.com): 绑定到 Autoendpoint 的8000端口。
- WebSocket 域名 (
- Hostname 陷阱:
autoconnect.toml里的hostname绝对不能写127.0.0.1。如果写了,autoendpoint收到推送后会尝试请求自己(Loopback),导致推送中断。
- 密钥同步:
crypto_key(connect) 和crypto_keys(endpoint) 必须完全相同。它们用于加密和验证生成的 Endpoint 令牌。
- 生效触发:
- 修改配置并重启服务后,客户端必须重新打开并建立一次连接。因为只有重新连接,旧的、错误的路由信息才会在 Redis 中被覆盖。
Docker 部署
https://git.jetsung.com/jetsung/awesome-compose/src/branch/main/autopush
compose.yaml
---
# https://github.com/orgs/forkdo/packages?repo_name=autopush-rs
services:
autoendpoint:
container_name: autoendpoint
env_file:
- path: ./.env
required: false
hostname: autoendpoint
image: ghcr.io/forkdo/autoendpoint:latest
ports:
- 8000:8000
restart: unless-stopped
autoconnect:
container_name: autoconnect
env_file:
- path: ./.env
required: false
hostname: autoconnect
image: ghcr.io/forkdo/autoconnect:latest
ports:
- 8080:8080
restart: unless-stopped.env
配置环境变量文件
# CUSTOM
TZ=Asia/Shanghai
################################# autoendpoint.toml 对应项 ###############
AUTOEND__HOST="autoendpoint"
AUTOEND__PORT=8000
AUTOEND__DB_DSN="redis://valkey:6379"
# 同样,列表需要包含在括号内,分别替换 CRYPTO_KEY 和 AUTH_KEY 为随机密钥
# openssl rand -base64 32
AUTOEND__CRYPTO_KEYS="[CRYPTO_KEY]"
AUTOEND__AUTH_KEYS="[AUTH_KEY]"
AUTOEND__HUMAN_LOGS=true
########################## autoconnect.toml 对应项 ############################
AUTOCONNECT__HOSTNAME="autoconnect"
AUTOCONNECT__PORT=8080
AUTOCONNECT__ROUTER_PORT=8081
# 需要外部(APP)可访问的配置
AUTOCONNECT__ENDPOINT_SCHEME="https"
AUTOCONNECT__ENDPOINT_HOSTNAME="autoupdate.example.com"
AUTOCONNECT__ENDPOINT_PORT=443
AUTOCONNECT__DB_DSN="redis://valkey:6379"
# 同样,列表需要包含在括号内,替换 CRYPTO_KEY,需与 autoendpoint 的密钥一致
# openssl rand -base64 32
AUTOCONNECT__CRYPTO_KEY="[CRYPTO_KEY]"
AUTOCONNECT__HUMAN_LOGS=true
################################ Valkey ###################################
VALKEY_ARGS=--save 60 1000