Когда к сайту прикручены отдача статики через CDN и долговременное хранение логов, Object Storage (S3‑совместимый) становится базовым кирпичом инфраструктуры. Инструмент rclone хорош тем, что одинаково уверенно работает с локальной файловой системой и множеством облачных бэкендов, поддерживает проверку целостности, продвинутые фильтры и аккуратную автоматизацию через systemd. Ниже — практическая схема: как на VDS организовать синхронизацию статики и логов в хранилище и регулярно подтверждать, что на удалённой стороне всё совпадает.
Задача и разделение ответственности
У нас два типа данных:
- Статика: сборки фронтенда, изображения, шрифты, CSS/JS. Для неё критично точное зеркалирование и аккуратное удаление мусора.
- Логи: в основном Nginx и приложения. Это «приток» новых файлов (обычно архивов после ротации), где удаление на удалённой стороне не требуется, а важнее доставка и длительное хранение.
Отсюда следуют разные стратегии rclone: для статики — sync (зеркало), для логов — copy или move после ротации (one-way).
Синхронизация — это не только «донести байты», но и доказать себе, что удалённая копия корректна: сравнить хэши/размеры и отчитаться об отличиях.
Структура хранения: префиксы и окружения
Рекомендую разделить окружения и типы данных по префиксам, чтобы не смешивать потоки и политику хранения:
s3:project/prod/static/,s3:project/stage/static/s3:project/prod/logs/nginx/,s3:project/prod/logs/app/
Так проще настраивать политики сроков хранения на бакете и изолировать доступ. В именах логов используйте дату: access-2025-10-21.gz, чтобы легко фильтровать по времени и избегать перезаписи.
Установка rclone на VDS
Большинство дистрибутивов уже несут rclone в репозиториях. Для Debian/Ubuntu:
sudo apt update
sudo apt install -y rclone
rclone version
RHEL/CentOS/AlmaLinux/Rocky:
sudo dnf install -y rclone
rclone version
Создадим системного пользователя и директории для конфигов и логов:
sudo useradd --system --home /var/lib/rclone --shell /usr/sbin/nologin rclone
sudo mkdir -p /etc/rclone /var/log/rclone
sudo chown -R rclone:rclone /etc/rclone /var/log/rclone
sudo chmod 750 /etc/rclone
sudo chmod 750 /var/log/rclone
Настройка доступа к Object Storage (S3)
Rclone хранит параметры в /etc/rclone/rclone.conf. Минимальный профиль для S3‑совместимого хранилища:
[s3prod]
type = s3
provider = Other
env_auth = false
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region = ru-1
endpoint = s3.example.local
acl = private
storage_class = STANDARD
Замените endpoint, region и ключи на свои значения. Права на файл — максимально строгие:
sudo chown rclone:rclone /etc/rclone/rclone.conf
sudo chmod 600 /etc/rclone/rclone.conf
Опционально: клиентское шифрование
Если логи чувствительные, примените crypt. Он шифрует имена файлов и содержимое, всё прозрачно для команд rclone. Добавьте секцию поверх s3prod:
[cryptprod]
type = crypt
remote = s3prod:project/prod/logs
password = YOUR_PASSWORD_HASH
password2 = YOUR_SALT_HASH
Хэши паролей генерируйте через интерактивный rclone config. После этого вместо s3prod:project/prod/logs используйте cryptprod:.
Синхронизация статики: аккуратное зеркало
Для каталога статики подходит режим sync, который доводит удалённую сторону до состояния локальной (удаляет лишние файлы на удалённой стороне). Добавим базовые фильтры и верификацию:
sudo -u rclone rclone sync /var/www/site/static s3prod:project/prod/static --exclude "**/.git/**" --exclude "**/.DS_Store" --checkers 16 --transfers 8 --s3-upload-concurrency 8 --s3-chunk-size 32M --checksum --delete-excluded --log-file /var/log/rclone/static-sync.log --log-level INFO --progress
Флаг --checksum просит rclone сверять хэши, если бэкенд поддерживает. В S3 хэш корректен для непереразбитых объектов; для multipart‑загрузок ETag не равен MD5. Поэтому для больших файлов или нечёткого ETag имеет смысл периодически запускать rclone check --download (ниже).
Подсказки:
- Если статика генерируется сборкой с хешированными именами файлов, объём изменений небольшой. Выигрыш даст рост
--checkers, а не--transfers. - Для больших наборов мелких файлов включите небольшой
--s3-chunk-size(16M–32M) и умеренную конкуренцию, чтобы не застревать на локальном I/O.

Синхронизация логов: безопасная доставка без удаления
Для логов после ротации лучше «нести» только заархивированные файлы. Последовательность такова: форсируем ротацию, затем копируем новые архивы в хранилище. Если локально пространство ограничено, можно сразу «перемещать» архивы (после ротации) в объектное хранилище.
Ротация и копирование
sudo logrotate -f /etc/logrotate.d/nginx
sudo -u rclone rclone copy /var/log/nginx/ s3prod:project/prod/logs/nginx/ --include "*.gz" --max-age 30d --checkers 8 --transfers 4 --s3-upload-concurrency 4 --s3-chunk-size 16M --log-file /var/log/rclone/logs-copy.log --log-level INFO --progress
--max-age 30d гарантирует, что мы не потащим «вечные» файлы. Если диску тесно, замените copy на move и добавьте --delete-empty-src-dirs, но сначала убедитесь, что ваш процесс ротации не ожидает локальные архивы.
Сжатие до синхронизации
Чтобы снизить сетевой трафик, полезно сжимать крупные старые логи заранее:
sudo find /var/log/nginx -type f -name "*.log" -mtime +0 -size +1M -exec gzip -f {} \;
Такая схема оставляет «текущий» лог несжатым, архивы — в .gz, их и доставляем.
Верификация: rclone check, хэши и отчёты
Даже если sync прошёл без ошибок, периодическая сверка — обязательна. Для статики запросим скачивание образцов и сверку содержимого:
sudo -u rclone rclone check /var/www/site/static s3prod:project/prod/static --download --checkers 16 --one-way --log-file /var/log/rclone/static-check.log --log-level NOTICE
--download заставляет rclone вычислять локальный хэш скачанного объекта, не доверяя ETag. --one-way игнорирует «лишние» файлы на удалённой стороне (релевантно, если кто-то положил дополнительные артефакты вручную).
Для логов полезно ограничить проверку недавним периодом:
sudo -u rclone rclone check /var/log/nginx/ s3prod:project/prod/logs/nginx/ --download --include "*.gz" --max-age 7d --log-file /var/log/rclone/logs-check.log --log-level NOTICE
Если нужны явные манифесты, можно сформировать контрольные суммы локально и на стороне S3 для сопоставимого подмножества и сравнить вручную:
sudo -u rclone rclone md5sum /var/www/site/static > /var/www/site/static.MD5
sudo -u rclone rclone md5sum s3prod:project/prod/static > /var/www/site/static.S3.MD5
Помните: для multipart‑объектов MD5 может быть недоступен как истинный. В таких случаях полагайтесь на rclone check --download.
Автоматизация через systemd
Создадим сервис и таймер для статики:
sudo tee /etc/systemd/system/rclone-static-sync.service > /dev/null << 'EOF'
[Unit]
Description=rclone static sync to S3
After=network-online.target
Wants=network-online.target
[Service]
User=rclone
Group=rclone
Type=oneshot
ExecStart=/usr/bin/rclone sync /var/www/site/static s3prod:project/prod/static --exclude "**/.git/**" --exclude "**/.DS_Store" --checkers 16 --transfers 8 --s3-upload-concurrency 8 --s3-chunk-size 32M --checksum --delete-excluded --log-file /var/log/rclone/static-sync.log --log-level INFO
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
ReadWritePaths=/var/www/site/static /var/log/rclone
[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/rclone-static-sync.timer > /dev/null << 'EOF'
[Unit]
Description=Hourly rclone static sync
[Timer]
Persistent=true
RandomizedDelaySec=180
[Install]
WantedBy=timers.target
EOF
И сервис/таймер для логов (ротация перед копированием):
sudo tee /etc/systemd/system/rclone-logs-copy.service > /dev/null << 'EOF'
[Unit]
Description=rclone logs copy to S3
After=network-online.target
Wants=network-online.target
[Service]
User=rclone
Group=rclone
Type=oneshot
ExecStartPre=/usr/sbin/logrotate -f /etc/logrotate.d/nginx
ExecStart=/usr/bin/rclone copy /var/log/nginx/ s3prod:project/prod/logs/nginx/ --include "*.gz" --max-age 30d --checkers 8 --transfers 4 --s3-upload-concurrency 4 --s3-chunk-size 16M --log-file /var/log/rclone/logs-copy.log --log-level INFO
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
ReadWritePaths=/var/log/nginx /var/log/rclone
[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/rclone-logs-copy.timer > /dev/null << 'EOF'
[Unit]
Description=Daily rclone logs copy
[Timer]
Persistent=true
RandomizedDelaySec=600
[Install]
WantedBy=timers.target
EOF
Активируем таймеры:
sudo systemctl daemon-reload
sudo systemctl enable --now rclone-static-sync.timer rclone-logs-copy.timer
systemctl list-timers | grep rclone
Отчёты смотрим через журнал:
journalctl -u rclone-static-sync.service -e
journalctl -u rclone-logs-copy.service -e
Подробнее о практиках фоновых задач на systemd — в материале «Очереди, Supervisor и systemd для воркеров», ссылка: Очереди, Supervisor и systemd для воркеров.

Логирование и ротация логов rclone
Мы уже направляем логи в /var/log/rclone. Добавим простую ротацию, чтобы они не разрастались:
sudo tee /etc/logrotate.d/rclone > /dev/null << 'EOF'
/var/log/rclone/*.log {
weekly
rotate 12
missingok
compress
delaycompress
notifempty
create 0640 rclone rclone
}
EOF
Производительность: практические пресеты
Параметры --checkers, --transfers, --s3-upload-concurrency и --s3-chunk-size определяют профиль параллелизма и размер запросов:
- Малый VDS (1 vCPU, 1–2 ГБ RAM):
--checkers 8,--transfers 2,--s3-upload-concurrency 2,--s3-chunk-size 8M. - Средний (2–4 vCPU, 4–8 ГБ RAM):
--checkers 16,--transfers 4–8,--s3-upload-concurrency 4–8,--s3-chunk-size 16M–32M. - Если у вас очень много мелких файлов, добавьте
--fast-listи поднимите--checkers. Для очень крупных файлов полезно увеличить--s3-chunk-sizeи конкуренцию.
Чтобы не забивать канал в рабочее время, используйте лимит скорости:
--bwlimit "08:00,5M 20:00,off"
Безопасность секретов и доступов
- Храните
rclone.confс правами600и выделенным системным пользователем. - Раздавайте доступ минимально необходимым префиксам (минимальный набор прав ключу в вашем хранилище).
- Отделяйте окружения разными профилями и ключами.
- Шифруйте логи через
crypt, если в них встречаются персональные данные или токены. - В systemd включите изоляцию:
ProtectSystem,ProtectHome,NoNewPrivileges, ограничьтеReadWritePaths.
Частые ошибки и как их избегать
- Ожидание «идеального» MD5 из ETag на S3 для крупных файлов. Решение: периодически запускайте
rclone check --download. - Случайное удаление артефактов при синхронизации статики. Решение: перед первым запуском используйте
--dry-run, а для логов — толькоcopyилиmove, неsync. - Конфликт ротации и доставки. Решение: в сервисе логов делайте
ExecStartPreсlogrotate -f, гоните только*.gz. - Запуск от root без необходимости. Решение: выделяйте системного пользователя, ограничивайте доступы.
- Слишком агрессивные параллельные потоки на слабом диске. Решение: уменьшите
--transfersи--s3-upload-concurrency, проверьте iowait.
Восстановление: как быстро вернуть данные
Если нужно развернуть статику обратно на сервер:
sudo -u rclone rclone sync s3prod:project/prod/static /var/www/site/static --checkers 16 --transfers 8 --log-file /var/log/rclone/static-restore.log --log-level INFO
Чтобы забрать конкретные логи за дату:
sudo -u rclone rclone copy s3prod:project/prod/logs/nginx/ /tmp/nginx-logs/ --include "*2025-10-21*.gz" --checkers 8 --transfers 4
Контроль качества: регулярные проверки и алерты
Добавьте таймер для верификации статики раз в ночь и логов раз в сутки. По не‑нулевому коду выхода сервисов systemd инициируйте оповещение средствами вашей мониторинговой системы. Так любые расхождения легко обнаруживаются в пределах суток.
Итог
Схема «VDS → rclone → Object Storage» даёт предсказуемую доставку статики и логов с проверяемой целостностью. Разделяйте стратегии: sync для статики, copy/move для логов, держите строгие ACL, периодически выполняйте rclone check --download, а автоматизацию оформляйте в systemd. Это надёжный фундамент для CDN, аналитики и аудита.


