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_FILEn8n/slots/active_workflow_slots.txtФайл со списком активных workflows
N8N_SYNC_MAX_ACTIVE_WORKFLOWS5Максимум активных workflows
N8N_SYNC_ACTIVATE_NAMESweb_search_workflow,...Явный список вместо slots file
N8N_SYNC_INCLUDE_IMPORTEDfalseВключить 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.

📚 Связанные разделы