RE:NODE

Эксплуатация11 мин чтения

rclone и хранилище S3: sync, copy, mount и crypt

Как настроить rclone для любого S3-совместимого эндпоинта, безопасно пользоваться copy, sync и backup-dir, ограничить полосу, смонтировать бакет как диск и шифровать файлы через crypt.

0 прочтений

rclone - тот инструмент, за которым стоит тянуться, когда нужно перемещать файлы между вашей машиной, сервером и хранилищем S3 с большим контролем, чем даёт AWS CLI. Настройте один remote типа s3 с провайдером Other, вашим эндпоинтом, access key, secret key, любым регионом и force_path_style = true - и с ним заработают rclone copy, rclone sync, rclone mount и зашифрованный слой crypt. Команды простые; осторожности требует одна - sync, потому что она удаляет. В этой статье настраивается remote, объясняется, как rclone решает, что передавать, и показаны флаги, с которыми задача по расписанию остаётся быстрой, вежливой к вашему каналу и защищённой от собственных ошибок.

Настройка remote#

Установите rclone с rclone.org (это один бинарный файл; пакеты в дистрибутивах часто сильно отстают) и проверьте rclone version. Затем создайте remote. Интерактивный способ - rclone config: выберите s3, затем провайдера Other для универсального S3-совместимого сервиса. Прямой способ - одна команда:

bash
$ rclone config create renode s3 \    provider=Other \    access_key_id=RNAKEXAMPLE123 \    secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \    endpoint=https://s3.example.com \    region=us-east-1 \    force_path_style=true \    no_check_bucket=true

Она записывает в конфигурационный файл следующее - где он лежит, выводит rclone config file:

rclone.conf
[renode]type = s3provider = Otheraccess_key_id = RNAKEXAMPLE123secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYendpoint = https://s3.example.comregion = us-east-1force_path_style = trueno_check_bucket = true

Настройки, которые имеют значение:

  • provider = Other - говорит rclone не предполагать особенностей какого-либо провайдера.
  • endpoint - базовый URL. Для всего, что идёт через интернет, правильный выбор - имя хоста с HTTPS; http://host:port работает, но передаёт данные открытым текстом.
  • region - любое имя, которое принимает сервер; оно входит в подпись запроса. Держите его одинаковым во всех инструментах.
  • force_path_style = true - бакет указывается в пути URL, а не в поддомене. Это умолчание rclone, но явное указание защищает от пресета провайдера, который его выключает.
  • no_check_bucket = true - не даёт rclone пытаться создать бакет перед каждой загрузкой. Полезно, когда бакет уже существует, и необходимо, когда вашим ключам может быть запрещено создавать бакеты.

В RE:NODE панель показывает access key и secret key, сгенерированные для сервера хранилища, а первый бакет создаётся за вас. Эндпоинт - это адрес и порт тарифа по обычному HTTP или ваше собственное имя хоста по HTTPS, после того как его A-запись указывает на слот прокси тарифа, который берёт на себя сертификат.

В конфигурационном файле хранится секретный ключ. Либо защитите файл (chmod 600), либо зашифруйте весь конфиг через rclone config и пункт «Set configuration password», передавая пароль при запуске в RCLONE_CONFIG_PASS. Для контейнеров и CI remote может целиком жить в переменных окружения - RCLONE_CONFIG_RENODE_TYPE=s3, RCLONE_CONFIG_RENODE_ENDPOINT=... и так далее, по одной на настройку, - вообще без файла.

Первые команды и синтаксис путей#

Пути записываются как remote:bucket/prefix. Локальный путь - просто путь.

bash
$ rclone lsd renode:                       # buckets$ rclone lsf renode:my-bucket/backups/     # one level, names only$ rclone ls renode:my-bucket               # every object with size$ rclone size renode:my-bucket             # object count and total bytes$ rclone ncdu renode:my-bucket             # interactive usage browser

rclone ncdu - самый быстрый способ выяснить, чем заполнен бакет: он обходит всё дерево и даёт просматривать его по размеру, как одноимённая утилита Unix.

copy, sync, move: что делает каждая#

КомандаКопирует новое и изменённоеУдаляет в назначенииУдаляет источник
rclone copy src dstДаНетНет
rclone sync src dstДаДа - делает dst идентичным srcНет
rclone move src dstДаНетДа, после успешной передачи
rclone check src dstТолько сравниваетНетНет

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

bash
# Always look first$ rclone sync /srv/data renode:my-bucket/data --dry-run# Then do it, with a ceiling on how much it may delete$ rclone sync /srv/data renode:my-bucket/data --max-delete 50

--dry-run выводит, что произойдёт. --interactive (-i) спрашивает перед каждым разрушительным действием. --max-delete 50 прерывает запуск, если тот собирается удалить больше 50 файлов, - это предохранитель на случай «диск-источник не был смонтирован и выглядел пустым».

sync со страховкой

--backup-dir превращает sync в нечто гораздо более близкое к бэкапу: всё, что было бы перезаписано или удалено, вместо этого перемещается в другой каталог. С датой в имени каждый запуск сохраняет предыдущие версии того, что он изменил:

bash
$ rclone sync /srv/data renode:my-bucket/current \    --backup-dir renode:my-bucket/archive/$(date +%F) \    --max-delete 100 --log-file /var/log/rclone-data.log --log-level INFO

Каталог для бэкапа должен быть на том же remote, что и назначение, и не должен с ним пересекаться. В S3 «перемещение» файла в него - это копирование на стороне сервера плюс удаление, так что ничего не скачивается. Старые папки архива вы чистите сами - через rclone purge renode:my-bucket/archive/2026-07-01, небольшим скриптом, удаляющим папки старше вашего срока хранения, или через rclone delete --min-age 90d renode:my-bucket/archive.

Как rclone решает, что передавать#

По умолчанию rclone сравнивает размер и время изменения. В S3 нет собственного времени изменения, кроме момента записи объекта, поэтому при загрузке rclone сохраняет время исходного файла в метаданных объекта (X-Amz-Meta-Mtime) и читает его обратно для сравнения. Чтение этих метаданных стоит одного запроса HEAD на объект, что медленно на больших деревьях.

Флаги, которые меняют сравнение:

ФлагСравниваетПримечания
(по умолчанию)Размер и время измененияОдин лишний запрос на объект в S3
--checksumРазмер и MD5MD5 берётся из листинга, поэтому в S3 это быстро
--size-onlyТолько размерБыстрее всего; пропускает изменения без смены размера
--updateПропускает файлы, которые новее в назначенииДля почти двусторонних сценариев
--use-server-modtimeВремя загрузки вместо сохранённого времени измененияВместе с --update избавляет от лишних запросов

Для загрузок в S3 --checksum обычно лучший выбор: он быстрый, потому что ETag в листинге для обычных загрузок содержит MD5, и точный. Для файлов, загруженных по частям, ETag не является MD5; rclone при их загрузке сохраняет настоящий MD5 в метаданных (X-Amz-Meta-Md5chksum), так что сравнивать всё равно может, - но у объектов, загруженных другими инструментами, его может не быть.

--fast-list получает листинг всего бакета за меньшее число запросов ценой памяти на хранение листинга. На бакетах до нескольких миллионов объектов это обычно быстрее; на машине с малым объёмом памяти и огромным бакетом не включайте его.

rclone check src dst сравнивает без передачи, а --one-way проверяет только то, что всё из источника есть в назначении. Запустите его после первой большой загрузки и затем периодически.

Фильтры#

Правила фильтров rclone решают, какие файлы включаются:

bash
# Only .tar.gz and .sql.gz files$ rclone copy /srv/backups renode:my-bucket/backups \    --include "*.tar.gz" --include "*.sql.gz"# Everything except caches and logs, using one ordered filter list$ rclone sync /srv/site renode:my-bucket/site --filter-from filters.txt
filters.txt
- cache/**- *.log- node_modules/**+ **

Не смешивайте --include и --exclude в одной командной строке; документация rclone предупреждает, что результат трудно предсказать. Используйте --filter или --filter-from, где каждая строка начинается с + или - и побеждает первое подходящее правило. --max-age 7d ограничивает запуск недавно изменёнными файлами, а --min-size и --max-size фильтруют по размеру. Проверяйте любой фильтр через rclone ls --filter-from filters.txt /srv/site, прежде чем доверять его sync.

Скорость и ограничение полосы#

rclone передаёт 4 файла одновременно (--transfers 4) с 8 проверяющими потоками, параллельно сравнивающими файлы (--checkers 8). Файлы больше порога загрузки - по умолчанию 200 MiB (--s3-upload-cutoff) - загружаются multipart-частями по 5 MiB (--s3-chunk-size), по четыре части одновременно на файл (--s3-upload-concurrency).

СитуацияЧто изменить
Много мелких файловБольше --transfers (8-16) и --checkers (16)
Несколько огромных файлов на быстром канале--s3-chunk-size 64M, --s3-upload-concurrency 8
Мало памяти на отправляющей машинеЧасти поменьше и меньше одновременных передач
Общий или тарифицируемый исходящий канал--bwlimit

Память для multipart-загрузок - примерно размер части, умноженный на параллельность загрузки и на число передач: 64 MiB x 8 x 4 - это 2 GiB, слишком много для небольшого сервера. Подбирайте эти значения под машину.

--bwlimit задаётся в байтах в секунду, а не в битах: --bwlimit 10M - это 10 MiB/s, около 84 Мбит/с. Он принимает расписание, так что бэкап может ползти днём и идти на полной скорости ночью:

bash
$ rclone sync /srv/data renode:my-bucket/current \    --bwlimit "08:00,2M 19:00,8M 23:00,off"

Раздельные лимиты на загрузку и скачивание записываются как --bwlimit 4M:off (загрузка 4 MiB/s, скачивание без ограничений). Для игрового или веб-сервера, который делит исходящий канал с задачей бэкапа, дневной лимит - это разница между бэкапом, которого никто не замечает, и бэкапом, вызывающим лаги.

Монтирование бакета как диска#

rclone mount представляет remote как файловую систему. В Linux ему нужен FUSE (fuse3); в Windows - WinFsp, и монтирование идёт на букву диска; в macOS - macFUSE или FUSE-T.

bash
# Linux$ mkdir -p /mnt/bucket$ rclone mount renode:my-bucket /mnt/bucket --vfs-cache-mode writes --daemon$ fusermount -u /mnt/bucket        # unmount# Windowsrclone mount renode:my-bucket X: --vfs-cache-mode writes

Настройка --vfs-cache-mode определяет, насколько точно монтирование ведёт себя как диск:

  • off - чтение и запись идут потоком напрямую; многие приложения падают, потому что не могут перемещаться по файлу во время записи.
  • writes - файлы, открытые на запись, буферизуются на локальном диске и загружаются при закрытии. Разумное умолчание.
  • full - кэшируется и чтение, так что приложения могут перемещаться по большим файлам. Использует локальный диск до --vfs-cache-max-size.

Монтирование удобно для просмотра, перетаскивания файлов туда и обратно и для инструментов, которые понимают только пути. Но это не диск: каждое сохранение - полная загрузка, переименование папки - копирование каждого файла в ней, а две машины, смонтировавшие один бакет, видят изменения друг друга с опозданием или не видят вовсе. Не держите на нём базу данных, игровой мир или рабочий каталог приложения. Везде, где можно, используйте в скриптах rclone copy вместо монтирования.

Шифрование через crypt#

Remote типа crypt оборачивает другой remote и шифрует содержимое файлов - и, по желанию, имена - до того, как они покинут вашу машину. Провайдер хранилища видит только объекты, похожие на случайный набор байт.

bash
$ rclone config create renode-crypt crypt \    remote=renode:my-bucket/encrypted \    filename_encryption=standard \    directory_name_encryption=true \    password='a-long-passphrase-you-keep-somewhere-safe' \    --obscure

--obscure сообщает rclone, что пароль передан открытым текстом и его нужно обфусцировать перед записью в конфигурационный файл. Без этого флага rclone угадывает, и его документация предупреждает, что длинную парольную фразу только из символов base64 можно принять за уже обфусцированную.

Дальше пользуйтесь renode-crypt: как любым другим remote: rclone copy /srv/backups renode-crypt:backups. Файлы появятся в бакете под encrypted/ с перемешанными именами.

Зашифрованные имена файлов длиннее исходных, и очень длинные имена или глубокие пути могут превысить лимит длины ключа. filename_encryption = obfuscate даёт более короткие имена с более слабой защитой; off оставляет имена читаемыми и шифрует только содержимое. С crypt --checksum больше не работает через эту границу, потому что хранимые данные отличаются от исходных; rclone возвращается к размеру и времени изменения. rclone cryptcheck сверяет зашифрованный remote с источником.

Если вам нужны зашифрованные дедуплицированные бэкапы с историей, а не зашифрованная копия, инструмент бэкапа подойдёт лучше, чем crypt, - см. бэкапы restic в S3.

Запуск по расписанию#

Задача rclone по расписанию должна быть скучной и громкой: скучной, когда работает, и громкой, когда нет. Небольшой скрипт-обёртка обеспечивает и то и другое.

/usr/local/bin/offsite-sync.sh
#!/bin/shset -euLOG=/var/log/rclone-offsite.log/usr/bin/rclone sync /srv/backups renode:my-bucket/current \    --backup-dir "renode:my-bucket/archive/$(date +%F)" \    --checksum --max-delete 100 \    --bwlimit "08:00,2M 23:00,off" \    --log-file "$LOG" --log-level INFO \  || { echo "offsite sync failed, see $LOG" | mail -s "rclone failed" you@example.com; exit 1; }
crontab
30 4 * * * /usr/local/bin/offsite-sync.sh

rclone завершается со статусом 0, только когда передано всё. Статус 1 - синтаксическая ошибка или ошибка использования, 3 - не найден каталог, 4 - не найден файл, а более высокие значения означают исчерпание повторов и фатальные ошибки, так что ненулевой код выхода всегда заслуживает внимания. rclone и так повторяет упавшие операции (--retries 3 по умолчанию) и низкоуровневые запросы (--low-level-retries 10), так что сбой, переживший всё это, - настоящий.

Ставьте загрузку по расписанию после того, что создаёт файлы, - бэкапа панели, дампа базы данных, скрипта архивации, - с запасом времени, чтобы файлы успели стать полными. Загрузка дампа, который ещё записывается, даёт обрезанную копию, которую --checksum преспокойно будет считать актуальной до следующего запуска. Раз в неделю читайте журнал и смотрите на размер последней папки архива: внезапный скачок значит, что изменилось многое, а пустая папка может означать, что источник перестал что-либо создавать.

FAQ#

rclone или AWS CLI?

Чтобы просто перемещать файлы в S3 и обратно, подходят оба. У rclone лучше фильтры, есть расписание полосы, --backup-dir, монтирование, шифрование и поддержка десятков других систем хранения, так что один инструмент может копировать между S3 и чем угодно ещё. AWS CLI - эталонная реализация и лучший инструмент для низкоуровневых операций S3; о нём - статья AWS CLI с хранилищем S3.

Почему rclone пытается создать мой бакет?

По умолчанию перед загрузкой он проверяет, существует ли бакет назначения, и создаёт его, если нет. Если вашим ключам запрещено создавать бакеты, это падает. no_check_bucket = true в remote или --s3-no-check-bucket в командной строке пропускает проверку.

Может ли rclone копировать напрямую между двумя провайдерами S3?

Да: rclone copy renode:my-bucket other:their-bucket. Внутри одного remote rclone использует копирование на стороне сервера; между разными провайдерами он пропускает данные потоком через машину, на которой запущен, так что запускайте его там, где хорошее соединение с обоими.

rclone sync - это бэкап?

Сам по себе нет: он зеркалирует удаления и повреждения. С --backup-dir и папкой с датой он сохраняет предыдущие версии изменённых и удалённых файлов, и это разумный простой бэкап. Для снимков с дедупликацией и политиками хранения используйте restic.

Как запускать rclone по расписанию?

Из cron или таймера systemd, с --log-file и --log-level INFO, и с оповещением при ненулевом коде выхода. Не убирайте --max-delete из sync по расписанию. Как упорядочить задачу бэкапа относительно того, от чего она зависит, разобрано в статье задачи по расписанию, которые стоит завести.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000