Стратегия резервного копирования для вашего сервера
Почему за резервные копии отвечаете вы, что сохранять, где хранить копии, как автоматизировать их с помощью cron, restic или rsync и как проверять восстановление.
На этой странице
BLACKBOX не делает автоматических резервных копий вашего сервера. Кнопка «Резервные копии» на карточке сервера на странице «Мои серверы» панели app.blackbox.md (app.blackbox.md/my-servers; с blackbox.md: «Личный кабинет» → «Панель управления» → «Мои серверы») не работает. В этом руководстве — что сохранять, где хранить копии, как автоматизировать копирование и как убедиться, что из копии действительно можно восстановиться. Все команды выполняются на сервере по SSH от имени root.
Доступно: владельцу VPS или выделенного сервера BLACKBOX с доступом root по SSH: Подключение к серверу по SSH (Windows, macOS, Linux). Команды подходят для Ubuntu, Debian, AlmaLinux и CentOS Stream.
Кто отвечает за резервные копии
У вас есть доступ root к серверу, и всё, что на нём работает, под вашим контролем, поэтому за резервные копии данных отвечаете тоже вы: Ответственность за данные на сервере и резервные копии. Глава 9 «Ограничение ответственности» Условий использования гласит: «BLACKBOX не несёт ответственности за косвенные убытки, упущенную выгоду, потерю данных или перерывы в деятельности, понесённые Клиентом или третьими лицами».
В панели нет ни автоматического резервного копирования, ни снимков (snapshot). Если нажать «Резервные копии» на карточке сервера, появится «Загрузка…», а затем сообщение backup_extra_disabled: услуга автоматического резервного копирования недоступна. На сервер и данные на нём это никак не влияет. См. Страница «Мои серверы»: карточка сервера.
Важно Сервер, удалённый кнопкой «Удалить» или при отмене заказа, восстановить нельзя. Единственные копии данных — те, что вы сделали сами и храните вне сервера.
Правило 3-2-1
| Правило | Что значит | Пример |
|---|---|---|
| 3 копии | исходные данные и ещё две копии | сайт и база данных на сервере, копия в restic, копия на вашем компьютере |
| 2 разных носителя | копии не лежат на одном диске или в одной системе хранения | диск сервера и объектное хранилище |
| 1 копия в другом месте (offsite) | хотя бы одна копия полностью отделена от сервера | хранилище у другого провайдера или NAS в офисе |
Копия в другой папке того же сервера — не резервная копия: она пропадёт вместе с сервером, если его удалят, взломают или он перестанет загружаться.
Что сохранять
| Что | Где обычно находится | Как сохранять |
|---|---|---|
| Файлы сайтов и приложений, загрузки пользователей | /var/www, /home, /srv, /opt |
копировать папки |
| Базы данных MariaDB, MySQL, PostgreSQL | в СУБД на сервере | дамп (mysqldump, pg_dump), см. шаг 1 |
| Настройки сервера: nginx, Apache, PHP, SSH, сертификаты Let's Encrypt | /etc |
копировать весь /etc |
Файлы .env и настройки приложений |
в папке каждого приложения | вместе с папкой приложения |
Docker: тома, docker-compose.yml, .env |
/var/lib/docker/volumes и папка проекта |
тома с файлами; для баз данных в контейнерах — дамп |
| Задания cron | /etc/crontab, /etc/cron.d, /var/spool/cron |
вместе с /etc и /var/spool/cron |
Скрипты и ключи в домашней папке root |
/root |
копировать папку |
Не копируйте файлы базы данных (/var/lib/mysql, /var/lib/postgresql, /var/lib/pgsql), пока база работает: копия может оказаться несогласованной, и база из неё не запустится. То же касается томов Docker с базами данных: делайте дамп командой самой базы, запущенной в контейнере. Пример для PostgreSQL — строка для скрипта из шага 1:
docker exec ИМЯ_КОНТЕЙНЕРА pg_dump -U ИМЯ_ПОЛЬЗОВАТЕЛЯ -Fc ИМЯ_БД > "$DIR/ИМЯ_БД-$DATE.dump"Для MariaDB или MySQL в контейнере используйте так же mysqldump (в свежих образах MariaDB — mariadb-dump) с пользователем и паролем из .env. См. также Установка Docker и Docker Compose.
Сохранять не нужно /proc, /sys, /dev, /run, /tmp, кеши, образы Docker (их можно скачать или собрать заново) и системные пакеты (их можно переустановить). Код, который лежит во внешнем Git-репозитории, отдельно копировать не обязательно — если вы следите, чтобы изменения туда действительно попадали.
Где хранить копии
| Место | От чего защищает | Инструмент |
|---|---|---|
| Другой сервер — в BLACKBOX или у другого провайдера | основной сервер удалили, взломали или он не запускается | restic по SFTP или rsync |
| S3-совместимое объектное хранилище у другого провайдера | то же, а также проблемы у провайдера основного сервера | restic |
| Ваш компьютер или NAS в офисе | сервер взломан: копию, скачанную на компьютер, с сервера удалить нельзя | rsync или scp, запущенные с компьютера |
| BLACKBOX Cloud Storage | нужно отдельное от сервера место для копий | по запросу, см. ниже |
Для копии offsite по правилу 3-2-1 выберите хотя бы одно место у другого провайдера или у себя в офисе. Если сервер для копий будет в BLACKBOX, обратите внимание на тарифы семейства Basic — у них большие диски, до 400 GB: Тарифы VPS: как выбрать.
BLACKBOX Cloud Storage онлайн не заказывается. На странице blackbox.md/ru/hosting/cloud-storage («Хостинг» → «Cloud Storage») кнопка «Заказать хранилище» ведёт на страницу «Контакты». Объём, цену и способы доступа вы получите в предложении от команды; уточните, какие способы доступа есть у хранилища, чтобы выбрать между restic и rsync. См. Продукты и конфигурации по запросу.
Шаг 1: ежедневный дамп баз данных через cron
Скрипт ниже каждую ночь выгружает базу данных в /var/backups/db и удаляет оттуда дампы старше 7 дней. На шаге 2 они копируются за пределы сервера. Установка баз данных: Базы данных: MariaDB/MySQL и PostgreSQL.
Файлы редактируются в nano. Если его нет (AlmaLinux, CentOS Stream), установите:
dnf install -y nanoСоздайте скрипт:
nano /usr/local/sbin/db-dump.shВставьте текст ниже, замените
ИМЯ_БДна имя своей базы, сохраните (Ctrl+O, затем Enter) и выйдите (Ctrl+X):#!/bin/bash set -euo pipefail umask 077 cd / DIR=/var/backups/db DATE=$(date +%F) mkdir -p "$DIR" mysqldump --single-transaction --routines ИМЯ_БД | gzip > "$DIR/ИМЯ_БД-$DATE.sql.gz" find "$DIR" -type f -mtime +7 -deleteДля PostgreSQL замените строку с
mysqldumpна эту:sudo -u postgres pg_dump -Fc ИМЯ_БД > "$DIR/ИМЯ_БД-$DATE.dump"Если баз несколько, добавьте такую строку для каждой. В MariaDB у этой команды есть и второе имя —
mariadb-dump.Сделайте скрипт исполняемым, запустите его один раз и проверьте, что файл появился:
chmod 700 /usr/local/sbin/db-dump.sh /usr/local/sbin/db-dump.sh ls -lh /var/backups/dbЕсли появится
Access denied for user 'root'@'localhost', пользовательrootбазы данных входит по паролю. Запишите пароль в файл/root/.my.cnfс таким содержимым, а затем ограничьте доступ к файлу:[client] user=root password=ПАРОЛЬ_БДchmod 600 /root/.my.cnfНастройте запуск каждую ночь в 02:00 (по времени сервера). Создайте файл:
nano /etc/cron.d/db-dumpи вставьте строку:
0 2 * * * root /usr/local/sbin/db-dump.sh >> /var/log/db-dump.log 2>&1
В файлах из /etc/cron.d есть столбец с пользователем (root), в имени файла не должно быть точек, а последняя строка должна заканчиваться переводом строки. Символ % нельзя писать прямо в строке cron — поэтому дата вычисляется в скрипте. Если задание не запускается, проверьте, что служба cron установлена и работает.
Ubuntu и Debian:
apt update
apt install -y cron
systemctl enable --now cronAlmaLinux и CentOS Stream:
dnf install -y cronie
systemctl enable --now crondДампы занимают место на диске. Если диск небольшой, храните их меньше дней (например, -mtime +3): Диск сервера заполнен.
Шаг 2: копия за пределами сервера с помощью restic
restic шифрует данные ещё на сервере, до отправки, хранит историю копий (снимков, snapshot) и при каждом запуске передаёт только изменения. В примере используется S3-совместимое объектное хранилище; вариант с другим сервером по SFTP описан в разделе про rsync. Официальная документация: restic.readthedocs.io.
Установка
Ubuntu и Debian:
apt update
apt install -y resticAlmaLinux и CentOS Stream (restic устанавливается из репозитория EPEL):
dnf install -y epel-release
dnf install -y resticРепозиторий и пароль
У провайдера хранилища создайте бакет (bucket) и пару ключей доступа. Запишите адрес сервиса (endpoint), имя бакета, ID ключа и секретный ключ.
Сгенерируйте пароль репозитория и выведите его на экран:
mkdir -p /etc/restic chmod 700 /etc/restic openssl rand -base64 32 > /etc/restic/password chmod 600 /etc/restic/password cat /etc/restic/passwordСохраните показанный пароль в менеджере паролей.
Создайте файл с настройками:
nano /etc/restic/envRESTIC_REPOSITORY=s3:https://АДРЕС_S3/ИМЯ_БАКЕТА/ИМЯ_СЕРВЕРА RESTIC_PASSWORD_FILE=/etc/restic/password AWS_ACCESS_KEY_ID=ID_КЛЮЧА AWS_SECRET_ACCESS_KEY=СЕКРЕТНЫЙ_КЛЮЧИМЯ_СЕРВЕРА— папка внутри бакета; у каждого сервера должна быть своя. Если провайдер требует указать регион, добавьте строкуAWS_DEFAULT_REGION=РЕГИОН.Ограничьте доступ к файлу, загрузите настройки в текущий сеанс и инициализируйте репозиторий (один раз):
chmod 600 /etc/restic/env set -a . /etc/restic/env set +a restic initОтвет начинается с
created restic repository.
Опасно Без пароля репозитория копии не сможет расшифровать никто, в том числе BLACKBOX. Храните пароль и вне сервера: если сервер будет потерян, без пароля восстановить ничего не получится.
Скрипт резервного копирования
nano /usr/local/sbin/restic-backup.sh#!/bin/bash
set -euo pipefail
set -a
. /etc/restic/env
set +a
restic backup /etc /root /var/www /var/spool/cron /var/backups/db --exclude-caches
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --keep-tag manual --prune| Часть | Что делает |
|---|---|
restic backup /etc /root … |
копирует папки из списка. Оставьте только папки, которые есть на сервере (отсутствующая папка вызывает ошибку), и добавьте свои, например /home, /srv или /var/lib/docker/volumes/ИМЯ_ТОМА для тома Docker с файлами. |
--exclude-caches |
пропускает папки, помеченные как кеш |
--keep-daily 7 --keep-weekly 4 --keep-monthly 6 |
оставляет последние 7 ежедневных, 4 еженедельные и 6 ежемесячных копий |
--keep-tag manual |
оставляет копии, сделанные вручную с меткой manual |
--prune |
удаляет из репозитория данные, которые больше не относятся ни к одной копии |
Сделайте скрипт исполняемым, запустите его один раз и посмотрите список копий:
chmod 700 /usr/local/sbin/restic-backup.sh
/usr/local/sbin/restic-backup.sh
restic snapshotsЕжедневный запуск через таймер systemd
Создайте службу:
nano /etc/systemd/system/restic-backup.service[Unit] Description=Restic backup Wants=network-online.target After=network-online.target [Service] Type=oneshot Environment=HOME=/root ExecStart=/usr/local/sbin/restic-backup.shСоздайте таймер:
nano /etc/systemd/system/restic-backup.timer[Unit] Description=Daily restic backup [Timer] OnCalendar=*-*-* 03:00:00 RandomizedDelaySec=30min Persistent=true [Install] WantedBy=timers.targetВключите таймер и проверьте время следующего запуска в столбце
NEXT:systemctl daemon-reload systemctl enable --now restic-backup.timer systemctl list-timers restic-backup.timerЗапустите службу один раз и посмотрите журнал:
systemctl start restic-backup.service journalctl -u restic-backup.service -n 50
Копирование запускается каждый день между 03:00 и 03:30 по времени сервера, после дампов в 02:00. Благодаря Persistent=true запуск, пропущенный, пока сервер был остановлен, выполнится при следующем включении.
Простой вариант: rsync на другой сервер
Если у вас есть второй сервер, rsync скопирует на него папки по SSH. rsync должен быть установлен на обоих серверах. Установка и параметры: Передача файлов на сервер (scp, rsync, SFTP).
На основном сервере создайте SSH-ключ только для резервного копирования, без парольной фразы, чтобы его мог использовать cron:
ssh-keygen -t ed25519 -f /root/.ssh/backup_ed25519 -N "" cat /root/.ssh/backup_ed25519.pubДобавьте показанную строку в
/root/.ssh/authorized_keysна сервере для копий. Если он тоже в BLACKBOX, воспользуйтесь кнопкой «Добавить SSH-ключ» на его карточке: Добавление и удаление SSH-ключей на сервере.Создайте папку назначения и выполните первое копирование вручную. При первом подключении подтвердите ключ сервера для копий, ответив
yes:ssh -i /root/.ssh/backup_ed25519 root@IP_СЕРВЕРА_КОПИЙ "mkdir -p /backups/ИМЯ_СЕРВЕРА" rsync -aR --delete -e "ssh -i /root/.ssh/backup_ed25519" /etc /var/www /var/backups/db root@IP_СЕРВЕРА_КОПИЙ:/backups/ИМЯ_СЕРВЕРА/С параметром
-Rпути сохраняются полностью: на сервере для копий появятся/backups/ИМЯ_СЕРВЕРА/etc,/backups/ИМЯ_СЕРВЕРА/var/wwwи так далее.Настройте ежедневное копирование в 03:30 в файле
/etc/cron.d/backup-rsync:30 3 * * * root rsync -aR --delete -e "ssh -i /root/.ssh/backup_ed25519" /etc /var/www /var/backups/db root@IP_СЕРВЕРА_КОПИЙ:/backups/ИМЯ_СЕРВЕРА/ >> /var/log/backup-rsync.log 2>&1
rsync хранит только последнее состояние: с --delete файл, удалённый или испорченный на сервере, при следующем запуске исчезнет и из копии. Кроме того, файлы на сервере для копий не зашифрованы. Если нужны история и шифрование, используйте restic по SFTP на тот же сервер. Добавьте в /root/.ssh/config:
Host backup
HostName IP_СЕРВЕРА_КОПИЙ
User root
IdentityFile /root/.ssh/backup_ed25519Тогда в файле /etc/restic/env будут только эти две строки:
RESTIC_REPOSITORY=sftp:backup:/backups/ИМЯ_СЕРВЕРА-restic
RESTIC_PASSWORD_FILE=/etc/restic/passwordОстальные шаги — те же, что в разделе про restic: установка, пароль, инициализация, скрипт и таймер.
Шифрование копий за пределами сервера
- restic шифрует всё паролем репозитория до отправки. Провайдер хранилища видит только зашифрованные данные.
- SSH, а значит и
rsyncиscp, шифруют данные только при передаче. Если место хранения вам не принадлежит, шифруйте файлы перед копированием, например с помощьюgpgи пароля, сохранённого в файле (пакетgnupgв Ubuntu и Debian,gnupg2в AlmaLinux и CentOS Stream):
openssl rand -base64 32 > /root/.backup-pass
chmod 600 /root/.backup-pass
gpg --batch --yes --pinentry-mode loopback --passphrase-file /root/.backup-pass --symmetric --cipher-algo AES256 -o ФАЙЛ.gpg ФАЙЛРасшифровка:
gpg --batch --pinentry-mode loopback --passphrase-file /root/.backup-pass -o ФАЙЛ -d ФАЙЛ.gpgСодержимое /root/.backup-pass тоже сохраните в менеджере паролей.
Безопасность Файлы
/etc/restic/env,/etc/restic/passwordи ключ/root/.ssh/backup_ed25519дают доступ к копиям, а ключ — даже доступ root к серверу для копий. Если сервер взломают, злоумышленник сможет с их помощью удалить копии. Держите и такую копию, которую сервер удалить не может, — например, регулярно скачивайте её на свой компьютер.
Проверяйте восстановление хотя бы раз в месяц
Копия, из которой вы ни разу не восстанавливались, ничего не гарантирует. Раз в месяц, а также после любых изменений в скриптах восстанавливайте данные во временную папку, а не поверх рабочих.
Загрузите настройки, проверьте список копий и целостность репозитория:
set -a . /etc/restic/env set +a restic snapshots restic checkПоследняя копия должна быть не старше 24 часов, а проверка
restic checkдолжна завершиться строкойno errors were found.Восстановите настройки и дампы во временную папку:
restic restore latest --target /root/restore-test --include /etc --include /var/backups/db ls -lh /root/restore-test/var/backups/dbЗагрузите дамп в тестовую базу и проверьте таблицы и несколько свежих записей — например, последний заказ или последнюю опубликованную статью. Последнюю команду блока выполняйте только после проверки: она удаляет тестовую базу. Вместо
ГГГГ-ММ-ДДподставьте дату из имени файла.MariaDB и MySQL:
mysql -e "CREATE DATABASE restore_test" gunzip < /root/restore-test/var/backups/db/ИМЯ_БД-ГГГГ-ММ-ДД.sql.gz | mysql restore_test mysql -e "SHOW TABLES" restore_test mysql -e "DROP DATABASE restore_test"PostgreSQL:
sudo -u postgres createdb restore_test sudo -u postgres pg_restore -d restore_test < /root/restore-test/var/backups/db/ИМЯ_БД-ГГГГ-ММ-ДД.dump sudo -u postgres psql -d restore_test -c "\dt" sudo -u postgres dropdb restore_testУдалите временную папку:
rm -rf /root/restore-test
Восстановление занимает место на диске, поэтому восстанавливайте только то, что проверяете (--include). Самая надёжная проверка — полное восстановление на другом сервере с запуском приложения: заодно это репетиция на случай реальной аварии. В варианте с rsync скопируйте дамп обратно с сервера для копий и загрузите его так же.
Дополнительная копия перед рискованными операциями
| Операция | Зачем нужна копия |
|---|---|
| «Апгрейд» в панели: Апгрейд сервера: переход на больший тариф | сервер перезагружается с новой конфигурацией, диск расширяется |
| «Удалить»: Безвозвратное удаление сервера | через 24 часа отсрочки сервер и данные удаляются безвозвратно |
| «Отменить заказ» для заказа с сервером: Отмена заказа и возврат средств | сервер удаляется сразу после подтверждения |
| Переход на новую мажорную версию системы: Обновления системы и автоматические обновления безопасности | могут перестать работать приложения или доступ по SSH |
| Переустановка операционной системы — по запросу через поддержку: Доступные операционные системы | все данные на сервере теряются |
| Переезд на другой сервер: Перенос сайта на сервер BLACKBOX | нужна полная и свежая копия |
| Обновление CMS, приложения или базы данных до новой версии | изменения в данных без копии не отменить |
Сделайте свежий дамп и копию restic с меткой manual — её команда forget не удаляет:
/usr/local/sbin/db-dump.sh
set -a
. /etc/restic/env
set +a
restic backup /etc /root /var/www /var/spool/cron /var/backups/db --exclude-caches --tag manual
restic snapshots --tag manualКогда копия станет не нужна, удалите её по идентификатору из столбца ID:
restic forget ID_КОПИИ --pruneПеред удалением сервера сохраните вне его пароль репозитория и настройки из /etc/restic/env: без них до копий не добраться. Скачайте также копию на компьютер с помощью rsync или scp.
Частые вопросы
Может ли BLACKBOX восстановить сервер, если я что-то удалил по ошибке? Нет. Панель не делает автоматических копий и не создаёт снимков, а удалённый сервер восстановить нельзя. Восстанавливайтесь из своих копий.
Что значит сообщение backup_extra_disabled под кнопкой «Резервные копии»?
Это значит, что услуга автоматического резервного копирования недоступна. О неисправности сервера это не говорит, данные не затронуты.
Как восстановить один удалённый файл?
Загрузите настройки restic, как в шаге 1 проверки восстановления. Восстановите файл во временную папку, а затем скопируйте его на место. Не восстанавливайте сразу с --target /: так вы перезапишете рабочие файлы. Чтобы взять более старую копию, укажите вместо latest её ID из restic snapshots.
restic restore latest --target /root/restore-test --include /var/www/site/config.php
cp -a /root/restore-test/var/www/site/config.php /var/www/site/config.phpУ меня тариф «VPS hosting» с панелью управления. Что делать? В установленной панели управления может быть своя функция резервного копирования — уточните в поддержке, что она умеет: Тарифы «VPS hosting» с панелью управления. В любом случае копия должна храниться вне сервера.
Я потерял пароль репозитория restic. Что делать?
Если файл /etc/restic/password ещё есть на сервере, пароль в нём: снова сохраните его в менеджере паролей. Если пароля больше нет нигде, копии из этого репозитория прочитать уже нельзя. Тогда создайте новый репозиторий с новым паролем и другой папкой в RESTIC_REPOSITORY и сразу сделайте полную копию.
Можно ли поручить настройку копий команде? Если не хотите настраивать сами, спросите в поддержке об администрировании сервера по запросу — с отдельным предложением: Профессиональные услуги по запросу: администрирование, DevOps, миграция.