侧边栏壁纸
博主头像
问道小站 博主等级

行动起来,活在当下

  • 累计撰写 5 篇文章
  • 累计创建 3 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Trilium 自动备份到中国科技云数据胶囊(S3)实践

亦然
2026-03-16 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

本文记录使用 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

时间:

每日一次

建议策略:

应用时间
Trilium01:00
Vaultwarden01:30
PostgreSQL02:00
Docker volumes02:30

错开执行避免 IO 或网络拥堵。


七、恢复备份

下载备份文件后:

解密:

gpg -d trilium_backup_2026.tar.gz.gpg > backup.tar.gz

解压:

tar -xzf backup.tar.gz

恢复:

覆盖 data 目录

八、总结

该方案实现了:

  • 自动备份
  • 数据加密
  • 异地存储
  • 自动清理
  • 服务自动恢复

特点:

  • 结构简单
  • 依赖少
  • 容易迁移
  • 可扩展到其它应用

适合:

  • 单服务器
  • 小型家庭服务器
  • 自建知识库
  • Docker 应用环境

0

评论区