{"title":"Multi-Tenancy & Cách ly","slug":"multi-tenancy","category":"concepts","summary":"Cách Synapse cách ly dữ liệu giữa người dùng và mind — giải thích ranh giới bảo mật.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":702,"read_minutes":4,"lang":"vi","translated":true,"requested_lang":"vi","content_markdown":"\n# Multi-Tenancy & Cách ly\n\nSynapse là multi-tenant: nhiều người dùng, mỗi người có nhiều mind, hoàn toàn\ncách ly với nhau. Trang này giải thích mô hình cách ly.\n\n## Hệ thống 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## Cấp độ cách ly\n\n### Cấp 1: Cách ly người dùng\n\nMỗi tài khoản người dùng được cách ly. Alice không thể:\n\n- Xem mind của Bob\n- Truy cập bộ nhớ của Bob (ngay cả với JWT của cô ấy)\n- Liệt kê thông tin tài khoản của Bob\n\nThực thi bởi: cột `user_id` trên tất cả bảng, JWT chứa `user_id`, tất cả truy\nvấn lọc theo `user_id`.\n\n### Cấp 2: Cách ly mind\n\nTrong một người dùng, mỗi mind được cách ly. Mind A không thể:\n\n- Xem bộ nhớ của Mind B\n- Truy cập tác vụ, chat, script của Mind B\n\nThực thi bởi: cột `mind_id` trên tất cả bảng dữ liệu, Mind Key chứa `mind_id`,\ntất cả truy vấn lọc theo `mind_id`.\n\n> [!CRITICAL]\n> Cách ly Mind Key là ranh giới bảo mật chính. Một Mind Key bị lộ cấp quyền\n> truy cập đầy đủ dữ liệu mind đó — nhưng CHỈ mind đó.\n\n## Token xác thực\n\n| Token | Phạm vi | Có thể truy cập gì |\n|-------|-------|-------------------|\n| Mind Key | Một mind duy nhất | Chỉ dữ liệu mind đó |\n| JWT | Tài khoản người dùng | Quản lý tài khoản (tạo/liệt kê/xóa mind) |\n| Computer Token | Một máy tính duy nhất | Lệnh của máy tính đó |\n\n## Truy cập chéo mind\n\n### Trong cùng người dùng\n\nNgười dùng có thể truy cập tất cả mind của họ qua JWT (ví dụ `GET /minds` liệt\nkê tất cả). Nhưng để đọc/ghi dữ liệu bộ nhớ, họ cần Mind Key cụ thể.\n\n### Giữa người dùng\n\nNgười dùng không thể truy cập dữ liệu của nhau — TRỪ KHI họ chia sẻ rõ ràng một\nmind qua 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\nSau khi chia sẻ, Bob có thể truy cập Mind A qua JWT của anh ấy (chỉ đọc nếu\n`role=read`).\n\n## Ranh giới bảo mật\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## Mẫu multi-tenant phổ biến\n\n### Mẫu 1: Một người dùng, một mind\n\nPhổ biến nhất cho người dùng LLM agent cá nhân.\n\n- 1 tài khoản người dùng\n- 1 mind\n- 1 Mind Key\n- Tất cả bộ nhớ trong một phạm vi\n\n### Mẫu 2: Một người dùng, nhiều mind\n\nCho người dùng có nhiều ngữ cảnh (công việc, cá nhân, dự án).\n\n- 1 tài khoản người dùng\n- N mind (ví dụ \"work\", \"personal\", \"project-x\")\n- N Mind Key\n- Mỗi phiên LLM sử dụng một Mind Key\n\n### Mẫu 3: Mind chung nhóm\n\nCho nhóm cộng tác trên một dự án.\n\n- 1 người dùng tạo mind (nhận Mind Key)\n- Người tạo chia sẻ với thành viên nhóm qua JWT\n- Tất cả thành viên nhóm truy cập qua JWT (hoặc Mind Key chung)\n\n> [!WARNING]\n> Chia sẻ Mind Key cấp quyền truy cập đọc/ghi đầy đủ. Cho cộng tác nhóm, ưu\n> tiên Sharing API (dựa trên JWT) thay vì chia sẻ Mind Key trực tiếp.\n\n### Mẫu 4: Nhà cung cấp SaaS\n\nCho ứng dụng nhúng Synapse làm lớp bộ nhớ.\n\n- Mỗi khách hàng = 1 tài khoản người dùng\n- Mỗi dự án khách hàng = 1 mind\n- Ứng dụng lưu Mind Key cho mỗi khách hàng/dự án\n- Cách ly đầy đủ giữa khách hàng\n\n## Xác minh cách ly\n\n### Kiểm tra: Mind Key không thể truy cập mind khác\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### Kiểm tra: JWT không thể đọc dữ liệu bộ nhớ trực tiếp\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## Thực hành tốt nhất\n\n> [!TIP]\n> - **Sử dụng một mind mỗi dự án/ngữ cảnh** — cách ly là bạn của bạn\n> - **Không bao giờ chia sẻ Mind Key** — sử dụng Sharing API thay thế\n> - **Xoay vòng Mind Key** nếu bị xâm phạm (xóa mind, tạo mới)\n> - **Kiểm toán mind chia sẻ** — xem xét `GET /sharing` định kỳ\n> - **Sử dụng JWT cho giao diện con người** — không bao giờ lộ Mind Key cho người dùng cuối\n\n## Bước tiếp theo\n\n- [Xác thực](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Kiến trúc](/docs/concepts/architecture)\n","content_html":"<h1>Multi-Tenancy &amp; Cách ly</h1>\n<p>Synapse là multi-tenant: nhiều người dùng, mỗi người có nhiều mind, hoàn toàn\ncách ly với nhau. Trang này giải thích mô hình cách ly.</p>\n<h2>Hệ thống 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>Cấp độ cách ly</h2>\n<h3>Cấp 1: Cách ly người dùng</h3>\n<p>Mỗi tài khoản người dùng được cách ly. Alice không thể:</p>\n<ul>\n<li>Xem mind của Bob</li>\n<li>Truy cập bộ nhớ của Bob (ngay cả với JWT của cô ấy)</li>\n<li>Liệt kê thông tin tài khoản của Bob</li>\n</ul>\n<p>Thực thi bởi: cột <code>user_id</code> trên tất cả bảng, JWT chứa <code>user_id</code>, tất cả truy\nvấn lọc theo <code>user_id</code>.</p>\n<h3>Cấp 2: Cách ly mind</h3>\n<p>Trong một người dùng, mỗi mind được cách ly. Mind A không thể:</p>\n<ul>\n<li>Xem bộ nhớ của Mind B</li>\n<li>Truy cập tác vụ, chat, script của Mind B</li>\n</ul>\n<p>Thực thi bởi: cột <code>mind_id</code> trên tất cả bảng dữ liệu, Mind Key chứa <code>mind_id</code>,\ntất cả truy vấn lọc theo <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Cách ly Mind Key là ranh giới bảo mật chính. Một Mind Key bị lộ cấp quyền\ntruy cập đầy đủ dữ liệu mind đó — nhưng CHỈ mind đó.</div><h2>Token xác thực</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Phạm vi</th>\n<th>Có thể truy cập gì</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Một mind duy nhất</td>\n<td>Chỉ dữ liệu mind đó</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Tài khoản người dùng</td>\n<td>Quản lý tài khoản (tạo/liệt kê/xóa mind)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Một máy tính duy nhất</td>\n<td>Lệnh của máy tính đó</td>\n</tr>\n</tbody></table>\n<h2>Truy cập chéo mind</h2>\n<h3>Trong cùng người dùng</h3>\n<p>Người dùng có thể truy cập tất cả mind của họ qua JWT (ví dụ <code>GET /minds</code> liệt\nkê tất cả). Nhưng để đọc/ghi dữ liệu bộ nhớ, họ cần Mind Key cụ thể.</p>\n<h3>Giữa người dùng</h3>\n<p>Người dùng không thể truy cập dữ liệu của nhau — TRỪ KHI họ chia sẻ rõ ràng một\nmind qua 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>Sau khi chia sẻ, Bob có thể truy cập Mind A qua JWT của anh ấy (chỉ đọc nếu\n<code>role=read</code>).</p>\n<h2>Ranh giới bảo mật</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>Mẫu multi-tenant phổ biến</h2>\n<h3>Mẫu 1: Một người dùng, một mind</h3>\n<p>Phổ biến nhất cho người dùng LLM agent cá nhân.</p>\n<ul>\n<li>1 tài khoản người dùng</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Tất cả bộ nhớ trong một phạm vi</li>\n</ul>\n<h3>Mẫu 2: Một người dùng, nhiều mind</h3>\n<p>Cho người dùng có nhiều ngữ cảnh (công việc, cá nhân, dự án).</p>\n<ul>\n<li>1 tài khoản người dùng</li>\n<li>N mind (ví dụ &quot;work&quot;, &quot;personal&quot;, &quot;project-x&quot;)</li>\n<li>N Mind Key</li>\n<li>Mỗi phiên LLM sử dụng một Mind Key</li>\n</ul>\n<h3>Mẫu 3: Mind chung nhóm</h3>\n<p>Cho nhóm cộng tác trên một dự án.</p>\n<ul>\n<li>1 người dùng tạo mind (nhận Mind Key)</li>\n<li>Người tạo chia sẻ với thành viên nhóm qua JWT</li>\n<li>Tất cả thành viên nhóm truy cập qua JWT (hoặc Mind Key chung)</li>\n</ul>\n<div class=\"callout callout-warn\">Chia sẻ Mind Key cấp quyền truy cập đọc/ghi đầy đủ. Cho cộng tác nhóm, ưu\ntiên Sharing API (dựa trên JWT) thay vì chia sẻ Mind Key trực tiếp.</div><h3>Mẫu 4: Nhà cung cấp SaaS</h3>\n<p>Cho ứng dụng nhúng Synapse làm lớp bộ nhớ.</p>\n<ul>\n<li>Mỗi khách hàng = 1 tài khoản người dùng</li>\n<li>Mỗi dự án khách hàng = 1 mind</li>\n<li>Ứng dụng lưu Mind Key cho mỗi khách hàng/dự án</li>\n<li>Cách ly đầy đủ giữa khách hàng</li>\n</ul>\n<h2>Xác minh cách ly</h2>\n<h3>Kiểm tra: Mind Key không thể truy cập mind khác</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>Kiểm tra: JWT không thể đọc dữ liệu bộ nhớ trực tiếp</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>Thực hành tốt nhất</h2>\n<div class=\"callout callout-ok\"></div><h2>Bước tiếp theo</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Xác thực</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\">Kiến trúc</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"]}