Cascadev0.14.0
Платформа интеллектуального анализа трендов. Автоматический сбор сигналов из 5+ источников, каскадный AI-анализ влияния, ролевые рекомендации и готовые отчёты — всё что нужно чтобы принимать решения раньше конкурентов.
Скриншоты
Документация
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— drainsjobs(kind='analysis')(LangGraph + Ollama analysis pipeline) -
refine-worker— drainsjobs(kind='zone_refine')(zone deepen/expand LLM) -
lab-worker— drainsjobs(kind='lab_pipeline')(P5/P6 needs/products) -
admin-worker— drainsjobs(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 это пропускает.
Процесс
- Push в feature-ветку → создать MR в
main - Пройти CI (
lint+test+build:go-api+build:frontend) - Merge MR
- В GitLab UI нажать Deploy (manual stage)
- Проверить:
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
- rsync Python backend +
db/+i18n/+scripts/+ static bundle →$DEPLOY_PATH - Копирует Go binary из artifact
-
pip install -r requirements.txtвvenv - Копирует
BACKEND_ENV→$DEPLOY_PATH/.env -
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;'"
Правила проекта
- Не костыли. Если фикс затрагивает >3 файлов или >30 мин — согласуй подход с автором.
- Без SSH-деплоя. Только через CI.
-
Все зависимости в
requirements.txt(не вpyproject.toml— CI его игнорирует). -
Коммиты:
type(scope): description(feat / fix / perf / refactor / docs / test). -
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.