2.0 KiB
WebDAV Migration & Sync Pipeline Fix — 2026-07-16
Change: s3fs → WebDAV as Obsidian Vault Source
Problem: The s3fs mount at /opt/hermes/obsidian-vault/ (via Garage S3 s3.nixg.ru) was empty — only . and .. in the directory, no actual files. sync_obsidian_to_wiki.py couldn't copy anything. C1 was blocked.
Diagnosis:
/etc/fstabhad s3fs entry pointing ats3.nixg.ru(Garage)mount | grep s3fsshowed the mount was active but directory contained 0 files/mnt/yandex-disk/(Yandex Disk via davfs2 WebDAV) had a workingobsidian/mozg/vault with 65 .md files
Fix: Changed OBSIDIAN_VAULT from /opt/hermes/obsidian-vault to /mnt/yandex-disk/obsidian/mozg/.
First run: 74 files copied in 44 seconds, 0 errors.
Blocker 2: sync → ingest chain broken
Symptom: The sync script finishes copying, then tries to call wiki_continuous_ingest.py with bare python3 — crashes with ModuleNotFoundError: No module named 'arq'.
Root cause: sync_obsidian_to_wiki.py line 162 does os.system(f"python3 {ingest_script}"). System python3 does NOT have arq (only installed in project .venv/).
Fix: Changed to /opt/hermes/memory-os/.venv/bin/python3 {ingest_script}.
Safety Guarantee
The user explicitly asked for protection against Hermes deleting files in their Obsidian vault. Confirmed:
- Code-level: sync_obsidian_to_wiki.py only reads source (via
os.walk()+copy2()). All deletions (unlink()) targetWIKI_TARGET, neverOBSIDIAN_VAULT. This was true before the change and remains true after. - Filesystem-level: davfs2 mounts with
file_mode=600— the user process itself can only write with explicit sudo. The sync script runs as userestorozhenko. - Memory-level: Added read-only guarantee to user profile.
Lesson: When the user expresses concern about data safety, (1) show code evidence that it's already safe, (2) add explicit protection in memory/skill, (3) explain trade-offs (read-only mount vs full POSIX) so they can make informed decisions.