rclone: файлы между хранилищами — 9 практических опытов
Переносим файлы между хранилищами: девять настоящих опытов, copy и sync, фильтры, контроль хешей, crypt и восстановление. Мастерская команд и исходники для Windows/Linux.

rclone на практике: перенос файлов, SFTP и S3, copy и sync, проверка хешей, шифрование и восстановление. Конструктор команд, девять настоящих опытов и исходники для Windows, Linux и VPS.
Что такое rclone и какую задачу он решает
У проекта появляются файлы в нескольких местах: выгрузки на VPS, документы на рабочем компьютере, изображения в объектном хранилище, архивы у другого провайдера. Пока файлов немного, их переносят вручную. Затем нужно повторять операцию по расписанию, замечать ошибки, ограничивать скорость, проверять результат и сохранять заменённые версии. rclone даёт для этого один командный интерфейс с поддержкой разных хранилищ.
Вы описываете источник, назначение и правило работы. Утилита получает списки объектов, решает, что передавать, и выполняет перенос. Например, можно отправлять подготовленные отчёты с Linux-сервера по SFTP, копировать медиатеку из одного S3-совместимого хранилища в другое или забирать документы на Windows. Для запуска не нужен постоянно открытый браузер: процесс работает в терминале, планировщике или службе.
В статье используем rclone 1.76.0. Разберём девять воспроизводимых опытов, соберём команды в мини-мастерской и подготовим расписание для сервера. Исходники включают учебные файлы, проверку результатов, конфигурации и инструкции. Начать можно без облачного аккаунта: все опыты выполняются в отдельной папке проекта. Версия и официальные загрузки доступны на странице rclone Downloads.
Где применять: выгрузки, миграция, медиатека и обмен между серверами
Для сервисного бизнеса понятный сценарий — ежедневная передача выгрузок CRM во внешнее хранилище. Приложение сначала заканчивает экспорт, сохраняет готовый файл в выделенный каталог, а rclone переносит его по расписанию. Можно ограничить сетевой поток, чтобы крупная выгрузка не мешала сайту, и отдельно проверять, что ожидаемый файл появился на другой стороне. Важно контролировать свежесть экспорта: успешное копирование вчерашнего файла ещё не означает, что сегодняшняя выгрузка состоялась.
Другой пример — смена хостинга или объектного хранилища. Сначала переносится основной объём, затем повторным copy догружаются изменения. После остановки записи в старое место выполняется заключительный проход и сверка. Само приложение переключают только после проверки адресов, доступа и доступности объектов. Для большой медиатеки это удобнее одноразовой ручной загрузки через веб-интерфейс.
Третий случай — доставка готовых материалов: отчётов, видеороликов, экспортов каталога или статической сборки. Здесь заранее решают, может ли получатель хранить собственные файлы рядом. Если может, подходит copy. Если назначение должно точно отражать источник, рассматривают sync. Выбор команды связан с правилами работы людей и приложений, а не только со скоростью передачи.
rclone, restic, rsync и Flysystem: выбираем по задаче
rclone удобен как самостоятельный инструмент перемещения файлов между разными видами хранилищ. У него нет обязательного собственного формата архива: обычный copy сохраняет доступные файлы и объекты в назначении. Это полезно для обмена и миграции, когда результат должен читать другой сервис без специального восстановления. При этом зеркало способно повторить ошибочное удаление из источника, а копирование с перезаписью способно заменить полезный документ повреждённым.
Если основная цель — история резервных копий, снимки, дедупликация и восстановление состояния на дату, посмотрите практику restic. Эти инструменты могут дополнять друг друга, но простое зеркало не становится резервной системой только потому, что расположено на другом диске. Отдельно нужны сроки хранения, независимость доступа и проверенное восстановление.
Для обмена между Unix-серверами по SSH часто достаточно rsync; при работе с облачными API удобен набор backend rclone. А Flysystem решает задачу внутри PHP-приложения: единый программный интерфейс к файловым хранилищам. Его методы вызываются кодом приложения, тогда как rclone обычно запускается отдельным процессом с собственным журналом и расписанием.
Мини-мастерская: конструктор команд и девять реальных опытов
Начните с переключения copy на sync. В интерактивной таблице станет видно, что произойдёт с legacy.txt, который есть только в назначении. Затем оставьте только документы docs/**: план изменится, а исключённые объекты сохранятся. Выберите PowerShell или Bash, включите ограничение скорости, скопируйте команду либо скачайте её текстовым файлом. Команды рассчитаны на учебную папку, которую создаёт приложенный раннер.
Ниже выберите один из девяти опытов. Можно посмотреть источник, назначение до и после, архив старых версий, шифрованные имена и настоящий вывод CLI с кодами выхода. Это запись локального запуска rclone, а не удалённое управление облаком. Конструктор и сравнение списков работают прямо в браузере; новый процесс rclone при нажатии кнопок не запускается. Такая граница позволяет изучить поведение без доступа сайта к вашим данным.
Запись можно скачать в JSON, а весь опыт повторить на своём компьютере. В ней указаны платформа и версия, пути очищены от адреса рабочего компьютера. Для телефона удобнее открыть мастерскую отдельно: элементы управления располагаются друг под другом, команды прокручиваются внутри блока, а файлы представлены карточками.
Как устроен учебный проект и почему он не трогает ваши папки
В fixtures/source лежат семь искусственных файлов: два документа, два ресурса, текстовый журнал, временный кеш и заметка. Они не содержат настоящих клиентских данных. Раннер создаёт новую папку .runtime с именем запуска, а внутри — отдельные source и target каждого опыта. Так синхронизация, намеренная порча и восстановление выполняются на копиях собственного набора.
Имя запуска не является путём. Разрешены короткие имена из букв, цифр, дефиса и подчёркивания; существующая папка отклоняется. Раннер не предлагает выбрать произвольный домашний каталог, не очищает прежние результаты и не использует сохранённый облачный конфиг пользователя. Для повторения укажите новое имя. На странице конструктор использует practice, поэтому для точного повторения его команд удобно начинать с новой распаковки архива.
Каталог public содержит готовую статическую страницу. В tools находятся установщик и сценарий опытов, в deploy — шаблоны VPS и Планировщика задач, в evidence — публичная запись. Python нужен для лаборатории, но не для просмотра опубликованной мастерской. На сайт следует выгружать только public и архив исходников; временные конфиги и исполняемые файлы там не нужны.
Windows: установка, проверка версии и первый запуск
Установите Python 3.11 или новее, распакуйте проект и откройте PowerShell в его корневой папке. Установщик скачивает официальный архив rclone для Windows amd64, сверяет закреплённый SHA-256 и помещает бинарник в tools/bin. Системный PATH и установленная ранее версия не изменяются. Если ваша установка использует команду py, замените python на py -3.
python tools/install.py
.\tools\bin\rclone.exe version
python tools/run_lab.py --run practice
python -m unittest discover -s tests
python -m http.server 8163 --bind 127.0.0.1 --directory public
После запуска веб-сервера откройте http://127.0.0.1:8163. Его можно остановить сочетанием Ctrl+C. Девять опытов выполняются до запуска веб-сервера и сохраняют отчёт в .runtime/practice/evidence.json. Ненулевой код внутри специально проверяемого опыта допустим: например, обнаруженное повреждение должно завершить check ошибкой. Сам раннер считает успешным только ожидаемый результат вместе с проверкой состояния файлов.
Бинарник не включён в исходный ZIP. Версия, ссылки и оба контрольных значения перечислены в README. При обновлении нельзя просто убрать проверку хеша: получите новый официальный архив, закрепите его значение и повторите лабораторию. Для архитектур кроме amd64 установка описана на официальной странице установки.
Linux: локальная лаборатория и подготовка к серверу
На Linux используется тот же проект и тот же набор файлов. Достаточно Python 3.11+ и корневых сертификатов для HTTPS-загрузки. На Ubuntu или Debian необходимые пакеты устанавливаются через apt, а сама лаборатория выполняется обычным пользователем. Установщик поддерживает Linux amd64; для ARM нужно взять соответствующий официальный бинарник и проверить его отдельно.
sudo apt update
sudo apt install python3 ca-certificates
python3 tools/install.py
./tools/bin/rclone version
python3 tools/run_lab.py --run linux-practice
python3 -m unittest discover -s tests
python3 -m http.server 8163 --bind 127.0.0.1 --directory public
На удалённом VPS адрес 127.0.0.1 относится к серверу. Чтобы посмотреть мастерскую со своего компьютера, используйте SSH-туннель либо разместите public за уже настроенным HTTPS-сайтом. Открывать Python-сервер наружу ради постоянного размещения не требуется. Сама передача файлов rclone вообще не зависит от мастерской и может работать без веб-сервера.
Учебный запуск и производственный сервис лучше разделять. Лаборатория изучает поведение на искусственных данных, а серверная задача получает отдельного пользователя, явно заданный конфиг, ограниченные права и расписание. Это помогает понять, какой процесс отвечает за конкретный перенос и где искать его журнал после перезагрузки.
Источник, назначение и remote: как читать команду
Базовая форма выглядит как rclone copy источник назначение. Локальная папка передаётся обычным путём, а настроенное хранилище записывается через имя remote и двоеточие, например sftpbox:exports. Само имя sftpbox ничего не подключает: соответствующая запись должна существовать в выбранном конфигурационном файле. Чтобы не зависеть от домашнего каталога текущего пользователя, в службах лучше явно передавать –config.
rclone --config /etc/rclone/rclone.conf lsd sftpbox:
rclone --config /etc/rclone/rclone.conf copy /srv/exports sftpbox:exports --dry-run
copy переносит содержимое каталога источника в указанное назначение. Если нужны файлы внутри exports/current, этот путь задаётся явно. Нельзя угадывать структуру по похожести с другой утилитой: сначала посмотрите список и план. Для одного конкретного файла удобно использовать copyto с полным путём результата.
На Windows пути с пробелами заключаются в кавычки. В PowerShell и Bash синтаксис продолжения строк отличается, поэтому мастерская формирует одну строку команды. Это упрощает копирование. Если переносите команду в службу, не вставляйте в неё пароль: параметры запуска могут оказаться в истории, журнале или списке процессов.
Опыт 1. Инвентаризация: lsjson и size до переноса
До копирования полезно знать исходный объём и состав. Первая сцена получает рекурсивный список обычных файлов в JSON и суммарный размер. В нашем наборе это семь объектов. Такой отчёт можно использовать для предварительной оценки, внутренней панели статуса или проверки, что задача смотрит в нужную папку. Пустой список в неожиданном месте — повод остановиться до записи в назначение.
rclone lsjson ./source --recursive --files-only --hash
rclone size ./source --json
В записи мастерской доступны имена, размеры и SHA-256, которые дополнительно вычисляет раннер по локальным байтам. Набор хешей, возвращаемых удалённым backend, может отличаться. Не требуйте от любого облака точно те же поля, что у локального диска; сначала проверьте возможности выбранного хранилища.
Для автоматического процесса JSON удобнее текста, который оформлен для чтения человеком. Но список отражает момент обхода, а не гарантированный снимок активно меняющейся папки. Если приложение одновременно создаёт и переписывает файлы, подготовьте отдельный стабильный каталог экспорта.
Опыт 2. Copy: обновить нужное и сохранить лишнее
Во втором опыте в назначении уже есть старый отчёт и legacy.txt. Команда копирует семь файлов источника, обновляет отчёт и сохраняет legacy.txt. В результате получается восемь файлов. Это полезно, когда получатель хранит рядом свои заметки или результаты обработки и отправитель не должен их удалять.
rclone copy ./source ./target --checksum --log-level INFO
Флаг –checksum используется здесь, чтобы сравнение не опиралось на случайное совпадение времени изменения учебных файлов. На реальном backend наличие и цена вычисления контрольных сумм зависят от реализации. Даже без удаления лишних файлов copy может перезаписать изменённый файл с тем же именем, поэтому сохранение истории следует проектировать отдельно.
Повторный запуск удобен после прерванного переноса: уже совпадающие объекты не нужно намеренно загружать заново. Однако поведение конкретной большой недокачанной передачи зависит от backend. Не обещайте универсального продолжения с последнего байта. Полезные параметры и точный смысл операции перечислены в документации copy.
Опыт 3. Фильтры: передавать документы, исключать кеш
Третья сцена переносит только docs/**. Из семи исходных файлов в назначение попадают два документа, а ресурсы, кеш и журнал остаются за пределами операции. Фильтр описан отдельным файлом, который удобно хранить вместе с конфигурацией задания и проверять при изменениях. Для повторяющейся серверной задачи это понятнее длинного набора аргументов в расписании.
# documents.filter
+ /docs/**
- **
# Команда
rclone copy ./source ./target --filter-from documents.filter --dry-run
Правила идут в определённом порядке; завершающее исключение закрывает всё, что не вошло в разрешённый набор. В мастерской можно сравнить этот подход с исключением только cache/**. Маски следует проверять на списке файлов, включая вложенные каталоги и необычные имена. Слишком широкое исключение нередко создаёт аккуратный, но неполный результат.
При обычном sync исключённые файлы назначения не удаляются только из-за отсутствия в отфильтрованном источнике. Отдельный флаг –delete-excluded меняет это поведение; в наших командах его нет. Полезно различать «не участвует в операции» и «должен быть удалён». Подробные правила сопоставления находятся в разделе Filtering.
Опыт 4. Dry-run: увидеть намерение до изменения файлов
В четвёртом опыте sync запускается с –dry-run. Источник содержит новые файлы, в назначении лежат устаревший отчёт и лишний legacy.txt. Журнал показывает предполагаемые действия, но раннер проверяет, что два файла назначения остались побайтно такими же. Это полезная первая остановка перед включением расписания или изменением фильтра.
rclone sync ./source ./target --checksum --dry-run --log-level INFO
План помогает обнаружить перепутанные стороны, неожиданно пустой источник и слишком широкое удаление. Прочитайте хотя бы имена изменяемых и удаляемых объектов, а не только последнюю строку. Для большой задачи сохраняйте вывод рядом с номером изменения конфигурации, чтобы потом объяснить, какой результат ожидался.
Dry-run не резервирует состояние каталогов и не гарантирует успех будущей записи. Между планом и запуском данные или права могут измениться. Он также не подтверждает, что приложению подойдут новые URL объектов. Поэтому после выполнения нужны отдельная сверка файлов и проверка сервиса, который ими пользуется.
Опыт 5. Sync: одностороннее зеркало и удаление лишнего
Пятая сцена выполняет такой же sync уже на собственной учебной папке без dry-run. После завершения источник и назначение содержат одинаковые семь файлов с одинаковыми SHA-256. Legacy.txt исчезает. Этот результат подходит для выделенного зеркала, которым управляет одна задача и куда другие процессы не добавляют независимые данные.
rclone sync ./source ./target --checksum --log-level INFO
Синхронизация здесь односторонняя: источник определяет желаемое содержимое назначения. Изменения получателя не возвращаются назад. Если два человека редактируют разные стороны, нужен отдельный процесс разрешения конфликтов; замена copy на sync его не создаст. У rclone есть другие команды, но двустороннее согласование требует собственных правил и отдельной проверки.
Для миграции безопаснее сначала копировать в новый пустой префикс, проверить результат и только потом обсуждать очистку старых данных. Если источник случайно окажется пустым, зеркалирование способно удалить включённое содержимое назначения. Условия работы и взаимодействие с ошибками описаны в документации sync.
Опыт 6. Check и хеши: обнаружить повреждение, затем исправить
В шестом опыте раннер сначала получает правильную копию, затем намеренно меняет report.csv. Проверка check завершается кодом 1 и записывает строку со звёздочкой для отличающегося файла. После copy –checksum повторный check возвращает 0, а независимое сравнение SHA-256 подтверждает совпадение всего набора. Таким образом, ошибка здесь создана и проверена намеренно.
rclone check ./source ./target --combined comparison.txt
rclone hashsum SHA-256 ./source --include "docs/report.csv"
rclone copy ./source ./target --checksum
rclone check ./source ./target
В combined-отчёте знак равенства означает совпадение, звёздочка — различие, плюс и минус помогают найти отсутствующие объекты с разных сторон. Сам check не исправляет данные. Сначала разберите причину, затем отдельно выберите направление восстановления, иначе можно скопировать повреждённую сторону поверх правильной.
Если backend не предоставляет подходящих хешей, у check есть –download для сравнения загружаемых данных. Это увеличивает время и сетевой расход; на облаке может повлиять на счёт. Выбирайте такую проверку осознанно. Детали отчётов и способов сравнения приведены в официальном описании check.
Опыт 7. Backup-dir: сохранить заменённые файлы и вернуть старый отчёт
В седьмой сцене перед синхронизацией в назначении есть старая версия отчёта и legacy.txt. Оба файла, которые иначе были бы заменены или удалены, попадают в archive/run01. Затем copyto извлекает старый отчёт в отдельный каталог recovered. Раннер сравнивает его SHA-256 с первоначальной версией и подтверждает точное восстановление.
rclone sync ./source ./target --checksum --backup-dir ./archive/run01
rclone copyto ./archive/run01/docs/report.csv ./recovered/report-old.csv
Для повторяющихся заданий выделяйте новое имя архива на каждый запуск. Один постоянно используемый каталог old может сам перезаписать предыдущую сохранённую версию. На удалённом хранилище backup-dir должен соответствовать требованиям backend, находиться на том же remote и не пересекаться с рабочим назначением. В локальном опыте эти условия легко увидеть по соседним папкам.
Такой механизм полезен для возврата отдельных изменений, но он не создаёт автоматически каталог полных снимков, дедупликацию и правила хранения. Нельзя считать папку archive готовой резервной системой без проверок восстановления и независимой защиты. Возможности и ограничения параметра указаны в общей документации rclone.
Опыт 8. Crypt: шифрование поверх обычного хранилища
Crypt добавляет шифрующий слой над другим remote или локальной папкой. В восьмом опыте раннер создаёт случайный учебный пароль, пишет временный приватный конфиг и переносит файлы через remote vault. В шифрохранилище видны другие имена и зашифрованное содержимое. Затем файлы читаются обратно в отдельную папку, а cryptcheck и сравнение SHA-256 проверяют результат.
# После настройки remote vault через rclone config:
rclone copy ./source vault:
rclone copy vault: ./recovered
rclone cryptcheck ./source vault:
При каждом новом запуске учебный пароль другой, поэтому зашифрованные имена и хеши также отличаются. Сравнивать нужно восстановленный оригинал с исходником, а не ожидать одинаковых байтов шифротекста между двумя независимыми опытами. Конфиг этой сцены остаётся в .runtime и не публикуется вместе с записью.
Рабочий пароль и дополнительную соль необходимо хранить так, чтобы восстановление было возможно после потери основного сервера. Значение, полученное через rclone obscure, обратимо маскируется и не защищает прочитанный злоумышленником конфиг. Шифрование данных, права на конфигурацию и независимая копия ключевых сведений решают разные задачи. Подробности формата и настройки описаны в документации Crypt.
Опыт 9. Max-delete: ограничить удаление и увидеть частичное выполнение
Последняя сцена особенно полезна перед серверной автоматизацией. Мы разрешаем sync, но задаём –max-delete 0. В назначении есть лишний legacy.txt, поэтому попытка удаления приводит к ожидаемому коду 7. Файл сохраняется. Однако новые файлы к этому моменту уже успели скопироваться: после опыта назначение содержит восемь объектов.
rclone sync ./source ./target --checksum --max-delete 0 --log-level INFO
Это наглядно показывает, что лимит удаления не является транзакцией. Он ограничивает опасную часть работы, но не возвращает все ранее сделанные изменения. Проверяйте состояние после ошибки, а не предполагайте, что ненулевой exit code означает полный отказ от действий. В реальной системе важны план, сохранение заменённых данных и понятный порядок восстановления.
Размер допустимого удаления задаётся правилами конкретной задачи. Для каталога с ежедневной очисткой кеша и для хранилища договоров он будет разным. Сначала измерьте обычный объём изменений, затем установите предел и оповещение о его превышении. Не повышайте лимит автоматически только ради зелёного результата расписания.
SFTP на VPS: ключ, проверка сервера и выделенный каталог
SFTP подходит, когда у вас есть другой сервер или хранилище с SSH-доступом. Создайте отдельного пользователя назначения с правами только на нужный каталог. В конфиге rclone укажите адрес, имя пользователя, путь к приватному ключу и known_hosts_file. Проверка ключа сервера помогает заметить подмену или неожиданную смену удалённого узла.
[sftpbox]
type = sftp
host = storage.example.invalid
user = transfer-user
key_file = /home/rclone-copy/.ssh/id_ed25519
known_hosts_file = /home/rclone-copy/.ssh/known_hosts
Отпечаток сервера следует получить у администратора или через другой доверенный канал. Простое выполнение ssh-keyscan собирает предъявленный ключ, но само по себе не доказывает подлинность узла. При несовпадении known_hosts не отключайте проверку машинально: сначала выясните, была ли легальная смена ключа. Параметры подробно описаны в документации SFTP backend.
Вначале проверьте чтение списка, затем copy –dry-run в отдельный учебный каталог и только после этого фактическую передачу. На Linux конфигурация и приватный ключ должны читаться сервисным пользователем, но быть закрыты от остальных. На Windows настройте ACL под учётную запись задания. Права администратора для обычного переноса не требуются.
S3-совместимое хранилище: bucket, endpoint и учётные данные
В S3 назначение обычно задаётся как remote:bucket/prefix. Bucket — контейнер провайдера, а prefix помогает выделить область приложения или окружения. Перед миграцией уточните регион, endpoint, правила адресации, права на просмотр объектов и запись. У разных S3-совместимых сервисов настройки отличаются; конфиг AWS нельзя считать универсальным для любого поставщика.
[s3box]
type = s3
provider = AWS
env_auth = true
region = eu-central-1
# После настройки доступа:
# rclone copy ./exports s3box:my-bucket/exports --dry-run
В этом шаблоне env_auth включает получение учётных данных через поддерживаемую цепочку окружения или роли. Он не выдаёт права автоматически. На подходящем AWS-хосте удобна роль с минимально необходимыми разрешениями; для другого провайдера используйте рекомендованный способ выдачи ограниченного ключа. Не размещайте рабочие ключи в исходниках, статье или публичном ZIP.
Сначала используйте отдельный тестовый префикс. Проверьте запись, чтение и восстановление до массового переноса. Учитывайте стоимость запросов и исходящего трафика, особенности multipart и доступность хешей. Версионирование и object lock на стороне хранилища настраиваются отдельно от copy. Возможности конкретного backend собраны в официальном разделе S3.
Скорость, параллельность и повторные попытки
Для фонового задания важна предсказуемая нагрузка. Большой перенос не должен занимать весь канал VPS и ухудшать работу посетителей. Начните с небольшого числа параллельных передач, затем увеличивайте его по измерениям. У большого количества мелких объектов узким местом может стать число запросов, а не пропускная способность сети.
rclone copy ./exports sftpbox:exports --transfers 2 --bwlimit 10M --retries 3 --log-level INFO
В примере 10M означает ограничение в мебибайтах в секунду, а не в мегабитах. Перевод единиц важен при сравнении с тарифом канала. Повторные попытки помогают при кратковременных сбоях, но не исправляют неверный ключ, запрет доступа или переполненный диск. Постоянная ошибка должна попадать в наблюдение, а не бесконечно скрываться перезапусками.
Перед выбором параметров измерьте обычный объём, среднюю и худшую длительность задания. Оставьте время на повторную попытку и сверку. Если суточный объём уже не помещается в отведённое окно, измените организацию передачи или хранилище, а не только увеличивайте количество потоков.
Журналы и коды выхода: что считать успешной доставкой
Для ручного опыта достаточно INFO в терминале. В расписании нужен журнал, по которому можно восстановить время старта, направление, объём и причину сбоя. На Linux служба может писать в journald, а Windows-сценарий — в отдельный файл. Имена файлов иногда содержат персональные сведения, поэтому доступ и срок хранения журналов тоже требуют осмысленной настройки.
rclone copy ./exports sftpbox:exports --log-level INFO --log-file ./copy-job.log
Код завершения нужно передать планировщику. Если оболочка после ошибки печатает сообщение и заканчивается с нулём, система наблюдения увидит ложный успех. В приложенном PowerShell-шаблоне сохраняется LASTEXITCODE и затем возвращается через exit. Для systemd код основного процесса становится результатом oneshot-службы.
Самого exit code недостаточно для бизнес-проверки. Добавьте ожидание свежего экспорта, минимального набора файлов и успешного контрольного чтения. Пустой корректный источник может быть технически обработан без ошибки, хотя приложение не создало отчёт. Для важных данных периодически восстанавливайте файл и открывайте его штатным инструментом.
Linux VPS: отдельная служба systemd и ежедневный таймер
В deploy находятся шаблоны rclone-copy.service и rclone-copy.timer. Они рассчитаны на отдельного пользователя rclone-copy, готовый экспорт в /srv/exports и закрытый конфиг /etc/rclone/rclone.conf. До установки создайте пользователя, выдайте ему чтение источника и конфигурации, подготовьте ключ и проверьте удалённый каталог. Важно выполнить пробную команду именно от этой учётной записи: доступ вашего интерактивного пользователя ничего не говорит о доступе службы.
[Service]
Type=oneshot
User=rclone-copy
Group=rclone-copy
UMask=0077
ExecStart=/usr/local/bin/rclone --config /etc/rclone/rclone.conf copy /srv/exports sftpbox:exports --checksum --bwlimit 10M --transfers 2 --retries 3 --log-level INFO
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
Сначала адаптируйте шаблон и запустите вручную с dry-run. Затем установите unit-файлы, перезагрузите конфигурацию systemd, выполните один настоящий перенос и просмотрите журнал. Только после успешной проверки включайте таймер. В примере copy сохраняет лишнее назначение; удаление не включается автоматически.
sudo install -m 644 deploy/rclone-copy.service /etc/systemd/system/
sudo install -m 644 deploy/rclone-copy.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start rclone-copy.service
sudo journalctl -u rclone-copy.service -n 80 --no-pager
sudo systemctl enable --now rclone-copy.timer
systemctl list-timers rclone-copy.timer
Таймер запускается ночью, добавляет небольшую случайную задержку и учитывает пропущенное расписание через Persistent=true. Уже активный экземпляр этой службы повторно не стартует, но ручной запуск другой командой может создать параллельный процесс. Для нескольких источников запуска предусмотрите общий lock. Отключение таймера прекращает будущие срабатывания, но не является остановкой уже работающей службы.
Windows: Планировщик задач без открытого терминала
Для регулярной отправки с Windows используйте Планировщик задач и отдельный сценарий deploy/copy-job.ps1. В нём явно заданы путь к rclone.exe, приватный конфиг, источник, remote и журнал. Все значения нужно адаптировать. Сценарий сначала проверяет наличие локальных путей, затем запускает copy и возвращает код rclone планировщику.
# Программа в действии Планировщика:
powershell.exe
# Аргументы после адаптации сценария:
-NoProfile -File "C:\Jobs\copy-job.ps1"
Создайте задачу под нужной учётной записью, настройте расписание и укажите правило «Не запускать новый экземпляр», если предыдущий ещё работает. Проверьте доступ этой записи к источнику, ключу и папке журналов. Для сетевой папки права интерактивного пользователя и фоновой задачи могут различаться, поэтому нужна отдельная пробная загрузка из самого Планировщика.
Не отключайте политику выполнения сценариев автоматически. Используйте подпись или разрешённую в вашей среде настройку. После первого срабатывания проверьте историю, последний код результата и удалённые файлы. Если компьютер спит или выключен ночью, настройте поведение при пропуске времени и убедитесь, что повтор не пересекается с созданием нового экспорта.
Восстановление: сначала отдельный каталог, потом возврат в приложение
Практическая ценность копии появляется, когда из неё можно вернуть нужный документ. В седьмом опыте старый отчёт извлекается в recovered, а не поверх текущего рабочего файла. Такой же подход полезен на сервере: выберите версию, скопируйте её в отдельное место, проверьте размер, хеш и содержимое, затем согласуйте замену в приложении.
Для каталога документов дополнительно проверьте имена, структуру и права. Для выгрузки базы убедитесь, что файл читается инструментом восстановления и относится к нужной версии приложения. Если данные зашифрованы через crypt, заранее попробуйте восстановление на другом компьютере с сохранёнными ключевыми сведениями: это выявит зависимость от единственного сервера.
При случайном запуске не той команды сначала прекратите расписание и дальнейшие записи. Сохраните журнал и опишите, какие стороны участвовали в операции. Затем исследуйте backup-dir, версии объектов и независимые резервные копии. Повторный sync в панике способен распространить ошибку дальше. План возврата должен учитывать уже выполненные изменения, особенно после частичного сбоя.
Базы данных и активные файлы: почему обычного copy недостаточно
Копирование каталога работающей базы не гарантирует согласованную копию. Пока rclone читает один файл, процесс базы может изменить другой. В результате каждый отдельный объект передан без ошибки, но их совокупность не соответствует целостному состоянию. Для СУБД используйте штатный дамп, поддерживаемое физическое резервирование или корректно организованный snapshot.
В прикладном проекте удобно выделить этап подготовки: приложение завершает экспорт во временный файл, закрывает запись и только затем публикует его в каталоге готовых материалов. Задание rclone читает этот каталог. Так перенос не подхватывает половину ещё создаваемого CSV или архива. Согласуйте также срок хранения локальных экспортов, чтобы очистка не удаляла файл во время передачи.
Для связанного набора документов и записей базы требуется общее понимание момента восстановления. Отдельно свежая медиатека и отдельно старый дамп могут не соответствовать друг другу. rclone транспортирует байты; согласованность приложения задаётся процессом подготовки и проверяется восстановлением приложения целиком.
Частые ошибки: пустой источник, права, фильтр и неверное направление
Если команда неожиданно предлагает много удалений, остановитесь на dry-run и проверьте путь источника. На сервере мог не примонтироваться диск, а существующая пустая папка осталась. Другая распространённая причина — неверный уровень каталога: ожидали содержимое exports, но указали его родителя или соседний путь. Для критичного задания полезен отдельный контроль наличия ожидаемого файла-маркера.
Если файлы пропали из плана, проверьте фильтры и порядок правил. Исключённый документ не считается ошибкой передачи: вы сами убрали его из набора. Если соединение отклоняется, сначала проверьте учётную запись, конфиг и права на конкретный bucket или каталог. Успешный вход по SSH не обязательно разрешает запись туда, куда смотрит rclone.
Если после ошибки часть файлов уже обновлена, это ожидаемая возможность, продемонстрированная девятой сценой. Сверьте реальное состояние, выберите источник истины и только затем повторяйте операцию. При неверном направлении не рассчитывайте, что второй запуск обратной командой автоматически восстановит прошлое. Для этого нужны сохранённые версии и понятный журнал изменений.
Как использовать исходники в своём проекте
Скачайте ZIP, выполните лабораторию и сохраните её итоговый JSON рядом с результатом проверки. Для изменения учебного набора начните с fixtures/source, затем обновите ожидаемые проверки раннера. Например, можно добавить большой файл, Unicode-имя или вложенный путь и посмотреть, как меняются список, фильтры и отчёт. Пользовательские документы для этого не требуются.
Конструктор команд находится в public/model.js, а интерфейс — в public/app.js. Набор действий и параметров ограничен известными значениями. Это полезно для предсказуемой мастерской: браузер не собирает произвольную строку shell из введённого посетителем текста. Если когда-нибудь понадобится серверная панель запусков, ей потребуются отдельные права, очередь заданий, проверка путей и аудит; статическую страницу нельзя просто превратить в публичный запуск команд.
# Дополнительные проверки модели конструктора, Node.js 24+:
node tests/model.test.mjs
# Новый реальный прогон без изменения опубликованной записи:
python3 tools/run_lab.py --run another-check
В README перечислены версии, контрольные суммы, Windows/Linux-команды и границы проверки. Локальные опыты проверяют поведение rclone на собственных файлах. Они не подтверждают права вашего облачного аккаунта, стоимость трафика, производительность канала и возможность восстановить вашу конкретную базу. Эти свойства проверяются уже в выбранной инфраструктуре.
Рабочий порядок внедрения и полезные источники
Начните с одного понятного потока: подготовленные файлы из выделенного источника в новый префикс назначения. Проверьте список, выберите copy или sync по правилам хранения, настройте фильтры и прочитайте dry-run. Выполните перенос, сравните результат и восстановите один файл отдельно. После этого добавляйте расписание, журнал, контроль свежести и уведомление об ошибке.
Когда процесс заработает, закрепите версию rclone и конфигурацию без секретов в документации проекта. Опишите, кто имеет право менять фильтр, где лежат ключи, сколько хранится история и кто отвечает за восстановление. Обновление утилиты проверяйте на лаборатории и отдельном префиксе до замены производственного задания. Такой порядок даёт понятную эксплуатацию, а не единственную команду, смысл которой через месяц никто не помнит.


