Что такое rclone и в чём он хорош
rclone — бесплатная программа командной строки с открытым исходным кодом для копирования, синхронизации и перемещения файлов между вашим диском и облачным хранилищем или между двумя облаками. Его часто называют «rsync для облачных хранилищ»: один бинарник, написанный на Go, который умеет говорить с более чем 70 бэкендами хранения, включая Amazon S3 и любой S3-совместимый сервис, Google Drive, OneDrive, Dropbox, Azure Blob, Backblaze B2, SFTP и WebDAV.
Идея, которая делает его полезным, — это remote. Вы описываете каждый аккаунт хранилища один раз, даёте ему короткое имя вроде s3old или gdrive, и с этого момента любая команда работает с любым из них одинаково: rclone copy ./backups s3old:my-bucket/backups читается точно так же, как rclone copy gdrive:Photos ./photos. Путь — это remote:path, а для объектного хранилища первая часть пути — это бакет.
На практике rclone используют для четырёх задач: ночные резервные копии в объектное хранилище, разовые миграции с одного провайдера на другой, выгрузка файлов из Google Drive или других потребительских облаков и монтирование бакета как будто это локальная папка. Он сравнивает файлы перед передачей, так что второй запуск отправляет только то, что изменилось, повторяет неудавшиеся операции и может зашифровать всё на клиенте до того, как данные покинут машину.
Что это не такое: не двусторонний клиент синхронизации вроде приложения Dropbox (новая команда bisync существует, но это осознанный инструмент, а не фоновый сервис), и не программа резервного копирования с дедуплицированными снимками. Для версионированных, дедуплицированных бэкапов такие инструменты, как restic, используют rclone как транспорт под капотом.
Установка rclone на Linux, macOS и Windows
rclone — единственный исполняемый файл без зависимостей, так что установка — это в основном вопрос, откуда взять бинарник. Пакеты дистрибутива (apt install rclone) часто отстают на несколько релизов; для всего, что обращается к актуальным облачным API, предпочитайте официальную сборку.
Linux и macOS: скрипт установки проекта скачивает последний релиз для вашей платформы и помещает его в /usr/bin (или /usr/local/bin на macOS). На macOS подойдёт и Homebrew, но сборка из Homebrew не умеет запускать rclone mount; если нужно монтирование, используйте официальный бинарник вместе с macFUSE.
Windows: winget install Rclone.Rclone — самый быстрый способ; Scoop и Chocolatey тоже его несут. Без менеджера пакетов скачайте zip с rclone.org/downloads, распакуйте rclone.exe в папку вроде C:\rclone и добавьте эту папку в PATH. Запускайте из PowerShell или cmd; у него нет ни своего установщика, ни своего GUI. Для rclone mount в Windows понадобится ещё WinFsp.
Проверьте результат командой rclone version. Бинарник, установленный из официальной сборки, может обновить себя позже командой rclone selfupdate; установленный из пакета — обновляйте через его менеджер пакетов.
# Linux / macOS: official install script
sudo -v ; curl https://rclone.org/install.sh | sudo bash
# macOS with Homebrew (no rclone mount support)
brew install rclone
# Windows (PowerShell)
winget install Rclone.Rclone
# everywhere
rclone version
rclone config и концепция remote
rclone config запускает интерактивный мастер: n для нового remote, имя, тип хранилища, затем вопросы, нужные этому типу (ключи, endpoint, регион или вход через браузер для Google Drive и других сервисов с OAuth). Ответы записываются в обычный INI-файл, rclone.conf. rclone config file печатает, где он находится: обычно ~/.config/rclone/rclone.conf на Linux и macOS и %APPDATA%\rclone\rclone.conf на Windows.
Поскольку это обычный текстовый файл, remote можно и написать вручную, скопировать файл на сервер или держать в своих инструментах для секретов. Относитесь к нему как к секрету: он хранит ключи доступа и токены OAuth. Секреты, которые записывает сам rclone, только скрыты от взгляда, а не зашифрованы; rclone config предлагает пароль на конфигурацию, если файлу приходится лежать на общей машине.
Каждый [section] — это один remote. Затем вы обращаетесь к нему как name:, а дальше путь. С объектным хранилищем name: само по себе означает аккаунт, name:bucket — бакет, а name:bucket/prefix — «папку» внутри него. rclone lsd name: — самый быстрый тест, что ключи и endpoint работают.
Файл — не единственный способ. Любую опцию можно задать через переменную окружения с именем RCLONE_CONFIG_<REMOTE>_<OPTION>, что подходит контейнерам и CI, где секреты лучше впрыскивать, а не поставлять в составе файла конфигурации.
Два remote в rclone.conf: AWS S3 и Google Drive
[s3old]
type = s3
provider = AWS
access_key_id = AKIA...
secret_access_key = ...
region = eu-central-1
[gdrive]
type = drive
scope = drive.readonly
token = {"access_token":"...","expiry":"..."}
# the same S3 remote from environment variables instead
# RCLONE_CONFIG_S3OLD_TYPE=s3
# RCLONE_CONFIG_S3OLD_PROVIDER=AWS
# RCLONE_CONFIG_S3OLD_ACCESS_KEY_ID=AKIA...
Основные команды, и copy против sync
rclone copy копирует файлы из источника в приёмник и пропускает те, что там уже идентичны. Он никогда ничего не удаляет в приёмнике, что делает его безопасным выбором по умолчанию.
rclone sync делает приёмник идентичным источнику, и это включает удаление файлов приёмника, которых нет в источнике. Направьте его на неправильную папку или поменяйте местами источник и приёмник — и он удалит данные, а у объектного хранилища нет корзины, если не включено версионирование. Всегда запускайте новую команду sync сначала с --dry-run, посмотрите, что он собирается удалить, и только потом запускайте по-настоящему. --max-delete 100 — полезный предохранитель для плановых задач: запуск остановится, а не удалит больше, чем столько.
rclone move копирует, а затем удаляет каждый файл из источника после того, как он доставлен; добавьте --delete-empty-src-dirs, чтобы убрать и папки. rclone check сравнивает источник и приёмник и сообщает о различиях, ничего не меняя (подробнее об этом ниже).
Для осмотра: rclone lsd remote: выводит список бакетов или каталогов, rclone ls remote:bucket выводит каждый объект с его размером, rclone lsf даёт список, удобный для скриптов, а rclone size remote:bucket печатает количество объектов и суммарный объём в байтах — это первое число, которое стоит сравнить после миграции. rclone tree и rclone ncdu помогают увидеть, куда уходит место.
Одна особенность сбивает почти всех: как и rsync с завершающим слешем, rclone копирует содержимое исходной директории, а не саму директорию. rclone copy ./photos remote:bucket помещает файлы в корень бакета; напишите remote:bucket/photos, если нужна папка. Чтобы скопировать или переименовать один файл, используйте copyto или moveto.
rclone lsd s3old: # buckets this key can see
rclone ls s3old:media/2026/ # objects and sizes
rclone size s3old:media # count + total bytes
rclone copy ./site s3old:media/site -P # upload, never deletes
rclone sync ./site s3old:media/site --dry-run # preview first
rclone sync ./site s3old:media/site -P # then for real
rclone move ./outbox s3old:media/inbox --delete-empty-src-dirs
rclone copyto ./logo.png s3old:media/img/logo-v2.png
Важные флаги: тестовый прогон, скорость и ширина канала
--dry-run (-n) показывает, что было бы скопировано или удалено, ничего не трогая. --interactive (-i) спрашивает перед каждым разрушительным действием, что удобно для разовой уборки.
--progress (-P) показывает текущую пропускную способность, счётчики и ETA. Для задач, которые работают без присмотра, используйте вместо этого --log-file rclone.log --log-level INFO, чтобы потом можно было прочитать, что произошло.
--transfers (по умолчанию 4) — сколько файлов передаётся параллельно, а --checkers (по умолчанию 8) — сколько сравнений выполняется параллельно. Объектное хранилище медленное на отдельный запрос и быстрое в сумме, так что множество мелких файлов выигрывают от --transfers 16–32 и --checkers 32 и больше. Поднимайте их постепенно: провайдеры ограничивают частоту запросов, и слишком много параллельных запросов превращаются в повторы.
--bwlimit ограничивает ширину канала, например --bwlimit 20M (байт в секунду, то есть 20 МиБ/с), или по расписанию, например --bwlimit "08:00,10M 19:00,off", которое урезает скорость в рабочие часы и работает без ограничений ночью.
--s3-chunk-size (по умолчанию 5 МиБ) задаёт размер части для многочастной (multipart) загрузки, а --s3-upload-concurrency (по умолчанию 4) — сколько частей одного файла загружается одновременно. Для больших файлов на быстром канале --s3-chunk-size 64M заметно снижает число запросов. Расход памяти растёт как transfers × upload-concurrency × chunk-size, так что часть в 64 МиБ при 16 передачах может занять несколько гигабайт ОЗУ. S3 допускает не более 10 000 частей на объект; rclone сам увеличивает размер части, когда знает размер файла, но не для потоковых загрузок (rcat).
Для бакетов с миллионами объектов --fast-list выводит список всего бакета за меньшее число запросов ценой памяти, а --checksum или --size-only избавляют rclone от чтения времени модификации каждого объекта, что в S3 стоит лишнего запроса на объект.
rclone copy /srv/backups s3old:backups/db \
--transfers 16 --checkers 32 \
--s3-chunk-size 64M --s3-upload-concurrency 4 \
--bwlimit "08:00,20M 20:00,off" \
--log-file /var/log/rclone-backup.log --log-level INFO
Настройка S3-совместимого remote на примере CDN.com.tr
Любой сервис, реализующий API S3, использует в rclone тип s3. Поля, которые меняются от провайдера к провайдеру, — это provider, endpoint и иногда region. Используйте именованного провайдера, если у rclone он есть (AWS, Cloudflare, Minio, Wasabi и другие); это включает особенности именно этого сервиса. Для сервиса, которого в списке rclone нет, используйте provider = Other.
Объектное хранилище CDN.com.tr S3-совместимо, и rclone — один из клиентов, который работает с ним как есть. Endpoint — https://s3.cdn.com.tr; инструменты, которые спрашивают регион, можно оставить по умолчанию, а сервис ожидает адресацию в стиле path-style, которая у rclone и так используется по умолчанию для provider = Other. Бакеты и ключи доступа создаются в панели (вкладка Access Keys) или через cdnctl. Секретный ключ показывается только один раз, при создании, так что скопируйте его прямо в конфигурацию rclone или в менеджер секретов.
Лучше ограничивать ключи одним бакетом. Такому ключу не разрешено создавать бакеты, поэтому скажите rclone не пытаться: no_check_bucket = true пропускает проверку на создание бакета, которую rclone иначе делает перед загрузкой. По той же причине тестируйте ключ, ограниченный бакетом, командой rclone lsd cdntr:my-bucket, а не выводом списка по всему аккаунту.
cdnctl здесь отвечает за управляющий слой: бакеты, ключи и привязки к контейнерным приложениям. Чтение и запись самих объектов — задача S3-клиента, такого как rclone. (Отдельная команда cdnctl cp загружает в файловое хранилище CDN, которое является другим продуктом; см. файловое хранилище CDN.)
rclone.conf: remote объектного хранилища CDN.com.tr
[cdntr]
type = s3
provider = Other
access_key_id = <access key from the panel>
secret_access_key = <secret, shown once at creation>
endpoint = https://s3.cdn.com.tr
no_check_bucket = true
# test it
# rclone lsd cdntr:my-bucket
# rclone copy ./smoke.txt cdntr:my-bucket/ -v
Миграция между провайдерами: R2, B2 или AWS S3 в другое S3
Миграция между двумя сервисами S3 — это два remote и одна команда. rclone выводит список на обеих сторонах, сравнивает их и копирует то, чего не хватает, так что одну и ту же команду можно запускать повторно: первый запуск переносит основной объём, последующие — только изменения, а финальный запуск во время переключения получается коротким.
Данные идут через машину, на которой запущен rclone: он скачивает из источника и загружает в приёмник. Запускайте его на сервере с хорошей полосой до обеих сторон, а не на ноутбуке, и сначала проверьте цены на исходящий трафик у исходного провайдера. AWS берёт плату за исходящий трафик, Backblaze B2 включает бесплатный исходящий трафик до некоторого кратного от объёма хранимых данных, а Cloudflare R2 не берёт за исходящий трафик вообще. Копирование на стороне сервера происходит только внутри одного провайдера.
Настройки, которые делают большие миграции быстрее и дешевле: --fast-list для сокращения запросов листинга, --checksum, чтобы rclone сравнивал размеры и хеши, а не запрашивал время модификации каждого объекта по отдельности, и более высокие --transfers и --checkers, если источник это позволяет. Начинайте с copy, а не sync, чтобы ошибка не могла ничего удалить; переключайтесь на sync (сначала с --dry-run) только для финального прохода, если за это время объекты были удалены в источнике.
Для Backblaze B2 можно использовать как встроенный тип b2 в rclone, так и S3-endpoint B2 — оба варианта работают. Ключи R2 создаются в панели Cloudflare, и его endpoint содержит ID вашего аккаунта. Наши сравнительные страницы подробно разбирают такие переезды: альтернатива Cloudflare R2, альтернатива Backblaze B2 и альтернатива IDrive e2. На стороне приложения меняются только endpoint и ключи.
# rclone.conf (source)
[r2]
type = s3
provider = Cloudflare
access_key_id = ...
secret_access_key = ...
endpoint = https://<ACCOUNT_ID>.r2.cloudflarestorage.com
region = auto
# 1. preview, 2. bulk copy, 3. repeat until the delta is small
rclone copy r2:media cdntr:media --dry-run
rclone copy r2:media cdntr:media \
--fast-list --checksum --transfers 32 --checkers 64 -P
# cutover: stop writes, final pass, then compare
rclone sync r2:media cdntr:media --fast-list --checksum -P
rclone check r2:media cdntr:media --one-way
Проверка миграции командой rclone check
rclone check source: dest: сравнивает обе стороны объект за объектом и печатает сводку: сколько файлов совпадает, сколько различается и какие существуют только на одной стороне. Он ничего не меняет. --one-way ищет только файлы источника, которых не хватает или которые отличаются в приёмнике, — это то, что нужно, когда в приёмнике уже есть лишние данные.
Сравнение использует размеры и, если обе стороны поддерживают один тип хеша, хеши. В S3 это MD5, и вот в чём подвох: у объекта, загруженного несколькими частями, ETag — это не его MD5. rclone сохраняет настоящий MD5 в метаданных объекта, когда сам загружает файлы многочастно, но у объектов, записанных другими инструментами, его часто нет, так что для них check может сравнить только размеры и сообщает об этом в выводе («hashes could not be checked»). Когда нужна побайтовая уверенность, --download читает обе копии и сравнивает содержимое — ценой повторной передачи всего объёма.
Для отчётов, которые нужно сохранить, записывайте списки в файлы флагами --combined, --missing-on-dst и --differ. Сравните rclone size на обеих сторонах как финальную проверку здравого смысла, а для зашифрованного remote используйте rclone cryptcheck, который проверяет зашифрованную копию против открытого источника.
rclone size r2:media && rclone size cdntr:media
rclone check r2:media cdntr:media --one-way \
--combined check-report.txt \
--missing-on-dst missing.txt --differ differ.txt
# slow but exact: download and compare the bytes
rclone check r2:media cdntr:media --download
Google Drive, шифрование и монтирование, вкратце
Google Drive. Выберите drive в rclone config, укажите scope (drive.readonly хватит для скачивания) и подтвердите доступ в браузере. На сервере без браузера ответьте n на автонастройку и выполните rclone authorize "drive" на машине, где браузер есть, а затем вставьте токен обратно. Встроенный client ID rclone общий для всех пользователей и ограничивается по частоте запросов; для интенсивного использования создайте собственный OAuth-клиент в Google Cloud и укажите его при настройке. Файлы Google Docs не настоящие файлы, так что rclone экспортирует их (в docx, xlsx и так далее) при скачивании. Google также ограничивает загрузку примерно 750 ГБ на пользователя в день, так что большая миграция *в* Drive займёт несколько дней.
Шифрование. Remote типа crypt оборачивает другой remote и шифрует содержимое файлов, а по желанию и имена, перед загрузкой. Вы создаёте его поверх, скажем, cdntr:backups, а затем пишете через crypt-remote; провайдер видит только шифротекст. Пароль и соль хранятся в вашем rclone.conf: потеряете их — данные не восстановить, так что храните резервную копию этого отдельно от данных.
Монтирование. rclone mount remote:bucket /mnt/bucket делает так, что бакет выглядит как папка (в Windows монтируйте на букву диска, например X:, с установленным WinFsp). Добавьте --vfs-cache-mode writes или full, чтобы приложения, переписывающие файлы, работали правильно. Монтирование хорошо подходит для просмотра, медиатек и случайных чтений; это не диск, так что не держите на нём базы данных или что-то, что требует блокировок файлов.
Скачивание из Drive; добавление зашифрованного remote поверх бакета
rclone copy gdrive:Projects ./projects -P
# rclone.conf: encrypted backups inside an existing bucket remote
[secure]
type = crypt
remote = cdntr:backups/encrypted
filename_encryption = standard
password = <obscured by rclone config>
password2 = <obscured by rclone config>
rclone copy /srv/backups secure: -P
Расписание для rclone: cron, systemd и планировщик задач
У rclone нет собственного планировщика — он создан, чтобы его запускал кто-то другой. На Linux для большинства задач достаточно записи в cron. Оберните команду в flock, чтобы медленный запуск не перекрылся следующим, пишите лог в файл и указывайте --config явным путём, потому что cron работает с другим HOME и иначе не найдёт ваши remote.
Для sync, который удаляет, добавьте предохранители: --max-delete, чтобы остановить запуск, который удалит заметно больше обычного, и --backup-dir, чтобы перемещать перезаписанные и удалённые файлы в датированную папку, а не терять их. Код возврата rclone — 0 при успехе и не ноль при ошибке, так что скрипт-обёртка или unit systemd может поднять тревогу; задача, которая молча сыпется месяц, — обычный способ, которым ломаются резервные копии.
На машинах с systemd сервис плюс таймер дают логирование в журнал и Persistent=true, который запускает пропущенную задачу после перезагрузки. В Windows создайте задачу в планировщике, которая запускает rclone.exe с полным путём к конфигурации и файлом лога, под учётной записью, у которой есть доступ и к файлам, и к конфигурации.
# crontab -e (02:30 every night)
30 2 * * * flock -n /tmp/rclone-backup.lock \
rclone sync /srv/backups cdntr:backups/nightly \
--config /home/backup/.config/rclone/rclone.conf \
--max-delete 200 \
--backup-dir cdntr:backups/deleted/$(date +\%F) \
--log-file /var/log/rclone-backup.log --log-level INFO
Частые вопросы об rclone
В чём разница между rclone copy и rclone sync?
copy добавляет и обновляет файлы в приёмнике и никогда ничего не удаляет. sync делает приёмник идентичным источнику, так что он также удаляет файлы приёмника, которых нет в источнике. Используйте copy, если вам не нужно зеркалировать удаления, и всегда сначала пробуйте новый sync с --dry-run.
rclone бесплатный и безопасный?
Да. rclone — открытый код под лицензией MIT, платной версии нет. Он общается напрямую с вашим провайдером хранения; ничто не проходит через сторонний сервис. Реальные риски — утечка rclone.conf, где хранятся ваши ключи, и sync, направленный не в ту сторону.
Есть ли у rclone GUI в Windows?
Сам rclone — программа командной строки; в Windows вы запускаете rclone.exe из PowerShell или cmd. У него есть экспериментальный веб-интерфейс (rclone rcd --rc-web-gui), и существует несколько сторонних оболочек, но команды в этом руководстве одинаковы везде.
Как скачать папку из Google Drive с помощью rclone?
Создайте remote типа drive командой rclone config, затем выполните rclone copy gdrive:FolderName ./local-folder -P. Файлы, доступные вам по общему доступу, находятся в --drive-shared-with-me, общие диски настраиваются как отдельные remote, а Google Docs экспортируются в формат Office при скачивании.
Почему rclone медленный с большим числом мелких файлов?
Каждый объект стоит минимум одного запроса, так что темп задаёт задержка, а не пропускная способность. Поднимите --transfers и --checkers, используйте --fast-list для больших бакетов и добавьте --checksum или --size-only на S3, чтобы rclone не запрашивал время модификации каждого объекта отдельно.
Какие настройки нужны rclone для объектного хранилища CDN.com.tr?
Remote типа s3 с provider = Other, endpoint = https://s3.cdn.com.tr и ключом доступа с секретом, созданными в панели. Регион можно оставить по умолчанию. При ключе, ограниченном одним бакетом, добавьте no_check_bucket = true.