Obsync
Плагин и сервер · plugin 0.3.0

Ваш сервер. Ваш ключ.

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

AES-256-GCM Argon2id Go + SQLite Obsidian 1.11.4+
Ноутбукоткрыто
Личное/Дневник.md
Сервер видит
path_id
размер
чанк
Телефоноткрыто
Личное/Дневник.md

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

Что видит сервер

Ключ получается из вашей парольной фразы прямо на устройстве и никуда не отправляется. Перед отправкой файл режется на куски до 4 МиБ, и каждый кусок шифруется отдельно. Путь к файлу, время правки и название хранилища тоже зашифрованы.

Вместо имени файла сервер получает отпечаток пути (HMAC). По нему сервер понимает, что пришла новая версия того же файла, но восстановить имя не может.

Поэтому сервер спокойно можно держать на арендованном VPS. Даже администратор в панели увидит только идентификаторы и объёмы.

Видит

  • размеры файлов и кусков
  • сколько файлов в хранилище
  • когда были правки
  • с какого устройства пришла правка

Не видит

  • текст заметок и вложения
  • имена файлов и папок, расширения
  • структуру дерева
  • названия хранилищ
masterKey = Argon2id(passphrase, salt, m = 64 МиБ, t = 3, p = 1)
path_id   = HMAC-SHA256(K_pathid, путь)
чанк      = AES-256-GCM(ключ куска, содержимое)

Что умеет

Слияние правок

Бывает, что одну заметку поправили и на ноутбуке, и на телефоне. Obsync сводит такие правки по строкам. Если поменялись одни и те же строки, рядом появится конфликтная копия, и вы сами решите, что оставить.

История версий

Если случайно стёрли абзац или удалили файл, прежнюю версию можно вернуть. Сервер хранит старые версии 30 дней, а 10 последних держит всегда.

Сразу и без сети

Правка с другого устройства приходит почти сразу: плагин держит с сервером постоянное соединение. Если сети нет, просто пишите дальше. Когда связь вернётся, плагин догонит всё сам.

Устройства

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

Несколько хранилищ

Рабочее, личное и архив можно держать на одном сервере. Сервером можно поделиться с семьёй: у каждого своя учётная запись, и чужие хранилища никому не видны.

Ключ восстановления

Когда вы создаёте хранилище, плагин показывает ключ из 56 символов. Сохраните его: если фраза забудется, он откроет хранилище. Сервер тут не поможет, нужного ключа у него нет.

Сервер

Сервер Obsync состоит из одной программы obsyncd на Go. Данные она держит в базе SQLite и в файлах на диске. Проще всего запустить её в Docker, команды ниже. Открытой регистрации нет: учётные записи заводит администратор в панели.

Для интернета: HTTPS через Caddy
cd obsync
OBSYNC_DOMAIN=sync.example.com \
OBSYNC_ADMIN_EMAIL=me@example.com OBSYNC_ADMIN_PASSWORD='длинный-пароль' \
  docker compose -f docker-compose.caddy.yml up -d --build

Понадобятся домен, который указывает на сервер, и открытые порты 80 и 443. Сертификат Let's Encrypt Caddy получит и будет продлевать сам. Самоподписанный сертификат не подойдёт: Obsidian доверяет только тем сертификатам, которым доверяет система.

Для своей машины или локальной сети
cd obsync
OBSYNC_ADMIN_EMAIL=me@example.com OBSYNC_ADMIN_PASSWORD='длинный-пароль' \
  docker compose up -d --build

Учётная запись администратора создаётся при первом запуске, пока база пустая. Потом откройте панель http://<сервер>:8789/admin и заведите пользователей. Учтите, что без HTTPS плагин подключается только к localhost.

Резервная копия без остановки
docker compose exec obsyncd obsyncd backup /backups/obsync-$(date +%F)

Просто скопировать папку с данными работающего сервера не выйдет: база в этот момент ведёт журнал (режим WAL), и копия может оказаться битой. Команда backup делает целый снимок и сама его проверяет.

Плагин

Плагина нет в каталоге Obsidian, поэтому архив лежит здесь. Ту же сборку можно скачать и с вашего сервера, по его корневому адресу.

Скачать Obsync 0.3.0
zip · 75 КБObsidian 1.11.4+Компьютер и телефон
Или по файлам: main.js · manifest.json · styles.css
SHA-256 архива: 18e750ef09876a7d1713b1594b4b2dd5a9d0082c325ef90c22dfb0e4d4e2c08e
  1. Распакуйте архив в папку .obsidian/plugins/ внутри хранилища (появится папка obsync) и включите Obsync в «Настройки → Сторонние плагины».
  2. Впишите адрес сервера и нажмите «Проверить сервер». Плагин покажет версию сервера, есть ли HTTPS и проходит ли WebSocket. Если что-то не так, он скажет, что именно.
  3. Войдите под учётной записью, которую вам завёл администратор.
  4. Создайте хранилище и придумайте парольную фразу не короче 12 символов. Проще всего взять 4–5 случайных слов: их легко запомнить и трудно подобрать.
  5. Сохраните ключ восстановления на бумаге или в менеджере паролей. Только не в заметках: без фразы их всё равно не открыть.
  6. На втором устройстве войдите в тот же аккаунт, выберите то же хранилище и введите ту же фразу. Заметки подтянутся сами.

Токен устройства и ключ плагин хранит в хранилище секретов Obsidian, которое шифрует сама система. В data.json их нет, так что они не уедут вместе с папкой хранилища в iCloud, git или резервную копию.

Вопросы

Что если я забуду парольную фразу?

Откройте хранилище ключом восстановления: в плагине выберите «Чем открыть: ключом восстановления». Если нет ни фразы, ни ключа, данные не расшифрует никто, включая администратора сервера.

У меня уже есть файлы на обоих устройствах. Синхронизация их не затрёт?

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

Синхронизируется ли папка .obsidian?

Если хотите. Для этого есть отдельный переключатель в настройках. Ещё можно указать маски: что синхронизировать, а что пропускать.

Можно ли сменить парольную фразу?

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

Можно ли без Docker?

Да. Соберите сервер в папке server командой go build -o obsyncd ./cmd/obsyncd и запустите ./obsyncd serve. Настройки берутся из переменных окружения или из config.yaml.