Версия: 1.0
Дата: 2026-02-27
Проект: new.lideravto.ru — Drupal 11.3.3 + Commerce 3.x
Цель: От текущего состояния (модули в /tst/) до рабочего сайта с полным каталогом
/it/lider-drupal/tst/ (205/205 тестов ✅)it/data/CATALOG.csv — 18 304 строкit/data/CATALOG_OEM.csv — 9 212 уникальных OEMit/lider-drupal/data/parts_dictionary.csv — 1 237 маппинговШаг 0: Подготовка данных (~30 мин)
↓
Шаг 1: Деплой модулей (~20 мин)
↓
Шаг 2: Подготовка конфигов (~20 мин)
↓
Шаг 3: Тестовый импорт 1 бренд (~30 мин)
↓
Шаг 4: Шаблон и меню (~45 мин)
↓
Шаг 5: Полный импорт (~60 мин)
↓
Шаг 6: SEO и технические настройки (~30 мин)
↓
Шаг 7: Настройка автоимпорта (~30 мин)
─────────────────────────────────────────
Итого: ~4,5 часа
Время: ~30 минут
Что: Очистить и нормализовать данные перед первым импортом
cd /opt/claude-workspace/projects/org/@biz-lideravto/
# Запустить авто-фикс по словарю
python3 it/scripts/fix_names.py \
--input it/data/CATALOG.csv \
--dictionary it/lider-drupal/data/parts_dictionary.csv \
--output it/data/CATALOG_fixed.csv
# Проверить результат
python3 it/scripts/fix_names.py --stats it/data/CATALOG_fixed.csv
Ожидаемый результат:
- ~800 автоматически исправлено (наименование + поле "узел")
- ~400 требуют ручной проверки (флаг needs_review)
python3 it/scripts/normalize_oem.py \
--input it/data/CATALOG_fixed.csv \
--output it/data/CATALOG_ready.csv
# Проверить: должно быть 0 дублей по oem_normalized
python3 it/scripts/normalize_oem.py --check-dupes it/data/CATALOG_ready.csv
python3 it/scripts/build_compatibility.py \
--input it/data/CATALOG_ready.csv \
--output it/data/COMPATIBILITY.csv
# Ожидаемо: ~18 304 строк (по строке на каждую пару OEM × модель)
# Финальная валидация перед импортом
python3 it/scripts/validate_catalog.py it/data/CATALOG_ready.csv
# Должно быть:
# ✅ 0 пустых OEM
# ✅ 0 пустых наименований
# ✅ 0 пустых марок/моделей
# ⚠️ ~400 флагов needs_review — это ок, пойдут в очередь
Время: ~20 минут
Сервер: SSH/FTP к new.lideravto.ru
# С нашего сервера к beget
rsync -avz \
/opt/claude-workspace/projects/org/@biz-lideravto/it/lider-drupal/tst/modules/custom/ \
{beget_user}@{beget_host}:~/lideravto/app/modules/custom/
# Синхронизация конфигурации
rsync -avz \
/opt/claude-workspace/projects/org/@biz-lideravto/it/lider-drupal/tst/config/ \
{beget_user}@{beget_host}:~/lideravto/app/config/
# Credentials в .credentials.md
# Хост и логин: it/lider-drupal/.credentials.md
# На beget сервере (через SSH или Beget SSH Panel)
cd ~/lideravto/app/
# Применить обновления БД и конфигурации
drush updatedb
drush config:import
drush cache:rebuild
# Включить кастомные модули
drush en dru_lider_setup
drush lider:setup:install # создаёт vocabulary, content types, поля
drush en dru_lider_models dru_lider_parts dru_lider_catalog
drush en dru_lider_products dru_lider_compatibility dru_lider_importer
drush en dru_lider_seo dru_lider_frontend
drush cache:rebuild
# Все модули включены
drush pml | grep lider
# Тесты должны пройти
# (если phpunit доступен на shared hosting)
cd ~/lideravto/app/
./vendor/bin/phpunit modules/custom/ --testdox 2>&1 | tail -20
Контроль:
- curl -s -o /dev/null -w "%{http_code}" http://new.lideravto.ru/ → 200
- curl -s -o /dev/null -w "%{http_code}" http://new.lideravto.ru/admin/ → 302 (редирект на логин)
Время: ~20 минут
Что: Создать YAML-конфиги под наш конкретный проект
Файл определяет какая модель бренда является canonical-моделью по умолчанию.
# Файл уже описан в MODULES_GUIDE.md
# Создать: it/data/references/canonical_priority.yaml
# Содержимое: приоритеты для Scania, Volvo, Mercedes, MAN, DAF, Renault, Iveco, Liebherr
После создания проверить по Яндекс Вордстат первые 3 марки:
- Scania R vs G vs P — убедиться что R на первом месте ✓
- Volvo FH vs FM vs FMX — убедиться что FH на первом месте ✓
- Mercedes Actros vs Axor — убедиться что Actros на первом месте ✓
Файл связей "двигатель/агрегат → список грузовиков".
# Создать: it/data/references/donors.yaml
# Содержимое: engines (DC13, D13, OM471...), gearboxes (GRS895, I-Shift...), axles (RS1344...)
# Шаблон в MODULES_GUIDE.md раздел "dru_lider_compatibility"
rsync -avz \
/opt/claude-workspace/projects/org/@biz-lideravto/it/data/references/ \
{beget_user}@{beget_host}:~/lideravto/app/config/lider/
# Сообщить модулям где искать конфиги (drush state или settings.php)
drush state:set lider.config_path '../config/lider'
Время: ~30 минут
Цель: Убедиться что pipeline работает до полного импорта всего каталога
rsync -avz \
/opt/claude-workspace/projects/org/@biz-lideravto/it/data/CATALOG_ready.csv \
{beget_user}@{beget_host}:~/lideravto/data/
# На сервере
drush lider:import:validate \
--file=~/lideravto/data/CATALOG_ready.csv \
--verbose
# Должно выдать: 0 критических ошибок
drush lider:import:catalog \
--file=~/lideravto/data/CATALOG_ready.csv \
--brand=scania \
--limit=200 \
--mode=dry-run
# Показывает что будет сделано, ничего не записывает
# Ожидаем: ~200 NEW, 0 ошибок
drush lider:import:catalog \
--file=~/lideravto/data/CATALOG_ready.csv \
--brand=scania \
--limit=200 \
--mode=insert
drush lider:import:compatibility --source=catalog --brand=scania
drush lider:import:canonical --recalculate --brand=scania
drush cache:rebuild
http://new.lideravto.ru/zapchasti/scania/ — открывается, показывает список моделейhttp://new.lideravto.ru/zapchasti/scania/r5/ — открывается, показывает системыhttp://new.lideravto.ru/zapchasti/scania/r5/dvigatel/ — открывается, показывает список деталейcurl -I http://new.lideravto.ru/zapchasti/scania/r5/ → HTTP/1.1 200 OKВремя: ~45 минут
Цель: Настроить визуальную структуру ПОКА данных мало (переделывать дешевле)
В dru_lider_frontend реализовать Twig блок:
{# templates/block--lider-brand-menu.html.twig #}
<nav class="brand-menu">
{% for brand in brands %}
<a href="/zapchasti/{{ brand.slug }}/"
class="{{ active_brand == brand.id ? 'active' : '' }}">
{{ brand.name }}
</a>
{% endfor %}
</nav>
Данные передаются из Block plugin через taxonomy query lider_brands.
{# templates/block--lider-sidebar-nav.html.twig #}
{% if current_model %}
<nav class="sidebar-nav">
<h4><a href="/zapchasti/{{ current_brand.slug }}/">{{ current_brand.name }}</a></h4>
{% for system in current_model.systems %}
<a href="/zapchasti/{{ current_brand.slug }}/{{ current_model.slug }}/{{ system.slug }}/"
class="{{ active_system == system.id ? 'active' : '' }}">
{{ system.name }}
<span class="count">{{ system.parts_count }}</span>
</a>
{% endfor %}
</nav>
{% elseif current_brand %}
<nav class="sidebar-nav">
{% for model in current_brand.models %}
<a href="/zapchasti/{{ current_brand.slug }}/{{ model.slug }}/">
{{ model.name }}
</a>
{% endfor %}
</nav>
{% endif %}
Главная → Scania → R5 → Двигатель → Форсунка топливная DC13 XPI
Настроить через Drupal Breadcrumb Builder или Twig в page шаблоне.
Время: ~60 минут
Порядок важен — каждый шаг зависит от предыдущего
# На сервере: ~/lideravto/app/
# 5.1 Загрузить taxonomy (если не загружен в Шаге 1)
drush lider:import:catalog \
--file=~/lideravto/data/CATALOG_ready.csv \
--mode=upsert \
--taxonomy-only
# 5.2 Все товары
drush lider:import:catalog \
--file=~/lideravto/data/CATALOG_ready.csv \
--mode=upsert
# Ожидаем: ~9 212 NEW, время ~30 мин
# 5.3 Совместимость из прайса
drush lider:import:compatibility --source=catalog
# Ожидаем: ~18 304 записей
# 5.4 Расширение через доноров
drush lider:import:compatibility --source=donors
# Ожидаем: ~3 000–5 000 новых записей
# 5.5 Совместимость из текстовых комментариев
drush lider:import:compatibility --source=comments
# Ожидаем: ~200–500 записей
# 5.6 Редиректы (формат-варианты OEM: A-prefix, PE-suffix, дефисы)
drush lider:import:redirects --rebuild
# 5.7 Пересчёт canonical по алгоритму
drush lider:import:canonical --recalculate
# 5.8 Кросс-ссылки между деталями
drush lider:import:crosslinks
# 5.9 Сброс кеша и пересборка sitemap
drush cache:rebuild
drush xmlsitemap:rebuild
# Проверить количество страниц
drush sql:query "SELECT COUNT(*) FROM node WHERE type='lider_part' AND status=1;"
# Ожидаем: 9 212
# Проверить совместимость
drush sql:query "SELECT COUNT(*) FROM lider_compatibility;"
# Ожидаем: 17 000–20 000
# Проверить очередь на проверку
drush lider:import:review-queue --limit=10
# Показывает детали требующие уточнения наименований
# Размер sitemap
curl -s http://new.lideravto.ru/sitemap.xml | grep '<url>' | wc -l
# Ожидаем: 9 000–10 000 (только canonical)
Время: ~30 минут
# На сервере: ~/lideravto/app/robots.txt
cat > ~/lideravto/app/robots.txt << 'EOF'
User-agent: *
Disallow: /admin/
Disallow: /user/
Disallow: /cart/
Disallow: /checkout/
Allow: /zapchasti/
Sitemap: http://new.lideravto.ru/sitemap.xml
EOF
# Проверить что canonical тег правильный на нескольких страницах
curl -s http://new.lideravto.ru/zapchasti/scania/r5/dvigatel/forsunka-9604621423/ \
| grep -o 'rel="canonical"[^>]*>'
# Должно быть: rel="canonical" href="http://new.lideravto.ru/zapchasti/scania/r5/dvigatel/forsunka-9604621423/"
# Деталь с 1 моделью → конкретная модель в URL → 200 OK
curl -I http://new.lideravto.ru/zapchasti/scania/r5/dvigatel/forsunka-9604621423/
# Ожидаем: HTTP/1.1 200 OK
# Деталь с 2+ моделями → any в URL → 200 OK
curl -I http://new.lideravto.ru/zapchasti/scania/any/dvigatel/forsunka-9604621423/
# Ожидаем: HTTP/1.1 200 OK
# Canonical тег = self на любой странице детали
curl -s http://new.lideravto.ru/zapchasti/scania/any/dvigatel/forsunka-dc13-xpi-9604621423/ \
| grep -o 'rel="canonical"[^>]*>'
# Ожидаем: rel="canonical" href=".../scania/any/.../forsunka-dc13-xpi-9604621423/"
# Format-error (A-prefix) → 301 на правильный URL
curl -I http://new.lideravto.ru/zapchasti/scania/r5/dvigatel/forsunka-a9604621423/
# Ожидаем: HTTP/1.1 301 → /zapchasti/scania/r5/.../forsunka-9604621423/
# Листинг модели → 200 (всегда)
curl -I http://new.lideravto.ru/zapchasti/scania/g5/dvigatel/
# Ожидаем: HTTP/1.1 200 OK
Если планируется переезд с lideravto.ru → new.lideravto.ru:
# В nginx конфиге lideravto.ru добавить (через support beget или в панели)
location /catalog/ {
return 301 http://new.lideravto.ru/zapchasti/;
}
location / {
return 301 http://new.lideravto.ru$request_uri;
}
Добавить код счётчика в dru_lider_frontend/templates/html.html.twig:
{# В <head> #}
<!-- Yandex.Metrika counter -->
<script type="text/javascript">
(function(m,e,t,r,i,k,a){...})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "XXXXXXXX");
</script>
<!-- /Yandex.Metrika counter -->
ID счётчика из .credentials.md.
# Включить Internal Page Cache в Drupal
drush en page_cache dynamic_page_cache
# Проверить заголовки кеширования
curl -I http://new.lideravto.ru/zapchasti/scania/r5/ \
| grep -i cache
# Ожидаем: X-Drupal-Cache: HIT (после первого запроса)
Время: ~30 минут
# НЕ редактировать crontab напрямую!
# Добавить задачу через system/scheduler/
vim /opt/claude-workspace/system/scheduler/schedule.yaml
Добавить:
tasks:
lideravto_import:
name: "lideravto — импорт нового прайса"
schedule: "0 6 * * 1" # каждый понедельник в 6:00
command: >
python3 /opt/claude-workspace/projects/org/@biz-lideravto/it/scripts/check_new_price.py
&& rsync {data} {server}
&& ssh {server} "drush lider:import:catalog --mode=upsert --file=~/data/latest.csv"
notify_telegram: true
enabled: true
# Создать структуру inbox
mkdir -p /mnt/beget-s3/projects/lideravto/inbox/
mkdir -p /mnt/beget-s3/projects/lideravto/processed/
# Права
chmod 755 /mnt/beget-s3/projects/lideravto/inbox/
Менеджер кладёт новые прайсы в inbox/. Скрипт автоматически:
1. Обнаруживает новый файл
2. Запускает валидацию
3. Если OK → запускает импорт
4. Перемещает файл в processed/YYYY-MM-DD/
5. Шлёт отчёт в Telegram
# Положить тестовый файл в inbox
cp it/data/CATALOG_ready.csv /mnt/beget-s3/projects/lideravto/inbox/test_2026-02-27.csv
# Запустить вручную
python3 system/scheduler/run.py --run lideravto_import
# Проверить Telegram — должно прийти уведомление с отчётом
/zapchasti/.../canonical = self/brand/model/..., с 2+ → /brand/any/...| Проблема | Вероятная причина | Решение |
|---|---|---|
| Модуль не устанавливается | Зависимость не включена | drush en {dependency} сначала |
| Меню не отображается | Taxonomy terms не созданы | Проверить drush lider:setup:install |
| 404 на страницах деталей | URL aliases не сгенерированы | drush pathauto:bulk-update |
| Canonical не применяется | Сервис CanonicalResolver не настроен | Проверить canonical_priority.yaml путь |
| Медленный импорт | Нет индексов в БД | Проверить idx_lider_oem_normalized |
| Дубликаты OEM | Нормализация не применилась | Проверить oem_normalized поле в БД |
| Donor expansion не работает | donors.yaml не найден | Проверить drush state:get lider.config_path |
| Меню пустое после импорта | Cache не сброшен | drush cache:rebuild |
Документ подготовлен для проекта new.lideravto.ru
Дата: 2026-02-27