如何在Ubuntu 16.04下每月自动将Vultr VPS备份至本地机器?
实现Vultr Ubuntu 16.04 Server每月自动备份到本地Ubuntu机器
嘿,我来帮你搞定这个每月自动备份的需求!咱们一步步来,确保整个流程稳定、可靠,不用你手动操心。
一、先搞定SSH免密登录(关键前提)
要实现自动备份,首先得让本地机器能无密码连接到VPS——毕竟总不能每月手动输密码吧?
- 在你的本地Ubuntu机器上生成SSH密钥:
ssh-keygen -t rsa -b 4096 # 一路回车就行,别设置密钥密码,这样才能自动登录 - 把公钥传到VPS上:
ssh-copy-id your_vps_username@your_vps_ip - 测试免密登录:
如果不用输密码就能进入VPS,这一步就搞定了。ssh your_vps_username@your_vps_ip
二、在VPS上编写备份脚本(数据库+项目文件)
1. 数据库备份(以MySQL/MariaDB为例)
先在VPS上创建备份存储目录:
mkdir -p /var/backups/mysql
然后创建数据库备份脚本/usr/local/bin/backup_mysql.sh:
#!/bin/bash # 替换成你的数据库信息 DB_USER="your_db_username" DB_NAME="your_database_name" BACKUP_DIR="/var/backups/mysql" DATE=$(date +%Y%m%d) # 导出数据库并压缩 mysqldump -u $DB_USER $DB_NAME | gzip > $BACKUP_DIR/db_backup_$DATE.sql.gz # 自动删除3个月前的旧备份,节省空间 find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +90 -delete
重要提示:如果数据库需要密码,绝对不要在脚本里明文写!可以在VPS的
~/.my.cnf里配置:[mysqldump] user=your_db_username password=your_db_password然后设置文件只读权限,防止泄露:
chmod 600 ~/.my.cnf
给脚本加可执行权限,然后手动测试:
chmod +x /usr/local/bin/backup_mysql.sh /usr/local/bin/backup_mysql.sh
去/var/backups/mysql目录看看有没有生成压缩的备份文件。
2. 项目文件备份
同样先创建文件备份目录:
mkdir -p /var/backups/project
创建项目备份脚本/usr/local/bin/backup_project.sh:
#!/bin/bash # 替换成你的项目根目录 PROJECT_DIR="/path/to/your/project" BACKUP_DIR="/var/backups/project" DATE=$(date +%Y%m%d) # 压缩项目文件,排除不需要备份的目录(比如依赖包、日志) tar -czf $BACKUP_DIR/project_backup_$DATE.tar.gz \ --exclude="$PROJECT_DIR/node_modules" \ --exclude="$PROJECT_DIR/logs" \ $PROJECT_DIR # 自动删除3个月前的旧备份 find $BACKUP_DIR -name "project_backup_*.tar.gz" -mtime +90 -delete
加权限并测试:
chmod +x /usr/local/bin/backup_project.sh /usr/local/bin/backup_project.sh
3. 合并备份脚本(可选)
如果想一键执行两个备份,可以创建/usr/local/bin/full_backup.sh:
#!/bin/bash /usr/local/bin/backup_mysql.sh /usr/local/bin/backup_project.sh
加可执行权限:
chmod +x /usr/local/bin/full_backup.sh
三、本地机器定时拉取备份文件
现在让本地机器每月自动触发VPS的备份,再把文件拉回来。
1. 创建本地备份存储目录
mkdir -p /home/your_local_username/backups/vps
2. 编写拉取脚本/usr/local/bin/pull_vps_backups.sh
#!/bin/bash VPS_USER="your_vps_username" VPS_IP="your_vps_ip" LOCAL_BACKUP_DIR="/home/your_local_username/backups/vps" DATE=$(date +%Y%m%d) # 拉取数据库备份 scp $VPS_USER@$VPS_IP:/var/backups/mysql/db_backup_$DATE.sql.gz $LOCAL_BACKUP_DIR/ # 拉取项目文件备份 scp $VPS_USER@$VPS_IP:/var/backups/project/project_backup_$DATE.tar.gz $LOCAL_BACKUP_DIR/ # 本地保留最近6个月的备份,自动清理更早的 find $LOCAL_BACKUP_DIR -name "*.gz" -mtime +180 -delete
加可执行权限:
chmod +x /usr/local/bin/pull_vps_backups.sh
3. 设置cron定时任务
编辑本地机器的cron表:
crontab -e
添加以下两行,设置每月1号凌晨自动执行:
# 每月1号凌晨2点触发VPS执行全备份 0 2 1 * * ssh $VPS_USER@$VPS_IP /usr/local/bin/full_backup.sh # 凌晨2点30分拉取备份到本地(给VPS足够的备份时间) 30 2 1 * * /usr/local/bin/pull_vps_backups.sh
保存退出后,cron会自动生效。可以查看日志确认:
tail -f /var/log/syslog | grep CRON
四、额外的安全与验证建议
- 定期检查备份完整性:每月备份后手动打开一个备份文件,确认数据没损坏。
- 测试恢复流程:偶尔拿备份文件恢复一次数据库和项目,确保备份真的能用。
- 加密敏感数据:如果数据涉及隐私,可以用
gpg加密备份文件后再传输。 - 用rsync替代scp:如果备份文件很大,rsync更高效(只传输变化的部分),把scp命令换成:
rsync -avz $VPS_USER@$VPS_IP:/var/backups/mysql/db_backup_$DATE.sql.gz $LOCAL_BACKUP_DIR/
内容的提问来源于stack exchange,提问作者VJ Ranga
相关产品推荐
相关产品推荐

