Это продолжение прошлого поста на тему синхронизации файлов. Небольшое дополнение и руководство как все настроить.

Одно время я бекапил файлы в S3 при помощи aws cli — утилиты на питоне. Она работает просто: указываешь источник и приемник, и файлы переливаются из первого во второе. Источником и приемником могут быть локальная папка или бакет S3. В случае с S3 клиент посылает HEAD-запросы, чтобы сберечь трафик.

Схема хороша тем, что протокол S3 поддерживает масса сторонних сервисов, например Яндекс.Облако, Digital Ocean, Exoscale (где автор имел честь работать) и другие. Если что-то пойдет не так, переезд сводится к изменению урла в настройках.

Для айфона нашлось приложение S3 Manager, написанное на коленке одним добрым человеком. Показывает файлы из облака, умеет сохранять локально. Спартанское, немного топорное, но в этом и прелесть. Работает с Яндексом, проверял лично.

Недостаток aws cli в том, что это односторонняя синхронизация. Сюда же относятся утилиты вроде rsync и аналоги. Их объединяет то, что одна из сторон считается верной, а другая подстраивается под первую. Например, если синхронизировать папки A и B, то файлы из А окажутся в В. Однако если в B были новые файлы, то в лучшем случае они игнорируются, а в худшем удаляются. Двойной синк по принципу сначала из А в В, а потом наоборот, эту проблему не решает.

Забегая вперед, скажу, что в итоге поставил Syncthing, который пробовал еще год назад. Однако в процессе экспериментов узнал о замечательной программе Unison, и теперь коротко ее опишу.

Это консольная утилита, написанная на OCaml. Работает на каждом утюге, включая Солярис. Синхронизирует два пути с учетом слияния файлов. Для этого программа ведет свой реестр и по нему сверяеся, что делать с файлами.

Путь может быть удаленным (на другом машине). В этом случае операции с файлами протекают по SSH. У программы два режима: интерактивный (ручной) и автоматический. В первом случае, если встретится конфликт, программа запрашивает действие. Понравился богатый выбор, в том числе разрешение конфликтов при помощи сторонних утилит (kdiff, meld), что очень удобно.

В автоматическом режиме (для скриптов и crontab) интерактивного ввода нет, все разруливается флагами.

Unison оставил прятное впечатление. Видно, что программе много лет: огромное число функций, подробная докуметация. Но смутило, что Unison не работает в режиме демона и нуждается в регулярном запуске по крону. Плюс не очень подходит к Винде из-за SSH — как там его настроить даже не представляю.

Закончил эсперименты тем, что поставил на удаленной машине Syncthing и работаю через него. Полагаю, о Syncthing знают все, поэтому нет смысла расписывать его возможности. Ниже — инструкция о том, как сделать все максимально быстро.

Итак, понадобится VPS с большим диском. Путем гугления я вышел на AlphaVPS, где за три евро в месяц можно взять машину с диском на 256 гигабайт (а за три с половиной — на 512). Диски, ясное дело, не SSD, но в моем случае это не важно.

Заказываем машину с Ubuntu 22, заходим под рутом. Создаем пользователя:

useradd -s /bin/bash -d /home/ivan/ -m -G sudo ivan
passwd ivan

Перекидываем SSH-ключ:

ssh-copy-id -i ~/.ssh/ivan.pub ivan@123.123.123.123

В ~/.ssh/config прописываем алиас

Host alpha
    HostName 123.123.123.123
    IdentityFile ~/.ssh/ivan
    User ivan

Далее заходим по ssh alpha и вводим команды:

echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
sudo apt update
sudo apt install syncthing

Чтобы Syncthing запускался в автозагрузке, добавим его в systemctl:

sudo systemctl enable syncthing@ivan.service

Остается включить:

sudo systemctl start syncthing@ivan.service

Syncthing настраивается через веб-интерфейс, однако он доступен только с локального хоста. Поднимаем SSH-тоннель:

ssh -N -L 18384:localhost:8384 alpha

Теперь откройте браузер на странице localhost:18384 — появится интерфейс Syncthing на удаленной машине. Ну а дальше вы сами знаете: создаете папки, связываете машины друг с другом и так далее.

На текущий момент у меня VPS за три евро и три компа: два мака и винда. Вроде бы работает, файлы подхватываются. К сожалению, Syncthing не так гибок в плане текстовых файлов, как Unison: умеет только брать файл А или В, а про слияние сторонней тулзой ничего не знает. Однако для текстовых файлов есть git.

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