Self-Hosted Obsidian Sync met CouchDB op Fedora 44
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:
- Download de laatste release van vrtmrz/obsidian-livesync — de bestanden
main.js,manifest.json, enstyles.css - Plaats ze in
.obsidian/plugins/obsidian-livesync/van je vault - Registreer de plugin in
.obsidian/community-plugins.json:["obsidian-livesync"] - 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
| Instelling | Effect |
|---|---|
| LiveSync | Continue synchronisatie (real-time) |
| Sync on Save | Sync na elke bestandsopslag |
| Periodic Replication | Periodieke sync (elke 60s) als fallback |
| Customization Sync | Deelt plugins, appearance, hotkeys tussen apparaten |
| Hidden File Sync | Synchroniseert .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.