BackupPC

BackupPC - система резервного копирования, ориентированная на диски.

Возможности BackupPC:

  • Не требует установленного клиента.
  • Дедупликация данных. Идентичные файлы в нескольких резервных копиях одного и того же или разных ПК сохраняются только один раз, что приводит к существенной экономии дискового пространства и дискового ввода-вывода.
  • BackupPC является SMB‐ клиентом, поддерживает SSH, использует tar и rsync.
  • Поддерживаются все возможности восстановления, в том числе прямое восстановление (через smbclient, tar, или rsync/rsyncd), загрузка zip или tar архивов.
  • Интеллектуальная схема пулинга, минимизирующая дисковые ресурсы и ввод/вывод. Идентичные файлы во множестве резервных копий на одном и том же или разных PC сохраняются только единожды, что приводит к экономии дискового пространства и уменьшению количества операций записи. Это также называется "дедупликация данных".
  • Опция сжатия обеспечивает дополнительное уменьшение размера резервной копии. Нагрузка на процессор при этом низка, так как сжатию подвергаются только новые файлы (которых ещё нет в пуле).
  • Мощный http/cgi интерфейс позволяет администраторам просматривать логи, конфигурацию, текущий статус, а пользователям - начинать и отменять резервное копирование, просматривать и восстанавливать файлы из резервных копий.
  • Не нужно никаких клиентских программ. Для Windows применяется протокол SMB. А для Linux или Unix можно использовать rsync или tar (через ssh/rsh/nfs).
  • Гибкие опции восстановления. Как одиночные файлы, так и Zip и Tar архивы выбранных файлов и каталогов могут быть восстановлены непосредственно в CGI интерфейсе.
  • BackupPC поддерживает мобильные устройства, где имеется непостоянное подключение к сети и динамическая адресация (DHCP).
  • Гибкие параметры конфигурации позволяют параллельное выполнение нескольких задач резервного копирования.

Рекомендую для резервирования связку AutoMySQLBackup и BackupPC.

Хостинг для развёртывания BackupPC

Программа BackupPC не требовательная к ресурсами, значит в первую очередь нужны большие диски и устойчивый интернет. Для себя выбрал нескольких хостинг провайдеров (список регулярное обновляется ибо все в жизни меняется), на 2023:

Руководство обновлено для Ubuntu 22 BackupPC 4.4

apt install backuppc

Автоматически будет создан пароль для пользователя 'backuppc'. Чтобы изменить пароль, запустите команду

htpasswd /etc/backuppc/htpasswd backuppc

. Изменим расположение директории для бекапов (по умолчанию /var/lib/backuppc). config.pl - основной конфигурационный файл:

# nano /etc/backuppc/config.pl
 
$Conf{TopDir} = '/home/keephdd/backuppc';
$Conf{PingMaxMsec} = 200;
$Conf{PingPath} = '/bin/ping';
$Conf{Ping6Path} = '/bin/ping6';
 
# mkdir -p /home/keephdd/backuppc/pc
# mkdir -p /home/keephdd/backuppc/cpool
# chown -R backuppc:backuppc /home/keephdd/backuppc
# systemctl restart backuppc

Дальнейшие настройки для Apache производятся через Web интерфейс по адресу http://backuppc_server_ip/backuppc, а для Nginx http://your_domain/

Здесь все просто - в комплекте находится готовый конфигурационный файл под вебсервер Apache, который устанавливается при установке BackupPC (/etc/backuppc/apache.conf).

Alias /backuppc /usr/share/backuppc/cgi-bin/
 
<Directory /usr/share/backuppc/cgi-bin/>
        AllowOverride None
 
        # Uncomment the line below to ensure that nobody can sniff important
        # info from network traffic during editing of the BackupPC config or
        # when browsing/restoring backups.
        # Requires that you have your webserver set up for SSL (https) access.
        #SSLRequireSSL
 
        Options ExecCGI FollowSymlinks
        AddHandler cgi-script .cgi
        DirectoryIndex index.cgi
 
        AuthUserFile /etc/backuppc/htpasswd
        AuthType basic
        AuthName "BackupPC admin"
 
        <RequireAll>
                # Comment out this line once you have setup HTTPS and uncommented SSLRequireSSL
                Require local
 
                # This line ensures that only authenticated users may access your backups
                Require valid-user
        </RequireAll>
</Directory>

Если не установлен пакет Perl, установите

apt install perl

Установим поддержку CGI (scgi) в Nginx

apt install fcgiwrap
systemctl enable fcgiwrap
systemctl start fcgiwrap

Создаем файл конфигурации backuppc для Nginx

/etc/nginx/sites-available/backuppc.conf
server {
    listen <your_server_port>;
    server_name <your_server_name>;
    root  /usr/share/backuppc;
    index cgi-bin/index.cgi;
 
    access_log  /var/log/nginx/backuppc.access.log;
    error_log   /var/log/nginx/backuppc.error.log;
 
    location / {
        location /backuppc {
            alias /usr/share/backuppc;
        }
 
        auth_basic "Backup";
        auth_basic_user_file /etc/backuppc/htpasswd;
 
        location ~ \.cgi$ {
            include fastcgi_params;
            fastcgi_pass unix:/run/fcgiwrap.socket;
 
            fastcgi_param REMOTE_ADDR     $remote_addr;
            fastcgi_param REMOTE_USER     $remote_user;
            fastcgi_param SCRIPT_FILENAME /usr/share/backuppc/cgi-bin/index.cgi;
        }
    }
}

Подключаем его и перегружаем Nginx:

ln -s /etc/nginx/sites-available/backuppc.conf /etc/nginx/sites-enabled
nginx -s reload

Возможные ошибки бекапа локальных директорий на сервере BackupPC:

  • Backup failed on localhost (Tar exited with error 512 () status)
  • Got fatal error during xfer (sudo: no tty present and no askpass program specified)

Бэкап локальных директорий по умолчанию не работает, не хватает прав для копирования некоторых файлов. Через веб-интерфейс изменяем параметр TarClientCmd или в файле /etc/backuppc/localhost.pl меняем строку

$Conf{TarClientCmd} = '/usr/bin/env LC_ALL=C $tarPath -c -v -f - -C $shareName --totals'

Заменяем на

$Conf{TarClientCmd} = '/usr/bin/sudo /usr/bin/env LC_ALL=C $tarPath -c -v -f - -C $shareName --totals'

Настраиваем sudo:

# visudo
backuppc ALL=NOPASSWD: /bin/tar, /usr/bin/rsync, /usr/bin/env

пришлось разрешить /usr/bin/env иначе возникает ошибка Got fatal error during xfer (sudo: no tty present and no askpass program specified)

Расписание резервного копирования (Backup Schedule) по умолчанию:

  • Полная резервная копия каждые 7 дней, хранить только самую новую копию.
  • Инкрементное резервное копирование каждый день, храните шесть самых последних резервных копий.

Если вы хотите изменить интервал, нажмите на вкладку «Schedule» на верхней панели. Не забудьте нажать «Save», если вы вносите какие-либо изменения.

Полные резервные копии имеют значение "6,97" в «FullPeriod», а инкрементные резервные копии имеют значение "0,97" в поле «IncrPeriod». Это значения, соответствующие 7 и 1 дню соответственно, поскольку они также учитывают время для завершения резервного копирования.

Вы можете изменить количество резервных копий, которые поддерживает система. Вы также можете указать время, когда резервное копирование не должно выполняться, настроив «blackouts», когда резервное копирование не может начаться.

В этом руководстве мы будем придерживаться значений по умолчанию.

  • Параметр FullKeepCnt задает количество полных бэкапов (по умолчанию 1)
  • Параметр FullAgeMax какое количество дней хранить бэкапы
  • Полная резервная копия:
FullPeriod — минимальное время в днях между полными бекапами
FullKeepCnt — сколько полных бекапов необходимо хранить
FullKeepCntMin — минимальное количество хранимых полных бекапов
FullAgeMax — максимальный возраст хранимого полного бекапа
  • Инкрементальная резервная копия:
IncrPeriod — минимальное время в днях между инкрементальными бекапами
IncrKeepCnt — сколько инкрементальных бекапов необходимо хранить
IncrKeepCntMin — минимальное количество хранимых инкрементальных бекапов
IncrAgeMax — максимальный возраст хранимого инкрементального бекапа
IncrLevels — уровень инкрементального бекапа
IncrFill — использовать в системе хард-линки, что бы инкрементальный бекап выглядел полным.

Для использования протокола SSH для резервного копирования данных с клиентского компьютера, следует создать ключи доступа.

  • Создаем ключи на сервере с установленным BackupPC
# su - backuppc
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen -t rsa -C remuserbak@backuppc

на все вопросы просто жмем клавишу Enter

$ chmod 600 id_rsa
$ ls -l 
-rw------- 1 backuppc backuppc 1675 Фев 12 14:59 id_rsa
-rw-r--r-- 1 backuppc backuppc  401 Фев 12 14:59 id_rsa.pub

С приватным ключом id_rsa программа BackupPC будет подключаться к клиентским компьютерам. На клиентские компьютер должен быть перенесён публичный ключ, сделаем это при помощи утилиты SSH-copy-id, она автоматически создаст файл authorized_keys с нашим ключем в директории .ssh. Например:

ssh-copy-id -i id_rsa.pub remuserbak@<IP клиента>

Алгоритм настройки довольно прост и поддается автоматизации, например при помощи Ansible:

  1. Создать пользователя remuserbak.
  2. Предоставить необходимые права в системе для созданного пользователя.
  3. Добавить ему открытый ключ (созданный на сервере).
  4. Разрешить вход по ключу на сервере SSH.

Создаем пользователя от имени которого будет производиться копирование данных и задаем ему сложный пароль. Пароль нам понадобится один раз для копирования ssh ключа.

adduser remuserbak
usermod -aG sudo remuserbak

Даем права на запуск sudo без пароля пользователю remuserbak. В самый конец файла добавляем строчку

> visudo
remuserbak ALL=NOPASSWD: /bin/tar, /usr/bin/rsync, /usr/bin/env

Переносим публичный ключ, сделаем это при помощи утилиты SSH-copy-id. Для этого на сервере, где установлен сервер BackupPC, от имени пользователя, от которого запускается демон backuppc, запускаем утилиту ssh-copy-id

su - backuppc
ssh-copy-id -i .ssh/id_rsa.pub remuserbak@xxx.xxx.xxx.xxx

Для того чтобы проверить, что все работает и добавления информацию о хосте в файл "known_hosts", подключитесь к клиентскому компьютеру используя команду

ssh 'remuserbak@xxx.xxx.xxx.xxx'

Если хостов много, для автоматизации добавления информации в файл "known_hosts", можно сделать так:

nano /var/lib/backuppc/.ssh/config
Host *
    StrictHostKeyChecking no

Или добавить в настройки подключения BackupPC следующие опции:

-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

Дальнейшая настройка происходит через веб-интерфейс:

  1. Страница Edit Hosts добавляем адрес клиента и имя пользователя, от которого будет совершаться копирование данных, в нашем примере это пользователь remuserbak. Маленький лайфхак: по умолчанию вы можете добавить или IP или полное доменное имя резервируемого сервера, но можно сделать красиво. На скриншоте, я добавил сервер для резервирования с именем nice-domain-name и если теперь прописать для него ip в файле /etc/hosts - все будет работать. Иногда это очень удобно.
  2. В настройках клиента, на странице Xfer Settings указываем XferMethod = rsync, в параметре RsyncShareName задаем директории для копирования
  3. Меняем пользователя root на remuserbak в поле RsyncSshArgs. И добавляем в RsyncClientPath запуск программы rsync под sudo. Эти изменения можно задать как глобально для всего сервера BackupPC, так и индивидуально для каждого клиента.

Всё!

Для более старых версии BackupPC пункт 3 меняется по другому. Нужно заменить пользователя root на remuserbak в строках RsyncClientCmd и RsyncClientRestoreCmd:

$Conf{RsyncClientCmd} = '$sshPath -q -x -l remuserbak $host /usr/bin/sudo $rsyncPath $argList+';
$Conf{RsyncClientRestoreCmd} = '$sshPath -q -x -l remuserbak $host /usr/bin/sudo $rsyncPath $argList+';

Зачастую хостеры представляющие услуга виртуального хостинга блокирует подключение по SSH. Но резервировать надо и нам остаётся использовать только протокол FTP.

В версии BackupPC 4 и выше появилась встроенная возможность использовать клиента FTP для резервирования.

Но я предпочитаю монтировать удаленный FTP сервер при помощи curlftpfs и далее rsynx делать бэкап локально. Из опыта так надежнее и проще.

  1. Устанавливаем под вашу ОС, как описано в статье Монтирование удалённой папки (FTP, SSH) в Linux

Если нужно удалить полностью резервные файлы для хоста. Вам может понадобиться очистка пула. Его размер вы можете посмотреть в логе системы после перезапуска BackupPC.

Очистить пулл BackupPC:

su - backuppc
$ /usr/share/backuppc/bin/BackupPC_nightly 0 255
BackupPC_stats 0 = pool,0,0,0,0,0,0,0,0,0,0,
...

BackupPC: ping too slow. При возникновении этой ошибки бекап не производится. Для устранения нужно изменить параметр до 200 $Conf{PingMaxMsec} = 200;

После инсталляции BackupPC на Ubuntu, столкнулся тем что не архивируется localhost (то есть сервер на котором установлен непосредственно демон backuppc). В логе backuppc для localhost пишет ошибку no ping response.

Для устранения ошибки нужно прописать путь к утилите ping проверки целостности и качества локальной сети и Интернета в директиве $Conf{Ping6Path} в файле /etc/backuppc/config.pl.

$Conf{PingPath} = '/bin/ping';
# inserted '/bin/ping6' for default '':
$Conf{Ping6Path} = '/bin/ping6';

Не забываем перезапустить сервис

systemctl restart backuppc

BackupPC — это мощный и удобный способ автоматического резервного копирования файлов с нескольких серверов в центральное хранилище. Резервные копии необходимы для любой производственной среды. Не менее важно убедиться, что операции восстановления файлов работают правильно.

Существует множество инструментов резервного копирования для Linux и Unix-подобных операционных систем. Выберите решение, которое наилучшим образом соответствует вашим потребностям. BackupPC — отличный инструмент, который должен хорошо работать во многих ОС.

Обзор игрового хостинга Realms Hosting: Minecraft, RUST, Counter-Strike. PQ VPS сервера в 28+ странах.