Couldn't load this page.

← Блог
Engineering

n8n webhook в Postgres: пример развёртывания на Lizard

Yura Oak
Yura Oak9 сентября 2026 г.
Резюмировать с помощью:

Вебхук n8n может записать JSON в Postgres и вернуть сохранённую строку в одном рабочем процессе. Этот пример запускает n8n на Lizard, защищает вебхук заголовком-учётными-данными и использует ID запроса, чтобы избежать дублирующихся строк при повторной отправке отправителем.

Публичный репозиторий содержит закреплённый образ, рабочий процесс, определение таблицы и скрипт проверки. В статье рассматривается один экземпляр n8n и JSON-запросы. Для более широкой настройки хостинга начните с хостинга n8n на Lizard.

Что запускает пример

Сервис n8n и выделенный Managed Postgres работают в одном регионе. Postgres хранит и записи рабочих процессов и учётных данных самого n8n, и таблицу webhook_events примера. Приложение использует один экземпляр; в этом примере нет очереди Redis или отдельного воркера.

Репозиторий закрепляет n8n 2.38.5 и дайджест официального образа. Фиксированный дайджест делает выбор образа воспроизводимым. Изучайте более новые выпуски n8n и тестируйте обновления перед изменением закрепления.

Рабочий процесс состоит из трёх узлов:

  1. Webhook принимает производственный POST-запрос с заголовком X-Example-Key.
  2. Store event выполняет параметризованный Postgres-запрос.
  3. Respond возвращает сохранённый ID запроса, JSON-тело и время создания.

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

Создайте сервис из репозитория и отдельный Managed Postgres в том же проекте Lizard. В инструкциях репозитория перечислены команды и переменные окружения.

Установите DB_TYPE=postgresdb и привяжите хост, порт, имя базы, пользователя и пароль к переменным аддона. База, запущенная рядом с n8n, недостаточна: n8n должен получить эти значения и успешно подключиться. См. конфигурацию Postgres в n8n.

Сгенерируйте и сохраните отдельный N8N_ENCRYPTION_KEY до первого запуска. n8n использует его для защиты учётных данных, хранящихся в его базе. Новый случайный ключ при каждом развёртывании помешает n8n прочитать старые учётные данные. Храните ключ в записях восстановления, вне репозитория.

Пример также настраивает владельца до того, как n8n станет доступен. Он использует N8N_INSTANCE_OWNER_MANAGED_BY_ENV и хеш пароля bcrypt, следуя настройке владельца в n8n. Пароль входа и ключ вебхука — отдельные секреты.

Установите N8N_HOST в публичное имя хоста сервиса, без схемы и пути. Стартовый скрипт строит HTTPS WEBHOOK_URL и URL редактора из этого имени хоста. Используйте порт 5678. Проверьте настройку proxy-hop, если добавите другой прокси перед Lizard.

Импорт и публикация рабочего процесса

Создайте webhook_events SQL-файлом из репозитория. Импортируйте учётные данные Postgres и заголовка в n8n, затем импортируйте рабочий процесс. Скрипт подготовки учётных данных считывает секретные значения из окружения сервиса и записывает приватный временный файл импорта; публичный рабочий процесс содержит только ID и имена учётных данных.

Используйте редактор n8n для публикации рабочего процесса, или используйте n8n publish:workflow --id=lizardPostgresExample. Публикация через CLI меняет базу данных; запущенный процесс n8n нуждается в перезапуске, чтобы зарегистрировать это изменение. Это поведение описано в руководстве по CLI n8n.

Проверьте /healthz/readiness перед отправкой запросов. Производственный URL использует /webhook/lizard-postgres-example. URL /webhook-test/ принадлежит тестовой сессии редактора и не заменяет опубликованный рабочий процесс.

Отправка запроса и тест повтора

С публичным URL и ключом вебхука в переменных окружения:

curl --fail-with-body "$N8N_URL/webhook/lizard-postgres-example" \
  -H 'Content-Type: application/json' \
  -H "X-Example-Key: $EXAMPLE_WEBHOOK_TOKEN" \
  --data '{"requestId":"example-001","message":"hello"}'

SQL-запрос привязывает ID запроса и JSON-тело как значения. Он не строит SQL путём вставки пользовательского ввода в текст запроса. Кавычки и вложенный JSON остаются данными.

Первичный ключ таблицы — request_id. При конфликте запрос возвращает первую сохранённую строку. Отправка того же ID с другим сообщением не меняет исходную полезную нагрузку. Это политика повтора примера; выберите другую политику, если вашему приложению нужны обновления или ошибки конфликта.

Используйте новый ID запроса для каждого отдельного события. Не повторно используйте тестовый ID для представления нового события и не ожидайте второй строки.

Проверки развёртывания

9 сентября 2026 года мы запустили n8n 2.38.5 с Postgres 18.6 в eu-west-lim-a. Те же семь проверок прошли до и после перезапуска сервиса n8n.

ПроверкаДо перезапускаПосле перезапуска
Health endpoint200200
Готовность базы данных200200
Запрос с правильным ключом200; возвращено сохранённое тело200; возвращено сохранённое тело
Тот же ID запроса с изменённым теломВозвращена исходная строкаВозвращена исходная строка
Отсутствует ключ403403
Неверный ключ403403
Неизвестный путь вебхука404404

База содержала одно событие после обоих запусков. JSON-тело и время создания совпадали при перезапуске. Тестовое тело включало кавычки и вложенный JSON. Владелец также вошёл и нашёл импортированный рабочий процесс в редакторе.

Прочитайте запись развёртывания и сырые результаты. Запись указывает протестированный коммит кода. Запустите скрипт проверки репозитория против своего развёртывания перед использованием для своих рабочих процессов.

Что эти проверки не охватывают

Пример не тестирует нагрузку, время работы, задержку холодного запуска или полный ежемесячный счёт. Он не настраивает queue mode, резервное копирование базы, загрузку файлов или восстановление после потери базы.

Проверка перезапуска сервиса устанавливает, что это развёртывание может читать сохранённые рабочие процессы и учётные данные после перезапуска. Она не устанавливает аварийное восстановление. Для этого сделайте резервную копию базы, сохраните ключ шифрования, восстановите в отдельное окружение и запустите рабочий процесс снова.

Этот JSON-рабочий процесс не требует постоянной локальной файловой системы. Рабочие процессы, читающие или пишущие локальные файлы, нуждаются в подходящем хранилище и собственных тестах устойчивости. Изучите Persistent Volumes и требования n8n к хранилищу перед добавлением такой нагрузки.

FAQ

Нужен ли n8n Postgres? Нет. Самостоятельно размещённый n8n может использовать SQLite. Этот пример использует Postgres, чтобы хранить записи рабочих процессов, учётных данных и выполнений вне контейнера приложения и продемонстрировать рабочий процесс, пишущий в базу.

Почему вебхук работает в редакторе, но возвращает 404 в другом месте? Проверьте, что рабочий процесс опубликован, и что отправитель использует производственный путь /webhook/. Публикация через CLI также требует перезапуска запущенного процесса n8n.

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

Является ли это полной производственной настройкой n8n? Это проверенный пример с одним экземпляром. Добавьте резервное копирование, мониторинг, хранилище и план производительности для своей нагрузки перед тем, как полагаться на это для производственной автоматизации.

Разрабатывайте с ИИ. Развёртывайте с Lizard.

Вам не нужна платформенная команда, чтобы выйти в продакшн. Весь ваш облак — в одной команде CLI.

Попробовать бесплатно
Рабочие пространства
Сервисы
Аддоны
Развёртывания

Мы используем cookie для базовой работы сайта и аналитики. См. нашу Политика cookie.