templave v1
This commit is contained in:
238
docs/backup.md
Normal file
238
docs/backup.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# Database Backup & Restore
|
||||
|
||||
Scripts for backing up and restoring your database.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Create backup
|
||||
make backup
|
||||
|
||||
# List backups
|
||||
ls -la backups/
|
||||
|
||||
# Restore from backup
|
||||
make restore file=backups/laravel_20240306_120000.sql.gz
|
||||
```
|
||||
|
||||
## Backup
|
||||
|
||||
The backup script automatically:
|
||||
- Detects database type (MySQL, PostgreSQL, SQLite)
|
||||
- Creates timestamped backup
|
||||
- Compresses with gzip
|
||||
- Keeps only last 10 backups
|
||||
|
||||
### Manual Backup
|
||||
|
||||
```bash
|
||||
./scripts/backup.sh
|
||||
```
|
||||
|
||||
Output:
|
||||
```
|
||||
==========================================
|
||||
Database Backup
|
||||
==========================================
|
||||
Connection: mysql
|
||||
Database: laravel
|
||||
|
||||
Creating MySQL backup...
|
||||
|
||||
✓ Backup created successfully!
|
||||
File: backups/laravel_20240306_120000.sql.gz
|
||||
Size: 2.5M
|
||||
|
||||
Recent backups:
|
||||
-rw-r--r-- 1 user user 2.5M Mar 6 12:00 laravel_20240306_120000.sql.gz
|
||||
-rw-r--r-- 1 user user 2.4M Mar 5 12:00 laravel_20240305_120000.sql.gz
|
||||
```
|
||||
|
||||
### Backup Location
|
||||
|
||||
```
|
||||
backups/
|
||||
├── laravel_20240306_120000.sql.gz
|
||||
├── laravel_20240305_120000.sql.gz
|
||||
└── laravel_20240304_120000.sql.gz
|
||||
```
|
||||
|
||||
## Restore
|
||||
|
||||
```bash
|
||||
# With make
|
||||
make restore file=backups/laravel_20240306_120000.sql.gz
|
||||
|
||||
# Or directly
|
||||
./scripts/restore.sh backups/laravel_20240306_120000.sql.gz
|
||||
```
|
||||
|
||||
**Warning:** Restore will overwrite the current database!
|
||||
|
||||
## Automated Backups
|
||||
|
||||
### Using Scheduler
|
||||
|
||||
Add to your Laravel scheduler (`routes/console.php`):
|
||||
|
||||
```php
|
||||
use Illuminate\Support\Facades\Schedule;
|
||||
|
||||
// Daily backup at 2 AM
|
||||
Schedule::exec('bash scripts/backup.sh')
|
||||
->dailyAt('02:00')
|
||||
->sendOutputTo(storage_path('logs/backup.log'));
|
||||
```
|
||||
|
||||
### Using Cron (Production)
|
||||
|
||||
```bash
|
||||
# Edit crontab
|
||||
crontab -e
|
||||
|
||||
# Add daily backup at 2 AM
|
||||
0 2 * * * cd /var/www/html && bash scripts/backup.sh >> /var/log/laravel-backup.log 2>&1
|
||||
```
|
||||
|
||||
## Remote Backup Storage
|
||||
|
||||
### Copy to S3
|
||||
|
||||
```bash
|
||||
# Install AWS CLI
|
||||
pip install awscli
|
||||
|
||||
# Configure
|
||||
aws configure
|
||||
|
||||
# Upload backup
|
||||
LATEST=$(ls -t backups/*.gz | head -1)
|
||||
aws s3 cp "$LATEST" s3://your-bucket/backups/
|
||||
```
|
||||
|
||||
### Automate S3 Upload
|
||||
|
||||
Add to `scripts/backup.sh`:
|
||||
|
||||
```bash
|
||||
# After backup creation
|
||||
if command -v aws &> /dev/null; then
|
||||
echo "Uploading to S3..."
|
||||
aws s3 cp "$BACKUP_FILE" "s3://${S3_BUCKET}/backups/"
|
||||
fi
|
||||
```
|
||||
|
||||
### Using Laravel Backup Package
|
||||
|
||||
For more features, use [spatie/laravel-backup](https://github.com/spatie/laravel-backup):
|
||||
|
||||
```bash
|
||||
composer require spatie/laravel-backup
|
||||
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
|
||||
```
|
||||
|
||||
```php
|
||||
// config/backup.php
|
||||
'destination' => [
|
||||
'disks' => ['local', 's3'],
|
||||
],
|
||||
|
||||
// Schedule
|
||||
Schedule::command('backup:run')->daily();
|
||||
Schedule::command('backup:clean')->daily();
|
||||
```
|
||||
|
||||
## Database-Specific Notes
|
||||
|
||||
### MySQL
|
||||
|
||||
```bash
|
||||
# Manual backup
|
||||
docker-compose exec mysql mysqldump -u laravel -p laravel > backup.sql
|
||||
|
||||
# Manual restore
|
||||
docker-compose exec -T mysql mysql -u laravel -p laravel < backup.sql
|
||||
```
|
||||
|
||||
### PostgreSQL
|
||||
|
||||
```bash
|
||||
# Manual backup
|
||||
docker-compose exec pgsql pg_dump -U laravel laravel > backup.sql
|
||||
|
||||
# Manual restore
|
||||
docker-compose exec -T pgsql psql -U laravel laravel < backup.sql
|
||||
```
|
||||
|
||||
### SQLite
|
||||
|
||||
```bash
|
||||
# Manual backup (just copy the file)
|
||||
cp src/database/database.sqlite backups/database_backup.sqlite
|
||||
|
||||
# Manual restore
|
||||
cp backups/database_backup.sqlite src/database/database.sqlite
|
||||
```
|
||||
|
||||
## Backup Strategy
|
||||
|
||||
### Development
|
||||
- Manual backups before major changes
|
||||
- Keep last 5 backups
|
||||
|
||||
### Staging
|
||||
- Daily automated backups
|
||||
- Keep last 7 days
|
||||
|
||||
### Production
|
||||
- Hourly incremental (if supported)
|
||||
- Daily full backup
|
||||
- Weekly backup to offsite storage
|
||||
- Keep 30 days of backups
|
||||
- Test restores monthly
|
||||
|
||||
## Testing Restores
|
||||
|
||||
**Important:** Regularly test your backups!
|
||||
|
||||
```bash
|
||||
# Create test database
|
||||
docker-compose exec mysql mysql -u root -p -e "CREATE DATABASE restore_test;"
|
||||
|
||||
# Restore to test database
|
||||
gunzip -c backups/latest.sql.gz | docker-compose exec -T mysql mysql -u root -p restore_test
|
||||
|
||||
# Verify data
|
||||
docker-compose exec mysql mysql -u root -p restore_test -e "SELECT COUNT(*) FROM users;"
|
||||
|
||||
# Cleanup
|
||||
docker-compose exec mysql mysql -u root -p -e "DROP DATABASE restore_test;"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Backup fails with permission error
|
||||
```bash
|
||||
chmod +x scripts/backup.sh scripts/restore.sh
|
||||
mkdir -p backups
|
||||
chmod 755 backups
|
||||
```
|
||||
|
||||
### Restore fails - database locked
|
||||
```bash
|
||||
# Stop queue workers
|
||||
make queue-stop
|
||||
|
||||
# Run restore
|
||||
make restore file=backups/backup.sql.gz
|
||||
|
||||
# Restart queue workers
|
||||
make queue-start
|
||||
```
|
||||
|
||||
### Large database backup timeout
|
||||
```bash
|
||||
# Increase timeout in docker-compose.yml
|
||||
environment:
|
||||
MYSQL_CONNECT_TIMEOUT: 600
|
||||
```
|
||||
Reference in New Issue
Block a user