Deploy: migrate k3s → Docker; search logic → master-agents-svc
- deploy/k3s удалён, deploy/docker добавлен (Caddyfile, docker-compose, searxng) - chat-svc: agents/models/prompts удалены, использует llm-svc (LLMClient, EmbeddingClient) - master-agents-svc: SearchOrchestrator, classifier, researcher, actions, widgets - web-svc: ChatModelSelector, Optimization, Sources удалены; InputBarPlus; UnregisterSW - geo-device-svc, localization-svc: Dockerfiles - docs: 02-k3s-services-spec.md, RUNBOOK/TELEMETRY/WORKING удалены Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,95 +0,0 @@
|
||||
# Runbook оператора GooSeek
|
||||
|
||||
**docs/architecture: 05-gaps-and-best-practices.md §9**
|
||||
|
||||
---
|
||||
|
||||
## 1. Проверка здоровья (K8s)
|
||||
|
||||
```bash
|
||||
# Поды
|
||||
kubectl get pods -n gooseek
|
||||
|
||||
# Health через port-forward (пример для chat-svc)
|
||||
kubectl port-forward svc/chat-svc 3005:3005 -n gooseek &
|
||||
curl -s http://localhost:3005/health
|
||||
```
|
||||
|
||||
Или через Ingress: `curl -s https://gooseek.ru/api/health` (если web-svc проксирует).
|
||||
|
||||
Readiness: заменить `/health` на `/ready`.
|
||||
|
||||
---
|
||||
|
||||
## 2. Redis
|
||||
|
||||
```bash
|
||||
redis-cli ping # PONG
|
||||
redis-cli KEYS "discover:*" # ключи discover
|
||||
redis-cli KEYS "finance:*" # ключи finance
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Cache-worker (pre-compute)
|
||||
|
||||
В K3s: CronJob выполняются по расписанию. Логи Jobs:
|
||||
|
||||
```bash
|
||||
kubectl get cronjobs -n gooseek
|
||||
kubectl get jobs -n gooseek
|
||||
kubectl logs job/<job-name> -n gooseek
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Типичные сбои
|
||||
|
||||
| Симптом | Причина | Действие |
|
||||
|---------|---------|----------|
|
||||
| Discover пусто | Redis нет discover:*, Ghost/GHOST_CONTENT_API_KEY | Проверить cache-worker CronJob, .env в ConfigMap |
|
||||
| Finance stub | FMP_API_KEY отсутствует или 429 | Добавить ключ, проверить лимиты FMP |
|
||||
| Search 429 | Лимит SearXNG | Настроить свой инстанс, SEARXNG_URL |
|
||||
| Chat зависает | LLM недоступен (Ollama/OpenAI) | Проверить OLLAMA_BASE_URL / OPENAI_API_KEY |
|
||||
|
||||
---
|
||||
|
||||
## 5. Масштабирование (K3s)
|
||||
|
||||
```bash
|
||||
kubectl scale deployment chat-svc -n gooseek --replicas=4
|
||||
```
|
||||
|
||||
HPA настроен в `deploy/k3s/hpa.yaml`. Требуется metrics-server.
|
||||
|
||||
---
|
||||
|
||||
## 6. Метрики Prometheus
|
||||
|
||||
Сервисы отдают `/metrics`. Аннотации на Pod: `prometheus.io/scrape`, `prometheus.io/port`, `prometheus.io/path`.
|
||||
|
||||
---
|
||||
|
||||
## 7. SSL (HTTPS для gooseek.ru)
|
||||
|
||||
См. **deploy/k3s/ssl/README.md** — получение сертификата, бэкап в `deploy/k3s/ssl/backup/`, создание Secret, применение ingress-production.yaml.
|
||||
|
||||
---
|
||||
|
||||
## 8. Порты
|
||||
|
||||
| Сервис | Порт |
|
||||
|--------|------|
|
||||
| web-svc | 3000 |
|
||||
| search-svc | 3001 |
|
||||
| discover-svc | 3002 |
|
||||
| finance-svc | 3003 |
|
||||
| travel-svc | 3004 |
|
||||
| chat-svc | 3005 |
|
||||
| projects-svc | 3006 |
|
||||
| billing-svc | 3008 |
|
||||
| library-svc | 3009 |
|
||||
| memory-svc | 3010 |
|
||||
| create-svc | 3011 |
|
||||
| notifications-svc | 3013 |
|
||||
| auth-svc | 3014 |
|
||||
@@ -1,29 +0,0 @@
|
||||
# Телеметрия и метрики в GooSeek
|
||||
|
||||
## Отправка данных третьим лицам (отключена)
|
||||
|
||||
| Источник | Сервис | Статус | Как отключено |
|
||||
|----------|--------|--------|---------------|
|
||||
| **Next.js** | web-svc | Отключено | `NEXT_TELEMETRY_DISABLED=1` в Dockerfile |
|
||||
| **better-auth** | auth-svc | Отключено | `telemetry: { enabled: false }` в auth.ts + `BETTER_AUTH_TELEMETRY=0` в env |
|
||||
| **workbox-google-analytics** | — | Не используется | Транзитивная зависимость next-pwa; GA не подключается в sw.js |
|
||||
| **OpenTelemetry** | — | Не настроено | Optional peer dep (Prisma); без провайдеров ничего не отправляет |
|
||||
|
||||
## Локальные метрики Prometheus (observability)
|
||||
|
||||
Эндпоинты `/metrics` **не отправляют** данные наружу. Prometheus скрейпит их внутри кластера.
|
||||
|
||||
| Сервис | Endpoint |
|
||||
|--------|----------|
|
||||
| chat-svc | `GET /metrics` |
|
||||
| search-svc | `GET /metrics` |
|
||||
| discover-svc | `GET /metrics` |
|
||||
| finance-svc | `GET /metrics` |
|
||||
| travel-svc | `GET /metrics` |
|
||||
| library-svc | `GET /metrics` |
|
||||
| memory-svc | `GET /metrics` |
|
||||
| create-svc | `GET /metrics` |
|
||||
| audit-svc | `GET /metrics` |
|
||||
| web-svc | `GET /api/metrics` |
|
||||
|
||||
Для полного отключения метрик удалите эти эндпоинты и аннотации `prometheus.io/*` в `deploy/k3s/*.yaml`.
|
||||
@@ -1,7 +1,7 @@
|
||||
# Архитектура аналога Perplexity.ai — полная спецификация
|
||||
|
||||
Документ описывает полную архитектуру системы на базе микросервисов K3s с акцентом на:
|
||||
- **ВСЕ сервисы в `services/`.** Папка `apps/` удаляется. Микросервисная архитектура: chat, search, discover, finance, travel, auth, library, memory, create, notifications, projects, web (UI), cache-worker.
|
||||
Документ описывает полную архитектуру системы на базе **СОА (сервисной архитектуры)** в K3s с акцентом на:
|
||||
- **ВСЕ сервисы в `services/`.** Папка `apps/` удаляется. Сервисная архитектура: chat, search, discover, finance, travel, auth, library, memory, create, notifications, projects, web (UI), cache-worker.
|
||||
- **~10 000 DAU** (ежедневных пользователей)
|
||||
- **Клиентская логика** — максимум на клиенте; персональные данные — только для аккаунтов
|
||||
- **Предварительная обработка и кэш** — новости, finance, travel, повторяющиеся запросы
|
||||
@@ -249,7 +249,7 @@
|
||||
|
||||
---
|
||||
|
||||
## 3. Микросервисы K3s
|
||||
## 3. Сервисы K3s (СОА)
|
||||
|
||||
### 3.1 Карта сервисов
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ BACKEND MICROSERVICES (K3s) │
|
||||
│ BACKEND SERVICES (K3s, SOA) │
|
||||
├─────────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
@@ -305,7 +305,7 @@
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.2 Описание микросервисов
|
||||
### 3.2 Описание сервисов
|
||||
|
||||
| Сервис | Язык | Replicas (10k DAU) | Назначение |
|
||||
|--------|------|--------------------|------------|
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# K3s — спецификация микросервисов
|
||||
# K3s — спецификация сервисов (СОА)
|
||||
|
||||
## 1. Обзор инфраструктуры K3s
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
│ K3s Cluster │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
│ Ingress (Traefik) │
|
||||
│ api.perplexica.local → path-based routing к микросервисам │
|
||||
│ api.perplexica.local → path-based routing к сервисам │
|
||||
│ auth.perplexica.local → auth-svc:3000 │
|
||||
│ *.perplexica.local → web (static) │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
@@ -1310,7 +1310,7 @@ spec:
|
||||
- auth.perplexica.local
|
||||
secretName: perplexica-tls
|
||||
rules:
|
||||
# API: path-based маршрутизация к микросервисам
|
||||
# API: path-based маршрутизация к сервисам
|
||||
- host: api.perplexica.local
|
||||
http:
|
||||
paths:
|
||||
@@ -11,7 +11,7 @@
|
||||
| **Инфраструктура** | SearXNG — единый инстанс | Очередь запросов в search-svc; при росте — пул инстансов |
|
||||
| **Инфраструктура** | cache-worker зависает | `activeDeadlineSeconds` во всех CronJob (5–20 мин) |
|
||||
| **Инфраструктура** | Redis/PostgreSQL без HA | Sentinel/Cluster и Read replica при масштабировании |
|
||||
| **Инфраструктура** | travel-svc без HPA | HPA 1–4 replicas добавлен в 02-k3s-microservices-spec |
|
||||
| **Инфраструктура** | travel-svc без HPA | HPA 1–4 replicas добавлен в 02-k3s-services-spec |
|
||||
| **Функции** | Внешние API (LLM, FMP, TA) | Retry + circuit breaker; fallback при частичном сбое |
|
||||
|
||||
## 1. Инфраструктура
|
||||
@@ -103,6 +103,6 @@
|
||||
- [04-pages-logic-verification.md §9](./04-pages-logic-verification.md#9-покрытие-фич-perplexity-20252026) — покрытие vs Perplexity 2026
|
||||
- [06-roadmap-specification.md](./06-roadmap-specification.md) — roadmap и спеки фич
|
||||
- [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md)
|
||||
- [02-k3s-microservices-spec.md](./02-k3s-microservices-spec.md)
|
||||
- [02-k3s-services-spec.md](./02-k3s-services-spec.md)
|
||||
- [03-cache-and-precompute-strategy.md](./03-cache-and-precompute-strategy.md)
|
||||
- [04-pages-logic-verification.md](./04-pages-logic-verification.md)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## 1. Спецификация фич (детали)
|
||||
|
||||
Все пункты определены в [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md), [02-k3s-microservices-spec.md](./02-k3s-microservices-spec.md), [04-pages-logic-verification.md §9](./04-pages-logic-verification.md#9-покрытие-фич-perplexity-20252026).
|
||||
Все пункты определены в [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md), [02-k3s-services-spec.md](./02-k3s-services-spec.md), [04-pages-logic-verification.md §9](./04-pages-logic-verification.md#9-покрытие-фич-perplexity-20252026).
|
||||
|
||||
### 1.1 Memory (memory-svc)
|
||||
- **Сервис:** memory-svc, порт 3010
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Миграция GooSeek на микросервисную архитектуру
|
||||
# Миграция GooSeek на сервисную архитектуру (СОА)
|
||||
|
||||
**Ссылки:** [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md), [02-k3s-microservices-spec.md](./02-k3s-microservices-spec.md)
|
||||
**Ссылки:** [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md), [02-k3s-services-spec.md](./02-k3s-services-spec.md)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
|
||||
**Отдельный проект.** Документы самодостаточны; все спеки и roadmap — внутри этой папки.
|
||||
|
||||
## СОА (сервисная архитектура)
|
||||
|
||||
Используется **СОА**, а не микросервисная архитектура: доменные сервисы (chat, search, finance и т.д.), единая точка входа (api-gateway), стандартизированные REST API. Сервисы — бизнес-компоненты, а не атомарные микросервисы.
|
||||
|
||||
Целевая система для ~10 000 DAU с **полным совпадением** логики Perplexity.ai:
|
||||
- **ВСЁ в `services/`.** Папка `apps/` удаляется. Никаких app — только микросервисы.
|
||||
- Микросервисы в K3s (chat, search, discover, finance, travel, auth, library, memory, create, notifications, projects, cache-worker, web/frontend)
|
||||
- **СОА (сервисная архитектура).** Папка `apps/` удаляется. Никаких app — только сервисы.
|
||||
- Сервисы в K3s (chat, search, discover, finance, travel, auth, library, memory, create, notifications, projects, cache-worker, web/frontend)
|
||||
- Максимум логики на клиенте; персональные данные только для аккаунтов
|
||||
- Предварительная обработка и кэширование (discover, finance, travel+inspiration, поиск)
|
||||
|
||||
@@ -12,8 +16,8 @@
|
||||
|
||||
| Документ | Описание |
|
||||
|----------|----------|
|
||||
| [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md) | Карта функциональностей, микросервисы, стратегия кэша, порядок реализации |
|
||||
| [02-k3s-microservices-spec.md](./02-k3s-microservices-spec.md) | K3s манифесты, Deployment, Service, CronJob для каждого сервиса |
|
||||
| [01-perplexity-analogue-design.md](./01-perplexity-analogue-design.md) | Карта функциональностей, сервисы СОА, стратегия кэша, порядок реализации |
|
||||
| [02-k3s-services-spec.md](./02-k3s-services-spec.md) | K3s манифесты, Deployment, Service, CronJob для каждого сервиса |
|
||||
| [03-cache-and-precompute-strategy.md](./03-cache-and-precompute-strategy.md) | Детальная стратегия кэширования: discover, finance, travel, search |
|
||||
| [04-pages-logic-verification.md](./04-pages-logic-verification.md) | Сверка логики страниц с Perplexity.ai — полное совпадение |
|
||||
| [05-gaps-and-best-practices.md](./05-gaps-and-best-practices.md) | Production checklist, требования инфраструктуры |
|
||||
@@ -22,7 +26,7 @@
|
||||
## Быстрый старт
|
||||
|
||||
1. Прочитать `01-perplexity-analogue-design.md` для общего понимания
|
||||
2. Использовать `02-k3s-microservices-spec.md` для развёртывания
|
||||
2. Использовать `02-k3s-services-spec.md` для развёртывания
|
||||
3. Реализовать `cache-worker` и Redis по `03-cache-and-precompute-strategy.md`
|
||||
|
||||
## Отношение к functional-inventory
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
# How GooSeek Works
|
||||
|
||||
This is a high level overview of how Perplexica answers a question.
|
||||
|
||||
If you want a component level overview, see [README.md](README.md).
|
||||
|
||||
If you want implementation details, see [CONTRIBUTING.md](../../CONTRIBUTING.md).
|
||||
|
||||
## What happens when you ask a question
|
||||
|
||||
When you send a message in the UI, the app calls `POST /api/chat`.
|
||||
|
||||
At a high level, we do three things:
|
||||
|
||||
1. Classify the question and decide what to do next.
|
||||
2. Run research and widgets in parallel.
|
||||
3. Write the final answer and include citations.
|
||||
|
||||
## Classification
|
||||
|
||||
Before searching or answering, we run a classification step.
|
||||
|
||||
This step decides things like:
|
||||
|
||||
- Whether we should do research for this question
|
||||
- Whether we should show any widgets
|
||||
- How to rewrite the question into a clearer standalone form
|
||||
|
||||
## Widgets
|
||||
|
||||
Widgets are small, structured helpers that can run alongside research.
|
||||
|
||||
Examples include weather, stocks, and simple calculations.
|
||||
|
||||
If a widget is relevant, we show it in the UI while the answer is still being generated.
|
||||
|
||||
Widgets are helpful context for the answer, but they are not part of what the model should cite.
|
||||
|
||||
## Research
|
||||
|
||||
If research is needed, we gather information in the background while widgets can run.
|
||||
|
||||
Depending on configuration, research may include web lookup and searching user uploaded files.
|
||||
|
||||
## Answer generation
|
||||
|
||||
Once we have enough context, the chat model generates the final response.
|
||||
|
||||
You can control the tradeoff between speed and quality using `optimizationMode`:
|
||||
|
||||
- `speed`
|
||||
- `balanced`
|
||||
- `quality`
|
||||
|
||||
## How citations work
|
||||
|
||||
We prompt the model to cite the references it used. The UI then renders those citations alongside the supporting links.
|
||||
|
||||
## Search API
|
||||
|
||||
If you are integrating GooSeek into another product, you can call `POST /api/search`.
|
||||
|
||||
It returns:
|
||||
|
||||
- `message`: the generated answer
|
||||
- `sources`: supporting references used for the answer
|
||||
|
||||
You can also enable streaming by setting `stream: true`.
|
||||
|
||||
## Image and video search
|
||||
|
||||
Image and video search use separate endpoints (`POST /api/images` and `POST /api/videos`). We generate a focused query using the chat model, then fetch matching results from a search backend.
|
||||
Reference in New Issue
Block a user