Linux 02 Październik 2026

Vault Obsidiana wprost z Dropboxa (rclone mount) — alias albo usługa systemd

Dostępne też w:

Vault Obsidiana trzymam w Dropboxie, ale bez klienta Dropboxa. Zamiast synchronizować kilkadziesiąt gigabajtów na dysk laptopa, montuję folder z chmury jako katalog i otwieram go w Obsidianie. Robi to rclone mount przez FUSE — jedna komenda, zero demona synchronizacji, zero kopii lokalnej.

Ten post opisuje dwa warianty: alias (prostszy, ręczny) i usługę systemd użytkownika (montuje się sama, wstaje po padzie).

Jak to działa

Dropbox (chmura)
   └── folder /Obsidian  (w korzeniu konta)
         │
         │  rclone: remote "Obsidian", typ dropbox, token OAuth
         │  rclone mount  →  FUSE (fuse3 / fusermount3)
         ▼
   ~/Obsidian            ← punkt montowania (system plików fuse.rclone)
         │
         ▼
   Obsidian otwiera ten katalog jako vault

Kilka konsekwencji tej architektury, o których warto wiedzieć przed wdrożeniem:

  • Nie ma kopii lokalnej. Pliki są czytane i zapisywane przez sieć na żywo. Po odmontowaniu ~/Obsidian jest pustym katalogiem, a Obsidian nie zobaczy żadnej notatki.
  • Klient Dropboxa nie bierze w tym udziału. Nie musi być zainstalowany.
  • Bez sieci nie ma vaulta. To główny minus względem klasycznej synchronizacji — offline pracować się nie da.
  • Duże pliki i załączniki będą wolniejsze. Każde otwarcie to round-trip do Dropboxa.
  • Vault można współdzielić z innymi urządzeniami przez ten sam folder w Dropboxie, ale wtedy pojawiają się pliki konfliktowe (o tym w sekcji o problemach).

Kluczowa flaga to --vfs-cache-mode writes. Rclone buforuje wtedy zapisy lokalnie (w ~/.cache/rclone/vfs/) i dopiero potem wysyła je do chmury. Bez niej Obsidian się wysypuje — otwiera pliki do zapisu i modyfikuje je losowo, czego tryb domyślny nie obsługuje.

Co zainstalować

rclone i fuse

sudo apt install -y rclone, fuse3

Fuse na 26.04 praktycznie zawsze już jest. Potrzebne binarki (fusermount3, fusermount) przychodzą razem z fuse3.

Obsidian — bierz .deb, nie AppImage

# pobierz aktualny .deb z https://obsidian.md/download , potem (zwróć uwagę na "./"):
sudo apt install ./obsidian_*_amd64.deb

apt install ./plik.deb, a nie dpkg -i — apt sam dociągnie zależności (m.in. libxss1), zamiast zostawić pakiet w stanie half-configured i wymagać ratunkowego sudo apt -f install.

Pułapka: AppImage Obsidiana na 26.04

Nie używaj go, z dwóch niezależnych powodów:

  1. AppImage Obsidiana jest zbudowany pod FUSE 2, a 26.04 dostarcza FUSE 3 — może się w ogóle nie uruchomić.
  2. Od Ubuntu 24.04 obowiązuje kernel.apparmor_restrict_unprivileged_userns=1, co wywala sandbox Electrona w AppImage'ach (błąd The SUID sandbox helper binary was found, but is not configured correctly).

Obejścia krążące po internecie (--no-sandbox, sysctl …userns=0, chmod 4755 chrome-sandbox) osłabiają bezpieczeństwo całego systemu. Wersja .deb jest wolna od obu problemów — dostarcza własny profil AppArmor, który system ładuje automatycznie przy instalacji, i nie potrzebuje żadnych sztuczek.

Czego nie trzeba: klienta Dropboxa, nautilus-dropbox (rozszerzenie GNOME, na Plasmie bezużyteczne), bindfs, sshfs, davfs2, żadnej warstwy crypt w rclone.


Konfiguracja rclone

Cała konfiguracja to jeden remote w ~/.config/rclone/rclone.conf:

[Obsidian]
type = dropbox
token = <długi JSON z tokenem OAuth>

Nazwę remote'u ustaw świadomie — jest case-sensitive i będzie się do niej odwoływać i alias, i usługa. U mnie to Obsidian (wielka litera).

Od zera

rclone config

Odpowiedzi w kreatorze:

Pytanie Odpowiedź
n/s/q> n (new remote)
name> Obsidian
Storage> dropbox
client_id> (Enter — puste)
client_secret> (Enter — puste)
Edit advanced config? n
Use web browser to automatically authenticate? y
potwierdzenie y (keep this remote) → q (quit)

Puste client_id/client_secret oznaczają, że używasz wbudowanego, współdzielonego app ID rclone. Plus: nic nie musisz zakładać w Dropbox App Console. Minus: współdzielony app ID bywa rate-limitowany przez Dropboxa przy dużym ruchu — co wraca w sekcji o Baloo.

Autoryzację przeprowadź w graficznej sesji swojego użytkownika, nie przez sudo — inaczej token wyląduje w /root/.config/rclone/rclone.conf.

Jak wygląda callback OAuth

Rclone podnosi lokalny serwer na http://127.0.0.1:53682/ i próbuje otworzyć go w domyślnej przeglądarce przez xdg-open. Jeśli okno nie otworzy się samo (bywa tak przy Firefoksie ze snapa, który ma ograniczony dostęp do /tmp i localhostu), nie panikuj — rclone wypisze URL na konsoli. Skopiuj go i wklej do przeglądarki ręcznie, autoryzacja zadziała identycznie. Jeśli callback zostaje odrzucony, zrób autoryzację w przeglądarce niesnapowej albo trybem headless (rclone authorize "dropbox" na innej maszynie).

Bez GUI w ogóle — kreator sam podpowie ścieżkę headless.

Przeniesienie ze starej maszyny

Mój przypadek to przeniesienie ze starego lapka na nowy, więc mogłem wybrać szybką opcje, bo pomija OAuth:

mkdir -p ~/.config/rclone
# skopiuj rclone.conf ze starej maszyny (scp / zaszyfrowany nośnik), potem:
chmod 600 ~/.config/rclone/rclone.conf

⚠️ Pole token to poświadczenie OAuth dające pełny dostęp do Twojego konta Dropbox. Traktuj jak hasło: nie wysyłaj mailem, nie wklejaj do czatów, ticketów ani repozytoriów, nie wrzucaj do gita. Przenoś przez scp po SSH albo na zaszyfrowanym nośniku i po skopiowaniu ustaw chmod 600.

Jeśli po przeniesieniu rclone zgłosi token expired, invalid_grant albo HTTP 401 — odśwież autoryzację bez utraty resztek konfiguracji:

rclone config reconnect Obsidian:

Sprawdzenie, że remote w ogóle istnieje:

rclone listremotes        # oczekiwane: Obsidian:
rclone about Obsidian:    # powinno pokazać Total / Used / Free

Sposób 1: alias w ~/.bash_aliases

Wersja, na której jechałem dość długo. Ma tę zaletę, że katalog nie jest podmontowany, jeśli go nie potrzebujesz.
Cała „magia" to jedna linia:

alias mnt_obsidian="nohup rclone mount Obsidian:Obsidian ~/Obsidian/ --vfs-cache-mode writes &"

Dopisz ją do ~/.bash_aliases i przeładuj shell. Rozbiór składowych:

  • nohup … & — puszcza rclone w tle i odczepia od terminala, żeby mount przeżył zamknięcie okna. Ubocznym efektem jest plik-śmieć ~/nohup.out w katalogu domowym.
  • Obsidian:Obsidian — remote Obsidian, a w nim podfolder Obsidian. Pierwszy człon to nazwa remote'u, drugi to ścieżka w chmurze. Chcąc zamontować cały korzeń konta, wpisz po prostu Obsidian:.
  • ~/Obsidian/ — punkt montowania.

Odmontowanie:

fusermount3 -u ~/Obsidian

Zalety: dwie minuty roboty, zero plików systemowych, montujesz tylko wtedy, gdy naprawdę chcesz.

Wady: po każdym restarcie trzeba wpisać komendę ręcznie. Jak proces padnie (suspend, zerwana sieć), nikt go nie podniesie


Sposób 2: usługa systemd użytkownika

Na nowym laptopie przesiadłem się na to i żałuję tylko tego, że nie zrobiłem tego wcześniej, bo korzystam z Obsydiana często. Mount wstaje sam po zalogowaniu i sam się restartuje po wywrotce.

Gotowy plik unitu leży w snippecie na Bitbuckecie jako rclone-obsidian.service. Zapisz go jako ~/.config/systemd/user/rclone-obsidian.service — to unit użytkownika, nie systemowy. Wszystkie istotne dyrektywy omawiam zaraz niżej, więc nie musisz go czytać w ciemno.

Aktywacja:

systemctl --user daemon-reload
systemctl --user enable --now rclone-obsidian.service
systemctl --user status rclone-obsidian.service

To ostatnie polecenie od razu powie Ci, czy działa. W poprawnym stanie zobaczysz Active: active (running), a w linii Status: bieżący stan cache'u VFS, wprost od rclone — łącznie z liczbą plików czekających na wysłanie do Dropboxa.

Podgląd logów na żywo:

journalctl --user -u rclone-obsidian.service -f

Co tu jest ważne

Type=notify. Rclone obsługuje sd-notify, więc sam mówi systemd „jestem gotowy" dopiero po faktycznym zamontowaniu. Dzięki temu usługi zależne od vaulta nie wystartują za wcześnie i nie zobaczą pustego katalogu. Działa to również w rclone 1.60.1 z apt.

%h zamiast ~. Systemd nie rozwija tyldy. %h to specyfikator, który podstawia katalog domowy użytkownika — dzięki niemu ten sam plik unitu jest przenośny między maszynami i kontami.

Ścieżka absolutna do binarki. Systemd nie korzysta z PATH tak jak shell. Wybór wariantu instalacji rclone przekłada się wprost na ExecStart:

Instalacja rclone ExecStart
apt (Wariant A) /usr/bin/rclone
instalator rclone.org (Wariant B) /usr/local/bin/rclone

Sprawdź swoją przez command -v rclone i wstaw dokładnie tę wartość. Analogicznie fusermount3 — na 26.04 /bin to symlink do /usr/bin, więc oba zapisy działają, ale zweryfikuj przez command -v fusermount3.

Restart=on-failure + RestartSec=10. Tego właśnie brakuje w wariancie z aliasem: gdy rclone padnie na zerwanej sieci, systemd podniesie go po dziesięciu sekundach.

ExecStop z fusermount3 -u. Bez tego przy zatrzymaniu usługi w kernelu zostałby martwy wpis mounta, a ls ~/Obsidian witałoby Cię Transport endpoint is not connected.

Montowanie bez logowania do sesji graficznej

Domyślnie usługi użytkownika startują przy logowaniu i giną przy wylogowaniu. Jeśli mount ma żyć niezależnie od sesji (np. żeby był dostępny przez SSH po restarcie), włącz linger:

sudo loginctl enable-linger $USER

Sam tego nie włączyłem — vault potrzebuję tylko wtedy, gdy siedzę przy zalogowanym pulpicie.

Alias a usługa — nie łącz ich

Kiedy usługa jest włączona, alias przestaje być potrzebny i zaczyna szkodzić: próba mnt_obsidian na już zamontowanym katalogu skończy się błędem o niepustym mountpoincie.

Który wariant wybrać

Alias Usługa systemd
Montuje się po restarcie ręcznie automatycznie
Wstaje po padzie procesu nie tak (Restart=on-failure)
Logi nohup.out / brak journalctl --user -u …
Działa poza sesją graficzną nie tak (z enable-linger)
Nakład pracy jedna linia jeden plik + enable
Kontrola „montuję, gdy chcę" pełna trzeba stop/disable

Alias broni się, jeśli vault otwierasz od czasu do czasu i wolisz mieć świadomą kontrolę. Do codziennej pracy usługa jest wyraźnie lepsza.


KDE: wyłącz indeksowanie mounta w Baloo

To najważniejsza różnica między GNOME a KDE w całej tej konfiguracji i pierwsza rzecz do zrobienia po zamontowaniu.

Plasma uruchamia w tle indeksator plików Baloo, który domyślnie indeksuje cały $HOME. Ponieważ ~/Obsidian leży wewnątrz $HOME, Baloo potraktuje go jak zwykły katalog lokalny i zacznie przeczesywać cały vault przez sieć — czytając każdy plik, żeby zaindeksować treść. Efekty:

  • ciągły, niepotrzebny transfer z Dropboxa (przy vaulcie liczonym w dziesiątkach GB to bardzo dużo danych),
  • puchnący cache VFS w ~/.cache/rclone/,
  • ospały mount i procesy baloo_file_extractor żrące CPU,
  • w skrajnym przypadku rate-limiting po stronie Dropboxa (tym łatwiejszy, że app ID rclone jest współdzielony).

Na GNOME problem w tej formie nie występował, więc łatwo się na to nadziać właśnie przy migracji.

# Plasma 6 → balooctl6 (na Plasmie 5 binarka nazywa się balooctl)
balooctl6 config add excludeFolders ~/Obsidian
balooctl6 disable && balooctl6 enable      # przeładowanie konfiguracji

# sprawdzenie:
balooctl6 config list excludeFolders
balooctl6 status

Poprawny wynik:

excludeFolders:
    /home/sarniak/Obsidian/

Jeśli nie ma ani balooctl6, ani balooctl — Baloo nie jest zainstalowany i temat Cię nie dotyczy. Alternatywnie przez GUI: Ustawienia systemowe → Wyszukiwanie → Wyszukiwanie plików → dodaj ~/Obsidian i przestaw na „Nieindeksowany". Można też wyłączyć indeksowanie plików w ogóle (balooctl6 disable), jeśli nie korzystasz z wyszukiwania w KRunnerze i Dolphinie.


Podpięcie vaulta w Obsidianie

Uruchom Obsidiana po zamontowaniu i w oknie powitalnym wybierz „Open folder as vault" → ~/Obsidian.

Kolejność ma znaczenie podwójnie: montuj przed startem Obsidiana, a wykluczenie z Baloo zrób przed pierwszym dłuższym otwarciem vaulta — inaczej indeksator zacznie ściągać wszystko w tle, jeszcze zanim zauważysz problem.

Wtyczek, motywów ani ustawień nie trzeba przenosić. Siedzą w ~/Obsidian/.obsidian/, czyli wewnątrz vaulta, czyli w Dropboxie — przyjadą same razem z zamontowaniem remote'u.


Weryfikacja

Wszystkie kontrole zebrałem w skrypcie obsidian-mount-check.sh w tym samym snippecie na Bitbuckecie. Uruchom go po zamontowaniu:

./obsidian-mount-check.sh

Skrypt niczego nie zmienia, nie potrzebuje sudo i kończy się kodem zero tylko wtedy, gdy przejdzie wszystkie dziesięć kontroli: obecność rclone, istnienie remote'u, odpowiedź z Dropboxa (co wyłapuje też wygasły token), katalog montowania, wpis mounta w kernelu, żywy proces rclone, niepustą zawartość vaulta, stan unitu systemd oraz dwie kontrole specyficzne dla KDE i Debiana — wykluczenie vaulta z Baloo i to, czy Obsidian pochodzi z .deb, a nie z AppImage'a. Na innych systemach te dwie ostatnie raportują „nie dotyczy" zamiast zgłaszać błąd.

Gdybyś wolał sprawdzić to ręcznie, sedno siedzi w czterech rzeczach: typ fuse.rclone dla katalogu vaulta, sensowny rozmiar w df, żywy proces rclone mount i widoczne notatki po ls. Jeśli wszystkie cztery się zgadzają — działa.


Typowe problemy

Wolne działanie, przycinanie na dużych plikach

Częściowo wpisane w architekturę — pliki lecą przez sieć, a --vfs-cache-mode writes cache'uje tylko zapisy. Na KDE najpierw sprawdź jednak Baloo i Dolphina (niżej), bo to zwykle one są winowajcą, a nie same flagi rclone. Jeśli to nie to, warto rozważyć:

  • --vfs-cache-mode full — cache'uje też odczyty; ponowne otwieranie plików jest znacznie szybsze, ale zużywa miejsce w ~/.cache/rclone/,
  • --dir-cache-time 24h — rzadsze odpytywanie o listing katalogów,
  • --poll-interval 15s — jak szybko mount zauważa zmiany zrobione z innego urządzenia.

KDE: nieustanny transfer i baloo_file_extractor na CPU

Baloo indeksuje mount — wróć do sekcji o Baloo. Diagnostyka:

balooctl6 status
ps -ef | grep [b]aloo
balooctl6 config list excludeFolders

Ograniczenia (świadome kompromisy)

  • Bez sieci nie ma vaulta. To fundamentalna różnica względem klienta Dropboxa czy Obsidian Sync, które trzymają kopię lokalną. Jeśli notatki potrzebujesz w pociągu, to nie jest konfiguracja dla Ciebie.
  • Dane w chmurze leżą niezaszyfrowane. Można to zmienić, dokładając remote typu crypt, ale wtedy tracisz możliwość czytania notatek przez webowy interfejs Dropboxa i z urządzeń bez rclone.
  • Token OAuth w rclone.conf to pełny dostęp do konta. Plik z uprawnieniami 600 to minimum; token bywa unieważniany przez zmianę hasła Dropboxa albo odebranie dostępu aplikacji, więc miej pod ręką rclone config reconnect.
  • Współdzielony app ID rclone bywa rate-limitowany. Przy dużym ruchu warto założyć własną aplikację w Dropbox App Console i wpisać client_id/client_secret.
  • Rclone z apt jest stary. Na Ubuntu 26.04 dalej 1.60.1. Nowszy upstream ma sporo poprawek właśnie w mount/VFS.

Podsumowanie

Cały mechanizm to jedna komenda rclone mount i jeden remote w konfiguracji rclone. Alias w ~/.bash_aliases wystarcza na start i jest w zasadzie darmowy, ale po każdym restarcie przypomina o swoim istnieniu. Usługa systemd użytkownika to jeden plik więcej i jedno enable — w zamian mount pojawia się sam, sam się restartuje po padzie i loguje się do journala, gdzie da się sprawdzić, co poszło nie tak.

Jeśli robisz to na KDE, dwie rzeczy zrób od razu, bo inaczej stracisz na nich pół dnia: wyklucz vault z indeksowania Baloo i weź Obsidiana z .deb, nie z AppImage'a.

Szybka ściąga

Krok Polecenie
Instalacja sudo apt install -y rclone fuse3
Konfiguracja remote'u rclone config (typ dropbox, nazwa Obsidian)
Punkt montowania mkdir -p ~/Obsidian
Mount ręczny rclone mount Obsidian:Obsidian ~/Obsidian/ --vfs-cache-mode writes &
Odmontowanie fusermount3 -u ~/Obsidian
Usługa: włączenie systemctl --user enable --now rclone-obsidian.service
Usługa: stan i logi systemctl --user status rclone-obsidian / journalctl --user -u rclone-obsidian -f
Mount bez sesji graficznej sudo loginctl enable-linger $USER
KDE: wyklucz z Baloo balooctl6 config add excludeFolders ~/Obsidian
Ponowna autoryzacja rclone config reconnect Obsidian:
Weryfikacja mount \| grep rclone + df -h ~/Obsidian