{"title":"Multi-tenancy & isolation","slug":"multi-tenancy","category":"concepts","summary":"Comment Synapse isole les données entre utilisateurs et minds — frontières de sécurité expliquées.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":634,"read_minutes":3,"lang":"fr","translated":true,"requested_lang":"fr","content_markdown":"\n# Multi-tenancy & isolation\n\nSynapse est multi-tenant : plusieurs utilisateurs, chacun avec plusieurs minds,\nentièrement isolés les uns des autres. Cette page explique le modèle d'isolation.\n\n## Hiérarchie des tenants\n\n```\nInstance Synapse\n  │\n  ├── Compte utilisateur 1 (email : alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (accessibles uniquement via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolé du Mind A)\n  │\n  ├── Compte utilisateur 2 (email : bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolé des minds d'Alice)\n  │\n  └── ... (plus d'utilisateurs)\n```\n\n## Niveaux d'isolation\n\n### Niveau 1 : isolation utilisateur\n\nChaque compte utilisateur est isolé. Alice ne peut pas :\n\n- Voir les minds de Bob\n- Accéder aux mémoires de Bob (même avec son JWT)\n- Lister les infos de compte de Bob\n\nAppliqué par : colonne `user_id` sur toutes les tables, le JWT contient `user_id`,\ntoutes les requêtes filtrent par `user_id`.\n\n### Niveau 2 : isolation de mind\n\nAu sein d'un utilisateur, chaque mind est isolé. Le Mind A ne peut pas :\n\n- Voir les mémoires du Mind B\n- Accéder aux tâches, chat, scripts du Mind B\n\nAppliqué par : colonne `mind_id` sur toutes les tables de données, la Mind Key\ncontient `mind_id`, toutes les requêtes filtrent par `mind_id`.\n\n> [!CRITICAL]\n> L'isolation par Mind Key est la frontière de sécurité principale. Une Mind Key\n> fuite accordant un accès complet aux données de ce mind — mais UNIQUEMENT ce mind.\n\n## Jetons d'authentification\n\n| Jeton | Portée | Ce à quoi il peut accéder |\n|-------|-------|-------------------|\n| Mind Key | Un seul mind | Données de ce mind uniquement |\n| JWT | Compte utilisateur | Gestion de compte (créer/lister/supprimer des minds) |\n| Computer Token | Un seul ordinateur | Commandes de cet ordinateur |\n\n## Accès inter-minds\n\n### Au sein du même utilisateur\n\nL'utilisateur peut accéder à tous ses minds via JWT (ex. `GET /minds` les liste tous).\nMais pour lire/écrire des données mémoire, il a besoin de la Mind Key spécifique.\n\n### Entre utilisateurs\n\nLes utilisateurs ne peuvent pas accéder aux données des autres — SAUF s'ils partagent\nexplicitement un mind via l'API Sharing :\n\n```bash\n# Alice partage le Mind A avec 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\nAprès le partage, Bob peut accéder au Mind A via son JWT (en lecture seule si\n`role=read`).\n\n## Frontières de sécurité\n\n```\n┌─────────────────────────────────────────────────┐\n│              Instance Synapse                    │\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## Schémas multi-tenant courants\n\n### Schéma 1 : utilisateur unique, mind unique\n\nLe plus courant pour les utilisateurs individuels d'agents LLM.\n\n- 1 compte utilisateur\n- 1 mind\n- 1 Mind Key\n- Toutes les mémoires dans un seul scope\n\n### Schéma 2 : utilisateur unique, plusieurs minds\n\nPour les utilisateurs avec plusieurs contextes (travail, personnel, projets).\n\n- 1 compte utilisateur\n- N minds (ex. « work », « personal », « project-x »)\n- N Mind Keys\n- Chaque session LLM utilise une Mind Key\n\n### Schéma 3 : mind partagé en équipe\n\nPour les équipes collaborant sur un projet.\n\n- 1 utilisateur crée le mind (obtient la Mind Key)\n- Le créateur partage avec les membres de l'équipe via JWT\n- Tous les membres y accèdent via JWT (ou Mind Key partagée)\n\n> [!WARNING]\n> Partager une Mind Key donne un accès complet en lecture/écriture. Pour la\n> collaboration en équipe, préférez l'API Sharing (basée JWT) au partage direct de\n> Mind Keys.\n\n### Schéma 4 : fournisseur SaaS\n\nPour les applications qui intègrent Synapse comme couche mémoire.\n\n- Chaque client = 1 compte utilisateur\n- Chaque projet client = 1 mind\n- L'application stocke les Mind Keys par client/projet\n- Isolation complète entre clients\n\n## Vérification de l'isolation\n\n### Test : une Mind Key ne peut pas accéder à d'autres minds\n\n```bash\n# La clé du Mind A ne peut pas lire les mémoires du Mind B\ncurl -H \"Authorization: Bearer mk_aaa...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Renvoie uniquement les mémoires du Mind A\n\ncurl -H \"Authorization: Bearer mk_bbb...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Renvoie uniquement les mémoires du Mind B (résultats différents)\n```\n\n### Test : un JWT ne peut pas lire directement les données de mémoire\n\n```bash\n# Le JWT peut lister les minds\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n# Renvoie : liste des minds\n\n# Le JWT NE PEUT PAS lire les mémoires (besoin d'une Mind Key)\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/memory/recall\n# Renvoie : 401 Unauthorized\n```\n\n## Bonnes pratiques\n\n> [!TIP]\n> - **Utilisez un mind par projet/contexte** — l'isolation est votre amie\n> - **Ne partagez jamais de Mind Keys** — utilisez l'API Sharing à la place\n> - **Pivotez les Mind Keys** si compromises (supprimer le mind, en créer un nouveau)\n> - **Auditez les minds partagés** — passez en revue `GET /sharing` périodiquement\n> - **Utilisez le JWT pour l'interface humaine** — n'exposez jamais les Mind Keys aux utilisateurs finaux\n\n## Prochaines étapes\n\n- [Authentification](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Architecture](/docs/concepts/architecture)\n","content_html":"<h1>Multi-tenancy &amp; isolation</h1>\n<p>Synapse est multi-tenant : plusieurs utilisateurs, chacun avec plusieurs minds,\nentièrement isolés les uns des autres. Cette page explique le modèle d&#39;isolation.</p>\n<h2>Hiérarchie des tenants</h2>\n<pre><code class=\"hljs language-plaintext\">Instance Synapse\n  │\n  ├── Compte utilisateur 1 (email : alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (accessibles uniquement via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolé du Mind A)\n  │\n  ├── Compte utilisateur 2 (email : bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolé des minds d&#x27;Alice)\n  │\n  └── ... (plus d&#x27;utilisateurs)</code></pre><h2>Niveaux d&#39;isolation</h2>\n<h3>Niveau 1 : isolation utilisateur</h3>\n<p>Chaque compte utilisateur est isolé. Alice ne peut pas :</p>\n<ul>\n<li>Voir les minds de Bob</li>\n<li>Accéder aux mémoires de Bob (même avec son JWT)</li>\n<li>Lister les infos de compte de Bob</li>\n</ul>\n<p>Appliqué par : colonne <code>user_id</code> sur toutes les tables, le JWT contient <code>user_id</code>,\ntoutes les requêtes filtrent par <code>user_id</code>.</p>\n<h3>Niveau 2 : isolation de mind</h3>\n<p>Au sein d&#39;un utilisateur, chaque mind est isolé. Le Mind A ne peut pas :</p>\n<ul>\n<li>Voir les mémoires du Mind B</li>\n<li>Accéder aux tâches, chat, scripts du Mind B</li>\n</ul>\n<p>Appliqué par : colonne <code>mind_id</code> sur toutes les tables de données, la Mind Key\ncontient <code>mind_id</code>, toutes les requêtes filtrent par <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">L'isolation par Mind Key est la frontière de sécurité principale. Une Mind Key\nfuite accordant un accès complet aux données de ce mind — mais UNIQUEMENT ce mind.</div><h2>Jetons d&#39;authentification</h2>\n<table>\n<thead>\n<tr>\n<th>Jeton</th>\n<th>Portée</th>\n<th>Ce à quoi il peut accéder</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Un seul mind</td>\n<td>Données de ce mind uniquement</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Compte utilisateur</td>\n<td>Gestion de compte (créer/lister/supprimer des minds)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Un seul ordinateur</td>\n<td>Commandes de cet ordinateur</td>\n</tr>\n</tbody></table>\n<h2>Accès inter-minds</h2>\n<h3>Au sein du même utilisateur</h3>\n<p>L&#39;utilisateur peut accéder à tous ses minds via JWT (ex. <code>GET /minds</code> les liste tous).\nMais pour lire/écrire des données mémoire, il a besoin de la Mind Key spécifique.</p>\n<h3>Entre utilisateurs</h3>\n<p>Les utilisateurs ne peuvent pas accéder aux données des autres — SAUF s&#39;ils partagent\nexplicitement un mind via l&#39;API Sharing :</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Alice partage le Mind A avec 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>Après le partage, Bob peut accéder au Mind A via son JWT (en lecture seule si\n<code>role=read</code>).</p>\n<h2>Frontières de sécurité</h2>\n<pre><code class=\"hljs language-plaintext\">┌─────────────────────────────────────────────────┐\n│              Instance Synapse                    │\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>Schémas multi-tenant courants</h2>\n<h3>Schéma 1 : utilisateur unique, mind unique</h3>\n<p>Le plus courant pour les utilisateurs individuels d&#39;agents LLM.</p>\n<ul>\n<li>1 compte utilisateur</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Toutes les mémoires dans un seul scope</li>\n</ul>\n<h3>Schéma 2 : utilisateur unique, plusieurs minds</h3>\n<p>Pour les utilisateurs avec plusieurs contextes (travail, personnel, projets).</p>\n<ul>\n<li>1 compte utilisateur</li>\n<li>N minds (ex. « work », « personal », « project-x »)</li>\n<li>N Mind Keys</li>\n<li>Chaque session LLM utilise une Mind Key</li>\n</ul>\n<h3>Schéma 3 : mind partagé en équipe</h3>\n<p>Pour les équipes collaborant sur un projet.</p>\n<ul>\n<li>1 utilisateur crée le mind (obtient la Mind Key)</li>\n<li>Le créateur partage avec les membres de l&#39;équipe via JWT</li>\n<li>Tous les membres y accèdent via JWT (ou Mind Key partagée)</li>\n</ul>\n<div class=\"callout callout-warn\">Partager une Mind Key donne un accès complet en lecture/écriture. Pour la\ncollaboration en équipe, préférez l'API Sharing (basée JWT) au partage direct de\nMind Keys.</div><h3>Schéma 4 : fournisseur SaaS</h3>\n<p>Pour les applications qui intègrent Synapse comme couche mémoire.</p>\n<ul>\n<li>Chaque client = 1 compte utilisateur</li>\n<li>Chaque projet client = 1 mind</li>\n<li>L&#39;application stocke les Mind Keys par client/projet</li>\n<li>Isolation complète entre clients</li>\n</ul>\n<h2>Vérification de l&#39;isolation</h2>\n<h3>Test : une Mind Key ne peut pas accéder à d&#39;autres minds</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># La clé du Mind A ne peut pas lire les mémoires du 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\"># Renvoie uniquement les mémoires du Mind A</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\"># Renvoie uniquement les mémoires du Mind B (résultats différents)</span></code></pre><h3>Test : un JWT ne peut pas lire directement les données de mémoire</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Le JWT peut lister les 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\"># Renvoie : liste des minds</span>\n\n<span class=\"hljs-comment\"># Le JWT NE PEUT PAS lire les mémoires (besoin d&#x27;une 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\"># Renvoie : 401 Unauthorized</span></code></pre><h2>Bonnes pratiques</h2>\n<div class=\"callout callout-ok\"></div><h2>Prochaines étapes</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Authentification</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\">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"]}