← Все ТЗ

🧬 Портфельная Data-Архитектура

Единый концепт для 6 сайтов портфеля — Supabase + модульные блоки + Looker Studio + AI Analyst
📅 24.04.2026 🎯 Для всех 6 сайтов: bestonline · ayurtour · panchakarma · evisa24 · visa-russian · viza-india 🔗 Cross-fire документ

📢 Этот документ

Сводный концепт модульной data-архитектуры. Применяется ко всем 6 сайтам портфеля. Один раз разработали — годы используем.

Принцип cross-fire: один API-ключ Supabase, один Looker аккаунт, одни правила — 6 проектов получают общую инфраструктуру.

1 Философия

Ключевые принципы

  1. «Раз вложиться — радости на годы» — система > ручная работа. Правило 3 раз
  2. Портфельный cross-fire — 1 инфраструктура работает на 6 сайтов
  3. Модульность — блоки как MCP-серверы с контрактами
  4. Safe Evolution — новое не портит старое, правим не мешая новому
  5. Dashboard-first — стратегические документы в дашборде, не в памяти
  6. Human в loop — AI ассистирует, не автоматизирует до проверки
  7. Backward compat всегда — forward-only migrations

2 Технический стек

СлойТехнологияЗачем
База данныхSupabase (PostgreSQL)Schemas per block, RLS, triggers, Realtime
Event busPostgres NOTIFY/LISTEN + Supabase RealtimeБлоки общаются без tight coupling
APISupabase REST + Edge FunctionsAuto-generated REST от схем + custom logic
Auth / RLSSupabase Auth + Row Level SecurityБезопасность per-role
MigrationsSupabase migrations в gitВерсионирование схем
DashboardsLooker Studio (connector PostgreSQL)Визуализация метрик
CMSWordPress + Bricks + ACF ProМенеджерская админка
ScriptsPython + Node.jsETL, cron jobs, bulk operations
AI layer (future)Claude APIБлок 9 — AI Analyst

3 8 блоков модульной архитектуры

┌─────────────────────────────────────────────────────────────┐ │ ШИНА СОБЫТИЙ (Supabase Realtime / Postgres NOTIFY) │ └─────────────────────────────────────────────────────────────┘ ↑ ↑ ↑ ↑ ↑ ┌────┴──┐ ┌────┴───┐ ┌───┴────┐ ┌────┴─────┐ ┌────┴─────┐ │ CORE │ │CONTENT │ │HOTELS │ │ANALYTICS │ │ SEO │ │ URLs │ │Titles │ │Каталог │ │GSC · GA4 │ │Positions │ │Шаблоны│ │Meta │ │Операто-│ │Метрика │ │Keywords │ │Теги │ │Schema │ │ры · API│ │Вебмастер │ │Backlinks │ └───────┘ └────────┘ └────────┘ └──────────┘ └──────────┘ ↑ ↑ ↑ ↑ ↑ ┌────┴─────┐ ┌──┴──────┐ ┌┴──────────┐ │LEADS & │ │NOTIFICA-│ │ ADMIN & │ │ORDERS │ │TIONS │ │ AUDIT │ │Заявки │ │Push subs│ │Users │ │Бронирова-│ │Email │ │Roles │ │ния │ │Events │ │Activity │ └──────────┘ └─────────┘ └───────────┘ Будущее (Q3 2026): ┌──────────────────────────────────────┐ │ 🤖 AI ANALYST (блок 9) │ │ Claude API + structured prompts │ │ → recommendations · anomalies │ └──────────────────────────────────────┘

3.1. CORE — URL master (фундамент)

Что: все URL сайта с метаданными (шаблон, тир, статус, slug)

Exports: urls_master, templates, tags, redirects

Imports: ничего (фундамент)

Events: url_added, url_updated, url_deleted

3.2. CONTENT — контент страниц

Что: H1, title, meta, OG, Schema.org, блоки на странице

Exports: pages, blocks_config

Imports: CORE.urls_master.id

Events: content_updated, block_toggled

3.3. HOTELS (для bestonline) / PROGRAMS (для ayurtour / panchakarma)

Что (специфично для проекта):

Схема универсальная, контент — проектный.

3.4. ANALYTICS — внешние метрики

Что: данные GSC, GA4, Яндекс.Метрика, Яндекс.Вебмастер

Exports: gsc_daily, metrika_daily, ga4_daily, webmaster_queries

Imports: CORE.urls_master.id (чтобы привязать метрики к нашим URL)

Cron: ежедневный sync в 03:00 UTC

Events: traffic_spike, traffic_drop

3.5. SEO — позиции, keywords, backlinks

Что: позиции в Google/Яндекс, ключевые слова, обратные ссылки (Ahrefs / Firehose / Keys.so)

Exports: positions, keywords_master, backlinks, indexation_status

Imports: CORE.urls_master.id

Events: position_dropped, deindexed, new_backlink

3.6. LEADS — заявки и продажи

Что: заявки с сайта, бронирования, доходы

Exports: requests, bookings

Imports: CORE.urls_master.id (с какой страницы пришёл), HOTELS/PROGRAMS.id

Events: new_lead, booking_confirmed, revenue_recorded

3.7. NOTIFICATIONS — push и email

Что: подписки на Web Push, email-лист, лог отправок

Exports: push_subscriptions, email_list, sent_log

Subscribes: price_updated, hot_tour, new_lead

Events: notification_sent, unsubscribed

3.8. ADMIN — пользователи, роли, audit

Что: администраторы, роли, полный audit log

Exports: users, roles, audit_log

Subscribes: все события всех блоков (для audit)

4 Блок 9 — AI Analyst (будущее)

💭 Концепция

Слой Claude API поверх 8 блоков. Не хранит данных — читает views других блоков, генерирует приоритизированные рекомендации и ловит аномалии.

Workflow (ежедневно, 04:00):

  1. Сбор снапшота (GSC, Метрика, SEO, leads, content updates)
  2. Формируем промпт с бизнес-контекстом
  3. Claude отдаёт structured JSON с recommendations / anomalies
  4. Запись в ai.recommendations → Dashboard

Экономика: $150-450/мес vs SEO-специалист 100-200k ₽/мес. ROI ×5-10.

Когда делаем: после стабильной работы 8 блоков, примерно Q3 2026.

5 Контракт блока (формат MCP)

{
  "name": "core",
  "version": "1.0.0",
  "status": "active",
  "exports": {
    "tables": ["urls_master", "templates", "tags", "redirects"],
    "views": ["published_urls", "urls_by_template"],
    "api": ["GET /urls", "POST /urls", "DELETE /urls/:id"]
  },
  "imports": {
    "none": "ядро не зависит от других блоков"
  },
  "events_emitted": [
    "url_added", "url_updated", "url_deleted", "template_changed"
  ],
  "events_subscribed": [],
  "health_check": "SELECT COUNT(*) > 0 FROM urls_master",
  "can_disable": false,
  "owners": ["system"],
  "retention": "infinite"
}

6 Safe Evolution — правила развития

6.1. 5-Pass Review ТЗ

Каждое ТЗ проходит 5 разных проверок:

#PassВопросы
1ПолнотаВсе поля / связи / edge-case описаны?
2СвязиВсе imports/exports/events учтены?
3Обратная совместимостьВсе старые запросы продолжат работать?
4БезопасностьRLS / audit / sensitive поля защищены?
5МасштабируемостьВыдержит ×10 нагрузку?

Между passes — пауза (минимум 1 час). Чтобы увидеть свежим глазом.

6.2. Правила «Новое не портит старое»

❌ Запрещено✅ Разрешено
ALTER TABLE DROP COLUMNALTER TABLE ADD COLUMN DEFAULT NULL
DROP TABLECREATE TABLE новой
Переименовать полеСоздать новое + синоним/view
Удалить API endpointПометить @deprecated + создать v2
Удалить событиеДобавить новое опциональное поле

6.3. Правила «Правим не мешая»

7 Block-toggle — модульные страницы

Концепция

Каждая посадочная страница = скелет (обязательный) + опциональные блоки. Менеджер в админке чекбоксами решает какие блоки показывать на конкретной странице.

Ключевое правило: нет контента → блок НЕ рендерится. Никаких «Coming soon» заглушек.

Примеры

Страна «Турция»: ✓ курорты · ✓ погода · ✓ цены · ✓ достопримечательности · ✗ горнолыжка · ✗ свадебные

Страна «Мальдивы»: ✗ курорты (атоллы) · ✓ погода · ✓ цены · ✗ достопримечательности · ✗ горнолыжка · ✓ свадебные

Страна «Индия» (ayurtour): ✓ программы · ✓ аюрведа · ✓ йога · ✓ виза · ✓ погода · ✗ горнолыжка

Один шаблон — разные конфигурации per page.

8 15 шаблонов × тысячи страниц

#ШаблонПример (bestonline)Эквивалент (ayurtour)
1Homepage//
2Country landing/turkey//india/
3Region landing/turkey/antalya//india/kerala/
4Resort / City/turkey/antalya/belek//india/kerala/kovalam/
5Entity pageHotel: /turkey/hotel-slug/Program: /panchakarma/weight-loss/
6City-from landing/turkey/from-moscow//india/from-moscow/
7Month landing/turkey/june//india/october/
8Brand landing/brand/hilton//program/kerala-panchakarma/
9Niche landing/turkey/wedding//ayurveda/anti-aging/
10Category listing/turkey/hotels/5-stars//ayurveda/all/
11Attraction/turkey/attractions/pamukkale//india/attractions/taj-mahal/
12Blog article/blog/article-slug//blog/article-slug/
13Blog hub / tag/blog//blog/
14Search results/search?.../quiz
15Legal / Info/about//about/

9 🔒 Критический принцип: изоляция данных

⚠️ Что общее vs что изолировано

Пересекается (cross-fire): архитектурная модель, паттерны, технический стек, правила, reference-скрипты

НЕ пересекается (строгая изоляция): конкретные данные каждого проекта — отели, программы, URL, контент, SEO-позиции, leads, подписчики

УровеньОбщееОтдельное на проект
Архитектурная модель (8 блоков, контракты)
Паттерны (Safe Evolution, 5-pass, block-toggle)
Технический стек (Supabase, Looker, WP+Bricks)
15 типов шаблонов (концептуально)
Правила развития (backward compat)
Reference-скрипты (validators, check-brands)✅ (шаблон)⚠️ Конфигурируются per project
Данные HOTELS/PROGRAMS❌ Изолированы
Конкретные URL, контент, тайтлы❌ Изолированы
SEO-позиции, keywords, backlinks❌ Изолированы
Leads, bookings, revenue❌ Изолированы
Push-подписчики, email-листы❌ Изолированы
Audit log, admin users❌ Изолированы (ФЗ-152)
Supabase project / schemas❌ Свой на каждый сайт
Api-токены, секреты❌ В SECRETS.local.md проекта

🎯 Почему это важно

🧬 Метафора ДНК

Портфель = организм из 6 клеток.

В каждой клетке (сайте) — одна ДНК (архитектура, принципы, паттерны). Но клетки выполняют разные функции: одна отвечает за туры, другая за аюрведу, третья за визы.

Гены общие, выражение разное.

Карта Supabase projects (6 изолированных БД)

СайтSupabase projectСтатус
bestonline-tour.rubestonline-tour-db❌ Планируется
ayurtour.ruayurtour-workjet-analytics✅ Активен
evisa24.ruevisa24 + AIproject⚠️ После restore, пустые
panchakarma-india.rupanchakarma-india-db❌ Планируется
visa-russian.comvisa-russian-db❌ Планируется
viza-india.ruviza-india-db❌ Планируется

Каждый проект:

Вариант А (рекомендую): Отдельный Supabase project на каждый сайт

Вариант Б (не рекомендую): один Supabase с отдельными schemas per сайт

10 Cross-portfolio применение (маппинг)

СайтТематикаHOTELS/PROGRAMSСпецифика
bestonline-tour.ruТурагентство28k отелей из TourvisorМета-агрегатор 150+ ТО
ayurtour.ruАюрведа-турыПрограммы + отели-партнёрыE-E-A-T, экспертный контент
panchakarma-india.ruSister-site ayurtourПрограммы панчакармыУзкая медицинская ниша
evisa24.ruВизы РФ/СНГСтраны × типы визSupabase уже используется
visa-russian.comВиза в РФ для иностранцев9 языков × визыCloudflare Pages
viza-india.ruВизы в ИндиюТипы виз × кейсыУзкая ниша

1 раз построили data-архитектуру → 6 сайтов работают по одной модели.

10 План внедрения (5 фаз)

ФазаВремяЧто
0. Спека1-2 дняТЗ всех блоков × 5-pass review
1. Foundation1-2 дняSupabase schemas, CORE блок, migrations, health checks
2. Первые 3 блока3-5 днейCORE + CONTENT + HOTELS/PROGRAMS + master view + Looker MVP
3. Analytics & SEO1 неделяANALYTICS + SEO + cron sync GSC/Метрика/Яндекс
4. Event Bus1 неделяSupabase Realtime + triggers + cross-block events
5. Остальные блоки2 неделиLEADS + NOTIFICATIONS + ADMIN + полные dashboards
6. AI Analyst (future)1 неделяClaude API интеграция (Q3 2026)

11 Защита от «сыпется»

УгрозаЗащита
Блок X выключен — система падаетGraceful degradation (COALESCE, LEFT JOIN)
Схема изменилась — старые скрипты упалиMigrations only forward, backward compat
Человек случайно удалил полеMigrations в git, RLS запрещает DELETE в prod
Данные не синхронизированы между блокамиВалидаторы консистентности + AI-аномалии
Cron упал — данные устарелиHealth checks + alert если данные > 24h
API провайдер отвалилсяКеш последних данных + retry + fallback
Pump'ом миграция в продCanary deployment (5% → 20% → 100%)
Несовместимый deployContract tests перед мерджем

12 Гибридная визуализация: Looker + Custom

🎛 Два дашборда — разные задачи

Looker StudioСвой дашборд (Custom)
Для чегоData exploration, аналитикаOperational cockpit, действия
ЮзерМенеджер (фильтры, отчёты)Админ (решения, алерты)
ДизайнШаблоны GoogleНаш стиль портфеля
ИнтеракцияView-onlyClick → действие
AI-интеграция✅ Встроенный помощник
РазработкаБыстро (drag-drop)Медленнее (код)

Looker Studio — «что происходит?»

Custom Dashboard — «что делать?»

Технический стек Custom Dashboard

dashboard.{site}.ru  (свой поддомен)
├── Frontend: Vanilla JS + Chart.js
├── Data: Supabase REST API + Realtime WebSocket
├── Auth: Supabase Auth (Basic Auth для MVP)
├── Hosting: Cloudflare Pages (бесплатно)
├── AI: Claude API через Supabase Edge Function
└── Style: единый дизайн с сайтом

🏗 10-й слой архитектуры

Слой 10: CUSTOM DASHBOARD (UI для всех блоков)
   ↑ читает
Слой 9:  AI ANALYST (Claude API)
   ↑ анализирует
Слои 1-8: 8 блоков данных (Supabase)

Views в Supabase — общий источник для обоих дашбордов

И Looker, и Custom читают одни и те же views — консистентность данных:

-- VIEW: master dashboard
CREATE VIEW public.v_url_status AS
SELECT
  u.url, u.tier, u.template_type, u.status,
  c.h1, c.title, c.blocks_enabled,
  a.clicks, a.impressions, a.position,
  s.indexation_status,
  l.requests_count
FROM core.urls_master u
LEFT JOIN content.pages c ON c.url_id = u.id
LEFT JOIN analytics.v_gsc_last30 a ON a.url_id = u.id
LEFT JOIN seo.indexation_status s ON s.url_id = u.id
LEFT JOIN leads.v_requests_last30 l ON l.url_id = u.id;

Если какой-то блок не работает — в колонках NULL, dashboard не падает.

В дашборде https://dashboard.ayurtour.ru/tz/ :

Пароль дашборда: ayurtour2026

14 🔌 Битрикс24 — полная интеграция данных

Архитектурное место: блок LEADS (слой 6) + дополнение для блока ANALYTICS (активность менеджеров).

Цель: автоматически тянуть из Битрикс24 всё что может помочь бизнесу и AI-аналитику.

Что можно тянуть из Битрикс24 REST API

🎯 CRM — основное

СущностьAPI endpoint / eventЗачем намПриоритет
Сделки (deals)crm.deal.list / ONCRMDEALADD, ONCRMDEALUPDATEВоронка продаж, конверсия, средний чек🔴 P0
Лидыcrm.lead.list / ONCRMLEADADDВходящий поток, источники🔴 P0
Контактыcrm.contact.listБаза клиентов, сегментация🔴 P0
Компанииcrm.company.listB2B-клиенты, корп-заказы🟡 P1
Товары / прайсыcrm.product.listЕсли в Битриксе заводятся пакеты туров🟡 P1
Реквизитыcrm.requisite.listДокументооборот🟢 P2
Кастомные поляcrm.deal.userfield.listСтрана тура, URL сайта, тур-параметры🔴 P0

📞 Коммуникации

СущностьAPI / eventЗачем намПриоритет
Звонкиvoximplant.statistic.get / ONVOXIMPLANTCALLENDКто когда звонил, длительность, запись🔴 P0
Записи звонков (mp3)URL из VoxImplantТранскрипция → AI анализ FAQ клиентов🔴 P0 (золото)
SMSmessageservice.message.listРассылки, уведомления🟡 P1
Email активностьcrm.activity.list (type=4)История переписки с клиентом🟡 P1
Чаты OpenLines (WhatsApp, Telegram)imopenlines.*Мессенджер-общение с клиентами🔴 P0
Встречиcrm.activity.list (type=1)Календарь менеджеров🟢 P2

📋 Активность и операционка

СущностьAPI / eventЗачем намПриоритет
Задачи менеджеровtasks.task.listKPI, нагрузка, завершаемость🟡 P1
Комментарии к задачамtasks.commentitem.getlistНюансы сделок, коммуникация🟢 P2
Трекер времениtasks.task.history.listСколько ушло на клиента🟢 P2
Пользователи (менеджеры)user.getСправочник, роли🟡 P1
Отделыdepartment.getСтруктура компании🟢 P2
Бизнес-процессыbizproc.*Автоматизации, флоу🟢 P2

📊 Отчёты и сводки

СущностьAPIЗачем намПриоритет
Воронка продажcrm.status.listСтадии и конверсия между🔴 P0
Источники лидовcrm.status.list (source)Откуда приходят заявки🔴 P0
История изменений сделкиcrm.deal.history.listКогда на какой стадии был🟡 P1
Счета / оплатыsale.payment.listФактическая выручка🟡 P1

🎁 Особое ценное — Звонки + AI

Каждый звонок менеджера = запись mp3 + транскрипция (Whisper) + AI-анализ.

Это золотая жила для продуктовых решений. Ни один конкурент этого не делает.

Схема интеграции

``` Битрикс24 (ваш аккаунт) ↓ 1) Исходящие webhooks (realtime) ↓ → каждое изменение шлётся к нам ↓ ↓ 2) REST API pulling (batch, cron) ↓ → раз в час/день догружаем что не успели ↓ Supabase Edge Function `bitrix-receiver` ↓ парсит, дедуплицирует ↓ leads.bitrix_events (raw JSON, all events) ↓ triggers → normalize ↓ leads.deals + leads.contacts + leads.calls + leads.activities ↓ Views для Custom Dashboard / Looker / AI Analyst ```

Таблицы в Supabase (расширенные)

-- Сырые события (аудит, всегда)
leads.bitrix_events (event_type, payload jsonb, received_at)

-- Нормализованные сущности
leads.deals (bitrix_id, title, stage, amount, contact_id, ...)
leads.leads (bitrix_id, source, status, ...)
leads.contacts (bitrix_id, name, phone, email, ...)
leads.companies (bitrix_id, name, inn, ...)

-- Коммуникации
leads.calls (bitrix_id, duration, record_url, contact_id, transcript)
leads.messages (channel, from, to, text, timestamp)
leads.activities (type, subject, contact_id, ...)

-- Аналитика
leads.pipeline_stages (bitrix_id, name, order, probability)
leads.user_performance (user_id, deals_closed, revenue, avg_deal_size)

Webhook events — приоритизация

СобытиеЧто ловимP0/P1/P2
ONCRMDEALADDНовая сделка🔴 P0
ONCRMDEALUPDATEИзменение сделки (стадия, сумма)🔴 P0
ONCRMLEADADDНовый лид🔴 P0
ONCRMCONTACTADDНовый контакт🔴 P0
ONVOXIMPLANTCALLENDЗавершение звонка🔴 P0
ONIMBOTJOINCHATЧат с клиентом в мессенджере🟡 P1
ONCRMACTIVITYADDEmail, встреча, задача🟡 P1
ONTASKADDНовая задача менеджеру🟢 P2

MVP за 1 день (что реально успеваем)

  1. Supabase Edge Function bitrix-webhook-receiver — принимает любые webhooks
  2. Таблица leads.bitrix_events — raw payload всех событий
  3. Webhook в Битриксе на 3 события: ONCRMDEALADD, ONCRMDEALUPDATE, ONCRMLEADADD
  4. Простая view «Сделки последние 30 дней» для проверки
  5. Тест с реальной сделкой

Остальные сущности (звонки, чаты, задачи) — добавляем по мере надобности, архитектура уже готова.

Что нужно от владельца Битрикса

  1. URL аккаунтаcompany.bitrix24.ru
  2. Доступ к настройке webhooks — администратор
  3. Решение: входящий webhook (Битрикс → нам) или исходящий (мы → Битрикс) или оба
  4. Минимум прав: crm (сделки/лиды/контакты), telephony (звонки), imopenlines (чаты)

15 Что делаем сейчас

  1. ТЗ каждого блока (по шаблону, 5-pass review)
  2. Порядок: CORE → HOTELS/PROGRAMS → CONTENT → ANALYTICS → SEO → NOTIFICATIONS → LEADS → ADMIN
  3. Между passes — пауза (час-ночь)
  4. После утверждения всех ТЗ — имплементация
  5. Supabase migrations в git (один раз для портфеля)
  6. Looker MVP после первых 3 блоков
  7. AI Analyst — после стабильной работы 8 блоков

Обновлено 24.04.2026 · Cross-fire портфеля — единая data-архитектура для 6 сайтов
Применяется ко всем проектам WORKJET portfolio