mysurik.ru

Obsidian на домашнем сервере через Samba + Docker

Захотел синхронизировать заметки между двумя машинами — настольным ПК в кабинете и ноутбуком, который таскаю по дому, с дивана на кухню, иногда на балкон. Obsidian Sync стоит 5 баксов в месяц. Вроде копейки, но за год набегает 60. А если у тебя уже есть свой сервер, платить за облачную синхронизацию текстовых файлов — ну такое себе удовольствие.

Я понимаю, почему Obsidian Sync платный — ребятам надо как-то зарабатывать. Серверы, разработка, поддержка. Но у меня своя инфраструктура. Четыре виртуалки на Proxmox, отдельный диск WD Blue на терабайт, гигабитная сетка по дому. Зачем мне платить за то, что я могу сделать сам за вечер?

Посмотрел на LiveSync — плагин для Obsidian, который гоняет данные через CouchDB. Тема интересная, но поднимать CouchDB, настраивать репликацию, следить за конфликтами… Мне хотелось что-то проще. Максимально прозрачное. Чтобы я открыл папку — а там файлы. Как локально, только с другого компа.

Syncthing я тоже гонял. Отличная штука, peer-to-peer, децентрализованная. Но она синхронизирует между устройствами, а не хранит централизованно. Хлоп — закрыл ноутбук, данные есть на обоих устройствах, но если оба снесли — привет. Хотелось именно файловое хранилище, шоб как NAS, только легче.

Тогда я вспомнил про SMB. Сетевые шары, Samba — технология, которой уже лет тридцать. Она работает на уровне файловой системы, Obsidian её прекрасно переваривает через открытие vault’а как сетевого диска. Никаких плагинов, никаких сторонних сервисов — просто папка, расшаренная по сети.

### Подготовка диска

Выделил под заметки отдельный диск — WD Blue 1TB, который как раз валялся без дела после апгрейда. На сервере Proxmox, диски висят на AHCI-контроллере встроенном в материнку ASRock B450M. Создал раздел через parted, отформатировал в ext4, подмонтировал:

parted /dev/sdd mklabel gpt
parted /dev/sdd mkpart primary ext4 0% 100%
mkfs.ext4 /dev/sdd1
mkdir -p /mnt/obsidian
mount /dev/sdd1 /mnt/obsidian

Добавил в /etc/fstab:

/dev/sdd1  /mnt/obsidian  ext4  defaults,noatime  0  2

Флаг noatime — чтобы диск лишний раз не дёргался при каждом чтении файла. Для заметок, где каждую секунду может открываться новый файл, это даёт небольшой, но приятный бонус к производительности.

### Проблема с Proxmox и NFS

Дальше — самое интересное. Я планировал поставить Samba прямо на Proxmox. apt install samba — и готово. Но не тут-то было.

Proxmox использует nfs-common из своего репозитория, версии 2.8.3, собранный под специфичное ядро Proxmox (6.8 с патчами). А в стандартном репозитории Debian Bookworm — nfs-common 2.6.2. При попытке установить пакет, который тянет nfs-kernel-server (а Samba его не тянет напрямую, но могут быть пересечения по libtirpc и другим библиотекам), начинается ад: зависимости не сходятся, apt ругается на конфликтующие версии протоколов RPC.

Я полез гуглить. Оказалось, это известная проблема — Proxmox форкает Debian, но пакует некоторые библиотеки со своими патчами. Решений нашёл три:

1. Форсить через --fix-broken и молиться. 2. Устанавливать Samba не из реп, а собирать из исходников. 3. Запустить Samba в Docker.

Первое — лотерея, второе — геморрой с обновлениями. Третье — идеально. Docker-контейнер не знает о версиях пакетов на хосте, у него своя изоляция, свои библиотеки, своя файловая система через overlayfs.

### Docker-контейнер dperson/samba

Образ dperson/samba — легковесный, на Alpine Linux, занимает 15MB в скачанном виде. Из коробки поддерживает всё, что нужно: публичные и приватные шары, пользователи, гостевой доступ, настройка через аргументы командной строки.

Запускается одной командой:

docker run -d --name samba-obsidian 
  --restart unless-stopped 
  --network host 
  -v /mnt/obsidian:/obsidian 
  dperson/samba -p 
  -s "obsidian;/obsidian;yes;no;no" 
  -u "site_user;password"

Разберу флаги подробнее, потому что сам когда настраивал — тупил:

--network host — пробрасывает порты 139 и 445 напрямую, без маппинга. Это важно для SMB, потому что протокол использует сложную систему портов, и проброс через -p 445:445 может работать нестабильно. С host mode контейнер видит сетевой интерфейс хоста как свой собственный. — -v /mnt/obsidian:/obsidian — монтирует диск с заметками внутрь контейнера. Внутри контейнера директория будет доступна по пути /obsidian. — -s "obsidian;/obsidian;yes;no;no" — создаёт SMB-шару с именем obsidian, указывает путь /obsidian, разрешает всем пользователям просматривать содержимое (yes), но запрещает гостевую запись (no), запрещает гостевой доступ вообще (no). — -u "site_user;password" — создаёт пользователя Samba. Пароль я, конечно, поставил нормальный. В примере замени на свой. — -p — флаг, который включает гостевой доступ к публичным шарам. Если его не поставить, гости не увидят даже список доступных ресурсов.

Пароль от Samba хранится в контейнере. Если контейнер пересоздать — пароль сбросится, придётся задавать заново. Поэтому я вынес настройку пароля в переменную окружения через env-file, но это уже опционально.

### Что я понял про права доступа

Самая частая проблема с Samba на Linux — права на файлы. Контейнер работает от root (dperson/samba по умолчанию запускается от root внутри), но монтирует директорию из хостовой файловой системы. Если на хосте файлы принадлежат root, а Obsidian на Windows создаёт файлы от пользователя site_user — на выходе получаем кашу из uid/gid.

У dperson/samba есть параметр -g для задания uid/gid по умолчанию. Я решил проще: создал на хосте пользователя site_user (uid 1001), дал ему владение над /mnt/obsidian, и внутри контейнера указал тот же uid через аргумент -g "1001":

docker run -d --name samba-obsidian 
  --restart unless-stopped 
  --network host 
  -v /mnt/obsidian:/obsidian 
  dperson/samba -p 
  -u "site_user;password" 
  -g "1001" 
  -s "obsidian;/obsidian;yes;no;no"

Теперь все создаваемые через SMB файлы имеют владельца site_user:site_user на хосте. Если понадобится зайти на сервер и редактировать файлы напрямую — не будет проблем с правами.

### Настройка клиента на Windows

На Windows всё тривиально. Открываешь «Этот компьютер» → «Подключить сетевой диск». Выбираешь букву Z:, папка \192.168.0.130obsidian, галочка «Использовать другие учётные данные», вводишь логин site_user и пароль.

После подключения Obsidian видит папку Z:site_user как обычный vault. Открывается через «Open folder as vault» — всё, заметки синхронизированы.

Первое время я боялся, что Obsidian будет тормозить при работе по сети. Знаете эти синдромы «навсегда загружается»? Проверил — нет, работает шустро. Я гонял тестовый файл на 50MB туда-сюда — скорость утилизирует гигабит почти полностью, около 110 MB/s. Для текстовых заметок это с запасом. Obsidian даже не замечает, что файлы не локальные — открытие любого файла занимает доли секунды.

На ноутбуке я сделал то же самое. Теперь у меня два устройства, работающих с одной и той же папкой заметок через SMB. Открыл заметку на ПК, поправил, закрыл. Через минуту открыл на ноутбуке — изменения на месте.

### Мониторинг и обслуживание

Раз в неделю я проверяю, что контейнер жив. Написал простой скрипт в /usr/local/bin/check-samba.sh, который стучится к Samba и проверяет, что шара отвечает:

smbclient -L //localhost/obsidian -U site_user%password -c exit 2>/dev/null
if [ $? -ne 0 ]; then
  docker restart samba-obsidian
  ntfy -t "Samba" send "Конт�µйн�µр samba-obsidian п�µр�µ�·�°пущ�µн"
fi

Да, скрипт примитивный, но он спасал уже дважды, когда после обновления ядра Docker перезапускался, и контейнер с Samba не стартовал автоматически (хотя unless-stopped — обычно этого хватает).

### Бекапы

SMB сам по себе не хранит историю версий. Удалил файл — и он пропал. Obsidian хранит историю в файлах .obsidian/workspace.json и дневниках, но это не спасёт, если удалил целую папку или перезаписал важный файл мусором.

Я настроил два уровня бекапов:

1. Ежечасный rsync внутри дня:

0     /usr/bin/rsync -a --link-dest=/mnt/obsidian-backup/yesterday/ /mnt/obsidian/ /mnt/obsidian-backup/$(date +%Y-%m-%d-%H)/

Это делает снапшот заметок каждый час, используя жёсткие ссылки на неизменённые файлы через --link-dest. Занимает мало места.

2. Ежедневная отправка на ZFS-пул через zfs send: Этот процесс описан в другой статье, но суть: раз в сутки бекап уходит на второй сервер. Если сгорит диск — потеряю максимум день заметок.

### Альтернативы, которые я рассматривал

Obsidian Sync — 5$/мес. Удобно, легко, но за год выходит 60 баксов. Дороговато для синхронизации текста. Если бы у меня не было сервера — взял бы его без вопросов.

LiveSync (CouchDB) — бесплатно, но сложнее. Нужно поднимать CouchDB, настраивать HTTPS, разбираться с репликацией. Если администрирование сервера — не твоё, лучше не лезть.

Syncthing — отличный вариант, если у тебя нет сервера, а есть два ноутбука. Но у меня сервер работает 24/7, зачем мне децентрализация, если можно централизовать?

NextCloud — мощно, но тяжело. Для Obsidian NextCloud — это как из пушки по воробьям. PHP, база данных, крон,全文搜索 — всё это нужно для пары тысяч md-файлов.

Samba победила простотой. Десять строк конфига, пять минут на клиенте, и всё работает годами без обслуживания.

### Безопасность

Samba без настроек безопасности — это открытый доступ к твоим заметкам из любой точки локальной сети. Я сделал две вещи:

Во-первых, выключил гостевой доступ на уровне контейнера: флаг -p не передавал, а шару настроил через -s "obsidian;/obsidian;no;no;no" — без гостевого доступа вообще, только по паролю. Если кто-то подключится к моей Wi-Fi сети, шару он не увидит без учётки.

Во-вторых, повесил iptables-правило, которое разрешает SMB только из моего сегмента сети (192.168.0.0/24). Лишняя предосторожность, но спокойнее:

iptables -A INPUT -p tcp --dport 445 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j DROP

Для домашней сети — более чем достаточно. Если бы сервер торчал наружу, пришлось бы городить VPN (WireGuard, Tailscale), но в локальной сети эти меры избыточны, хотя и не вредят.

### Итог

Диск шарится по SMB, Obsidian на Windows открывает vault с Z:, заметки синхронизированы между двумя машинами. Никаких облаков, никакой ежемесячной платы. Весь трафик — локальный, по гигабитной сети, никакие провайдеры не смотрят, что я пишу.

Сейчас у меня в Obsidian около 1500 заметок: daily notes, чеки для сервера, черновики статей для блога, ссылки, тудушки. Samba справляется без нареканий уже второй месяц. Единственное, что я бы посоветовал — не забудь про бекапы. Samba не версионирует файлы, диск может умереть, контейнер может сломаться. Бекап поверх SMB — не роскошь, а необходимость.

Если у тебя дома есть сервер и ты пользуешься Obsidian — попробуй Samba. Десять минут настройки, и ты забываешь про синхронизацию как проблему. Ну и бекапы не забывай.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *