Задача
One Mind Agency — креативное агентство, которому нужен был двуязычный сайт на английском и итальянском, чтобы показывать свои работы и привлекать новых клиентов. Команда хотела публиковать кейсы из привычной админки, а каждый запрос должен был попадать в воронку продаж, а не в почтовый ящик. Хостинг был виртуальным: Node мог запускать сборки, но не постоянный сервер.
Что я сделал
Я построил три части, которые работают бок о бок на одном домене.
- Статический фронтенд на Next.js — главная, работы, страница кейса, «о нас» и контакты, экспортированные как обычные файлы в /en/ и /it/. Они быстро отдаются, и ничего не нужно держать запущенным.
- Headless WordPress в /cms — собственный плагин регистрирует тип записи Case Study и его поля (клиент, год, категория, акцентный цвет, краткое описание, авторы) и отдаёт их вместе с переводами через REST API. Публичные страницы WordPress перенаправляют на настоящий сайт.
- Автоматические пересборки — когда редактор сохраняет контент, WordPress выставляет флаг. Серверная задача подхватывает его примерно в течение 5 минут, пересобирает сайт и подменяет файлы, а блокировка не даёт двум сборкам пересечься.
- Форма обратной связи в CRM — небольшой мост на PHP превращает каждый запрос в Lead в EspoCRM с диапазоном бюджета и языком. Ключ CRM остаётся на сервере и никогда не попадает в браузер.
- Защита от спама и злоупотреблений — скрытое поле-ловушка (honeypot), один запрос раз в 30 секунд с одного IP-адреса, список разрешённых источников и строгая проверка каждого поля.
- Никаких битых изображений — если кейс ссылается на файл изображения, которого больше нет, API ничего не возвращает, и страница показывает вместо него цветную заглушку.
Технологии
Next.js 15 со статическим экспортом, React 19, Tailwind CSS, Framer Motion и Lenis. WordPress с ACF и Polylang. EspoCRM. PHP 8.2 и MariaDB 10.11 на Hetzner.
Почему именно так
Сервер разрешает Node только для сборок, без долгоживущих процессов. Поэтому сайт генерируется во время сборки и отдаётся как статические файлы, а WordPress и CRM работают на PHP, который на сервере уже был. У редакторов остаётся обычная админка, а посетители получают простой HTML.


