У HIP нет кнопки «снять снапшот»: единственная операция в панели, которая трогает диск, всё стирает. Разбираем, как собрать свой бэкап файлов и баз, который живёт в другом месте и переживает потерю сервера.
У HIP нет кнопки «снять снапшот»: единственная операция в панели, которая трогает диск, - переустановка, и она всё стирает. Значит, резервные копии сервера HIP - целиком ваша зона ответственности: их делают инструментами на самом сервере, а хранят в другом месте. В инструкции: как привести данные в согласованное состояние перед копией, как забрать файлы и базы, зачем нужны restic и borg, как запускать бэкап по расписанию через systemd-таймер и как убедиться, что из копии реально можно восстановиться.
Коротко. Снапшотов в панели HIP нет, бэкап - только на вашей стороне. Перед копией выполните
sync, а лучше на минуту остановите приложение и базу либо снимите дамп средствами СУБД. Файлы забирайте черезtar(разово) илиrsync -aAX(регулярно) на другую машину; базы - черезpg_dumpилиmysqldumpс ротацией по N дней. Рабочий инструмент по умолчанию -restic: шифрует и дедуплицирует сам, кладёт копии по SFTP или в объектное хранилище, запускается из systemd-таймера. Держите правило 3-2-1 и раз в месяц проверяйте восстановление.
Сразу главное: в панели HIP нет функции снапшотов. Нельзя одной кнопкой снять образ диска и потом так же откатиться. Единственная операция в панели, которая трогает диск, - это переустановка (Rebuild), и она не сохраняет, а стирает всё: систему, файлы, базы, настройки (см. Как переустановить ОС на сервере HIP).
Отсюда вывод: резервные копии сервера HIP делаются только на вашей стороне - инструментами, запущенными на самом сервере, с выгрузкой в другое место. Дальше - как собрать это так, чтобы работало само и чтобы из копии реально можно было восстановиться.
Снапшот (snapshot) - мгновенный образ всего диска: система, файлы, базы, настройки, всё как было в секунду съёмки. Снапшоты бывают у гипервизоров и в панелях некоторых провайдеров; у HIP такой функции нет. Даже там, где снапшот есть, он хранится рядом с сервером и вместе с сервером теряется.
Резервная копия (бэкап) - независимый набор ваших данных, сохранённый в другом месте: на другом сервере, в объектном хранилище, на домашнем диске. Копия не привязана к серверу HIP и переживёт что угодно с самим сервером - переустановку, удаление, проблему с оплатой или аккаунтом.
Грубо: снапшот - это «откатить весь сервер на вчерашний вечер». Бэкап - это «достать вот этот файл или вот эту базу за прошлую среду, даже если сервера больше нет». На HIP доступен только второй вариант, и вся статья дальше - про него.
Снапшот | Резервная копия | |
|---|---|---|
Что это | образ всего диска на момент времени | отдельная копия выбранных данных |
Где лежит | рядом с сервером, у провайдера или гипервизора | в другом месте: другой сервер, хранилище, локально |
Есть в панели HIP | нет | вы делаете сами |
Переживёт потерю сервера | нет | да |
Что можно достать | только весь диск целиком | отдельные файлы, отдельные базы |
От чего защищает | неудачное обновление, битый апгрейд | потеря сервера, порча данных, ошибка недельной давности, шифровальщик |
Бэкап забирает файлы «как есть» на момент запуска. Если в этот момент база данных дописывает транзакцию, а приложение - лог, в копию попадёт наполовину записанное состояние. Большинство СУБД (PostgreSQL, MySQL с движком InnoDB) умеют восстановиться из такого при старте за счёт своего журнала, но полагаться на это не стоит - особенно для файловой копии базы.
Минимум - сбросить на диск то, что операционная система держит в оперативной памяти:
sync
Команда возвращает управление, когда буферы записаны. Вывода при успехе нет.
По возможности - на минуту остановить приложение и базу, снять копию, включить обратно:
systemctl stop myapp
systemctl stop postgresql
sync
# запускаете бэкап, дожидаетесь завершения
systemctl start postgresql
systemctl start myapp
Если остановка недопустима, снимайте базу не файлом, а дампом - СУБД сама выгрузит данные в согласованном виде (об этом ниже отдельно), а restic/rsync пусть забирают уже готовый файл дампа, а не «живые» файлы базы.
Для разовой копии каталогов подходит tar: он собирает всё в один сжатый архив.
tar czf /root/backup-$(date +%F).tar.gz --exclude='/var/www/*/cache' /etc /root /home /var/www
c - создать архив, z - сжать gzip, f - в указанный файл--exclude - пропустить каталог, который не нужен в копии (кеш, временные файлы)/etc (настройки системы и сервисов), каталог приложения, /home (данные пользователей)$(date +%F) - подставляет дату в имя файла, вида 2026-09-10Архив потом увезите с сервера: scp /root/backup-*.tar.gz you@backuphost:/srv/backups/. Пока он лежит только на сервере, это не резервная копия.
Для регулярной синхронизации всего сервера на другую машину используйте rsync - он копирует только изменившееся:
rsync -aAX --delete \
--exclude={"/proc/*","/sys/*","/dev/*","/run/*","/tmp/*","/var/tmp/*","/var/cache/*","/var/lib/lxcfs","/swapfile","/swap.img","/lost+found"} \
/ backup@backuphost:/srv/backups/web01/
-a - режим архива: сохраняет права, владельцев, временные метки, символьные ссылки-A - переносит списки доступа (ACL), -X - расширенные атрибуты файлов--delete - делает зеркало: удаляет на приёмнике то, чего уже нет на сервере. Без него удалённые файлы накапливаются в копии--exclude={...} - виртуальные и временные каталоги, которые копировать бессмысленно и вредно: /proc, /sys, /dev - это не файлы, а интерфейсы ядра; /tmp, /var/cache - временное; /swapfile или /swap.img - файл подкачки (имя зависит от системы, проверьте своё через swapon --show)Что вы должны увидеть: rsync перечислит передаваемые файлы и в конце напишет sent ... bytes received ... bytes и total size is .... Ошибки доступа выводятся строками rsync: ... Permission denied - запускайте под sudo или root. Синтаксис {...} - это раскрытие фигурных скобок в bash; в упрощённой оболочке sh перечислите пути отдельными --exclude.
Чистые tar и rsync ничего не шифруют. Если приёмник - чужое хранилище, копию надо зашифровать (об этом ниже) или сразу взять инструмент, который делает это сам.
Файлы базы из-под работающей СУБД копировать нельзя - получите битый снимок. Нужен дамп: СУБД сама выгружает данные в согласованном виде.
PostgreSQL, одна база в своём сжатом формате:
sudo -u postgres pg_dump -Fc mydb > /root/db/mydb-$(date +%F).dump
MySQL или MariaDB, все базы (запускать под root, аутентификация идёт через сокет):
mysqldump --single-transaction --quick --all-databases | gzip > /root/db/all-$(date +%F).sql.gz
-Fc у pg_dump - собственный сжатый формат Postgres, из него удобно восстанавливать выборочно через pg_restore--single-transaction - согласованный срез таблиц InnoDB без блокировки записи; для старых таблиц MyISAM не сработает, там нужен --lock-all-tables--quick - выгружает построчно, не собирая всю таблицу в памятьpg_dump и pg_restore идут с сервером PostgreSQL - это версия 16 на Ubuntu 24.04 и 14 на 22.04; на MariaDB mysqldump доступен и под именем mariadb-dump (/usr/bin/mariadb-dump)Простая ротация - в каталоге лежат только дампы, поэтому удаляем всё старше 7 дней:
find /root/db -type f -mtime +7 -delete
Дальше эти дампы забирает restic вместе с остальными файлами - и увозит с сервера сразу в зашифрованном виде.
tar, rsync, pg_dump - это кирпичи. Чтобы из них получилась нормальная система бэкапа, надо самому решить шифрование, дедупликацию (не хранить одно и то же по десять раз), инкременты (копировать только изменения), ротацию и проверку целостности. restic и borg - это уже готовые системы, где всё перечисленное внутри:
restic проще стартовать, и он умеет много типов приёмников: SFTP, S3-совместимые хранилища, локальный диск. borg старше, чуть быстрее на больших объёмах и экономнее по месту, но приёмник должен быть либо локальным, либо доступным по SSH с установленным borg. Для первой своей системы бэкапа берите restic; borg - если у вас есть выделенный бэкап-сервер и очень большие объёмы.
Установка (заодно ставим borg - на случай, если решите пользоваться им):
apt install -y restic borgbackup
На Ubuntu 24.04 из репозитория ставятся restic 0.16.4 и borg 1.2.8 - этого хватает для всего, что ниже. В старых LTS версия ниже (на 22.04 restic примерно 0.12-0.14), и часть флагов, включая --read-data-subset=5%, может отсутствовать - тогда обновите его командой restic self-update или возьмите бинарник со страницы релиза на GitHub.
Настройте доступ к репозиторию - это место, где restic хранит копии. Здесь пример по SFTP на другую машину (нужен SSH-доступ на приёмник по ключу):
export RESTIC_REPOSITORY="sftp:backup@backuphost:/srv/restic/web01"
export RESTIC_PASSWORD="длинная-случайная-фраза"
restic init
Пароль от репозитория - это ключ шифрования. Потеряете его - данные из копии не достанет никто, включая вас. Храните отдельно от сервера: в менеджере паролей, на бумаге в сейфе.
Первый бэкап - перечисляете каталоги:
restic backup /etc /root /home /var/www
В конце вывода: Files: N new, ..., Added to the repository: ..., snapshot a1b2c3d4 saved. Это и есть признак успеха.
Посмотреть список точек:
restic snapshots
Ротация - оставить 7 дневных, 4 недельных, 6 месячных, остальное удалить и освободить место:
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Проверка, что репозиторий цел:
restic check
Ручной бэкап забудется. systemd-таймер - штатный планировщик в Linux, аналог cron, но с журналом и понятным статусом - будет запускать копию сам.
Файл с доступами /root/.restic-env (права только root: chmod 600 /root/.restic-env):
RESTIC_REPOSITORY=sftp:backup@backuphost:/srv/restic/web01
RESTIC_PASSWORD=длинная-случайная-фраза
Сервис /etc/systemd/system/restic-backup.service:
[Unit]
Description=restic backup
[Service]
Type=oneshot
EnvironmentFile=/root/.restic-env
ExecStart=/usr/bin/restic backup /etc /root /home /var/www
ExecStartPost=/usr/bin/restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
ExecStartPost=/usr/bin/curl -fsS -m 10 https://hc-ping.com/ВАШ-UUID
Type=oneshot - сервис отрабатывает и завершается, это не постоянный процессEnvironmentFile - подтягивает переменные RESTIC_* из защищённого файла, чтобы пароли не лежали в самом юнитеExecStartPost - ротация сразу после успешного бэкапаExecStartPost - пинг сервиса мониторинга (Healthchecks.io и подобные). Запустилось - пинг прошёл. Упало - пинга нет, и монитор пришлёт уведомление. Это проверено: если ExecStart завершился ненулевым кодом, ни один ExecStartPost не выполняется, так что пинг - именно сигнал успехаТаймер /etc/systemd/system/restic-backup.timer:
[Unit]
Description=daily restic backup
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
RandomizedDelaySec=15m
[Install]
WantedBy=timers.target
OnCalendar - когда запускать (каждый день в 03:30)Persistent=true - если сервер в это время был выключен, запустить пропущенный бэкап при включенииRandomizedDelaySec - случайный разброс старта, чтобы не бить в хранилище пиком в одну секундуВключить и проверить:
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
Последняя команда покажет строку таймера с колонками NEXT, LEFT, LAST, PASSED, UNIT, ACTIVATES; время в NEXT сдвинуто на случайную дельту из-за RandomizedDelaySec. Ручная проверка прямо сейчас - systemctl start restic-backup.service, затем journalctl -u restic-backup.service -e.
Привычнее cron? Строка 30 3 * * * . /root/.restic-env && restic backup /etc /root /home /var/www в crontab -e сделает то же, но без журнала и без запуска пропущенных заданий.
Правило 3-2-1 - это минимальный разумный уровень:
Куда складывать копии на практике: второй недорогой VPS с большим диском и доступом по SSH, объектное хранилище с S3-совместимым API или диск дома. Главное - другая площадка: если теряете сервер целиком, копия должна остаться.
Сроки хранения (retention) ставьте от того, за какой срок проблема может остаться незамеченной. Типично: 7 дневных, 4-8 недельных, 6-12 месячных. Битый файл, который никто не открывал месяц, должен ещё находиться в копии.
Шифрование обязательно для всего, что лежит вне вашего сервера. restic и borg шифруют сами. Если делаете tar или rsync в чужое хранилище - шифруйте перед отправкой. В скрипте пароль руками ввести некому, поэтому берём его из файла:
echo 'длинная-случайная-фраза' > /root/.gpg-pass
chmod 600 /root/.gpg-pass
tar czf - /etc /home /var/www \
| gpg -c --batch --pinentry-mode loopback --passphrase-file /root/.gpg-pass \
-o /root/backup-$(date +%F).tar.gz.gpg
--batch --pinentry-mode loopback --passphrase-file - обязательны в неинтерактивном режиме. Без них gpg -c в конвейере не может запросить пароль и молча создаёт пустой файл с кодом возврата 0 - тихий обвал бэкапа, который вы заметите только при попытке восстановиться/root/.gpg-pass держите с правами 600 и не в том же каталоге, куда кладёте архивРасшифровать потом: gpg -d --batch --pinentry-mode loopback --passphrase-file /root/.gpg-pass /root/backup-2026-09-10.tar.gz.gpg | tar xzf -.
Бэкап, из которого ни разу не восстанавливались, - это не бэкап, а предположение. Раз в месяц прогоняйте пробное восстановление.
restic, отдельный каталог во временную папку:
restic restore latest --target /tmp/restore-test --include /etc/nginx
diff -r /etc/nginx /tmp/restore-test/etc/nginx
Пустой вывод diff - файлы из копии совпадают с боевыми. Заодно проверьте целостность самих данных в репозитории:
restic check --read-data-subset=5%
Дамп базы - поднимите во временную базу и посмотрите, что данные на месте:
sudo -u postgres createdb restore_test
sudo -u postgres pg_restore -d restore_test /root/db/mydb-2026-09-10.dump
sudo -u postgres psql -d restore_test -c "select count(*) from users;"
sudo -u postgres dropdb restore_test
Число строк примерно совпадает с боевым - дамп рабочий.
Раз в несколько месяцев проверяйте и полное восстановление: возьмите чистый сервер (как - в статье Как создать сервер в панели HIP), разверните на нём копию из restic и убедитесь, что сайт открывается. Пока это не проверено, вы не знаете, сколько времени займёт восстановление и всё ли в копии есть.
/etc, сервис не стартует. Восстанавливать - отдельный файл из restic. Чем - restic restore latest --include /etc/... --target /tmp/r, затем скопировать нужное на место.pg_restore или mysql < dump.sql.restic restore нужного пути из последней точки.restic restore данных.rsync -aAX каталогов либо restic restore на новый сервер.Нет. В панели HIP нет функции снапшотов: единственная операция, затрагивающая диск, - это переустановка (Rebuild), и она стирает всё. Резервные копии сервера HIP делаются только на вашей стороне - инструментами на самом сервере с выгрузкой в другое место.
Поставьте restic или borg, создайте репозиторий в другом месте (второй сервер по SFTP или объектное хранилище) и запускайте restic backup по расписанию через systemd-таймер. Отдельно снимайте дампы баз через pg_dump или mysqldump. Копия шифруется на сервере до отправки, так что в хранилище уходят только зашифрованные данные.
Оба - системы инкрементного шифрованного бэкапа с дедупликацией и ротацией. restic проще в старте и поддерживает много типов хранилищ, включая S3-совместимые. borg чуть быстрее и экономнее на больших объёмах, но требует, чтобы приёмник был локальным или доступным по SSH с установленным borg. Для первой системы бэкапа берите restic.
Не на тот же сервер. Подходит второй недорогой VPS с большим диском и доступом по SSH, объектное хранилище с S3-совместимым API или диск дома. Главное - другая площадка: если теряете сервер целиком, копия должна остаться. Держите правило 3-2-1: три копии, два носителя, одна вне площадки.
Сделайте systemd-сервис с командами restic backup и restic forget --prune и таймер с OnCalendar на нужное время и Persistent=true. В конце сервиса добавьте пинг сервиса мониторинга: прошёл бэкап - пришёл пинг, упал - пинга нет, и придёт уведомление. Так вы узнаете о сломанном бэкапе до того, как он понадобится.
Раз в месяц делайте пробное восстановление: restic restore одного каталога во временную папку и diff с боевым, restic check --read-data-subset=5% для целостности данных, а дамп базы поднимайте во временную базу и сверяйте число строк. Бэкап, из которого ни разу не восстанавливались, не считается рабочим.