{"title":"Synapse-arkitektur","slug":"architecture","category":"concepts","summary":"Hur Synapse är byggt — Fastify, PostgreSQL, FTS5, inbäddningar, MCP-server.","audience":["human","llm"],"tags":["architecture","design","components"],"difficulty":"intermediate","updated":"2026-06-27","word_count":381,"read_minutes":2,"lang":"sv","translated":true,"requested_lang":"sv","content_markdown":"\n# Synapse-arkitektur\n\nSynapse är ett multitenant-minnes-API byggt på Fastify, PostgreSQL med FTS5 och\nen valfri inbäddningstjänst för semantisk sökning.\n\n## Arkitektur på hög nivå\n\n```\n┌──────────────────────────────────────────────────────────┐\n│                       Clients                            │\n├──────────────┬──────────────┬──────────────┬─────────────┤\n│  LLM Agents  │  Web Browsers│  MCP Clients │  Webhooks   │\n│  (curl/SDK)  │  (humans)    │ (Claude/etc) │  (external) │\n└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘\n       │              │              │              │\n       └──────────────┴──────────────┴──────────────┘\n                              │\n                              ▼\n              ┌───────────────────────────────┐\n              │    Synapse API (Fastify)      │\n              │    port 12800                 │\n              │    - REST endpoints           │\n              │    - Auth (Mind Key / JWT)    │\n              │    - Rate limiting            │\n              │    - Static file serving      │\n              └───────────────┬───────────────┘\n                              │\n              ┌───────────────┼───────────────┐\n              ▼               ▼               ▼\n       ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n       │ PostgreSQL  │ │ Embeddings  │ │ MCP Server  │\n       │ + FTS5      │ │ Service     │ │ (separate)  │\n       │             │ │ (optional)  │ │ port 13100  │\n       │ - memories  │ │             │ │             │\n       │ - tasks     │ │ - generate  │ │ - 79 tools  │\n       │ - chat      │ │   embeddings│ │ - stdio/SSE │\n       │ - scripts   │ │             │ │ - WebSocket │\n       └─────────────┘ └─────────────┘ └─────────────┘\n```\n\n## Kärnkomponenter\n\n### 1. Synapse API (Fastify)\n\nHuvud-HTTP-servern. Hanterar:\n\n- REST-endpoints (`/memory`, `/chat`, `/mind/tasks` etc.)\n- Autentisering (Mind Key för agenter, JWT för människor)\n- Hastighetsbegränsning (endast `?key=`-auth)\n- Statisk filservering (webbgränssnitt på `/human`, `/docs` etc.)\n- Webhook-utsändning\n\nByggd med **Fastify 5** för prestanda. Körs på port 12800 i produktion.\n\n### 2. PostgreSQL med FTS5\n\nDet primära datalagret. Använder PostgreSQL med FTS5-tillägget för fulltextssök.\n\n**Nyckeltabeller:**\n\n| Tabell | Syfte |\n|-------|---------|\n| `users` | Användarkonton |\n| `minds` | Mind-omfattningar (varje har en Mind Key) |\n| `memories` | Minnesposter med FTS5 virtuell tabell |\n| `tasks` | Uppgiftshantering |\n| `chat_messages` | Chatthistorik |\n| `scripts` | Beständiga skript |\n| `webhooks` | Webhook-registreringar |\n| `cron_jobs` | Schemalagda uppgifter |\n| `variables` | Nyckel-värde-lager |\n| `audit_log` | Granskningsspår |\n\n**FTS5** möjliggör fulltextssök under en millisekund över allt minnesinnehåll.\nSe [FTS5-sökning](/docs/concepts/fts5-search) för detaljer.\n\n### 3. Inbäddningstjänst (valfri)\n\nFör semantisk sökning genererar Synapse vektorinbäddningar av minnesinnehåll.\nDessa lagras tillsammans med minnen och används för likhetssökning.\n\n- Leverantör: konfigurerbar (OpenAI, lokal modell etc.)\n- Lagras som `vector`-kolumn i `memories`-tabellen\n- Används av `/memory/semantic-search`-endpoint\n- Se [Semantisk sökning](/docs/concepts/semantic-search)\n\n### 4. MCP-server (separat tjänst)\n\nSynapse MCP-server körs som en separat process (port 13100). Den:\n\n- Exponerar 79 verktyg via Model Context Protocol\n- Stöder stdio-, HTTP/SSE- och WebSocket-transporter\n- Översätter MCP-verktygsanrop till Synapse API-anrop\n- Multitenant: en Mind Key per session\n\n### 5. Browser Proxy (separat tjänst)\n\nFör webbläsarautomatisering körs en separat Playwright-baserad tjänst på port\n13000. MCP-servern kan anropa denna för `browser_*`-verktyg.\n\n### 6. SSH Proxy (separat tjänst)\n\nFör SSH-baserade fjärrkommandon körs en separat tjänst på port 12900.\n\n## Multitenant-modell\n\n```\nUser Account (email + password)\n  │\n  ├── Mind 1 (Mind Key 1)\n  │   ├── Memories\n  │   ├── Tasks\n  │   ├── Chat\n  │   └── Scripts\n  │\n  ├── Mind 2 (Mind Key 2)\n  │   └── ... (isolated from Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...\n```\n\nVarje mind är fullständigt isolerad. Mind Keys ger åtkomst till exakt en mind.\nJWT:er ger åtkomst till användarkontot (för att hantera minds).\n\nSe [Multitenancy](/docs/concepts/multi-tenancy) för detaljer.\n\n## Begärandeflöde\n\n### Minneslagringsbegäran\n\n```\n1. Client sends POST /memory with Authorization: Bearer mk_xxx\n2. Fastify receives request\n3. Auth middleware validates Mind Key, attaches mind_id to request\n4. Memory route handler:\n   a. Validate JSON body (zod schema)\n   b. Insert into memories table\n   c. Update FTS5 index\n   d. (Async) Generate embedding if embeddings enabled\n   e. Trigger webhooks for memory.store event\n5. Return { id, status: \"stored\" }\n```\n\n### Minnessökningsbegäran\n\n```\n1. Client sends GET /memory/search?q=docker\n2. Auth middleware validates Mind Key\n3. Memory route handler:\n   a. Parse query (FTS5 syntax)\n   b. Execute FTS5 MATCH against memories table\n   c. Filter by mind_id (tenant isolation)\n   d. Rank by relevance\n   e. Return results\n```\n\n## Driftsättning\n\nSynapse driftsätts som en Docker-container. Se `docker-compose.yml`:\n\n```yaml\nservices:\n  synapse:\n    image: registry.gitlab.com/schaefer-services/synapse:latest\n    ports:\n      - \"12800:12800\"\n    environment:\n      - DATABASE_URL=postgres://...\n      - JWT_SECRET=...\n      - SYNAPSE_HOST=0.0.0.0\n      - SYNAPSE_PORT=12800\n    depends_on:\n      - postgres\n  \n  postgres:\n    image: postgres:16\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    environment:\n      - POSTGRES_DB=synapse\n      - POSTGRES_PASSWORD=...\n```\n\n## Prestandaegenskaper\n\n| Åtgärd | Latens | Genomströmning |\n|-----------|---------|------------|\n| Minneslagring | ~5 ms | 1000+ req/s |\n| Minnesåterkallning | ~20 ms | 500 req/s |\n| FTS5-sökning | ~10 ms | 800 req/s |\n| Semantisk sökning | ~50 ms | 200 req/s |\n| Chat-poll | ~5 ms | 2000 req/s |\n\n## Nästa steg\n\n- [Minnesmodell](/docs/concepts/memory-model)\n- [Multitenancy](/docs/concepts/multi-tenancy)\n- [FTS5-sökning](/docs/concepts/fts5-search)\n","content_html":"<h1>Synapse-arkitektur</h1>\n<p>Synapse är ett multitenant-minnes-API byggt på Fastify, PostgreSQL med FTS5 och\nen valfri inbäddningstjänst för semantisk sökning.</p>\n<h2>Arkitektur på hög nivå</h2>\n<pre><code class=\"hljs language-plaintext\">┌──────────────────────────────────────────────────────────┐\n│                       Clients                            │\n├──────────────┬──────────────┬──────────────┬─────────────┤\n│  LLM Agents  │  Web Browsers│  MCP Clients │  Webhooks   │\n│  (curl/SDK)  │  (humans)    │ (Claude/etc) │  (external) │\n└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘\n       │              │              │              │\n       └──────────────┴──────────────┴──────────────┘\n                              │\n                              ▼\n              ┌───────────────────────────────┐\n              │    Synapse API (Fastify)      │\n              │    port 12800                 │\n              │    - REST endpoints           │\n              │    - Auth (Mind Key / JWT)    │\n              │    - Rate limiting            │\n              │    - Static file serving      │\n              └───────────────┬───────────────┘\n                              │\n              ┌───────────────┼───────────────┐\n              ▼               ▼               ▼\n       ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n       │ PostgreSQL  │ │ Embeddings  │ │ MCP Server  │\n       │ + FTS5      │ │ Service     │ │ (separate)  │\n       │             │ │ (optional)  │ │ port 13100  │\n       │ - memories  │ │             │ │             │\n       │ - tasks     │ │ - generate  │ │ - 79 tools  │\n       │ - chat      │ │   embeddings│ │ - stdio/SSE │\n       │ - scripts   │ │             │ │ - WebSocket │\n       └─────────────┘ └─────────────┘ └─────────────┘</code></pre><h2>Kärnkomponenter</h2>\n<h3>1. Synapse API (Fastify)</h3>\n<p>Huvud-HTTP-servern. Hanterar:</p>\n<ul>\n<li>REST-endpoints (<code>/memory</code>, <code>/chat</code>, <code>/mind/tasks</code> etc.)</li>\n<li>Autentisering (Mind Key för agenter, JWT för människor)</li>\n<li>Hastighetsbegränsning (endast <code>?key=</code>-auth)</li>\n<li>Statisk filservering (webbgränssnitt på <code>/human</code>, <code>/docs</code> etc.)</li>\n<li>Webhook-utsändning</li>\n</ul>\n<p>Byggd med <strong>Fastify 5</strong> för prestanda. Körs på port 12800 i produktion.</p>\n<h3>2. PostgreSQL med FTS5</h3>\n<p>Det primära datalagret. Använder PostgreSQL med FTS5-tillägget för fulltextssök.</p>\n<p><strong>Nyckeltabeller:</strong></p>\n<table>\n<thead>\n<tr>\n<th>Tabell</th>\n<th>Syfte</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>users</code></td>\n<td>Användarkonton</td>\n</tr>\n<tr>\n<td><code>minds</code></td>\n<td>Mind-omfattningar (varje har en Mind Key)</td>\n</tr>\n<tr>\n<td><code>memories</code></td>\n<td>Minnesposter med FTS5 virtuell tabell</td>\n</tr>\n<tr>\n<td><code>tasks</code></td>\n<td>Uppgiftshantering</td>\n</tr>\n<tr>\n<td><code>chat_messages</code></td>\n<td>Chatthistorik</td>\n</tr>\n<tr>\n<td><code>scripts</code></td>\n<td>Beständiga skript</td>\n</tr>\n<tr>\n<td><code>webhooks</code></td>\n<td>Webhook-registreringar</td>\n</tr>\n<tr>\n<td><code>cron_jobs</code></td>\n<td>Schemalagda uppgifter</td>\n</tr>\n<tr>\n<td><code>variables</code></td>\n<td>Nyckel-värde-lager</td>\n</tr>\n<tr>\n<td><code>audit_log</code></td>\n<td>Granskningsspår</td>\n</tr>\n</tbody></table>\n<p><strong>FTS5</strong> möjliggör fulltextssök under en millisekund över allt minnesinnehåll.\nSe <a href=\"/docs/concepts/fts5-search\">FTS5-sökning</a> för detaljer.</p>\n<h3>3. Inbäddningstjänst (valfri)</h3>\n<p>För semantisk sökning genererar Synapse vektorinbäddningar av minnesinnehåll.\nDessa lagras tillsammans med minnen och används för likhetssökning.</p>\n<ul>\n<li>Leverantör: konfigurerbar (OpenAI, lokal modell etc.)</li>\n<li>Lagras som <code>vector</code>-kolumn i <code>memories</code>-tabellen</li>\n<li>Används av <code>/memory/semantic-search</code>-endpoint</li>\n<li>Se <a href=\"/docs/concepts/semantic-search\">Semantisk sökning</a></li>\n</ul>\n<h3>4. MCP-server (separat tjänst)</h3>\n<p>Synapse MCP-server körs som en separat process (port 13100). Den:</p>\n<ul>\n<li>Exponerar 79 verktyg via Model Context Protocol</li>\n<li>Stöder stdio-, HTTP/SSE- och WebSocket-transporter</li>\n<li>Översätter MCP-verktygsanrop till Synapse API-anrop</li>\n<li>Multitenant: en Mind Key per session</li>\n</ul>\n<h3>5. Browser Proxy (separat tjänst)</h3>\n<p>För webbläsarautomatisering körs en separat Playwright-baserad tjänst på port\n13000. MCP-servern kan anropa denna för <code>browser_*</code>-verktyg.</p>\n<h3>6. SSH Proxy (separat tjänst)</h3>\n<p>För SSH-baserade fjärrkommandon körs en separat tjänst på port 12900.</p>\n<h2>Multitenant-modell</h2>\n<pre><code class=\"hljs language-plaintext\">User Account (email + password)\n  │\n  ├── Mind 1 (Mind Key 1)\n  │   ├── Memories\n  │   ├── Tasks\n  │   ├── Chat\n  │   └── Scripts\n  │\n  ├── Mind 2 (Mind Key 2)\n  │   └── ... (isolated from Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...</code></pre><p>Varje mind är fullständigt isolerad. Mind Keys ger åtkomst till exakt en mind.\nJWT:er ger åtkomst till användarkontot (för att hantera minds).</p>\n<p>Se <a href=\"/docs/concepts/multi-tenancy\">Multitenancy</a> för detaljer.</p>\n<h2>Begärandeflöde</h2>\n<h3>Minneslagringsbegäran</h3>\n<pre><code class=\"hljs language-plaintext\">1. Client sends POST /memory with Authorization: Bearer mk_xxx\n2. Fastify receives request\n3. Auth middleware validates Mind Key, attaches mind_id to request\n4. Memory route handler:\n   a. Validate JSON body (zod schema)\n   b. Insert into memories table\n   c. Update FTS5 index\n   d. (Async) Generate embedding if embeddings enabled\n   e. Trigger webhooks for memory.store event\n5. Return { id, status: &quot;stored&quot; }</code></pre><h3>Minnessökningsbegäran</h3>\n<pre><code class=\"hljs language-plaintext\">1. Client sends GET /memory/search?q=docker\n2. Auth middleware validates Mind Key\n3. Memory route handler:\n   a. Parse query (FTS5 syntax)\n   b. Execute FTS5 MATCH against memories table\n   c. Filter by mind_id (tenant isolation)\n   d. Rank by relevance\n   e. Return results</code></pre><h2>Driftsättning</h2>\n<p>Synapse driftsätts som en Docker-container. Se <code>docker-compose.yml</code>:</p>\n<pre><code class=\"hljs language-yaml\"><span class=\"hljs-attr\">services:</span>\n  <span class=\"hljs-attr\">synapse:</span>\n    <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">registry.gitlab.com/schaefer-services/synapse:latest</span>\n    <span class=\"hljs-attr\">ports:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;12800:12800&quot;</span>\n    <span class=\"hljs-attr\">environment:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">DATABASE_URL=postgres://...</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">JWT_SECRET=...</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">SYNAPSE_HOST=0.0.0.0</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">SYNAPSE_PORT=12800</span>\n    <span class=\"hljs-attr\">depends_on:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">postgres</span>\n  \n  <span class=\"hljs-attr\">postgres:</span>\n    <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">postgres:16</span>\n    <span class=\"hljs-attr\">volumes:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">pgdata:/var/lib/postgresql/data</span>\n    <span class=\"hljs-attr\">environment:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">POSTGRES_DB=synapse</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">POSTGRES_PASSWORD=...</span></code></pre><h2>Prestandaegenskaper</h2>\n<table>\n<thead>\n<tr>\n<th>Åtgärd</th>\n<th>Latens</th>\n<th>Genomströmning</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Minneslagring</td>\n<td>~5 ms</td>\n<td>1000+ req/s</td>\n</tr>\n<tr>\n<td>Minnesåterkallning</td>\n<td>~20 ms</td>\n<td>500 req/s</td>\n</tr>\n<tr>\n<td>FTS5-sökning</td>\n<td>~10 ms</td>\n<td>800 req/s</td>\n</tr>\n<tr>\n<td>Semantisk sökning</td>\n<td>~50 ms</td>\n<td>200 req/s</td>\n</tr>\n<tr>\n<td>Chat-poll</td>\n<td>~5 ms</td>\n<td>2000 req/s</td>\n</tr>\n</tbody></table>\n<h2>Nästa steg</h2>\n<ul>\n<li><a href=\"/docs/concepts/memory-model\">Minnesmodell</a></li>\n<li><a href=\"/docs/concepts/multi-tenancy\">Multitenancy</a></li>\n<li><a href=\"/docs/concepts/fts5-search\">FTS5-sökning</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/architecture","text":"/docs/concepts/architecture?format=text","json":"/docs/concepts/architecture?format=json","llm":"/docs/concepts/architecture?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}