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-совместимого сервиса. Прямой способ - одна команда:
$ 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:
[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. Локальный путь - просто путь.
$ 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 browserrclone 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 - это реплика, а не бэкап.
# 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 в нечто гораздо более близкое к бэкапу: всё, что было бы перезаписано или удалено, вместо этого перемещается в другой каталог. С датой в имени каждый запуск сохраняет предыдущие версии того, что он изменил:
$ 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 | Размер и MD5 | MD5 берётся из листинга, поэтому в 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 решают, какие файлы включаются:
# 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- 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 Мбит/с. Он принимает расписание, так что бэкап может ползти днём и идти на полной скорости ночью:
$ 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.
# 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 и шифрует содержимое файлов - и, по желанию, имена - до того, как они покинут вашу машину. Провайдер хранилища видит только объекты, похожие на случайный набор байт.
$ 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 по расписанию должна быть скучной и громкой: скучной, когда работает, и громкой, когда нет. Небольшой скрипт-обёртка обеспечивает и то и другое.
#!/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; }30 4 * * * /usr/local/bin/offsite-sync.shrclone завершается со статусом 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.