Hello,
i’m new with restic.
i have few webserver with mysql (classical LAMP/LEMP) and i want backup my servers with restic.
since i have some account on google drive with unlimited space i want use it to store my backup.
so i write this script, but i’m not more clever, so i ask to review and improve my script. or use it only like a start point to write another script…
#!/bin/bash
set -o pipefail
### requisiti
### apt install restic swaks -y
### yum install restic swaks -y
# installare e configurare restic
# creare repo in $REMOTE_RCLONE $PATH_RCLONE
# creare file con password-file in
# nano /root/restic_password
# chmod 700 /root/restic_password
RESTIC_PW=/root/restic_password
DATA=$(date +"%Y-%m-%d--%H-%M")
# modificare parametri sotto
# path binary
MYSQLDUMP=/usr/bin/mysqldump
BZIP2=/usr/bin/bzip2
SWAKS=/usr/bin/swaks
IONICE=/usr/bin/ionice
NICE=/usr/bin/nice
RESTIC=/usr/bin/restic
RCLONE=/usr/bin/rclone
# parametri restic
HOSTNAME=<name-of-server>
REMOTE_RCLONE=<myremote>
PATH_RCLONE=/bck-server/restic
LOG=/tmp/$DATA-$RANDOM.txt
# da trovare con --- df -Th | grep "^/dev"
FILESYSTEM="/ /boot"
# parametri mysqldump
MYSQL_USER=root
MYSQL_PASSWORD=<my-root-password>
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_BACKUP_DIR=/var/lib/mysql
# parametri mail e smtp
SMTP=<my-smtp>
PORTA=587
USER=<mymail@gmail.com>
PASSWORD=<password-for-specific-app>
DESTINATARIO=<mymail@gmail.com>
### non toccare dopo
SECONDS=0
echo "...---...---...--- Start backup" $DATA | tee -a $LOG
echo "...---...---...--- Executing Restic Database Backup" | tee -a $LOG
$IONICE -c3 $NICE -n19 $MYSQLDUMP --user=$MYSQL_USER --password=$MYSQL_PASSWORD -P $MYSQL_PORT -h $MYSQL_HOST --routines --triggers --events --quick --single-transaction --all-databases | $BZIP2 > $MYSQL_BACKUP_DIR/$DATA-restic-alldb-backup.sql.bz2
if [ $? -ne 0 ]
then
echo "...---...---...--- Restic Database Backup Failed" | tee -a $LOG
echo "...---...---...--- Stop backup" $DATA | tee -a $LOG
$SWAKS --to $DESTINATARIO -s $SMTP:$PORTA -tls --from $USER -au $USER -ap $PASSWORD --header "Subject: Errore Restic backup databases "$HOSTNAME"" --body "Errore Restic backup databases "$HOSTNAME"" --attach $LOG
rm -rf $LOG
exit 2
else
echo "...---...---...--- Restic Database Backup Successful" $DATA | tee -a $LOG
sync;sync
echo "...---...---...--- Restic inizio Backup" $DATA | tee -a $LOG
$RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose unlock | tee -a $LOG
$IONICE -c3 $NICE -n19 $RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose backup --one-file-system $FILESYSTEM | tee -a $LOG
if [ $? -ne 0 ]
then
echo "...---...---...--- Restic Backup Failed" | tee -a $LOG
echo "...---...---...--- Stop backup" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
$SWAKS --to $DESTINATARIO -s $SMTP:$PORTA -tls --from $USER -au $USER -ap $PASSWORD --header "Subject: Errore Restic backup "$HOSTNAME"" --body "Errore Restic backup "$HOSTNAME"" --attach $LOG
rm -rf $MYSQL_BACKUP_DIR/$DATA-restic-alldb-backup.sql.bz2
rm -rf $LOG
exit 2
else
echo "...---...---...--- Restic Backup finito, inizio manutenzione" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
$RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose unlock | tee -a $LOG
echo "...---...---...--- Restic inizio forget" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
$RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose forget --keep-hourly 24 --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 1 | tee -a $LOG
echo "...---...---...--- Restic inizio prune" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
$RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose prune | tee -a $LOG
echo "...---...---...--- Restic inizio check" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
$RESTIC -r rclone:$REMOTE_RCLONE:$PATH_RCLONE --password-file $RESTIC_PW --verbose check | tee -a $LOG
echo "...---...---...--- Manutenzione finita" $(date +"%Y-%m-%d--%H-%M") | tee -a $LOG
duration=$SECONDS
echo "...---...---...--- Tempo totale script - $(($duration /3600)) hours $(($duration %3600/60)) minutes and $(($duration % 60)) seconds." | tee -a $LOG
$SWAKS --to $DESTINATARIO -s $SMTP:$PORTA -tls --from $USER -au $USER -ap $PASSWORD --header "Subject: ok Restic backup "$HOSTNAME"" --body "ok Restic backup "$HOSTNAME"" --attach $LOG
rm -rf $MYSQL_BACKUP_DIR/$DATA-restic-alldb-backup.sql.bz2
rm -rf $LOG
fi
fi
exit
# crontab -e
# # restic backup quotidiano
# 30 5,19 * * * bash -l -c 'bash /root/restic_script.bash' >/dev/null 2>&1
i use
set -o pipefail
because i read that mysqldump and gzip return always ok without this command.
i know is not necessary check and prune every day but is better run once a week or is the same?
i don’t have problem with bandwidth, is only to have a clean and light backup
if you is a valid script when i have ok can stay safe?
thank you
Alex