本文记录使用 rclone 将服务器应用数据备份到中国科技云数据胶囊(S3兼容存储)的完整实践,并通过 1Panel 定时执行。
目标:
- 自动备份应用数据
- 备份文件加密
- 异地存储
- 自动保留最近7份
- 备份期间保证应用数据一致性
一、总体架构
服务器备份流程:
应用数据
↓
停止容器
↓
tar 打包
↓
gpg 加密
↓
rclone 挂载目录
↓
复制到 S3
↓
删除旧备份
↓
启动容器
存储结构:
S3 bucket
└── backups
└── trilium
├── trilium_backup_2026-03-15_20-12-00.tar.gz.gpg
├── trilium_backup_2026-03-16_20-12-00.tar.gz.gpg
└── ...
二、rclone 挂载 S3
先使用 rclone 挂载中国科技云数据胶囊。
挂载命令:
rclone mount cstbk: /mnt/cst \
--daemon \
--vfs-cache-mode full \
--vfs-cache-max-size 10G \
--vfs-cache-max-age 1h
说明:
| 参数 | 作用 |
|---|---|
--daemon | 后台运行 |
--vfs-cache-mode full | 本地缓存,提高稳定性 |
--vfs-cache-max-size | 最大缓存 |
--vfs-cache-max-age | 缓存过期时间 |
卸载:
fusermount3 -u /mnt/cst
或:
umount /mnt/cst
三、加密密码
创建备份密码文件:
~/.backup_pass
示例:
myStrongPassword
权限必须限制:
chmod 600 ~/.backup_pass
四、备份脚本
路径:
/opt/scripts/backup_trilium_to_cst.sh
脚本:
#!/usr/bin/env bash
set -uo pipefail
APP_DIR="/opt/1panel/apps/trilium/trilium"
SRC_DIR="$APP_DIR/data"
S3_DIR="/mnt/cst/backups/trilium"
TMP_DIR="/tmp"
KEEP=7
PASSFILE="$HOME/.backup_pass"
PASSPHRASE=$(cat "$PASSFILE")
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE="$TMP_DIR/trilium_backup_$DATE.tar.gz"
ENCRYPTED="$ARCHIVE.gpg"
LOG="$HOME/backup.log"
echo "[$(date)] Backup start" >> "$LOG"
docker compose -f "$APP_DIR/docker-compose.yml" stop || true
force_start_container() {
docker compose -f "$APP_DIR/docker-compose.yml" start || true
}
trap force_start_container EXIT
mkdir -p "$S3_DIR"
cd "$APP_DIR"
tar -czf "$ARCHIVE" data
gpg --batch --yes \
--passphrase "$PASSPHRASE" \
--symmetric --cipher-algo AES256 \
-o "$ENCRYPTED" "$ARCHIVE"
if ! cp "$ENCRYPTED" "$S3_DIR/"; then
echo "[$(date)] Warning: cp returned error" >> "$LOG"
fi
rm -f "$ARCHIVE" "$ENCRYPTED"
cd "$S3_DIR"
ls -t trilium_backup_*.tar.gz.gpg 2>/dev/null | tail -n +$((KEEP+1)) | xargs -r rm
echo "[$(date)] Backup finished" >> "$LOG"
五、关键设计
1 停止应用保证一致性
备份前:
docker compose stop
备份后:
docker compose start
避免数据库或文件写入导致数据损坏。
2 trap 确保服务恢复
使用:
trap force_start_container EXIT
无论脚本如何退出,容器都会启动。
3 备份文件加密
使用 GnuPG:
gpg AES256
备份即使泄露也无法读取。
4 保留最近7份
自动清理旧备份:
ls -t trilium_backup_*.tar.gz.gpg | tail -n +8 | xargs rm
避免存储无限增长。
5 处理 FUSE I/O 错误
S3 挂载写入大文件时可能出现:
Input/output error
但文件已成功上传。
脚本通过:
cp ... || true
避免任务失败。
六、1Panel 定时任务
在 1Panel 中创建定时任务:
执行脚本:
/opt/scripts/backup_trilium_to_cst.sh
时间:
每日一次
建议策略:
| 应用 | 时间 |
|---|---|
| Trilium | 01:00 |
| Vaultwarden | 01:30 |
| PostgreSQL | 02:00 |
| Docker volumes | 02:30 |
错开执行避免 IO 或网络拥堵。
七、恢复备份
下载备份文件后:
解密:
gpg -d trilium_backup_2026.tar.gz.gpg > backup.tar.gz
解压:
tar -xzf backup.tar.gz
恢复:
覆盖 data 目录
八、总结
该方案实现了:
- 自动备份
- 数据加密
- 异地存储
- 自动清理
- 服务自动恢复
特点:
- 结构简单
- 依赖少
- 容易迁移
- 可扩展到其它应用
适合:
- 单服务器
- 小型家庭服务器
- 自建知识库
- Docker 应用环境
评论区