From bdcd8e6bec576837283a4907678dfc06f78d55e3 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Sun, 10 Jul 2022 14:42:40 +0800 Subject: [PATCH] Scripts -> tools + fresh backup script --- scripts/db_backup.sh | 120 ------------------------------- tools/quick-backup.sh | 108 ++++++++++++++++++++++++++++ {scripts => tools}/second-mon.sh | 5 +- 3 files changed, 110 insertions(+), 123 deletions(-) delete mode 100755 scripts/db_backup.sh create mode 100644 tools/quick-backup.sh rename {scripts => tools}/second-mon.sh (99%) diff --git a/scripts/db_backup.sh b/scripts/db_backup.sh deleted file mode 100755 index f866f5b..0000000 --- a/scripts/db_backup.sh +++ /dev/null @@ -1,120 +0,0 @@ -############################################################## -# Скрипт для автоматического резервного копирования -# базы данных. -# -# Автор: Антон Аксенов -# URL: anthonyaxenov.ru -# Email: anthonyaxenov@gmail.com -# -# Подробности о скрипте, подготовка к работе: -# https://anthonyaxenov.blogspot.ru/2017/05/cron-1.html -# -############################################################## -#!/bin/bash - -# Данные для работы с БД -DBHOST= -DBUSER= -DBPASS= -DBNAME= -DBCHARSET="utf8" - -# Даты -FMT_DT_DIR="%d-%m-%Y" # формат даты для директорий | 19-03-2021 -FMT_DT_FILE="%H%M%S-%d%m%y" # формат даты для файлов | 082456-190321 -FMT_DT_LOG="%H:%M:%S" # формат даты для лога | 08:24:15.168149413 - -# Локальное хранилище -LOCALDIR=/backup # полный путь директории для бэкапов -LOCALPATH=$LOCALDIR/$(date +$FMT_DT_DIR) # полный путь директории за сегодня -LOCALFILE=$LOCALPATH/$DBNAME-$(date +$FMT_DT_FILE).sql # полный путь к файлу дампа - -# Облачное хранилище -CLOUDUSE=1 # Копировать ли в облако? Закомментировать строку, если не надо -CLOUDMNT=/mnt/yadisk # Точка монтирования облака относительно корня -CLOUDDIR=db_backup # Папка в облаке, куда будут лететь файлы (внутри папки CLOUDMNT, т.е. без / в начале) -CLOUDPATH=$CLOUDMNT/$CLOUDDIR/$DATE # полный путь к папке текущей даты в облаке относительно корня -CLOUDFILE=$CLOUDPATH/$DBNAME-$DATETIME.sql # полный путь к файлу дампа в облаке -CLOUDFILEGZ=$CLOUDFILE.gz # полный путь к архиву в облаке - -# Путь к бекапу на примонтированном хранилище будет выглядеть так: -# /mnt/yadisk/db_backup/2017-01-01/mybigdatabase-2017-01-01-12-23-34.sql.gz - -log() { - echo "[$(date +$FMT_DT_LOG)] $*" -} - -is_dir() { - [ -d "$1" ] -} - -# Начало процесса -echo "[--------------------------------[$(date +$FMT_DT_LOG)]--------------------------------]" -log $LOCALPATH -if ! is_dir $LOCALPATH; then # Если нет папки за сегодня - sudo mkdir -p $LOCALPATH # создаём её, ошибки игнорируем - [ $? -eq 0 ] && log "New directory: $LOCALPATH" -fi - - - -log "Generate a database dump: '$DBNAME'..." -mysqldump \ - -q \ - --user=$DBUSER \ - --host=$DBHOST \ - --password=$DBPASS \ - --opt \ - --default-character-set=$DBCHARSET $DBNAME \ - > $LOCALFILE -exit - - - -if [[ $? -gt 0 ]]; then - # если дамп сделать не удалось (код завершения предыдущей команды больше нуля) - прерываем весь скрипт - log "Dumping failed! Script aborted." - exit 1 -else # иначе - упаковываем его - log "Dumping successfull! Packing in GZIP..." - gzip $LOCALFILE # Упаковка - if [[ $? -ne 0 ]]; then # Если не удалась - log "GZipping failed! SQL-file will be uploaded." - GZIP_FAILED=1 # Создаём флажок, что упаковка сорвалась - else - log "Result file: $LOCALFILEGZ" - fi - if [[ $CLOUDUSE -eq 1 ]]; then # Если задано копирование в облако - делаем всякое такое - mount | grep "$CLOUDMNT" > /dev/null # Проверяем примонтировано ли уже у нас облако (вывод не важен) - if [[ $? -ne 0 ]]; then # Если нет - mount $CLOUDMNT # значит монтируем - fi - if [[ $? -eq 0 ]]; then # если монтирование успешно - копируем туда файл - log "Cloud: successfully mounted at $CLOUDMNT" - log "Cloud: copying started => $CLOUDFILEGZ" - if ! [[ -d $CLOUDPATH ]]; then # Если в облаке нет папки за сегодня - mkdir $CLOUDPATH 2> /dev/null # создаём её, ошибки игнорируем - fi - if [[ -f $LOCALFILEGZ && GZIP_FAILED -ne 1 ]]; then # Если у нас архивирование выше не сорвалось - cp -R $LOCALFILEGZ $CLOUDFILEGZ # Копируем архив - else - cp -R $LOCALFILE $CLOUDFILE # Иначе - копируем большой тяжёлый дамп - fi - if [[ $? -gt 0 ]]; then # Если не скопировался - просто сообщаем - log "Cloud: copy failed." - else # Если скопировался - сообщаем и размонтируем - log "Cloud: file successfully uploaded!" - umount $CLOUDMNT # Размонтирование облака - if [[ $? -gt 0 ]]; then # Сообщаем результат размонтирования (если необходимо) - log "Cloud: umount - failed!" - fi # Конец проверки успешного РАЗмонтирования - fi # Конец проверки успешного копирования - else # если монтирование НЕуспешно - сообщаем - log "Cloud: failed to mount cloud at $CLOUDMNT" - fi # Конец проверки успешного монтирования - fi # Конец проверки необходимости выгрузки в облако -fi # Конец проверки успешного выполнения mysqldump -log "Stat datadir space (USED): `du -h $LOCALPATH | tail -n1`" # вывод размера папки с бэкапами за текущий день -log "Free HDD space: `df -h /home|tail -n1|awk '{print $4}'`" # вывод свободного места на локальном диске -log "All operations completed!" -exit 0 # Успешное завершение скрипта diff --git a/tools/quick-backup.sh b/tools/quick-backup.sh new file mode 100644 index 0000000..a662228 --- /dev/null +++ b/tools/quick-backup.sh @@ -0,0 +1,108 @@ +#!/bin/bash +##################################################################### +# # +# Stupidly simple backup script for own projects # +# # +# Author: Anthony Axenov (Антон Аксенов) # +# Version: 1.0 # +# License: WTFPLv2 More info (RU): https://axenov.dev/?p=1234 # +# # +##################################################################### + +# https://gist.github.com/anthonyaxenov/b8336a2bc9e6a742b5a050fa2588d71e + +# database credentials ============================================== + +DBUSER= +DBPASS= +DBNAME= +DBCHARSET="utf8" + +# date formats ====================================================== + +FMT_DT_DIR="%Y.%m.%d" # 2021.03.19 +FMT_DT_FILE="%H.%M" # 08.24 +FMT_DT_LOG="%H:%M:%S" # 08:24:15.168149413 + +# local storage ===================================================== + +LOCAL_BAK_DIR="/backup/$(date +$FMT_DT_DIR)" + +# database backup file +LOCAL_SQL_FILE="$(date +$FMT_DT_FILE)-db.sql.gz" +LOCAL_SQL_PATH="$LOCAL_BAK_DIR/$LOCAL_SQL_FILE" + +# project path and backup file +LOCAL_SRC_DIR="/var/www/" +LOCAL_SRC_FILE="$(date +$FMT_DT_FILE)-src.tar.gz" +LOCAL_SRC_PATH="$LOCAL_BAK_DIR/$LOCAL_SRC_FILE" + +# log file +LOG_FILE="$(date +$FMT_DT_FILE).log" +LOG_PATH="$LOCAL_BAK_DIR/$LOG_FILE" + +log() { + echo -e "[$(date +$FMT_DT_LOG)] $*" | tee -a "$LOG_PATH" +} + +# remote storage ==================================================== + +REMOTE_HOST="user@example.com" +REMOTE_BAK_DIR="/backup/$(date +$FMT_DT_DIR)" +REMOTE_SQL_PATH="$REMOTE_BAK_DIR/$LOCAL_SQL_FILE" +REMOTE_SRC_PATH="$REMOTE_BAK_DIR/$LOCAL_SRC_FILE" +REMOTE_LOG_PATH="$REMOTE_BAK_DIR/$LOG_FILE" + +# start ============================================================= + +echo +log "Start ----------------------------------------------------------------" +log "Initialized parameters:" +log "\tDB_USER\t\t= $DB_USER" +log "\tDB_NAME\t\t= $DB_NAME" +log "\tDB_CHARSET\t= $DB_CHARSET" +log "\tLOCAL_SRC_DIR\t= $LOCAL_SRC_DIR" +log "\tLOCAL_SRC_PATH\t= $LOCAL_SRC_PATH" +log "\tLOCAL_SQL_PATH\t= $LOCAL_SQL_PATH" +log "\tLOG_PATH\t= $LOG_PATH" +log "\tREMOTE_HOST\t= $REMOTE_HOST" +log "\tREMOTE_SQL_PATH\t= $REMOTE_SQL_PATH" +log "\tREMOTE_SRC_PATH\t= $REMOTE_SRC_PATH" +log "\tREMOTE_LOG_PATH\t= $REMOTE_LOG_PATH" + +mkdir -p $LOCAL_BAK_DIR +log "Created local dir: $LOCAL_BAK_DIR" + +ssh $REMOTE_HOST mkdir -p $REMOTE_BAK_DIR +log "Created remote dir: $REMOTE_BAK_DIR" + +log "1/4 Dumping DB: $DBNAME..." +mysqldump \ + --user="$DBUSER" \ + --password="$DBPASS" \ + --default-character-set="$DBCHARSET" \ + --opt \ + --quick \ + "$DBNAME" | gzip > "$LOCAL_SQL_PATH" +# --opt Same as --add-drop-table, --add-locks, --create-options, +# --quick, --extended-insert, --lock-tables, --set-charset, +# and --disable-keys +[ $? -gt 0 ] && log "ERROR: failed to create dump. Exit-code: $?" || log "\t- OK" + +log "2/4 Sending database backup to $REMOTE_HOST..." +rsync --progress "$LOCAL_SQL_PATH" "$REMOTE_HOST:$REMOTE_SQL_PATH" +[ $? -gt 0 ] && log "ERROR: failed to send database backup. Exit-code: $?" || log "\t- OK" + +log "3/4 Compressing project dir: $LOCAL_SRC_DIR..." +tar -zcf "$LOCAL_SRC_PATH" "$LOCAL_SRC_DIR" +[ $? -gt 0 ] && log "ERROR: failed to compress project. Exit-code: $?" || log "\t- OK" + +log "4/4 Sending project backup to ${REMOTE_HOST}..." +rsync --progress "$LOCAL_SRC_PATH" "$REMOTE_HOST:$REMOTE_SRC_PATH" +[ $? -gt 0 ] && log "ERROR: failed to send project backup. Exit-code: $?" || log "\t- OK" + +rsync --progress "$LOG_PATH" "$REMOTE_HOST:$REMOTE_LOG_PATH" + +log "Finish!" +log "Used space: $(du -h "$LOCAL_BAK_DIR" | tail -n1)" +log "Free space: $(df -h | tail -n1 | awk '{print $4}')" diff --git a/scripts/second-mon.sh b/tools/second-mon.sh similarity index 99% rename from scripts/second-mon.sh rename to tools/second-mon.sh index 9c31bfc..4d66537 100755 --- a/scripts/second-mon.sh +++ b/tools/second-mon.sh @@ -1,7 +1,4 @@ #!/bin/bash - -# https://gist.github.com/anthonyaxenov/c16e1181d4b8a8644c57ec8a1f6cf21c - ######################################################################### # # # Set display resolution # @@ -18,6 +15,8 @@ # # ######################################################################### +# https://gist.github.com/anthonyaxenov/c16e1181d4b8a8644c57ec8a1f6cf21c + # Set display name to work with. You can get it via 'xrandr --listactivemonitors' display="HDMI-2" # Set width of this display in px