# Multi-Tenancy & Isolasi Synapse bersifat multi-tenant: beberapa pengguna, masing-masing dengan beberapa mind, sepenuhnya terisolasi satu sama lain. Halaman ini menjelaskan model isolasi. ## Hierarki Tenant ``` Synapse Instance │ ├── User Account 1 (email: alice@example.com) │ ├── Mind A (Mind Key mk_aaa...) │ │ ├── Memories (only accessible via mk_aaa...) │ │ ├── Tasks │ │ └── Chat │ └── Mind B (Mind Key mk_bbb...) │ └── ... (isolated from Mind A) │ ├── User Account 2 (email: bob@example.com) │ └── Mind C (Mind Key mk_ccc...) │ └── ... (isolated from Alice's minds) │ └── ... (more users) ``` ## Level Isolasi ### Level 1: Isolasi Pengguna Setiap akun pengguna terisolasi. Alice tidak dapat: - Melihat mind Bob - Mengakses memori Bob (bahkan dengan JWT miliknya) - Mendaftar info akun Bob Diterapkan oleh: kolom `user_id` di semua tabel, JWT berisi `user_id`, semua kueri memfilter berdasarkan `user_id`. ### Level 2: Isolasi Mind Dalam satu pengguna, setiap mind terisolasi. Mind A tidak dapat: - Melihat memori Mind B - Mengakses tugas, chat, skrip Mind B Diterapkan oleh: kolom `mind_id` di semua tabel data, Mind Key berisi `mind_id`, semua kueri memfilter berdasarkan `mind_id`. > [!CRITICAL] > Isolasi Mind Key adalah batasan keamanan utama. Mind Key yang bocor > memberikan akses penuh ke data mind tersebut — tetapi HANYA mind itu. ## Token Autentikasi | Token | Cakupan | Apa yang dapat diakses | |-------|-------|-------------------| | Mind Key | Satu mind | Hanya data mind tersebut | | JWT | Akun pengguna | Manajemen akun (buat/daftar/hapus mind) | | Computer Token | Satu komputer | Perintah komputer tersebut | ## Akses Lintas-Mind ### Dalam pengguna yang sama Pengguna dapat mengakses semua mind mereka melalui JWT (mis. `GET /minds` mendaftar semua). Tetapi untuk membaca/menulis data memori, mereka memerlukan Mind Key spesifik. ### Antar pengguna Pengguna tidak dapat mengakses data satu sama lain — KECUALI mereka secara eksplisit berbagi mind melalui Sharing API: ```bash # Alice shares Mind A with Bob curl -X POST https://synapse.schaefer.zone/sharing \ -H "Authorization: Bearer ALICE_JWT" \ -d '{"mind_id": "m_aaa", "email": "bob@example.com", "role": "read"}' ``` Setelah dibagikan, Bob dapat mengakses Mind A melalui JWT miliknya (read-only jika `role=read`). ## Batasan Keamanan ``` ┌─────────────────────────────────────────────────┐ │ Synapse Instance │ │ ┌─────────────────────────────────────────┐ │ │ │ User Account Boundary │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ Mind Bound. │ │ Mind Bound. │ │ │ │ │ │ (Mind Key) │ │ (Mind Key) │ │ │ │ │ │ │ │ │ │ │ │ │ │ Memories │ │ Memories │ │ │ │ │ │ Tasks │ │ Tasks │ │ │ │ │ │ Chat │ │ Chat │ │ │ │ │ │ Scripts │ │ Scripts │ │ │ │ │ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ ``` ## Pola Multi-Tenancy Umum ### Pola 1: Satu Pengguna, Satu Mind Paling umum untuk pengguna agen LLM individu. - 1 akun pengguna - 1 mind - 1 Mind Key - Semua memori dalam satu cakupan ### Pola 2: Satu Pengguna, Beberapa Mind Untuk pengguna dengan beberapa konteks (kerja, pribadi, proyek). - 1 akun pengguna - N mind (mis. "kerja", "pribadi", "proyek-x") - N Mind Key - Setiap sesi LLM menggunakan satu Mind Key ### Pola 3: Mind Tim Bersama Untuk tim yang berkolaborasi dalam suatu proyek. - 1 pengguna membuat mind (mendapatkan Mind Key) - Pembuat berbagi dengan anggota tim melalui JWT - Semua anggota tim mengakses melalui JWT (atau Mind Key bersama) > [!WARNING] > Berbagi Mind Key memberikan akses baca/tulis penuh. Untuk kolaborasi tim, > lebih baik gunakan Sharing API (berbasis JWT) daripada berbagi Mind Key secara langsung. ### Pola 4: Penyedia SaaS Untuk aplikasi yang menyematkan Synapse sebagai lapisan memori mereka. - Setiap pelanggan = 1 akun pengguna - Setiap proyek pelanggan = 1 mind - Aplikasi menyimpan Mind Key per pelanggan/proyek - Isolasi penuh antar pelanggan ## Verifikasi Isolasi ### Tes: Mind Key tidak dapat mengakses mind lain ```bash # Mind A's key cannot read Mind B's memories curl -H "Authorization: Bearer mk_aaa..." \ "https://synapse.schaefer.zone/memory/search?q=test" # Returns only Mind A's memories curl -H "Authorization: Bearer mk_bbb..." \ "https://synapse.schaefer.zone/memory/search?q=test" # Returns only Mind B's memories (different results) ``` ### Tes: JWT tidak dapat membaca data memori langsung ```bash # JWT can list minds curl -H "Authorization: Bearer YOUR_JWT" \ https://synapse.schaefer.zone/minds # Returns: list of minds # JWT CANNOT read memories (need Mind Key) curl -H "Authorization: Bearer YOUR_JWT" \ https://synapse.schaefer.zone/memory/recall # Returns: 401 Unauthorized ``` ## Praktik Terbaik > [!TIP] > - **Gunakan satu mind per proyek/konteks** — isolasi adalah teman Anda > - **Jangan pernah berbagi Mind Key** — gunakan Sharing API sebagai gantinya > - **Rotasi Mind Key** jika terkompromi (hapus mind, buat baru) > - **Audit mind yang dibagikan** — tinjau `GET /sharing` secara berkala > - **Gunakan JWT untuk UI manusia** — jangan pernah mengekspos Mind Key ke pengguna akhir ## Langkah Berikutnya - [Autentikasi](/docs/getting-started/authentication) - [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt) - [Arsitektur](/docs/concepts/architecture)