s3-backup.sh
· 10 KiB · Bash
Неформатований
#!/bin/bash
#####################################################################
# #
# Stupidly simple backup script for own projects #
# #
# Author: Anthony Axenov (Антон Аксенов) #
# Version: 1.2 #
# License: WTFPLv2 More info (RU): https://axenov.dev/?p=1272 #
# #
#####################################################################
# use remote storages ===============================================
USE_SSH=1
USE_S3=1
# database credentials ==============================================
DBUSER=
DBPASS=
DBNAME=
DBCHARSET="utf8"
# dates for file structure ==========================================
TODAY_DIR="$(date +%Y.%m.%d)"
TODAY_FILE="$(date +%H.%M)"
# local storage =====================================================
LOCAL_BAK_DIR="/backup"
LOCAL_BAK_PATH="$LOCAL_BAK_DIR/$TODAY_DIR"
# database backup file
LOCAL_SQL_FILE="$TODAY_FILE-db.sql.gz"
LOCAL_SQL_PATH="$LOCAL_BAK_PATH/$LOCAL_SQL_FILE"
# project path and backup file
LOCAL_SRC_DIR="/var/www/html"
LOCAL_SRC_FILE="$TODAY_FILE-src.tar.gz"
LOCAL_SRC_PATH="$LOCAL_BAK_PATH/$LOCAL_SRC_FILE"
# log file
LOG_FILE="$TODAY_FILE.log"
LOG_PATH="$LOCAL_BAK_PATH/$LOG_FILE"
# remote storages ===================================================
SSH_HOST="user@example.com"
SSH_BAK_DIR="/backup"
SSH_BAK_PATH="$SSH_BAK_DIR/$TODAY_DIR"
SSH_SQL_FILE="$SSH_BAK_PATH/$LOCAL_SQL_FILE"
SSH_SRC_FILE="$SSH_BAK_PATH/$LOCAL_SRC_FILE"
SSH_LOG_FILE="$SSH_BAK_PATH/$LOG_FILE"
S3_BUCKET="s3://my.bucket"
S3_DIR="$S3_BUCKET/$TODAY_DIR"
S3_SQL_FILE="$S3_DIR/$LOCAL_SQL_FILE"
S3_SRC_FILE="$S3_DIR/$LOCAL_SRC_FILE"
S3_LOG_FILE="$S3_DIR/$LOG_FILE"
# autoremove ========================================================
# time to live on different storages
TTL_LOCAL=3
TTL_SSH=7
TTL_S3=60
# autoremove flags
CLEAR_SSH=1
CLEAR_S3=1
# notifications =====================================================
USE_NTFY=1
NTFY_TITLE="Backup script"
NTFY_CHANNEL=
#====================================================================
#
# Functions used for the whole backup flow
#
#====================================================================
# prints arguments to stdout and into log file
log() {
echo -e "[$(date +%H:%M:%S)] $*" | tee -a "$LOG_PATH"
}
# sends notification with information
ntfy_info() {
[ $USE_NTFY == 1 ] && ntfy send \
--title "$NTFY_TITLE" \
--message "$1" \
--priority 1 \
"$NTFY_CHANNEL"
}
# sends notification with warning
ntfy_warn() {
[ $USE_NTFY == 1 ] && ntfy send \
--title "$NTFY_TITLE" \
--tags "warning" \
--message "$1" \
--priority 5 \
"$NTFY_CHANNEL"
}
# prints initialized parameters
show_params() {
log "Initialized parameters:"
log "├ [ Remotes ]"
log "│\t├ USE_SSH = $USE_SSH"
[ $USE_SSH == 1 ] && log "│\t├ SSH_HOST = $SSH_HOST"
log "│\t├ USE_S3 = $USE_S3"
[ $USE_S3 == 1 ] && log "│\t├ S3_BUCKET = $S3_BUCKET"
log "├ [ Database ]"
log "│\t├ DBUSER = $DBUSER"
log "│\t├ DBNAME = $DBNAME"
log "│\t├ DBCHARSET = $DBCHARSET"
log "│\t├ LOCAL_SQL_PATH = $LOCAL_SQL_PATH"
[ $USE_SSH == 1 ] && log "│\t├ SSH_SQL_FILE = $SSH_SQL_FILE"
[ $USE_S3 == 1 ] && log "│\t├ S3_SQL_FILE = $S3_SQL_FILE"
log "├ [ Sources ]"
log "│\t├ LOCAL_SRC_DIR = $LOCAL_SRC_DIR"
log "│\t├ LOCAL_SRC_PATH = $LOCAL_SRC_PATH"
[ $USE_SSH == 1 ] && log "│\t├ SSH_SRC_FILE = $SSH_SRC_FILE"
[ $USE_S3 == 1 ] && log "│\t├ S3_SRC_FILE = $S3_SRC_FILE"
log "├ [ Log ]"
log "│\t├ LOG_PATH = $LOG_PATH"
[ $USE_SSH == 1 ] && log "│\t├ SSH_LOG_FILE = $SSH_LOG_FILE"
[ $USE_S3 == 1 ] && log "│\t├ S3_LOG_FILE = $S3_LOG_FILE"
log "├ [ Autoclear ]"
log "│\t├ TTL_LOCAL = $TTL_LOCAL"
[ $USE_SSH == 1 ] && {
log "│\t├ CLEAR_SSH = $CLEAR_SSH"
log "│\t├ TTL_SSH = $TTL_SSH"
}
[ $USE_S3 == 1 ] && {
log "│\t├ CLEAR_S3 = $CLEAR_S3"
log "│\t├ TTL_S3 = $TTL_S3"
}
log "└ [ ntfy ]"
log "\t├ USE_NTFY = $USE_NTFY"
[ $USE_NTFY == 1 ] && log "\t├ NTFY_TITLE = $NTFY_TITLE"
[ $USE_NTFY == 1 ] && log "\t└ NTFY_CHANNEL = $NTFY_CHANNEL"
}
# initializes directories for backup
init_dirs() {
if [ ! -d "$LOCAL_BAK_PATH" ]; then
mkdir -p $LOCAL_BAK_PATH
fi
[ $USE_SSH == 1 ] && ssh $SSH_HOST "mkdir -p $SSH_BAK_PATH"
}
# clears old local backups
clear_local_backups() {
log "\tLocal:"
log $(find "$LOCAL_BAK_DIR" -type d -mtime +"$TTL_LOCAL" | sort)
find "$LOCAL_BAK_DIR" -type d -mtime +"$TTL_LOCAL" | xargs rm -rf
}
# clears old backups on remote ssh storage
clear_ssh_backups() {
if [ $USE_SSH == 1 ] && [ $CLEAR_SSH == 1 ]; then
log "\tSSH:"
log $(ssh "$SSH_HOST" "find $SSH_BAK_DIR -type d -mtime +$TTL_SSH" | sort)
ssh "$SSH_HOST" "find $SSH_BAK_DIR -type d -mtime +$TTL_SSH | xargs rm -rf"
else
log "\tSSH: disabled (\$USE_SSH, \$CLEAR_SSH)"
fi
}
# clears backups on remote s3 storage
clear_s3_backups() {
# https://gist.github.com/JProffitt71/9044744?permalink_comment_id=3539681#gistcomment-3539681
if [ $USE_S3 == 1 ] && [ $CLEAR_S3 == 1 ]; then
log "\tS3:"
OLDER_THAN=$(date -d "$TTL_S3 days ago" "+%s")
s3cmd ls -r $S3_DIR | while read -r line; do
FILETIME=$(echo "$line" | awk {'print $1" "$2'})
FILETIME=$(date -d "$FILETIME" "+%s")
if [[ $FILETIME -le $OLDER_THAN ]]; then
FILEPATH=$(echo "$line" | awk {'print $4'})
if [ $FILEPATH != "" ]; then
log "$line"
s3cmd del $FILEPATH
fi
fi
done
else
log "\tS3: disabled (\$USE_S3 + \$CLEAR_S3)"
fi
}
# clears old backups
clear_backups() {
echo
log "1/7 Removing old backups..."
clear_local_backups
clear_ssh_backups
clear_s3_backups
}
# makes archive with database dump
backup_db() {
echo
log "2/7 Dumping DB: $DBNAME..."
mysqldump \
--user=$DBUSER \
--password=$DBPASS \
--opt \
--default-character-set=$DBCHARSET \
--quick \
$DBNAME | gzip > $LOCAL_SQL_PATH
if [ $? == 0 ]; then
log "\t- OK"
send_db_ssh
send_db_s3
else
log "\t- ERROR: failed to create dump. Exit-code: $?"
ntfy_warn "ERROR: failed to create dump"
log "3/7 Sending database backup to $SSH_HOST... skipped"
log "4/7 Sending database backup to $S3_DIR... skipped"
fi
}
# sends database archive into ssh remote storage
send_db_ssh() {
echo
log "3/7 Sending database backup to $SSH_HOST..."
if [ $USE_SSH == 1 ]; then
rsync --progress "$LOCAL_SQL_PATH" "$SSH_HOST:$SSH_SQL_FILE"
if [ $? == 0 ]; then
log "\t- OK"
else
log "\t- ERROR: failed to send DB backup to $SSH_HOST. Exit-code: $?"
ntfy_warn "ERROR: failed to send DB backup to $SSH_HOST"
fi
else
log "\t- disabled (\$USE_SSH)"
fi
}
# sends database archive into s3 remote storage
send_db_s3() {
echo
log "4/7 Sending database backup to $S3_DIR..."
if [ $USE_S3 == 1 ]; then
s3cmd put "$LOCAL_SQL_PATH" "$S3_SQL_FILE"
if [ $? == 0 ]; then
log "\t- OK"
else
log "\t- ERROR: failed to send DB backup to $S3_DIR. Exit-code: $?"
ntfy_warn "ERROR: failed to send DB backup to $S3_DIR"
fi
else
log "\t- disabled (\$USE_SSH)"
fi
}
# makes archive with project sources
backup_src() {
echo
log "5/7 Compressing project dir: $LOCAL_SRC_DIR..."
tar -zcf "$LOCAL_SRC_PATH" "$LOCAL_SRC_DIR"
if [ $? == 0 ]; then
log "\t- OK"
send_src_ssh
send_src_s3
else
log "\t- ERROR: failed to compress project. Exit-code: $?"
ntfy_warn "ERROR: failed to compress project"
log "6/7 Sending project backup to $SSH_HOST... skipped"
log "7/7 Sending project backup to $S3_DIR... skipped"
fi
}
# sends sources archive into ssh remote storage
send_src_ssh() {
echo
log "6/7 Sending project backup to $SSH_HOST..."
if [ $USE_SSH == 1 ]; then
rsync --progress "$LOCAL_SRC_PATH" "$SSH_HOST:$SSH_SRC_FILE"
if [ $? == 0 ]; then
log "\t- OK"
else
log "\t- ERROR: failed to send project backup to $SSH_HOST. Exit-code: $?"
ntfy_warn "ERROR: failed to send project backup to $SSH_HOST"
fi
else
log "\t- disabled"
fi
}
# sends sources archive into s3 remote storage
send_src_s3() {
echo
log "7/7 Sending project backup to $S3_DIR..."
s3cmd put "$LOCAL_SRC_PATH" "$S3_SRC_FILE"
if [ $? == 0 ]; then
log "\t- OK"
else
log "\t- ERROR: failed to send database backup to $S3_DIR. Exit-code: $?"
ntfy_warn "ERROR: failed to send project backup to $S3_DIR"
fi
}
# prints used/free space on local storage
show_finish() {
echo
log "Finish!"
log "Used space: $(du -h "$LOCAL_BAK_PATH" | tail -n1)" # вывод размера папки с бэкапами за текущий день
log "Free space: $(df -h "$LOCAL_BAK_PATH" | tail -n1 | awk '{print $4}')" # вывод свободного места на локальном диске
echo
}
# sends log file into both remote storage
send_log() {
[ $USE_SSH == 1 ] && rsync --progress "$LOG_PATH" "$SSH_HOST:$SSH_LOG_FILE"
[ $USE_S3 == 1 ] && s3cmd put "$LOG_PATH" "$S3_LOG_FILE"
}
# main flow =========================================================
log "Start ----------------------------------------------------------"
show_params
init_dirs
clear_backups
backup_db
backup_src
show_finish
send_log
ntfy_info "Finish!"
1 | #!/bin/bash |
2 | ##################################################################### |
3 | # # |
4 | # Stupidly simple backup script for own projects # |
5 | # # |
6 | # Author: Anthony Axenov (Антон Аксенов) # |
7 | # Version: 1.2 # |
8 | # License: WTFPLv2 More info (RU): https://axenov.dev/?p=1272 # |
9 | # # |
10 | ##################################################################### |
11 | |
12 | # use remote storages =============================================== |
13 | |
14 | USE_SSH=1 |
15 | USE_S3=1 |
16 | |
17 | # database credentials ============================================== |
18 | |
19 | DBUSER= |
20 | DBPASS= |
21 | DBNAME= |
22 | DBCHARSET="utf8" |
23 | |
24 | # dates for file structure ========================================== |
25 | |
26 | TODAY_DIR="$(date +%Y.%m.%d)" |
27 | TODAY_FILE="$(date +%H.%M)" |
28 | |
29 | # local storage ===================================================== |
30 | |
31 | LOCAL_BAK_DIR="/backup" |
32 | LOCAL_BAK_PATH="$LOCAL_BAK_DIR/$TODAY_DIR" |
33 | |
34 | # database backup file |
35 | LOCAL_SQL_FILE="$TODAY_FILE-db.sql.gz" |
36 | LOCAL_SQL_PATH="$LOCAL_BAK_PATH/$LOCAL_SQL_FILE" |
37 | |
38 | # project path and backup file |
39 | LOCAL_SRC_DIR="/var/www/html" |
40 | LOCAL_SRC_FILE="$TODAY_FILE-src.tar.gz" |
41 | LOCAL_SRC_PATH="$LOCAL_BAK_PATH/$LOCAL_SRC_FILE" |
42 | |
43 | # log file |
44 | LOG_FILE="$TODAY_FILE.log" |
45 | LOG_PATH="$LOCAL_BAK_PATH/$LOG_FILE" |
46 | |
47 | # remote storages =================================================== |
48 | |
49 | SSH_HOST="user@example.com" |
50 | SSH_BAK_DIR="/backup" |
51 | SSH_BAK_PATH="$SSH_BAK_DIR/$TODAY_DIR" |
52 | SSH_SQL_FILE="$SSH_BAK_PATH/$LOCAL_SQL_FILE" |
53 | SSH_SRC_FILE="$SSH_BAK_PATH/$LOCAL_SRC_FILE" |
54 | SSH_LOG_FILE="$SSH_BAK_PATH/$LOG_FILE" |
55 | |
56 | S3_BUCKET="s3://my.bucket" |
57 | S3_DIR="$S3_BUCKET/$TODAY_DIR" |
58 | S3_SQL_FILE="$S3_DIR/$LOCAL_SQL_FILE" |
59 | S3_SRC_FILE="$S3_DIR/$LOCAL_SRC_FILE" |
60 | S3_LOG_FILE="$S3_DIR/$LOG_FILE" |
61 | |
62 | # autoremove ======================================================== |
63 | |
64 | # time to live on different storages |
65 | TTL_LOCAL=3 |
66 | TTL_SSH=7 |
67 | TTL_S3=60 |
68 | |
69 | # autoremove flags |
70 | CLEAR_SSH=1 |
71 | CLEAR_S3=1 |
72 | |
73 | # notifications ===================================================== |
74 | |
75 | USE_NTFY=1 |
76 | NTFY_TITLE="Backup script" |
77 | NTFY_CHANNEL= |
78 | |
79 | #==================================================================== |
80 | # |
81 | # Functions used for the whole backup flow |
82 | # |
83 | #==================================================================== |
84 | |
85 | # prints arguments to stdout and into log file |
86 | log() { |
87 | echo -e "[$(date +%H:%M:%S)] $*" | tee -a "$LOG_PATH" |
88 | } |
89 | |
90 | # sends notification with information |
91 | ntfy_info() { |
92 | [ $USE_NTFY == 1 ] && ntfy send \ |
93 | --title "$NTFY_TITLE" \ |
94 | --message "$1" \ |
95 | --priority 1 \ |
96 | "$NTFY_CHANNEL" |
97 | } |
98 | |
99 | # sends notification with warning |
100 | ntfy_warn() { |
101 | [ $USE_NTFY == 1 ] && ntfy send \ |
102 | --title "$NTFY_TITLE" \ |
103 | --tags "warning" \ |
104 | --message "$1" \ |
105 | --priority 5 \ |
106 | "$NTFY_CHANNEL" |
107 | } |
108 | |
109 | # prints initialized parameters |
110 | show_params() { |
111 | log "Initialized parameters:" |
112 | |
113 | log "├ [ Remotes ]" |
114 | log "│\t├ USE_SSH = $USE_SSH" |
115 | [ $USE_SSH == 1 ] && log "│\t├ SSH_HOST = $SSH_HOST" |
116 | log "│\t├ USE_S3 = $USE_S3" |
117 | [ $USE_S3 == 1 ] && log "│\t├ S3_BUCKET = $S3_BUCKET" |
118 | |
119 | log "├ [ Database ]" |
120 | log "│\t├ DBUSER = $DBUSER" |
121 | log "│\t├ DBNAME = $DBNAME" |
122 | log "│\t├ DBCHARSET = $DBCHARSET" |
123 | log "│\t├ LOCAL_SQL_PATH = $LOCAL_SQL_PATH" |
124 | [ $USE_SSH == 1 ] && log "│\t├ SSH_SQL_FILE = $SSH_SQL_FILE" |
125 | [ $USE_S3 == 1 ] && log "│\t├ S3_SQL_FILE = $S3_SQL_FILE" |
126 | |
127 | log "├ [ Sources ]" |
128 | log "│\t├ LOCAL_SRC_DIR = $LOCAL_SRC_DIR" |
129 | log "│\t├ LOCAL_SRC_PATH = $LOCAL_SRC_PATH" |
130 | [ $USE_SSH == 1 ] && log "│\t├ SSH_SRC_FILE = $SSH_SRC_FILE" |
131 | [ $USE_S3 == 1 ] && log "│\t├ S3_SRC_FILE = $S3_SRC_FILE" |
132 | |
133 | log "├ [ Log ]" |
134 | log "│\t├ LOG_PATH = $LOG_PATH" |
135 | [ $USE_SSH == 1 ] && log "│\t├ SSH_LOG_FILE = $SSH_LOG_FILE" |
136 | [ $USE_S3 == 1 ] && log "│\t├ S3_LOG_FILE = $S3_LOG_FILE" |
137 | |
138 | log "├ [ Autoclear ]" |
139 | log "│\t├ TTL_LOCAL = $TTL_LOCAL" |
140 | [ $USE_SSH == 1 ] && { |
141 | log "│\t├ CLEAR_SSH = $CLEAR_SSH" |
142 | log "│\t├ TTL_SSH = $TTL_SSH" |
143 | } |
144 | [ $USE_S3 == 1 ] && { |
145 | log "│\t├ CLEAR_S3 = $CLEAR_S3" |
146 | log "│\t├ TTL_S3 = $TTL_S3" |
147 | } |
148 | |
149 | log "└ [ ntfy ]" |
150 | log "\t├ USE_NTFY = $USE_NTFY" |
151 | [ $USE_NTFY == 1 ] && log "\t├ NTFY_TITLE = $NTFY_TITLE" |
152 | [ $USE_NTFY == 1 ] && log "\t└ NTFY_CHANNEL = $NTFY_CHANNEL" |
153 | } |
154 | |
155 | # initializes directories for backup |
156 | init_dirs() { |
157 | if [ ! -d "$LOCAL_BAK_PATH" ]; then |
158 | mkdir -p $LOCAL_BAK_PATH |
159 | fi |
160 | [ $USE_SSH == 1 ] && ssh $SSH_HOST "mkdir -p $SSH_BAK_PATH" |
161 | } |
162 | |
163 | # clears old local backups |
164 | clear_local_backups() { |
165 | log "\tLocal:" |
166 | log $(find "$LOCAL_BAK_DIR" -type d -mtime +"$TTL_LOCAL" | sort) |
167 | find "$LOCAL_BAK_DIR" -type d -mtime +"$TTL_LOCAL" | xargs rm -rf |
168 | } |
169 | |
170 | # clears old backups on remote ssh storage |
171 | clear_ssh_backups() { |
172 | if [ $USE_SSH == 1 ] && [ $CLEAR_SSH == 1 ]; then |
173 | log "\tSSH:" |
174 | log $(ssh "$SSH_HOST" "find $SSH_BAK_DIR -type d -mtime +$TTL_SSH" | sort) |
175 | ssh "$SSH_HOST" "find $SSH_BAK_DIR -type d -mtime +$TTL_SSH | xargs rm -rf" |
176 | else |
177 | log "\tSSH: disabled (\$USE_SSH, \$CLEAR_SSH)" |
178 | fi |
179 | } |
180 | |
181 | # clears backups on remote s3 storage |
182 | clear_s3_backups() { |
183 | # https://gist.github.com/JProffitt71/9044744?permalink_comment_id=3539681#gistcomment-3539681 |
184 | if [ $USE_S3 == 1 ] && [ $CLEAR_S3 == 1 ]; then |
185 | log "\tS3:" |
186 | OLDER_THAN=$(date -d "$TTL_S3 days ago" "+%s") |
187 | s3cmd ls -r $S3_DIR | while read -r line; do |
188 | FILETIME=$(echo "$line" | awk {'print $1" "$2'}) |
189 | FILETIME=$(date -d "$FILETIME" "+%s") |
190 | if [[ $FILETIME -le $OLDER_THAN ]]; then |
191 | FILEPATH=$(echo "$line" | awk {'print $4'}) |
192 | if [ $FILEPATH != "" ]; then |
193 | log "$line" |
194 | s3cmd del $FILEPATH |
195 | fi |
196 | fi |
197 | done |
198 | else |
199 | log "\tS3: disabled (\$USE_S3 + \$CLEAR_S3)" |
200 | fi |
201 | } |
202 | |
203 | # clears old backups |
204 | clear_backups() { |
205 | echo |
206 | log "1/7 Removing old backups..." |
207 | clear_local_backups |
208 | clear_ssh_backups |
209 | clear_s3_backups |
210 | } |
211 | |
212 | # makes archive with database dump |
213 | backup_db() { |
214 | echo |
215 | log "2/7 Dumping DB: $DBNAME..." |
216 | mysqldump \ |
217 | --user=$DBUSER \ |
218 | --password=$DBPASS \ |
219 | --opt \ |
220 | --default-character-set=$DBCHARSET \ |
221 | --quick \ |
222 | $DBNAME | gzip > $LOCAL_SQL_PATH |
223 | if [ $? == 0 ]; then |
224 | log "\t- OK" |
225 | send_db_ssh |
226 | send_db_s3 |
227 | else |
228 | log "\t- ERROR: failed to create dump. Exit-code: $?" |
229 | ntfy_warn "ERROR: failed to create dump" |
230 | log "3/7 Sending database backup to $SSH_HOST... skipped" |
231 | log "4/7 Sending database backup to $S3_DIR... skipped" |
232 | fi |
233 | } |
234 | |
235 | # sends database archive into ssh remote storage |
236 | send_db_ssh() { |
237 | echo |
238 | log "3/7 Sending database backup to $SSH_HOST..." |
239 | if [ $USE_SSH == 1 ]; then |
240 | rsync --progress "$LOCAL_SQL_PATH" "$SSH_HOST:$SSH_SQL_FILE" |
241 | if [ $? == 0 ]; then |
242 | log "\t- OK" |
243 | else |
244 | log "\t- ERROR: failed to send DB backup to $SSH_HOST. Exit-code: $?" |
245 | ntfy_warn "ERROR: failed to send DB backup to $SSH_HOST" |
246 | fi |
247 | else |
248 | log "\t- disabled (\$USE_SSH)" |
249 | fi |
250 | } |
251 | |
252 | # sends database archive into s3 remote storage |
253 | send_db_s3() { |
254 | echo |
255 | log "4/7 Sending database backup to $S3_DIR..." |
256 | if [ $USE_S3 == 1 ]; then |
257 | s3cmd put "$LOCAL_SQL_PATH" "$S3_SQL_FILE" |
258 | if [ $? == 0 ]; then |
259 | log "\t- OK" |
260 | else |
261 | log "\t- ERROR: failed to send DB backup to $S3_DIR. Exit-code: $?" |
262 | ntfy_warn "ERROR: failed to send DB backup to $S3_DIR" |
263 | fi |
264 | else |
265 | log "\t- disabled (\$USE_SSH)" |
266 | fi |
267 | } |
268 | |
269 | # makes archive with project sources |
270 | backup_src() { |
271 | echo |
272 | log "5/7 Compressing project dir: $LOCAL_SRC_DIR..." |
273 | tar -zcf "$LOCAL_SRC_PATH" "$LOCAL_SRC_DIR" |
274 | if [ $? == 0 ]; then |
275 | log "\t- OK" |
276 | send_src_ssh |
277 | send_src_s3 |
278 | else |
279 | log "\t- ERROR: failed to compress project. Exit-code: $?" |
280 | ntfy_warn "ERROR: failed to compress project" |
281 | log "6/7 Sending project backup to $SSH_HOST... skipped" |
282 | log "7/7 Sending project backup to $S3_DIR... skipped" |
283 | fi |
284 | } |
285 | |
286 | # sends sources archive into ssh remote storage |
287 | send_src_ssh() { |
288 | echo |
289 | log "6/7 Sending project backup to $SSH_HOST..." |
290 | if [ $USE_SSH == 1 ]; then |
291 | rsync --progress "$LOCAL_SRC_PATH" "$SSH_HOST:$SSH_SRC_FILE" |
292 | if [ $? == 0 ]; then |
293 | log "\t- OK" |
294 | else |
295 | log "\t- ERROR: failed to send project backup to $SSH_HOST. Exit-code: $?" |
296 | ntfy_warn "ERROR: failed to send project backup to $SSH_HOST" |
297 | fi |
298 | else |
299 | log "\t- disabled" |
300 | fi |
301 | } |
302 | |
303 | # sends sources archive into s3 remote storage |
304 | send_src_s3() { |
305 | echo |
306 | log "7/7 Sending project backup to $S3_DIR..." |
307 | s3cmd put "$LOCAL_SRC_PATH" "$S3_SRC_FILE" |
308 | if [ $? == 0 ]; then |
309 | log "\t- OK" |
310 | else |
311 | log "\t- ERROR: failed to send database backup to $S3_DIR. Exit-code: $?" |
312 | ntfy_warn "ERROR: failed to send project backup to $S3_DIR" |
313 | fi |
314 | } |
315 | |
316 | # prints used/free space on local storage |
317 | show_finish() { |
318 | echo |
319 | log "Finish!" |
320 | log "Used space: $(du -h "$LOCAL_BAK_PATH" | tail -n1)" # вывод размера папки с бэкапами за текущий день |
321 | log "Free space: $(df -h "$LOCAL_BAK_PATH" | tail -n1 | awk '{print $4}')" # вывод свободного места на локальном диске |
322 | echo |
323 | } |
324 | |
325 | # sends log file into both remote storage |
326 | send_log() { |
327 | [ $USE_SSH == 1 ] && rsync --progress "$LOG_PATH" "$SSH_HOST:$SSH_LOG_FILE" |
328 | [ $USE_S3 == 1 ] && s3cmd put "$LOG_PATH" "$S3_LOG_FILE" |
329 | } |
330 | |
331 | # main flow ========================================================= |
332 | |
333 | log "Start ----------------------------------------------------------" |
334 | show_params |
335 | init_dirs |
336 | clear_backups |
337 | backup_db |
338 | backup_src |
339 | show_finish |
340 | send_log |
341 | ntfy_info "Finish!" |
342 |