Перейти к содержимому
WebShield Docs

Бэкапы в облако — Windows, Mac, Linux, 1С и базы данных

Как настроить ежедневное резервное копирование компьютера или сервера в S3-хранилище WebShield через restic — с теневой копией для открытых файлов, закрытием 1С перед копированием и дампами баз данных.

Копия на том же сервере или на диске в соседней комнате погибает вместе с оригиналом: шифровальщик, пожар и кража не выбирают, что трогать. Копия должна лежать в другом месте — и делаться сама, без человека.

Решение — restic по расписанию: он шифрует данные на вашей стороне, хранит только изменившиеся части и складывает их в бакет нашего S3-хранилища.

Схема одна для сервера и рабочего компьютера, для Windows, Mac и Linux. Отличается только то, как копировать открытые файлы и базы: на Windows — теневой копией, для 1С — закрытием программы, для баз данных — дампом.

Что получится: ежедневный зашифрованный бэкап выбранных папок и баз в облаке и история копий за выбранный срок. Насколько копии пригодны, показывает только проверка восстановления — она в конце статьи. Понадобится: права администратора на компьютере или сервере и подключённое хранилище S3. Время: около часа, считая проверку восстановления.

1. Создайте бакет и включите защиту от удаления

Заголовок раздела «1. Создайте бакет и включите защиту от удаления»

Личный кабинет → Хранилище S3 → Создать бакет: приватный, регион ru-1 или eu-1. Имя получит префикс аккаунта — например, u42-backups. Ключи доступа — в той же карточке.

Сразу, до первого бэкапа, выставьте у бакета Защита от удаления: 30 дней. Ключи restic хранит на сервере, а действуют они на все бакеты аккаунта: взломщик или шифровальщик, получивший сервер, может удалить ими и копии. С защитой:

  • хранилище не удаляет файлы безвозвратно 30 дней: запрос на удаление, с каким бы ключом он ни пришёл, только прячет файл, а данные остаются;
  • блокировку файлов, которые restic не удалял, хранилище продлевает само, раз в полсрока;
  • то, что restic выбросил при чистке, хранится ещё 30 дней и удаляется само.

В restic ничего менять не нужно. Простое версионирование защиту не заменяет: тем же ключом стираются и старые версии.

Во что это обойдётся: выброшенное restic’ом хранится и оплачивается около месяца сверх живого объёма — поэтому скрипты ниже чистят репозиторий раз в неделю, а не каждую ночь.

До первой оплаты бакет ограничен 10 ГБ, а заполненный бакет перестаёт принимать запись — ночной бэкап просто не сохранится. Прикиньте объём заранее.

Windows: скачайте restic_…_windows_amd64.zip со страницы релизов и положите restic.exe в C:\restic\. Нужна версия 0.16 или новее — в ней появились теневые копии.

Mac: brew install restic.

Linux: apt install restic или dnf install restic. Если в репозитории дистрибутива версия старше 0.17, возьмите бинарник со страницы релизов.

Пароль репозитория сохраните в файл (C:\restic\password.txt или /root/.restic-password, доступ только администратору) и ещё в одно надёжное место вне сервера — например, в ваш личный менеджер паролей. Вышедший из строя диск или взломанный сервер унесут с собой и файл с паролем, а без пароля копии не расшифровать — восстановить его мы не сможем.

Создайте репозиторий. Windows, PowerShell от администратора:

Terminal window
# Подставьте своё: имя бакета и ключи — из карточки хранилища в кабинете
$bucket = "ИМЯ_ВАШЕГО_БАКЕТА" # например, u42-backups
$folder = "office-server" # папка для этого компьютера
$env:AWS_ACCESS_KEY_ID = "ВАШ_ACCESS_KEY"
$env:AWS_SECRET_ACCESS_KEY = "ВАШ_SECRET_KEY"
# Дальше менять ничего не нужно
$env:RESTIC_REPOSITORY = "s3:https://s3.webshield.pro/$bucket/$folder"
$env:RESTIC_PASSWORD_FILE = "C:\restic\password.txt"
C:\restic\restic.exe init

Это переменные самого restic, в кабинете их искать не нужно. AWS_… — ключи доступа, RESTIC_REPOSITORY — адрес репозитория: наше хранилище, ваш бакет и папка в нём. Папок в одном бакете может быть сколько угодно — по одной на компьютер. Регион указывать не нужно: он задан у бакета при создании. На Mac и Linux — то же самое через export.

Проверка: restic snapshots отвечает пустым списком без ошибок.

Файл, открытый программой, во время копирования меняется, и в копию попадает смесь старых и новых кусков. Особенно опасно это для баз: 1С, почтовых ящиков, баз SQL. На Windows restic умеет копировать с теневой копии тома (VSS): мгновенного снимка диска, который не меняется, пока идёт бэкап. За это отвечает флаг --use-fs-snapshot, и работает он только от администратора.

Terminal window
C:\restic\restic.exe backup --use-fs-snapshot D:\Bases D:\Documents

С теневой копией в бэкап попадают и открытые файлы — включая файловую базу 1С, с которой в этот момент работают. Но снимок фиксирует диск в случайный момент, как при внезапном отключении питания: незавершённая операция в 1С останется незавершённой и в копии. Такая база может открыться сразу, а может потребовать тестирования и исправления — и выяснится это в день, когда копия понадобится. Поэтому перед бэкапом 1С стоит закрыть.

На Mac и Linux restic теневых копий не делает. Файлы копируйте как есть, а базы данных — дампом (шаг 5).

Скрипт C:\restic\backup.ps1 сначала просит 1С закрыться, через минуту закрывает оставшееся силой и делает копию с теневым снимком, а по воскресеньям прореживает старые копии:

Terminal window
$bucket = "ИМЯ_ВАШЕГО_БАКЕТА" # как в шаге 2
$folder = "office-server"
$env:AWS_ACCESS_KEY_ID = "ВАШ_ACCESS_KEY"
$env:AWS_SECRET_ACCESS_KEY = "ВАШ_SECRET_KEY"
$env:RESTIC_REPOSITORY = "s3:https://s3.webshield.pro/$bucket/$folder"
$env:RESTIC_PASSWORD_FILE = "C:\restic\password.txt"
$restic = "C:\restic\restic.exe"
$log = "C:\restic\backup.log"
# Закрыть 1С у всех пользователей: сначала вежливо, через минуту — принудительно
Get-Process 1cv8, 1cv8c -ErrorAction SilentlyContinue | ForEach-Object { $_.CloseMainWindow() | Out-Null }
Start-Sleep -Seconds 60
Get-Process 1cv8, 1cv8c -ErrorAction SilentlyContinue | Stop-Process -Force
& $restic backup --use-fs-snapshot D:\Bases D:\Documents *>> $log
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
# По воскресеньям — чистка: 14 ежедневных, 8 еженедельных и 12 ежемесячных копий
if ((Get-Date).DayOfWeek -eq "Sunday") {
& $restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune *>> $log
}

Принудительное закрытие теряет несохранённый документ, поэтому запускайте скрипт ночью, а сотрудников предупредите. Если 1С открыта на нескольких компьютерах с базой в общей папке, скрипт закроет только те сеансы, что запущены на этом сервере, — остальные пользователи должны выходить сами, или закрытие нужно повторить на их машинах.

Это сценарий для файловой базы. У клиент-серверной 1С данные лежат в MS SQL или PostgreSQL: копируйте не файлы СУБД, а дамп. Сделайте его средствами СУБД в папку, которую забирает restic, — BACKUP DATABASE в MS SQL или pg_dump в PostgreSQL, — и запускайте перед restic backup.

Повесьте скрипт на расписание: Планировщик заданий → Создать задачу, учётная запись SYSTEM, флажок Выполнить с наивысшими правами, триггер — ежедневно в 03:00, действие — powershell.exe -ExecutionPolicy Bypass -File C:\restic\backup.ps1.

Проверка: запустите задачу вручную. В backup.log — строка snapshot … saved, в restic snapshots — новая копия.

На Mac и Linux та же схема — скрипт и cron. Базы снимайте дампом прямо в репозиторий, без промежуточного файла (restic 0.17 и новее):

#!/bin/sh
# /root/backup.sh — копия сайта и дамп базы PostgreSQL
set -e
BUCKET=ИМЯ_ВАШЕГО_БАКЕТА # например, u42-backups
export AWS_ACCESS_KEY_ID=ВАШ_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=ВАШ_SECRET_KEY
export RESTIC_REPOSITORY=s3:https://s3.webshield.pro/$BUCKET/web-server
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic backup /var/www /etc
restic backup --stdin-filename shop.sql --stdin-from-command -- sudo -u postgres pg_dump shop
# По воскресеньям — чистка старых копий
if [ "$(date +%u)" = 7 ]; then
restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune
fi

Для MySQL вместо pg_dump — mysqldump --single-transaction shop. В cron: 0 3 * * * /root/backup.sh >> /var/log/restic.log 2>&1.

На Mac для домашней папки вместо /var/www /etc укажите, например, ~/Documents ~/Desktop. macOS не пускает фоновые задачи в личные папки: добавьте /usr/sbin/cron в Системные настройки → Конфиденциальность и безопасность → Доступ к диску, иначе копия выйдет пустой, а в логе будет operation not permitted. Ноутбук должен быть включён во время запуска — пропущенный ночью бэкап cron не повторит.

Бэкап, из которого ни разу не восстанавливали, — надежда, а не бэкап. Раз в месяц:

Terminal window
restic snapshots
restic restore latest --target D:\restore-test --include D:\Bases
restic check --read-data-subset=5%

Откройте восстановленную базу 1С в отдельной копии платформы и убедитесь, что она запускается, а последние документы на месте. restic check с выборкой читает часть данных из облака и сверяет контрольные суммы.

Перевыпустите ключи в кабинете — старые перестанут работать через минуту. Затем у бакета нажмите Вернуть удалённое и укажите время чуть раньше атаки: хранилище снимет удаление с файлов, удалённых после этого момента, если их срок защиты ещё не вышел. Выброшенное самим restic’ом раньше останется выброшенным. После этого на другом компьютере с новыми ключами проверьте репозиторий: restic check --read-data — только он покажет, цел ли он.

Симптом Возможная причина и решение
Access Denied или SignatureDoesNotMatch Ключи скопированы с лишним пробелом или их перевыпустили. Возьмите текущую пару в карточке хранилища.
The specified bucket does not exist В адресе нет префикса аккаунта: нужно u42-backups, а не backups.
--use-fs-snapshot падает с ошибкой VSS Скрипт запущен не от администратора, или выключена служба «Теневое копирование тома». В Планировщике — SYSTEM и наивысшие права.
Бэкап шёл, а потом стал падать на записи Бакет заполнился: до первой оплаты он ограничен 10 ГБ. Пополните баланс или сократите набор папок.
Копия 1С поднимается с ошибками Скорее всего, копировали работающую базу. Проверьте, что скрипт действительно закрывает 1С на всех машинах, а у клиент-серверной базы копируйте дамп СУБД.
На Mac operation not permitted У cron нет полного доступа к диску — см. шаг 5.
repository is already locked Предыдущий запуск оборвался. Убедитесь, что restic больше нигде не работает, и выполните restic unlock.
  • Объектное хранилище (S3) — версионирование, Object Lock, лимиты и тарификация.
  • rclone — если нужна не история копий, а зеркало папки в облаке.