Сеть WordPress-сайтов наркологической клиники «От запоя»
Наркологическая клиника (бренд «Станция здоровья», Нижегородская обл.; сеть сайтов «От запоя») · Медицина / наркология (вывод из запоя, лечение алкоголизма и наркомании)
- PHP
- WordPress
- Elementor
- MySQL
- JavaScript
- CSS/SCSS
- WP-CLI
- Nginx
- WPForms
- Contact Form 7
- TablePress
- Redux Framework
- WooCommerce
- Slider Revolution
- Max Mega Menu
- Playwright
- 22
- 4
- 7
- CVE-2025-62047, CVSS 9.9
- 2 + 2
- 1223
- 5
Контекст и задача
Клиент — наркологическая клиника (бренд «Станция здоровья», Нижегородская обл.) с сетью сайтов по тематике вывода из запоя и лечения алкоголизма/наркомании. Инфраструктура: два рабочих WordPress-сайта — ot-zapoya.ru (главный) и dzerzhinsk.ot-zapoya.ru (региональный клон, отдельная БД, не Multisite) — плюс два домена-двойника (*ot-zapoia.ru), которые только 301-редиректят. Сайты построены на премиум-теме Medigo (Case-Themes) + Elementor; контент страниц хранится в БД (_elementor_data), а не в файлах темы (источник: docs/reports/2026-06-18-audit-codebase-db.md).
Исходное состояние — типовой «унаследованный» прод высокого риска: нет git, нет staging, нет дочерней темы (правки шли прямо в родительскую Medigo), компоненты сознательно не обновляются («политика не обновляем»), среди активных плагинов — критические незакрытые уязвимости. Заказчик передал ТЗ из 22 пунктов (навигация, формы, SEO, адаптив, прайс, редизайн первого экрана и т.д.) и согласовал правки на проде с обязательными бэкапами (источник: CLAUDE.md, docs/reports/2026-06-18-implementation-plan.md).
Что я сделал
Роль — solo fullstack-инженер на полном цикле: подготовка → аудит → безопасность → реализация → тиражирование. Honest engagement: это не greenfield — сайт построен ранее на покупной теме; я выполнял аудит существующей системы и доработку legacy, а также защищённую модификацию прод-окружения. Элемент «создания с нуля» — только редизайн первого экрана (Hero) и ряд кастомных блоков.
- Подготовка (read-only): веб-исследование стека с датированными CVE/EOL, аудит кодовой базы и БД по SSH+WP-CLI (только чтение), план реализации по каждому из 22 пунктов с acceptance-критериями и откатами, актуализация
CLAUDE.mdпо проверенным фактам. Четыре отчётных артефакта вdocs/reports/. - Оценка безопасности (отдельная сильная компетенция, см. ниже): выявлены и доказаны критические уязвимости, составлен приоритизированный план устранения S1–S7 как коммерческое предложение доп. работ.
- Реализация ТЗ поэтапно (этапы 1–5): быстрые победы (логотип-ссылка, динамический копирайт, мессенджеры TG/MAX вместо WhatsApp site-wide, битые ссылки/филиалы), навигация и формы (страница
/lechenie-narkomanii/, двухколоночное подменю, перенастройка формы WPForms 7941 — маска телефона, удаление лишних полей, отказ от деградирующей в РФ reCAPTCHA), прайс без табличного формата (шорткод[otz_pricelist]поверх данных TablePress), UI/адаптив, контент-редизайн (FAQ-блок, новый Hero), и тиражирование на dzerzhinsk (другой движок форм — CF7; 1223 замены доменных ссылок). - Инженерный механизм правок: весь кастом — в mu-plugin
otz-custom.php(инлайн-CSS вwp_head+ шорткоды), точечные обратимые патчи_elementor_dataс бэкапом и снятием снимка поля, визуальная проверка через Playwright. Каждая правка — с бэкапом БД/файлов и готовым откатом (источник:docs/handoff.md,docs/progress.md).
Решение и подход
- CSS/PHP вне темы через mu-plugin. План изначально предлагал дочернюю тему
medigo-child, но по решению заказчика выбран mu-pluginotz-custom.php— переживает обновления Medigo и не несёт риска сброса опций темы дочерней темой. В репозитории дочерней темы нет — подтверждает выбранный механизм (источник:sites/./themes/,docs/handoff.md). - Контент в БД, а не в файлах. Ключевая находка аудита: шапка/подвал — не Theme Builder и не хардкод, а CPT темы
pxl-template, назначаемые опциями Redux (header_layout=3530,footer_layout=97); меню рендерит виджет темыpxl_menu, а не Max Mega Menu (это изменило способ правок навигации). Большинство задач — правки контента/настроек в БД на проде. - Прайс-лист переписан с сохранением единого источника данных: цены остаются в TablePress (заказчик правит привычно), а вывод — современные строки-карточки «услуга + цена-пилюля» через собственный шорткод, парсящий таблицу; DataTables отключён.
- Hero первого экрана перерисован вручную (светлый дизайн без ИИ-картинок), с настоящим тегом
<h1>(закрывает и SEO-пункт H1/H2), аккуратной интеграцией с прозрачной overlay-шапкой темы (position:absolute) и полным набором адаптивных брейкпоинтов. - Прод-дисциплина: фронт — nginx с микрокэшем (не LiteSpeed на edge); после правок
_elementor_dataобязателенwp elementor flush-css; проверка через cache-buster и Playwright; SSH с учётом гео-блокировки порта 22 и троттлинга парольного входа (укрупнение батчей).
Результат
- Все 22 пункта ТЗ обработаны; этапы 1–4 на главном сайте и быстрые победы на dzerzhinsk подтверждены заказчиком как корректные (источник:
docs/handoff.md,docs/progress.md). Остаются 3 контентных пункта, ждущих материалов заказчика (фото врача, реальные картинки, цифры преимуществ). - Оба рабочих сайта в проде на момент проверки (2026-06-29):
ot-zapoya.ruиdzerzhinsk.ot-zapoya.ru→ HTTP 200;ot-zapoia.ru→ 301 наot-zapoya.ru(подтверждает архитектуру редиректов). Источник:curl -I(2026-06-29). - Подготовлен пакет из 4 аналитических отчётов и приоритизированный план безопасности S1–S7 как отдельное коммерческое предложение.
- Денежные метрики/конверсии в артефактах не зафиксированы (уточнить).
Стек и обоснование
WordPress + Elementor + тема Medigo/case-addons — унаследованный стек (выбор сделан до проекта). MySQL 8.0 (Percona), PHP 8.2, WP-CLI 2.8.1, фронт nginx/1.30 с микрокэшем. Формы: WPForms (главный) и Contact Form 7 (dzerzhinsk) — разные движки, правки переносились раздельно. Прайс — TablePress. Кастом — PHP/CSS в mu-plugin (без сборочного тулинга: ни package.json/composer.json для кастома, ни CI, ни тестов — фронт собирается Elementor'ом). Визуальная регрессия — Playwright (headless Chromium). Выбор инструментов продиктован запретом на обновления и отсутствием staging: решения подбирались совместимыми с текущими (часто устаревшими) версиями и максимально обратимыми.
Роль ИИ в проекте
Проект — показательный пример AI-augmented независимой разработки (2026, после ухода из BIA). Подготовительная фаза управлялась как многоагентная оркестрация на Claude Code (Opus 4.8, max effort): подробный промпт docs/prompts/01-research-audit-plan.md задаёт принцип доказательности (каждый факт → файл:строка/SQL/URL+дата), запрет доверия первичному CLAUDE.md, фан-аут субагентов по группам стека, отдельного completeness-critic, адверсариальную кросс-проверку ключевых выводов (код ↔ БД ↔ поведение) и цикл loop-until-dry до исчерпания находок; ограничение ≤2–3 одновременных SSH к боевому серверу. Результат фазы — 5 web-research агентов + сводные отчёты с пруфами.
Реализация велась в doc-driven режиме: CLAUDE.md (карта проекта, регенерированная по проверенным фактам), docs/progress.md (детальный журнал каждой правки: что/где/как/откат) и docs/handoff.md (передача состояния между сессиями) как источники истины. Инструменты ИИ: WebSearch/WebFetch для CVE/EOL, Bash+SSH для read-only аудита и последующих правок, Playwright через MCP для визуальной верификации десктоп/планшет/мобайл. Финальный клиентский HTML-отчёт — также ИИ-сгенерированный артефакт.
Инженерные вызовы
- Прод без сети и без отката-by-design: нет git и staging — компенсировано бэкапами БД/файлов перед каждой сессией, снимками
_elementor_dataперед патчем, точечными обратимыми правками и cache-flush-дисциплиной. - Контент в БД, а не в коде: правки приходилось локализовать в Elementor JSON и опциях Redux/плагинов, опровергая ошибочные предположения первичного
CLAUDE.md(логотип, расположение копирайта, рендер меню темойpxl_menu, а не Max Mega Menu). - Две инсталляции с раздельными БД и разными движками форм — тиражирование шаблонов/контента и search-replace ссылок без авто-синхронизации.
- Юридический контур РФ: наркология подпадает под ФЗ-38 ст.24 (обязательный дисклеймер «Имеются противопоказания…», раскрытие лицензии, запрет гарантий излечения и отзывов о выздоровлении; штраф юрлицу) и 152-ФЗ по ПДн пациентов из форм — это влияло на весь контент.
Безопасность (ключевая компетенция)
Отдельно оформленная экспертиза, выделенная заказчику в коммерческое предложение доп. работ (docs/reports/2026-06-18-security-additional-works.md):
- Выявлены и доказаны критические уязвимости активного стека:
case-addons 1.2.0— CVE-2025-62047, CVSS 9.9 (Arbitrary File Upload уровнем Subscriber ≈ RCE на прод-сети клиники, bundled-плагин темы без авто-апдейта);Slider Revolution 6.7.34— CVE-2025-9217 LFI (чтениеwp-config.phpс доступами к БД) +2 CVE; XSS вLiteSpeed Cache 7.7на dzerzhinsk; рассинхрон Elementor Pro 3.27.4 ↔ core 3.34.1; EOL PHP 8.2 (31.12.2026). Каждый вывод перепроверен по первоисточникам (NVD/Patchstack/WPScan/вендор) с датами; отмечены ложные срабатывания сканеров (WooCommerce 10.4.4, woo-variation-swatches). - Приоритизация и митигейты без обновления: план S1–S7 со «сложностью» под расчёт стоимости, экономикой WAF (платный WAF Timeweb — клиент не подключает), снижением attack surface (удаление неиспользуемых WooCommerce/Slider Revolution), компенсациями (отключение открытой регистрации, аудит ролей Contributor+, 2FA).
- Ответственное обращение с доступом и данными: аудит сервера — строго read-only; ПДн пациентов (
wp_wpforms_entries) не выгружались и не попадали в отчёты (152-ФЗ); секреты (SSH-доступы вdocs/credentials.md) не извлекались и не публиковались; предусмотрена ротация доступов после работ.
Услуги в проекте
- аудит
- аудит безопасности
- доработка legacy
- прод-операции (SSH/WP-CLI)
- SEO
- 152-ФЗ/ПДн
- контент
- юридическое соответствие (ФЗ-38)