ntfy 如何切换到 PostgreSQL 后端并配置只读副本分流读请求

ntfy 如何切换到 PostgreSQL 后端并配置只读副本分流读请求 ntfy 如何切换到 PostgreSQL 后端并配置只读副本分流读请求【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy自托管 ntfy 服务器默认使用 SQLite 存储消息缓存、用户访问控制和 Web Push 订阅。当消息量上来之后可以把这三个存储整体切换到 PostgreSQLv2.18.0 引入v2.27.0 起不再标注 experimental并进一步用database-replica-urls配置一个或多个只读副本让非关键读请求轮询打到副本上主库只承担写入和一致性关键读副本支持自 v2.19.0 起提供。本文给出从修改配置、迁移存量 SQLite 数据到验证服务健康的完整路径。准备工作版本与数据库实例先确认两点ntfy 版本PostgreSQL 支持需要 v2.18.0 及以上只读副本需要 v2.19.0 及以上。当前稳定版为 v2.27.0直接用它即可避免 v2.19.1 修复过的两个问题postgresql://连接串被校验拒绝、消息中的非法 UTF-8 导致 PostgreSQL 插入失败。PostgreSQL 实例准备好一个主库以及用于分流的只读副本实例记下连接地址、账号和密码。第一步把主库指向 PostgreSQLdatabase-urlntfy 通过database-url这一个选项把所有数据库支持的存储message cache、access control、web push 订阅切换到 PostgreSQL。要点来自 docs/config.md 的 PostgreSQL 小节设置database-url后cache-file、auth-file、web-push-file三个 SQLite 选项不得再设置设置database-url会隐式启用认证与访问控制相当于 SQLite 下设置了auth-file。默认访问级别是read-write即匿名用户仍可读写所有 topic如果服务器不是完全开放的需把auth-default-access设为deny-all见 访问控制 一节。最小配置用户、密码、地址按你的实际值替换database-url: postgres://user:passhost:5432/ntfy需要 TLS 或调整连接池时URL 支持标准 PostgreSQL 连接参数作为查询参数如sslmode、connect_timeout、sslrootcert、application_namentfy 另提供以下自定义池参数对主库和副本 URL 均生效参数默认含义pool_max_conns10到数据库的最大打开连接数pool_max_idle_conns-池中最大空闲连接数pool_conn_max_lifetime-连接最大复用时长Go 时长格式如5m、1hpool_conn_max_idle_time-连接最大空闲时长如30s、5m文档给出的带 SSL 与 CA 证书示例database-url: postgres://user:passhost:5432/ntfy?sslmoderequiresslrootcert/etc/ntfy/db-ca-cert.pempool_max_conns30同样可以通过环境变量NTFY_DATABASE_URL或命令行参数--database-url设置。第二步可选分支用 pgimport 迁移存量 SQLite 数据如果你是全新部署跳过本节直接把 PostgreSQL 当作初始数据库使用即可。若已有 SQLite 数据要搬过去仓库提供一次性迁移工具 pgimport其 README 明确了适用范围与限制只支持特定 SQLite schema 版本message cache v14、user db v6、web push v1版本不符时工具会拒绝运行导入期间ntfy 必须处于停止状态它会读取 SQLite 文件并写入 PostgreSQL三个 SQLite 文件都是可选的只导入你显式指定的那些工具是幂等的可以安全重跑导入完成后会对照 SQLite 源校验行数和内容这就是本步骤的验证方式。操作流程# 1. 构建工具在仓库根目录执行 go build -o pgimport ./tools/pgimport/ # 2. 执行导入--create-schema 会自动创建 PostgreSQL schema # 也可以不加该参数改为先用 database-url 跑一次 ntfy 来建 schema pgimport \ --create-schema \ --database-url postgres://user:passhost:5432/ntfy?sslmoderequire \ --cache-file /var/cache/ntfy/cache.db \ --auth-file /var/lib/ntfy/user.db \ --web-push-file /var/lib/ntfy/webpush.dbREADME 说明前置条件为PostgreSQL schema 已就绪由--create-schema或首次以database-url运行 ntfy 创建、ntfy 未在运行。也支持pgimport --config /etc/ntfy/server.yml直接从服务器配置读取命令行参数优先于配置值。如果消息中存在非法 UTF-8导入时会替换为 Unicode 替换字符这一点在迁移大量用户消息前值得知道。注意pgimport 是 SQLite → PostgreSQL 的迁移工具不涉及主从复制只读副本需要在 PostgreSQL 一侧自行搭建ntfy 只负责把读请求打到database-replica-urls指向的实例。第三步配置只读副本分流读请求在database-url之外追加database-replica-urls连接串列表。文档示例来自 docs/config.mddatabase-url: postgres://user:passprimary:5432/ntfy?sslmoderequiresslrootcert/etc/ntfy/db-ca-cert.pempool_max_conns30 database-replica-urls: - postgres://user:passreplica1:5432/ntfy?sslmoderequiresslrootcert/etc/ntfy/db-ca-cert.pempool_max_conns30 - postgres://user:passreplica2:5432/ntfy?sslmoderequiresslrootcert/etc/ntfy/db-ca-cert.pempool_max_conns30行为规则均来自 docs/config.md非关键的只读查询例如拉取消息、检查访问权限按**轮询round-robin**方式分布在副本之间所有写入和一致性关键的读仍然走主库某个副本不健康时ntfy 会自动回退到主库直到该副本恢复该选项依赖database-url仅对 PostgreSQL 生效。也可用环境变量NTFY_DATABASE_REPLICA_URLS逗号分隔多个 URL或命令行参数--database-replica-urls传入。验证与结果判断迁移验证pgimport 运行结束时自带校验——导入后的 PostgreSQL 行数和内容与 SQLite 源比对README 将其列为工具的内置行为工具幂等失败后重跑即可。服务健康检查ntfy 在/v1/health暴露健康检查端点返回 JSON返回非 200 状态码或healthy字段为false时应视为不健康。文档示例响应{healthy:true}Docker 部署时 docs/install.md 给出了把它接进healthcheck的例子test: [CMD-SHELL, wget -q --tries1 http://localhost:80/v1/health -O - | grep -Eo \healthy\\\s*:\\s*true || exit 1]副本生效的间接确认副本分流是配置层面的路由行为文档没有给出独立的观测接口副本不健康时表现为静默回退主库服务不中断这一点可以在配置副本后结合日志观察临时把log-level调高为debug/trace调试完记得改回因为该级别非常冗长。限制与已知边界只有 v2.19.0 之前的版本没有database-replica-urls升级前请对照 docs/releases.md 的版本记录。v2.19.2 曾修复主库与只读副本之间的竞态并把授权查询改路由到只读副本v2.27.0 起GET /account又从副本改回读主库以避免副本延迟导致账户视图短暂显示旧数据。如果你的版本较旧副本延迟带来的读到旧值现象可能更明显升级是文档给出的对应修复。副本只是分流读不能替代主库的备份ntfy 的文档只描述读写路由与回退行为没有给出主从复制的搭建方案PostgreSQL 一侧的复制拓扑需要自行按数据库侧文档完成。pgimport 只支持上文列出的三个 schema 版本如果你的 SQLite 库版本不符例如消息缓存库早于 v1.10.0 时代的格式文档指出这类旧缓存库已无法直接迁移需要先用旧版本 ntfy 升级数据库或接受清空缓存再执行导入。完成以上步骤后你的 ntfy 即以 PostgreSQL 为主后端运行读请求按配置分流到副本写请求与一致性关键读保持落在主库后续调优的入口就是 URL 中的池参数和副本列表本身。【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考