BorisovAI
Все проекты

Cascadev0.14.0

Платформа интеллектуального анализа трендов. Автоматический сбор сигналов из 5+ источников, каскадный AI-анализ влияния, ролевые рекомендации и готовые отчёты — всё что нужно чтобы принимать решения раньше конкурентов.

Cascade
Платформы аналитикиPythonTSXGoTypeScriptCSS

Скриншоты

Документация

Cascade Trend Analysis

Система сбора и анализа технологических/новостных сигналов. Извлекает факты, группирует в события, формирует тренды, генерирует аналитические отчёты.

Stack: Python 3.12+ · PostgreSQL 16 + pgvector · Go 1.21+ · React + TypeScript · Ollama LLM


Архитектура (v0.22+)

┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│  Frontend   │ ───► │   Go API    │ ───► │ PostgreSQL  │
│  React SPA  │      │  :4010 RO   │      │ + pgvector  │
└─────────────┘      └──────┬──────┘      └─────────────┘
                            │ writes proxy        ▲  ▲
                            ▼                     │  │
                     ┌─────────────┐              │  │
                     │ Python API  │──────────────┘  │
                     │  :4014 RW   │                 │
                     └─────────────┘                 │

                     ┌─────────────┐                 │
                     │  Pipeline   │─────────────────┘
                     │  45+ src    │  crawl + extract + link
                     └─────────────┘


                     ┌─────────────┐
                     │   Ollama    │  tier1: hermes3 (:11436)
                     │  3 tunnels  │  tier2: gemma4 (:11435)
                     └─────────────┘

8 процессов на проде (PM2, v0.26.0+):

  • go-api — единственный HTTP frontend (port 4010), отдаёт статику SPA, owns все 120+ routes
  • collector — crawl source adapters → writes signals
  • analytics — fact extraction + event linker + summarizer + ai_insights + watchdog
  • embedding-svc — gRPC singleton fastembed (:50051), shared by all consumers
  • analysis-worker — drains jobs(kind='analysis') (LangGraph + Ollama analysis pipeline)
  • refine-worker — drains jobs(kind='zone_refine') (zone deepen/expand LLM)
  • lab-worker — drains jobs(kind='lab_pipeline') (P5/P6 needs/products)
  • admin-worker — drains jobs(kind='admin_action') (sklearn cleanup/regen)

python-api FastAPI процесс retired в мае 2026 (Phase 3c6 final). Все HTTP endpoints native в Go; долгие LLM/ML задачи идут через Postgres job queues с LISTEN/NOTIFY к выделенным worker-процессам.


Быстрый старт (разработка)

Требования

  • Python 3.12+
  • Node 20+
  • Go 1.21+ (только если будете менять Go API)
  • Docker (для PostgreSQL + SearXNG)
  • Ollama tunnels (см. раздел LLM ниже) — опционально, без них LLM-шаги не работают

1. PostgreSQL + pgvector

cd docker/postgres-trends
docker compose up -d
# проверь: docker exec postgres-trends pg_isready -U trends

Применить схему (один раз на пустую БД):

docker exec -i postgres-trends psql -U trends trends < db/pg_schema.sql
docker exec -i postgres-trends psql -U trends trends < db/pg_indexes.sql

2. Python backend

python3.12 -m venv venv
source venv/bin/activate                    # Linux/Mac
# venv\Scripts\activate                      # Windows
pip install -r requirements.txt

# Настройка .env (см. раздел "Переменные окружения" ниже)
cp .env.example .env
$EDITOR .env

3. Фронтенд

cd frontend-cascade/app
npm install
npm run dev    # http://localhost:5173

4. Запуск dev-сервера

# вариант 1: всё сразу (API + фронт)
python dev.py

# вариант 2: только API
python dev.py --api-only --port 8000

# вариант 3: только фронт
python dev.py --web-only

5. Запуск pipeline (опционально)

Pipeline разделён на два процесса — запускайте оба в отдельных терминалах:

source venv/bin/activate

# терминал 1 — сбор сигналов
python -m src.workers.collector

# терминал 2 — обработка (extraction, events, trends, ai_insights, watchdog)
python -m src.workers.analytics

Переменные окружения

Скопируйте .env.example.env и заполните:

Обязательные

DATABASE_URL=postgresql://trends:PASSWORD@localhost:5432/trends

# Ollama tunnels — 3 отдельных инстанса
OLLAMA_URL=http://localhost:11435            # tier2/3: gemma4:e2b (translation, reasoning)
OLLAMA_TIER1_URL=http://localhost:11436      # tier1: hermes3:8b (fact extraction)
OLLAMA_BACKUP_URL=http://localhost:11434     # backup (opportunistic)

LLM_PROVIDER=ollama

Auth (Casdoor)

CASDOOR_ENDPOINT=https://auth.trendominus.ru
CASDOOR_CLIENT_ID=...
CASDOOR_CLIENT_SECRET=...
CASDOOR_JWT_SECRET=...                       # public key of Casdoor JWT cert

Необязательные

SEARXNG_ENABLED=0                            # fetch_news через SearXNG (default: off)
SEARXNG_ENRICHMENT=0                         # citation enrichment (default: off — блокирует event loop)

Frontend (frontend-cascade/app/.env)

VITE_API_URL=                                # пусто = same-origin; иначе https://api.example.com

Production deploy

Деплой только через CI/CD (GitLab). SSH-деплой запрещён: CI билдит Go binary + Vite bundle, ручной rsync это пропускает.

Процесс

  1. Push в feature-ветку → создать MR в main
  2. Пройти CI (lint + test + build:go-api + build:frontend)
  3. Merge MR
  4. В GitLab UI нажать Deploy (manual stage)
  5. Проверить: curl https://trendominus.ru/api/health

GitLab CI Variables (Settings → CI/CD → Variables)

Ключ Тип Описание
BACKEND_ENV File Полный .env для прода (все переменные выше)
DEPLOY_PATH Variable /var/www/trend-analisis
VITE_API_URL Variable пусто для same-origin

Пример содержимого BACKEND_ENV — см. .gitlab/ci/pipeline.yml (секция deploy).

Что делает deploy job

  1. rsync Python backend + db/ + i18n/ + scripts/ + static bundle → $DEPLOY_PATH
  2. Копирует Go binary из artifact
  3. pip install -r requirements.txt в venv
  4. Копирует BACKEND_ENV$DEPLOY_PATH/.env
  5. pm2 reload ecosystem.config.js --update-env (применяет config + рестартит все 8 процессов: go-api, collector, analytics, embedding-svc, analysis-worker, refine-worker, lab-worker, admin-worker)

Первый запуск инфраструктуры

# Manual CI job:
install:postgres-trends    # ставит pgvector/pgvector:pg16 в docker-compose

LLM infrastructure

3 Ollama инстанса (разные GPU, разные туннели):

Port GPU Модель Роль
11436 3090-B hermes3:8b Tier 1 — fact extraction
11435 3090-A gemma4:e2b Tier 2/3 — translation, reasoning, summarizer
11434 4090 any Opportunistic backup (нестабильный)

Туннели конфигурируются через FRP client. Подробнее: CLAUDE.md → Ollama Infrastructure.


Разработка

Перед push'ем

venv/Scripts/python.exe -m ruff check src/ api/           # lint (0 errors)
cd frontend-cascade/app && npx tsc --noEmit && npx vite build

Тесты

venv/Scripts/python.exe -m pytest tests/ -x -q            # 740+ tests

Работа с БД

# Применить миграции (только SQLite — PG schema статическая)
venv/Scripts/python.exe -m db.migrator

# Консоль PG
docker exec -it postgres-trends psql -U trends trends

Структура репозитория

go-api/           Go HTTP layer (chi router, port 4010) — единственный HTTP frontend
  internal/
    handler/      120+ endpoints (analyses, profile, lab, admin, auth, v1, ...)
    store/        SQL data access + queue enqueue helpers
    embedding/    gRPC client to embedding-svc
    auth/         Casdoor OIDC + admin + JWT verify
api/              Python business logic (no HTTP server with v0.26.0+)
  services/       analysis_runner.py (LangGraph), event_search.py, ...
  translation_service.py, glossary_store.py — called from workers
src/              Pipeline + queue workers + adapters
  workers/
    collector.py, analytics.py              # standalone pipeline
    analysis_worker.py, refine_worker.py    # drains LLM job kinds
    lab_worker.py, admin_action_worker.py   # drains lab/admin job kinds
  services/       fact_extractor, event_linker, adapters/ (45+)
  llm/            Ollama clients (tier1/2/3 routing)
db/               engine.py (DAL), migrations, pg_schema.sql
frontend-cascade/ React SPA (cascade-trend.ru)
frontend-news/    React SPA (news.cascade-trend.ru)
tests/            pytest
scripts/          CI/CD, ops helpers
docker/           postgres-trends, searxng, ollama-proxy
.gitlab/ci/       GitLab CI pipeline

Мониторинг

# Статус процессов
ssh prod "sudo -u gitlab-runner pm2 list"

# Логи
ssh prod "sudo -u gitlab-runner pm2 logs pipeline --lines 50"

# Здоровье API
curl https://trendominus.ru/api/health

# Состояние БД
ssh prod "docker exec postgres-trends psql -U trends trends -c \
  'SELECT COUNT(*) FROM events; SELECT COUNT(*) FROM facts;'"

Правила проекта

  1. Не костыли. Если фикс затрагивает >3 файлов или >30 мин — согласуй подход с автором.
  2. Без SSH-деплоя. Только через CI.
  3. Все зависимости в requirements.txt (не в pyproject.toml — CI его игнорирует).
  4. Коммиты: type(scope): description (feat / fix / perf / refactor / docs / test).
  5. Version bump при каждом коммите: patch-bump в pyproject.toml + frontend-cascade/app/package.json.

Подробнее — см. CLAUDE.md.

История изменений

Rendering aborted due to complexity issues. If this is valid markdown, please feel free to open an issue and attach the original markdown to the issue.

Оцените материал

0/1000