
VPS 备份方案:定时打包网站和数据库
有天凌晨三点,我做了个梦:梦见自己手一抖,把网站目录删了。惊醒之后第一个念头不是"还好是梦",而是:如果这是真的,我拿什么恢复?答案是:什么都没有。那天早上送完孩子,我哪儿也没去,直接坐进书房,把备份方案搭了起来。 家里有保险柜放重要文件,服务器也得有个"保险柜"。下面这套方案跑在我这台 2核2G 的机器上,简单、便宜、够用。 先想清楚:备份什么 服务器要备份,家里的证件文件更得备份——我差点因为证件误过事,那篇的教训比这篇还疼。 我的博客是 Hugo 静态站,没有数据库,要备份的东西很清楚: 网站源文件:/var/www/blog 整个目录,包括 markdown 原稿、hugo.toml、主题。原稿丢了,博客就只剩个空壳。 Nginx 配置:/etc/nginx,特别是我手写的那些 server 块。重装系统后照着恢复,十分钟就能复活。 数据库:我这站没有,但脚本里留了 mysqldump 的位置。哪天加了个带数据库的服务,直接把那两行注释打开就行,不用重写脚本。 备份目标就一个原则:能让我从零恢复整站的东西,才值得备份。零零碎碎的日志、缓存,不在名单上。 备份脚本:tar 打包,按日期命名 脚本放在 /root/backup.sh,内容不复杂: #!/bin/bash BACKUP_DIR="/root/backups" DATE=$(date +%Y%m%d) mkdir -p "$BACKUP_DIR" # 打包网站源文件 tar -czf "$BACKUP_DIR/blog-$DATE.tar.gz" -C /var/www blog # 打包 Nginx 配置 tar -czf "$BACKUP_DIR/nginx-$DATE.tar.gz" -C /etc nginx # 如果有数据库,把下面两行打开 # mysqldump -u root -p'你的密码' --all-databases | gzip > "$BACKUP_DIR/mysql-$DATE.sql.gz" # 只保留最近 7 天的备份,旧的自动删 find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete echo "backup done: $DATE" 几个说明:tar -czf 打包加压缩,一行搞定;文件名带日期,blog-20261024.tar.gz 这种,一眼知道是哪天的;最后两行 find ... -delete 是自动清理,只留 7 天。40G 的硬盘经不起无节制堆备份,7 天对个人博客足够了——真出问题,你不会等到第八天才发现。 ...