Перейти к содержимому
Эльдар Шахвалиев
Обсудить проект
← Все проекты
202606.2026 — presentВ продеполный цикл

Сеть WordPress-сайтов наркологической клиники «От запоя»

Наркологическая клиника (бренд «Станция здоровья», Нижегородская обл.; сеть сайтов «От запоя») · Медицина / наркология (вывод из запоя, лечение алкоголизма и наркомании)

Fullstack-разработчик WordPress (соло): аудит кодовой базы и БД, оценка безопасности, доработки на проде. AI-augmented

  • 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
подготовительных артефакта (research-стек, аудит кода/БД, план реализации, актуализированный CLAUDE.md)
7
пунктов безопасности (S1–S7) с приоритизацией и митигейтами без обновления
CVE-2025-62047, CVSS 9.9
критическая дыра (Arbitrary File Upload, уровень Subscriber) в case-addons 1.2.0 — выявлена и доказана
2 + 2
два рабочих WordPress-сайта (отдельные БД, не Multisite) + два домена-301-редиректа
1223
замены доменных ссылок при тиражировании на dzerzhinsk (wp search-replace, п.19)
5
параллельных web-research агентов в фазе исследования стека

Контекст и задача

Клиент — наркологическая клиника (бренд «Станция здоровья», Нижегородская обл.) с сетью сайтов по тематике вывода из запоя и лечения алкоголизма/наркомании. Инфраструктура: два рабочих 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-plugin otz-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.0CVE-2025-62047, CVSS 9.9 (Arbitrary File Upload уровнем Subscriber ≈ RCE на прод-сети клиники, bundled-плагин темы без авто-апдейта); Slider Revolution 6.7.34CVE-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)