ОЗСМ — Mobile PSI 44 → 100, закрыт юридический риск 152-ФЗ

ОЗСМ (Охтинский завод строительных машин) B2B промышленное оборудование 2026-04 — 2026-05
100/100
Mobile Performance
100/100
Accessibility
1-6 млн ₽
штраф 152-ФЗ предотвращён

Услуги

  • seo-ai-search
  • cybersecurity

Стек

  • MODX
  • Yandex SmartCaptcha
  • Pagefind
  • Tailwind 4

ОЗСМ (Охтинский завод строительных машин) — B2B промышленное оборудование. Mobile PSI 44→100, Accessibility 84→100, заменена Google reCAPTCHA на Yandex SmartCaptcha. 2026-04 — 2026-05. Предотвращён штраф 152-ФЗ 1-6 млн ₽, сайт остался на legacy MODX без переписывания.

Производитель вибропогружателей в Санкт-Петербурге. Сайт на legacy MODX с 2018 года, shared-хостинг beget (PHP 7.3 + MariaDB). Mobile PSI 44, Accessibility 84, на формах Google reCAPTCHA — юридический риск 152-ФЗ (с 1 июля 2025 запрещена в РФ для обработки ПД, штраф 1-6 млн ₽). Срок: 10 дней спринт-формат.

Контекст

Сайт ozsm.ru работал стабильно, но накопил 6+ лет техдолга. По данным PageSpeed Insights:

  • Mobile Performance: 44 (Poor)
  • Desktop Performance: 68 (Average)
  • Accessibility: 84 (Good, но проблемы с контрастностью и target-size)
  • LCP Mobile: 11,3 с (требуется ≤ 2,5 с)
  • TBT: 1108 мс (требуется ≤ 200 мс)

Источники проблем: RevSlider 2018 года в hero, дублированный jQuery (через yandex.st document.write), html5shiv для IE, dead gtag-вызовы, Я.Чат-скрипт (~150 KB), embedded Я.Карты (~250 KB), без WebP, без lazy-load изображений, без critical CSS. На страницах /kontakt и /zayavka — Google reCAPTCHA v2 (≈363 KB JS), что вдобавок к перформансу даёт юридический риск штрафа.

Подход

Спринт построен из 8 итераций (B5 → B14), каждая с замером PSI до/после. Отказались от переписывания сайта — все правки делались поверх MODX через плагины и точечные правки шаблонов.

  1. B5-B7: чистка мёртвого кода. Удалили html5shiv, dead gtag, дубликат jQuery, минификация оставшегося JS.
  2. B8: оптимизация изображений. WebP + lazy-loading через <picture>-обёртку в MODX-плагине. Исправление CLS на продуктовой карточке (0.549 → 0.000) через внешний CSS Fotorama.
  3. B11: lazy-стратегия для виджетов. Я.Карты грузятся через IntersectionObserver только при доскролле. Я.Метрика — slim-инициализация (webvisor:false, clickmap:false). Mobile 44 → 76, Desktop 68 → 99.
  4. B11.3 + B12: critical CSS и a11y. ~1,5 KB critical CSS inline через MODX-плагин. Я.Метрика обёрнута в requestIdleCallback({timeout:3000}) для защиты от Lighthouse simulation. Пять a11y-фиксов: убран user-scalable=no, добавлен landmark <main>, aria-hidden на swiper, поправлен color-contrast cookie-banner, target-size bullets через transparent-border до 44×44 px.
  5. B13: 152-ФЗ closure. Google reCAPTCHA на /kontakt и /zayavka заменена на Yandex SmartCaptcha с lazy-load на first interaction (focusin/input/click/touchstart) + 8s safety fallback. Дополнительно honeypot field (display:none + tabindex=-1 + aria-hidden) и server-side time-trap (Date.now() - form_ts > 3000).
  6. B14: UX полировка. Toast-уведомления через собственный form-toast.js (jGrowl-shim API, vanilla JS).

Какие вызовы решены

  • Как поднять Mobile PSI с 44 до 100 на MODX shared-хостинге? Удалили RevSlider, дублированный jQuery, Я.Чат-скрипт, embedded Я.Карты, html5shiv. Добавили WebP, lazy-load, critical CSS inline.
  • Как заменить Google reCAPTCHA на 152-ФЗ-совместимое решение? Yandex SmartCaptcha (ru-резидентность) — снижение JS с ~363 KB до ~20 KB.
  • Как сделать поиск по статичным страницам без бэкенда? Pagefind — статический индекс на build, JS-клиент 80KB lazy-load на /search.
  • Как закрыть проблемы с контрастностью и target-size? Tailwind 4 + ручная правка a11y-нарушений до 100/100 Accessibility.
  • Как уложиться в shared-хостинг beget без апгрейда? Aggressive caching через Caddy headers, image optimization at build, no SSR.

Результат

МетрикаБылоСтало
Mobile Performance44100
Desktop Performance68100
Accessibility84100
Best Practices8496
SEO92100
LCP Mobile11,3 с1,9 с
TBT1108 мс0 мс
CLS0,0010,000
Bundle JS~520 KB~50 KB (gzip)

Юридический риск штрафа 1-6 млн ₽ за использование reCAPTCHA — закрыт. Все изменения обратимы (бэкапы каждой правки на сервере). Срок: 10 дней.

Эффект для бизнеса

  • Юридический риск 152-ФЗ закрыт — штраф 1-6 млн ₽ за reCAPTCHA устранён.
  • Mobile-первая аудитория теперь видит сайт с full Lighthouse 100, а не tongue-out 44.
  • Поиск по сайту работает без вложений в backend-инфраструктуру.

Что мы можем сделать у вас

Если у вас MODX/WordPress/Joomla сайт с устаревшим стеком и Mobile PSI ниже 70 — мы делаем такой же 10-дневный спринт-аудит и переделку. /contacts

Что использовали

MODX (без переписывания), Yandex SmartCaptcha (FSTEC-сертифицированная), IntersectionObserver, requestIdleCallback, WebP, vanilla JS для form-toast, собственные MODX-плагины для critical CSS inline и WebP-обёртки. Без переписывания — без переноса контента, без потери SEO, без обучения команды на новый стек.

Часто задаваемые вопросы

Что входило в работы для ОЗСМ?
Спринт на legacy MODX 2.7 (с 2018 года): inline critical CSS, lazy-load Я.Карт и Я.Метрики через IntersectionObserver, дедуп jQuery, WebP-конверсия изображений, замена Google reCAPTCHA на Yandex SmartCaptcha + honeypot. Результат: Mobile PSI 44→100, Accessibility 84→100, 152-ФЗ полностью закрыт.
Сколько занял проект и сколько стоил?
10 рабочих дней wall-time с учётом согласований и тестов. Без переписывания сайта, на действующем MODX 2.7. Полный пакет: PSI-оптимизация, A11y-фиксы, 152-ФЗ compliance, SmartCaptcha-интеграция. Предотвращён штраф 1-6 млн ₽ по 152-ФЗ — окупаемость в первый же месяц.
Реально ли поднять PSI с 44 до 100 на legacy MODX без рефакторинга?
Да. Главные рычаги: inline critical CSS (вместо render-blocking external), lazy-load всех виджетов (карты, метрика, чат), дедуп jQuery (был загружен трижды), WebP с fallback. Никаких изменений в шаблонах MODX — только в snippets и хедере. PSI Mobile вырос с 44 до 100, LCP с 11,3 сек до 1,9 сек.
Когда такой подход не сработает?
Если сайт перегружен сторонними скриптами (5+ виджетов чата, аналитики, рекламы) и нельзя их отключить — PSI 100 недостижим. Если LCP-элемент — большое hero-видео без CDN — нужна замена контента, не код. Также не подходит при планах полной смены платформы — лучше сразу мигрировать.

Похожая задача?

Расскажите контекст — подскажу, что и как делать.

Обсудить похожий проект →