SuperSync 服务器怎么配置每日自动 PostgreSQL 数据库备份并通过 rclone 上传异地存储?
【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity
Super Productivity 的自托管同步服务(SuperSync Server)把数据库跑在 Docker 化的 PostgreSQL 容器里。服务器是操作日志的中继,但用户账号、Passkey 凭据只存在于服务器端,因此需要定期备份 PostgreSQL 并把备份送到异地。仓库自带了备份脚本 backup.sh 和操作文档 backup-and-recovery.md:脚本生成全量 dump 和账号 dump 两份 gzip 文件,加 cron 就是每日自动备份,设置RCLONE_REMOTE并传--upload参数即可通过 rclone 上传到 B2/S3 等异地存储。本文按文档给出的路径,把这套机制在已部署的 SuperSync 服务器上配置起来。
前提条件
- 已按 README 完成部署:Docker(含 Compose 插件)、
curl、git、jq,通过cp env.example .env配置环境变量后运行./scripts/deploy.sh部署了整套服务。 - 备份脚本默认连接名为
supersync-postgres的 PostgreSQL 容器,数据库用户和库名默认都是supersync。如果你的部署修改过这些值(对应.env中的POSTGRES_USER/POSTGRES_DB,参考 env.example),需要用下表的环境变量覆盖。
文档列出的可配置变量及默认值:
| 变量 | 默认值 | 说明 |
|---|---|---|
BACKUP_DIR | ../backups | 备份文件的存放位置(相对脚本目录,即服务目录下的backups/) |
RETENTION_DAYS | 14 | 删除超过该天数的备份 |
DB_CONTAINER | supersync-postgres | Docker 容器名 |
POSTGRES_USER | supersync | 数据库用户 |
POSTGRES_DB | supersync | 数据库名 |
RCLONE_REMOTE | (空) | 可选的 rclone 远端,用于异地上传 |
第一步:先手动跑一次备份确认脚本可用
在 SuperSync 服务的源码检出目录(即packages/super-sync-server)下执行:
./scripts/backup.sh脚本会依次做四件事:
- 生成账号 dump
supersync_accounts_YYYYMMDD_HHMMSS.sql.gz(只含users和passkeys两张表,文档示例说明其体积很小,通常 <1MB)。它先于全量 dump 生成,确保即使全量 dump 中途失败,账号凭据也有副本。 - 生成全量 dump
supersync_YYYYMMDD_HHMMSS.sql.gz(整个数据库;文档提示活跃实例约 300MB 起,全量 dump 可能耗时较长)。 - 如果传了
--upload且设置了RCLONE_REMOTE,用 rclone 把两个文件拷到远端;--upload但RCLONE_REMOTE为空时会打印警告,rclone 未安装时也会打印警告并跳过上传。 - 清理超过
RETENTION_DAYS天的旧备份。
脚本输出类似(文档中的说明性输出,非固定预期):
==> SuperSync Backup Date: ... Output: .../supersync_YYYYMMDD_HHMMSS.sql.gz Accounts backup size: ... Full backup size: ... ==> Backup complete几个脚本内置的安全细节,理解它们有助于判断输出是否正常:脚本以umask 077运行并把BACKUP_DIR权限设为 700,因为 dump 里含密码哈希和 Passkey 凭据;dump 写入.tmp文件、成功后才改名,失败的运行不会留下看起来完整实则截断的备份;脚本还会清理超过 6 小时没有写入的supersync_*.sql.gz.tmp残留。
第二步:配置 rclone 远端(异地上传的前提)
这一步是可选分支,只有需要异地备份才做;只做本地每日备份可跳过,直接到第三步并把 cron 中的--upload去掉。
文档给出的安装方式(注意副作用:管道安装脚本、以sudo权限向系统安装 rclone):
curl https://rclone.org/install.sh | sudo bash然后交互式配置远端(例如 Backblaze B2,也支持 S3),按提示填入账号信息:
rclone config配置完成后会得到一个 rclone remote 名称,文档中给出的示例有b2:my-bucket/supersync、b2:supersync-backups、s3:my-bucket/supersync等形式,实际以你配置出来的为准。验证方式就是运行脚本时观察是否出现==> Uploading to <RCLONE_REMOTE>...以及Upload complete;若看到Warning: rclone not installed, skipping upload,说明安装没成功。
第三步:配置每日自动备份的 cron
文档给出的每日 3 点执行、保留 3 天的 cron 写法(在部署服务器上以 root 身份执行):
(crontab -l 2>/dev/null; echo "0 3 * * * RETENTION_DAYS=3 flock -n /run/supersync-backup.lock /path/to/scripts/backup.sh >> /var/log/supersync-backup.log 2>&1") | crontab -这条命令会向当前用户的 crontab追加一行(crontab -l先导出已有条目再合并,不覆盖已有计划)。使用它之前需要两处替换,并在 cron 表达式中补上异地上传参数:
/path/to/scripts/backup.sh替换为部署机上备份脚本的绝对路径(文档中的占位写法,脚本要求以绝对路径引用)。- 如果要每日自动上传异地,需要让 cron 里的脚本带
--upload并设置RCLONE_REMOTE。例如:
(crontab -l 2>/dev/null; echo "0 3 * * * RETENTION_DAYS=3 RCLONE_REMOTE=b2:my-bucket/supersync flock -n /run/supersync-backup.lock /path/to/scripts/backup.sh --upload >> /var/log/supersync-backup.log 2>&1") | crontab -其中b2:my-bucket/supersync换成你第二步配置的 remote 名。
两个参数为什么这么写:
flock -n /run/supersync-backup.lock:防止一次缓慢的 dump 与当晚下一次运行重叠。文档特别强调锁文件必须放在/run这类 root 专属目录——放在人人可写的/tmp里,任何本机用户都可能提前占住该路径,让每晚的备份静默失败。RETENTION_DAYS=3:cron 示例用 3 天保留期;脚本默认值是 14 天,按你对本地备份保留周期的要求调整这个值即可。
验证备份是否按预期工作
文档给出的三项检查命令:
# 检查备份存在且大小合理 ls -lh backups/ # 验证 dump 包含合法 SQL gunzip -c backups/supersync_YYYYMMDD_HHMMSS.sql.gz | head -5 # 检查 cron 是否在跑 cat /var/log/supersync-backup.logls -lh backups/应能看到每日新增的supersync_YYYYMMDD_HHMMSS.sql.gz和对应的supersync_accounts_*.sql.gz;gunzip -c ... | head -5能输出 SQL 内容说明归档可解压且是合法 dump(文件名按当天实际生成物替换);/var/log/supersync-backup.log应包含每次运行的输出;若异地上传未生效,日志里会出现Warning: --upload specified but RCLONE_REMOTE not set或Warning: rclone not installed, skipping upload,按提示补环境变量或安装 rclone。
边界与限制
- 备份只覆盖数据库。宿主机快照类备份(如 VPS 厂商的每日快照)不能替代
pg_dump——文档指出对运行中 PostgreSQL 做文件系统级备份可能不具备崩溃一致性,但它可以覆盖配置、TLS 证书、Docker 配置等pg_dump不涉及的服务器状态,两者组合使用效果更好。 - 异地上传只发生在脚本被显式传
--upload且RCLONE_REMOTE非空时;手动运行不带--upload的话只做本地备份和清理。 - 全量 dump 可能耗时数小时(文档以“1-2 h”描述典型窗口,活跃实例约 300MB 起),这正是 cron 里需要
flock的原因;备份会话在pg_stat_activity中以application_name=supersync-backup标识,配套的健康检查脚本对该名称做了长查询豁免。 - 备份如何用于恢复(账号级恢复、全库恢复、单用户回滚)在 backup-and-recovery.md 的 Disaster Recovery 与 Per-User Recovery 章节有完整流程,本文不展开。
【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考