From 98b9dafcddf3dd6e4248619c25f434146c4035d5 Mon Sep 17 00:00:00 2001 From: "iPad (Alexey)" Date: Thu, 15 Oct 2026 01:33:58 +0600 Subject: [PATCH] [2026-10-14] iPad: local note edits --- personal/how-to/ipad-vault-sync.md | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 personal/how-to/ipad-vault-sync.md diff --git a/personal/how-to/ipad-vault-sync.md b/personal/how-to/ipad-vault-sync.md new file mode 100644 index 00000000..8206b9cb --- /dev/null +++ b/personal/how-to/ipad-vault-sync.md @@ -0,0 +1,65 @@ +--- +title: iPad — Obsidian vault sync +created: '2026-10-15' +updated: '2026-10-15' +tags: [ipad, obsidian, git, sync, launchd] +--- +# iPad — Obsidian vault sync + +Метод: прямой двусторонний Git-синк с существующим bare repo TrueNAS по SSH. Выбран после проверки [[family/how-to/vault-git-sync]], [[family/how-to/obsidian-sync]], [[family/how-to/syncthing-truenas-android]] и [[family/how-to/obsidian-android-sync]]. Он использует тот же source of truth, что Mac; Syncthing/Gitea и синк внутри редактора не нужны этому клиенту. Новый доступ не меняет синк существующих устройств. + +Устройство: iPad mini1 `iPad2,5`, iOS9.3.5, jailbreak. Редактор — установленная Edhita2.3.0; в её файловом browser открыть **Documents → ObsidianVault**. Полный рабочий набор заметок клонирован неглубоко (depth1), чтобы не расходовать место на старую историю. Перед настройкой доступно335MB; после установки Git и clone —311MB. Ветка `main`, remote `nas`. + +## Пути + +- Vault: `/private/var/mobile/Containers/Data/Application/27C12C43-7961-4D13-815E-29FB11A9AE57/Documents/ObsidianVault`. +- Script: `/var/mobile/Library/VaultSync/sync-vault.sh`. +- Git SSH wrapper: `/var/mobile/Library/VaultSync/bin/git-ssh`. +- SSH config/pinned host key: `/var/mobile/Library/VaultSync/ssh/config`, `known_hosts`. +- Dedicated private key: `/var/mobile/Library/VaultSync/ssh/id_ed25519` — остаётся на iPad, владелец mobile, private directory700/key600. +- Log: `/var/mobile/Library/Logs/ipad-vault-sync.log` (bounded2MiB). +- State: `/var/mobile/Library/VaultSync/state/last-result`, `last-attempt`, `last-success`. +- LaunchDaemon: `/Library/LaunchDaemons/local.ipad.obsidian-vault-sync.plist`, label `local.ipad.obsidian-vault-sync`, UserName/GroupName mobile, RunAtLoad=true, StartInterval=300. +- NAS repo: `ssh://vault-nas/mnt/RED_2TB/storage/git/obsidian-vault.git`; SSH alias vault-nas = truenas_admin@mallexxx.duckdns.org:22. +- Host sources/evidence: `/Users/admin/Developer/ipad-vault-sync/`. + +Vault в Documents принадлежит редактору. При удалении приложения его данные могут удалиться; переустановка с новым container UUID требует обновить VAULT path. Background job требует активного jailbreak; после reboot iPad сначала восстановить jailbreak. Исполнение строго раз в пять минут во время сна устройства не гарантируется; очередной tick после возобновления/доступности сети доставит сохранённые локальные commits. + +## Git и доступ + +Установлены оригинальные Saurik packages: git2.8.1-5, curl7.33.0-9, expat2.0.1-3. Existing OpenSSL0.9.8 и OpenSSH6.7 не обновлялись. Package bytes сверены с MD5 опубликованного HTTPS Packages index; дополнительный SHA256 каждого download сохранён на Mac. Git2.8.1 реально запускается от mobile на iPad9.3.5. + +Отдельный Ed25519 client key iPad→NAS сохранён через TrueNAS user.update; прежние SSH keys/options сохранены. Для этого ключа разрешены только git-upload-pack и git-receive-pack exact `/mnt/RED_2TB/storage/git/obsidian-vault.git`; shell, PTY, port/agent/X11 forwarding запрещены. Guard на NAS: `/home/truenas_admin/.local/bin/ipad-vault-git`. Home dataset NAS noexec, поэтому forced command вызывает `/bin/sh guard`, а не исполняет файл напрямую. NAS host key закреплён из доверенного Mac known_hosts. Mac→iPad login key отдельно; private Mac key не копировался на устройство. + +## Поведение + +1. Один запуск за раз; stale task lock снимается после проверки PID/boot. +2. Local edits коммитятся до обращения к серверу. +3. Fetch main → обычный merge → push без force. +4. При unavailable remote локальные commits сохраняются, процесс возвращает75 и повторяет попытку на следующем tick. +5. При конфликте sync останавливается с кодом4; локальная версия сохранена в Git, conflicting merge не пушится. После ручного разрешения/commit следующий tick продолжит синк. +6. Успех отмечается только после совпадения local HEAD и remote main и отсутствия новых working-tree edits. core.fileMode=false; автоматический gc на маленьком flash отключён. + +Внешние изменения открытой заметки могут потребовать Reload/переоткрытия в Edhita. Скрипт не изменяет поведение редактора. + +## Проверка и обслуживание + +Ручной запуск на iPad от mobile: + +```sh +bash /var/mobile/Library/VaultSync/sync-vault.sh +cat /var/mobile/Library/VaultSync/state/last-success +cat /var/mobile/Library/VaultSync/state/last-result +``` + +От root через SSH: + +```sh +su mobile -c 'bash /var/mobile/Library/VaultSync/sync-vault.sh' +launchctl list local.ipad.obsidian-vault-sync +launchctl start local.ipad.obsidian-vault-sync +``` + +Изолированные тесты на настоящем Git2.8/Bash4 iPad прошли: push локальной заметки, pull peer-заметки, сохранение offline edits/retry, остановка на конфликте без изменения remote. Лог на Mac `test-results.log`; fixtures retained `/var/mobile/Library/VaultSync/test-20261014T192932Z-3600`. Первый production manual sync завершился успешно, local/NAS main совпали `9bc1a2847ef2fce0172ecf1f9f6ae87db7c68920`. Проверка production roundtrip и работающего scheduler записывается ниже после завершения. + +См. [[personal/how-to/ipad-ios935-build-deploy]].