Как обеспечить автоматическую синхронизацию локального каталога с удаленным без проблем с задержкой?

Конфигурация в порядке. Проблема решена после установки firewall-cmdи добавления правила для порта 443

.
1
21.11.2019, 19:31
2 ответа

В итоге я нашел два решения этой проблемы.

  • Используйте unison. Это утилита командной строки для зеркалирования локального каталога на удаленном сервере. Он похож на rsync, но немного более сложный и эргономичный при работе с большим количеством файлов. Их репозиторий на github довольно активен, хотя на веб-странице говорится, что разработка в значительной степени остановлена, а главный недостаток заключается в том, что unison— утилита, запускаемая -один раз, а не что-то, что работает в фоновом режиме. Вы можете использовать что-то вроде cronдля периодического запуска unison, но я не уверен, приведет ли это к длительным задержкам синхронизации (1 минута+ )и как будет работать ручное разрешение конфликтов.
  • Используйте lsyncd. Эта программа предназначена именно для моего варианта использования :. Она постоянно отслеживает заданный каталог и немедленно синхронизирует любые изменения всего за 1 секунду. Однако последний коммит был 2 года назад, поэтому я не уверен, насколько это жизнеспособно в долгосрочной перспективе.

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

settings {
    nodaemon = true,
    statusInterval = 1
}

sync {
    default.rsync,
    source = "/home/donentolon/github/my-awesome-codebase",
    target = "remote-machine:/home/remote-user/my-awesome-codebase",
    delay = 1, 
    exclude = { '/.git', '/.idea' }
}

Это сообщает от lsyncdдо:

  • Подключиться к удаленному компьютеру с помощью SSH (Мой SSH configнастроен так, что ssh remote-machineбудет подключаться к нему)
  • Использовать rsync для фактической синхронизации
  • Проверять наличие изменений в файле не реже, чем каждую секунду (delay)
  • Не синхронизировать файлы git и PyCharm верхнего уровня

Когда я включаю свой компьютер, я открываю терминал и запускаю lsyncd my-lsyncd-profile.lua, и он начинает работать и печатать оперативные обновления о том, что он делает. Я оставляю терминал открытым, занимаюсь разработкой и убиваю lsyncdв конце дня, когда закончу.

Я не использую git для отслеживания изменений в удаленном каталоге, хотя мог бы. Если я хочу зафиксировать свои изменения в git,Я запускаю git commitи другие команды на своем локальном компьютере, который lsyncdсинхронизирует с . Поскольку локальный каталог на самом деле является локальным, а не удаленным локально, функции PyCharm (, такие как индексирование ), работают нормально.

Есть фоновый режим, но я им не пользовался, потому что мне нравится видеть статус lsyncd. Его можно настроить на автозапуск стандартными методами Linux, но я предпочитаю ручной метод.

На странице

lsyncdперечислены некоторые альтернативы с похожими вариантами использования, поэтому, если вам не нравится это решение, вы можете взглянуть на них.

1
27.01.2020, 23:40

Этот вариант использования на самом деле очень распространен (, особенно при разработке встраиваемых систем ), потому что, как вы упомянули, иногда случается, что локальная машина не может иметь правильную среду для запуска приложения.

Таким образом, многие/большинство IDE имеют функцию удаленного запуска, но у меня нет опыта работы с PyCharm. См. здесь специально для PyCharm.

Другой, более независимый от среды способ сделать это — использовать scpили rsyncдля передачи/синхронизации файлов, а затем запускать их удаленно.

Чтобы это работало должным образом, вы должны настроить аутентификацию с открытым ключом ssh от вашего хоста к цели с помощьюssh-copy-id user@target

Затем вы можете использовать сценарий, подобный следующему, для передачи папки на удаленный компьютер, и, если передача прошла успешно, -выполнить некоторые команды:

#!/bin/bash

TARGET="<your-remote-here>";
USER="<your-user-name-on-remote-here>";
FOLDER_TO_TRANSMIT="<folder-to-transmit>";
FOLDER_TO_TRANSMIT_TO="<folder-path-on-target>";
REMOTE_COMMANDS="touch ~/testdir/z; ls ~/testdir;"

#transmit only (inefficiant, transmits everything, every time)
#scp -r $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO;
rsync -rv --delete $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO

if [ $? -eq 0 ]
then
    ssh -t $USER@$TARGET "$REMOTE_COMMANDS"
fi

Единственное, о чем вам нужно беспокоиться при такой настройке, — это о правильной очистке папки, в которую вы каждый раз передаете данные. (rsync :только с --deleteвсе, что не находится в исходной папке, также удаляется в папке назначения, этого можно избежать с помощью шаблонов исключения)(scp :, если применимо, вы можете, например, просто удалить все удаленная папка, если хотите)

Если ваша процедура установки немного сложнее, вы также можете создать сценарий, который также будет передаваться каждый раз, а затем просто вызываться.

0
27.01.2020, 23:40

Теги

Похожие вопросы