-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathzdbackup.sh
More file actions
140 lines (103 loc) · 4.3 KB
/
zdbackup.sh
File metadata and controls
140 lines (103 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/bin/sh
## Backup of website database and files uploaded to Google Drive with gdrive
## Get gdrive (Google Drive CLI Client) from github.com/prasmussen/gdrive
# Path to gdrive binary
gdrive_path="/home/username/zdbackup/gdrive-linux-x64"
# Location to store backup archives
backup_path="/home/username/zdbackup/backups"
# Path to website public_html or www folder
public_html="/home/username/public_html"
# Database Host, Port, User, Password
database_host="localhost"
database_port="3306"
database_user="root"
database_pass="securepassword"
# Database to backup. Use --all-databases to backup all databases.
database_name="--all-databases"
# Name of folder in Google Drive to create and place backup files.
backup_folder="Website Backups - MyWebsiteName.com"
# Number of backups to keep
number_backup_keep=7
####
startBackup () {
google_folder_id=$1
mysql_backup_filename="$backup_path/mysql_`date +%Y-%m-%d`"
files_backup_filename="$backup_path/files_`date +%Y-%m-%d`"
## Dump MySQL Database(s)
echo "Exporting Database..."
mysqldump --opt --quick --hex-blob --max_allowed_packet=500M --add-drop-table=true --complete-insert=true --compress --lock-tables=false --host="$database_host" --port="$database_port" --user="$database_user" --password="$database_pass" $database_name > $mysql_backup_filename.sql
echo "Archiving Database..."
tar -czpf $mysql_backup_filename.tar.gz -C / $mysql_backup_filename.sql 2>/dev/null
## Archive Site Files
echo "Archiving Site Files..."
tar -czpf $files_backup_filename.tar.gz -C / $public_html --exclude-vcs 2>/dev/null
## Remove SQL Dump if file exists
if [ -f $mysql_backup_filename.sql ] ; then
echo "Cleanup Database Export..."
rm $mysql_backup_filename.sql
fi
echo "Uploading MySQL Archive: $mysql_backup_filename.tar.gz"
$gdrive_path upload --parent $google_folder_id $mysql_backup_filename.tar.gz
echo "Uploading Site Files Archive: $files_backup_filename.tar.gz"
$gdrive_path upload --parent $google_folder_id $files_backup_filename.tar.gz
## Clean Up Old Backup Archives
backup_number_keep=$((number_backup_keep+1))
old_mysql_archive=($(ls -1 $backup_path/mysql_* | sort -r | tail -n +$backup_number_keep | xargs echo))
old_files_archive=($(ls -1 $backup_path/files_* | sort -r | tail -n +$backup_number_keep | xargs echo))
## Remove old MySQL Archives from Google Drive and Local Storage
echo "Clean-Up Old MySQL Archive..."
for filepath in "${old_mysql_archive[@]}"
do
filename=$(basename $filepath)
fileData=$($gdrive_path list -q "mimeType = 'application/x-gzip' AND name='$filename' AND trashed=false" --no-header)
file_data=($fileData)
fileID=${file_data[0]}
if [[ -n "${fileID// }" ]]
then
echo "Removing Old MySQL Archive from Google Drive: $filename"
$gdrive_path delete $fileID
fi
echo "Removing Old Archive: $filename"
rm $filepath
done
## Remove old Site Files Archive from Google Drive and Local Storage
echo "Clean-Up Old Site Files Archive..."
for filepath in "${old_files_archive[@]}"
do
filename=$(basename $filepath)
fileData=$($gdrive_path list -q "mimeType = 'application/x-gzip' AND name='$filename' AND trashed=false" --no-header)
file_data=($fileData)
fileID=${file_data[0]}
if [[ -n "${fileID// }" ]]
then
echo "Removing Old Site File Archive from Google Drive: $filename"
$gdrive_path delete $fileID
fi
echo "Removing Old Archive: $filename"
rm $filepath
done
}
## Find Folder ID if exists
folderData=$($gdrive_path list -q "mimeType = 'application/vnd.google-apps.folder' AND name='$backup_folder' AND trashed=false" --no-header)
## If folder does not exist create new folder.
if [[ -z "${folderData// }" ]]
then
echo 'Creating Folder: $backup_folder'
new_folder=$($gdrive_path mkdir "$backup_folder")
# echo "NewFolder: $new_folder"
new_folder=($new_folder)
folderID=${new_folder[1]}
else
folder_data=($folderData)
folderID=${folder_data[0]}
fi
if [[ -n "${folderID// }" ]]
then
#execute if the the variable is not empty and contains non space characters
echo "FOLDER EXISTS - ID: $folderID"
startBackup $folderID
else
#execute if the variable is empty or contains only spaces
echo "ERROR CREATING FOLDER"
startBackup $folderID
fi