Vault Sync (WebDAV)¶
Slice 12 — operator guide for the Obsidian vault and its WebDAV sync channel. See
docs/domain/memory-vault.mdfor the narrative anddocs/reference-specs/memory-vault-spec.mdfor the design spec.
Overview¶
The vault lives on the homelab NVMe at ${DONNA_VAULT_PATH} (default
/donna/vault) and is exposed over WebDAV by a dedicated Caddy
container (donna-vault). The existing Cloudflare tunnel (configured
out-of-repo on the homelab) proxies the public hostname to Caddy on
port 8500.
Both human edits (over WebDAV) and agent writes (via VaultWriter)
land in the same on-disk git repo, so history reflects both.
Bring-up¶
- Create the host directory and make sure the user running Docker can write it:
- Set environment variables in
docker/.env: Generate the password hash without leaving plaintext on disk: - Copy the Caddyfile: Adjust if you need a different listen port or a non-default vault mount path.
- Start the service:
- Verify WebDAV:
- Restart the orchestrator so it picks up the vault mount and the new tools register into the skill system:
Obsidian client setup¶
Desktop (macOS / Windows / Linux)¶
Recommended: the official Remotely Save or Remotely Sync community plugin, configured for "WebDAV (HTTP)" with:
- Server:
https://vault.houseoffeuer.com/(or the directhttp://<homelab-host>:8500/inside the LAN). - Username: value of
CADDY_VAULT_USER. - Password: the plaintext you hashed in step 2.
- Root: empty (the full bucket is the vault root).
Obsidian's built-in Sync is a paid product and is not required.
Mobile (iOS / Android)¶
The same Remotely Save plugin works in Obsidian mobile. On first run, point it at the HTTPS URL and enable "Sync on start" + "Sync on exit".
Safety notes¶
- The WebDAV endpoint is not exposed to the public internet except
via the existing Cloudflare tunnel — the Caddy container binds to
8500on the host only. - Basic-auth credentials are stored as a bcrypt hash; rotate them by regenerating the hash and restarting the container.
- All writes made over WebDAV are captured by the git repo on the next agent write that touches the same file. To guarantee history for pure-human edits, run a periodic commit via cron on the host (not required for slice 12, but useful in day-to-day ops).
Troubleshooting¶
| Symptom | Likely cause |
|---|---|
403 Forbidden on PROPFIND |
Basic-auth creds wrong or hash not set. |
404 Not Found on every path |
Bind mount points at the wrong host dir. |
| Obsidian "Remotely Save" fails with TLS error | Cloudflare tunnel not proxying vault.*; use LAN HTTP URL. |
Agent writes fail with vault_root_parent_missing |
DONNA_VAULT_PATH's parent does not exist on the orchestrator host — create it and restart the orchestrator. |