Бэкапы в облако — 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 ГБ, а заполненный бакет перестаёт принимать запись — ночной бэкап просто не сохранится. Прикиньте объём заранее.
2. Установите restic и создайте репозиторий
Заголовок раздела «2. Установите restic и создайте репозиторий»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 от администратора:
# Подставьте своё: имя бакета и ключи — из карточки хранилища в кабинете$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 отвечает пустым списком без ошибок.
3. Включите теневое копирование
Заголовок раздела «3. Включите теневое копирование»Файл, открытый программой, во время копирования меняется, и в копию попадает смесь
старых и новых кусков. Особенно опасно это для баз: 1С, почтовых ящиков, баз SQL. На
Windows restic умеет копировать с теневой копии тома (VSS): мгновенного снимка диска,
который не меняется, пока идёт бэкап. За это отвечает флаг --use-fs-snapshot, и
работает он только от администратора.
C:\restic\restic.exe backup --use-fs-snapshot D:\Bases D:\DocumentsС теневой копией в бэкап попадают и открытые файлы — включая файловую базу 1С, с которой в этот момент работают. Но снимок фиксирует диск в случайный момент, как при внезапном отключении питания: незавершённая операция в 1С останется незавершённой и в копии. Такая база может открыться сразу, а может потребовать тестирования и исправления — и выяснится это в день, когда копия понадобится. Поэтому перед бэкапом 1С стоит закрыть.
На Mac и Linux restic теневых копий не делает. Файлы копируйте как есть, а базы данных — дампом (шаг 5).
4. Закройте 1С перед копированием
Заголовок раздела «4. Закройте 1С перед копированием»Скрипт C:\restic\backup.ps1 сначала просит 1С закрыться, через минуту закрывает
оставшееся силой и делает копию с теневым снимком, а по воскресеньям прореживает старые копии:
$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 60Get-Process 1cv8, 1cv8c -ErrorAction SilentlyContinue | Stop-Process -Force
& $restic backup --use-fs-snapshot D:\Bases D:\Documents *>> $logif ($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 — новая копия.
5. Mac и Linux: файлы и дампы баз
Заголовок раздела «5. Mac и Linux: файлы и дампы баз»На Mac и Linux та же схема — скрипт и cron. Базы снимайте дампом прямо в репозиторий, без промежуточного файла (restic 0.17 и новее):
#!/bin/sh# /root/backup.sh — копия сайта и дамп базы PostgreSQLset -eBUCKET=ИМЯ_ВАШЕГО_БАКЕТА # например, u42-backupsexport AWS_ACCESS_KEY_ID=ВАШ_ACCESS_KEYexport AWS_SECRET_ACCESS_KEY=ВАШ_SECRET_KEYexport RESTIC_REPOSITORY=s3:https://s3.webshield.pro/$BUCKET/web-serverexport RESTIC_PASSWORD_FILE=/root/.restic-password
restic backup /var/www /etcrestic 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 --prunefiДля 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 не повторит.
Проверка
Заголовок раздела «Проверка»Бэкап, из которого ни разу не восстанавливали, — надежда, а не бэкап. Раз в месяц:
restic snapshotsrestic restore latest --target D:\restore-test --include D:\Basesrestic 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 — если нужна не история копий, а зеркало папки в облаке.