2.5 KiB
2.5 KiB
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
# 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 :
ssh -p <PORT_SSH_DISTANT> <USER_DISTANT>@<HOST_DISTANT> "echo OK"
Creer la config
Creer /etc/vps-backup.env :
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
chmod 600 /etc/vps-backup.env
Creer les repertoires distants
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 :
#!/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
chmod 755 /usr/local/bin/vps-backup.sh
Cron quotidien
crontab -e
# Ajouter :
0 2 * * * /usr/local/bin/vps-backup.sh
Tester
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.