Как правильно бэкапить файлы в Yandex Storage?
Есть файлы (документы, картинки) на сервере. Есть Yandex Storage. Нужно огранизовать бэкап файлов на Yandex Storage. В голову пришло несколько вариантов:
1. Загружать/удалять в Яндекс в момент загрузки/удаления на сервере.
2. Сделать таблицу файлов загруженных на Яндекс. В момент загрузки/удаления помечать файлы в таблице и затем, допустим раз в неделю, пачкой проводить загрузку/удаление на Яндекс.
3. Сносить все файлы в Яндекс. Упаковывать все файлы на сервере в архив. И грузить этот архив на Яндекс. Повторять раз в неделю. Но тогда это вероятно отразится на стоимости в Яндекс т.к. будут операции на загрузку-удаление гигабайтов данных.
Как поступить и что выбрать?
Дополнительно:
А почему просто не взять готовый инструментарий типа borg-backup, restic, duplicity, да тысячи их? Там и ротация бэкапов настраивается, можете шифровать данные, делать инкрементальные или полные бэкапы и т.п. Большинство таких утилит умеет работать с S3-совместимыми хранилищами.
Инкрементальные бакапы
Каждый архив должен содержать только разницу между предыдущим состоянием файловой системы и текущим
Каждый инструмент резервного копирования использует свой формат хранения такого снапшота
Если делаешь свой, то учитывай не только новые и измененные файлы но и удаляемые. Существуют binary diff утилиты, вычисляющие приблизительную разницу между двумя бинарными файлами для экономии места в бакапе, вместо полного копирования измененного файла
p.s. недостаток инкрементальных бакапов в том что для восстановления состояния нужно "применить снапшоты" за все время с момента первого сохраненного состояния
решают эту проблему тем что ограничивают количество промежуточных состояний и с каждым новым модифицирют стартовое состояние, применив к нему самый старый бакап (который после этого удалят)
p.p.s. btrfs имеет встроенные механизмы получения инкрементальных бакапов между снапшотами без сканирования всех файлов (что актуально для ОГРОМНЫХ архивов)
- Это типа второго варианта только с архивами? С архивами не работал никогда, не представляю как все эти операции с ними проводить (сравнения, изменения итд). Выглядит в моей голове как то неоправданно сложно.
- Все нормальные архиваторы от tar до rar умеют совершать архивацию, с пометкой в файловой системе флаг что файл в архиве или например по дате (все файлы с изменениями после даты) и т.п.
чуть сложнее с контролем за удалением файлов, но вот пример, в windows (в linux всегда было, loop устройства) можно создать .vhdx файл (в панели управления дисками создать виртуальный диск), внутри которого развернуть полноценную файловую систему,... копировать файлы туда можно с помощью rsync, он и удалит и обновит и не будет лишние операции делать.
т.е. получаешь что то типа архива (сжатие можно средствами файловых систем организовать) который можно переносить одним файлом, держать в сети (с осторожностью) и при этом его можно подключить как диск и работать в любых программах
- rPman, звучит как правильное решение) Хотя для меня все равно сложно, если только библиотеку под ПХП поискать на гитхабе.
Ответы:
А почему актуально только платное облачное хранение?
Локального сервера/NAS у вас нет?
- У меня есть один сервер под проект, где и сейчас хранятся файлы. Ну облако дешевле + кодовая база настроена на Яндекс.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для правильного бэкапа файлов в Yandex Storage, можно воспользоваться Yandex Object Storage API, который предоставляет различные методы для работы с файлами и папками в облачном хранилище.
Прежде всего, необходимо получить доступ к Yandex Object Storage API, для этого необходимо создать аккаунт на Яндекс Облаке и настроить доступ к API. Затем необходимо установить библиотеку для работы с API, например, yandex-cloud/php-sdk.
Далее можно использовать следующий пример кода на PHP для создания бэкапа файла в Yandex Storage:
'YOUR_ACCESS_TOKEN', 'cloudId' => 'YOUR_CLOUD_ID', 'folderId' => 'YOUR_FOLDER_ID', ]); $fileName = 'backup.zip'; $filePath = '/path/to/backup.zip'; $objectStorage->uploadFile($fileName, fopen($filePath, 'r'));
В данном примере кода, мы используем библиотеку yandex-cloud/php-sdk для работы с Yandex Object Storage API. Мы создаем новый экземпляр клиента ObjectStorageClient и указываем необходимые параметры, такие как токен доступа, идентификатор облака и идентификатор папки.
Затем мы указываем имя файла и путь к файлу, который мы хотим загрузить в облако. Используя метод uploadFile, мы загружаем файл в Yandex Storage.
Таким образом, приведенный выше код поможет вам правильно бэкапить файлы в Yandex Storage, используя Yandex Object Storage API. Не забудьте заменить YOUR_ACCESS_TOKEN, YOUR_CLOUD_ID и YOUR_FOLDER_ID на ваши реальные данные.