Интеграция со Strapi v5 CMS, вебхуки и автосинхронизация без терминала
Система Strapi v5 CMS отвечает за хранение структуры страниц, глобальных настроек, баннеров, слайдеров и статей блога.
1. Почему маршруты Next.js 16 используют Force-Cache?
В App Router Next.js 16 все запросы fetch по умолчанию агрессивно кэшируются (Force-Cache) для открытия страниц за миллисекунды. При обновлении контента в Strapi или Medusa используется архитектура инвалидации кэша по требованию (On-Demand Revalidation) для мгновенной очистки кэша.
2. Пошаговая настройка вебхуков в Strapi CMS
Чтобы сохранение или публикация страницы в Strapi немедленно сбрасывали кэш фронтенда без перезапуска сервера:
- Войдите в панель управления Strapi и перейдите в Settings > Webhooks.
- Нажмите кнопку Create new Webhook.
- Name: Укажите понятное имя, например
Next.js Revalidation Webhook. - URL: Введите
http://storefront:3000/api/revalidate(внутренняя сеть Docker) илиhttps://yourdomain.com/api/revalidate. - Events: Отметьте события в секции
Entry(create, update, delete, publish и unpublish).
Настройка заголовков безопасности и секретного ключа
- Name: Укажите точно
x-strapi-secret. - Value: Введите секретное значение переменной
REVALIDATE_SECRETиз вашего файла.env. - (Альтернатива: укажите секретный ключ как query-параметр в URL:
?secret=YOUR_REVALIDATE_SECRET).
- Проверка подлинности: Валидация секретного ключа из заголовка
x-strapi-secretили query-параметра. - Выборочная инвалидация кэша: Очистка тегов кэша, соответствующих модели Strapi (напр.,
strapi-homepage).
Чек-лист обязательных вебхуков
Для оптимальной работы настройте в Strapi следующие вебхуки, каждый с заголовком x-strapi-secret:
- ✔1. Главная страница (home-page): URL:
/api/revalidate/home-page— Сброс кэша главной страницы при изменении настроек. События:Delete,Publish,Unpublish. - ✔2. Меню (menu): URL:
/api/revalidate/menu— Сброс кэша навигационного меню. Примечание: Не требует автоматических событий; при изменении меню нажмите кнопку Trigger для применения. - ✔3. Блог (blog): URL:
/api/revalidate/blog— Обновление списка и статей блога при редактировании или публикации. События:Delete,Publish. - ✔4. Страницы (pages): URL:
/api/revalidate— Универсальный вебхук для других динамических коллекций по их тегам. События:Create,Update,Delete. - ✔5. Глобальные настройки и словарь: URL:
/api/revalidate/strapi-settings— Мгновенный сброс для глобальных настроек (цвета, стили) и переводов. События:Delete,Publish,Unpublish.
import crypto from "node:crypto"import { revalidateTag } from "next/cache"import { NextRequest, NextResponse } from "next/server" function isValidSecret(providedSecret: string | null): boolean { if (!providedSecret || !process.env.REVALIDATE_SECRET) return false const actual = new Uint8Array(crypto.createHash("sha256").update(providedSecret).digest()) const expected = new Uint8Array(crypto.createHash("sha256").update(process.env.REVALIDATE_SECRET).digest()) return crypto.timingSafeEqual(actual, expected)} export async function POST(request: NextRequest) { const secret = request.headers.get("x-strapi-secret") || request.nextUrl.searchParams.get("secret") if (!isValidSecret(secret)) { return NextResponse.json({ message: "Invalid secret" }, { status: 401 }) } const body = await request.json() if (body.model) { revalidateTag(`strapi-${body.model}`) } return NextResponse.json({ revalidated: true, now: Date.now() })}3. Структура данных и маппинг Dynamic Zones
Массив блоков из Strapi строго типизировано сопоставляется с компонентами React на основе типа __component и варианта style.
4. Оптимизация изображений и хранилище MinIO S3
Все изображения, загружаемые в Strapi, сохраняются в локальном контейнере MinIO S3, автоматически конвертируются в формат WebP и молниеносно отдаются через Caddy.
# Trigger component style sync via Strapi Admin API:POST /api/storefront/sync-component{ "componentName": "home/components/ProductShowcase", "style": "style-2", "action": "add", "autoDeploy": false} # Trigger batch production build to GitHub Actions:POST /api/storefront/buildЭта архитектура полностью изолирует загруженные файлы от файловой системы сервера, гарантируя максимальную безопасность и быстродействие.