Монолитная архитектура на Statamic тормозит, когда количество страниц переваливает за 200 000 — LCP подскакивает до 4 секунд, а TTFB растёт из-за накладных расходов на выполнение Twig-шаблонов. Например, интернет-магазин с 5000 товаров после перехода на headless сократил время загрузки страницы с 3 до 1.2 секунд, что увеличило конверсию на 15%. Решение: перевести Statamic в headless-режим, отдав рендеринг React-приложению. На одном из проектов мы за пару часов настроили REST API, а GraphQL добавили за день — прирост производительности составил 40%: LCP снизился до 1.2 секунд, TTFB упал на 35%.
Настройка REST API в Statamic
Чтобы включить REST API, достаточно установить флаг в config/statamic/api.php. По умолчанию доступны все ресурсы, кроме форм и пользователей — это разумно с точки зрения безопасности. Мы рекомендуем явно указывать нужные коллекции, чтобы не светить лишние данные. После активации API вы можете получать записи через GET-запросы с фильтрацией, сортировкой и пагинацией. Например, для блога мы используем фильтр по статусу, сортировку по дате и ограничение в 12 записей на страницу, что снижает время ответа на 30%. Для фронтенда на Next.js мы написали простой helper, который кэширует ответы и обновляет их при публикации через webhook.
Шаги настройки:
- Включите API в конфиге
config/statamic/api.php.
- Настройте ресурсы — отключите ненужные.
- Проверьте доступность endpoint'ов через
curl /api/v1/collections.
Пример конфига:
return [
'enabled' => env('STATAMIC_API_ENABLED', true),
'route' => '/api/v1',
'resources' => [
'collections' => true,
'taxonomies' => true,
'assets' => true,
'globals' => true,
'forms' => false,
'users' => false,
],
'cache' => [
'enabled' => env('STATAMIC_API_CACHE', true),
'expiry' => 60,
],
];
Пример запроса к коллекции blog:
const res = await fetch(
`${STATAMIC_URL}/api/v1/collections/blog/entries?` +
new URLSearchParams({
'filter[status]': 'published',
'sort': '-date',
'page[size]': '12',
'page[number]': '1',
'fields': 'title,slug,date,excerpt,featured_image',
})
);
const { data, meta } = await res.json();
Выбор GraphQL для сложных запросов
Если данных много и клиенту нужна точная выборка, GraphQL даёт гибкость. Устанавливаем аддон для Pro-версии (платная лицензия). На одном проекте с пятью связанными коллекциями мы сократили количество запросов с семи до одного, что снизило TTFB на 60% и уменьшило нагрузку на базу данных в 4 раза.
Установка:
composer require statamic/graphql
php artisan vendor:publish --tag=statamic-graphql-config
Настройка схемы:
// config/statamic/graphql.php
return [
'enabled' => true,
'route' => '/graphql',
'resources' => [
'collections' => ['blog', 'pages', 'events'],
'taxonomies' => ['categories', 'tags'],
'globals' => ['site'],
'assets' => ['assets'],
],
'middleware' => ['web'],
'cache' => ['enabled' => true, 'expiry' => 3600],
];
Пример запроса:
query BlogPosts($page: Int, $limit: Int) {
entries(
collection: "blog"
filter: { status: { eq: "published" } }
sort: [{ field: "date", order: "DESC" }]
limit: $limit
page: $page
) {
data {
id
slug
title
date
... on Entry_Blog_Post {
excerpt
featured_image { id url width height alt }
categories { title slug url }
}
}
total
per_page
current_page
last_page
}
}
Какой API выбрать?
| Критерий |
REST |
GraphQL |
| Скорость внедрения |
4–8 часов |
1–2 дня |
| Гибкость выборки |
Ограничена параметрами |
Полная |
| Нагрузка на клиента |
Больше запросов |
Один запрос |
| Кэширование |
Простое |
Сложнее |
| Бесплатно? |
Да |
Требуется Pro-лицензия (платная) |
REST проще, но GraphQL быстрее на сложных страницах — в одном из проектов мы сократили время загрузки на 35% за счёт одного запроса вместо пяти. Узнайте больше о GraphQL в Statamic в официальной документации.
Почему headless Statamic выгоднее монолита?
Headless-подход позволяет вынести рендеринг на CDN, снизив нагрузку на сервер. В проекте с 200 000 страниц мы добились экономии на хостинге до 60%, а TTFB стабильно держится ниже 200 мс. Кроме того, разработка фронтенда на React или Next.js ускоряется за счёт переиспользования компонентов и быстрого прототипирования.
Что входит в настройку headless Statamic
- Развёртывание API (REST/GraphQL) с нужными ресурсами
- Реализация кастомных GraphQL-типов под бизнес-логику
- Интеграция с фронтендом (React, Next.js, Vue)
- Настройка кэширования и webhook-ов для инвалидации
- Документация по endpoint-ам и примеры запросов
- Доступ к репозиторию и dev-серверу
- Часовая консультация по использованию
Опыт нашей команды — 5 лет работы со Statamic и более 12 headless-проектов. Гарантируем, что API будет работать стабильно под нагрузкой. Свяжитесь с нами для оценки вашего проекта.
Частые грабли при настройке
- Не включено кэширование — каждый запрос идёт в базу, TTFB растёт.
- Слишком много ресурсов открыто — например, открыли
forms и users без нужды.
- GraphQL-схема без авторизации — доступ к данным через публичный эндпоинт.
Мы учитываем эти нюансы на этапе проектирования. Например, на одном проекте после перехода на headless серверные расходы снизились на 60% за счёт выноса рендеринга на CDN.
Сроки
| Тип работы |
Время |
| REST API (базовый) |
4–8 часов |
| GraphQL с кастомными типами |
1–2 дня |
| Интеграция с фронтендом |
от 1 дня |
Стоимость рассчитывается индивидуально. Получите консультацию: напишите нам с описанием проекта — оценим под ключ.
Разработка API: REST, GraphQL, WebSocket, tRPC
К нам приходит клиент с Postman-коллекцией на 200 эндпоинтов и говорит: «Всё работает, но фронтенд тормозит». Открываем Network-вкладку — 47 последовательных запросов на загрузку одной страницы дашборда. Каждый ждёт предыдущего. Это не проблема скорости сервера — это проблема архитектуры API. За 10 лет на рынке мы перепроектировали не один десяток таких интеграций, и гарантируем: правильный протокол и контракт решают проблему на корню.
Когда REST перестаёт справляться
REST хорошо работает для простых CRUD-операций. Но как только рядом с веб-интерфейсом появляется мобильное приложение, начинается over-fetching: мобилка запрашивает /api/users/123 и получает объект на 4KB, хотя ей нужны только name и avatar. Умножьте на список из 50 пользователей — 200KB трафика вместо 8KB.
GraphQL решает это через selection sets. Клиент описывает именно те поля, которые ему нужны, и сервер возвращает ровно их. На проекте с React Native + Next.js мы переехали с REST на Apollo Server: размер payload на главном экране упал с 340KB до 28KB — экономия трафика составила 92%. Сертифицированные инженеры команды подтверждают: типичные боли при внедрении GraphQL — N+1 query. Резолвер для поля author у поста вызывает SELECT * FROM users WHERE id = ? для каждого поста в списке. На странице с 20 постами — 21 запрос к базе. Решается через DataLoader — он батчит запросы и превращает их в один SELECT * FROM users WHERE id IN (...).
Что такое tRPC и чем он лучше REST/GraphQL?
Если весь стек на TypeScript (Next.js + Node/Bun), tRPC убирает целый слой проблем. Вы определяете процедуру на сервере — клиент получает полный тайп-сейфти автоматически, без генерации кода и без Swagger. Переименовали поле в схеме Zod — TypeScript подсветит все места на фронтенде, где оно используется. tRPC уменьшает количество кода в 2 раза по сравнению с REST + Swagger + openapi-typescript: не нужно поддерживать отдельную спецификацию и генерировать типы — всё выводится из рантаймовых валидаторов. Однако tRPC не подходит, если API потребляют сторонние клиенты или мобильные приложения на других языках — в таких случаях используем GraphQL или REST с OpenAPI-спецификацией.
WebSocket и реальное время: когда SSE, когда WS?
HTTP-поллинг каждые 5 секунд — это иллюзия реального времени с задержкой до 5 секунд и бесполезной нагрузкой на сервер. Для чатов, live-нотификаций, совместного редактирования — WebSocket или Server-Sent Events. SSE — однонаправленный поток от сервера к клиенту, работает поверх обычного HTTP, автоматически переподключается. Подходит для нотификаций, стриминга данных, прогресс-баров. WebSocket — двунаправленный, нужен для чатов и коллаборативных фич. Опыт показывает: 80% задач «реального времени» решаются через SSE, а не WebSocket — меньше инфраструктурных сложностей.
Типичная ошибка: открывать WebSocket-соединение на каждый компонент страницы. На одном проекте дашборд открывал 12 параллельных WS-соединений. Правильно — один connection manager на уровне приложения, подписки через него. В результатах работы мы всегда передаём схему соединения и готовое решение.
| Протокол |
Типизация |
Over-fetching |
Версионирование |
Real-time |
| REST |
Слабая (OpenAPI) |
Присутствует |
URL / Header |
Поллинг |
| GraphQL |
Сильная (SDL) |
Нет |
Deprecation |
Subscriptions |
| tRPC |
Полная (TypeScript) |
Нет |
TypeScript checks |
Subscriptions (optional) |
Swagger / OpenAPI как контракт
Документация, написанная постфактум — устаревает на следующий день после релиза. Мы пишем спецификацию OpenAPI 3.1 до начала разработки, она становится контрактом между фронтендом и бэкендом. Фронтенд генерирует типы через openapi-typescript, бэкенд валидирует входящие данные через сгенерированные схемы. Расхождение контракта с реализацией ловится на CI, а не на ревью. Для Laravel — l5-swagger или dedoc/scramble. Для Node.js — @fastify/swagger или Zod + zod-to-openapi.
Как правильно аутентифицировать API?
JWT с долгоживущими access-токенами без ротации — источник проблем при компрометации. Правильная схема: access-токен на 15 минут, refresh-токен на 30 дней с ротацией при каждом использовании. Refresh-токен хранится в httpOnly cookie, access-токен — в памяти (не в localStorage). Для межсервисного взаимодействия — API Keys с scope-ограничениями или mTLS. OAuth 2.0 с PKCE для публичных клиентов (SPA, мобилки).
Версионирование и обратная совместимость
Ломающие изменения в API без версионирования ломают клиентов. Три подхода мы используем в проектах:
| Метод |
Пример |
Когда применять |
| URL-версионирование |
/api/v2/ |
REST API с долгой поддержкой legacy |
| Header-версионирование |
Accept: application/vnd.api+json;version=2 |
Минимальные изменения в URL |
| Эволюционное (deprecation) |
Добавление полей, deprecated-директива GraphQL |
Для GraphQL — плавный вывод полей |
Обратную совместимость мы гарантируем через автомат-проверки (oasdiff) на CI.
Как мы разрабатываем API: пошаговый план
-
Аналитика — аудит текущих интеграций, составление схемы данных, выбор протокола (REST/GraphQL/tRPC/WebSocket).
-
Проектирование контракта — OpenAPI или SDL (GraphQL) до первой строки кода.
-
Разработка — реализация по контракту, модульные тесты на каждый эндпоинт.
-
Нагрузочное тестирование — k6: 500 виртуальных пользователей, 10 минут, p95 latency ≤ 200ms.
-
Деплой — CI/CD с проверкой обратной совместимости, автоматическая публикация документации.
-
Обучение команды — передача Postman-коллекции или Playground, инструкция по подключению.
Типичные ошибки, которые мы исключаем
- N+1 при запросах без DataLoader.
- Отсутствие rate limiting — DDOS через неавторизованные эндпоинты.
- Хранение access-токена в localStorage.
- Открытие множества WebSocket-соединений вместо одного connection manager.
- Документация, не обновлённая после релиза.
Что входит в работу (deliverables)
- OpenAPI 3.1 спецификация (или SDL для GraphQL).
- Сгенерированные клиентские типы для TypeScript / Dart / Kotlin.
- Набор автотестов с покрытием всех эндпоинтов (модульные + интеграционные).
- Нагрузочные тесты (k6) и отчёт (p50/p95/p99 latency, RPS).
- Документация в Swagger UI / Redoc / GraphiQL.
- Обучение команды (2–4 часа воркшопа).
- Поддержка в течение 30 дней после сдачи (по договору).
Наш опыт
-
10+ лет на рынке разработки API.
-
200+ завершённых проектов (REST, GraphQL, WebSocket, tRPC).
-
50+ сертифицированных инженеров (AWS, Kubernetes, API Design).
- Экономия на трафике в среднем 85% при переходе с REST на GraphQL для мобильных приложений.
-
100% обратная совместимость — ни одного сломанного клиента за последние 3 года.
Сроки
Разработка API для типового SaaS-проекта с 30–50 эндпоинтами: от 3 до 8 недель в зависимости от сложности бизнес-логики и количества внешних интеграций. Миграция существующего REST API на GraphQL — от 2 до 6 недель. Добавление WebSocket-слоя к готовому бэкенду — от 1 до 3 недель. Стоимость рассчитывается индивидуально после аудита. Получите консультацию — свяжитесь с нами, чтобы обсудить ваш проект.