{"title":"Архітектура Synapse","slug":"architecture","category":"concepts","summary":"Як побудовано Synapse — Fastify, PostgreSQL, FTS5, ембеддинги, MCP-сервер.","audience":["human","llm"],"tags":["architecture","design","components"],"difficulty":"intermediate","updated":"2026-06-27","word_count":425,"read_minutes":2,"lang":"uk","translated":true,"requested_lang":"uk","content_markdown":"\n# Архітектура Synapse\n\nSynapse — це мультитенантний API пам'яті, побудований на Fastify, PostgreSQL із\nFTS5 та опціональній службі ембеддингів для семантичного пошуку.\n\n## Архітектура високого рівня\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## Основні компоненти\n\n### 1. Synapse API (Fastify)\n\nГоловний HTTP-сервер. Обробляє:\n\n- REST-кінцеві точки (`/memory`, `/chat`, `/mind/tasks` тощо)\n- Автентифікацію (Mind Key для агентів, JWT для людей)\n- Обмеження частоти (лише для автентифікації `?key=`)\n- Віддачу статичних файлів (веб-інтерфейс на `/human`, `/docs` тощо)\n- Диспетчеризацію webhook-ів\n\nПобудовано на **Fastify 5** для високої продуктивності. У продакшені працює на\nпорту 12800.\n\n### 2. PostgreSQL з FTS5\n\nОсновне сховище даних. Використовує PostgreSQL із розширенням FTS5 для\nповнотекстового пошуку.\n\n**Основні таблиці:**\n\n| Таблиця | Призначення |\n|-------|---------|\n| `users` | Облікові записи користувачів |\n| `minds` | Області mind-ів (кожен має Mind Key) |\n| `memories` | Записи спогадів із віртуальною таблицею FTS5 |\n| `tasks` | Керування завданнями |\n| `chat_messages` | Історія чату |\n| `scripts` | Постійні скрипти |\n| `webhooks` | Реєстрації webhook-ів |\n| `cron_jobs` | Заплановані завдання |\n| `variables` | Сховище ключ-значення |\n| `audit_log` | Журнал аудиту |\n\n**FTS5** забезпечує повнотекстовий пошук за всіма спогадами з затримкою менше\nмілісекунди. Докладніше дивіться у [пошуку FTS5](/docs/concepts/fts5-search).\n\n### 3. Служба ембеддингів (опціональна)\n\nДля семантичного пошуку Synapse генерує векторні ембеддинги вмісту спогадів.\nВони зберігаються разом зі спогадами та використовуються для пошуку за подібністю.\n\n- Постачальник: настроюваний (OpenAI, локальна модель тощо)\n- Зберігається у колонці `vector` у таблиці `memories`\n- Використовується кінцевою точкою `/memory/semantic-search`\n- Дивіться [Семантичний пошук](/docs/concepts/semantic-search)\n\n### 4. MCP-сервер (окрема служба)\n\nMCP-сервер Synapse працює як окремий процес (порт 13100). Він:\n\n- Надає 79 інструментів через Model Context Protocol\n- Підтримує транспорти stdio, HTTP/SSE та WebSocket\n- Перетворює виклики MCP-інструментів у виклики API Synapse\n- Мультитенантний: один Mind Key на сесію\n\n### 5. Браузерний проксі (окрема служба)\n\nДля автоматизації браузера окрема служба на основі Playwright працює на порту\n13000. MCP-сервер може викликати її для інструментів `browser_*`.\n\n### 6. SSH-проксі (окрема служба)\n\nДля віддалених команд через SSH окрема служба працює на порту 12900.\n\n## Модель мультитенантності\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  │   └── ... (ізольований від Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...\n```\n\nКожен mind повністю ізольований. Mind Keys надають доступ лише до одного mind-у.\nJWT надають доступ до облікового запису користувача (для керування mind-ами).\n\nДокладніше дивіться у [Мультитенантності](/docs/concepts/multi-tenancy).\n\n## Потік запитів\n\n### Запит на збереження спогаду\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### Запит на пошук спогадів\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## Розгортання\n\nSynapse розгортається як Docker-контейнер. Дивіться `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## Характеристики продуктивності\n\n| Операція | Затримка | Пропускна здатність |\n|-----------|---------|------------|\n| Збереження спогаду | ~5мс | 1000+ запитів/с |\n| Відкликання спогадів | ~20мс | 500 запитів/с |\n| Пошук FTS5 | ~10мс | 800 запитів/с |\n| Семантичний пошук | ~50мс | 200 запитів/с |\n| Опитування чату | ~5мс | 2000 запитів/с |\n\n## Наступні кроки\n\n- [Модель пам'яті](/docs/concepts/memory-model)\n- [Мультитенантність](/docs/concepts/multi-tenancy)\n- [Пошук FTS5](/docs/concepts/fts5-search)\n","content_html":"<h1>Архітектура Synapse</h1>\n<p>Synapse — це мультитенантний API пам&#39;яті, побудований на Fastify, PostgreSQL із\nFTS5 та опціональній службі ембеддингів для семантичного пошуку.</p>\n<h2>Архітектура високого рівня</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>Основні компоненти</h2>\n<h3>1. Synapse API (Fastify)</h3>\n<p>Головний HTTP-сервер. Обробляє:</p>\n<ul>\n<li>REST-кінцеві точки (<code>/memory</code>, <code>/chat</code>, <code>/mind/tasks</code> тощо)</li>\n<li>Автентифікацію (Mind Key для агентів, JWT для людей)</li>\n<li>Обмеження частоти (лише для автентифікації <code>?key=</code>)</li>\n<li>Віддачу статичних файлів (веб-інтерфейс на <code>/human</code>, <code>/docs</code> тощо)</li>\n<li>Диспетчеризацію webhook-ів</li>\n</ul>\n<p>Побудовано на <strong>Fastify 5</strong> для високої продуктивності. У продакшені працює на\nпорту 12800.</p>\n<h3>2. PostgreSQL з FTS5</h3>\n<p>Основне сховище даних. Використовує PostgreSQL із розширенням FTS5 для\nповнотекстового пошуку.</p>\n<p><strong>Основні таблиці:</strong></p>\n<table>\n<thead>\n<tr>\n<th>Таблиця</th>\n<th>Призначення</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>users</code></td>\n<td>Облікові записи користувачів</td>\n</tr>\n<tr>\n<td><code>minds</code></td>\n<td>Області mind-ів (кожен має Mind Key)</td>\n</tr>\n<tr>\n<td><code>memories</code></td>\n<td>Записи спогадів із віртуальною таблицею FTS5</td>\n</tr>\n<tr>\n<td><code>tasks</code></td>\n<td>Керування завданнями</td>\n</tr>\n<tr>\n<td><code>chat_messages</code></td>\n<td>Історія чату</td>\n</tr>\n<tr>\n<td><code>scripts</code></td>\n<td>Постійні скрипти</td>\n</tr>\n<tr>\n<td><code>webhooks</code></td>\n<td>Реєстрації webhook-ів</td>\n</tr>\n<tr>\n<td><code>cron_jobs</code></td>\n<td>Заплановані завдання</td>\n</tr>\n<tr>\n<td><code>variables</code></td>\n<td>Сховище ключ-значення</td>\n</tr>\n<tr>\n<td><code>audit_log</code></td>\n<td>Журнал аудиту</td>\n</tr>\n</tbody></table>\n<p><strong>FTS5</strong> забезпечує повнотекстовий пошук за всіма спогадами з затримкою менше\nмілісекунди. Докладніше дивіться у <a href=\"/docs/concepts/fts5-search\">пошуку FTS5</a>.</p>\n<h3>3. Служба ембеддингів (опціональна)</h3>\n<p>Для семантичного пошуку Synapse генерує векторні ембеддинги вмісту спогадів.\nВони зберігаються разом зі спогадами та використовуються для пошуку за подібністю.</p>\n<ul>\n<li>Постачальник: настроюваний (OpenAI, локальна модель тощо)</li>\n<li>Зберігається у колонці <code>vector</code> у таблиці <code>memories</code></li>\n<li>Використовується кінцевою точкою <code>/memory/semantic-search</code></li>\n<li>Дивіться <a href=\"/docs/concepts/semantic-search\">Семантичний пошук</a></li>\n</ul>\n<h3>4. MCP-сервер (окрема служба)</h3>\n<p>MCP-сервер Synapse працює як окремий процес (порт 13100). Він:</p>\n<ul>\n<li>Надає 79 інструментів через Model Context Protocol</li>\n<li>Підтримує транспорти stdio, HTTP/SSE та WebSocket</li>\n<li>Перетворює виклики MCP-інструментів у виклики API Synapse</li>\n<li>Мультитенантний: один Mind Key на сесію</li>\n</ul>\n<h3>5. Браузерний проксі (окрема служба)</h3>\n<p>Для автоматизації браузера окрема служба на основі Playwright працює на порту\n13000. MCP-сервер може викликати її для інструментів <code>browser_*</code>.</p>\n<h3>6. SSH-проксі (окрема служба)</h3>\n<p>Для віддалених команд через SSH окрема служба працює на порту 12900.</p>\n<h2>Модель мультитенантності</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  │   └── ... (ізольований від Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...</code></pre><p>Кожен mind повністю ізольований. Mind Keys надають доступ лише до одного mind-у.\nJWT надають доступ до облікового запису користувача (для керування mind-ами).</p>\n<p>Докладніше дивіться у <a href=\"/docs/concepts/multi-tenancy\">Мультитенантності</a>.</p>\n<h2>Потік запитів</h2>\n<h3>Запит на збереження спогаду</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>Запит на пошук спогадів</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>Розгортання</h2>\n<p>Synapse розгортається як Docker-контейнер. Дивіться <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>Характеристики продуктивності</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>Збереження спогаду</td>\n<td>~5мс</td>\n<td>1000+ запитів/с</td>\n</tr>\n<tr>\n<td>Відкликання спогадів</td>\n<td>~20мс</td>\n<td>500 запитів/с</td>\n</tr>\n<tr>\n<td>Пошук FTS5</td>\n<td>~10мс</td>\n<td>800 запитів/с</td>\n</tr>\n<tr>\n<td>Семантичний пошук</td>\n<td>~50мс</td>\n<td>200 запитів/с</td>\n</tr>\n<tr>\n<td>Опитування чату</td>\n<td>~5мс</td>\n<td>2000 запитів/с</td>\n</tr>\n</tbody></table>\n<h2>Наступні кроки</h2>\n<ul>\n<li><a href=\"/docs/concepts/memory-model\">Модель пам&#39;яті</a></li>\n<li><a href=\"/docs/concepts/multi-tenancy\">Мультитенантність</a></li>\n<li><a href=\"/docs/concepts/fts5-search\">Пошук FTS5</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"]}