{"title":"Synapse Mimarisi","slug":"architecture","category":"concepts","summary":"Synapse nasıl inşa edilmiştir — Fastify, PostgreSQL, FTS5, gömmeler, MCP sunucusu.","audience":["human","llm"],"tags":["architecture","design","components"],"difficulty":"intermediate","updated":"2026-06-27","word_count":434,"read_minutes":2,"lang":"tr","translated":true,"requested_lang":"tr","content_markdown":"\n# Synapse Mimarisi\n\nSynapse, Fastify, FTS5 ile PostgreSQL ve anlamsal arama için isteğe bağlı bir gömme hizmeti üzerine inşa edilmiş çok kiracılı bir bellek API'sidir.\n\n## Üst Düzey Mimari\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## Çekirdek Bileşenler\n\n### 1. Synapse API (Fastify)\n\nAna HTTP sunucusu. Şunları ele alır:\n\n- REST uç noktaları (`/memory`, `/chat`, `/mind/tasks` vb.)\n- Kimlik doğrulama (ajanlar için Mind Key, insanlar için JWT)\n- Hız sınırlaması (yalnızca `?key=` kimlik doğrulaması)\n- Statik dosya sunumu (`/human`, `/docs` vb. web arayüzü)\n- Webhook dağıtımı\n\nPerformans için **Fastify 5** ile inşa edilmiştir. Üretimde 12800 portunda çalışır.\n\n### 2. FTS5 ile PostgreSQL\n\nBirincil veri deposu. Tam metin arama için FTS5 uzantısına sahip PostgreSQL kullanır.\n\n**Önemli tablolar:**\n\n| Tablo | Amaç |\n|-------|---------|\n| `users` | Kullanıcı hesapları |\n| `minds` | Mind kapsamları (her birinin bir Mind Key'i vardır) |\n| `memories` | FTS5 sanal tablosuyla bellek kayıtları |\n| `tasks` | Görev yönetimi |\n| `chat_messages` | Sohbet geçmişi |\n| `scripts` | Kalıcı betikler |\n| `webhooks` | Webhook kayıtları |\n| `cron_jobs` | Zamanlanmış görevler |\n| `variables` | Anahtar-değer deposu |\n| `audit_log` | Denetim izi |\n\n**FTS5**, tüm bellek içeriğinde milisaniyenin altında tam metin arama sağlar. Detaylar için bkz. [FTS5 Arama](/docs/concepts/fts5-search).\n\n### 3. Gömme Hizmeti (İsteğe Bağlı)\n\nAnlamsal arama için Synapse, bellek içeriğinin vektör gömmelerini üretir. Bunlar belleklerle birlikte saklanır ve benzerlik araması için kullanılır.\n\n- Sağlayıcı: yapılandırılabilir (OpenAI, yerel model vb.)\n- `memories` tablosunda `vector` sütunu olarak saklanır\n- `/memory/semantic-search` uç noktası tarafından kullanılır\n- Bkz. [Anlamsal Arama](/docs/concepts/semantic-search)\n\n### 4. MCP Sunucusu (Ayrı Hizmet)\n\nSynapse MCP sunucusu ayrı bir süreç (port 13100) olarak çalışır. Şunları yapar:\n\n- Model Context Protocol üzerinden 79 araç sunar\n- stdio, HTTP/SSE ve WebSocket taşıyıcılarını destekler\n- MCP araç çağrılarını Synapse API çağrılarına çevirir\n- Çok kiracılı: oturum başına bir Mind Key\n\n### 5. Browser Proxy (Ayrı Hizmet)\n\nTarayıcı otomasyonu için, 13000 portunda Playwright tabanlı ayrı bir hizmet çalışır. MCP sunucusu bunu `browser_*` araçları için çağırabilir.\n\n### 6. SSH Proxy (Ayrı Hizmet)\n\nSSH tabanlı uzak komutlar için, 12900 portunda ayrı bir hizmet çalışır.\n\n## Çok Kiracılılık Modeli\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\nHer mind tamamen izoledir. Mind Key'ler tam olarak bir mind'e erişim sağlar. JWT'ler kullanıcı hesabına erişim sağlar (mind'leri yönetmek için).\n\nDetaylar için bkz. [Çok Kiracılılık](/docs/concepts/multi-tenancy).\n\n## İstek Akışı\n\n### Bellek Saklama İsteği\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### Bellek Arama İsteği\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## Dağıtım\n\nSynapse bir Docker konteyneri olarak dağıtılır. Bkz. `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## Performans Karakteristikleri\n\n| İşlem | Gecikme | Verim |\n|-----------|---------|------------|\n| Bellek saklama | ~5ms | 1000+ istek/sn |\n| Bellek geri çağırma | ~20ms | 500 istek/sn |\n| FTS5 arama | ~10ms | 800 istek/sn |\n| Anlamsal arama | ~50ms | 200 istek/sn |\n| Sohbet poll | ~5ms | 2000 istek/sn |\n\n## Sonraki Adımlar\n\n- [Bellek Modeli](/docs/concepts/memory-model)\n- [Çok Kiracılılık](/docs/concepts/multi-tenancy)\n- [FTS5 Arama](/docs/concepts/fts5-search)\n","content_html":"<h1>Synapse Mimarisi</h1>\n<p>Synapse, Fastify, FTS5 ile PostgreSQL ve anlamsal arama için isteğe bağlı bir gömme hizmeti üzerine inşa edilmiş çok kiracılı bir bellek API&#39;sidir.</p>\n<h2>Üst Düzey Mimari</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>Çekirdek Bileşenler</h2>\n<h3>1. Synapse API (Fastify)</h3>\n<p>Ana HTTP sunucusu. Şunları ele alır:</p>\n<ul>\n<li>REST uç noktaları (<code>/memory</code>, <code>/chat</code>, <code>/mind/tasks</code> vb.)</li>\n<li>Kimlik doğrulama (ajanlar için Mind Key, insanlar için JWT)</li>\n<li>Hız sınırlaması (yalnızca <code>?key=</code> kimlik doğrulaması)</li>\n<li>Statik dosya sunumu (<code>/human</code>, <code>/docs</code> vb. web arayüzü)</li>\n<li>Webhook dağıtımı</li>\n</ul>\n<p>Performans için <strong>Fastify 5</strong> ile inşa edilmiştir. Üretimde 12800 portunda çalışır.</p>\n<h3>2. FTS5 ile PostgreSQL</h3>\n<p>Birincil veri deposu. Tam metin arama için FTS5 uzantısına sahip PostgreSQL kullanır.</p>\n<p><strong>Önemli tablolar:</strong></p>\n<table>\n<thead>\n<tr>\n<th>Tablo</th>\n<th>Amaç</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>users</code></td>\n<td>Kullanıcı hesapları</td>\n</tr>\n<tr>\n<td><code>minds</code></td>\n<td>Mind kapsamları (her birinin bir Mind Key&#39;i vardır)</td>\n</tr>\n<tr>\n<td><code>memories</code></td>\n<td>FTS5 sanal tablosuyla bellek kayıtları</td>\n</tr>\n<tr>\n<td><code>tasks</code></td>\n<td>Görev yönetimi</td>\n</tr>\n<tr>\n<td><code>chat_messages</code></td>\n<td>Sohbet geçmişi</td>\n</tr>\n<tr>\n<td><code>scripts</code></td>\n<td>Kalıcı betikler</td>\n</tr>\n<tr>\n<td><code>webhooks</code></td>\n<td>Webhook kayıtları</td>\n</tr>\n<tr>\n<td><code>cron_jobs</code></td>\n<td>Zamanlanmış görevler</td>\n</tr>\n<tr>\n<td><code>variables</code></td>\n<td>Anahtar-değer deposu</td>\n</tr>\n<tr>\n<td><code>audit_log</code></td>\n<td>Denetim izi</td>\n</tr>\n</tbody></table>\n<p><strong>FTS5</strong>, tüm bellek içeriğinde milisaniyenin altında tam metin arama sağlar. Detaylar için bkz. <a href=\"/docs/concepts/fts5-search\">FTS5 Arama</a>.</p>\n<h3>3. Gömme Hizmeti (İsteğe Bağlı)</h3>\n<p>Anlamsal arama için Synapse, bellek içeriğinin vektör gömmelerini üretir. Bunlar belleklerle birlikte saklanır ve benzerlik araması için kullanılır.</p>\n<ul>\n<li>Sağlayıcı: yapılandırılabilir (OpenAI, yerel model vb.)</li>\n<li><code>memories</code> tablosunda <code>vector</code> sütunu olarak saklanır</li>\n<li><code>/memory/semantic-search</code> uç noktası tarafından kullanılır</li>\n<li>Bkz. <a href=\"/docs/concepts/semantic-search\">Anlamsal Arama</a></li>\n</ul>\n<h3>4. MCP Sunucusu (Ayrı Hizmet)</h3>\n<p>Synapse MCP sunucusu ayrı bir süreç (port 13100) olarak çalışır. Şunları yapar:</p>\n<ul>\n<li>Model Context Protocol üzerinden 79 araç sunar</li>\n<li>stdio, HTTP/SSE ve WebSocket taşıyıcılarını destekler</li>\n<li>MCP araç çağrılarını Synapse API çağrılarına çevirir</li>\n<li>Çok kiracılı: oturum başına bir Mind Key</li>\n</ul>\n<h3>5. Browser Proxy (Ayrı Hizmet)</h3>\n<p>Tarayıcı otomasyonu için, 13000 portunda Playwright tabanlı ayrı bir hizmet çalışır. MCP sunucusu bunu <code>browser_*</code> araçları için çağırabilir.</p>\n<h3>6. SSH Proxy (Ayrı Hizmet)</h3>\n<p>SSH tabanlı uzak komutlar için, 12900 portunda ayrı bir hizmet çalışır.</p>\n<h2>Çok Kiracılılık Modeli</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>Her mind tamamen izoledir. Mind Key&#39;ler tam olarak bir mind&#39;e erişim sağlar. JWT&#39;ler kullanıcı hesabına erişim sağlar (mind&#39;leri yönetmek için).</p>\n<p>Detaylar için bkz. <a href=\"/docs/concepts/multi-tenancy\">Çok Kiracılılık</a>.</p>\n<h2>İstek Akışı</h2>\n<h3>Bellek Saklama İsteği</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>Bellek Arama İsteği</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>Dağıtım</h2>\n<p>Synapse bir Docker konteyneri olarak dağıtılır. Bkz. <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>Performans Karakteristikleri</h2>\n<table>\n<thead>\n<tr>\n<th>İşlem</th>\n<th>Gecikme</th>\n<th>Verim</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Bellek saklama</td>\n<td>~5ms</td>\n<td>1000+ istek/sn</td>\n</tr>\n<tr>\n<td>Bellek geri çağırma</td>\n<td>~20ms</td>\n<td>500 istek/sn</td>\n</tr>\n<tr>\n<td>FTS5 arama</td>\n<td>~10ms</td>\n<td>800 istek/sn</td>\n</tr>\n<tr>\n<td>Anlamsal arama</td>\n<td>~50ms</td>\n<td>200 istek/sn</td>\n</tr>\n<tr>\n<td>Sohbet poll</td>\n<td>~5ms</td>\n<td>2000 istek/sn</td>\n</tr>\n</tbody></table>\n<h2>Sonraki Adımlar</h2>\n<ul>\n<li><a href=\"/docs/concepts/memory-model\">Bellek Modeli</a></li>\n<li><a href=\"/docs/concepts/multi-tenancy\">Çok Kiracılılık</a></li>\n<li><a href=\"/docs/concepts/fts5-search\">FTS5 Arama</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"]}