Синхронизировать файлы клиентов с сервером - Electron/node.js

Моя цель - создать приложение Electron, которое синхронизирует папку клиента с сервером. Чтобы объяснить это более четко:

  1. Если у клиента нет файлов на хост-сервере, приложение загружает все файлы с сервера на клиент.
  2. Если у клиента есть файлы, но некоторые файлы были обновлены на сервере, приложение удаляет ТОЛЬКО устаревшие файлы (оставляя неизмененные) и загружает обновленные файлы.
  3. Если файл был удален с хост-сервера, но присутствует в папке клиента, приложение удалит файл.

Просто приложение должно убедиться, что у клиента есть ТОЧНАЯ копия папки хост-сервера.

До сих пор я делал это через wget -m, однако часто wget не распознавал, что некоторые файлы изменились, и у клиентов остались устаревшие файлы.

Недавно я слышал о zsync-windows и пакете webtorrent npm, но я не уверен, какой подход правильный и как на самом деле достичь моей цели. Спасибо за любую помощь.

0 ответов

Rsync - хороший подход, но вам нужно будет получить к нему доступ через node.js

Такой пакет npm может вам помочь: https://github.com/mattijs/node-rsync

Но в системах Windows все будет немного сложнее: как получить команду rsync в Windows?

Если у вас есть ssh-доступ к серверу, можно использовать rsync через пакет Node.js.

Там хорошая статья здесь о том, как осуществить это.

Вы можете использовать rsyncкоторый широко используется для резервного копирования и зеркалирования, а также в качестве улучшенной команды копирования для повседневного использования. Он предлагает большое количество опций, которые контролируют каждый аспект его поведения и позволяют очень гибко определять набор копируемых файлов.

Он известен своим алгоритмом дельта-передачи, который уменьшает объем данных, отправляемых по сети, отправляя только различия между исходными файлами и существующими файлами в месте назначения.

Для вашего варианта использования:

  1. Если у клиента нет файлов на хост-сервере, приложение загружает все файлы с сервера на клиент. Этого можно добиться с помощью простого rsync.
  2. Если у клиента есть файлы, но некоторые файлы были обновлены на сервере, приложение удаляет ТОЛЬКО устаревшие файлы (оставляя неизмененные) и загружает обновленные файлы. Используйте: –remove-source-files или -delete в зависимости от того, хотите ли вы удалить устаревшие файлы из источника или из места назначения.

  3. Если файл был удален с хост-сервера, но присутствует в папке клиента, приложение удаляет файл. Используйте: -delete параметр rsync.

    rsync -a - удалить исходное назначение

Учитывая, что это список папок (и, следовательно, с простыми именами файлов без пробелов и т.д.), вы можете выбрать имена файлов с помощью кода ниже

# Get last item from each line of FILELIST
awk '{print $NF}' FILELIST | sort >weblist

# Generate a list of your files
find -type f -print | sort >mylist

# Compare results
comm -23 mylist weblist >diffs

# Remove old files
xargs -r echo rm -fv <diffs

вам нужно удалить последний echo позволять rm Работа

В следующий раз, когда вы захотите обновить зеркало, вы можете изменить comm строку (поменяв местами два аргумента файла), чтобы найти набор файлов, которых у вас нет, и передать их в wget.

или

rsync -av --delete https://mirror.abcd.org/xyz/xyz-folder/ my-client-xyz-directory/
Другие вопросы по тегам