{"title":"Multi-Tenancy & Isolasi","slug":"multi-tenancy","category":"concepts","summary":"Bagaimana Synapse mengisolasi data antar pengguna dan mind — batasan keamanan dijelaskan.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":526,"read_minutes":3,"lang":"id","translated":true,"requested_lang":"id","content_markdown":"\n# Multi-Tenancy & Isolasi\n\nSynapse bersifat multi-tenant: beberapa pengguna, masing-masing dengan beberapa\nmind, sepenuhnya terisolasi satu sama lain. Halaman ini menjelaskan model\nisolasi.\n\n## Hierarki Tenant\n\n```\nSynapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice's minds)\n  │\n  └── ... (more users)\n```\n\n## Level Isolasi\n\n### Level 1: Isolasi Pengguna\n\nSetiap akun pengguna terisolasi. Alice tidak dapat:\n\n- Melihat mind Bob\n- Mengakses memori Bob (bahkan dengan JWT miliknya)\n- Mendaftar info akun Bob\n\nDiterapkan oleh: kolom `user_id` di semua tabel, JWT berisi `user_id`, semua\nkueri memfilter berdasarkan `user_id`.\n\n### Level 2: Isolasi Mind\n\nDalam satu pengguna, setiap mind terisolasi. Mind A tidak dapat:\n\n- Melihat memori Mind B\n- Mengakses tugas, chat, skrip Mind B\n\nDiterapkan oleh: kolom `mind_id` di semua tabel data, Mind Key berisi `mind_id`,\nsemua kueri memfilter berdasarkan `mind_id`.\n\n> [!CRITICAL]\n> Isolasi Mind Key adalah batasan keamanan utama. Mind Key yang bocor\n> memberikan akses penuh ke data mind tersebut — tetapi HANYA mind itu.\n\n## Token Autentikasi\n\n| Token | Cakupan | Apa yang dapat diakses |\n|-------|-------|-------------------|\n| Mind Key | Satu mind | Hanya data mind tersebut |\n| JWT | Akun pengguna | Manajemen akun (buat/daftar/hapus mind) |\n| Computer Token | Satu komputer | Perintah komputer tersebut |\n\n## Akses Lintas-Mind\n\n### Dalam pengguna yang sama\n\nPengguna dapat mengakses semua mind mereka melalui JWT (mis. `GET /minds`\nmendaftar semua). Tetapi untuk membaca/menulis data memori, mereka memerlukan\nMind Key spesifik.\n\n### Antar pengguna\n\nPengguna tidak dapat mengakses data satu sama lain — KECUALI mereka secara\neksplisit berbagi mind melalui Sharing API:\n\n```bash\n# Alice shares Mind A with Bob\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H \"Authorization: Bearer ALICE_JWT\" \\\n  -d '{\"mind_id\": \"m_aaa\", \"email\": \"bob@example.com\", \"role\": \"read\"}'\n```\n\nSetelah dibagikan, Bob dapat mengakses Mind A melalui JWT miliknya (read-only jika `role=read`).\n\n## Batasan Keamanan\n\n```\n┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘\n```\n\n## Pola Multi-Tenancy Umum\n\n### Pola 1: Satu Pengguna, Satu Mind\n\nPaling umum untuk pengguna agen LLM individu.\n\n- 1 akun pengguna\n- 1 mind\n- 1 Mind Key\n- Semua memori dalam satu cakupan\n\n### Pola 2: Satu Pengguna, Beberapa Mind\n\nUntuk pengguna dengan beberapa konteks (kerja, pribadi, proyek).\n\n- 1 akun pengguna\n- N mind (mis. \"kerja\", \"pribadi\", \"proyek-x\")\n- N Mind Key\n- Setiap sesi LLM menggunakan satu Mind Key\n\n### Pola 3: Mind Tim Bersama\n\nUntuk tim yang berkolaborasi dalam suatu proyek.\n\n- 1 pengguna membuat mind (mendapatkan Mind Key)\n- Pembuat berbagi dengan anggota tim melalui JWT\n- Semua anggota tim mengakses melalui JWT (atau Mind Key bersama)\n\n> [!WARNING]\n> Berbagi Mind Key memberikan akses baca/tulis penuh. Untuk kolaborasi tim,\n> lebih baik gunakan Sharing API (berbasis JWT) daripada berbagi Mind Key secara langsung.\n\n### Pola 4: Penyedia SaaS\n\nUntuk aplikasi yang menyematkan Synapse sebagai lapisan memori mereka.\n\n- Setiap pelanggan = 1 akun pengguna\n- Setiap proyek pelanggan = 1 mind\n- Aplikasi menyimpan Mind Key per pelanggan/proyek\n- Isolasi penuh antar pelanggan\n\n## Verifikasi Isolasi\n\n### Tes: Mind Key tidak dapat mengakses mind lain\n\n```bash\n# Mind A's key cannot read Mind B's memories\ncurl -H \"Authorization: Bearer mk_aaa...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind A's memories\n\ncurl -H \"Authorization: Bearer mk_bbb...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind B's memories (different results)\n```\n\n### Tes: JWT tidak dapat membaca data memori langsung\n\n```bash\n# JWT can list minds\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n# Returns: list of minds\n\n# JWT CANNOT read memories (need Mind Key)\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/memory/recall\n# Returns: 401 Unauthorized\n```\n\n## Praktik Terbaik\n\n> [!TIP]\n> - **Gunakan satu mind per proyek/konteks** — isolasi adalah teman Anda\n> - **Jangan pernah berbagi Mind Key** — gunakan Sharing API sebagai gantinya\n> - **Rotasi Mind Key** jika terkompromi (hapus mind, buat baru)\n> - **Audit mind yang dibagikan** — tinjau `GET /sharing` secara berkala\n> - **Gunakan JWT untuk UI manusia** — jangan pernah mengekspos Mind Key ke pengguna akhir\n\n## Langkah Berikutnya\n\n- [Autentikasi](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Arsitektur](/docs/concepts/architecture)\n","content_html":"<h1>Multi-Tenancy &amp; Isolasi</h1>\n<p>Synapse bersifat multi-tenant: beberapa pengguna, masing-masing dengan beberapa\nmind, sepenuhnya terisolasi satu sama lain. Halaman ini menjelaskan model\nisolasi.</p>\n<h2>Hierarki Tenant</h2>\n<pre><code class=\"hljs language-plaintext\">Synapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice&#x27;s minds)\n  │\n  └── ... (more users)</code></pre><h2>Level Isolasi</h2>\n<h3>Level 1: Isolasi Pengguna</h3>\n<p>Setiap akun pengguna terisolasi. Alice tidak dapat:</p>\n<ul>\n<li>Melihat mind Bob</li>\n<li>Mengakses memori Bob (bahkan dengan JWT miliknya)</li>\n<li>Mendaftar info akun Bob</li>\n</ul>\n<p>Diterapkan oleh: kolom <code>user_id</code> di semua tabel, JWT berisi <code>user_id</code>, semua\nkueri memfilter berdasarkan <code>user_id</code>.</p>\n<h3>Level 2: Isolasi Mind</h3>\n<p>Dalam satu pengguna, setiap mind terisolasi. Mind A tidak dapat:</p>\n<ul>\n<li>Melihat memori Mind B</li>\n<li>Mengakses tugas, chat, skrip Mind B</li>\n</ul>\n<p>Diterapkan oleh: kolom <code>mind_id</code> di semua tabel data, Mind Key berisi <code>mind_id</code>,\nsemua kueri memfilter berdasarkan <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Isolasi Mind Key adalah batasan keamanan utama. Mind Key yang bocor\nmemberikan akses penuh ke data mind tersebut — tetapi HANYA mind itu.</div><h2>Token Autentikasi</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Cakupan</th>\n<th>Apa yang dapat diakses</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Satu mind</td>\n<td>Hanya data mind tersebut</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Akun pengguna</td>\n<td>Manajemen akun (buat/daftar/hapus mind)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Satu komputer</td>\n<td>Perintah komputer tersebut</td>\n</tr>\n</tbody></table>\n<h2>Akses Lintas-Mind</h2>\n<h3>Dalam pengguna yang sama</h3>\n<p>Pengguna dapat mengakses semua mind mereka melalui JWT (mis. <code>GET /minds</code>\nmendaftar semua). Tetapi untuk membaca/menulis data memori, mereka memerlukan\nMind Key spesifik.</p>\n<h3>Antar pengguna</h3>\n<p>Pengguna tidak dapat mengakses data satu sama lain — KECUALI mereka secara\neksplisit berbagi mind melalui Sharing API:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Alice shares Mind A with Bob</span>\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer ALICE_JWT&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;mind_id&quot;: &quot;m_aaa&quot;, &quot;email&quot;: &quot;bob@example.com&quot;, &quot;role&quot;: &quot;read&quot;}&#x27;</span></code></pre><p>Setelah dibagikan, Bob dapat mengakses Mind A melalui JWT miliknya (read-only jika <code>role=read</code>).</p>\n<h2>Batasan Keamanan</h2>\n<pre><code class=\"hljs language-plaintext\">┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘</code></pre><h2>Pola Multi-Tenancy Umum</h2>\n<h3>Pola 1: Satu Pengguna, Satu Mind</h3>\n<p>Paling umum untuk pengguna agen LLM individu.</p>\n<ul>\n<li>1 akun pengguna</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Semua memori dalam satu cakupan</li>\n</ul>\n<h3>Pola 2: Satu Pengguna, Beberapa Mind</h3>\n<p>Untuk pengguna dengan beberapa konteks (kerja, pribadi, proyek).</p>\n<ul>\n<li>1 akun pengguna</li>\n<li>N mind (mis. &quot;kerja&quot;, &quot;pribadi&quot;, &quot;proyek-x&quot;)</li>\n<li>N Mind Key</li>\n<li>Setiap sesi LLM menggunakan satu Mind Key</li>\n</ul>\n<h3>Pola 3: Mind Tim Bersama</h3>\n<p>Untuk tim yang berkolaborasi dalam suatu proyek.</p>\n<ul>\n<li>1 pengguna membuat mind (mendapatkan Mind Key)</li>\n<li>Pembuat berbagi dengan anggota tim melalui JWT</li>\n<li>Semua anggota tim mengakses melalui JWT (atau Mind Key bersama)</li>\n</ul>\n<div class=\"callout callout-warn\">Berbagi Mind Key memberikan akses baca/tulis penuh. Untuk kolaborasi tim,\nlebih baik gunakan Sharing API (berbasis JWT) daripada berbagi Mind Key secara langsung.</div><h3>Pola 4: Penyedia SaaS</h3>\n<p>Untuk aplikasi yang menyematkan Synapse sebagai lapisan memori mereka.</p>\n<ul>\n<li>Setiap pelanggan = 1 akun pengguna</li>\n<li>Setiap proyek pelanggan = 1 mind</li>\n<li>Aplikasi menyimpan Mind Key per pelanggan/proyek</li>\n<li>Isolasi penuh antar pelanggan</li>\n</ul>\n<h2>Verifikasi Isolasi</h2>\n<h3>Tes: Mind Key tidak dapat mengakses mind lain</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Mind A&#x27;s key cannot read Mind B&#x27;s memories</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_aaa...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind A&#x27;s memories</span>\n\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_bbb...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind B&#x27;s memories (different results)</span></code></pre><h3>Tes: JWT tidak dapat membaca data memori langsung</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># JWT can list minds</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/minds\n<span class=\"hljs-comment\"># Returns: list of minds</span>\n\n<span class=\"hljs-comment\"># JWT CANNOT read memories (need Mind Key)</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/memory/recall\n<span class=\"hljs-comment\"># Returns: 401 Unauthorized</span></code></pre><h2>Praktik Terbaik</h2>\n<div class=\"callout callout-ok\"></div><h2>Langkah Berikutnya</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autentikasi</a></li>\n<li><a href=\"/docs/getting-started/mind-key-vs-jwt\">Mind Key vs JWT</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arsitektur</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/multi-tenancy","text":"/docs/concepts/multi-tenancy?format=text","json":"/docs/concepts/multi-tenancy?format=json","llm":"/docs/concepts/multi-tenancy?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}