Ubuntu SFTP服务器备份方案
一 备份目标与总体思路
- 备份对象应包含:用户数据目录(如 /home/ 或 SFTP 根目录)、/etc/ssh/ 配置、以及必要的用户与权限信息。这样既能恢复文件,也能快速重建 SFTP 访问。对于使用 SFTPGo 的场景,还需备份其数据卷与数据库(如启用)。
- 推荐策略:采用 rsync over SSH 做增量同步,配合 cron 定时;如需离线归档或跨公网传输,先打包再传输;对关键数据再做一份异地/对象存储的离线或增量备份(如 restic)。
二 方案一 使用 rsync 增量同步到备份机(推荐)
- 适用:你有一台“备份机”(可以是本机外另一台服务器或本机其他磁盘),希望持续、增量地拉取 SFTP 数据。
- 步骤:
- 在备份机上安装 rsync(通常已预装):sudo apt update && sudo apt install -y rsync
- 手动首次全量同步(示例把远程 SFTP 根目录同步到本地 /backup/sftp):
rsync -a -v -z --delete -e ssh sftpuser@your_server_ip:/home/sftpuser/ /backup/sftp/
说明:-a 归档模式(保留权限/属主/时间)、-v 详细、-z 压缩传输、–delete 保持两端一致(谨慎使用)。
- 加入定时任务(每天 02:00 增量同步):
crontab -e
0 2 * * * rsync -a -v -z --delete -e ssh sftpuser@your_server_ip:/home/sftpuser/ /backup/sftp/ >> /var/log/sftp_backup.log 2>&1
- 如需备份 SSH 配置与用户环境:
rsync -a -v /etc/ssh/ backup-server:/backup/etc/ssh/
- 提示:若 SFTP 启用了 Chroot,请确保备份用户对上层目录有读取权限(常见做法是仅备份其可访问的根目录,而非整盘)。
三 方案二 使用 SFTP 客户端脚本自动化备份(适合无 rsync 场景)
- 适用:只能使用 SFTP 协议(例如仅开放 22 端口且不允许 shell 登录),可用脚本自动化下载。
- 方式 A(lftp,支持密码明文在脚本中):
- 安装 lftp:sudo apt install -y lftp
- 备份脚本 backup_sftp.sh(示例把远程目录打包后下载):
#!/usr/bin/env bash
HOST=“your_server_ip”
PORT=“22”
USER=“sftpuser”
PASS=“YourPassword”
REMOTE_DIR=“/home/sftpuser/data”
LOCAL_DIR=“/backup/sftp”
DATE=$(date +%F_%H%M%S)
mkdir -p “$LOCAL_DIR”
sshpass -p “$PASS” ssh -o StrictHostKeyChecking=no “$USER@$HOST” “tar czf - -C ‘$REMOTE_DIR’ .” > “$LOCAL_DIR/backup_$DATE.tar.gz”
echo “Saved $LOCAL_DIR/backup_$DATE.tar.gz”
- 赋权并加入 cron(每天 01:00 执行):
chmod +x backup_sftp.sh
crontab -e
0 1 * * * /path/backup_sftp.sh >> /var/log/sftp_backup.log 2>&1
- 方式 B(原生 sftp + 批处理文件,避免明文密码):
- 生成密钥并在 SFTP 服务器上部署公钥(推荐);
- 创建批处理文件 sftp_batch.txt:
cd /home/sftpuser/data
lcd /backup/sftp
get -r .
- 在 crontab 中调用:
0 1 * * * sftp -b /path/sftp_batch.txt -P 22 sftpuser@your_server_ip >> /var/log/sftp_backup.log 2>&1
- 说明:若服务器做了 Chroot,批处理中的 lcd/cd 应限制在用户根目录内。
四 方案三 容器化 SFTPGo 的备份要点
- 适用:你使用 SFTPGo(Docker 部署),数据可能位于绑定卷或对象存储。
- 步骤:
- 备份数据卷与配置:
假设数据卷挂载在 /data/sftpgo
rsync -a -v /data/sftpgo/ backup-server:/backup/sftpgo/
若使用外部数据库(如 SQLite/PostgreSQL),一并备份数据库文件或导出数据
- 如需对象存储后端,确保启用服务端加密与定期快照/版本控制;离线归档可用 restic/borg 对 /data/sftpgo 做增量备份。
- 恢复时按相同卷结构恢复,再启动容器即可。
五 恢复与校验建议
- 恢复 rsync 备份:
rsync -a -v /backup/sftp/ sftpuser@your_server_ip:/home/sftpuser/(或反向用于回灌)
- 恢复 SSH 配置:
rsync -a -v /backup/etc/ssh/ /etc/ssh/ && sudo systemctl restart sshd
- 校验:
- 文件数量/大小对比:du -sh /backup/sftp /home/sftpuser
- 抽查关键文件权限与属主:ls -l /home/sftpuser
- 抽样校验(重要文件):sha256sum 对比
- 安全与合规:
- 备份机与传输链路尽量使用 SSH 密钥,禁用口令登录;
- 备份保留周期建议至少 7–30 天,并做 异地/离线 副本;
- 对含敏感数据的备份启用 加密 与 访问控制。