Ubuntu 22.04 安装 Apprise API 2.0 指南
在 Ubuntu 22.04 从零安装 Apprise API v2.0.2:deadsnakes 装 Python 3.12、GitHub 源码 + venv 在线安装与 36 个 wheel 离线安装两方案,systemd 托管 gunicorn + nginx 反代 8000,含端到端发送验证与卸载清理(全量实测)。
Ubuntu 22.04 安装 Apprise API 2.0 指南
目标:在 Ubuntu 22.04 服务器上从零安装 Apprise API v2.0.2(自托管通知网关,对应 Apprise 库 v2.1.0),给出在线源码安装与离线 wheel 包安装两种方案,含 systemd 托管、nginx 反向代理与发送验证。本文所有命令与回显均已在 Ubuntu 22.04.5 LTS(x86_64)实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
- 系统自带 Python:3.10.12;实际运行用 Python:3.12.15(deadsnakes PPA)
- 软件版本:Apprise API v2.0.2(git tag)、Apprise 库 2.1.0、Django 6.0.9、gunicorn 26.2.0、gevent 26.9.0、nginx 1.18.0、pip 26.2.2
- 安装路径:源码
/opt/apprise-api、虚拟环境/opt/apprise-api/venv - 数据目录:
/var/lib/apprise/{config,attach,plugin};环境文件/etc/apprise-api.env - 服务形态:systemd 托管 gunicorn(127.0.0.1:8001)+ nginx 反代对外(0.0.0.0:8000)
- 运行账号:专用系统用户
apprise
💡 说明:Apprise 生态有「Python 库」与「HTTP API 服务」两个仓库,本文安装的是后者(caronc/apprise-api),即独立部署的通知网关服务;只想在 Python 代码里发通知的读者直接用
pip install apprise即可,无需本文。生态定位与选型见《Apprise 介绍与选型指南》。
二、前置条件
开始安装前确认以下条件满足:
- 一台 Ubuntu 22.04 服务器,有 sudo 权限与 systemd(
systemctl is-system-running返回running)。 - 磁盘剩余空间 ≥ 1GB(源码 + 依赖约 300MB,离线方案另需 23MB wheel 包)。
- 在线方案要求能访问 PyPI 与 github.com(访问受限时按 8.2 走代理,或直接选用第五章离线方案)。
- 8000 端口未被占用(对外服务端口,可用
ss -ltn | grep :8000预查)。
查看系统版本确认目标系统:
lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
三、版本选型说明
Apprise API 以 git tag 发布(无 deb 包、无 PyPI 包),版本与 Apprise 库版本相互独立。实测关键版本事实(2026-10-25 实查):
| 组件 | 版本 | 说明 |
|---|---|---|
| Apprise API(服务端) | v2.0.2 | 当前最新稳定 tag(2026-09-30 发布),本文安装目标 |
| Apprise 库(依赖) | 2.1.0 | 由服务端 requirements.txt 锁定 apprise == 2.1.0 |
| Python | ≥ 3.11 | 依赖 slixmpp ≥ 1.16.0 要求 Python ≥ 3.11,Ubuntu 22.04 自带 3.10 不可用 |
| Django | 6.0.9 | 由 requirements 中 django < 7 自动取最新 6.x |
⚠️ 注意:Ubuntu 22.04 自带的 Python 3.10.12 不能直接运行 Apprise API 2.0——其依赖
slixmpp >= 1.16.0要求 Python ≥ 3.11,强行用 3.10 创建虚拟环境安装会在解析依赖时报错退出。正确做法是按下文 4.2 通过 deadsnakes PPA 安装 Python 3.12。
四、在线源码安装方案(A:官方 GitHub + PyPI)
4.1 方案说明
官方推荐的裸机形态:从 GitHub 克隆 release tag 源码,用 Python 虚拟环境安装 requirements.txt 锁定的依赖,gunicorn 以 gevent 异步 worker 运行 Django 应用,nginx 前置反代。适合可联网服务器,升级方便(git checkout 新 tag + 重装依赖)。
4.2 基础环境安装
安装 git、nginx 与 Python 3.12(deadsnakes PPA 是 Ubuntu 上安装新版 Python 的标准渠道):
sudo apt update
sudo apt install -y software-properties-common git nginx
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-venv
验证两个 Python 版本并存(系统 3.10 保持不动,运行时用 3.12):
python3 --version
python3.12 --version
Python 3.10.12
Python 3.12.15
4.3 创建服务用户与数据目录
创建专用系统用户与数据目录,避免以 root 运行服务:
sudo useradd --system --home /var/lib/apprise --shell /usr/sbin/nologin apprise
sudo mkdir -p /var/lib/apprise/config /var/lib/apprise/attach /var/lib/apprise/plugin
sudo chown -R apprise:apprise /var/lib/apprise
三个目录的用途:config 存有状态通知通道配置(每个配置键一个 .cfg 文件);attach 存通知附件上传;plugin 放自定义通知插件。
4.4 获取 v2.0.2 源码
从 GitHub 克隆 v2.0.2 tag(浅克隆即可):
cd /opt
sudo git clone --branch v2.0.2 --depth 1 https://github.com/caronc/apprise-api.git
⚠️ 网络说明:本次实测时服务器直连 github.com 443 端口被拒绝(连接重置),已改用代理完成克隆:
sudo git -c http.proxy=http://192.168.1.62:7897 clone --branch v2.0.2 --depth 1 https://github.com/caronc/apprise-api.git。国内服务器访问 GitHub 不稳定属常见情况,遇到超时可换镜像站或代理后重试。
确认版本落点:
cd /opt/apprise-api
sudo git describe --tags
sudo git log -1 --format="%H %cs %s"
v2.0.2
308498f6f00389420c998c12019cceed315909f1 2026-10-24 bumped version to v2.0.2 to support Apprise v2.1.0
4.5 创建虚拟环境并安装依赖
用 Python 3.12 建 venv,按官方 requirements.txt 安装(锁定 apprise==2.1.0、django<7、gunicorn[gevent]、gevent、requests 及各通知服务依赖):
cd /opt/apprise-api
sudo python3.12 -m venv venv
sudo ./venv/bin/pip install --upgrade pip
sudo ./venv/bin/pip install -r requirements.txt
验证核心组件版本:
sudo /opt/apprise-api/venv/bin/pip list | grep -iE "^(apprise|Django|gunicorn|gevent) "
apprise 2.1.0
Django 6.0.9
gevent 26.9.0
gunicorn 26.2.0
💡 技术拓展:Python 应用的依赖隔离方案对比——
方案 特点 适用 venv(本文) 标准库自带、轻量、与系统 Python 完全隔离 单机服务部署 conda 带跨语言包管理与多环境 数据科学栈 pipx 面向「命令行应用」的隔离安装 CLI 工具 系统直装 零隔离,易污染系统 Python 不推荐 本文用 venv:官方文档推荐路径,无额外组件依赖。
4.6 环境变量配置
创建环境文件 /etc/apprise-api.env(服务全部配置经环境变量注入):
sudo tee /etc/apprise-api.env <<'EOF'
APPRISE_CONFIG_DIR=/var/lib/apprise/config
APPRISE_ATTACH_DIR=/var/lib/apprise/attach
APPRISE_PLUGIN_PATHS=/var/lib/apprise/plugin
APPRISE_STATEFUL_MODE=simple
APPRISE_DEFAULT_FORMAT=text
APPRISE_WORKER_COUNT=3
ALLOWED_HOSTS=*
TZ=Asia/Shanghai
EOF
逐项说明:
| 变量 | 本文取值 | 说明 |
|---|---|---|
| APPRISE_CONFIG_DIR | /var/lib/apprise/config | 有状态配置目录(每键一个 .cfg) |
| APPRISE_ATTACH_DIR | /var/lib/apprise/attach | 附件上传目录 |
| APPRISE_PLUGIN_PATHS | /var/lib/apprise/plugin | 自定义通知插件扫描路径 |
| APPRISE_STATEFUL_MODE | simple | 配置键直接对应 {key}.cfg 文件,可读可手工编辑;另有 hash(键名哈希落盘,默认)/disabled(关闭有状态) |
| APPRISE_DEFAULT_FORMAT | text | 通知正文默认按纯文本处理(可选 text/markdown/html) |
| APPRISE_WORKER_COUNT | 3 | gunicorn worker 数;默认 CPU×2+1,小规格机器建议显式调小 |
| ALLOWED_HOSTS | * | Django 允许的 Host 头;生产环境应改为实际域名(空格分隔) |
| TZ | Asia/Shanghai | 服务时区 |
完整参数清单与默认值见本专栏《Apprise API 2.0 配置参数详解》。
4.7 systemd 托管
创建服务单元 /etc/systemd/system/apprise-api.service:
sudo tee /etc/systemd/system/apprise-api.service <<'EOF'
[Unit]
Description=Apprise API Notification Gateway
After=network.target
[Service]
Type=simple
User=apprise
Group=apprise
EnvironmentFile=/etc/apprise-api.env
WorkingDirectory=/opt/apprise-api/apprise_api
ExecStart=/opt/apprise-api/venv/bin/gunicorn core.wsgi:application --bind 127.0.0.1:8001 --workers 3 --worker-class gevent
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
源码属 root、运行属 apprise,把数据目录权限再确认一次后启动并设开机自启:
sudo chown -R apprise:apprise /var/lib/apprise
sudo systemctl daemon-reload
sudo systemctl enable apprise-api
sudo systemctl start apprise-api
查看服务状态:
systemctl status apprise-api --no-pager | head -6
● apprise-api.service - Apprise API Notification Gateway
Loaded: loaded (/etc/systemd/system/apprise-api.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2026-10-25 03:27:28 UTC; 1min 12s ago
Main PID: 7125 (gunicorn)
Tasks: 5 (limit: 3612)
Memory: 136.9M
此时 gunicorn 只监听 127.0.0.1:8001,尚不能从外部访问,下一节用 nginx 反代对外。
4.8 nginx 反向代理
创建站点配置 /etc/nginx/sites-available/apprise-api:静态资源 /s/ 直接由 nginx 服务,其余请求转发给 gunicorn:
sudo tee /etc/nginx/sites-available/apprise-api <<'EOF'
server {
listen 8000;
server_name _;
client_max_body_size 210m;
# 静态资源(Web 配置管理器)
location /s/ {
alias /opt/apprise-api/apprise_api/static/;
expires 7d;
}
# 其余请求全部反代给 gunicorn
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/apprise-api /etc/nginx/sites-enabled/apprise-api
⚠️ 注意:
client_max_body_size 210m必须不小于附件上限(默认 200MB),否则大附件通知会被 nginx 以 413 拦截。静态资源 alias 路径末尾的/不可省略。
校验配置并启动:
sudo nginx -t
sudo systemctl enable nginx
sudo systemctl start nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
确认端口监听符合预期(8001 仅回环、8000 对外):
ss -ltnp | grep -E ":8000|:8001"
LISTEN 0 2048 127.0.0.1:8001 0.0.0.0:* users:(("gunicorn",...))
LISTEN 0 511 0.0.0.0:8000 0.0.0.0:* users:(("nginx",...))
4.9 验证运行
健康检查(JSON 与纯文本两种形式):
curl -s -H "Accept: application/json" http://127.0.0.1:8000/status
curl -s http://127.0.0.1:8000/status
{"config_lock": false, "attach_lock": false, "stateful_enabled": true, "stateless_enabled": true, "degraded": false, "max_attachments": 6, "attach_size": 209715200, "status": {"persistent_storage": true, "can_write_config": true, "can_write_attach": true, "details": ["OK"]}, "privilege": "admin"}
OK
stateful_enabled/stateless_enabled 均为 true,说明两种通知模式都可用。
浏览器访问 http://<服务器IP>:8000/ 可打开 Web 配置管理器。也可以先做一次端到端发送验证:在本机 8433 端口起一个临时 HTTP 接收器模拟通知目标(把下面脚本存为 /root/webhook_receiver.py 后用 nohup python3 /root/webhook_receiver.py > /var/log/webhook-receiver.log 2>&1 & 后台运行):
from http.server import BaseHTTPRequestHandler, HTTPServer
class H(BaseHTTPRequestHandler):
def do_POST(self):
l = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(l)
print("RECEIVED path=%s body=%s" % (self.path, body.decode()), flush=True)
self.send_response(200)
self.end_headers()
self.wfile.write(b"{}")
def log_message(self, *a):
pass
HTTPServer(("0.0.0.0", 8433), H).serve_forever()
通过无状态接口发一条测试通知(json:// 是通用 JSON Webhook 通道,把通知以 JSON POST 到目标地址):
curl -s -X POST -d "urls=json://127.0.0.1:8433/hook&title=Test Title&body=hello apprise&type=success" http://127.0.0.1:8000/notify
2026-10-25 03:24:24,324 - INFO - Notifying 1 service(s).
2026-10-25 03:24:24,328 - INFO - Sent JSON POST notification.
接收器日志确认投递内容:
tail -1 /var/log/webhook-receiver.log
RECEIVED path=/hook body={"version": "1.0", "title": "Test Title", "message": "hello apprise", "attachments": [], "type": "success"}
至此方案 A 安装完成:8000 端口对外提供 API 与 Web 管理器,通知可正常投递。各 HTTP 端点(有状态配置管理、标签路由、附件上传、认证等)的完整用法见本专栏《Apprise API 2.0 API 使用详解》。
五、离线 wheel 包安装方案(B:断网/内网)
5.1 方案说明
内网/断网服务器无法访问 PyPI 时,先在一台可联网的同版本机器(同为 Ubuntu 22.04 + Python 3.12)上用 pip download 拉齐全部 wheel 包,拷贝到离线机后用 --no-index 本地安装。Apprise API 全量依赖仅 36 个 wheel 共 23MB,离线化成本很低。
5.2 联网机下载依赖包
在可联网机器上准备 Python 3.12 环境后(同 4.2),下载源码与全部 wheel:
cd /opt
sudo git clone --branch v2.0.2 --depth 1 https://github.com/caronc/apprise-api.git
cd apprise-api
sudo python3.12 -m pip download -r requirements.txt -d /opt/apprise-offline --only-binary=:all:
实测得到 36 个 wheel 包、合计 23MB:
ls /opt/apprise-offline/ | head -5
ls /opt/apprise-offline/ | wc -l
du -sh /opt/apprise-offline/
PGPy-0.5.4-py2.py3-none-any.whl
aiodns-4.0.4-py3-none-any.whl
apprise-2.1.0-py3-none-any.whl
asgiref-3.13.0-py3-none-any.whl
certifi-2026.10.23-py2.py3-none-any.whl
36
23M /opt/apprise-offline/
⚠️ 注意:
--only-binary=:all:强制只用预编译 wheel,避免离线机编译失败。离线机的 Python 次版本号(3.12)与操作系统发行版必须与下载机一致,否则含 C 扩展的包(如 cffi、cryptography)会因 ABI 不匹配无法安装。
5.3 离线机安装
把 /opt/apprise-api(源码)与 /opt/apprise-offline(wheel 包)整体拷贝到离线机后,在离线机上执行:
cd /opt/apprise-api
sudo python3.12 -m venv venv
sudo ./venv/bin/pip install --no-index --find-links /opt/apprise-offline -r requirements.txt
--no-index 表示完全不访问 PyPI,全部从本地目录解析。实测安装过程数秒内完成,验证方式与 4.5 相同(pip list 应看到 apprise 2.1.0 / Django 6.0.9)。
5.4 后续步骤
离线方案与在线方案仅在「依赖获取」环节不同,用户与目录创建(4.3)、环境文件(4.6)、systemd 托管(4.7)、nginx 反代(4.8)与验证(4.9)完全相同,照第四章对应小节执行即可。
六、方案对比与选择建议
| 维度 | 方案 A:在线源码安装 | 方案 B:离线 wheel 包安装 |
|---|---|---|
| 是否需要联网 | 安装时需要(GitHub + PyPI) | 目标机完全不需要 |
| 依赖获取 | pip 在线解析 | 联网机预下载 36 个 wheel(23MB) |
| 安装耗时 | 依赖下载约 1–2 分钟 | 本地安装数秒 |
| 升级方式 | git checkout 新 tag + pip 重装 | 重新走一遍打包/拷贝流程 |
| 适用场景 | 可联网的生产/测试服务器 | 内网隔离、安全域服务器 |
选择建议:能联网选方案 A,链路最短、升级最方便;目标机断网但有同版本联网中转机时选方案 B。若倾向容器化部署(官方镜像一份 compose 文件拉起,免装 Python 环境),另见本专栏《Apprise API Docker Compose 部署指南》。
七、配置说明
- 配置载体:Apprise API 服务端全部由环境变量配置(见 4.6 表格),B1 安装形态经
/etc/apprise-api.env注入,改动后sudo systemctl restart apprise-api生效。 - 通知通道配置:有状态模式下每个配置键对应
/var/lib/apprise/config/<key>.cfg纯文本文件(每行一条 Apprise URL,可手工编辑,权限 600 属 apprise 用户),也可通过 API 或 Web 管理器维护;实测落盘形态:
ls -la /var/lib/apprise/config/
cat /var/lib/apprise/config/myalerts.cfg
-rw------- 1 apprise apprise 85 Oct 25 02:51 myalerts.cfg
drwxr-xr-x 3 apprise apprise 4096 Oct 25 02:40 store
json://127.0.0.1:8433/hook?method=POST&overflow=upstream&retry=0&wait=0.5&optional=no
- 升级方法:
cd /opt/apprise-api && sudo git fetch --tags && sudo git checkout <新tag>,然后sudo ./venv/bin/pip install -U -r requirements.txt,最后sudo systemctl restart apprise-api。降级同理 checkout 旧 tag。多版本管理可用多个/opt/apprise-api-<版本>目录 + 独立 venv 并存,切换 systemd 的 WorkingDirectory/ExecStart 路径即可。 - 命令行工具:依赖安装后 venv 内自带 apprise CLI(来自 apprise 库),可独立验证 URL 拼写,如
sudo /opt/apprise-api/venv/bin/apprise --version输出Apprise v2.1.0。
八、常见问题
Q1:用系统自带 Python 3.10 建 venv,pip install 报依赖解析失败?
A:requirements.txt 中 slixmpp >= 1.16.0 要求 Python ≥ 3.11,Ubuntu 22.04 自带 3.10.12 不满足。按 4.2 安装 Python 3.12 并重新创建 venv 即可,不要试图降级 slixmpp(会带出一连串兼容问题)。
Q2:git clone github.com 超时或连接被拒绝?
A:国内网络访问 GitHub 不稳定。可换代理:git -c http.proxy=http://<代理地址>:<端口> clone ...;或用 GitHub 镜像站。本文实测时直连被拒、走代理成功。同理 pip 慢可加 -i https://pypi.tuna.tsinghua.edu.cn/simple 走国内镜像。
Q3:浏览器访问 8000 报 502 Bad Gateway?
A:先查后端是否存活 systemctl status apprise-api,再查 ss -ltn | grep 8001 确认 gunicorn 在监听;nginx 错误日志在 /var/log/nginx/error.log。常见原因是 apprise-api 服务未启动或 /etc/apprise-api.env 中路径写错导致启动失败(journalctl -u apprise-api -n 50 --no-pager 看报错)。
Q4:Web 管理器静态资源 404(页面无样式)?
A:检查 nginx 配置中 location /s/ 的 alias 路径是否指向 /opt/apprise-api/apprise_api/static/(末尾带斜杠),并确认 nginx -t 通过后已 reload。
Q5:发送带附件的通知返回 413?
A:nginx 的 client_max_body_size 小于附件体积。本文配置为 210m,略大于默认附件上限 200MB(APPRISE_ATTACH_SIZE);若调大了附件上限,nginx 侧要同步调大。
九、卸载与清理
按安装逆序清理。停止并摘除 systemd 服务:
sudo systemctl stop apprise-api
sudo systemctl disable apprise-api
sudo rm /etc/systemd/system/apprise-api.service
sudo systemctl daemon-reload
摘除 nginx 站点(nginx 本体如有其他用途可保留):
sudo rm /etc/nginx/sites-enabled/apprise-api
sudo rm /etc/nginx/sites-available/apprise-api
sudo systemctl reload nginx
删除源码、数据、环境文件与服务用户:
sudo rm -rf /opt/apprise-api /var/lib/apprise /etc/apprise-api.env
sudo userdel apprise
离线方案的 wheel 包目录(/opt/apprise-offline)与临时接收器(/root/webhook_receiver.py)按需一并删除。
十、参考链接
- Apprise API 源码仓库:https://github.com/caronc/apprise-api
- Apprise 库源码仓库:https://github.com/caronc/apprise
- 官方安装文档:https://appriseit.com/getting-started/
- 支持的通知服务目录:https://appriseit.com/services/
- deadsnakes PPA:https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa
- 本专栏相关文档:《Apprise 介绍与选型指南》、《Apprise API Docker Compose 部署指南》、《Apprise API 2.0 配置参数详解》、《Apprise API 2.0 API 使用详解》