目录

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 = true

3. 部署核心 Checklist

  1. 域名绑定分工:
    • WebSocket 域名 (push.domain.com): 绑定到 Autoconnect 的 8080 端口。
    • Push API 域名 (push-api.domain.com): 绑定到 Autoendpoint 的 8000 端口。
  2. Hostname 陷阱:
    • autoconnect.toml 里的 hostname 绝对不能127.0.0.1。如果写了,autoendpoint 收到推送后会尝试请求自己(Loopback),导致推送中断。
  3. 密钥同步:
    • crypto_key (connect) 和 crypto_keys (endpoint) 必须完全相同。它们用于加密和验证生成的 Endpoint 令牌。
  4. 生效触发:
    • 修改配置并重启服务后,客户端必须重新打开并建立一次连接。因为只有重新连接,旧的、错误的路由信息才会在 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