Такой вопрос возникает когда у сайта есть копия, например региональный сайт или сайт на другом языке, но при этом база данных у них одна, а файлы должны периодически копироваться между ними.
Для этих целей есть unix утилита Rsync, которая позволяет быстро выполнить синхронизацию новых файлов в различных директориях.
Как правило утилита уже установлена на множестве хостингах и запускается в консоле через SSH. Команды выполняется по следующему синтаксису:
rsync -опции исходная_директория/ директория_назначения
В конце исходной директории стоит слеш, чтобы обрабатывалась сама директория и всё её содержимое.
Основные опции
-v |
Выводить подробную информацию. |
-progress |
Выводить прогресс передачи файла. |
-q |
Не выводить информацию. |
-c |
Проверка контрольных сумм для файлов. |
-a |
Режим архивирования. |
-R |
Используются относительные пути. |
-b |
Создание резервной копии. |
-u |
Не перезаписывать более новые файлы. |
-l |
Копировать символьные ссылки. |
-L |
Копировать содержимое ссылок. |
-H |
Копировать жесткие ссылки. |
-p |
Сохранять права для файлов. |
-g |
Сохранять группу. |
-t |
Сохранять время модификации. |
-e |
Использовать другой порт для ssh. |
-z |
Сжимать файлы перед передачей. |
-delete |
Удалять файлы которых нет в источнике. |
-exclude |
Исключение файлов по шаблону. |
-r -recursive |
Обрабатывать директории рекурсивно. |
-n -dry-run |
Тестовый прогон без синхронизации. |
Полное описание опций на https://download.samba.org/pub/rsync/rsync.1 (en).
Если два сайта находятся на одном хостинге, задача упрощается т.к. файлы обеих сайтов находятся в одном дисковом пространстве. Остается только узнать полные пути до директорий и выполнить копирование новых файлов из /home/example.ru/uploads
в /home/example.com/uploads
rsync -auq /home/example.ru/uploads/ /home/example.com/uploads
Синхронизация в обе стороны выполняется двумя командами:
rsync -auq /home/example.ru/uploads/ /home/example.com/uploads
rsync -auq /home/example.com/uploads/ /home/example.ru/uploads
При повторном выполнении команд утилита будет обновлять файлы только с изменениями, но не удаляя их.
Для синхронизации файлов на разных хостингах, rsync должен быть установлен на обоих серверах, в команде указывается логин и адрес хоста:
rsync -опции /исходная_директория/ имя_пользователя@адрес:директория_назначения
После запуска команды потребуется ввести пароль в консоль.
Пример:
rsync -azvuq /home/example.ru/uploads/ user@host:/home/example.com/uploads
Синхронизация в обе стороны:
rsync -azvuq /home/example.ru/uploads/ user@host:/home/example.com/uploads
rsync -azvuq user@host:/home/example.com/uploads/ /home/example.ru/uploads
Чтобы автоматизировать процесс синхронизации, можно сгруппировать все команды rsync в файле sync.sh и поместить его в корневой директории хостинга и запускать его по крону раз в три часа.
# Минута Час День Месяц День недели Команда
0 */3 * * * /sync.sh
При работе с удалёнными хостами по SSH потребуется настроить авторизацию по ключу.