SHOW:
|
|
- or go back to the newest paste.
1 | - | #!/bin/bash |
1 | + | #!/bin/bash |
2 | - | MYSQL_SERVER=localhost |
2 | + | MYSQL_SERVER=localhost |
3 | - | MYSQL_USER=root |
3 | + | MYSQL_USER=root |
4 | - | MYSQL_PASSWORD=*** |
4 | + | MYSQL_PASSWORD=*** |
5 | - | BACKUP_DIR='/tmp/backup' |
5 | + | BACKUP_DIR='/tmp/backup' |
6 | - | PROJECT='SovStaSaves' |
6 | + | PROJECT='SovStaSaves' |
7 | - | MAX_BACKUPS='365' |
7 | + | MAX_BACKUPS='365' |
8 | - | DATE=`date '+%Y-%m-%d'` |
8 | + | DATE=`date '+%Y-%m-%d'` |
9 | - | DIRS='/root/byond/SovietVG/data /root/byond/SovietVG/players2.sqlite' |
9 | + | DIRS='/root/byond/SovietVG/data /root/byond/SovietVG/players2.sqlite' |
10 | - | EXCLUDE=/tmp/backup/exclude.txt |
10 | + | EXCLUDE=/tmp/backup/exclude.txt |
11 | - | TOKEN='***' |
11 | + | TOKEN='***' |
12 | - | LOGFILE='backup.log' |
12 | + | LOGFILE='backup.log' |
13 | - | sendLog='***' |
13 | + | sendLog='***' |
14 | - | sendLogErrorsOnly='false' |
14 | + | sendLogErrorsOnly='false' |
15 | - | ########################### |
15 | + | ########################### |
16 | - | function mailing() |
16 | + | function mailing() |
17 | - | { |
17 | + | { |
18 | - | if [ ! $sendLog = '' ];then |
18 | + | if [ ! $sendLog = '' ];then |
19 | - | if [ "$sendLogErrorsOnly" == true ]; |
19 | + | if [ "$sendLogErrorsOnly" == true ]; |
20 | - | then |
20 | + | then |
21 | - | if echo "$1" | grep -q 'error' |
21 | + | if echo "$1" | grep -q 'error' |
22 | - | then |
22 | + | then |
23 | - | echo "$2" | mail -s "$1" $sendLog > /dev/null |
23 | + | echo "$2" | mail -s "$1" $sendLog > /dev/null |
24 | - | fi |
24 | + | fi |
25 | - | else |
25 | + | else |
26 | - | echo "$2" | mail -s "$1" $sendLog > /dev/null |
26 | + | echo "$2" | mail -s "$1" $sendLog > /dev/null |
27 | - | fi |
27 | + | fi |
28 | - | fi |
28 | + | fi |
29 | - | } |
29 | + | } |
30 | - | |
30 | + | |
31 | - | function logger() |
31 | + | function logger() |
32 | - | { |
32 | + | { |
33 | - | echo "["`date "+%Y-%m-%d %H:%M:%S"`"] File $BACKUP_DIR: $1" >> $BACKUP_DIR/$LOGFILE |
33 | + | echo "["`date "+%Y-%m-%d %H:%M:%S"`"] File $BACKUP_DIR: $1" >> $BACKUP_DIR/$LOGFILE |
34 | - | } |
34 | + | } |
35 | - | |
35 | + | |
36 | - | function parseJson() |
36 | + | function parseJson() |
37 | - | { |
37 | + | { |
38 | - | local output |
38 | + | local output |
39 | - | regex="(\"$1\":[\"]?)([^\",\}]+)([\"]?)" |
39 | + | regex="(\"$1\":[\"]?)([^\",\}]+)([\"]?)" |
40 | - | [[ $2 =~ $regex ]] && output=${BASH_REMATCH[2]} |
40 | + | [[ $2 =~ $regex ]] && output=${BASH_REMATCH[2]} |
41 | - | echo $output |
41 | + | echo $output |
42 | - | } |
42 | + | } |
43 | - | |
43 | + | |
44 | - | function checkError() |
44 | + | function checkError() |
45 | - | { |
45 | + | { |
46 | - | echo $(parseJson 'error' "$1") |
46 | + | echo $(parseJson 'error' "$1") |
47 | - | } |
47 | + | } |
48 | - | |
48 | + | |
49 | - | function getUploadUrl() |
49 | + | function getUploadUrl() |
50 | - | { |
50 | + | { |
51 | - | json_out=`curl -s -H "Authorization: OAuth $TOKEN" https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/$backupName&overwrite=true` |
51 | + | json_out=`curl -s -H "Authorization: OAuth $TOKEN" https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/$backupName&overwrite=true` |
52 | - | json_error=$(checkError "$json_out") |
52 | + | json_error=$(checkError "$json_out") |
53 | - | if [[ $json_error != '' ]]; |
53 | + | if [[ $json_error != '' ]]; |
54 | - | then |
54 | + | then |
55 | - | logger "$PROJECT - Yandex.Disk error: $json_error" |
55 | + | logger "$PROJECT - Yandex.Disk error: $json_error" |
56 | - | mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error" |
56 | + | mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error" |
57 | - | echo '' |
57 | + | echo '' |
58 | - | else |
58 | + | else |
59 | - | output=$(parseJson 'href' $json_out) |
59 | + | output=$(parseJson 'href' $json_out) |
60 | - | echo $output |
60 | + | echo $output |
61 | - | fi |
61 | + | fi |
62 | - | } |
62 | + | } |
63 | - | |
63 | + | |
64 | - | function uploadFile |
64 | + | function uploadFile |
65 | - | { |
65 | + | { |
66 | - | local json_out |
66 | + | local json_out |
67 | - | local uploadUrl |
67 | + | local uploadUrl |
68 | - | local json_error |
68 | + | local json_error |
69 | - | uploadUrl=$(getUploadUrl) |
69 | + | uploadUrl=$(getUploadUrl) |
70 | - | if [[ $uploadUrl != '' ]]; |
70 | + | if [[ $uploadUrl != '' ]]; |
71 | - | then |
71 | + | then |
72 | - | echo $UploadUrl |
72 | + | echo $UploadUrl |
73 | - | json_out=`curl -s -T $1 -H "Authorization: OAuth $TOKEN" $uploadUrl` |
73 | + | json_out=`curl -s -T $1 -H "Authorization: OAuth $TOKEN" $uploadUrl` |
74 | - | json_error=$(checkError "$json_out") |
74 | + | json_error=$(checkError "$json_out") |
75 | - | if [[ $json_error != '' ]]; |
75 | + | if [[ $json_error != '' ]]; |
76 | - | then |
76 | + | then |
77 | - | logger "$PROJECT - Yandex.Disk error: $json_error" |
77 | + | logger "$PROJECT - Yandex.Disk error: $json_error" |
78 | - | mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error" |
78 | + | mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error" |
79 | - | |
79 | + | |
80 | - | else |
80 | + | else |
81 | - | logger "$PROJECT - Copying file to Yandex.Disk success" |
81 | + | logger "$PROJECT - Copying file to Yandex.Disk success" |
82 | - | mailing "$PROJECT - Yandex.Disk backup success" "SUCCESS copy file $FILENAME" |
82 | + | mailing "$PROJECT - Yandex.Disk backup success" "SUCCESS copy file $FILENAME" |
83 | - | |
83 | + | |
84 | - | fi |
84 | + | fi |
85 | - | else |
85 | + | else |
86 | - | echo 'Some errors occured. Check log file for detail' |
86 | + | echo 'Some errors occured. Check log file for detail' |
87 | - | fi |
87 | + | fi |
88 | - | } |
88 | + | } |
89 | - | |
89 | + | |
90 | - | function backups_list() { |
90 | + | function backups_list() { |
91 | - | # Ищем в директории приложения все файлы бекапов и выводим их названия: |
91 | + | # Ищем в директории приложения все файлы бекапов и выводим их названия: |
92 | - | curl -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/&sort=created&limit=100" | tr "{},[]" "\n" | grep "name[[:graph:]]*.tar.gz" | cut -d: -f 2 | tr -d '"' |
92 | + | curl -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/&sort=created&limit=100" | tr "{},[]" "\n" | grep "name[[:graph:]]*.tar.gz" | cut -d: -f 2 | tr -d '"' |
93 | - | } |
93 | + | } |
94 | - | |
94 | + | |
95 | - | function backups_count() { |
95 | + | function backups_count() { |
96 | - | local bkps=$(backups_list | wc -l) |
96 | + | local bkps=$(backups_list | wc -l) |
97 | - | # Если мы бекапим и файлы, и БД, то на 1 бекап у нас приходится 2 файла. Поэтому количество бекапов = количество файлов / 2: |
97 | + | # Если мы бекапим и файлы, и БД, то на 1 бекап у нас приходится 2 файла. Поэтому количество бекапов = количество файлов / 2: |
98 | - | expr $bkps / 2 |
98 | + | expr $bkps / 2 |
99 | - | } |
99 | + | } |
100 | - | |
100 | + | |
101 | - | function remove_old_backups() { |
101 | + | function remove_old_backups() { |
102 | - | bkps=$(backups_count) |
102 | + | bkps=$(backups_count) |
103 | - | old_bkps=$((bkps - MAX_BACKUPS)) |
103 | + | old_bkps=$((bkps - MAX_BACKUPS)) |
104 | - | if [ "$old_bkps" -gt "0" ];then |
104 | + | if [ "$old_bkps" -gt "0" ];then |
105 | - | logger "Удаляем старые бекапы с Яндекс.Диска" |
105 | + | logger "Удаляем старые бекапы с Яндекс.Диска" |
106 | - | # Цикл удаления старых бекапов: |
106 | + | # Цикл удаления старых бекапов: |
107 | - | # Выполняем удаление первого в списке файла 2*old_bkps раз |
107 | + | # Выполняем удаление первого в списке файла 2*old_bkps раз |
108 | - | for i in `eval echo {1..$((old_bkps * 2))}`; do |
108 | + | for i in `eval echo {1..$((old_bkps * 2))}`; do |
109 | - | curl -X DELETE -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk '(NR == 1)')&permanently=true" |
109 | + | curl -X DELETE -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk '(NR == 1)')&permanently=true" |
110 | - | done |
110 | + | done |
111 | - | fi |
111 | + | fi |
112 | - | } |
112 | + | } |
113 | - | |
113 | + | |
114 | - | logger "--- $PROJECT START BACKUP $DATE ---" |
114 | + | logger "--- $PROJECT START BACKUP $DATE ---" |
115 | - | logger "Выгружаем дампы баз" |
115 | + | logger "Выгружаем дампы баз" |
116 | - | mkdir $BACKUP_DIR/$DATE |
116 | + | mkdir $BACKUP_DIR/$DATE |
117 | - | for i in `mysql -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`; |
117 | + | for i in `mysql -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`; |
118 | - | do mysqldump -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD $i > $BACKUP_DIR/$DATE/$i.sql; |
118 | + | do mysqldump -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD $i > $BACKUP_DIR/$DATE/$i.sql; |
119 | - | done |
119 | + | done |
120 | - | |
120 | + | |
121 | - | logger "Создаем архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz" |
121 | + | logger "Создаем архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz" |
122 | - | tar -czf $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz $BACKUP_DIR/$DATE |
122 | + | tar -czf $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz $BACKUP_DIR/$DATE |
123 | - | rm -rf $BACKUP_DIR/$DATE |
123 | + | rm -rf $BACKUP_DIR/$DATE |
124 | - | |
124 | + | |
125 | - | logger "Создаем архив каталогов $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz" |
125 | + | logger "Создаем архив каталогов $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz" |
126 | - | tar -czf $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz -X $EXCLUDE $DIRS |
126 | + | tar -czf $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz -X $EXCLUDE $DIRS |
127 | - | |
127 | + | |
128 | - | FILENAME=$DATE-mysql-$PROJECT.tar.gz |
128 | + | FILENAME=$DATE-mysql-$PROJECT.tar.gz |
129 | - | logger "Выгружаем на Яндекс.Диск архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz" |
129 | + | logger "Выгружаем на Яндекс.Диск архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz" |
130 | - | backupName=$DATE-mysql-$PROJECT.tar.gz |
130 | + | backupName=$DATE-mysql-$PROJECT.tar.gz |
131 | - | uploadFile $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz |
131 | + | uploadFile $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz |
132 | - | |
132 | + | |
133 | - | FILENAME=$DATE-files-$PROJECT.tar.gz |
133 | + | FILENAME=$DATE-files-$PROJECT.tar.gz |
134 | - | logger "Выгружаем на Яндекс.Диск архив с файлами $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz" |
134 | + | logger "Выгружаем на Яндекс.Диск архив с файлами $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz" |
135 | - | backupName=$DATE-files-$PROJECT.tar.gz |
135 | + | backupName=$DATE-files-$PROJECT.tar.gz |
136 | - | uploadFile $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz |
136 | + | uploadFile $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz |
137 | - | |
137 | + | |
138 | - | logger "Удаляем архивы с диска" |
138 | + | logger "Удаляем архивы с диска" |
139 | - | find $BACKUP_DIR -type f -name "*.gz" -exec rm '{}' \; |
139 | + | find $BACKUP_DIR -type f -name "*.gz" -exec rm '{}' \; |
140 | - | |
140 | + | |
141 | - | # Удаляем старые бекапы с Яндекс.Диска (если MAX_BACKUPS > 0) |
141 | + | # Удаляем старые бекапы с Яндекс.Диска (если MAX_BACKUPS > 0) |
142 | - | if [ $MAX_BACKUPS -gt 0 ];then remove_old_backups; fi |
142 | + | if [ $MAX_BACKUPS -gt 0 ];then remove_old_backups; fi |
143 | - | |
143 | + | |
144 | logger "Завершение скрипта бекапа" |