Ultima attività 1740064541

quick-backup.sh Raw
1#!/bin/bash
2#####################################################################
3# #
4# Stupidly simple backup script for own projects #
5# #
6# Author: Anthony Axenov (Антон Аксенов) #
7# Version: 1.0 #
8# License: WTFPLv2 More info: https://axenov.dev/?p=1423 #
9# #
10#####################################################################
11
12# database credentials ==============================================
13
14DBUSER=
15DBPASS=
16DBNAME=
17DBCHARSET="utf8"
18
19# date formats ======================================================
20
21FMT_DT_DIR="%Y.%m.%d" # 2021.03.19
22FMT_DT_FILE="%H.%M" # 08.24
23FMT_DT_LOG="%H:%M:%S" # 08:24:15.168149413
24
25# local storage =====================================================
26
27LOCAL_BAK_DIR="/backup/$(date +$FMT_DT_DIR)"
28
29# database backup file
30LOCAL_SQL_FILE="$(date +$FMT_DT_FILE)-db.sql.gz"
31LOCAL_SQL_PATH="$LOCAL_BAK_DIR/$LOCAL_SQL_FILE"
32
33# project path and backup file
34LOCAL_SRC_DIR="/var/www/"
35LOCAL_SRC_FILE="$(date +$FMT_DT_FILE)-src.tar.gz"
36LOCAL_SRC_PATH="$LOCAL_BAK_DIR/$LOCAL_SRC_FILE"
37
38# log file
39LOG_FILE="$(date +$FMT_DT_FILE).log"
40LOG_PATH="$LOCAL_BAK_DIR/$LOG_FILE"
41
42log() {
43 echo -e "[$(date +$FMT_DT_LOG)] $*" | tee -a "$LOG_PATH"
44}
45
46# remote storage ====================================================
47
48REMOTE_HOST="user@example.com"
49REMOTE_BAK_DIR="/backup/$(date +$FMT_DT_DIR)"
50REMOTE_SQL_PATH="$REMOTE_BAK_DIR/$LOCAL_SQL_FILE"
51REMOTE_SRC_PATH="$REMOTE_BAK_DIR/$LOCAL_SRC_FILE"
52REMOTE_LOG_PATH="$REMOTE_BAK_DIR/$LOG_FILE"
53
54# start =============================================================
55
56echo
57log "Start ----------------------------------------------------------------"
58log "Initialized parameters:"
59log "\tDB_USER\t\t= $DB_USER"
60log "\tDB_NAME\t\t= $DB_NAME"
61log "\tDB_CHARSET\t= $DB_CHARSET"
62log "\tLOCAL_SRC_DIR\t= $LOCAL_SRC_DIR"
63log "\tLOCAL_SRC_PATH\t= $LOCAL_SRC_PATH"
64log "\tLOCAL_SQL_PATH\t= $LOCAL_SQL_PATH"
65log "\tLOG_PATH\t= $LOG_PATH"
66log "\tREMOTE_HOST\t= $REMOTE_HOST"
67log "\tREMOTE_SQL_PATH\t= $REMOTE_SQL_PATH"
68log "\tREMOTE_SRC_PATH\t= $REMOTE_SRC_PATH"
69log "\tREMOTE_LOG_PATH\t= $REMOTE_LOG_PATH"
70
71mkdir -p $LOCAL_BAK_DIR
72log "Created local dir: $LOCAL_BAK_DIR"
73
74ssh $REMOTE_HOST mkdir -p $REMOTE_BAK_DIR
75log "Created remote dir: $REMOTE_BAK_DIR"
76
77log "1/4 Dumping DB: $DBNAME..."
78mysqldump \
79 --user="$DBUSER" \
80 --password="$DBPASS" \
81 --default-character-set="$DBCHARSET" \
82 --opt \
83 --quick \
84 "$DBNAME" | gzip > "$LOCAL_SQL_PATH"
85# --opt Same as --add-drop-table, --add-locks, --create-options,
86# --quick, --extended-insert, --lock-tables, --set-charset,
87# and --disable-keys
88[ $? -gt 0 ] && log "ERROR: failed to create dump. Exit-code: $?" || log "\t- OK"
89
90log "2/4 Sending database backup to $REMOTE_HOST..."
91rsync --progress "$LOCAL_SQL_PATH" "$REMOTE_HOST:$REMOTE_SQL_PATH"
92[ $? -gt 0 ] && log "ERROR: failed to send database backup. Exit-code: $?" || log "\t- OK"
93
94log "3/4 Compressing project dir: $LOCAL_SRC_DIR..."
95tar -zcf "$LOCAL_SRC_PATH" "$LOCAL_SRC_DIR"
96[ $? -gt 0 ] && log "ERROR: failed to compress project. Exit-code: $?" || log "\t- OK"
97
98log "4/4 Sending project backup to ${REMOTE_HOST}..."
99rsync --progress "$LOCAL_SRC_PATH" "$REMOTE_HOST:$REMOTE_SRC_PATH"
100[ $? -gt 0 ] && log "ERROR: failed to send project backup. Exit-code: $?" || log "\t- OK"
101
102rsync --progress "$LOG_PATH" "$REMOTE_HOST:$REMOTE_LOG_PATH"
103
104log "Finish!"
105log "Used space: $(du -h "$LOCAL_BAK_DIR" | tail -n1)"
106log "Free space: $(df -h | tail -n1 | awk '{print $4}')"
107