{"title":"Мультитенантність та ізоляція","slug":"multi-tenancy","category":"concepts","summary":"Як Synapse ізолює дані між користувачами та mind-ами — пояснення меж безпеки.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":529,"read_minutes":3,"lang":"uk","translated":true,"requested_lang":"uk","content_markdown":"\n# Мультитенантність та ізоляція\n\nSynapse є мультитенантним: кілька користувачів, кожен із кількома mind-ами, повністю\nізольованими один від одного. Ця сторінка пояснює модель ізоляції.\n\n## Ієрархія тенантів\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## Рівні ізоляції\n\n### Рівень 1: Ізоляція користувачів\n\nКожен обліковий запис користувача ізольований. Аліса не може:\n\n- Бачити mind-и Боба\n- Доступатися до спогадів Боба (навіть зі своїм JWT)\n- Переглядати інформацію про обліковий запис Боба\n\nЗабезпечено: колонка `user_id` у всіх таблицях, JWT містить `user_id`, усі\nзапити фільтруються за `user_id`.\n\n### Рівень 2: Ізоляція mind-ів\n\nУ межах користувача кожен mind ізольований. Mind A не може:\n\n- Бачити спогади Mind B\n- Доступатися до завдань, чату, скриптів Mind B\n\nЗабезпечено: колонка `mind_id` у всіх таблицях даних, Mind Key містить `mind_id`,\nусі запити фільтруються за `mind_id`.\n\n> [!CRITICAL]\n> Ізоляція Mind Key — це основна межа безпеки. Виточений Mind Key надає повний\n> доступ до даних цього mind-у — але ТІЛЬКИ цього mind-у.\n\n## Токени автентифікації\n\n| Токен | Область | Що може доступати |\n|-------|-------|-------------------|\n| Mind Key | Один mind | Лише дані цього mind-у |\n| JWT | Обліковий запис користувача | Керування обліковим записом (створення/список/видалення mind-ів) |\n| Computer Token | Один комп'ютер | Команди цього комп'ютера |\n\n## Між-mind доступ\n\n### У межах одного користувача\n\nКористувач може доступатися до всіх своїх mind-ів через JWT (напр. `GET /minds`\nвиводить усі). Але для читання/запису даних пам'яті потрібен конкретний Mind Key.\n\n### Між користувачами\n\nКористувачі не можуть доступатися до даних одне одного — ЯКЩО тільки явно не\nподіляться mind-ом через Sharing API:\n\n```bash\n# Аліса ділиться Mind A з Бобом\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\nПісля цього Боб може доступатися до Mind A через свій JWT (лише читання, якщо\n`role=read`).\n\n## Межі безпеки\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## Типові шаблони мультитенантності\n\n### Шаблон 1: Один користувач, один mind\n\nНайпоширеніший для індивідуальних користувачів LLM-агентів.\n\n- 1 обліковий запис користувача\n- 1 mind\n- 1 Mind Key\n- Усі спогади в одній області\n\n### Шаблон 2: Один користувач, кілька mind-ів\n\nДля користувачів із кількома контекстами (робота, особисте, проєкти).\n\n- 1 обліковий запис користувача\n- N mind-ів (напр. «work», «personal», «project-x»)\n- N Mind Keys\n- Кожна сесія LLM використовує один Mind Key\n\n### Шаблон 3: Командний спільний mind\n\nДля команд, що співпрацюють над проєктом.\n\n- 1 користувач створює mind (отримує Mind Key)\n- Творець ділиться з членами команди через JWT\n- Усі члени команди доступаються через JWT (або спільний Mind Key)\n\n> [!WARNING]\n> Поширення Mind Key дає повний доступ на читання/запис. Для командної\n> співпраці віддавайте перевагу Sharing API (на основі JWT), а не прямому\n> поширенню Mind Keys.\n\n### Шаблон 4: SaaS-провайдер\n\nДля додатків, що вбудовують Synapse як шар пам'яті.\n\n- Кожен клієнт = 1 обліковий запис користувача\n- Кожен проєкт клієнта = 1 mind\n- Додаток зберігає Mind Keys для кожного клієнта/проєкту\n- Повна ізоляція між клієнтами\n\n## Перевірка ізоляції\n\n### Тест: Mind Key не може доступатися до інших mind-ів\n\n```bash\n# Ключ Mind A не може читати спогади Mind B\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### Тест: JWT не може читати дані пам'яті напряму\n\n```bash\n# JWT може вивести список mind-ів\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n# Returns: list of minds\n\n# JWT НЕ МОЖЕ читати спогади (потрібен Mind Key)\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/memory/recall\n# Returns: 401 Unauthorized\n```\n\n## Найкращі практики\n\n> [!TIP]\n> - **Один mind на проєкт/контекст** — ізоляція — ваш друг\n> - **Ніколи не поширюйте Mind Keys** — використовуйте Sharing API\n> - **Ротуйте Mind Keys** у разі компрометації (видаліть mind, створіть новий)\n> - **Аудитуйте спільні mind-и** — періодично переглядайте `GET /sharing`\n> - **Використовуйте JWT для людського UI** — ніколи не викривайте Mind Keys кінцевим користувачам\n\n## Наступні кроки\n\n- [Автентифікація](/docs/getting-started/authentication)\n- [Mind Key проти JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Архітектура](/docs/concepts/architecture)\n","content_html":"<h1>Мультитенантність та ізоляція</h1>\n<p>Synapse є мультитенантним: кілька користувачів, кожен із кількома mind-ами, повністю\nізольованими один від одного. Ця сторінка пояснює модель ізоляції.</p>\n<h2>Ієрархія тенантів</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>Рівні ізоляції</h2>\n<h3>Рівень 1: Ізоляція користувачів</h3>\n<p>Кожен обліковий запис користувача ізольований. Аліса не може:</p>\n<ul>\n<li>Бачити mind-и Боба</li>\n<li>Доступатися до спогадів Боба (навіть зі своїм JWT)</li>\n<li>Переглядати інформацію про обліковий запис Боба</li>\n</ul>\n<p>Забезпечено: колонка <code>user_id</code> у всіх таблицях, JWT містить <code>user_id</code>, усі\nзапити фільтруються за <code>user_id</code>.</p>\n<h3>Рівень 2: Ізоляція mind-ів</h3>\n<p>У межах користувача кожен mind ізольований. Mind A не може:</p>\n<ul>\n<li>Бачити спогади Mind B</li>\n<li>Доступатися до завдань, чату, скриптів Mind B</li>\n</ul>\n<p>Забезпечено: колонка <code>mind_id</code> у всіх таблицях даних, Mind Key містить <code>mind_id</code>,\nусі запити фільтруються за <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Ізоляція Mind Key — це основна межа безпеки. Виточений Mind Key надає повний\nдоступ до даних цього mind-у — але ТІЛЬКИ цього mind-у.</div><h2>Токени автентифікації</h2>\n<table>\n<thead>\n<tr>\n<th>Токен</th>\n<th>Область</th>\n<th>Що може доступати</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Один mind</td>\n<td>Лише дані цього mind-у</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Обліковий запис користувача</td>\n<td>Керування обліковим записом (створення/список/видалення mind-ів)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Один комп&#39;ютер</td>\n<td>Команди цього комп&#39;ютера</td>\n</tr>\n</tbody></table>\n<h2>Між-mind доступ</h2>\n<h3>У межах одного користувача</h3>\n<p>Користувач може доступатися до всіх своїх mind-ів через JWT (напр. <code>GET /minds</code>\nвиводить усі). Але для читання/запису даних пам&#39;яті потрібен конкретний Mind Key.</p>\n<h3>Між користувачами</h3>\n<p>Користувачі не можуть доступатися до даних одне одного — ЯКЩО тільки явно не\nподіляться mind-ом через Sharing API:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Аліса ділиться Mind A з Бобом</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>Після цього Боб може доступатися до Mind A через свій JWT (лише читання, якщо\n<code>role=read</code>).</p>\n<h2>Межі безпеки</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>Типові шаблони мультитенантності</h2>\n<h3>Шаблон 1: Один користувач, один mind</h3>\n<p>Найпоширеніший для індивідуальних користувачів LLM-агентів.</p>\n<ul>\n<li>1 обліковий запис користувача</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Усі спогади в одній області</li>\n</ul>\n<h3>Шаблон 2: Один користувач, кілька mind-ів</h3>\n<p>Для користувачів із кількома контекстами (робота, особисте, проєкти).</p>\n<ul>\n<li>1 обліковий запис користувача</li>\n<li>N mind-ів (напр. «work», «personal», «project-x»)</li>\n<li>N Mind Keys</li>\n<li>Кожна сесія LLM використовує один Mind Key</li>\n</ul>\n<h3>Шаблон 3: Командний спільний mind</h3>\n<p>Для команд, що співпрацюють над проєктом.</p>\n<ul>\n<li>1 користувач створює mind (отримує Mind Key)</li>\n<li>Творець ділиться з членами команди через JWT</li>\n<li>Усі члени команди доступаються через JWT (або спільний Mind Key)</li>\n</ul>\n<div class=\"callout callout-warn\">Поширення Mind Key дає повний доступ на читання/запис. Для командної\nспівпраці віддавайте перевагу Sharing API (на основі JWT), а не прямому\nпоширенню Mind Keys.</div><h3>Шаблон 4: SaaS-провайдер</h3>\n<p>Для додатків, що вбудовують Synapse як шар пам&#39;яті.</p>\n<ul>\n<li>Кожен клієнт = 1 обліковий запис користувача</li>\n<li>Кожен проєкт клієнта = 1 mind</li>\n<li>Додаток зберігає Mind Keys для кожного клієнта/проєкту</li>\n<li>Повна ізоляція між клієнтами</li>\n</ul>\n<h2>Перевірка ізоляції</h2>\n<h3>Тест: Mind Key не може доступатися до інших mind-ів</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Ключ Mind A не може читати спогади Mind B</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>Тест: JWT не може читати дані пам&#39;яті напряму</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># JWT може вивести список mind-ів</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 НЕ МОЖЕ читати спогади (потрібен 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>Найкращі практики</h2>\n<div class=\"callout callout-ok\"></div><h2>Наступні кроки</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Автентифікація</a></li>\n<li><a href=\"/docs/getting-started/mind-key-vs-jwt\">Mind Key проти JWT</a></li>\n<li><a href=\"/docs/concepts/architecture\">Архітектура</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"]}