101 lines
2.5 KiB
Markdown
101 lines
2.5 KiB
Markdown
# 12. Backup Rsync
|
|
|
|
## Prerequis
|
|
|
|
- Serveur de stockage distant avec acces SSH
|
|
- Cle SSH configuree pour l'acces sans mot de passe
|
|
|
|
## Configurer l'acces SSH
|
|
|
|
```bash
|
|
# Copier la cle SSH de l'utilisateur vers root (le script tourne en root via cron)
|
|
mkdir -p /root/.ssh
|
|
cp /home/<USER>/.ssh/id_* /root/.ssh/
|
|
cp /home/<USER>/.ssh/known_hosts /root/.ssh/
|
|
```
|
|
|
|
Tester :
|
|
```bash
|
|
ssh -p <PORT_SSH_DISTANT> <USER_DISTANT>@<HOST_DISTANT> "echo OK"
|
|
```
|
|
|
|
## Creer la config
|
|
|
|
Creer `/etc/vps-backup.env` :
|
|
|
|
```bash
|
|
REMOTE_USER=<USER_DISTANT>
|
|
REMOTE_HOST=<HOST_DISTANT>
|
|
REMOTE_PORT=<PORT_SSH_DISTANT>
|
|
REMOTE_BASE=<CHEMIN_DISTANT>/backups
|
|
DB_BACKUP_DIR=/tmp/vps-db-backup
|
|
```
|
|
|
|
```bash
|
|
chmod 600 /etc/vps-backup.env
|
|
```
|
|
|
|
## Creer les repertoires distants
|
|
|
|
```bash
|
|
ssh -p <PORT_SSH_DISTANT> <USER_DISTANT>@<HOST_DISTANT> "mkdir -p <CHEMIN_DISTANT>/backups/{db,etc,ispconfig,www}"
|
|
```
|
|
|
|
## Script de backup
|
|
|
|
Creer `/usr/local/bin/vps-backup.sh` :
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
source /etc/vps-backup.env
|
|
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
LOG="/var/log/vps-backup.log"
|
|
|
|
echo "[$DATE] Backup started" >> $LOG
|
|
|
|
# Dump databases
|
|
mkdir -p $DB_BACKUP_DIR
|
|
rm -f $DB_BACKUP_DIR/*.sql.gz $DB_BACKUP_DIR/*.tar.gz
|
|
|
|
for DB in $(mysql -N -e "SHOW DATABASES" | grep -v -E "^(information_schema|performance_schema|sys)$"); do
|
|
mysqldump --single-transaction --routines --triggers "$DB" | gzip > "$DB_BACKUP_DIR/${DB}.sql.gz"
|
|
done
|
|
|
|
# Compresser en tar
|
|
tar -czf "$DB_BACKUP_DIR/all-databases-${DATE}.tar.gz" -C $DB_BACKUP_DIR --exclude="*.tar.gz" . || true
|
|
rm -f $DB_BACKUP_DIR/*.sql.gz
|
|
|
|
# Sync
|
|
rsync -avz -e "ssh -p $REMOTE_PORT" $DB_BACKUP_DIR/*.tar.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_BASE/db/ || echo "[$DATE] DB sync failed" >> $LOG
|
|
rsync -avz --delete -e "ssh -p $REMOTE_PORT" /etc/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_BASE/etc/ || echo "[$DATE] etc sync failed" >> $LOG
|
|
rsync -avz --delete -e "ssh -p $REMOTE_PORT" /usr/local/ispconfig/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_BASE/ispconfig/ || echo "[$DATE] ispconfig sync failed" >> $LOG
|
|
rsync -avz --delete -e "ssh -p $REMOTE_PORT" /var/www/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_BASE/www/ || echo "[$DATE] www sync failed" >> $LOG
|
|
|
|
rm -rf $DB_BACKUP_DIR
|
|
|
|
DATE_END=$(date +%Y%m%d_%H%M%S)
|
|
echo "[$DATE_END] Backup completed" >> $LOG
|
|
```
|
|
|
|
```bash
|
|
chmod 755 /usr/local/bin/vps-backup.sh
|
|
```
|
|
|
|
## Cron quotidien
|
|
|
|
```bash
|
|
crontab -e
|
|
# Ajouter :
|
|
0 2 * * * /usr/local/bin/vps-backup.sh
|
|
```
|
|
|
|
## Tester
|
|
|
|
```bash
|
|
sudo /usr/local/bin/vps-backup.sh
|
|
```
|
|
|
|
> **Piege :** Le script tourne en root via cron. La cle SSH de root doit etre configuree pour l'acces distant.
|