1
1
#! /bin/bash
2
- set -e
2
+ set -eo pipefail
3
3
4
4
# Docker volume for backups
5
5
export BACKUP_PATH=/backups
6
6
7
7
NOTIFICATION_SETTINGS=()
8
8
if [[ -n ${SENTRY_DSN:- } ]]; then
9
- NOTIFICATION_SETTINGS=(-n sentry " --sentry-dsn=${SENTRY_DSN:? } " )
9
+ NOTIFICATION_SETTINGS=(-n sentry " --sentry-dsn=${SENTRY_DSN:? } " )
10
10
fi
11
11
12
12
log () {
@@ -18,44 +18,53 @@ log() {
18
18
upload_backup () {
19
19
local filename=$1
20
20
local remote_path
21
-
21
+ local backup_prefix= $2
22
22
if [[ -z " ${SOFTLAYER_PATH:- } " ]]; then
23
23
log " Skipping upload because no Softlayer path"
24
- upload_backup_cos " ${filename:? } "
24
+ upload_backup_cos " ${filename:? } " " ${backup_prefix :? } "
25
25
return
26
26
fi
27
27
28
28
if [[ -z " ${SOFTLAYER_USER:- } " ]]; then
29
29
log " Skipping upload because no Softlayer user"
30
- upload_backup_cos " ${filename:? } "
30
+ upload_backup_cos " ${filename:? } " " ${backup_prefix :? } "
31
31
return
32
32
fi
33
33
34
34
if [[ -z " ${SOFTLAYER_API_KEY:- } " ]]; then
35
35
log " Skipping upload because no Softlayer api key"
36
- upload_backup_cos " ${filename:? } "
36
+ upload_backup_cos " ${filename:? } " " ${backup_prefix :? } "
37
37
return
38
38
fi
39
39
40
40
remote_path=" ${SOFTLAYER_PATH:? } /$( date +%Y/%m) "
41
41
42
42
log " Uploading backup"
43
43
monsoon " ${NOTIFICATION_SETTINGS[@]} " upload softlayer \
44
- --username " ${SOFTLAYER_USER:? } " \
45
- --api-key " ${SOFTLAYER_API_KEY:? } " \
46
- --datacenter " ${SOFTLAYER_DATACENTER:? } " \
47
- --container " ${SOFTLAYER_CONTAINER:? } " \
48
- --network " ${SOFTLAYER_NETWORK:? } " \
49
- " ${BACKUP_PATH:? } /${filename:? } " \
50
- " ${remote_path:? } /${filename:? } " \
51
- && rm -f " ${BACKUP_PATH:? } /${filename:? } "
52
- log " Done: Uploading backup"
44
+ --username " ${SOFTLAYER_USER:? } " \
45
+ --api-key " ${SOFTLAYER_API_KEY:? } " \
46
+ --datacenter " ${SOFTLAYER_DATACENTER:? } " \
47
+ --container " ${SOFTLAYER_CONTAINER:? } " \
48
+ --network " ${SOFTLAYER_NETWORK:? } " \
49
+ " ${BACKUP_PATH:? } /${filename:? } " \
50
+ " ${remote_path:? } /${filename:? } "
51
+
52
+ if (( $? == 0 )) ; then
53
+
54
+ find ${BACKUP_PATH:? } -type f -regex " .*${backup_prefix:? } .*" -delete
55
+ log " Done: Uploading backup"
56
+ else
57
+
58
+ while [[ " $( find ${BACKUP_PATH:? } -type f -regex " .*${backup_prefix:? } .*" | wc -w) " -ge " ${LOCAL_BACKUP_NUMBER:? } " ]]; do
59
+ rm -f " ${BACKUP_PATH:? } /$( ls -t " ${BACKUP_PATH:? } " | grep " ${backup_prefix:? } " | tail -1) "
60
+ done
61
+ fi
53
62
}
54
63
55
64
upload_backup_cos () {
56
65
local filename=$1
57
66
local remote_path
58
-
67
+ local backup_prefix= $2
59
68
if [[ -z " ${IBM_COS_INSTANCE_ID:- } " ]]; then
60
69
log " Skipping upload because no IBM COS service instance id"
61
70
return
@@ -79,15 +88,23 @@ upload_backup_cos() {
79
88
80
89
log " Uploading backup to IBM COS"
81
90
monsoon " ${NOTIFICATION_SETTINGS[@]} " upload cos \
82
- --endpoint-url " ${IBM_COS_ENDPOINT_URL} " \
83
- --instance-id " ${IBM_COS_INSTANCE_ID} " \
84
- --access-key " ${IBM_COS_ACCESS_KEY} " \
85
- --secret-key " ${IBM_COS_SECRET_KEY} " \
86
- " ${BACKUP_PATH:? } /${filename:? } " \
87
- " ${IBM_COS_BUCKET:? } " \
88
- " ${remote_path:? } " \
89
- && rm -f " ${BACKUP_PATH:? } /${filename:? } "
90
- log " Done: Uploading backup to IBM COS"
91
+ --endpoint-url " ${IBM_COS_ENDPOINT_URL} " \
92
+ --instance-id " ${IBM_COS_INSTANCE_ID} " \
93
+ --access-key " ${IBM_COS_ACCESS_KEY} " \
94
+ --secret-key " ${IBM_COS_SECRET_KEY} " \
95
+ " ${BACKUP_PATH:? } /${filename:? } " \
96
+ " ${IBM_COS_BUCKET:? } " \
97
+ " ${remote_path:? } "
98
+ if (( $? == 0 )) ; then
99
+
100
+ find ${BACKUP_PATH:? } -type f -regex " .*${backup_prefix:? } .*" -delete
101
+ log " Done: Uploading backup to IBM COS"
102
+ else
103
+ while [[ " $( find ${BACKUP_PATH:? } -type f -regex " .*${backup_prefix:? } .*" | wc -w) " -ge " ${LOCAL_BACKUP_NUMBER:? } " ]]; do
104
+ rm -f " ${BACKUP_PATH:? } /$( ls -t " ${BACKUP_PATH:? } " | grep " ${backup_prefix:? } " | tail -1) "
105
+ done
106
+ fi
107
+
91
108
}
92
109
93
110
back_up_mongo () {
@@ -102,14 +119,14 @@ back_up_mongo() {
102
119
103
120
log " Taking mongo backup"
104
121
monsoon " ${NOTIFICATION_SETTINGS[@]} " backup mongo \
105
- -u " ${MONGO_BACKUP_USER} " \
106
- -p " ${MONGO_BACKUP_PASSWORD} " \
107
- --host=" ${MONGO_HOST} " \
108
- --archive=" ${BACKUP_PATH:? } /${filename} " \
109
- --gzip
122
+ -u " ${MONGO_BACKUP_USER} " \
123
+ -p " ${MONGO_BACKUP_PASSWORD} " \
124
+ --host=" ${MONGO_HOST} " \
125
+ --archive=" ${BACKUP_PATH:? } /${filename} " \
126
+ --gzip
110
127
log " Done: Taking mongo backup"
111
128
112
- upload_backup " ${filename:? } "
129
+ upload_backup " ${filename:? } " " mongo_backup "
113
130
}
114
131
115
132
back_up_mysql () {
@@ -124,17 +141,17 @@ back_up_mysql() {
124
141
125
142
log " Taking mysql backup"
126
143
monsoon " ${NOTIFICATION_SETTINGS[@]} " backup mysql \
127
- --output=" ${BACKUP_PATH:? } /${filename} " \
128
- --gzip \
129
- --all-databases \
130
- --single-transaction \
131
- " --host=${MYSQL_HOST:? } " \
132
- " --port=${MYSQL_PORT:? } " \
133
- " --user=${MYSQL_USER:? } " \
134
- " --password=${MYSQL_PASSWORD:? } "
144
+ --output=" ${BACKUP_PATH:? } /${filename} " \
145
+ --gzip \
146
+ --all-databases \
147
+ --single-transaction \
148
+ " --host=${MYSQL_HOST:? } " \
149
+ " --port=${MYSQL_PORT:? } " \
150
+ " --user=${MYSQL_USER:? } " \
151
+ " --password=${MYSQL_PASSWORD:? } "
135
152
log " Done: Taking mysql backup"
136
153
137
- upload_backup " ${filename:? } "
154
+ upload_backup " ${filename:? } " " mysql_backup "
138
155
}
139
156
140
157
# PGDATABASE: gru,nsa,picard,pony,savant,sentry,usher
@@ -160,16 +177,16 @@ back_up_postgresql() {
160
177
filename=postgresql_backup_${database:? } _$( date +" %Y%m%d_%H%M%S" ) .archive.gz
161
178
162
179
monsoon " ${NOTIFICATION_SETTINGS[@]} " backup postgresql \
163
- --output=" ${BACKUP_PATH:? } /${filename} " \
164
- --gzip \
165
- " --host=${PGHOST:? } " \
166
- " --port=${PGPORT:? } " \
167
- " --dbname=${database:? } " \
168
- " --username=${PGUSER:? } " \
169
- " --password" " ${PGPASSWORD:? } "
180
+ --output=" ${BACKUP_PATH:? } /${filename} " \
181
+ --gzip \
182
+ " --host=${PGHOST:? } " \
183
+ " --port=${PGPORT:? } " \
184
+ " --dbname=${database:? } " \
185
+ " --username=${PGUSER:? } " \
186
+ " --password" " ${PGPASSWORD:? } "
170
187
log " Done: Taking PostgreSQL backup of ${database:? } "
171
188
172
- upload_backup " ${filename:? } "
189
+ upload_backup " ${filename:? } " " postgresql_backup "
173
190
done
174
191
}
175
192
@@ -194,14 +211,25 @@ back_up_files() {
194
211
eval $cmd
195
212
log " Done: Taking file backup"
196
213
197
- upload_backup " ${filename:? } "
214
+ upload_backup " ${filename:? } " " files_backup "
198
215
}
199
216
200
217
main () {
201
- back_up_files
202
- back_up_mongo
203
- back_up_mysql
204
- back_up_postgresql
218
+ local available_space_g
219
+ df_out=($( df -m " ${BACKUP_PATH:? } " ) )
220
+ available_space_g=" $(( ${df_out[10]:? } / 1024 )) "
221
+
222
+ if [[ ${available_space_g:? } -ge ${MINIMUM_FREE_SPACE:? } ]]; then
223
+
224
+ back_up_files
225
+ back_up_mongo
226
+ back_up_mysql
227
+ back_up_postgresql
228
+ else
229
+ log " Error: Not Enough Local Storage Space For Backup"
230
+ sentry-cli send-event -m " Not Enough Local Storage Space For Backup, available space ${available_space_g} GB, minimum free space: ${MINIMUM_FREE_SPACE} GB"
231
+ exit 1
232
+ fi
205
233
}
206
234
207
235
main
0 commit comments