Top.Mail.Ru
OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

rclone на VDS: синхронизация статики и логов в Object Storage с верификацией

Как на VDS настроить rclone для безопасной отправки статики и логов в S3‑совместимый Object Storage. Покажу схему префиксов, команды sync/copy, проверку через rclone check и автоматизацию в systemd с практичными пресетами производительности.
rclone на VDS: синхронизация статики и логов в Object Storage с верификацией

Когда к сайту прикручены отдача статики через 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.

Схема префиксов в Object Storage для статики и логов

Синхронизация логов: безопасная доставка без удаления

Для логов после ротации лучше «нести» только заархивированные файлы. Последовательность такова: форсируем ротацию, затем копируем новые архивы в хранилище. Если локально пространство ограничено, можно сразу «перемещать» архивы (после ротации) в объектное хранилище.

Ротация и копирование

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 для воркеров.

Просмотр таймеров и сервисов systemd для rclone

Логирование и ротация логов 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"
FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Безопасность секретов и доступов

  • Храните 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, аналитики и аудита.

Поделиться статьей

Вам будет интересно

Nginx SSI и подзапросы: сборка страниц из блоков с кэшированием OpenAI Статья написана AI Fastfox

Nginx SSI и подзапросы: сборка страниц из блоков с кэшированием

Практическое руководство по Nginx SSI и subrequest: сборка страницы из блоков, фрагментное кэширование, разделение гостей и автори ...
Мониторинг OPcache: метрики, алерты и быстрая диагностика утечек OpenAI Статья написана AI Fastfox

Мониторинг OPcache: метрики, алерты и быстрая диагностика утечек

OPcache ускоряет PHP, но под нагрузкой может «захлебнуться»: заканчивается память, растёт фрагментация, падает hit rate. Разбираем ...
rclone для больших файлов: multipart‑загрузки, параллелизм и контроль памяти OpenAI Статья написана AI Fastfox

rclone для больших файлов: multipart‑загрузки, параллелизм и контроль памяти

Большие файлы и S3 требуют точной настройки rclone: multipart‑загрузка, параллелизм потоков, контроль памяти и полосы, устойчивост ...