Недавно мы в тесной компании обменялись мнениями о синхронизации файлов.

Облачные сервисы как правило удобны. Сохранил файл в папку Dropbox и уверен, что на других твоих компьютерах он появится. Проблема с версией или удалил что-то не то? Зашёл в web-интерфейс и всё восстановил. Но без “но” не обойтись. Dropbox - облачный сервис. С надеждой на то, что компания, его обслуживающая, не допускает ошибок и не позволяет сторонним лицам получить доступ к файлам. Но это не так. Данные не зашифрованы и я навскидку вспомнил по крайней мере одну утечку. Хранить заметки о размере обуви можно вполне, но если данные действительно приватные, то не стоит.

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

Есть варианты шифрования данных в Dropbox (зашифрованный Sparse bundle image, EncFS, TrueCrypt, etc). Но они подразумевают использование контейнера только с одного компьютера одновременно. Кто-то пробовал изменить файл на двух сторонах и посмотреть, что из этого выйдет? Правильно, ничего хорошего (не ручаюсь за EncFS). Нужно тщательно следить за невозможностью такого сценария.

Simplenote? Хорош, даже идеален для заметок Notational Velocity. Но не зашифрован.

iCloud? Не смешите. Люди с одной стороны ставят короткий пароль, чтобы без хлопот покупать программы, а с другой считают, что это супернадёжный сервис, который злоумышленники обходят десятой стороной, пугаясь слова “Apple”.

В определённый момент я перестал искать варианты хранения данных в облачных сервисах. Чем удобнее, тем небезопаснее. Чем зашифрованнее, тем тяжелее получить доступ с разных устройств. Может стоило бы посмотреть на SpiderOak, но мне лично уже неинтересно перебирать десяток сервисов.

Поэтому следующим шагом я переключился на сервисы без хранения пользовательских данных в облаке. AeroFS был с год моим фаворитом. Мне не нужно было иметь доступ с iPhone и я вполне мог запустить Java на нескольких системах. Сервера сервиса отвечают только за “сигнализацию”, данные же никуда кроме пользовательских систем не уходят. Конечно, нужно иметь по крайней мере один компьютер включённым. Тоже устраивало. Но… Стал замечать, что синхронизация стартует непредсказуемо. Мой сервер включён постоянно, проблем с сетью нет, включил ноутбук - а данных нет. Останов/запуск - глухо. Только минут через 10 файлы внезапно приходят, и это пара текстовых файлов объёмом в 10 KB, а не гигабайтные образы. Сервисом стало невозможно пользоваться.

BTSync был на первый взгляд избавлением. Скорость зашкаливает. Можно синхронизировать гигабайты. Но вот есть две червоточинки - пока не поддерживаются симлинки (симлинк придёт как симлинк, а не как содержимое файла или каталога) и проблемы с синхронизацией файлов, изменённого с двух сторон. Версия на всех компьютерах последняя, обновлённая пару дней назад, с поддержкой версионности судя по Change Notes. Изменяю файл на двух системах и? Один файл удалён, второй - на обоих системах. .SyncArchive пуст. Т.е. изменения потеряны. Вывод - пока пользоваться для совместной работы над файлами нельзя. А для хранения, допустим, книг, фильмов и т.п., т.е. того, что не может изменяться с двух сторон одновременно - идеальное решение.

Кстати, одновременное изменение файлов нормально отслеживается и в Dropbox, и в AeroFS. Создаются файлы конфликтов или программа высвечивает конфликт - не важно, главное результат.

Посидел, подумал. Понял, что пора переходить к решению без внешних сервисов.

Хороший вариант для текстовых заметок - git. Детали я описывал в статье Процесс ведения заметок с применением git. Если ещё приделать post-commit hook, то станет проще. Версионность, видны diff’ы, можно вернуться к любой версии. Но… Не предназначен git для больших файлов (есть вариант - git-annex). И информация о временах создания и модификации файлов не сохраняется (это идеологическое решение). Сделал “git pull” - и полученные файлы созданы “вот только что”. А в NVAlt я хочу видеть реальное время создания и модификации заметки. Костыль есть - я теперь называю заметки как “blog - 2013-07-23 - статья о синхронизации”, но это не то, что хочется.

Пробовал раньше три программы синхронизации каталогов. Сейчас не помню, как они называются. Вроде Synkron и ещё две недешёвых. Детали не помню, они все были неудобными.

Тем, кто знает слово “rsync” скажу коротко - оно не для двухсторонней синхронизации.

И наконец-то остановился на Unison. Это только для людей, умеющих работать с консолью. Хотя есть GUI и для Mac, мне он не пришёлся по вкусу.

Установка

$ brew install unison

Конфигурация (сервер должен быть доступен по ssh) - по документации:

$ mkdir -p ~/.unison
$ vim ~/.unison/ceiling.prf

# Unison preferences
root = /Users/ctrld
root = ssh://ceiling-cat//Users/ctrld

path = Documents/Notes.nv
ignore = Path {Documents/Notes.nv/Notes & Settings}
ignore = Path {Documents/Notes.nv/.git}

path = Library/Application Support/Sublime Text 3
ignore = Path {Library/Application Support/Sublime Text 3/Cache}
ignore = Path {Library/Application Support/Sublime Text 3/Index}
ignore = Path {Library/Application Support/Sublime Text 3/Local}
ignore = Path {Library/Application Support/Sublime Text 3/Packages/User/Package Control.cache}
ignore = Path {Library/Application Support/Sublime Text 3/Packages/User/Package Control.last-run}
ignore = Path {Library/Application Support/Sublime Text 3/Packages/*/.git}
ignore = Path {Library/Application Support/Sublime Text 3/Local/Auto Save Session.sublime_session}

ignore = Name {.DS_Store}

# Keep a backup copy of every file in a central location
backuplocation = central
backupdir = /Users/ctrld/Backups/unison
backup = Name *
backupprefix = $VERSION.
backupsuffix =

# Use this command for displaying diffs
diff = diff -u

# Log actions to the terminal
log = true
times = true
#repeat = 2
terse = true

Запуск

$ unison ceiling

Приходится повыбирать, что делать с файлами. Порой нужно посмотреть на diff’ы (можно прикрутить Kaleidoskope). Для синхронизации более двух устройств нужно выбрать сервер и синхронизировать попарно, т.е. это гораздо сложнее Dropbox’а.

Но зато я теперь полностью контролирую процесс. И никаких внешних облачных сервисов, поэтому дополнительное шифрование (к whole disk encryption) не нужно.

А вот рецепт, который мне попался через недели две после того, как я остановился на Unison’е: Build your own private, encrypted, open-source Dropbox-esque sync folder. Здесь добавляется слой шифрования с помощью EncFS.