78 lines
9.6 KiB
Markdown
78 lines
9.6 KiB
Markdown
---
|
||
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. При конфликте поведение такое же, как в Mac `~/scripts/sync-vault-lib.sh`: `git add -A`, commit `iPad: merge conflict — review needed`, затем обычный push. Маркеры конфликта с обеими версиями попадают в заметку; последующие ticks продолжают синк без ожидания ручного разрешения. Уже прерванный merge с unmerged files также коммитится и пушится на следующем запуске.
|
||
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 повторно прошли 2026-10-15: push локальной заметки, pull peer-заметки, сохранение offline edits/retry, commit/push маркеров с обеими версиями и получение другим clone, продолжение следующего синка, возобновление уже прерванного конфликтного merge. Лог на Mac `test-results-mac-conflicts.log`; fixtures retained `/var/mobile/Library/VaultSync/test-20261015T033520Z-12175`. Прежняя остановка на конфликте заменена поведением Mac-скрипта. Первый production manual sync завершился успешно, local/NAS main совпали `9bc1a2847ef2fce0172ecf1f9f6ae87db7c68920`. Production roundtrip и автоматический scheduler проверены; результаты ниже.
|
||
|
||
Исправленный script установлен атомарно после тестов; предыдущая версия сохранена на iPad как `sync-vault.sh.before-mac-conflicts-20261015`. Байты установленного файла сверены с host source: SHA256 `6db11b994888e3a523614fe30c56a5066ccceba51b3b1d6c44f3c0c437e0618f`. Запуск через существующий launchd завершился 2026-10-15T03:35:49Z, LastExitStatus0 / last-result ok, working tree чистый, local/NAS main `386ce6e9ee6651072279b6dc9a6eb01baebcfe64`. Evidence на Mac: `mac-conflicts-deploy-verification.log`. Расписание осталось каждые300с.
|
||
|
||
См. [[personal/how-to/ipad-ios935-build-deploy]].
|
||
|
||
## Проверка рабочего подключения
|
||
|
||
Первый запуск launchd от mobile завершился exit0; iPad создал эту заметку и отправил в NAS main commit `98b9dafcddf3dd6e4248619c25f434146c4035d5` (19:34:04 UTC 2026-10-14).
|
||
|
||
Контроль NAS→iPad: `ipad-vault-peer-check-20261015`. Эта строка добавлена через отдельный peer clone к NAS и получена iPad автоматическим tick в19:39:11UTC 2026-10-14.
|
||
|
||
Итог: **синк настроен и включён**. Первое автоматическое выполнение стартовало19:33:58UTC, завершилось19:34:04UTC; следующий tick без ручного запуска завершился19:39:11UTC. После второго tick local/NAS main равны `68eb11d85c2f956cc33253a4a2eba2f542dcaf0d`, контрольная peer-строка присутствует на iPad, LastExitStatus0 /last-result ok. Edhita screenshot подтверждает видимость Documents/ObsidianVault и сохранение example. Последующие server commits получаются очередным tick; равенство SHA проверяется на каждом успешном запуске.
|
||
|
||
Диагностические ограничения: NAS push сообщает ignored hooks/post-receive (не executable); фактическое обновление bare main и доставка Mac/iPad проверены, Gitea mirror отдельно не проверялся. Базовый dpkg сообщил отсутствующие file lists для старых unrar/gzip/p7zip; установка выбранных новых packages и native Git запуск успешны, чужие packages не ремонтировались.
|