Git jest niesamowity (gościnnie Obsidian + iCloud)
No więc mam sobie tego Obsidiana, w którym prowadzę praktycznie całe swoje życie cyfrowe. Ostatnio przeniosłem tam księgowość, dokumentację medyczną, a i rozważam rezygnację ze zbieractwa zdjęć w Immichu - nigdy nie przeglądam tych dziesiątek tysięcy zdjęć - i zamiast tego wrzucanie relacji z kilkoma wybranymi zdjęciami z ważnych dla mnie wydarzeń czy wyjazdów do dokumentu. Dużo lepiej się to przegląda, dużo łatwiej do tego wrócić. Obsidian ma nawet funkcję "prezentacja slajdów", która robi dobrą robotę np. na slajdowisko.
Jednym z zagadnień do ogarnięcia jest temat synchronizacji danych między urządzeniami. Chcę mieć dostęp do mojego skarbca zarówno na komputerze, gdzie pracuję i tworzę dokumenty, oraz na telefonie, gdzie następnie "konsumuję" te dokumenty - na przykład odhaczam zadania z listy zadań czy zakupy z listy zakupów. Ważnym tematem jest również kopia zapasowa, najlepiej zgodnie z zasadą 3-2-1 (trzy kopie, dwa urządzenia, jedno gdzie indziej).
Mój dotychczasowy system składał się z następujących komponentów:
- w Obsidianie zainstalowałem wtyczkę LiveSync, w której skonfigurowałem synchronizację do CouchDB
- instancję CouchDB miałem postawioną jako Dockerowy kontener wewnątrz maszyny wirtualnej z Debianem postawionej w Proxmoxie na moim domowym serwerze
- ponieważ wtyczka LiveSync narzekała na certyfikat SSL z podpisem własnym, wykonałem imponujący piruet, tworząc fejkowy certyfikat w domenie tej strony - więc z poprawną hierarchią i przedwstępnie zaufanym wystawcą - a następnie w moim wirtualnym routerze OPNsense postawionym na Proxmoxie wstawiłem przekierowanie, żeby adres, którego użyłem, leciał do kontenera, zamiast do internetów
- ponieważ taki system działał jedynie w mojej sieci domowej, w OPNsense dodałem również obsługę wirtualnej sieci prywatnej WireGuard, a następnie każde urządzenie, na którym chciałem używać Obsidiana, dodałem jako klient VPNa
- cały skarbiec wersjonowałem również w repozytorium Git, aczkolwiek pliki samego repozytorium leżały poza skarbcem, i LiveSync ich nie obejmował
- od czasu do czasu LiveSync kosmicznie się wywalał, więc jako osobny punkt dodaję tę całą pracę potrzebną do przywrócenia systemu do równowagi
Słuchajcie: to nie jest prosty system.
Na szczęście Obsidian oferuje dwie natywne opcje synchronizacji: Sync oraz iCloud. Obie te opcje twierdzą, ze są szyfrowane od końca do końca, dlatego wybrałem po prostu to, co już miałem - iCloud.
Teraz tak: ja już wcześniej używałem iClouda. Nie był najgorszy, ale w kontekście moich wymagań miał jedną fundamentalną wadę - synchronizowanie repozytorium Git w iCloudzie to jest KOSZMAR. Problemem jest prawdopodobnie to, w jaki sposób Git przechowuje zmiany - każda jest osobnym plikiem, ich tworzenie jest w pewnym sensie poza kontrolą; zapisujesz zmiany, i pliki "się robią". Osobiście mam nawyk zapisywania małych zmian bardzo często, i pewnie iCloud tego nie lubił. Poza tym, synchronizowanie repo w ogóle nie było mi potrzebne, mój ówczesny system z LiveSync tego w ogóle nie miał. Dlatego mam jasno postawiony cel: wracam do iClouda, ale tak, żeby repozytorium się nie synchronizowało.
Zacznijmy od samego niesynchronizowania. W iCloud działa to tak, że do nazwy pliku wystarczy dopisać .nosync, i folder po prostu się nie synchronizuje (źródło). Tworzę folder ObsidianRepo.nosync, w jego wnętrzu uruchamiam git init, repozytorium się tworzy, ale nie jest synchronizowane w iCloud - żyje jedynie na moim komputerze - doskonale.
Tylko "co teras?". Mam folder z repo (konkretnie to z folderem .git), który się nie synchronizuje, ale wszystkie inne pliki przecież powinny się synchronizować. Tutaj wchodzimy w magię Gita. Git pozwala na zmianę lokalizacji plików, które wersjonuje, przy użyciu mechanizmu worktree. Generalnie możesz powiedzieć Gitowi "to nie są pliki, których szukacie" i wskazać inny folder, za pomocą komendy albo wpisu w pliku config. Sposób, w jaki ja to zrobiłem, wygląda następująco:
- aplikacja Obsidian tworzy na iCloud swój "folder aplikacji", w którym przechowuje wszystkie pliki do synchronizacji
- w tym folderze tworzę folder
Obsidian.nosynci w nim inicjalizuję repozytorium - repo się nie synchronizuje ✅ - następnie do konfiguracji repo dopisuję
worktreeza pomocą komendygit config core.worktree ../..- od teraz cały "folder aplikacyjny" Obsidiana jest wersjonowany ✅ - to tyle, koniec
Rozwiązanie działa doskonale, teraz mogę wywalić i zapomnieć o utrzymywaniu: CouchDB, fejkowego certyfikatu oraz ręcznego przekierowania w OPNsense. Docker, Debian, Proxmox i OPNsense na razie zostają - ale kto wie, może wpadnę na kolejny pomysł, w którym będę rezygnował z kolejnej rzeczy, której się uczyłem przez poprzednie pół roku. Nie żałuję niczego 🐓.