Что произошло
У меня 40+ воркфлоу на n8n. Один из них - Events Manager - каждое утро в 7:00 присылает в Telegram брифинг: события дня, критические дедлайны, французские слова для изучения, мотивационную цитату
28 марта я перенесла n8n с облака на свой GCP Free Tier. Всё выглядело рабочим. Воркфлоу показывали "Active". Я успокоилась
31 марта заметила: утреннее сообщение не приходит. Уже 4 дня. Проверила логи - каждый запуск падает с ошибкой 403 на Google Sheets
Цепочка ошибок: каждая прятала следующую
Вот что бесит в таких ситуациях. Вы чините одну проблему, запускаете тест, и узнаёте о следующей. Потом чините вторую - появляется третья. Как матрёшка, только каждая следующая злее
Client Secret исчез
При миграции n8n заменил Client Secret Google OAuth на заглушку __n8n_BLANK_VALUE_. Credential показывал "Account connected", но токен не мог обновиться без секрета. Результат - 403 на ВСЕХ нодах с Google Sheets
6 воркфлоу упали одновременно. Events Manager, Greetings, Eclat автопостинг, Facebook Spoke
Восстановила Client Secret, переавторизовала OAuth
Зашла в n8n UI, вставила правильный Client Secret, нажала "Sign in with Google". Прошла 3 экрана предупреждений Google (приложение не верифицировано). Токен обновился
Таблица принадлежит другому аккаунту
Запустила тест. Снова 403. Но теперь Client Secret на месте, OAuth свежий. В чём дело?
Оказалось: таблица Events создана с аккаунта alinfghjnf7546@gmail.com, а OAuth привязан к nataswencia@gmail.com. У второго аккаунта просто нет доступа к таблице. Три Google-аккаунта, и я забыла, какой из них владелец
Расшарила таблицу на OAuth-аккаунт
Залогинилась в аккаунт-владелец (2FA, SMS, всё как обычно). Расшарила таблицу как "Редактор". Read Events Sheet прошёл
Google Calendar credential не существует
Запустила тест. Sheets работают! Но упало на ноде "Read Calendar Events": credential с ID fQ0Kjiz3984iL6Yn не существует. Он просто не перенёсся при миграции
Временно отключила Calendar-ноду
Создать новый credential через API получилось, но OAuth авторизация через Playwright провалилась 3 раза - Google показывает 3 экрана предупреждений для непроверенных приложений, и OAuth state token истекает быстрее, чем я успеваю пройти все экраны
Решение: отключила Calendar-ноду через disabled: true. Утренний брифинг работает на данных из Google Sheets, Calendar можно подключить позже вручную
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-тега. И умер
HTML-санитизация перед отправкой
Добавила функцию sanitizeTgHtml() в Code-ноду. Она экранирует ВСЕ символы < и > в тексте, а потом восстанавливает только разрешённые теги: <b>, <i>, <u>, <code>, <pre>.
function sanitizeTgHtml(text) {
var result = text
.replace(/</g, '<')
.replace(/>/g, '>');
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('<'+tag+'>','gi'),
'<'+tag+'>')
.replace(new RegExp('</'+tag+'>','gi'),
'</'+tag+'>');
}
return result;
}
После этого - SUCCESS. Утренний брифинг пришёл в Telegram
Где я потеряла время
Не на починке. На диагностике
Смотрите на таймлайн:
<=48ч, пишу санитайзер. 15 минут.Если бы я перед первым фиксом проверила ВСЁ - все 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 дня сэкономленного простоя
Итог в цифрах
Миграция на 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 дня простоя
Хотите автоматизацию, которая переживёт миграцию?
Бот проанализирует ваш сайт и покажет, где автоматизация даст максимальный эффект - с правильной архитектурой
Бесплатный анализ сайта