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

Резервные копии RISH в Yandex Object Storage: настройка S3 через rclone

Резервные копии RISH в Yandex Object Storage: настройка S3 через rclone

RISH создаёт архивы сайтов на сервере и передаёт их во внешнее хранилище с помощью rclone. Для Яндекс Диска в программе есть отдельная OAuth-настройка, но Yandex Object Storage — другой сервис: он работает по S3-совместимому API и требует собственного профиля.

В этой инструкции мы настроим резервные копии RISH в Yandex Object Storage, привяжем подключение к конкретному bucket и проверим не только чтение, но и реальную запись. В качестве примера используется холодный класс хранения COLD, подходящий для архивов, которые создаются регулярно, а восстанавливаются редко.

Как будет устроено подключение

Для работы понадобятся два remote в rclone:

  • ycloud-s3 — подключение к S3 API Yandex Object Storage;
  • ycloud — alias, который направляет RISH внутрь конкретного bucket.
RISH → ycloud: → ycloud-s3:<bucket> → Yandex Object Storage

Дополнительный alias нужен из-за различий между обычным облачным диском и S3. RISH обращается к корню выбранного remote, а в S3 путь к данным начинается с имени bucket. Alias делает bucket корнем подключения, поэтому структура RISH backup_server/пользователь/дата сохраняется внутри него без изменений.

Создаём сервисный аккаунт

Откройте консоль Yandex Cloud, выберите каталог, в котором будет находиться хранилище, и перейдите в раздел Identity and Access Management. Создайте отдельный сервисный аккаунт, например rish-backup.

Для загрузки, чтения и удаления резервных копий назначьте этому аккаунту роль storage.editor. Роль можно выдать на весь каталог или на конкретный bucket. Важно, чтобы роль получил именно тот сервисный аккаунт, для которого затем будет создан статический ключ.

Публичный доступ к bucket для работы RISH не нужен. Все операции выполняются от имени сервисного аккаунта.

Создаём статический ключ

Откройте созданный сервисный аккаунт, нажмите Создать новый ключ и выберите Создать статический ключ доступа. Yandex Cloud покажет два значения:

  • key_id — идентификатор статического ключа;
  • secret — секретная часть ключа.

В rclone нужно вводить именно key_id и соответствующий ему secret. Не путайте key_id с идентификатором сервисного аккаунта или внутренним полем access_key.id.

Сохраните secret сразу. После закрытия окна Yandex Cloud больше его не покажет. Никогда не публикуйте ключ в переписке, снимке экрана или инструкции. Если secret стал известен посторонним, удалите этот статический ключ и создайте новую пару.

Создаём bucket для резервных копий

В том же каталоге Yandex Cloud откройте Object Storage и нажмите Создать бакет. Имя bucket должно быть уникальным во всём Yandex Object Storage. Для беспроблемной работы с HTTPS удобнее использовать строчные латинские буквы, цифры и дефисы, например:

rish-backup-337152

Для параметров чтения объектов, получения списка объектов и чтения настроек выберите С авторизацией. Ограничение размера задайте по необходимости.

В поле класса хранения по умолчанию выберите Холодное (COLD). Если rclone не передаёт класс для отдельного объекта, Yandex Object Storage сохраняет его в классе bucket по умолчанию. Поэтому позже параметр storage_class мы оставим пустым.

Открываем общую настройку rclone в RISH

Откройте меню архивации RISH и выберите Создать/Выбрать подключение по умолчанию. Затем выберите пункт Создать/Удалить новое подключение rclone. RISH запустит интерактивную команду rclone config.

Не используйте для этой задачи пункт Создать/Обновить подключение Яндекс-диска. Он настраивает обычный Яндекс Диск через OAuth, а не Yandex Object Storage.

Создаём S3-профиль ycloud-s3

В главном меню rclone config нажмите n для создания remote и задайте имя:

name> ycloud-s3

В списке типов выберите Amazon S3 Compliant Storage, либо введите текстовое значение:

Storage> s3

В списке провайдеров отдельного пункта Yandex Cloud нет. Согласно официальной инструкции Yandex Cloud, нужно выбрать Amazon Web Services S3. Номер пункта зависит от версии rclone, поэтому надёжнее ввести название:

provider> AWS

Далее выберите ручной ввод учётных данных и заполните параметры:

env_auth> false
access_key_id> <key_id статического ключа>
secret_access_key> <secret из той же пары>
region> ru-central1
endpoint> storage.yandexcloud.net

Остальные стандартные параметры:

location_constraint> [Enter]
acl> private
server_side_encryption> [Enter]
sse_kms_key_id> [Enter]
storage_class> [Enter]

server_side_encryption и sse_kms_key_id оставляют пустыми, если для bucket отдельно не настраивалось шифрование с помощью KMS. Пустой storage_class означает, что новые объекты унаследуют холодный класс bucket.

На вопрос о расширенной настройке ответьте n, затем подтвердите сохранение remote:

Edit advanced config? n
Keep this "ycloud-s3" remote? y

Создаём alias ycloud

Не выходя из rclone config, ещё раз нажмите n. Создайте remote с именем ycloud и выберите тип Alias for an existing remote:

name> ycloud
Storage> alias

В качестве целевого пути укажите S3-профиль и точное имя созданного bucket:

remote> ycloud-s3:rish-backup-337152

Замените rish-backup-337152 своим именем. Сохраните alias ответом y, затем выйдите из конфигуратора командой q.

Итоговая логическая конфигурация выглядит так:

[ycloud-s3]
type = s3
provider = AWS
env_auth = false
access_key_id = <key_id>
secret_access_key = <secret>
region = ru-central1
endpoint = storage.yandexcloud.net
acl = private

[ycloud]
type = alias
remote = ycloud-s3:rish-backup-337152

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

Проверяем доступ к bucket

Сначала проверьте конкретный bucket напрямую:

rclone lsf ycloud-s3:rish-backup-337152

Если bucket пустой, успешная команда ничего не выведет и вернёт приглашение терминала без ошибки. Затем проверьте alias:

rclone lsf ycloud:

Для полного теста создайте небольшой объект, прочитайте его и удалите:

printf 'rclone test\n' | rclone rcat ycloud:rclone-test.txt
rclone lsl ycloud:
rclone cat ycloud:rclone-test.txt
rclone deletefile ycloud:rclone-test.txt

Команда rclone cat должна вывести строку rclone test. Такой тест подтверждает авторизацию, запись, получение списка объектов, чтение и удаление.

Двоеточие после имени remote обязательно. Без него rclone lsf ycloud будет искать локальный каталог с именем ycloud.

Выбираем подключение в RISH

Вернитесь в меню Создать/Выбрать подключение по умолчанию и выберите ycloud. В качестве рабочего подключения RISH должен использовать именно alias, а не внутренний remote ycloud-s3.

После этого экран информации покажет выбранное подключение, каталог резервных копий и суммарный размер объектов. У S3 нет универсального запроса общей квоты, поэтому команда rclone about для такого bucket не поддерживается. Это штатная особенность backend, а не ошибка подключения.

Запустите архивацию одного сайта и проверьте, что внутри bucket появилась структура:

backup_server/<пользователь>/<дата>/...

Что учитывать при холодном хранении

Холодный класс COLD предназначен для данных, к которым обращаются редко — ориентировочно раз в месяц. Хранение стоит дешевле стандартного, но операции записи и чтения обходятся дороже.

В отличие от архивных классов некоторых других S3-провайдеров, объекты Yandex Object Storage класса COLD доступны напрямую: отдельное длительное восстановление перед скачиванием не требуется. Поэтому класс хорошо подходит для резервных копий с регулярной загрузкой и редкими проверками или восстановлениями.

Сами операции DELETE в Yandex Object Storage не тарифицируются, однако поиск старых копий при очистке может создавать платные запросы LIST. Архивация и восстановление также выполняют тарифицируемые операции записи и чтения. Частоту, количество хранимых версий и размер частей архива следует выбирать с учётом актуальных тарифов Yandex Cloud.

Типовые ошибки и их причины

СообщениеЧто означаетЧто проверить
InvalidAccessKeyIdСервис не знает переданный идентификатор ключаПроверьте endpoint = storage.yandexcloud.net, выбранный remote и поле key_id. Без endpoint Yandex-ключ может быть отправлен в AWS. Удалённый или ошибочный ключ также даст эту ошибку.
SignatureDoesNotMatchИдентификатор ключа распознан, но подпись не совпалаУбедитесь, что secret относится к тому же key_id, введён без пробелов и не взят от другой пары.
AccessDenied при ListBucketsАккаунту запрещён общий список bucketПроверьте конкретный путь командой rclone lsf ycloud-s3:<bucket>. Если и он недоступен, назначьте тому же сервисному аккаунту роль storage.editor.
"ycloud" refers to a local folderКоманда обращается к локальному путиДобавьте двоеточие: ycloud:.
doesn't support aboutS3 backend не сообщает общую квотуИспользуйте rclone size ycloud:. На передачу и восстановление архивов отсутствие about не влияет.

Команда rclone lsd ycloud-s3: запрашивает общий список bucket и может завершиться с AccessDenied, хотя доступ к нужному bucket полностью работает. Для окончательной проверки важнее запрос конкретного bucket и тест записи через alias.

Официальная документация

Итог

Для резервных копий RISH в Yandex Object Storage недостаточно создать обычный S3 remote. Надёжная схема состоит из подключения ycloud-s3 с endpoint Yandex Cloud и alias ycloud, закреплённого за конкретным bucket.

RISH работает через ycloud:, а alias преобразует этот путь в ycloud-s3:<bucket>. Благодаря этому программа сохраняет привычную структуру архивов, не зависит от права получать общий список bucket и может работать с закрытым хранилищем.

Если bucket использует холодный класс по умолчанию, параметр storage_class в rclone оставляют пустым. После теста записи, чтения и удаления подключение можно выбрать в RISH по умолчанию и использовать для ручной или автоматической архивации.

Vladimir Progreccor

Основатель проекта RISH

Новости проекта

ПодробнееРезервные копии RISH в Yandex Object Storage: настройка S3 через rclone