Multi-tenancy и изоляция
Как Synapse изолирует данные между пользователями и minds — разбор границ безопасности.
Multi-tenancy и изоляция
Synapse — multi-tenant-система: несколько пользователей, у каждого — несколько mind, полностью изолированных друг от друга. На этой странице описана модель изоляции.
Иерархия арендаторов
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)Уровни изоляции
Уровень 1: изоляция пользователей
Каждый аккаунт пользователя изолирован. Alice не может:
- Видеть mind пользователя Bob
- Получать доступ к воспоминаниям Bob (даже со своим JWT)
- Просматривать данные аккаунта Bob
Обеспечивается: колонкой user_id во всех таблицах, JWT содержит user_id,
все запросы фильтруются по user_id.
Уровень 2: изоляция mind
В рамках пользователя каждый mind изолирован. Mind A не может:
- Видеть воспоминания Mind B
- Получать доступ к задачам, чату, скриптам Mind B
Обеспечивается: колонкой mind_id во всех таблицах данных, Mind Key содержит
mind_id, все запросы фильтруются по mind_id.
Токены аутентификации
| Токен | Область | Что может получить |
|---|---|---|
| Mind Key | Один mind | Только данные этого mind |
| JWT | Аккаунт пользователя | Управление аккаунтом (создание/список/удаление mind) |
| Computer Token | Один компьютер | Команды этого компьютера |
Доступ между mind
В рамках одного пользователя
Пользователь может получить доступ ко всем своим mind через JWT (например,
GET /minds возвращает список всех). Но для чтения/записи данных памяти требуется
конкретный Mind Key.
Между пользователями
Пользователи не могут получать доступ к данным друг друга — КРОМЕ случая, когда они явно поделились mind через Sharing API:
# 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"}'После этого Bob может получить доступ к Mind A через свой JWT
(только для чтения, если role=read).
Границы безопасности
┌─────────────────────────────────────────────────┐
│ Synapse Instance │
│ ┌─────────────────────────────────────────┐ │
│ │ User Account Boundary │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Mind Bound. │ │ Mind Bound. │ │ │
│ │ │ (Mind Key) │ │ (Mind Key) │ │ │
│ │ │ │ │ │ │ │
│ │ │ Memories │ │ Memories │ │ │
│ │ │ Tasks │ │ Tasks │ │ │
│ │ │ Chat │ │ Chat │ │ │
│ │ │ Scripts │ │ Scripts │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘Типовые паттерны multi-tenancy
Паттерн 1: один пользователь, один mind
Наиболее распространён у индивидуальных пользователей LLM-агентов.
- 1 аккаунт пользователя
- 1 mind
- 1 Mind Key
- Все воспоминания в одной области
Паттерн 2: один пользователь, несколько mind
Для пользователей с несколькими контекстами (работа, личное, проекты).
- 1 аккаунт пользователя
- N mind (например, «work», «personal», «project-x»)
- N Mind Key
- Каждая LLM-сессия использует один Mind Key
Паттерн 3: командный общий mind
Для команд, сотрудничающих над проектом.
- 1 пользователь создаёт mind (получает Mind Key)
- Создатель делится с участниками команды через JWT
- Все участники получают доступ через JWT (или общий Mind Key)
Паттерн 4: SaaS-провайдер
Для приложений, встраивающих Synapse как слой памяти.
- Каждый клиент = 1 аккаунт пользователя
- Каждый проект клиента = 1 mind
- Приложение хранит Mind Key по каждому клиенту/проекту
- Полная изоляция между клиентами
Проверка изоляции
Тест: Mind Key не может получить доступ к другим mind
# 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)Тест: JWT не может читать данные памяти напрямую
# 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