아키텍처 — Star Topology
✅ 라이브 (서버)
vault_* / sync_* 도구는 api.ainote.dev 서버에서 동작합니다 — JSON-RPC POST /api/mcp 또는 @ainote/sdk (ai.vault.* / ai.sync.*)로 호출하세요. (일부 vault 도구는 연결된 git-backed vault가 필요. 참고: @ainote/mcp npm 패키지 구버전엔 번들이 안 됐을 수 있으니 직접 JSON-RPC 또는 SDK 사용 권장.)
ainote sync 는 hub-and-spoke (별 모양). P2P (디바이스끼리 직접) 안 함.
그림
┌────────────────────┐
│ ainote hub │
│ api.ainote.dev │
│ (PostgreSQL+Git) │
└─────────┬──────────┘
│
┌──────────────┬───────┼───────┬──────────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
[macmini] [macbook] [iOS] [iPad] [linux desktop]
spoke 1 spoke 2 s.3 s.4 s.5각 spoke 는 hub 와만 sync. spoke ↔ spoke 직접 X.
왜 P2P 가 아닌가
"If you are bisyncing more than two devices, set them up in a star topology — each spoke synced with the same hub consistently. Never device-to-device."
이유:
- N 개 디바이스 → P2P 페어 N(N-1)/2 (3개 → 3, 5개 → 10, 10개 → 45)
- 모든 페어가 충돌 가능 → 디버깅 불가능
- Star: N 개 → N 페어. 모든 충돌이 hub 에서 한 곳에서
hub 의 역할
┌────────────────────────────────────────────────┐
│ ainote hub │
├────────────────────────────────────────────────┤
│ 1. 모든 변경 (commit + HLC) 단일 진실 저장 │
│ 2. spoke 의 last_known_state 추적 │
│ 3. 충돌 감지 (5분 임계) │
│ 4. 모든 spoke 에 push 알림 (FCM/APNs/WebSocket) │
│ 5. 부분 sync — manifest 기준 필터 │
│ 6. WORM audit log (변경 이력 영구) │
└────────────────────────────────────────────────┘spoke 의 역할
┌────────────────────────────────────────────────┐
│ spoke (디바이스) │
├────────────────────────────────────────────────┤
│ 1. 로컬 manifest.yml — 어떤 파일을 어디로 │
│ 2. state.json — 마지막 sync 상태 │
│ 3. sync-now.sh — 수동 sync 트리거 │
│ 4. conflicts/ — 5분 임계 깨면 양쪽 보존 │
│ 5. log/*.jsonl — 월별 이벤트 로그 (append-only) │
└────────────────────────────────────────────────┘자세히: manifest.yml 작성, sync-now 알고리즘.
한 사이클
[spoke A 변경] [hub] [spoke B]
│ │ │
│ sync_push │ │
├───────────────────►│ │
│ │ WebSocket notify │
│ ├─────────────────────►│
│ │ │
│ │ sync_pull │
│ │◄─────────────────────┤
│ │ │
│ │ 변경 전송 │
│ ├─────────────────────►│평균 지연: 1초 (WebSocket) ~ 30초 (cron).
페일오버
hub 다운 시:
- spoke 는 로컬 작업 계속
- 변경은 로컬 log/jsonl 에 누적
- hub 복구 시 일괄 push
hub 데이터 손실 시:
- 모든 spoke 의 git working tree 가 백업
- spoke 1대를 새 hub 으로 promote 가능
새 디바이스 추가
1. 새 기기에 manifest.yml + device.id 생성
2. ainote sync_pull --initial
3. hub 의 모든 sync 항목 다운로드
4. state.json 초기화
5. 정상 sync 사이클 시작자세히: 새 디바이스 셋업.