Предыстория. В своё время, когда мне надо было найти решение этого вопроса на Хабре, казалось, что все статьи состоят из установки и настройки Veeam Backup, Proxmox Backup и прочих коммерческих решений для блочных устройств. У меня запросы поскромнее. SLA и 3-2-1 не требуются. Достаточно восстановить работоспособность за пару часов или хотя бы пару дней. В общем, в поиске нужной статьи мне не особо повезло. Зато в комментах оказались интересные находки. Попробовав некоторые из них, в итоге остановился на описанном ниже варианте. Настроил и забыл. В качестве облачного хранилища ранее был выбран Storj. Но недавно они превратили бесплатные аккаунты в триальные. Пришлось отказаться, пересесть на Mega и освежить в памяти настройки. Заодно и выложить сюда. Надеюсь, кому-то тоже пригодятся.
TL;DR Статья состоит из настройки rsnapshot, rclone и небольшого скрипта автоматизации.
Установка
Утилита rsnapshot легко доступна из репозитория. В моём случае на Ubuntu устанавливается так:
sudo apt install rsnapshot
На других системах используются соответствующие менеджеры пакетов, как описано в https://rsnapshot.org/download.html
А вот rclone лучше установить скриптом с сайта программы.
sudo curl https://rclone.org/install.sh | sudo bash
Дело в том, что в репозитории как минимум Ubuntu версия отстаёт от текущей актуальной. А это значит, каких-то облачных хранилищ там нет. Да и перед котом неудобно старой версией пользоваться.
Настройка rsnapshot
У меня потребности и возможности такие — 6 ежедневных, 2 недельные копии на хосте, из них 3 последних ежедневных сохраняются в облаке. Локальное хранилище организовано в /var/cache/rsnapshot
, сохранять нужно только /srv
и /etc
. Там compose для docker, данные и разные общие настройки вроде fail2ban, iptables и прочего. Остальное неважно. В случае каких-то больших изменений можно поднять новый VPS на другом тарифе или вообще у другого хостера. В общем, пожелания в файле /etc/rsnapshot.conf
выглядят так:
snapshot_root /var/cache/rsnapshot/
retain daily 6
retain weekly 2
backup /etc/ localhost/
backup /srv/ localhost/
Мне не нравятся все эти альфа-бета-гаммы, которые там были по умолчанию. Потому закомментировал их и добавил daily и weekly взамен. Но это просто слова. Главное - очерёдность расположения в файле. Сначала 6 снимков группы daily, затем 2 снимка группы weekly. Соответственно пришлось изменить и файл /etc/cron.d/rnapshot
30 1 * * * root /usr/bin/rsnapshot daily
0 1 * * 1 root /usr/bin/rsnapshot weekly
Напомню формат времени в файле cron.
# ┌───────────── minute (0–59)
# │ ┌───────────── hour (0–23)
# │ │ ┌───────────── day of the month (1–31)
# │ │ │ ┌───────────── month (1–12)
# │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>
Хозяйке на заметку. Как rsnapshot ротирует снимки. Самый старый в младшей группе (daily) удаляется. Промежуточные переименовываются в x+1. Создаётся новый daily.0 и в него прописываются жёсткие ссылки из daily.1, затем поверх инкрементно накатываются копии из сохраняемых директорий. В старшей группе weekly.0 получается из последнего daily. Если сначала выполнять ротацию младшей группы, то пришлось бы хранить все 7 снимков, причём daily.6 и weekly.0 были бы близнецами. Но если первым выполнить задание старшей группы, то память о daily.5 останется в сердце weekly.0 перед тем как навсегда исчезнуть.
Настройка rclone
У меня tar архивы получаются по полгигабайта. Некоторое время назад были по 1.5 Гб. Поэтому желание пользоваться самым большим облачным хранилищем выглядит уместно. Бесплатные 20 Гб от Mega вполне устраивают. На всякий случай настроил также Google Drive (15 Гб). И немного поигрался с pCloud (9 Гб). Не смог пройти квест с мобильным приложением, http error 500 вместо логина. Так что минус 1 Гб из 10, доступных на pCloud.
Собственно настройка. В случае Mega достаточно логина и пароля, с которыми авторизуешься на сайте.
rclone config
Открывается пошаговый мастер настройки. Начать нужно с (N) для нового соединения, далее назвать соединение (например, mega), на шаге хранилищ ввести 30, чтобы выбрать именно Mega, указать емейл, затем сообщить, что пароль имеется (y) и следом ввести его. Возможно, когда статья устареет, Mega будет уже под другим номером, проверяйте самостоятельно.
При создании соединения с Google Drive (17) важно сделать свой собственный client ID в Google API. Иначе придётся пользоваться общим от авторов rclone, а его лимиты давно исчерпаны. Инструкция доступна на сайте rclone;
OAuth Client Secret находится там же в Credential;
Область, доступная для подключения (scope). Только файлы, созданные rclone выглядит разумно (3) ;
Service Account пустой;
Advanced настраивать не надо (там бездна);
А далее финт ушами. Программе требуется токен, получить его можно только браузером. Браузера в обычном смысле (не lynx) на VPS нет. Тупик? Нет! Нужно всего лишь скачать rclone на свой компьютер, повторить мастер настройки до этого шага и выбрать (Y), то есть браузер в системе имеется. Откроется браузер, где нужно нажать правильную кнопку. В консоли уже написано "Got code", его будет видно позже.
Shared Drive пустой;
Завершить мастер коротким однократным нажатием на клавишу Enter.
Получившийся токен вместе с фигурными скобками скопировать в окно VPS, где был выбран ответ (N) на этапе наличия браузера. Конфиг сохранён, выход через (Q). Хранятся настройки в
~/.config/rclone
. Хорошо, соединение настроено. А есть ли жизнь на Марсе?
rclone mkdir mega:/backup
rclone lsd mega:
rclone about mega:
rclone --help
Ошибок нет, можно продолжать.
Отправка в облако
К сожалению, моя паранойя требует шифровать файлы перед отправкой. Придётся подчиниться. Вы можете пропустить этот этап и подправить скрипт под себя.
sudo pwgen -cnys 32 1 >/root/.config/rclone/pwe
Можете свой пароль указать. В любом случае, копию файла пароля желательно сохранить в укромном месте. Далее небольшой скрипт.
sudo mkdir /srv/scripts
sudo touch /srv/scripts/mega.sh
sudo chmod +x /srv/scripts/mega.sh
sudo nano /srv/scripts/mega.sh
Содержимое файла
#!/bin/bash
TIME_VAR=$(TIMEFORMAT="%lR"
time (
# Stop some services
# ...
mkdir /tmp/backup
tar -I 'xz -9' --warning=no-file-ignored -cvpf /tmp/backup/daily.0.tar.xz -C /var/cache/rsnapshot/ daily.0
openssl aes-256-cbc -e -salt -pbkdf2 -in /tmp/backup/daily.0.tar.xz -out /tmp/backup/daily.0.tar.xz.aes256cbc -kfile /root/.config/rclone/pwe
rclone delete mega:backup/daily.0.tar.xz.aes256cbc --mega-hard-delete
rclone copyto /tmp/backup/daily.0.tar.xz.aes256cbc mega:backup/daily.0.tar.xz.aes256cbc
rm -f /tmp/backup/daily.*
tar -I 'xz -9' --warning=no-file-ignored -cvpf /tmp/backup/daily.1.tar.xz -C /var/cache/rsnapshot/ daily.1
openssl aes-256-cbc -e -salt -pbkdf2 -in /tmp/backup/daily.1.tar.xz -out /tmp/backup/daily.1.tar.xz.aes256cbc -kfile /root/.config/rclone/pwe
rclone delete mega:backup//daily.1.tar.xz.aes256cbc --mega-hard-delete
rclone copyto /tmp/backup/daily.1.tar.xz.aes256cbc mega:backup/daily.1.tar.xz.aes256cbc
rm -f /tmp/backup/daily.*
tar -I 'xz -9' --warning=no-file-ignored -cvpf /tmp/backup/daily.2.tar.xz -C /var/cache/rsnapshot/ daily.2
openssl aes-256-cbc -e -salt -pbkdf2 -in /tmp/backup/daily.2.tar.xz -out /tmp/backup/daily.2.tar.xz.aes256cbc -kfile /root/.config/rclone/pwe
rclone delete mega:backup/daily.2.tar.xz.aes256cbc --mega-hard-delete
rclone copyto /tmp/backup/daily.2.tar.xz.aes256cbc mega:backup/daily.2.tar.xz.aes256cbc
rm -rf /tmp/backup
# Start some services
# ...
) 2>&1 1>/dev/null)
logger -t backup "backup completed in ${TIME_VAR}"
# decrypt
#openssl aes-256-cbc -d -pbkdf2 -in /tmp/backup/daily.0.tar.xz.aes256cbc -out /tmp/backup/xdaily.0.tar.xz.7z -kfile /root/.config/rclone/pwe
Как указано в заголовке статьи, сервер довольно бюджетный. Памяти в нём маловато, поэтому приходится останавливать некоторые прожорливые сервисы ради очень прожорливой программы сжатия xz. Кстати, я протестировал все эти bzip2, gzip, Izma и остановился на xz для себя. Устроило соотношение времени и размера сжатия. Так же сжатие -9 показалось более предпочтительным, чем -9e по тем же соображениям.
Опцию --warning=no-file-ignored
пришлось указать потому что tar комментировал найденные сокеты.
Шифрование openssl проходит довольно быстро с использованием того самого файла /root/.config/rclone/pwe
.
Удалять файл перед копированием в облако был вынужден из-за особенности Mega. Когда копируется файл с одинаковым именем, но отличающимся содержимым, Mega перемещает предыдущий в корзину, разделяющую общую квоту 20 Гб. А доступа к корзине у rclone нет. Если не обращать внимание, лимит хранилища вскоре закончится. Возможно, позже доступ появится. Ведь пишут же, что в MEGAcmd можно обратиться к //bin. Но на данный момент приходится удалять в обход корзины. За это отвечает ключ --mega-hard-delete
.
На VPS не только память ограничена, но и дисковое пространство. Сейчас бэкап перестал угрожать забить остаток свободного места, но очистка временной директории перед новой запаковкой осталась. Пусть будет.
В конце сервисы снова запускаются.
По завершении в журнале остаётся запись с тегом backup. Просмотреть можно командой:
sudo journalctl -t backup
Осталось назначить выполнение в cron.
sudo nano /etc/cron.d/sendbackup
Содержимое sendbackup
0 2 * * * root /srv/scripts/mega.sh # rclone to mega.nz
Спасибо за ваше внимание. Надеюсь увидеть в комментах какие-то другие решения, простые и сложные.
Комментарии (24)
Dorlas
22.04.2024 06:02Veeam Backup, Proxmox Backup и прочих коммерческих решений для блочных устройств.
Не соглашусь, VBR Community Edition и ProxMox Backup не являются коммерческими решениями. И бекапить Veeam Agent-м можно и просто набор папок (без создания снапшотов FS).
Выгружать можно бекап и по SSH/SCP сразу на свой другой сервер, как вариант. А ротацию и удаление делать уже на сервере-приемнике.
Еще есть вариант поднять свой NextCloud-сервер, через Fuse/WebDAV монтировать его у себя на VPS.
В общем вариантов много, хорошо, что Вы показали свой )
Удачи и всех благ!
Dorlas
22.04.2024 06:02Вообще от скрипта вида:
#!/bin/sh backupdate=`/bin/date "+%Y-%m-%d-%H-%M-%S"` backupdir="/BACKUPS/ServerConfigs" secondbackupdir="/data/BACKUPS/ServerConfigs/" newarchive=${backupdir}/bsd-configs-${backupdate}.tar.bz2 tar -a -cf $newarchive /etc/ /usr/local/etc/ /root/ /CBSD/etc/ /CBSD/jails-fstab/ /CBSD/jails-system/ && cp $newarchive $secondbackupdir
Можно уйти оч далеко - и в Telegram себе отправлять, и почтой с шифрованием и т.д.
Bash/Shell скрипты дают любые вариации и способы, только придумывай. А сейчас еще и GPT4 может в этом здорово помочь )
crawlingroof
22.04.2024 06:02После того как сломали авторизацию и перестал работать grive, так и не осилил разобраться c google api, спасибо за инструкцию.
AcckiyGerman
22.04.2024 06:02У вас используется три инструмента для трёх шагов:
rsnapshot для копирования файлов локально и версионирования
rclone для загрузки файлов в облако
mega.sh (странное название) для шифрования и сжатия файлов
Также вы два раза настраиваете Cron.
Итого - с одной стороны решение гибкое, с другой - сложное и хрупкое.Borg backup объединяет все три этих инструмента, хотя и поддерживает меньше удалённых хранилищ, чем
rclone
(что можно обойти монтированием хранилища в локальную ФС), при этом проще настраивается и по умолчанию поддерживает дедупликацию (чего у вас нет).anzay911 Автор
22.04.2024 06:02Можно
gdrive.sh
, мне не принципиально. Спасибо за Borg backup. А видно, когда был создан каждый чекпоинт? А то там всё в секундах.
andreymal
22.04.2024 06:02Тогда уж и про restic можно вспомнить (к тому же в rclone внезапно есть нативная поддержка restic)
dsh2dsh
22.04.2024 06:02Да вы издеваетесь:
sudo curl https://rclone.org/install.sh | sudo bash
А что, curl не от рута уже не работает?
kolabaister
22.04.2024 06:02КДПВ оказывается использует как минимум одна настоящая (ну как, предположительно) компания по восстановлению данных. Яндекс картинками ищется.
Maxim_Q
22.04.2024 06:02+1У меня tar архивы получаются по полгигабайта. Некоторое время назад были по 1.5 Гб.
Перепроверьте еще папки и файлы что вы архивируете, если вы берете только натройки тогда они должны весить менее 100 Мб, ну у меня примерно так. Возможно вы что-то лишнее берете например /etc/alternatives архивируете, у меня она много весит.
ThingCrimson
22.04.2024 06:02+1Пытаюсь понять обоснование использования симметричного шифрования через openssl по сравнению с
gpg -e -r "recipient" file
? Сразу отпадает необходимость держать пароль в clear text (/root/.config/rclone/pwe), достаточно иметь на VPS публичный ключ recipient.
1x1
22.04.2024 06:02Бэкап без обработки ошибок не может считаться надёжным даже с натяжкой. Как минимум нужно уведомление об ошибке.
z0mb1e_kgd
22.04.2024 06:02Господа, подскажите, пожалуйста, можно ли организовать бэкапы таким образом, чтобы основной файл бэкапа в сжатом виде создавался, условно, раз в месяц, а изменения - в качестве сжатых же бинарных диффов друг от друга по цепочке с проверкой чексумм на каждом этапе (примерно как происходит внутри git, но в бинарном и сжатом виде)? А то мне нужно организовать ротируемые ежедневные бэкапы файла большой однофайловой базы, он хорошо сжимается, ежедневные изменения небольшие, но трафик для отправки бэкапов в облако (кстати, тоже пользуюсь Mega) крайне ограничен.
Dorlas
22.04.2024 06:02Veeam Agent, бекап в блочном режиме, Full раз в месяц, инкременты когда хочешь. Файл базы разместить на отдельном блочном устройстве. Инкременты будут мизерными.
z0mb1e_kgd
22.04.2024 06:02Спасибо, посмотрю. А в open source решениях что-нибудь подобное есть?
Dorlas
22.04.2024 06:02Veeam Agent без лицензии будет работать в режиме Community Edition (один JOB). Бесплатно, без ограничений по времени. Да, он не OpenSource.
Чисто OpenSource решение мне не попадалось - но в такой задаче (один файл - база данных, нужны инкременты) - сделать это можно только с помощью технологии Change Block Tracking (CBT). Так что искать нужно решение, которое умеет отслеживать CBT таблицу и делать блочный бекап тома (не файловый - а блочный).
anzay911 Автор
22.04.2024 06:02Вышеприведённый Borg оперирует файловыми чанками. Возможно, если нарезать помельче, получится что-то похожее.
z0mb1e_kgd
22.04.2024 06:02О, спасибо, если это так, то может сработать. Сейчас буду изучать и тестировать. Главное, чтобы СУБД не слишком сильно меняла расположение данных в файле при работе (переиндексация, реструктуризация, оптимизация etc, кто его знает, что она там творит под капотом). Полагаю, система разбиения данных в Borg примерно такая же, как в BitTorrent?
andreymal
22.04.2024 06:02Я пытался пихать БД в restic, который тоже бьёт файлы на чанки. Но оказалось, что MariaDB любит поменять парочку байтов в разных местах (наверное счётчики-смещения-размеры какие-нибудь), и из-за этого целые чанки считались изменёнными и бэкапились заново, в итоге экономия на дедупликации не особо получилась
z0mb1e_kgd
22.04.2024 06:02О, я как раз сейчас Restic ковыряю, так как он нативно работает и на винде, и на никсах, да и Go ощутимо быстрее питона, на котором написан Borg, предложенный выше. Скормил ему папку с нативными полными бэкапами от самой СУБД за три дня (общий размер 36 ГБ), указал максимальное сжатие, в итоге Restic'овская репа занимает 5 ГБ, что очень неплохо. Но это родительский бэкап, будем смотреть, как он с инкрементами будет справляться. Такую проблему, как у вас, я и предвидел, поэтому сейчас выясняю на тамошнем форуме и в доках, как уменьшить размер чанка до минимума (теоретически должно помочь, если при этом данные не сдвигаются внутри файла). Как-то в итоге удалось решить проблему, или оставили, как есть?
andreymal
22.04.2024 06:02Пока что не стал заморачиваться, какая-то дедупликация всё-таки имеется и хранить в restic всё равно получается компактнее чем без него
z0mb1e_kgd
22.04.2024 06:02Менять конфиг системы и добавлять дополнительные блочные устройства (даже виртуальные) у меня нет возможности, так что мимо. Проблема еще в том, что в окружении - мультисистемный зоопарк и таких файлов баз с необходимостью бэкапа несколько, каждый на разных машинах, поэтому искал кроссплатформенное решение. При этом я вручную пробовал тупо диффать два варианта файла (условно, вариант файла в понедельник и измененный вариант в пятницу) rsync'ом и сжимать дифф (операция восстановления в этом случае - разархивация диффа и patch понедельничного файла этим диффом от пятничного), и оно работало - размер сжатого диффа укладывался в приемлемые 100 МБ при размере несжатой базы в 12 ГБ, но решил не велосипедничать со скриптами и поискать что-то готовое, так как опасаюсь при их написании не учесть все corner case'ы и запороть восстановление базы при такой необходимости. Что ж, видимо, всё-таки придется писать свой скрипт, благо, WSL на виндовых машинах есть.
gbdfc
Добрый день. Veeam agent не пробовали для этих целей?