Перенесла n8n с облака на GCP Free Tier. Сэкономила $24/мес. Потеряла 4 дня утренних уведомлений, поздравлений и автопостинга. Причина - не сама миграция, а то, что я не проверила всё разом после переезда. Каждую ошибку находила только после починки предыдущей. Вместо 20 минут диагностика заняла 2 часа.
6сломанных воркфлоу
4дня простоя
4ошибки в цепочке
на диагностику

Что произошло

У меня 40+ воркфлоу на n8n. Один из них - Events Manager - каждое утро в 7:00 присылает в Telegram брифинг: события дня, критические дедлайны, французские слова для изучения, мотивационную цитату

28 марта я перенесла n8n с облака на свой GCP Free Tier. Всё выглядело рабочим. Воркфлоу показывали "Active". Я успокоилась

31 марта заметила: утреннее сообщение не приходит. Уже 4 дня. Проверила логи - каждый запуск падает с ошибкой 403 на Google Sheets

Цепочка ошибок: каждая прятала следующую

Вот что бесит в таких ситуациях. Вы чините одну проблему, запускаете тест, и узнаёте о следующей. Потом чините вторую - появляется третья. Как матрёшка, только каждая следующая злее

ОШИБКА 1

Client Secret исчез

При миграции n8n заменил Client Secret Google OAuth на заглушку __n8n_BLANK_VALUE_. Credential показывал "Account connected", но токен не мог обновиться без секрета. Результат - 403 на ВСЕХ нодах с Google Sheets

6 воркфлоу упали одновременно. Events Manager, Greetings, Eclat автопостинг, Facebook Spoke

ФИКС 1

Восстановила Client Secret, переавторизовала OAuth

Зашла в n8n UI, вставила правильный Client Secret, нажала "Sign in with Google". Прошла 3 экрана предупреждений Google (приложение не верифицировано). Токен обновился

ОШИБКА 2

Таблица принадлежит другому аккаунту

Запустила тест. Снова 403. Но теперь Client Secret на месте, OAuth свежий. В чём дело?

Оказалось: таблица Events создана с аккаунта alinfghjnf7546@gmail.com, а OAuth привязан к nataswencia@gmail.com. У второго аккаунта просто нет доступа к таблице. Три Google-аккаунта, и я забыла, какой из них владелец

ФИКС 2

Расшарила таблицу на OAuth-аккаунт

Залогинилась в аккаунт-владелец (2FA, SMS, всё как обычно). Расшарила таблицу как "Редактор". Read Events Sheet прошёл

ОШИБКА 3

Google Calendar credential не существует

Запустила тест. Sheets работают! Но упало на ноде "Read Calendar Events": credential с ID fQ0Kjiz3984iL6Yn не существует. Он просто не перенёсся при миграции

ФИКС 3

Временно отключила Calendar-ноду

Создать новый credential через API получилось, но OAuth авторизация через Playwright провалилась 3 раза - Google показывает 3 экрана предупреждений для непроверенных приложений, и OAuth state token истекает быстрее, чем я успеваю пройти все экраны

Решение: отключила Calendar-ноду через disabled: true. Утренний брифинг работает на данных из Google Sheets, Calendar можно подключить позже вручную

ОШИБКА 4

Telegram не принял HTML от GPT

Запустила тест. Sheets OK, Calendar пропущен, GPT сгенерировал брифинг. Упало на отправке в Telegram:

Bad Request: can't parse entities:
Unsupported start tag "=48ч)</b" at byte offset 583

GPT написал <=48ч (знак "меньше или равно 48 часов"). Telegram решил, что < - это начало HTML-тега. И умер

ФИКС 4

HTML-санитизация перед отправкой

Добавила функцию sanitizeTgHtml() в Code-ноду. Она экранирует ВСЕ символы < и > в тексте, а потом восстанавливает только разрешённые теги: <b>, <i>, <u>, <code>, <pre>.

function sanitizeTgHtml(text) {
  var result = text
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;');
  var allowed = ['b','i','u','s','code','pre'];
  for (var t = 0; t < allowed.length; t++) {
    var tag = allowed[t];
    result = result
      .replace(new RegExp('&lt;'+tag+'&gt;','gi'),
               '<'+tag+'>')
      .replace(new RegExp('&lt;/'+tag+'&gt;','gi'),
               '</'+tag+'>');
  }
  return result;
}

После этого - SUCCESS. Утренний брифинг пришёл в Telegram

Где я потеряла время

Не на починке. На диагностике

Смотрите на таймлайн:

Ошибка 403 - проверяю credential в UI. Client Secret пустой. Ввожу, авторизую. 15 минут.
Снова 403 - удивлена. Credential же починен. Открываю таблицу - "Нет доступа". Ищу владельца среди 3 аккаунтов, логинюсь через 2FA, расшариваю. 25 минут.
Calendar credential missing - создаю новый, пытаюсь авторизовать через Playwright. OAuth state timeout. Три попытки. Решаю отключить ноду. 30 минут.
Telegram HTML parse error - читаю ответ GPT, нахожу <=48ч, пишу санитайзер. 15 минут.
SUCCESS - тест прошёл. Итого: ~2 часа.

Если бы я перед первым фиксом проверила ВСЁ - все credentials, все таблицы, все ноды - я бы нашла все 4 проблемы за 10 минут. И починила бы за 20. Вместо 2 часов - 30 минут

6 правил после этого кейса

1. Полный аудит перед починкой

При ошибке в воркфлоу - сначала получить JSON, пройтись по ВСЕМ нодам, составить список внешних зависимостей (credentials, таблицы, API). Проверить каждую. Только потом чинить - всё разом

2. OAuth через UI, не через автоматизацию

Google OAuth с непроверенным приложением - это 3 экрана предупреждений + 2FA. State token живёт ~3 минуты. Playwright не успевает. Делайте OAuth руками - 30 секунд vs 20 минут отладки

3. Знать владельцев таблиц

Если у вас несколько Google-аккаунтов - записывайте, кому принадлежит каждая таблица. При миграции OAuth может быть привязан к другому аккаунту, и "работающий" credential не будет иметь доступа

4. Client Secret при миграции = проверять первым

n8n при экспорте/импорте заменяет Client Secret на заглушку. Это не баг - это защита. Но после миграции ПЕРВЫМ делом проверяйте все OAuth credentials

5. Санитизировать HTML от GPT перед Telegram

GPT не знает, что Telegram парсит HTML. Он спокойно напишет <=48 или 3>2. Всегда добавляйте sanitizeTgHtml() перед отправкой GPT-текста в Telegram с parse_mode: HTML.

6. Чек-лист после миграции

После любого переезда n8n: проверить ВСЕ OAuth credentials (не заглушка ли secret), проверить доступ ко ВСЕМ таблицам, проверить включённость API в GCP Console. 10 минут проверки = 4 дня сэкономленного простоя

Итог в цифрах

$24экономия/мес на GCP
4дня без уведомлений
на починку
30месли бы сделала аудит

Миграция на GCP - правильное решение. Экономия реальная, контроль полный. Но любая миграция - это не "перенёс и забыл". Это "перенёс, проверил всё, и только потом забыл"

FAQ

Почему после миграции n8n ломаются Google-воркфлоу?

При миграции OAuth2 credentials теряют Client Secret - он заменяется заглушкой. Плюс таблицы могут принадлежать другому Google-аккаунту, а нужные API могут быть не включены в GCP Console. Результат - 403 Forbidden на всех Google-нодах

Как правильно диагностировать сломанный n8n воркфлоу?

Полный аудит ПЕРЕД починкой: получить JSON воркфлоу, проверить все credentials и их статус, проверить доступ ко всем внешним ресурсам (таблицы, API), убедиться что нужные API включены в GCP. Только потом чинить - всё разом, а не по одной ошибке

Как избежать ошибки "can't parse entities" в Telegram?

GPT генерирует текст с символами < и >, которые Telegram интерпретирует как HTML-теги. Решение - функция sanitizeTgHtml(): экранировать все < и >, затем восстановить только разрешённые теги (b, i, u, s, code, pre). Добавляется в Code-ноду перед отправкой

Ключевые выводы

  • Миграция n8n на GCP ломает OAuth credentials - Client Secret заменяется заглушкой
  • Несколько Google-аккаунтов = путаница с владельцами таблиц. Записывайте
  • Диагностика "по одной ошибке" - главная потеря времени. Проверяйте всё разом
  • GPT + Telegram HTML = обязательная санитизация. Без неё вопрос времени
  • OAuth авторизация Google через автоматизацию - плохая идея. Делайте руками
  • 10 минут чек-листа после миграции спасают 4 дня простоя

Хотите автоматизацию, которая переживёт миграцию?

Бот проанализирует ваш сайт и покажет, где автоматизация даст максимальный эффект - с правильной архитектурой

Бесплатный анализ сайта

Больше инсайтов - в соцсетях

Закулисье, разборы, кейсы и то, что не попадает в блог

Instagram Facebook