温馨提示×

Debian上Laravel的备份与恢复策略是什么

小樊
34
2025-12-17 02:06:48
栏目: 智能运维

Debian上Laravel的备份与恢复策略

一 备份范围与原则

  • 备份范围应覆盖:数据库(如 MySQL/MariaDBPostgreSQL)、代码与配置(含 .env)、用户上传与日志等存储目录(如 storagepublic/uploads)、以及Web/SSL 配置(如 Nginx/Apache 虚拟主机与证书)。
  • 原则:保持一致性(避免备份过程中写入导致的不一致)、自动化与定期(脚本 + cron)、异地与加密(至少一份异地/云存储)、可验证(定期做恢复演练)。

二 手动备份步骤

  • 数据库备份
    • MySQL/MariaDB:
      mysqldump -u [用户名] -p[密码] [数据库名] > backup.sql
      
    • PostgreSQL:
      pg_dump -U [用户名] [数据库名] > backup.sql
      
  • 项目文件与配置
    • 打包整个项目(含 .env):
      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 到远程主机):
    scp laravel_backup_*.tar.gz user@remote:/backup/
    scp backup.sql user@remote:/backup/
    

三 自动化与保留策略

  • 备份脚本示例(含按日分目录、清理 30 天前备份):
    #!/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/
    
  • 定时任务(每天 01:00 执行):
    0 1 * * * /usr/bin/bash /opt/scripts/backup_laravel.sh >> /var/log/backup.log 2>&1
    
  • 建议:为脚本与备份目录设置最小权限;如用密码直写在命令中,请确保仅 root 可读;生产环境优先使用凭据文件专用备份用户

四 恢复流程

  • 准备:确认 Web 服务与队列已停止或处于维护模式,避免恢复时写入冲突。
  • 数据库恢复
    • MySQL/MariaDB:
      mysql -u [用户名] -p[密码] [数据库名] < backup.sql
      
    • PostgreSQL:
      psql -U [用户名] [数据库名] < backup.sql
      
  • 代码与配置
    • 解压覆盖项目:
      tar -xzvf app_backup_*.tar.gz -C /var/www/your-laravel-app
      
    • 恢复 .env 与证书:
      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
    
  • 收尾:校正权限(如 www-data 属主/属组)、重启服务、退出维护模式,并访问健康检查端点验证。
    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
    

五 进阶方案与最佳实践

  • 使用 spatie/laravel-backup 管理应用级备份(数据库 + 文件、通知、清理策略等):
    composer require spatie/laravel-backup
    php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
    php artisan backup:run
    
  • 系统级与增量方案:
    • rsync 增量同步:
      rsync -avz --delete /var/www/your-laravel-app/ user@remote:/backup/laravel-app/
      
    • duplicity 加密增量(适合异地/云):
      duplicity --full-if-older-than 7D /var/www/your-laravel-app file:///backup/laravel-encrypted/
      
    • BackupNinja 统一编排系统备份任务。
  • 安全与合规:对备份启用加密访问控制;为 .env 与备份文件设置最小权限;定期做恢复演练并验证校验和/一致性;将备份至少一份异地/离线保存。

0