Workflows Sync — Синхронизация с n8n
Скрипт n8n_sync_workflows.sh импортирует JSON-файлы в n8n, активирует выбранные workflows и синхронизирует webhook paths в БД.
❓ Зачем нужна синхронизация?
Проблема: Webhook Paths меняются
СЦЕНАРИЙ БЕЗ СИНХРОНИЗАЦИИ 1. Вы создали workflow в n8n editor └─ Webhook path: /webhook/abc-123 2. Добавили контракт в clowbot.processes └─ n8n_webhook_path = '/webhook/abc-123' 3. Всё работает! ✅ 4. Через неделю: нужно изменить workflow └─ Удалили старый, создали новый └─ Webhook path: /webhook/xyz-789 ← ДРУГОЙ! 5. clowbot.processes всё ещё указывает на старый path └─ n8n_webhook_path = '/webhook/abc-123' ← НЕСУЩЕСТВУЕТ! 6. 💥 404 Error при попытке вызвать процесс
При каждом импорте workflow в n8n генерируется новый webhook path. Скрипт синхронизации автоматически обновляет эти пути в PostgreSQL.
✅ Решение: Автоматическая синхронизация
n8n_sync_workflows.sh — ЧТО ОН ДЕЛАЕТ
┌──────────────────────────────────────────────────────────────────┐
│ ШАГ 1: СБОР WORKFLOW ФАЙЛОВ │
│ ─────────────────────────────────────────────────────────────── │
│ • Найти все *.json в n8n/workflows/ │
│ • Опционально: n8n/workflows/imported/ │
│ • Упаковать в tar архив │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ ШАГ 2: ИМПОРТ В n8n │
│ ─────────────────────────────────────────────────────────────── │
│ • docker compose exec n8n n8n import:workflow │
│ • Workflows создаются в БД n8n (public.workflow_entity) │
│ • Каждый получает уникальный ID │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ ШАГ 3: АКТИВАЦИЯ WORKFLOWS │
│ ─────────────────────────────────────────────────────────────── │
│ • Прочитать n8n/slots/active_workflow_slots.txt │
│ • Проверить лимит: max 5 активных │
│ • Активировать только workflows из slots file │
│ • docker compose exec n8n n8n update:workflow --active=true │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ ШАГ 4: РЕСТАРТ n8n │
│ ─────────────────────────────────────────────────────────────── │
│ • docker compose restart n8n │
│ • n8n регистрирует webhooks │
│ • Webhook paths появляются в public.webhook_entity │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ ШАГ 5: СИНХРОНИЗАЦИЯ WEBHOOK PATHS │
│ ─────────────────────────────────────────────────────────────── │
│ • Прочитать webhook_entity.webhookPath для каждого workflow │
│ • UPDATE clowbot.processes │
│ SET n8n_webhook_path = resolved_path │
│ WHERE n8n_workflow_id = workflow_name │
│ • Теперь Python bridge знает актуальные пути! │
└──────────────────────────────────────────────────────────────────┘💻 Как запустить
Базовая команда
# Синхронизировать workflows из n8n/workflows/ # Активировать workflows из n8n/slots/active_workflow_slots.txt ./scripts/n8n_sync_workflows.sh
Переменные окружения
| Переменная | Default | Описание |
|---|---|---|
| N8N_SYNC_SLOTS_FILE | n8n/slots/active_workflow_slots.txt | Файл со списком активных workflows |
| N8N_SYNC_MAX_ACTIVE_WORKFLOWS | 5 | Максимум активных workflows |
| N8N_SYNC_ACTIVATE_NAMES | web_search_workflow,... | Явный список вместо slots file |
| N8N_SYNC_INCLUDE_IMPORTED | false | Включить n8n/workflows/imported/ |
Примеры использования
# Активировать конкретные workflows
N8N_SYNC_ACTIVATE_NAMES="web_search_workflow,reminder_dispatch_workflow" \ ./scripts/n8n_sync_workflows.sh
# Использовать другой env файл
./scripts/n8n_sync_workflows.sh .env.production docker-compose.prod.yml
📄 Slots File
Файл n8n/slots/active_workflow_slots.txt определяет какие workflows должны быть активными.
# n8n community active slots (max 5) # One line = workflow name from n8n/workflows/*.json web_search_workflow reminder_dispatch_workflow travel_research_workflow content_factory_digest_workflow # finance_coach_weekly_workflow <- commented out, not active
💡 Правила
- • Одна строка = один workflow
- • Имя без расширения (.json)
- • Строки с # в начале игнорируются
- • Максимум 5 активных (community edition limit)
📊 Что происходит в БД
ДО СИНХРОНИЗАЦИИ
───────────────────────────────────────────────────────────────
n8n БД (public.workflow_entity):
┌──────────────────────────────────────────────────────────────┐
│ id │ name │ active │ │
├────┼────────────────────────┼────────┤ │
│ 1 │ web_search_workflow │ false │ ← не активен │
│ 2 │ reminder_dispatch │ false │ │
└────┴────────────────────────┴────────┘ │
clowbot БД (clowbot.processes):
┌──────────────────────────────────────────────────────────────┐
│ code │ n8n_workflow_id │ n8n_webhook_path │
├────────────┼────────────────────────┼────────────────────────┤
│ web_search │ web_search_workflow │ NULL │
└────────────┴────────────────────────┴────────────────────────┘
ПОСЛЕ n8n_sync_workflows.sh
───────────────────────────────────────────────────────────────
n8n БД (public.workflow_entity):
┌──────────────────────────────────────────────────────────────┐
│ id │ name │ active │ │
├────┼────────────────────────┼────────┤ │
│ 1 │ web_search_workflow │ true │ ← АКТИВЕН! │
│ 2 │ reminder_dispatch │ true │ │
└────┴────────────────────────┴────────┘ │
n8n БД (public.webhook_entity):
┌──────────────────────────────────────────────────────────────┐
│ workflowId │ node │ webhookPath │
├────────────┼───────────────┼────────────────────────────────┤
│ 1 │ Webhook │ /webhook/abc-123-def │
│ 2 │ Webhook │ /webhook/xyz-789-ghi │
└────────────┴───────────────┴────────────────────────────────┘
clowbot БД (clowbot.processes):
┌──────────────────────────────────────────────────────────────┐
│ code │ n8n_workflow_id │ n8n_webhook_path │
├────────────┼────────────────────────┼────────────────────────┤
│ web_search │ web_search_workflow │ /webhook/abc-123-def │
└────────────┴────────────────────────┴────────────────────────┘
↑
АВТОМАТИЧЕСКИ СИНХРОНИЗИРОВАНО!🛡️ Защита от превышения лимита
Скрипт проверяет лимит до импорта и до активации:
[ERROR] Active workflow slots exceeded before import: 7 > 5
[ERROR] n8n community profile in this project is capped at 5 active workflows.
[HINT] Edit n8n/slots/active_workflow_slots.txt or set N8N_SYNC_ACTIVATE_NAMES
with <=5 names.Это предотвращает ситуацию, когда n8n community edition перестаёт работать из-за превышения лимита активных workflows.