Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

borg / borgbackup / systemd / systemd timer / tar / rsync

Ссылки:

как ставить сам borg можно посмотреть тут:
borgbackup / backup / borg debian 10 / без шифрования репозитория

backup files

0. Создаем каталоги:
mkdir -p /root/backup/{etc,www,sql}
1. Создаем скрипт для бэкапа и вносим изменения для переменных
cat > /root/backup/backup.sh << "EOF"
----------------------------
#!/bin/bash
#VAR
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc
 
# BACKUP
cd /root/backup
 
# Backup mysql
mysqldump --opt -c -e -Q -h${HOST} -u${USER} -p${PASSWORD} ${DBNAME} > ${DBNAME}.sql
tar czpf ${DUMP_PATH}/${DBNAME}.${TIMESTAMP}.tar.gz ${DBNAME}.sql
rm -f ${DBNAME}.sql
 
# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf ${BACK_PATH}/www.${TIMESTAMP}.tar.gz /var/www/html
tar cvzpf ${BACK_PATH_ETC}/etc.${TIMESTAMP}.tar.gz /etc
 
# CLEAN FOLDER BACKUP
# выполняем только если файлов в каталогах для бекапа больше двух 
delfiles(){
for i in $1 $2 $3 $4 $5 $6; do
        calc=$(ls ${i} | wc -l) 
        if ((${calc} > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
done
}
delfiles ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}
EOF
 
 
2. Создаем сервис в systemd
cat > /etc/systemd/system/backup-wp.service << "EOF"
[Unit]
Description=backup
 
[Service]
Type=oneshot
ExecStart=/root/backup/backup.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF
 
3. Создаем таймер в systemd для будем бэкапить в 2 часа ночи
cat > /etc/systemd/system/backup.timer << "EOF"
[Unit]
Description=backup
 
[Timer]
OnCalendar=02:00:00
 
[Install]
WantedBy=timers.target
EOF
 
4. Активируем сервисы для бекапа
systemctl daemon-reload
systemctl enable backup-wp.service
systemctl enable backup-wp.timer 
systemctl status backup-wp.service
systemctl status backup-wp.timer 
systemctl list-timers backup-wp.timer 
 
5. Может пригодится:
#HINT
# SYSTEMCTL
# systemctl status backup-wp.service
# systemctl status backup-wp.timer
# Clean DB erase
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;
# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql
# RSYNC to remote server
# sync -avz /root/backup-wp user@YOU-server-IP-DNS:/home/user/backup-wp

ssh ssh-keygen ssh-copy

Создать пользователя "USRER_NAME" с домашним каталогом "/backup/USRER_CATALOG_BACKUP": 
adduser --home /backup/USRER_CATALOG_BACKUP --disabled-password borg USRER_NAME
Подключится пользователем 
sudo -i -u USRER_NAME

ssh - поддержка авторизация без пароля с помощью RSA ключей

Выполнять на клиенте с которого будем подключатся к серверу.
ssh-keygen - создаем пару ключей на сервере с которого будем подключатся.
ssh-copy-id sammy@IP_адрес_вашего_сервера - копирование открытого ключа

На сервере куда будем класть бэкапы, пользователю в домашнем каталоге добавляем публичные ключи:
.ssh/authorized_keys

Если нет каталога .ssh можно его создать
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

borgbackup

1. Создаем сервис в systemd
cat > /etc/systemd/system/borg-backup.service << "EOF"
[Unit]
Description=borg-backup
 
[Service]
Type=oneshot
ExecStart=/root/borg-backup.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF
 
2. Создаем таймер в systemd для будем бэкапить в 3 часа ночи
cat > /etc/systemd/system/borg-backup.timer << "EOF"
[Unit]
Description=borg-backup.timer
 
[Timer]
OnCalendar=03:00:00
 
[Install]
WantedBy=timers.target
EOF

3. скрипт бэкапа
cat > /root/borg-backup.sh << "EOF"
#!/bin/bash
/usr/bin/borg create -C lz4 borg@IP_AND_HOSTNAME:FOLDER_BACKUP::system_$(date +%Y%m%d_%H%M%S) /root /home /etc
EOF
chmod +x /root/borg-backup.sh 


4. Активируем сервисы для бекапа
systemctl daemon-reload
systemctl enable borg-backup.service
systemctl enable borg-backup.timer 
systemctl start borg-backup.timer 
systemctl status borg-backup.service
systemctl status borg-backup.timer 
systemctl list-timers borg-backup.timer
systemctl start borg-backup.service



5. Чистилка бэкапов 
cat > /root/borg-prune.sh << "EOF"
#!/bin/bash
list_backup="linux linux2 linux3 linux4 linux5"
borg_purn_par="--force -v --list --keep-daily 10 --keep-weekly 5 --keep-monthly 8"
borg_backup_dir="/backup/"

#prune
for i in ${list_backup}; do
 borg prune ${borg_purn_par} ${borg_backup_dir}${i}/
done

#compact
for i in ${list_backup}; do
 echo "compact for folder ${i}"
 borg compact ${borg_backup_dir}${i}/
done

#print dir
for i in ${list_backup}; do
 echo ${i}
 borg list ${borg_backup_dir}${i}/
done

#retun user chown
for i in ${list_backup}; do
        chown borg:borg -R ${borg_backup_dir}${i}
        echo "done chown for borg ${i}"
done

EOF

chmod +x /root/borg-prune.sh


6. Таймеры для чистилки
Создаем сервис в systemd
cat > /etc/systemd/system/borg-prune.service << "EOF"
[Unit]
Description=borg-prune
 
[Service]
Type=oneshot
ExecStart=/root/borg-prune.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF
 
Создаем таймер в systemd для будем бэкапить в 3 часа ночи
cat > /etc/systemd/system/borg-prune.timer << "EOF"
[Unit]
Description=borg-prune
 
[Timer]
OnCalendar=04:00:00
 
[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable borg-prune.service
systemctl enable borg-prune.timer 
systemctl start borg-prune.timer 
systemctl status borg-prune.service
systemctl status borg-prune.timer 
systemctl list-timers borg-prune.timer
systemctl start borg-prune.service



rsync systemd

0. Создаем сервис для rsync
cat > /etc/systemd/system/store_rsync.service << "EOF"
[Unit]
Description=store rsync

[Service]
Type=oneshot
ExecStart=/root/store_rsync.sh
User=root
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

1. Создаем таймер для запуска сервиса
cat > /etc/systemd/system/store_rsync.timer << "EOF"
[Unit]
Description=store_rsync

[Timer]
OnCalendar=6:00:00

[Install]
WantedBy=timers.target
EOF

2. Создаем скрипт для синхронизации, например такой
cat > /root/store_rsync.sh  <<"EOF"
#!/bin/bash
set +x
# Устанавливаем IP-адрес для проверки
HOST="192.168.15.10"

# Пингуем хост (1 раз с таймаутом 3 секунды)
ping -c 1 -W 3 $HOST > /dev/null 2>&1

# Проверяем результат пинга
if [ $? -ne 0 ]; then
  echo "Ошибка: Хост $HOST не доступен!"
  exit 1
else
  echo "Хост $HOST доступен, выполняем ниже стоящие команды."
fi

#/usr/bin/rsync -avz /kvm/datastore2/backup  hsrvrsync@192.168.15.100:/mnt/Storage3/backup-from-hsrv/
#/usr/bin/rsync -avz /kvm/datastore2/hsrv1/kvm/storage/toshibahdwd120  hsrvrsync@192.168.15.100:/mnt/Storage2/share-from-hsrv/
EOF

3. Запускаем демоны и выполняем первичный запуск
systemctl daemon-reload
systemctl enable store_rsync.service
systemctl enable store_rsync.timer
systemctl start store_rsync.timer
systemctl status borg-prune.service
systemctl status store_rsync.service
systemctl list-timers  store_rsync.timer
systemctl start store_rsync.service
Рубрики
bareos

bareos настройка бэкапов / backups / bareos-dir

!!!!!!!!!!!! ПЕРЕПИСЫВАЮ

Описание компонентов:

Bareos Director — компонент который управляет заданиями (jobs) и операциями резервного копирования, или восстановления, а так же управляет File и Storage Daemon’ами.

Baroes Console — текстовая консоль для управления Bareos Director’ом через специальный командный синтаксис. 
По умолчанию устанавливается вместе с Bareos Director, но может устанавливаться и отдельно для удаленного подключения к Bareos Director.

Bareos Web UI — веб-интерфейс Bareos. По умолчанию устанавливается вместе с Bareos Director. 
Данный компонент пока что на стадии развития и используется больше для удобного мониторинга, но можно вручную запускать задачи на резервное копирование, или восстановление. 
Тогда как расписание и задания создаются в основном через текстовые конфиги, или через консоль bareos, а не через веб-интерфейс.

Bareos Catalog — база данных, которая содержит информацию по расписаниям, заданиям, сохраненным файлам, клиентам, статусам.

Storage Daemon — компонент, который выполняет операции чтения и записи на устройствах хранения, используемых для резервного копирования.

File Daemon — агент, который используется для сбора с “клиентских” систем и их размещения при операциях восстановления.

Пример структуры каталогов по умолчанию для /etc/bareos:

.
├── bareos-dir.d
│   ├── catalog
│   │   └── MyCatalog.conf
│   ├── client                # конфиги клиентов \ учетные данные клиентов
│   │   ├── bareos-fd.conf
│   │   └── eyh.conf          # конфиг клиента eyh
│   ├── console
│   │   ├── admin.conf
│   │   ├── admin.conf.example
│   │   └── bareos-mon.conf
│   ├── director
│   │   └── bareos-dir.conf
│   ├── fileset              # в этом каталоге мы задаем что бэкапим \ куда
│   │   ├── Catalog.conf
│   │   ├── eyh.conf         # конфиг настроек бэкапа для eyh 
│   │   ├── LinuxAll.conf
│   │   ├── SelfTest.conf
│   │   └── Windows All Drives.conf
│   ├── job                  # задания
│   │   ├── backup-bareos-fd.conf
│   │   ├── BackupCatalog.conf
│   │   └── eyh.conf        # 
│   ├── jobdefs
│   │   ├── DefaultJob.conf
│   │   └── eyh.conf
│   ├── messages
│   │   ├── Daemon.conf
│   │   └── Standard.conf
│   ├── pool
│   │   ├── Differential.conf
│   │   ├── Full.conf
│   │   ├── Incremental.conf
│   │   └── Scratch.conf
│   ├── profile
│   │   ├── operator.conf
│   │   ├── webui-admin.conf
│   │   ├── webui-limited.conf.example
│   │   └── webui-readonly.conf
│   ├── schedule
│   │   ├── Daily.conf
│   │   ├── Weekly.conf
│   │   ├── WeeklyCycleAfterBackup.conf
│   │   └── WeeklyCycle.conf
│   ├── storage
│   │   ├── eyh.conf
│   │   ├── File.conf
│   │   └── Restore.conf
│   └── user
├── bareos-dir-export
│   └── client
│       └── eyh
│           └── bareos-fd.d
│               └── director
│                   └── bareos-dir.conf
├── bareos-fd.d
│   ├── client
│   │   └── myself.conf
│   ├── director
│   │   ├── bareos-dir.conf
│   │   └── bareos-mon.conf
│   └── messages
│       └── Standard.conf
├── bareos-sd.d
│   ├── device
│   │   ├── eyh.conf
│   │   ├── FileStorage.conf
│   │   └── Restore.conf
│   ├── director
│   │   ├── bareos-dir.conf
│   │   └── bareos-mon.conf
│   ├── messages
│   │   └── Standard.conf
│   └── storage
│       └── bareos-sd.conf
└── bconsole.conf



Размещение бэкапов Bareos Storage Daemon

Сервер есть, он работает, но ничего не делает и у него нет места куда бы положить наши бэкапы. 
За размещение файлов отвечает демон bareos-sd
/etc/bareos/bareos-sd.d/ - каталог конфигов bareos-sd
/etc/bareos/bareos-sd.d/device/FileStorage.conf 
/etc/bareos/bareos-sd.d/director/bareos-dir.conf 
/etc/bareos/bareos-dir.d/storage/File.conf

По дефолту пулы данных располагаются в /var/lib/bareos/storage

Конфигурация самих пулов располагается в конфигах Bareos Director:
/etc/bareos/bareos-dir.d/pool/Differential.conf  
/etc/bareos/bareos-dir.d/pool/Full.conf  
/etc/bareos/bareos-dir.d/pool/Incremental.conf  
/etc/bareos/bareos-dir.d/pool/Scratch.conf

Иногда возникает необходимость вынести Storage Daemon на отдельный сервер, или добавить дополнительный Storage Pool расположенный на другом сервере. 
Для работы с обычными дисковыми накопителями нужно установить соответствующий бэкенд: 
пакет bareos-sd — для Centos, bareos-storage — для Debian, или Ubuntu.

apt install bareos-storage - установка на debian

Пример настройки на отдельном сервере Storage Daemon

Конфигурируем Device на стороне Storage Daemon:
# cat /etc/bareos/bareos-sd.d/device/NewStorage.conf
Device {
  Name = NewStorage
  Media Type = File
  Archive Device = /path/to/your/storage/mount/directory
  LabelMedia = yes;      # lets Bareos label unlabeled media
  Random Access = yes;
  AutomaticMount = yes;  # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Description = "Your device description here."
}

Теперь, исходя из того, что Device имеет имя “NewStorage”, а Bareos Director — дефолтное “bareos-dir”, следующий конфиг:
# cat /etc/bareos/bareos-sd.d/director/bareos-dir.conf
Director {
  Name = bareos-dir
  Password = ""
  Description = "Director, who is permitted to contact this storage daemon."
}

расположенный на стороне Storage Daemon, нужно разместить на стороне Bareos Director и привести к следующему виду:
# cat /etc/bareos/bareos-dir.d/storage/NewStorage.conf
Storage {
  Name = NewStorage
  Address = 10.0.0.12         # N.B. Use a FQDN or IP here
  Password = ""
  Device = NewStorage
  Media Type = File
}

Обновить конфигурацию Bareos Director:
# bconsole
* reload
* exit

и перезапустить Storage Daemon для обновления конфигурации:
systemctl restart bareos-sd

Проверяем что у нас получилось
bconsole
status storage

Расписание и задания

Каждое из заданий может быть прикреплено к расписанию (Shedule) и частично предопределено в шаблоне (Job Definitions). 
Задания так же могут ссылаться на Fileset’ы, где, например, для группы различных заданий предопределены какие-либо параметры.
Задания могут быть ни прикреплены к расписанию (запускаются только вручную через веб-интерфейс, или консоль), ни ссылаться на Fileset’ы. 

Некоторые Fileset’ы создаются автоматически при установке Bareos Director:
/etc/bareos/bareos-dir.d/fileset/Catalog.conf
/etc/bareos/bareos-dir.d/fileset/LinuxAll.conf
/etc/bareos/bareos-dir.d/fileset/SelfTest.conf
/etc/bareos/bareos-dir.d/fileset/Windows\ All\ Drives.conf

Дефолтные задания на резервное копирование:
/etc/bareos/bareos-dir.d/job/backup-bareos-fd.conf
/etc/bareos/bareos-dir.d/job/BackupCatalog.conf
/etc/bareos/bareos-dir.d/job/RestoreFiles.conf

Дефолтное расписание выглядит следующим образом:
/etc/bareos/bareos-dir.d/schedule/WeeklyCycle.conf
/etc/bareos/bareos-dir.d/schedule/WeeklyCycleAfterBackup.conf

Создадим ежедневное:
# cat /etc/bareos/bareos-dir.d/schedule/Daily.conf
Daily.conf 
Schedule {
  # name (обязательно)
  Name = "Daily"
  
  # run time
  # допустимы множество опций,
  # можно создавать несколько в виде "Run =" times
  # но для простоты будем запускать
  # каждый день один раз в день в 21:10
  Run = daily at 21:00
}

и еженедельное расписание:
# cat /etc/bareos/bareos-dir.d/schedule/Weekly.conf
Schedule {
  Name = "Weekly"
  Description = "This schedule creates weekly backup."
  # создаем Full бэкап в пул "Full" каждую субботу в 21:00
  Run = Level=Full Pool=Full sun at 21:00
}

!!! Собственно тут описывается что мы там бэкапим
Создадим Fileset:
# cat /etc/bareos/bareos-dir.d/fileset/MyFileset.conf
FileSet {
  # name (required)
  Name = "MyFileset"
# include directory
  Include {
    Options {
      # считаем контрольную сумму для всех файлов из fileset
      # можно использовать MD5/SHA1. Это полезно для длительного
      # хранения, однако создает дополнительную нагрузку на CPU:
      # SHA1 надежней, но в большинстве случаев достаточно менее
      # требовательного к ресурсам процессора MD5
      Signature = MD5
      
      # запаковывать каждый файл из fileset
      # наиболее используемые: LZ4/GZIP (см. мануал для остальных
      # возможных опций). LZ4 - наиболее быстрый для запаковывания
      # и распаковывания.
      Compression = LZ4
      
      # noatime - yes: Если ваша система поддерживает O_NOATIME
      # Bareos откроет все файлы, скопированные с этой опцией.
      # Это позволяет читать файл без обновления inode atime
      # (а также без обновления inode ctime). Если опция не
      # поддерживается, то будет автоматически игнорирована.
      noatime = yes
# Указанные буквы опций используются при запуске
      # Verify Level = Catalog, а также задания уровня
      # DiskToCatalog. Буквы параметров могут быть любыми 
      # комбинациями из следующих:
      #
      # i - compare the inodes
      # p - compare the permission bits
      # n - compare the number of links
      # u - compare the user id
      # g - compare the group id
      # s - compare the size
      # a - compare the access time
      # m - compare the modification time (st_mtime)
      # c - compare the change time (st_ctime)
      # d - report file size decreases
      # 5 - compare the MD5 signature
      # 1 - compare the SHA1 signature
      # A - Only for Accurate option, allows to backup the file
      Verify = pin5
      
    }
    # бэкапим определенные директории
    # (указывать без обратных slash'ей)
    # File = "/path/to/your/folder/"
    #
    # или:
    #
    # File = "/path/to/your/folder/"%n
    # с опцией, задавая таким образом конечную папку с помощью 
    # имени задачи (Job Name).
    #
    # Возможно использовать:
    # %c = Client’s name
    # %d = Director’s name
    # %e = Job Exit code (OK, Error, ...)
    # %h = Client address
    # %i = Job Id
    # %j = Unique Job name
    # %l = Job level
    # %n = Job name
    # %r = Recipients
    # %s = Since time
    # %t = Job type (e.g. Backup, ...)
    # %v = Read Volume name (Only on director side)
    # %V = Write Volume name (Only on director side)
    File = "/path/to/your/folder/"
  }
}

Задания:

Задания бывают следующих типов: Backup, Restore, Verify, Admin, Migrate, Copy, Consolidate. 
Но для примера рассмотрим только Backup и Restore (информацию об остальных можно найти в официальной документации). Для начала создадим шаблон задачи (Job Definition):
# cat /etc/bareos/bareos-dir.d/jobdefs/MyJobdef.conf
 JobDefs {
  Name = "MyJobdef"
  # Тип определяемого Job Definition (Backup, Restore, Verify...)
  Type = Backup
  
 # Собирать данные со следующего клиента:
  Client = clientname
  # Раскоментируйте, если нужно предопределить Fileset, но можно на него и не ссылаться. 
  # Например:
  # FileSet = "MyFileset"
  # Закрепить Job Definition за следующим расписанием:
  Schedule = "Weekly"
  # Перед и после выполнения задания возможен запуск скриптов:
  # ClientRunBeforeJob - запустит скрипт перед выполнением Job на
  # стороне клиента,
  # RunBeforeJob - запустит скрипт перед выполнением Job на
  # стороне Bareos Director.
  # ClientRunAfterJob - запустит скрипт после выполнения Job на
  # стороне клиента,
  # RunAfterJob - аналогично после Job на стороне Bareos Director.
  # Таким образом, сначала запустится RunBeforeJob (например, это
  # какой-либо скрипт для подготовки данных к бэкапу),
  # непосредственно само резервное копирование (или восстановление, если
  # Type = Restore) и по завершению - RunAfterJob (например,
  # скрипт, который удалит подготовленные для бэкапа данные)
  #
  # Например:
  #
  # ClientRunBeforeJob = "/path/to/your/script/script.sh"
  #
  # Как и в Fileset, возможно так же передавать различные
  # параметры:
  # ClientRunBeforeJob = "/path/to/script.sh %n"
            
  # С каким storage работать:
  Storage = File
  # Preset, определяющий как и какие сообщения собирать с
  # клиентов. В большинстве случаев - стандартного достаточно.
  Messages = Standard
  # С каким пулом работать: например, для Full backups - Full.
  Pool = Full
  # Приоритет задачи: чем ниже, тем раньше других будет выполнена,
  # если за один интвервал времени запланировано несколько
  Priority = 10
  # Вряд ли придется менять это значение, обычно оставляется
  # по дефолту. Это файл начальной загрузки. Он содержит
  # информацию ASCII, которая позволяет точно определить, какие
  # файлы должны быть восстановлены, какой объем они находятся и
  # где они находятся на томе. Это относительно компактная форма
  # указания информации, является удобочитаемой и может быть
  # отредактирована любым текстовым редактором.
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
  # Указывает на то, что Full Backups записываются в пул "Full";
  # Differential - в Differential и тд. Для примера так же можно
  # настроить запись Full Backups в созданный выше NewPool:
  # Full Backup Pool = NewPool
  Full Backup Pool = Full
  Differential Backup Pool = Differential
  Incremental Backup Pool = Incremental
}

И далее создадим непосредственно саму задачу, ссылающийся на созданный Job Definition:
# cat /etc/bareos/bareos-dir.d/job/MyJob.conf
Job {
  Name = "MyJob"
  Description = "Backup files from clientname"
  JobDefs = "MyJobdef"
  Type = Backup
  Level = Full
  # При Accurate режиме демон файлов точно знает, какие файлы
  # присутствовали после последней резервной копии. Таким
  # образом, он способен обрабатывать удаленные или 
  # переименованные файлы.
  # При восстановлении FileSet для заданной даты (включая «самые
  # последние») Bareos может восстановить именно файлы и каталоги,
  # существовавшие во время последней резервной копии до этой 
  # даты: удаленные файлы будут действительно удалены, а
  # переименованные будут переименованы должным образом.
  # При создании резервных копий VirtualFull рекомендуется
  # использовать точный режим (Accurate Mode), иначе VirtualFull
  # может содержать уже удаленные файлы.
  # Однако использование точного режима также имеет недостатки:
  # FileDaemon должен хранить данные о всех файлах в памяти.
  # Итак, если у вас нет достаточной памяти, резервная копия может
  # быть очень медленной или неудачной. Для 500 000 файлов
  # (типичная desktop Linux-система) потребуется около 64 мегабайт
  # ОЗУ на вашем File Daemon для хранения необходимой информации.
  Accurate = yes
  # Ссылаемся на созданное выше описание файлов (Fileset).
  FileSet = "MyFileset"
  # Привязываем задачу к еженедельному расписанию "Weekly"
  Schedule = "Weekly"
  # Собираем данные с клиента "clientname"
  Client = "clientname"
  # Если требуется, то можно переопределить:
  # ClientRunBeforeJob = "/path/to/script.sh"
  # ClientRunAfterJob = "/path/to/script.sh"
  # Отправляет bootstrap для аварийного восстановления.
  # Укажите здесь необходимого адресата, если требуется
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  # Приоритет. Дефолтные задания имеют приоритет 11.
  Priority = 9
}

Если какие-то из параметров определены дважды (например: в Fileset и Job, или в Job Definition и Job), то параметры в Job переопределит (override) ранее заданные.

Выставляем права на все созданные конфигурации:
chown bareos.bareos /etc/bareos/bareos-dir.d/schedule/Daily.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/schedule/Weekly.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/fileset/MyFileset.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/jobdefs/MyJobdef.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/job/MyJob.conf

Применяем изменения:
bconsole
reload

Запускаем задание MyJob:
bconsole
run job=MyJob

Смотрим ошибки и правим файлы
mess

Incrimential Backups

Использование некоторых флагов позволит копировать только те файлы, которые были изменены. 

Создадим fileset для Incrimential Backup’ов:

# cat /etc/bareos/bareos-dir.d/fileset/IncrimentialFileset.conf
FileSet {
  Name = "IncrimentialFileset"
  Description = "Incrimential Data fileset"
  Include {
    Options {
    
       # Accurate options, использование которых позволяет
       # определить Bareos, какие файлы копировать:
       # i - compare the inodes
       # p - compare the permission bits
       # n - compare the number of links
       # u - compare the user id
       # g - compare the group id
       # s - compare the size
       # a - compare the access time
       # m - compare the modification time (st_mtime)
       # c - compare the change time (st_ctime)
       # d - report file size decreases
       # 5 - compare the MD5 signature
       # 1 - compare the SHA1 signature
       # В большинстве случаев опции "ms" вполне достаточно для
       # копирования новых/измененных, но если требуется учитывать
       # дату изменения файла, то "mcs".
       Accurate = ms
       Signature = MD5
       Compression = LZ4
    }
    File = "/path/to/directory"
  }
}

Теперь создадим Base Job, которую можно выполнять по расписанию для копирования всех файлов один раз в месяц, или год, 
а можно и вовсе запускать разово вручную, если копировать в отдельный пул, авто очистка на котором отключена:

# cat /etc/bareos/bareos-dir.d/job/BaseJob.conf
Job {
  Name = "BaseJob"
  Description = "Base backup"
  # Задаем базовый (Base) level:
  Level = Base
  Pool = Incremental
  Storage = File
  Type = Backup
  FileSet = "IncrimentialFileset"
  Client = "clientname"
  Messages = Standard
  # Раскоментируйте, если требуется выполнять Base Job по
  # расписанию
  # Schedule = "Monthly"
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  Priority = 11
}

И далее задание для инкрементальных бэкапов, которое уже будем выполнять по расписанию:
# cat /etc/bareos/bareos-dir.d/job/IncrimentialJob.conf
Job {
  Name = "IncrimentialJob"
  Description = "Incrimential data backup"
  
  # Задает Base Job:
  Base = "BaseJob"
  Pool = Incremental
  Storage = File
  Type = Backup
  Level = Incremental
  FileSet = "IncrimentialFileset"
  Schedule = "Daily"
  Client = "clientname"
  Messages = Standard
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  Priority = 11
}


Выставляем права, перезагружаем конфиг Bareos Director и запускаем Base Job:
chown bareos.bareos /etc/bareos/bareos-dir.d/fileset/IncrimentialFileset.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/job/BaseJob.conf
chown bareos.bareos /etc/bareos/bareos-dir.d/job/IncrimentialJob.conf

Применяем изменения:
bconsole
* reload

Запускаем задание:
run job=BaseJob

И далее можно запустить задачу на создание инкрементального бэкапа:
run job=IncrimentialJob

В принципе, достаточно выполнять по расписанию только IncrimentialJob: если не будет найден полный бэкап, то он автоматически создастся. 
Добавлять BaseJob в расписание не обязательно — это лишь для наглядности данного примера.
Рубрики
bareos

bareos установка bareos-fd / настройка клиентов

Установка Bareos File Daemon / клиент

!!! Выполняем на стороне клиентов
“Клиенты”, в отличии от серверных компонентов Bareos, без каких-либо ограничений устанавливаются так же на MacOS и Windows. 
http://download.bareos.org/bareos/release/latest/windows/ - бинарники для windows
http://download.bareos.org/bareos/release/latest/ - все возможные пакеты


Centos 7
# yum install epel-release wget -y
# wget -O /etc/yum.repos.d/bareos.repo http://download.bareos.org/bareos/release/latest/CentOS_7/bareos.repo
# yum install bareos-fd -y
# firewall-cmd --permanent --add-port=9102/tcp
# firewall-cmd --reload
# systemctl enable bareos-fd


Ubuntu 16.04
# echo "deb http://download.bareos.org/bareos/release/latest/xUbuntu_16.04/ /" > /etc/apt/sources.list.d/bareos.list
# wget -q http://download.bareos.org/bareos/release/latest/xUbuntu_16.04/Release.key -O- | apt-key add -
# apt update
# apt install bareos-filedaemon -y
# systemctl enable bareos-fd
# ufw allow 9102/tcp


Debian Stretch
# echo "deb http://download.bareos.org/bareos/release/latest/Debian_9.0/ /" > /etc/apt/sources.list.d/bareos.list
# wget -q http://download.bareos.org/bareos/release/latest/Debian_9.0/Release.key -O- | apt-key add -
# apt update
# apt install bareos-filedaemon -y
# iptables -A INPUT -p tcp --dport 9102 -j ACCEPT
# iptables-save > /etc/iptables.up.rules

Пример установки самой свежей версии bareos на Debian 10:
Переменные из скрипта установки
--------------------------------
DIST=Debian_10
RELEASE=release/20

URL=http://download.bareos.org/bareos/$RELEASE/$DIST
wget -O /etc/apt/sources.list.d/bareos.list $URL/bareos.list
wget -q $URL/Release.key -O- | apt-key add -

## для 17.2 можно забить на подпись вот так [trusted=yes] (да при apt update будет предупреждение) 
##cat /etc/apt/sources.list.d/bareos.list
##deb [trusted=yes] http://download.bareos.org/bareos/release/17.2//Debian_9.0 /
--------------------------------

Устанавливаем: 
apt update
apt install bareos-filedaemon -y

Добавление хостов для архивирования в bareos:


!!! На стороне сервера дальнейший процесс добавления клиента аналогичен для всех дистрибутивов. 
Подключаемся к консоли на стороне Bareos Director и добавляем только что установленный “клиент”

0. заходим в консоль bconsole
bconsole

1. добавляем клиент
configure add client name=clientname address=10.0.0.4 password=password

2. Получаем примерно такой вывод 
Exported resource file "/etc/bareos/bareos-dir-export/client/linux4/bareos-fd.d/director/bareos-dir.conf":
Director {
  Name = bareos-dir
  Password = "[md5]5ebe2294ecd0e0f08eab7690d2a6ee69"
}
Created resource config file "/etc/bareos/bareos-dir.d/client/linux4.conf":
Client {
  Name = clientname
  Address = 10.0.0.4
  Password = password
}

3. Применяем изменения выполнив reload и выходим
reload
exit


4. Теперь на сторону клиента необходимо доставить файл (/etc/bareos/bareos-dir-export/client/clientname/bareos-fd.d/director/bareos-dir.conf) в каталог (/etc/bareos/bareos-fd.d/director/)
Например скопировав
scp /etc/bareos/bareos-dir-export/client/linux4/bareos-fd.d/director/bareos-dir.conf root@10.0.0.4:/etc/bareos/bareos-fd.d/director/

!!! на стороне клиента после доставки файла
5. Перезапускаем Bareos File Daemon
systemctl restart bareos-fd
Рубрики
bareos

bareos ручная очистка

cd /var/lib/bareos/storage/ - перешли в каталог где лежат все бэкапы
du -hs * | grep G | sort -n - смотрим кто там самый жирный
cd /var/lib/bareos/storage/name_folder_backup - перешли в каталог где лежат бэкапы 
ls -latrh - сортируем по дате (вверху будут самые старые) 
> name_backup_1278 - обнуляем бэкап

bconsole - входим в консоль управления bareos
mess - получаем все сообщения
purge volume=name_backup_1278 - удаляем бэкап из bareos
ctrl + D - выходим из bcpnsole (можно напечатать exit)
Рубрики
bareos

bareos создание бэкапов из bconsole

!!! Пригодится при проверки настроек резервного копирования
bconsole - входим в консоль
add - приступаем к созданию томов (тут будет необходимо выбрать тип, хранилище, место)

status - проверяем расписание (выбрать dir)

run localhost - запустить архивацию localhost

Рубрики
bareos

bareos tools

 
https://docs.bareos.org/TasksAndConcepts/BareosConsole.html


bconsole - заходим в консоль bareos
mess - показать сообщения

list clients - показать доступные клиенты 

status name_client - показать состояние клиента name_client

enable client client_name - включить клиент
disable client clien_tname - отключить клиент

status storage -  посмотреть состояние хранилища

list pool - показать пулы

list volume - показать тома

Удалить клиент с Bareos Director можно путем удаления конфига из папки /etc/bareos/bareos-dir.d/client и перезагрузки конфигурации Bareos Director:
# rm /etc/bareos/bareos-dir.d/client/clientname.conf
# bconsole
* reload
* exit
Рубрики
bareos

bareos автономное восстановление из архива / bls / bextract

bls
bscan
bextract

bls -V ИМЯ_АРХИВА_0000 ПУТЬ_ГДЕ_ХРАНИТСЯ_АРХИВ - показать содержимое архива (вывалит на stdout, можно применить grep)
bextract -V ИМЯ_АРХИВА_0000 ПУТЬ_ГДЕ_ХРАНИТСЯ_АРХИВ КУДА_РАСПАКОВАТЬ -dnnn - распаковка архива (-dnnn показывать подробности)

Пример использования:
bls -V Incr_namearhive_0085 /var/lib/bareos/storage/arhiv_dir | grep mysql - смотрим содержимое архива ищем в выводе mysql
bextract -V Incr_namearhive_0085 /var/lib/bareos/storage/arhiv_dir /temp -dnnn  - распаковываем архив в папку /temp
Рубрики
bareos

bareos ссылки

https://docs.bareos.org/ - официальная документация
https://docs.bareos.org/bareos-18.2/index.html - установка 18.2 / 17.2
https://docs.bareos.org/bareos-19.2/index.html  - установка 19.2
https://docs.bareos.org/bareos-20/index.html - установка 20
https://docs.bareos.org/master/index.html  - установка текущая master

http://download.bareos.org/bareos/release/latest/windows/ - бинарники для windows
http://download.bareos.org/bareos/release/latest/ - все возможные пакеты
https://github.com/bareos/ - исходники 

https://habr.com/ru/post/272869/ - статья объясняет работу bareos и настройку

http://www.bog.pp.ru/work/bacula.html#bootstrap
https://www.linux.org.ru/forum/admin/8026472 - пример восстановления

http://www.linux.org.ru/forum/admin/8026472
http://www.pedroliveira.pt/bacula-tape-restore-without-database/
http://blog.unixstyle.ru/7/bacula-bscan8-bls8-bextract8/

https://wiki.archlinux.org/index.php/Bareos_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)


https://habr.com/ru/post/211755/ 
Рубрики
backup backup \ crontab \ tar \ zip \ архивация \ архиваторы

borgbackup / backup / borg debian 10 / без шифрования репозитория

Установка

apt install borgbackup

Часть первая. Пример работы локально:


Архивировать будем каталог пользователей:
/home

На сервере бэкапов архивы будем хранить в каталоге: 
/mnt/backups/

Создадим структуру каталогов на сервере:
mkdir /mnt/backups/

Создадим для каталога /home отдельный репозиторий, без шифрования данных:
borg init --encryption=none  /mnt/backups/Myrepo
# Если все таки хочется шифрования:
# borg init --encryption=repokey /media/backup/borgdemo 

borg info /mnt/backups/home/ - смотрим информацию об репозитории home

borg create /mnt/backups/Myrepo::xxx /home - пробуем выполнить архивацию
borg create /Куда/делаем/архив::Имя_архива /что/архивируем

borg info /mnt/backups/Myrepo - смотрим информацию об репозитории home
borg list /mnt/backups/Myrepo - смотрим какие у нас есть архивы


Пример crontab:
0 1 * * * borg create /mnt/backups/Myrepo::xxx /home


Часть вторая. Пример работы по сети.

== Серверная часть ==
0. На сервере создаем пользователя borg, без пароля, авторизация будет происходить по ключу
adduser --home /mnt/backups --disabled-password borg

1. На сервере поправим две опции в конфиге ssh-сервера 
nano /etc/ssh/sshd_config
-------------------------
ClientAliveInterval 10
ClientAliveCountMax 30
-------------------------
sudo systemctl restart sshd - перезапустим ssh-сервер


2. На сервере зайдем в сеанс пользователя borg для подготовки ssh
sudo -i -u borg - зашли в сеанс
mkdir .ssh - создали каталог
touch .ssh/authorized_keys - создали файл
chmod 700 .ssh - назначили права на каталог
chmod 600 .ssh/authorized_keys - назначили права на файл
borg init -e none testrepo - создадим тестовый репозиторий с именем testrepo

== Клиентская часть ==
0. На клиенте
У пользователя, от имени которого будет запускаться скрипт, должен быть ssh-ключ. 
Если его нет, то генерируем его
ssh-keygen - генерируем ключ

1. Теперь нужно настроить отправку файлов бекапа на сервер. 
borg занимается только хранением файлов - их подготовка ваша задача. 
Создадим скрипт backup.sh, который будет готовить данные и отправлять их в бекап.
nano backup.sh
--------------
#!/bin/bash
# backup.foo - имя сервера для бэкапов (может быть и IP)
# testrepo - репозиторий
# `date +%Y%m%d_%H%M%S` - подстановка даты
# /home - каталог который мы бэкапим
borg create -C lz4 borg@backup.foo:testrepo::home_`date +%Y%m%d_%H%M%S` /home
--------------

== Серверная часть ==
0. Снова заходим в сеанс пользователя borg
sudo -i -u borg

1. редактируем файл .ssh/authorized_keys, добавляем строку
nano .ssh/authorized_keys
-------------------------
command="/usr/bin/borg serve --restrict-to-repository /mnt/backups/testrepo --append-only",restrict 
-------------------------

В файле:
# --restrict-to-repository /mnt/backups/testrepo - репозиторий для удаленного пользователя
# --append-only - разрешено только удаление 
# restrict  - публичный ключ клиента 

# Дополнительные 
restrict,no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-x11-forwarding

Примеры ручной очистки репозиториев

# Хранить 7 архивов на конец дня и 4 дополнительных архива на конец недели.
# Выполните пробный прогон(--dry-run), фактически ничего не удаляя.
$ borg prune -v --list --dry-run --keep-daily=7 --keep-weekly=4 /path/to/repo

# То же, что и выше, но применяется только к именам архивов, начинающимся с имени хоста
# машины, за которой следует символ "-":
$ borg prune -v --list --keep-daily=7 --keep-weekly=4 --prefix='{hostname}-' /path/to/repo

# Хранить 7 архивов на конец дня, 4 дополнительных архива на конец недели,
# и архив на конец месяца для каждого месяца:
$ borg prune -v --list --keep-daily=7 --keep-weekly=4 --keep-monthly=-1 /path/to/repo

# Хранить все резервные копии за последние 10 дней, 4 дополнительных архива на конец недели,
# и архив на конец месяца для каждого месяца:
$ borg prune -v --list --keep-within=10d --keep-weekly=4 --keep-monthly=-1 /path/to/repo

--keep-within INTERVAL	храним все архивы в течение указанного промежутка времени
--keep-last, --keep-secondly 	сколько последних копий хранить
--keep-minutely 	сколько поминутных архивов хранить
-H, --keep-hourly 	сколько почасовых архивов хранить
-d, --keep-daily 	сколько ежедневны архивов хранить
-w, --keep-weekly 	сколько еженедельных архивов хранить
-m, --keep-monthly 	сколько ежемесячных архивов хранить
-y, --keep-yearly 	сколько ежегодных архивов хранить

# Хранить последние 14 копий с интервалом в день, 8 копий с интервалом в неделю и 12 копий с интервалом в месяц
borg prune -v --list --keep-daily 14 --keep-weekly 8 --keep-monthly 12 /path/to/repo

# пример в crond
cat /etc/cron.d/borgprune 
# prune backup
0 4 * * * borg /usr/bin/borg prune --force -v --list --keep-daily 10 --keep-weekly 5 --keep-monthly 8 /mnt/backups/eyh

Авто очистка сервера borg

В разработке.

Откат команд удаления, удалённых в режиме —append-only

Список транзакций находится в файле transactions, в каталоге репозитория.

Например если мы видим вот такой лог

   transaction 1, UTC time 2016-03-31T15:53:27.383532
   transaction 5, UTC time 2016-03-31T15:53:52.588922
   transaction 11, UTC time 2016-03-31T15:54:23.887256
   transaction 12, UTC time 2016-03-31T15:55:54.022540
   transaction 13, UTC time 2016-03-31T15:55:55.472564

И выяснили, что последняя легитимная транзакция имеет номер 5, то нужно удалить все транзакции после 5.

Для этого в каталоге с репозиторием выполняем

   rm data/**/{6..13}
   borg delete --cache-only <имя репозитория>

Это действие вызовет предупреждение со стороны клиентов borg 
при следующем обращении к репозиторию и просьбу подтвердить продолжение.
Поэтому, если предполагается продолжить использование этого репозитория настроенными на него клиентами, 
то на всех нужно выполнить list репозитория и согласится использовать репозиторий. 
Либо на клиентах удалить файл (manifest-timestamp)
rm ~/.config/borg/security/REPOID/manifest-timestamp

Извлечение и монтирование бекапов

Вы можете добавить добавить свой ssh-ключ для пользователя borg без опций --restrict-to-repository 
и --append-only, для управления репозиториями со своего рабочего места.

borg list borg@backup.foo:<репозиторий> - получить список бекапов в репозитории

borg list borg@backup.foo:<репозиторий>::<имя бекапа> - получить список файлов в бекапе

borg extract borg@backup.foo:<репозиторий>::<имя бекапа> [что извлекаем] - извлекаем весь бекап или его часть в текущий каталог

!!! самое интересное в borg
borg mount -o users borg@backup.foo:<репозиторий>::<имя бекапа> <точка монтирования> - монтируем бекап с помощью механизма FUSE
borg umount <точка монтирования> - отмонтируем командой

borg mount /path/to/repo /tmp/mymountpoint
borg umount /tmp/mymountpoint

borg mount /path/to/repo::root-2016-02-15 /tmp/mymountpoint
borg umount /tmp/mymountpoint

При монтировании могут возникнуть проблемы с правами доступа к файлам. 
В этомслучае можно смонтировать через sudo, переопределив команду ssh. 
В этом случае ходить по смонтированному бекапу также придется с помощью sudo
sudo borg mount -o users --rsh "ssh -i <ваш ключ>" borg@backup.foo:<репозиторий>::<имя бекапа> <точка монтирования>


При извлечении и монтировании можно исключить файлы по шаблону ключом --exclude
--exclude '/home/*/.cache/*
--exclude '/home/*/.tmp/*'

borg mount /path/to/repo /tmp/mymountpoint only/that/path

borg mount --exclude '...' /path/to/repo /tmp/mymountpoint

Официальный скрипт для borgbackup

###!!! https://borgbackup.readthedocs.io/en/stable/quickstart.html#a-step-by-step-example

#!/bin/sh

# Setting this, so the repo does not need to be given on the commandline:
export BORG_REPO=ssh://username@example.com:2022/~/backup/main

# See the section "Passphrase notes" for more infos.
export BORG_PASSPHRASE='XYZl0ngandsecurepa_55_phrasea&&123'

# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM

info "Starting backup"

# Backup the most important directories into an archive named after
# the machine this script is currently running on:

borg create                         \
    --verbose                       \
    --filter AME                    \
    --list                          \
    --stats                         \
    --show-rc                       \
    --compression lz4               \
    --exclude-caches                \
    --exclude '/home/*/.cache/*'    \
    --exclude '/var/tmp/*'          \
                                    \
    ::'{hostname}-{now}'            \
    /etc                            \
    /home                           \
    /root                           \
    /var                            \

backup_exit=$?

info "Pruning repository"

# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:

borg prune                          \
    --list                          \
    --prefix '{hostname}-'          \
    --show-rc                       \
    --keep-daily    7               \
    --keep-weekly   4               \
    --keep-monthly  6               \

prune_exit=$?

# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))

if [ ${global_exit} -eq 0 ]; then
    info "Backup and Prune finished successfully"
elif [ ${global_exit} -eq 1 ]; then
    info "Backup and/or Prune finished with warnings"
else
    info "Backup and/or Prune finished with errors"
fi

exit ${global_exit}

Пример самапала

cat backupborg_norm.sh
#!/usr/bin/env bash

## если используется нестандартный SSH-ключ,
## то его надо явно указать:
# export BORG_RSH="ssh -i /home/userXY/.ssh/id_ed25519"

## пароль репозитория Borg можно указать в переменной
## окружения, чтобы не вводить его при каждом запуске
# export BORG_PASSPHRASE="top_secret_passphrase"

##
## Задание переменных окружения
##

## вот так выглядит без переменных
## borg create -C lz4 borg@10.3.1.183:piraspberry::etc_`date +%Y%m%d_%H%M%S` /etc


DATESTAMP=`date +%Y%m%d_%H%M%S`

LOG="backup.log"

BACKUP_USER="borg"

BACKUP_SERVER="10.3.1.183"

REPOSITORY="piraspberry"

NAME_BACKUP="full"

BACKUP_REP="${BACKUP_USER}@${BACKUP_SERVER}:${REPOSITORY}::${NAME_BACKUP}_${DATESTAMP}"


## Исключаем не нужное
##
export BACKUP_EXCLUDE="\
--exclude '/home/*/.cache/*' \
--exclude '/home/*/.tmp/*' \
--exclude /dev \
--exclude /proc \
--exclude /sys \
--exclude /var/run \
--exclude /run \
--exclude /lost+found \
--exclude /mnt"

##
## Будем бэкапить следующие
##

export BACKUP_LIST="\
/etc \
/home \
/root \
/var/log \
/var/spool \
/usr/local \
/opt \
/srv"


#/var/www
#/var/tmp/backup

##
## Вывод в файл журнала
##

exec > >(tee -i ${LOG})
exec 2>&1

echo "======= Backup started: $(date) ========"

## Здесь можно выполнить дополнительные действия
## перед созданием резервной копии, например:
## - сделать дамп базы данных
## - заархивировать /var/www
####[Create and changes directory]
#mkdir /root/backup-tmp
#cd /root/backup-tmp
##[Stamps the file name with a date]
#TIMESTAMP=`date +%m-%d-%y-%H%M`
####[DB Backup Scripts]
#HOST=localhost
#DBNAME="basename"
#USER="username"
#PASSWORD="password"
#DUMP_PATH=/root/backup-tmp/sql
#BACK_PATH=/root/backup-tmp/www/
#BACK_PATH3=/root/backup-tmp/etc/
####[DB Backups]
#mysqldump --opt -c -e -Q -h$HOST -u$USER -p$PASSWORD $DBNAME > $DBNAME.sql
#tar czpf $DUMP_PATH/$DBNAME.$TIMESTAMP.tar.gz $DBNAME.sql
#rm -f $DBNAME.sql
###[Backing files /var/www /etc]
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
#tar cvzpf $BACK_PATH3/etc.$TIMESTAMP.tar.gz /etc



##
## Передача файлов в репозиторий.
##

echo "Transfer files ..."

##
## Вот так выглядит бэкап в консоле одного каталога etc
# borg create -C lz4 borg@10.3.1.183:piraspberry::etc_`date +%Y%m%d_%H%M%S` /etc
##

##
## Выполняем архив
##

borg create -C lz4 \
        ${BACKUP_EXCLUDE} \
        ${BACKUP_REP} \
        ${BACKUP_LIST}


###
### Действия после всех действий
## - Например удалить каталог сделанный скриптом в примере выше
## rm -rf /root/backup-tmp
## - Или выполнять его очистку, удалять файлы старше 5 дней
## find /var/backup-tmp/mysql -name "*.tar.gz" -mtime +5 |xargs /bin/rm -f {};
## find /var/backup-tmp/www -name "*.tar.gz" -mtime +5 |xargs /bin/rm -f {};



echo "======== Backup ended: $(date) =========="


Установка графического интерфейса (GUI) для Borg

!!! не очень надо, так для общего развития
!!! интерфейс называется vorta
!!! для установки требует python 3.6+
!!! работает X

pip3 install vorta

ссылки

https://borgbackup.readthedocs.io/en/stable/
https://borgbackup.readthedocs.io/en/stable/usage/notes.html#append-only-mode
https://borgbackup.readthedocs.io/en/stable/usage/create.html
https://borgbackup.readthedocs.io/en/stable/quickstart.html#a-step-by-step-example
https://borgbackup.readthedocs.io/en/stable/usage/extract.html
https://borgbackup.readthedocs.io/en/stable/usage/rename.html
https://borgbackup.readthedocs.io/en/stable/usage/prune.html
https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html
https://b.tinyops.ru/linux-backup-with-borg/
http://www.opennet.ru/tips/3180_borg_backup.shtml
Рубрики
bareos

bareos установка / install server bareos / bareos-dir / bareos-fd / bareos-sd / postgre / webgui

Описание компонентов:

Bareos Director — компонент который управляет заданиями (jobs) и операциями резервного копирования, или восстановления, а так же управляет File и Storage Daemon’ами.

Baroes Console — текстовая консоль для управления Bareos Director’ом через специальный командный синтаксис. 
По умолчанию устанавливается вместе с Bareos Director, но может устанавливаться и отдельно для удаленного подключения к Bareos Director.

Bareos Web UI — веб-интерфейс Bareos. По умолчанию устанавливается вместе с Bareos Director. 
Данный компонент пока что на стадии развития и используется больше для удобного мониторинга, но можно вручную запускать задачи на резервное копирование, или восстановление. 
Тогда как расписание и задания создаются в основном через текстовые конфиги, или через консоль bareos, а не через веб-интерфейс.

Bareos Catalog — база данных, которая содержит информацию по расписаниям, заданиям, сохраненным файлам, клиентам, статусам.

Storage Daemon — компонент, который выполняет операции чтения и записи на устройствах хранения, используемых для резервного копирования.

File Daemon — агент, который используется для сбора с “клиентских” систем и их размещения при операциях восстановления.

Установка сервера bareso на debian 10 :

!!! Будем использовать репозиторий разработчика 
0. добавление репозитория
apt install wget

Переменные из скрипта установки
# RELEASE=experimental/nightly
# DIST=Debian_9.0
# DIST=xUbuntu_20.04
# DIST=xUbuntu_18.04
# DIST=xUbuntu_16.04

DIST=Debian_10
RELEASE=release/20


URL=http://download.bareos.org/bareos/$RELEASE/$DIST
wget -O /etc/apt/sources.list.d/bareos.list $URL/bareos.list
wget -q $URL/Release.key -O- | apt-key add -

## для 17.2 можно забить на подпись вот так [trusted=yes] (да при apt update будет предупреждение) 
##cat /etc/apt/sources.list.d/bareos.list
##deb [trusted=yes] http://download.bareos.org/bareos/release/17.2//Debian_9.0 /


1. установка установка bareos 
apt update
apt install bareos bareos-database-postgresql (на вопрос конфигурации postgreSQL отвечаем no)

2. установка postgressql
apt install postgresql

3. загружаем базу bareos
su postgres -c /usr/lib/bareos/scripts/create_bareos_database
su postgres -c /usr/lib/bareos/scripts/make_bareos_tables
su postgres -c /usr/lib/bareos/scripts/grant_bareos_privileges

4. запускаем bareos 
systemctl start bareos-dir
systemctl start bareos-fd
systemctl start bareos-sd


3. установка web интерфейса (может не надо)
apt install bareos-webui
systemctl reload apache2

Создаем пользователя для веб интерфейса:

bconsole

reload

configure add console name=admin password=secret profile=webui-admin tlsenable=false

reload

Пользователь: admin
Пароль: secret
Web-GUI: http://SERVER_BAREOS/bareos-webui
Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

bzip2 архивирование и сжатие файлов

bunzip2 file1.bz2 - разжимает файл 'file1.bz2'
bzip2 file1 - сжимает файл 'file1'


Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

gzip архивирование и сжатие файлов

gzip file1 - сжимает файл 'file1'
gzip -9 file1 - сжать файл file1 с максимальным сжатием

gunzip file1.gz - разжимает файл 'file1.gz'

Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

zip архивирование и сжатие файлов

zip file1.zip file1 - создать сжатый zip-архив
zip -r file1.zip file1 file2 dir1 - создать сжатый zip-архив и со включением в него нескольких файлов и/или директорий
unzip file1.zip - разжать и распаковать zip-архив

Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

rar архивирование и сжатие файлов

rar a file1.rar test_file - создать rar-архив 'file1.rar' и включить в него файл test_file
rar a file1.rar file1 file2 dir1 - создать rar-архив 'file1.rar' и включить в него file1, file2 и dir1
rar x file1.rar - распаковать rar-архив
unrar x file1.rar - распаковать rar-архив
Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

tar архивирование и сжатие файлов

tar -cvf archive.tar file1 - создать tar-архив archive.tar, содержащий файл file1
tar -cvf archive.tar file1 file2 dir1 - создать tar-архив archive.tar, содержащий файл file1, file2 и dir1
tar -tf archive.tar - показать содержимое архива
tar -xvf archive.tar - распаковать архив
tar -xvf archive.tar -C /tmp - распаковать архив в /tmp
tar -cvfj archive.tar.bz2 dir1 - создать архив и сжать его с помощью bzip2(Прим.переводчика. ключ -j работает не во всех *nix системах)
tar -xvfj archive.tar.bz2 - разжать архив и распаковать его(Прим.переводчика. ключ -j работает не во всех *nix системах)
tar -cvfz archive.tar.gz dir1 - создать архив и сжать его с помощью gzip
tar -xvfz archive.tar.gz - разжать архив и распаковать его
Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

crontab \ at

at - программа для настройки однократных заданий выполненный программ по расписанию
atrm 11 - удалить задание 11
crontab -e - редактировать расписание выполнения процессов текущего пользователя
crontab -eu n_user - редактировать расписание выполнения процессов пользователя n_user
crontab -l - отображает содержимое файла crontab текущего пользователя
crontab -r - удаляет файл crontab текущего пользователя
/etc/crontab - раньше системные задания заносили сюда (возможность осталась)
/etc/cron.hourly - задания выполняются каждый час
/etc/cron.daily - задания выполняются раз в день
/etc/cron.weely - задания выполняются раз в неделю
/etc/cron.monthly - задания выполняются раз в месяц
Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

Архивация и сжатие файлов / архиваторы / gzip / rar / bzip / tar / zip / 7z / xz

gzip

gzip -9 file1 - поместить файл file1 в архив gzip с максимальной степенью сжатия
gzip file1 - сжимает файл file1
gunzip file1.gz - разжимает файл file1.gz

rar

rar a file1.rar file1 file2 dir1 - создать rar архив file1.rar, заархивировать файлы: file1, file2 и директорию: dir1
rar a file1.rar test_file - упаковать в rar архив file1.rar файл test_file
rar x file.rar - разархивировать rar архив file.rar
unrar x file1.rar - распаковать rar-архив

bzip

bzip2 file1 - сжимает файл file1
bunzip2 file1.bz2 - разжимает файл file1.bz2

tar

!!! параметр f всегда должен быть в конце иначе тар вылетит с ошибкой
tar -cvf archive.tar file1 file2 dir1 - создать tar архив archive.tar, упаковав в него файлы file1, file2 и директорию dir1
tar -cvf archive.tar file - упаковать в tar-архив archive.tar, файл file
tar -tf archive.tar - вывести содержимое tar архива
tar -xvf archive.tar - распаковать tar архив
tar -xvf archive.tar -C /tmp - распаковать архив в /tmp
tar -cvzf archive.tar.gz dir1 - создать tar архив и сжать его с помощью программы gzip
tar -xvzf archive.tar.gz - разжать tar архив и распаковать его
tar -cvjf archive.tar.bz2 dir1 - создать архив и сжать его с помощью bzip2 ( ключ -j работает не во всех *nix системах )
tar -xvjf archive.tar.bz2 - разжать архив и распаковать его ( ключ -j работает не во всех *nix системах )


tar cvzf mygzip.tar.gz folder1 - создать архив каталога folder1 использовать сжатие gzip
tar cvzf mygzip.gz folder1 - создать архив каталога folder1 использовать сжатие gzip
хорошим тоном считается писать расширение так tar.gz 
c - create 
v - verbose
z - сжатие gz
f - file (имя файла)
 
tar cvjf myfile.tar.bz2 folder1 - создать архив каталога folder1 использовать сжатие bz2
tar cjf myfile.tar.bz2 folder1 - создать архив каталога folder1 использовать сжатие bz2
c - create 
v - verbose
j - сжатие bz2
f - file (имя файла)
 
tar cvJf myfile.tar.bz2 folder1 - создать архив каталога folder1 использовать сжатие xz
tar cJf myfile.tar.bz2 folder1 - создать архив каталога folder1 использовать сжатие xz
c - create 
v - verbose
J - сжатие xz
f - file (имя файла)

tar cvzpf /home/Backup-etc`date +%y_%m_%d`.tgz /etc 2>/home/error.log - создание архива каталога с временной меткой
tar -cvf archive.tar file1 file2 dir1 - создать tar архив archive.tar, упаковав в него файлы file1, file2 и директорию dir1
tar -cvf archive.tar file - упаковать в tar-архив archive.tar, файл file
tar -cvzf archive.tar.gz dir1 - создать tar архив и сжать его с помощью программы gzip
tar -cvjf archive.tar.bz2 dir1 - создать архив и сжать его с помощью bzip2 ( ключ -j работает не во всех *nix системах )
 
tar -tf archive.tar - вывести содержимое tar архива
tar tfv viruses-2010-05-18.tar.bz2 1>zxcvirus.txt - просмотр архива и запись в файл описания
 
 
 
tar -xvzf archive.tar.gz - разжать tar архив gz и распаковать его
tar -xvjf archive.tar.bz2 - разжать архив bz и распаковать его ( ключ -j работает не во всех *nix системах )
tar -xvf archive.tar - распаковать tar архив в текущей директории ( в принципе указывать метод сжатия не обязательно, tar сам разберется) 
tar -xvf archive.tar -C /tmp - распаковать архив в /tmp

xz

xz my.tar - внимание запакует файл и удалит файл foo
unxz foo.tar.xz - внимание распакует, а исходный архив будет удален
tar xvf filename.tar.xz

zip

zip как_назвать_архив.zip что_запоковать_ 
zip file1.zip file1 - сжать один файл в zip-архив 
zip -r file1.zip file_dir - запаковать в архив несколько файлов и/или директорий
zip -r file1.zip file1 file2 dir1 - запаковать в архив несколько файлов и/или директорий
unzip file1.zip - разжать и распаковать zip-архив

Подробнее

Чтобы сжать каталог в архив и разделить его на части с помощью команды tar, можно воспользоваться следующим набором команд:
Сжать каталог в архив с помощью tar и сжать его с помощью gzip:
tar -czvf archive.tar.gz /path/to/directory
-c — создание нового архива.
-z — сжатие с помощью gzip.
-v — вывод информации о процессе.
-f — указание имени выходного файла.
/path/to/directory — путь к каталогу, который нужно заархивировать.

Разделить архив на части с помощью split: П
осле создания архива можно разделить его на части с помощью команды split. 
Например, чтобы разделить архив на части по 100 мегабайт:
split -b 100M archive.tar.gz archive_part_
-b 100M — размер каждой части (100 мегабайт).
archive.tar.gz — исходный архив.
archive_part_ — префикс имен для частей архива (файлы будут называться archive_part_aa, archive_part_ab и т.д.).


Как собрать архив обратно:
Для восстановления архива из частей, нужно выполнить следующую команду:
cat archive_part_* > archive.tar.gz

После этого архив можно разархивировать обратно:
tar -xzvf archive.tar.gz





7zip 
Чтобы сжать файл или каталог в архив и разделить его на части с помощью 7zip, нужно использовать команду 7z в терминале.

1. Сжать каталог с помощью 7zip:
Для сжатия каталога в архив формата .7z, используется следующая команда:
7z a -v100m archive.7z /path/to/directory
a — добавить файлы в архив.
-v100m — разделить архив на части по 100 мегабайт.
archive.7z — имя выходного архива.
/path/to/directory — путь к каталогу, который нужно заархивировать.

2. Разделение архива на части:
Опция -v указывает размер каждой части архива. Например, -v100m означает, что каждая часть будет размером по 100 МБ. 
В результате вы получите файлы вида archive.7z.001, archive.7z.002 и т.д.
7z a -v500m backup.7z /home/user/myfolder
Этот пример создаст архив с именем backup.7z, который будет разделён на части по 500 мегабайт.

3. Распаковка архива:
Чтобы распаковать архив из частей, достаточно запустить команду 7z x:
7z x archive.7z.001
7zip автоматически найдет все части архива и соберет их.

7z -b / benchmark / производительность

apt install p7zip-full lm-sensors


while true; do
    echo "=== $(date) ===" >> benchmark_log.log  # Добавляем метку времени
    7z b >> benchmark_log.log                     # Логируем результаты теста 7z
    echo "=== Sensors ===" >> benchmark_log.log   # Разделитель для данных с датчиков
    sensors >> benchmark_log.log                  # Логируем данные с датчиков температуры
    echo "" >> benchmark_log.log                  # Пустая строка для удобства чтения
    sleep 1                                       # Интервал перед следующим циклом (можно изменить)
done


while true; do
    echo "=== $(date) ===" >> benchmark_log.log
    7z b >> benchmark_log.log
    echo "=== Sensors ===" >> benchmark_log.log
    sensors >> benchmark_log.log
    echo "" >> benchmark_log.log
    sleep 1
done

Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

Правило «3-2-1»

Ссылки:

https://habr.com/ru/company/veeam/blog/188544/
https://blog.selectel.ru/rezervnoe-kopirovanie-c-pomoshhyu-instrumentov-veeam/
https://habr.com/ru/company/veeam/blog/193568/

Правило «3-2-1»

Правило «3-2-1»
Иметь по меньшей мере три копии данных.
Хранить копии на двух разных носителях.
Хранить одну резервную копию на удаленной площадке.

Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

crontab -e

crontab -e


* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

пример:

 
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."
5 4 * * sun echo "Выполняется в 4:05 в воскресенье"
0 0 1 1 * echo "С новым годом!"
15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15"
0-59 * * * * echo "Выполняется ежеминутно"
0-59/2 * * * * echo "Выполняется по четным минутам"
1-59/2 * * * * echo "Выполняется по нечетным минутам"
*/5 * * * * echo "Прошло пять минут"
* 5 4-10 0-3 * echo "HELLO" - печать HELLO в 5:00 на 4,5,6,7,8,9,10 дни января, февраля, марта и апреля
* */2 * * sat echo "HELLO"  - печать HELLO каждый четный час, каждую субботу
* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO" - печать HELLO каждый четный час, каждую субботу
* 0-23/2 * * sat echo "HELLO"  - печать HELLO каждый четный час, каждую субботу
59 23 31 dec * echo "Happy new year" - без комментариев :), поздравит с новым годом
0-59 * * * * /home/user/mail 2>/tmp/tmp.cron - для отладки задания cron, можно перенаправить результат в файл

Запуск от другого пользователя:

sudo crontab -e -u user
где user -пользователь от имени которого будет производиться запуск.

Файлы cron:

/etc/cron.hourly, /etc/cron.daily, и т.д. - каталоги с заданиями cron (crontab -e )

Отправка логов на почту:

SHELL=/bin/bash  - означает использовать для запуска команд /bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin - означает использовать для запуска команд /bin/bash 
MAILTO=root - означает кому отсылать сообщение о результате работы команд
HOME=/  - корневой каталог для пользователя (параметр не обязательный)
# run-parts
01 * * * * root run-parts /etc/cron.hourly - содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа
02 4 * * * root run-parts /etc/cron.daily - содержимое каталога /etc/cron.daily будет запускаться каждый день на второй минуте четвертого часа
22 4 * * 0 root run-parts /etc/cron.weekly - содержимое каталога /etc/cron.weekly будет запускаться каждое воскресенье на 22'ой минуте 4'го часа
42 4 1 * * root run-parts /etc/cron.monthly - содержимое каталога /etc/cron.monthly будет запускаться каждый первый день месяца на 42'ой минуте 4'го часа

Логи:

contab -l - все задания в кроне
В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день
Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

Резервное копирование \ backup \ find \ rsync \ dd \ dump \ restore \ tar \ script \ bash \ tar \ mysqldump \ cron \ dd \ ssh

0. Backup site, Mysql and files www

#!/bin/bash
#
#VARS
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup

# Backup mysql
mysqldump --opt -c -e -Q -h$HOST -u$USER -p$PASSWORD $DBNAME > $DBNAME.sql
tar czpf $DUMP_PATH/$DBNAME.$TIMESTAMP.tar.gz $DBNAME.sql
rm -f $DBNAME.sql

# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz /var/www/html/name_site
tar cvzpf $BACK_PATH_ETC/etc.$TIMESTAMP.tar.gz /etc

# Clean DB
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;

# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql

0.1 experements

#!/bin/bash

#VAR
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup
 
# Backup mysql
mysqldump --opt -c -e -Q -h${HOST} -u${USER} -p${PASSWORD} ${DBNAME} > ${DBNAME}.sql
tar czpf ${DUMP_PATH}/${DBNAME}.${TIMESTAMP}.tar.gz ${DBNAME}.sql
rm -f ${DBNAME}.sql
 
# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf ${BACK_PATH}/www.${TIMESTAMP}.tar.gz /var/www/html
tar cvzpf ${BACK_PATH_ETC}/etc.${TIMESTAMP}.tar.gz /etc

# CLEAN FOLDER BACKUP
#!!! выполняем команду ls если выведет больше 2 то выполнится команда  ls /etc/
#if (( `ls /home/ | wc -l` > 2)); then true ; else false ; fi && ls /etc/
# find /var/backup/www -name "*.tar.gz" -mtime +30 -delete - найти все файлы старше 30 дней и удалить
##### old cleaner
##for i in ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}; do
##     if (( `ls ${i} | wc -l` > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
##done
# Cleaner new
delfiles(){
for i in $1 $2 $3 $4 $5 $6; do
        calc=$(ls ${i} | wc -l) 
        if ((${calc} > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
done
}
delfiles ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}



#HINT
# SYSTEMCTL
# systemctl status wp-backup.service
# systemctl status wp-backup.timer
# Clean DB erase
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;
# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql
# RSYNC to remote server
# sync -avz /root/backup-wp user@YOU-server-IP-DNS:/home/user/backup-wp

0.2 Systemd + скрипт для бэкапа


0. Создаем каталоги:
mkdir -p /root/backup/{etc,www,sql}
1. Создаем скрипт для бэкапа и вносим изменения для переменных
cat > /root/backup/backup.sh << "EOF"
----------------------------
#!/bin/bash
#VAR
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup
 
# Backup mysql
mysqldump --opt -c -e -Q -h${HOST} -u${USER} -p${PASSWORD} ${DBNAME} > ${DBNAME}.sql
tar czpf ${DUMP_PATH}/${DBNAME}.${TIMESTAMP}.tar.gz ${DBNAME}.sql
rm -f ${DBNAME}.sql
 
# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf ${BACK_PATH}/www.${TIMESTAMP}.tar.gz /var/www/html
tar cvzpf ${BACK_PATH_ETC}/etc.${TIMESTAMP}.tar.gz /etc

# CLEAN FOLDER BACKUP
# выполняем только если файлов в каталогах для бекапа больше двух 
delfiles(){
for i in $1 $2 $3 $4 $5 $6; do
        calc=$(ls ${i} | wc -l) 
        if ((${calc} > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
done
}
delfiles ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}
EOF


2. Создаем сервис в systemd
cat > /etc/systemd/system/backup-wp.service << "EOF"
[Unit]
Description=backup
 
[Service]
Type=oneshot
ExecStart=/root/backup/backup.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF

3. Создаем таймер в systemd для будем бэкапить в 2 часа ночи
cat > /etc/systemd/system/backup.timer << "EOF"
[Unit]
Description=backup
 
[Timer]
OnCalendar=02:00:00
 
[Install]
WantedBy=timers.target
EOF

4. Активируем сервисы для бекапа
systemctl daemon-reload
systemctl enable backup-wp.service
systemctl enable backup-wp.timer 
systemctl status backup-wp.service
systemctl status backup-wp.timer 
systemctl list-timers backup-wp.timer 

5. Может пригодится:
#HINT
# SYSTEMCTL
# systemctl status backup-wp.service
# systemctl status backup-wp.timer
# Clean DB erase
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;
# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql
# RSYNC to remote server
# sync -avz /root/backup-wp user@YOU-server-IP-DNS:/home/user/backup-wp


1. BackUp MySQL

#!/bin/sh
mkdir -p ${BKPDIR}/MySQL 2>/dev/null
mysqldump --databases -uUSER -pDLINNIYPASSWORD mysql| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-mysql-MySQL.gzip"
mysqldump --databases -uUSER -pESCHEODINPASSWORD phpmyadmin| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-phpmyadmin-MySQL.gzip"

2. BackUp PostgreSQL

#!/bin/sh
mkdir -p ${BKPDIR}/PostgreSQL 2>/dev/null
(su - postgres -c "pg_dump postgres" <"${BKPDIR}/PostgreSQL/${DATEYMD}-postgres-PostgreSQL.gzip"
TUT_NUZNO_PISAT_PASSWORD_DLYA_BAZY
EOF

3. BackUp MBR

#!/bin/sh
mkdir -p ${BKPDIR}/MBR 2>/dev/null
dd if=/dev/sda of="${BKPDIR}/MBR/${DATEYMD}-sda-mbr.bin" bs=512 count=1

Для восстановления всей MBR надо запустить
dd if=sda-mbr.bin of=/dev/sdX bs=1

Для восстановления таблицы разделов нужно использовать
dd if= sda-mbr.bin of=/dev/sdX bs=1 count=64 skip=446 seek=446

Для восстановления только загрузчика запустите
dd if=sda-mbr.bin of=/dev/sdX bs=1 count=446

Показывать прогресс
dd status=progress if=NMA_YOU_IMAGE.img of=/dev/sdX

4. BackUp копирования файлов по маске

#!/bin/sh
find /www -name '*.php' -or -name '*.js' -or -name '*.pl' -or -name '*.ephtml' -or -name '.htaccess' -or -name 'htpasswd' -or -name 'htgroup'>${SCRIPTDIR}/www.bkp
cat ${SCRIPTDIR}/${MAPFILE}|grep "www">/dev/null
if [ "$?" -eq 1 ]; then echo "">>${SCRIPTDIR}/${MAPFILE}; echo www>>${SCRIPTDIR}/${MAPFILE}; fi

5. BackUp system easy (tar)

без даты
tar cvzpf /home/Backup.tgz --same-owner --exclude=/home/Backup.tgz --exclude=/home/error.log --exclude=/proc/* --exclude=/media/* --exclude=/dev/* --exclude=/mnt/* --exclude=/sys/* --exclude=/tmp/* / 2>/home/error.log

с датой
tar cvzpf /home/Backup_`date +%y_%m_%d`.tgz --same-owner --exclude=/home/Backup.tgz --exclude=/home/error.log --exclude=/proc/* --exclude=/media/* --exclude=/dev/* --exclude=/mnt/* --exclude=/sys/* --exclude=/tmp/* / 2>/home/error_`date +%y_%m_%d`.log

восстановление
tar xvzf /home/Backup.tgz -C /

6. ssh \ ssh-keygen \ ssh-copy

Создать пользователя "USRER_NAME" с домашним каталогом "/backup/USRER_CATALOG_BACKUP": 
adduser --home /backup/USRER_CATALOG_BACKUP --disabled-password borg USRER_NAME
Подключится пользователем 
sudo -i -u USRER_NAME

ssh - поддержка авторизация без пароля с помощью RSA ключей

Выполнять на клиенте с которого будем подключатся к серверу.
ssh-keygen - создаем пару ключей на сервере с которого будем подключатся.
ssh-copy-id sammy@IP_адрес_вашего_сервера - копирование открытого ключа

На сервере куда будем класть бэкапы, пользователю в домашнем каталоге добавляем публичные ключи:
.ssh/authorized_keys

Если нет каталога .ssh можно его создать
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

7. find

find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 - поиск всех файлов, заканчивающихся на ".log" в директории /var/log, и упаковка их в bzip-архив

find /home/user -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents - поиск в директории /home/user файлов, имена которых оканчиваются на ".txt", и копирование их в другую директорию

find /var/backup/www -name "*.tar.gz" -mtime +30 |xargs /bin/rm -f {}; - найти все файлы старше 30 дней и удалить

find /var/backup/www -name "*.tar.gz" -mtime +30 -delete - найти все файлы старше 30 дней и удалить

8. rsync

rsync [опции] источник [приемник]

rsync ключи:
-p  сохранить разрешения
-A  сохранить ACL
-a  режим архива
-v  подробный режим
-z  сжать данные файла во время передачи
--exclude={'dir_name','file_name'} исключаем каталоги dir_name и файлы file_name
--rsync-path="sudo rsync" подымаем rsync права до root
--bwlimit=2048 ограничить скорость передачи

rsync -avzpA --exclude={'proc','dev','lost+found','tmp','run','sys'} --rsync-path="sudo rsync" Имя_хоста_которыйбэкапим:/ /куда.бэкапим



rsync -a /dir1/dir2 /dir3 - будет создана иерархия /dir3/dir2/файлы
rsync -a /dir1/dir2/ /dir3 - будет создана иерархия /dir3/файлы
rsync -a $srv/ $srv:src
rsync -av --delete -e /dir/откуда/ /dir/куда/ - зеркалирование (v-вывод действий)
 
rsync -avz --rsync-path="sudo rsync" user@host:/tmp/file /tmp - копируем user@host:/tmp/file в каталог /tmp, а параметр "sudo rsync" позволит выполнить от root (пользователь user должен быть в sudo)
 
rsync --rsync-path="echo  | sudo -Sv && sudo rsync" --archive --acls --xattrs --one-file-system -e "ssh -T -c arcfour -o Compression=no -x" --exclude=".*" --size-only --log-file=/home/backup/rsync.log  

!!! Если удалять файлы, исчезнувшие в исходном каталоге, но присутствующие в целевом, не нужно — ключ --delete убрать.
rsync -rogpav --delete /home /tmp - синхронизировать директории /tmp и /home
rsync -az -e ssh --delete ip_addr:/home/public /home/local - синхронизировать локальную и удаленную директории через ssh туннель используя сжатие
rsync -rogpav -e ssh --delete /home ip_address:/tmp - синхронизация через SSH туннель
rsync -az -e ssh --delete /home/local ip_addr:/home/public - синхронизировать удалённую директорию с локальной используя ssh туннель со сжатием

cсинхронизация каталогов ssh+rsync:
rsync -avz --delete -e ssh логин@удалённый.хост:путь/откуда/ путь/куда   - изменяется удалённый каталог, копируем его на локальную машину
rsync -avz --delete -e ssh путь/откуда/ логин@удалённый.хост:путь/куда   - изменяется локальный каталог, копируем его на удаленную машину


9. dd

dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' - создать "слепок" локального диска в файл на удалённом сервере используя ssh туннель
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 - создание копии MBR ( Master Boot Record ) с /dev/hda на флоппи-диск
dd if=/dev/sda of=/tmp/backup - создание резервной копии содержимого жесткого диска в файл backup
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 - восстановить MBR с флоппи-диска на /dev/hda

9.1 dd \ как узнать о ходе выполнения процесса

!!! на случай если не указали ключик status=progress 
Как узнать о ходе процесса копирования командой dd?
1.Для примера: можно заставить dd копировать случайно генерируемые числа 
в "черную дыру" ≈ действие абсолютно бесполезное, зато наглядное.
dd if=/dev/random of=/dev/null bs=1K count=100  ( понадобится второй терминал)
dd if=/dev/random of=/dev/null bs=1K count=100 & ( или запустить в фоне)

2.
Узнаем PID процесса
pgrep -l '^dd$'
pgrep -l dd
ps uax |grep dd

3. Узнаем чем занят процесс
kill -USR1  PID

4. А вот так поставим на наблюдение (каждые 10 сек).
watch -n 10 kill -USR1 PID 

9.1.1 dd \ Показывать прогресс выполнения status=progress:


dd status=progress if=NMA_YOU_IMAGE.img of=/dev/sdX

9.2 dd \ клонирование

 
dd if=/dev/sda of=/dev/sdb bs=16M (if что of куда bs размер блока count сколько раз записывать)
dd if=/dev/sda of=/zxc/mbr.back bs=512 count=1 (backup mbr)
dd if=/zxc/mbr.back of=/dev/sda bs=512 count=1 (восстановления из backup)
______________________________________________________________
Сколько времени осталось
pgrep -l '^dd$'
watch -n 10 kill -USR1 PID 

9.3 dd Производительность дисков

 
time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000 
time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file - Читаем и пишем 1GB в /home (/dev/ad4s3c)
hdparm -tT /dev/hda - протестировать производительность чтения данных с жесткого диска

9.4 dd \ прочитать

10. dump \ restore

dump -0aj -f /tmp/home0.bak /home - создать полную резервную копию директории /home в файл /tmp/home0.bak
dump -1aj -f /tmp/home0.bak /home - создать инкрементную резервную копию директории /home в файл /tmp/home0.bak

restore -if /tmp/home0.bak - восстановить данные из резервной копии /tmp/home0.bak

9.5 dd \ делаем архив

 
umount /dev/hda1
dd if=/dev/hdal | gzip > bootpart.gz

9.6 dd \ читаем сырые данные диска \ вывод команды fdisk -l

dd if=/dev/sda bs=1 skip=446 count=16 | hexdump -C


Порядок байтов:
Порядок от младшего к старшему: англ. little-endian — с малого конца

11. tar

tar cvzpf /home/Backup-etc`date +%y_%m_%d`.tgz /etc 2>/home/error.log - создание архива каталога с временной меткой
tar -cvf archive.tar file1 file2 dir1 - создать tar архив archive.tar, упаковав в него файлы file1, file2 и директорию dir1
tar -cvf archive.tar file - упаковать в tar-архив archive.tar, файл file
tar -cvzf archive.tar.gz dir1 - создать tar архив и сжать его с помощью программы gzip
tar -cvjf archive.tar.bz2 dir1 - создать архив и сжать его с помощью bzip2 ( ключ -j работает не во всех *nix системах )
 
tar -tf archive.tar - вывести содержимое tar архива
tar tfv viruses-2010-05-18.tar.bz2 1>zxcvirus.txt - просмотр архива и запись в файл описания
 
 
 
tar -xvzf archive.tar.gz - разжать tar архив gz и распаковать его
tar -xvjf archive.tar.bz2 - разжать архив bz и распаковать его ( ключ -j работает не во всех *nix системах )
tar -xvf archive.tar - распаковать tar архив в текущей директории ( в принципе указывать метод сжатия не обязательно, tar сам разберется) 
tar -xvf archive.tar -C /tmp - распаковать архив в /tmp


tar -Puf backup.tar /home/user - создать инкрементную резервную копию директории /home/user в файл backup.tar сохраняя права доступа

( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' - упаковка в архив и копирование содержимого /tmp/local в директорию /home/share/ удалённого сервера, используя ssh туннель

( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' - упаковка в архив и копирование содержимого /home в директорию /home/backup-home удалённого сервера, используя ssh туннель

tar cf - . | (cd /tmp/backup ; tar xf - ) - упаковка в архив и копирование одной директории в другую с сохранением прав доступа и ссылок


11. SSH + TAR

#!/bin/sh
CMD="/bin/tar"
RCMD="ssh b14esh@linux"
DIRS="zxc3/"
DIRSN="zxc3"
DATEYMD=`date "+%Y-%m-%dv%k-%M"`
HOSTN=`hostname`
echo Backup $DIRSN $DATEYMD
cd /home/b14esh; $CMD -cjf - $DIRS | $RCMD "cat > $HOSTN.$DIRSN.$DATEYMD.tbz"

12. borg

borgbackup / backup / borg debian 10 / без шифрования репозитория

12. rsnapshot

rsnapshot - создание  снимков системы и файлов (backup)
apt-get install rssnapshot sshfs - установка