Self-Hosted Obsidian Sync met CouchDB op Fedora 44

· 4 min lezen

Obsidian is een krachtige tool voor persoonlijke kennisbeheer, maar de officiële Obsidian Sync kost geld — €5/maand per gebruiker. Voor een paar euro aan serverkosten kun je hetzelfde bereiken met self-hosted CouchDB en de Self-hosted LiveSync plugin, mét als voordeel dat je volledige controle houdt over je data.

Dit artikel beschrijft hoe ik dit heb opgezet op mijn Fedora 44 server met SELinux enforcing, Docker, en Tailscale — en hoe een AI-agent (zoals die waarmee dit artikel is geschreven) het client-side deel kan automatiseren.

Waarom self-hosted?

De officiële Obsidian Sync is prima, maar:

  • Kosten: €5/maand per gebruiker
  • Geen controle: Jouw notities gaan naar Obsidian’s servers
  • Vendor lock-in: Je kunt niet makkelijk overstappen

Self-hosted geeft je:

  • Volledige eigendom van je data
  • Onbeperkt aantal apparaten en vaults
  • Real-time sync via CouchDB’s live replication
  • Geen maandelijkse kosten (alleen stroom en een server)

Server-side: CouchDB installatie

CouchDB in Docker

CouchDB zelf installeer ik via Docker. De officiële Apache RPM repo heeft geen Fedora 44 packages, maar Docker is schoner, beter te beheren, en werkt out-of-the-box met SELinux dankzij de :z volume mount flag.

docker run -d \
  --name couchdb \
  --restart always \
  -p 5984:5984 \
  -e COUCHDB_USER=obsidian-admin \
  -e COUCHDB_PASSWORD="<sterk-wachtwoord>" \
  -v /opt/couchdb/data:/opt/couchdb/data:z \
  -v /opt/couchdb/etc:/opt/couchdb/etc/local.d:z \
  couchdb:3

De CouchDB configuratie voor LiveSync (CORS, max document size, single node) schrijf ik direct naar 01-livesync.ini in de gemounte config directory, zodat het persistent is en niet afhankelijk van de /_node/ API endpoints.

Beveiliging via Tailscale

CouchDB luistert op poort 5984, maar die mag niet zomaar op het internet staan. De firewall configuratie:

# Blokkeer 5984 in de public zone
sudo firewall-cmd --permanent --zone=public --remove-port=5984/tcp

# Sta 5984 alleen toe in de trusted zone (Tailscale interface)
TS_IFACE=$(ip -o link show | awk -F": " '{print $2}' | grep -E '^tailscale|^ts')
sudo firewall-cmd --permanent --zone=trusted --add-interface="$TS_IFACE"
sudo firewall-cmd --permanent --zone=trusted --add-port=5984/tcp
sudo firewall-cmd --reload

Het resultaat: poort 5984 is alleen bereikbaar via het Tailscale netwerk. Geen open poorten naar internet, geen nginx reverse proxy nodig, geen TLS overhead. Tailscale versleutelt het verkeer al.

De verbinding wordt daardoor simpelweg:

http://[JOUW_TAILSCALE_HOSTNAME]:5984

Client-side: Obsidian LiveSync plugin

Handmatige installatie

Op de eerste workstation installeer ik de plugin handmatig:

  1. Download de laatste release van vrtmrz/obsidian-livesync — de bestanden main.js, manifest.json, en styles.css
  2. Plaats ze in .obsidian/plugins/obsidian-livesync/ van je vault
  3. Registreer de plugin in .obsidian/community-plugins.json:
    ["obsidian-livesync"]
    
  4. Herstart Obsidian en configureer de verbinding in de plugin instellingen

Vergeet niet oude sync plugins (zoals remotely-save) te verwijderen om conflicten te voorkomen.

QR Code voor Android

Op de desktopclient die al werkend is, open je Self-hosted LiveSync instellingen → Setup → Show QR code. De plugin genereert een QR code die de volledige configuratie bevat: URI, credentials, database naam, en sync instellingen.

Open dan Obsidian op Android, ga naar dezelfde plugin instellingen, en kies Setup → Scan QR code. Het apparaat wordt automatisch geconfigureerd en begint direct met synchroniseren.

Dit werkt ook via een Connection String (sls+ URI formaat) — handig als er geen camera beschikbaar is.

Automatiseren met een AI-agent

Het installeren en configureren van de LiveSync plugin is een herhalende taak, ideaal om te automatiseren met een AI-agent. Het prompt-bestand dat ik hiervoor heb geschreven beschrijft het complete stappenplan:

  • Vind de Obsidian vault
  • Download de plugin bestanden van GitHub
  • Valideer de CouchDB verbinding
  • Schrijf de configuratie (data.json) met credentials
  • Registreer de plugin
  • Verwijder oude sync plugins
  • Eindcontrole

Het volledige prompt-bestand is hier te downloaden en bevat alle stappen, verificaties en valkuilen die een AI-agent nodig heeft om dit zelfstandig uit te voeren op Linux, macOS, of Windows.

Veiligheid: Het prompt-bestand bevat strikte instructies over het omgaan met credentials — de agent mag ze nooit hardcoded achterlaten in logs, prompts of gedeelde bestanden.

Hoe het werkt

De Self-hosted LiveSync plugin gebruikt PouchDB aan de clientzijde als lokale database. Wijzigingen in je vault worden direct doorgestuurd naar de remote CouchDB via bidirectionele replicatie met een ingebouwde debounce van 200ms.

Sync instellingen

InstellingEffect
LiveSyncContinue synchronisatie (real-time)
Sync on SaveSync na elke bestandsopslag
Periodic ReplicationPeriodieke sync (elke 60s) als fallback
Customization SyncDeelt plugins, appearance, hotkeys tussen apparaten
Hidden File SyncSynchroniseert .obsidian interne bestanden

Conflicten worden automatisch opgelost door het nieuwste bestand te behouden (resolveConflictsByNewerFile: true).

Conclusie

Self-hosted Obsidian sync is technisch niet moeilijk, maar heeft wel wat haken en ogen — vooral rondom netwerkbeveiliging en client configuratie. Door Tailscale te gebruiken voor het netwerk vervalt de noodzaak voor een complexe reverse proxy met TLS, en door Docker voor CouchDB blijft de server setup schoon en herbruikbaar.

De QR code workflow maakt het toevoegen van nieuwe apparaten (Android, andere laptops) triviaal — scan en gaan. En voor de echte automation-liefhebber kan een AI-agent het hele client-side installatieproces overnemen met het juiste prompt-bestand.