Блог
Serverless-формы обратной связи: что «serverless» здесь реально значит
· 4 мин чтения
«Serverless» начинался как точный термин: ваш код работает в виде функции на чужой инфраструктуре, и вам самим никогда не нужно разворачивать, патчить или масштабировать сервер. Применительно к формам обратной связи термин размылся - теперь его используют для двух по-настоящему разных подходов, и выбор между ними напрямую определяет объём работы, который вы на себя берёте.
Вот в чём различие и где в этой картине место у хостингового бэкенда форм.
Два значения «serverless-формы обратной связи»
Поищите эту фразу - и найдёте два разных ответа, смешанных вместе:
- Вы пишете функцию. AWS Lambda, Cloudflare Worker, функция Vercel или Netlify - небольшой обработчик, который вы разворачиваете; он принимает POST-запрос, отправляет письмо через провайдера вроде SES или Resend и возвращает ответ.
- Вы вообще не пишете код бэкенда. Ваша форма отправляет POST-запрос напрямую на хостинговый сервис, который уже существует - никакой функции писать, разворачивать или версионировать не нужно.
Оба варианта - «serverless» в узком смысле: ни в одном из них нет машины, на которую вы заходите по SSH и патчите. Но по шкале трудозатрат они находятся в очень разных точках.
Вариант А: собственная функция
Написание собственного обработчика даёт вам полный контроль над payload, шаблоном письма и местом хранения. Этот контроль сопровождается реальной ответственностью:
- Холодный старт. Функция, которая давно не запускалась, требует момент на разогрев, что на малопосещаемых сайтах проявляется как медленная первая отправка.
- Доставляемость писем - на вас. Записи SPF, DKIM и DMARC, репутация отправителя, которую нужно беречь, и аккаунт провайдера, который нужно настраивать и мониторить.
- Фильтрация спама - на вас. Ничто не мешает боту отправить POST-запрос напрямую на URL вашей функции, если вы сами не встроите ограничение частоты запросов, honeypot или CAPTCHA-проверку.
- Хранение - на вас, если вам вообще нужна история. Без обращения к базе данных внутри функции отправка, письмо о которой не удалось доставить, просто теряется.
Это верный компромисс, когда форма запускает настоящую бизнес-логику - запись в CRM, старт рабочего процесса, что угодно за пределами «доставить сообщение человеку». Для обычной формы обратной связи это большой объём недифференцированной инфраструктуры, которую придётся содержать самому.
Вариант Б: вообще без кода бэкенда
Другое прочтение «serverless» полностью убирает функцию из уравнения. Ваша <form> отправляет POST-запрос на конечную точку, которая уже существует, управляется кем-то другим, и где приём, фильтрация спама, уведомления и хранение уже построены и уже работают. Вы не пишете ни строчки кода бэкенда и ничего не разворачиваете - нет никакой вашей функции, которую нужно было бы разогревать после простоя, патчить или мониторить, потому что вашей функции в этой картине вообще нет.
Компромисс - это контроль: вы получаете спам-фильтр провайдера, его политику хранения, его каналы уведомлений - а не собственную индивидуальную логику. Для формы, вся задача которой - «надёжно доставить мне отправку», это почти никогда не является реальной ценой.
Что на самом деле подходит форме обратной связи
Большинству форм обратной связи не нужна кастомная логика рабочих процессов - им нужно просто дойти до человека, не потерявшись и не будучи отфильтрованными как спам. Если это вся задача, писать и содержать собственную функцию значит решать проблему, которой у вас нет: вы потратите реальные часы на записи SPF и логику ограничения частоты запросов, заново изобретая то, что хостинговый бэкенд уже делает. Берите собственную функцию, когда форма питает нечто большее, чем почтовый ящик - запись в базу данных, платный рабочий процесс, многошаговый процесс, который обычный сервис не может выразить. (О более широкой картине того, что бэкенд форм делает изо дня в день, см. что такое бэкенд форм.)
Formhook: конечная точка, которая уже существует
Formhook - это второй вид serverless. Направьте форму на https://formhook.app/f/{apiKey}, и разворачивать, разогревать после простоя или патчить нечего - даже функции никакой нет. Фильтрация спама (honeypot-поле, ограничение частоты запросов и включённый по умолчанию Cloudflare Turnstile), хранение, панель с поиском и уведомления - email плюс веб-push на каждом тарифе, включая Бесплатный, - уже работают до того, как вы напишете хоть строчку кода. Исходящие webhook'и с автоматическим распознаванием Discord, Slack и Teams покрывают случаи, когда вы всё же хотите передать отправку другой системе - и снова без необходимости писать эту принимающую функцию самому.
Бесплатный тариф обрабатывает 250 отправок в месяц без привязки карты. Pro добавляет загрузку файлов до 10 МБ и верифицированный домен отправки с reply-to; Studio поднимает потолок до 25 000 отправок в месяц для команд. Интеграция описана в документации, полная разбивка тарифов - на странице цен.
Рабочая форма в одну строку
Размещение в ЕС, отправки хранятся вечно, push-уведомления на любом тарифе.
Начать бесплатноБез банковской карты · читайте документацию
Читать дальше
- Что такое бэкенд форм? (И когда он вам нужен)Бэкенд форм принимает, хранит и пересылает отправки форм вашего сайта, чтобы вам не пришлось запускать сервер. Вот как это работает и когда он вам нужен.
- Как добавить контактную форму на GitHub PagesGitHub Pages не выполняет серверный код, но контактную форму всё равно можно сделать. Сравниваем три подхода и даём решение на копипасте за одну минуту.
- Как добавить контактную форму на Cloudflare PagesУ Cloudflare Pages нет встроенного сервиса обработки форм, как у Netlify. Рассказываем почему - и как быстрее всего получить работающую контактную форму.