Бэкенд для статических сайтов: блог, отзывы, оплата и личный кабинет без потери скорости

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

Бэкенд для статических сайтов: блог, отзывы, оплата и личный кабинет без потери скорости - Блог

Задача

Сайты наших клиентов статические: каждая страница собирается заранее и отдаётся с CDN готовым HTML-файлом. Поэтому они открываются мгновенно, а на сервере нечему ломаться и нечего взламывать. Но у них нет ни базы данных, ни админки. Владелец не может сам опубликовать статью, собрать отзыв, принять оплату или завести постоянным клиентам личный кабинет.

Вместо того чтобы переезжать на WordPress и терять скорость, мы сделали один общий бэкенд - платформу Yatoday, - в котором живут динамические части всех сайтов.

Блог с ИИ-соавтором

Блог ведётся в админке платформы на всех языках сайта, а статический сайт забирает статьи через API во время сборки.

Чтобы начать статью, владелец задаёт ИИ-редактору на базе Anthropic Claude тему и язык и может выбрать одну из своих прошлых статей как образец: редактор держится её тона и структуры, но не копирует текст. Черновик появляется в редакторе по мере написания - заголовок, вступление, от трёх до шести разделов и вывод, в чистом Markdown. Владелец продолжает разговор (“короче”, “добавь пример для арендодателей”) и потом правит текст руками.

Картинки загружаются в админке и хранятся в облачном хранилище. Перед каждой сборкой конвейер скачивает их в проект, и Astro сжимает и нарезает их как обычные локальные изображения. Сборка заодно публикует список доступных картинок, и админка предлагает их для повторного использования.

SEO-проверка с подсказками ИИ

Каждая статья получает оценку от 0 до 100 и балл от A до F - отдельно для каждого языка. Проверяется длина заголовка и описания, где и как часто встречается ключевое слово, подзаголовки, картинки и их alt-тексты, ссылки и длина предложений. Каждая проблема помечена как критичная, предупреждение или совет, с понятным объяснением.

Одна кнопка отправляет в Claude статью, найденные проблемы и короткое описание бизнеса. В ответ приходят предложенные SEO-заголовок, мета-описание и ключевое слово, а также список правок по приоритету, каждая с примером. Вторая кнопка просто заполняет SEO-заголовок и описание. Инструкции отсекают типичные вредные советы: никакого второго H1 в тексте, потому что заголовок статьи и так становится H1, и никаких “допишите ещё” для статей от 600 слов.

Перевод в один клик

Статью целиком - заголовок, анонс и текст - можно перевести прямо из редактора через DeepL; у каждого бизнеса свой ключ. Перевод появляется в редакторе нужного языка, и владелец проверяет термины и интонацию до публикации.

Сайт пересобирается сам

Новая статья появится на статическом сайте только после пересборки, и за этим следит платформа. Любое изменение статьи или рубрики помечает сайт как имеющий неопубликованные правки. С 06:00 до 22:00 платформа каждый час проверяет такие сайты и запускает их пересборку, а ночной прогон в 02:00 подбирает остальное. Статьи, запланированные на будущее, подхватываются в течение пяти минут после назначенного времени. Для срочных правок сразу после сохранения появляется кнопка немедленной публикации.

Отзывы с модерацией

Посетители могут оставить отзыв о товаре, услуге или о компании в целом; к чему привязан отзыв, сайт решает сам с помощью ключа вроде service-plumbing. Новые отзывы ждут модерации. Менеджеры сразу получают уведомление и одобряют или отклоняют их по одному или пачкой.

Спам отсекается на сервере: скрытое поле, которое заполняют боты, не больше пяти отзывов в час с одного адреса и не больше одного отзыва с одной почты об одном объекте за сутки. Письма об одобрении или отказе ждут 30 минут и группируются: человек, у которого за один заход одобрили десять отзывов, получит одно сводное письмо, а не десять. Публичный API отдаёт только одобренные отзывы с сокращённым именем (“John D.”), а также средний балл и число оценок по каждой звезде. Сайт забирает их при сборке.

Оплата на статическом сайте

Статическая страница не может принять карту, но может отправить посетителя в Stripe Checkout. Сайт передаёт платформе почту покупателя и состав заказа; платформа создаёт заказ в статусе “ожидает оплаты”, открывает платёжную сессию Stripe на 30 минут и возвращает ссылку. Затем подписанный вебхук от Stripe отмечает заказ как оплаченный, отменённый или возвращённый.

Регистрироваться заранее не нужно. Если почта новая, платформа создаёт аккаунт прямо при оплате и присылает данные для входа вместе с заказом.

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

Личный кабинет и реферальная программа

Личный кабинет - это виджет, который любой сайт подключает одним тегом скрипта. Он говорит по-русски, по-английски и по-испански, берёт фирменный цвет сайта и показывает клиенту его заказы, баланс и рекомендации.

Клиент делится личным кодом или рекомендует знакомого напрямую, по телефону или почте. Если он попросит, чтобы знакомому перезвонили, рекомендация попадает в CRM как новая заявка с задачей менеджеру позвонить через час; если нет - просто сохраняется. Одного и того же человека нельзя порекомендовать дважды.

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

Баннер cookie входит в нашу библиотеку компонентов и общий для всех сайтов. Он выставляет Google Consent Mode v2 в “запрещено” ещё до загрузки любого скрипта Google и меняет статус только после согласия посетителя. Каждый сайт объявляет, для чего ему нужны cookie, поэтому сайт, который только считает посещения, не сможет передать Google согласие на рекламу, даже если нажать “Принять всё”.

Каждое решение сохраняется на платформе под анонимным идентификатором согласия вместе с категориями, версией политики, страницей и языком, а каждое последующее изменение попадает в историю: бизнес может показать, когда и как было дано согласие. Небольшая плавающая кнопка позволяет посетителю увидеть дату и идентификатор своего согласия и передумать.

Подписка на рассылку

Форма подписки на любом сайте отправляет адрес на платформу вместе с названием формы, например “homepage-footer”, чтобы бизнес видел, какая форма работает. Повторная подписка не создаёт дубля, а адрес, который ранее отписался, снова становится активным.

Технологии

- Сайты: Astro (статическая сборка) + @yatoday/astro-ui, хостинг Cloudflare Pages
- Бэкенд: Laravel 12 (PHP 8.4), MySQL, Redis, Laravel Reverb
- Админка: Inertia + React
- ИИ: Anthropic Claude (соавтор, SEO-подсказки), DeepL (перевод)
- Оплата: Stripe Checkout с подписанными вебхуками
- Личный кабинет: Custom Element на React 19, токены Sanctum
- Картинки: Cloudflare R2, скачиваются в сборку для оптимизации в Astro
- Пересборка: вебхуки в GitLab CI, Laravel Forge или на любой адрес
- Почта: Postmark

Результат

Наши статические сайты сохраняют скорость и минимальную поверхность для атак и при этом получают то, для чего обычно нужна CMS или движок магазина: блог, который владелец ведёт сам, с ИИ-соавтором, SEO-проверкой и переводом; отзывы с модерацией; оплату картой; личные кабинеты с реферальными вознаграждениями и учёт каждого согласия на cookie. Всё это в одном бэкенде, поэтому каждая новая функция сразу становится доступна всем сайтам.

Похожие кейсы

ИИ-наполнение каталога: переводы, описания и SEO-тексты только из фактов карточки

ИИ-наполнение каталога: переводы, описания и SEO-тексты только из фактов карточки

Каталог из тысяч технических товаров приходит на одном языке, с неровными описаниями и без SEO-текстов. Хаб за магазином Ezeden заполняет пробелы с помощью ИИ - но только из фактов, которые уже есть в каталоге, по цене, которую менеджер видел заранее, и с проверкой человеком там, где это важно.

Витрина Ezeden: поиск, оформление заказа и повторные покупки, которые продают

Витрина Ezeden: поиск, оформление заказа и повторные покупки, которые продают

Большой технический каталог теряет покупателей в трёх местах: поиск ничего не находит, оформление требует слишком многого, а вернуться незачем. Витрину Ezeden строили так, чтобы закрыть все три, - от строки поиска до второго заказа.

Сайт за день: как мы запускаем новый сайт по нескольким ответам

Сайт за день: как мы запускаем новый сайт по нескольким ответам

Каждый новый сайт начинался с одного и того же дня подготовки: скопировать старый проект, всё переименовать, настроить языки, юридические страницы и выкладку. Мы превратили этот день в короткий список вопросов, а для компаний из нашей CRM не нужны даже вопросы.

Notimia: ИИ-редакция, которая превращает местные новости в готовые посты и городскую афишу

Notimia: ИИ-редакция, которая превращает местные новости в готовые посты и городскую афишу

Местный новостной канал живёт скоростью, но небольшая команда не может каждый день читать полсотни сайтов и вручную переписывать каждую новость. Notimia читает источники за неё, собирает новости в сюжеты, готовит черновики по фактам и отправляет их в Telegram, а что выйдет - решает человек.