Debian上Laravel的备份与恢复策略
一 备份范围与原则
二 手动备份步骤
mysqldump -u [用户名] -p[密码] [数据库名] > backup.sql
pg_dump -U [用户名] [数据库名] > backup.sql
cd /var/www/your-laravel-app
tar -czvf laravel_backup_$(date +%F_%H-%M-%S).tar.gz .
cp .env /path/to/backup/
cp /etc/nginx/sites-available/your-site.conf /path/to/backup/
cp -r /etc/ssl/certs/your-project /path/to/backup/
tar -czvf storage_backup_$(date +%F).tar.gz storage/
php artisan cache:clear
php artisan config:cache
tar -czvf bootstrap_cache_$(date +%F).tar.gz bootstrap/cache
scp laravel_backup_*.tar.gz user@remote:/backup/
scp backup.sql user@remote:/backup/
三 自动化与保留策略
#!/usr/bin/env bash
set -Eeuo pipefail
BACKUP_DIR="/backup/laravel"
PROJECT_DIR="/var/www/your-laravel-app"
DB_NAME="laravel"
DB_USER="laravel"
DB_PASS="your_db_password"
DATE=$(date +%F_%H-%M-%S)
mkdir -p "$BACKUP_DIR/$DATE"
# 数据库
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/$DATE/db.sql"
# 代码与配置(含 .env)
tar -czf "$BACKUP_DIR/$DATE/app.tar.gz" -C "$PROJECT_DIR" .
# 存储目录
tar -czf "$BACKUP_DIR/$DATE/storage.tar.gz" -C "$PROJECT_DIR" storage
# 可选:清理并备份缓存
php "$PROJECT_DIR/artisan" cache:clear
php "$PROJECT_DIR/artisan" config:cache
tar -czf "$BACKUP_DIR/$DATE/bootstrap_cache.tar.gz" -C "$PROJECT_DIR" bootstrap/cache
# 保留策略:删除 30 天前的备份
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +
# 可选:同步到远程
# rsync -avz --delete "$BACKUP_DIR/" user@remote:/backup/laravel/
0 1 * * * /usr/bin/bash /opt/scripts/backup_laravel.sh >> /var/log/backup.log 2>&1
四 恢复流程
mysql -u [用户名] -p[密码] [数据库名] < backup.sql
psql -U [用户名] [数据库名] < backup.sql
tar -xzvf app_backup_*.tar.gz -C /var/www/your-laravel-app
cp /backup/.env /var/www/your-laravel-app/.env
cp /backup/your-site.conf /etc/nginx/sites-available/your-site.conf
# 如有证书
cp -r /backup/your-project /etc/ssl/certs/your-project
tar -xzvf storage_backup_*.tar.gz -C /var/www/your-laravel-app
tar -xzvf bootstrap_cache_*.tar.gz -C /var/www/your-laravel-app
chown -R www-data:www-data /var/www/your-laravel-app/storage /var/www/your-laravel-app/bootstrap/cache
systemctl reload nginx
# 如有队列/调度
# systemctl restart php*-fpm
五 进阶方案与最佳实践
composer require spatie/laravel-backup
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
php artisan backup:run
rsync -avz --delete /var/www/your-laravel-app/ user@remote:/backup/laravel-app/
duplicity --full-if-older-than 7D /var/www/your-laravel-app file:///backup/laravel-encrypted/