tasks:backup
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
tasks:backup [25.08.2023 15:31] – [Restic] viacheslav | tasks:backup [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Резервное копирование ====== | ||
+ | ===== Docker ===== | ||
+ | Для рез. копирования данных на томах создаётся контейнер, | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | t=$(date +%F) # дата вида 2017-01-01 | ||
+ | weekDay=$(date +%u) # номер дня недели | ||
+ | sourceDir="/ | ||
+ | backupDir="/ | ||
+ | localDir=" | ||
+ | nasDir=" | ||
+ | remoteDir=" | ||
+ | |||
+ | wpDbPass=$(cat $sourceDir/ | ||
+ | ncDbPass=$(cat $sourceDir/ | ||
+ | protoprismDbPass=$(cat $sourceDir/ | ||
+ | webtreesDbPass=$(cat $sourceDir/ | ||
+ | backupPass=$(cat $backupDir/ | ||
+ | |||
+ | |||
+ | # Выгрузить базы MySQL | ||
+ | # https:// | ||
+ | docker exec wp-db mysqldump -uroot -p$wpDbPass -A |gzip |openssl enc -aes-256-cbc -pbkdf2 -k $backupPass > $localDir/ | ||
+ | docker exec nc-db mysqldump -uroot -p$ncDbPass -A |gzip |openssl enc -aes-256-cbc -pbkdf2 -k $backupPass > $localDir/ | ||
+ | docker exec photoprism-db | ||
+ | docker exec webtrees-db | ||
+ | # Файлы проекта | ||
+ | # https:// | ||
+ | tar --create --preserve-permissions --gzip $sourceDir | \ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | # Файлы контейнеров | ||
+ | if [ $weekDay -eq 2 ] | ||
+ | then | ||
+ | # Удалить старые файлы старше 2 недель | ||
+ | find $localDir -name ' | ||
+ | # Full backup | ||
+ | docker run --rm --volumes-from wp -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from wiki -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from nc -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from photoprism -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from webtrees -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from bepasty -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from phpsysinfo -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | else | ||
+ | # Copy snars for diff backup | ||
+ | for f in $backupDir/ | ||
+ | # Differential backup | ||
+ | docker run --rm --volumes-from wp -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from wiki -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from nc -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from photoprism -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from webtrees -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from bepasty -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | docker run --rm --volumes-from phpsysinfo -v $backupDir:/ | ||
+ | tar --create --preserve-permissions --gzip --listed-incremental=/ | ||
+ | openssl enc -e -aes-256-cbc -pbkdf2 -out $localDir/ | ||
+ | |||
+ | fi | ||
+ | |||
+ | |||
+ | # Разбивка на файлы по 2 ГБ, созданных за последние сутки | ||
+ | # https:// | ||
+ | bigFiles=($(find $localDir -type f -size +2G -mtime -1)) | ||
+ | for f in ${bigFiles[*]}; | ||
+ | split -b 2G " | ||
+ | done | ||
+ | |||
+ | |||
+ | # Выгрузка на NAS | ||
+ | mount $nasDir | ||
+ | # https:// | ||
+ | if [ -f " | ||
+ | then | ||
+ | rsync --delete --recursive --size-only --include=" | ||
+ | fi | ||
+ | umount $nasDir | ||
+ | |||
+ | |||
+ | # Выгрузка на удалённый сервер (WebDAV) | ||
+ | mount $remoteDir | ||
+ | if [ -f " | ||
+ | then | ||
+ | rsync --delete --recursive --size-only --max-size=2G --exclude=" | ||
+ | fi | ||
+ | # sleep 10m | ||
+ | umount $remoteDir | ||
+ | |||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | ===== Монолит ===== | ||
+ | - Делать резервные копии двух баз MySQL | ||
+ | - Делать резервные копии корневой папки веб-сервера вместе с содержимым симлинков внутри неё | ||
+ | - Сжимать бэкап для экономии места | ||
+ | - Шифровать его, чтобы бэкап можно было класть на публичные сервисы | ||
+ | - Синхронизировать результат с удалёнными хранилищами, | ||
+ | - Делать полную копию файлов каждое воскресенье, | ||
+ | - Удалять старые резервные копии старше двух недель | ||
+ | |||
+ | ==== Создать каталоги ==== | ||
+ | <code bash> | ||
+ | # Для резервных копий (на sdcard) | ||
+ | mkdir / | ||
+ | # Для зашифрованных резервных копий | ||
+ | mkdir / | ||
+ | # Для монтирования 4shared WebDAV | ||
+ | mkdir / | ||
+ | </ | ||
+ | |||
+ | ==== Установить и настроить программу для монтирования webdav ==== | ||
+ | <code bash> | ||
+ | # Установить компонент webdav | ||
+ | sudo apt-get install davfs2 -y | ||
+ | # На вопрос монтирования каталогов от непривилегированных пользователей ответить " | ||
+ | # Чтобы изменить это позже: | ||
+ | dpkg-reconfigure davfs2 | ||
+ | |||
+ | # Включить пользователя в группу davfs2 (если он не root) | ||
+ | sudo usermod -aG davfs2 $USER | ||
+ | |||
+ | # Прописать файл адреса, | ||
+ | mkdir $HOME/ | ||
+ | touch $HOME/ | ||
+ | chmod 600 $HOME/ | ||
+ | nano $HOME/ | ||
+ | # для рута - файл / | ||
+ | |||
+ | # Вставить в конец файла строки примерно следующего вида | ||
+ | # (в данном случае путь указывает сразу в папку на удалённом сервере): | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | # Для непривилегированного пользователя необходимо прописать строку в /etc/fstab, | ||
+ | # иначе монтироваться вручную не будет. В данном случае, | ||
+ | echo "# davfs" >> /etc/fstab | ||
+ | echo " | ||
+ | |||
+ | # Убрать предупреждение при монтировании | ||
+ | / | ||
+ | # Раскомментировать и исправить параметр | ||
+ | sudo sed -i '/ | ||
+ | |||
+ | # После этого, можно будет монтировать удалённый каталог командой | ||
+ | mount $HOME/ | ||
+ | # и размонтировать | ||
+ | umount $HOME/ | ||
+ | </ | ||
+ | [[http:// | ||
+ | ==== Скрипт ==== | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | BACKUP_TIME=$(date +" | ||
+ | DOW=$(date +%u) # Day of week | ||
+ | SOURCE_DIR="/ | ||
+ | BACKUP_DIR="/ | ||
+ | ENCRYPTED_DIR=" | ||
+ | WEBDAV_SITE_4SHARED=" | ||
+ | WEBDAV_DIR_4SHARED="/ | ||
+ | FULL=" | ||
+ | DIFF=" | ||
+ | FULL_ENCRYPTED=" | ||
+ | DIFF_ENCRYPTED=" | ||
+ | PASS=" | ||
+ | |||
+ | # Параметры MySQL | ||
+ | DB_USER=" | ||
+ | DB_PASS=" | ||
+ | WP_DB=" | ||
+ | CLOUD_DB=" | ||
+ | WP_DB_FILE=" | ||
+ | CLOUD_DB_FILE=" | ||
+ | WP_DB_FILE_COMPRESSED=" | ||
+ | CLOUD_DB_FILE_COMPRESSED=" | ||
+ | WP_DB_FILE_ENCRYPTED=" | ||
+ | CLOUD_DB_FILE_ENCRYPTED=" | ||
+ | |||
+ | # Выгрузить базы MySQL | ||
+ | mysqldump --add-drop-table -u$DB_USER -p$DB_PASS $WP_DB > $BACKUP_DIR/ | ||
+ | mysqldump --add-drop-table -u$DB_USER -p$DB_PASS $CLOUD_DB > $BACKUP_DIR/ | ||
+ | gzip $BACKUP_DIR/ | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -in $BACKUP_DIR/ | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -in $BACKUP_DIR/ | ||
+ | |||
+ | if [ $DOW -eq 7 ] | ||
+ | then | ||
+ | # Удалить старые файлы старше 2 недель | ||
+ | find $ENCRYPTED_DIR -name ' | ||
+ | # Резервное копирование (полный) | ||
+ | tar --create --preserve-permissions --dereference --gzip --listed-incremental=" | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -in $BACKUP_DIR/ | ||
+ | else | ||
+ | # Резервное копирование (дифференциальное) | ||
+ | cp " | ||
+ | tar --create --preserve-permissions --dereference --gzip --listed-incremental=" | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -in $BACKUP_DIR/ | ||
+ | fi | ||
+ | |||
+ | # Удалить исходные незашифрованные архивы | ||
+ | find $BACKUP_DIR -name ' | ||
+ | # Закачать полученные зашифрованные архивы на удалённые серверы | ||
+ | # Смонтировать удалённые каталоги webdav | ||
+ | mount -t davfs $WEBDAV_SITE_4SHARED $WEBDAV_DIR_4SHARED | ||
+ | # Синхронизировать локальные каталоги с удалёнными (только зашифрованные файлы) | ||
+ | rsync --delete --recursive --size-only --exclude=" | ||
+ | # Иногда бывало, | ||
+ | # данные реально не успевают закачаться на серверы, | ||
+ | # после отмонтирования разделов WebDAV эти данные попадают в /var/cache, | ||
+ | # что забивает системный раздел. По этой причине, | ||
+ | # sleep 30m | ||
+ | # Размонтировать удалённые каталоги WebDAV | ||
+ | umount -t davfs $WEBDAV_DIR_4SHARED | ||
+ | </ | ||
+ | |||
+ | Создать файл backup.sh, вставить туда код и отредактировать пути, логины и пароли. | ||
+ | |||
+ | Сделать файлы скриптов запускаемыми: | ||
+ | <code bash> | ||
+ | chmod +x backup.sh | ||
+ | </ | ||
+ | |||
+ | Настроить планировщик: | ||
+ | <code bash> | ||
+ | crontab -e | ||
+ | # Cleanup davfs cache | ||
+ | 0 8 * * 7 root rm -rf / | ||
+ | # Backup | ||
+ | 0 3 * * * / | ||
+ | </ | ||
+ | |||
+ | === Проблемы === | ||
+ | В один прекрасный день WebDAV перестал синхронизировать, | ||
+ | <code bash> | ||
+ | / | ||
+ | Either / | ||
+ | or another mount process ended irregular | ||
+ | |||
+ | # Решение: | ||
+ | rm / | ||
+ | </ | ||
+ | ==== Полезные команды ==== | ||
+ | === Вывести список БД === | ||
+ | <code bash> | ||
+ | mysql -u root -p111111 | ||
+ | </ | ||
+ | <code mysql> | ||
+ | show databases; | ||
+ | </ | ||
+ | < | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | cloud | | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | sys | | ||
+ | | wordpress | ||
+ | +--------------------+ | ||
+ | </ | ||
+ | |||
+ | === Copy folder with following symlinks === | ||
+ | <code bash> | ||
+ | cp -L -r / | ||
+ | </ | ||
+ | (‘-L’ , | ||
+ | === Скопировать папку рекурсивно с сохранением всех свойств файлов === | ||
+ | <code bash> | ||
+ | # папка backup создастся на usb8gb | ||
+ | cp -rp / | ||
+ | </ | ||
+ | === Посмотреть размеры вложенных каталогов и вывести общий размер === | ||
+ | <code bash> | ||
+ | du -sch / | ||
+ | </ | ||
+ | |||
+ | ===== Borg ===== | ||
+ | Latest release: https:// | ||
+ | Installation: | ||
+ | |||
+ | Quick start: https:// | ||
+ | <code bash> | ||
+ | borg init --encryption=none / | ||
+ | borg create / | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ===== Restic ===== | ||
+ | https:// | ||
+ | |||
+ | Документация: | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Urbackup ===== | ||
+ | https:// | ||
+ | |||
+ | https:// | ||
+ | ===== Инфо ===== | ||
+ | Программы для бэкапа на линуксе - [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | ===== Статьи ===== | ||
+ | ==== Общие ==== | ||
+ | [[http:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | ==== MySQL ==== | ||
+ | [[https:// | ||
+ | ==== date ==== | ||
+ | [[http:// | ||
+ | ==== tar ==== | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | ==== crontab ==== | ||
+ | [[http:// | ||
+ | ==== Чистка старых файлов ==== | ||
+ | [[https:// | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | [[http:// | ||
+ | |||
+ | |||
+ | ==== rsync ==== | ||
+ | [[http:// | ||
+ | [[https:// | ||
+ | [[http:// | ||
+ | [[https:// |