Перейти к содержанию
Ярослав Спиридонов

Магазин на 90 тысяч товаров упёрся в квоту хостинга: с диска ушло 54 ГБ мусора

Интернет-магазин корпоративных подарков с нанесением логотипа

Тип проекта
Интеграции и доработки
Год
2026
Этапы работы
Диагностика, доработка, поддержка

Перейти на сайт bistrogift.ru

Магазин корпоративных подарков на OpenCart: 89 839 товаров, четыре парсера ходят к поставщикам по расписанию, всё это живёт на общем виртуальном хостинге. Своего разработчика в компании нет, и восемь лет каждая проблема решалась доплатой хостеру: кончалось место, докупали место; росла нагрузка, докупали процессор. В марте пришло письмо о недопустимой нагрузке и угроза отключить аккаунт.

  • OpenCart · PHP · MySQL · Виртуальный хостинг Hostland · Cloudflare DNS · cron · YML-фид Яндекса

    Стек

  • 5 месяцев, волнами

    Срок

  • Диагностика, доработка, поддержка

    Роль

  • Работающий магазин на OpenCart, восемь лет истории, без своего разработчика

    На входе

Причины, когда я до них добрался, оказались скучными. Парсеры запускались десять и четырнадцать раз в час и каждый раз перемалывали базу. На страницах товаров сыпался Fatal error из левой колонки каталога. Кэш картинок рос с запуска сайта и не чистился никогда, а рядом с ним лежали два полных дампа базы, доступных по HTTP кому угодно.

Запрос посетителя проходит гео-фильтр по стране, затем кэш страниц, и только потом попадает в OpenCart и MySQL; корзина и коммерческое предложение идут мимо кэша; отдельной веткой парсеры поставщиков наполняют диск, который чистится по расписанию
Три слоя на пути запроса и вторая половина системы, которую обычно не видно

Гео-фильтр отсекает запрос по стране ещё до того, как проснётся PHP, кэш отдаёт готовый HTML прямо из файла, и до базы доходит меньшая часть запросов. Нижняя строка схемы про то, о чём вспоминают, когда хостер присылает счёт: парсеры пишут на диск логи, магазин складывает туда же превью картинок, и ни одна куча не чистилась. Теперь у каждой есть срок жизни и задача в расписании.

Что было сложного

Почти все ограничения этой истории от того, что хостинг общий: нет модулей Apache, нет управления PageSpeed, cron живёт по правилам чужой панели. Готовые плагины кэша для OpenCart лезут в шаблон и модификации, а там уже лежало несколько слоёв чужих правок, поэтому полностраничный кэш пришлось написать свой: первый заход кладёт готовый HTML в файл, следующие три часа страница отдаётся из него, минуя PHP и базу. Три часа выбраны под расписание парсеров, чтобы цены и остатки не отставали от каталога больше чем на полсмены. Ключевое здесь не сам кэш, а список исключений из него: корзина, оформление и админка не кэшируются вовсе, и ошибка в этом списке стоит дороже, чем отсутствие кэша. С ботами вышло похоже: Cloudflare в России работает только как DNS, гео-модуля на общем хостинге нет, свой скрипт проверки страны оказался лишним кодом на горячем пути, и в итоге всё уехало в штатную фильтрацию хостера, а чёрный список стран пришлось перевернуть в белый.

/01

  • Общий хостинг
  • Свой кэш страниц
  • Фильтр по странам
  • Список исключений

Результат

  • 134 ГБ

    Занято на диске

    было 188 ГБ · −54 ГБ

  • 0

    Товаров, недоступных роботу Яндекса

    было 10 · −10

  • 0

    Дампов базы в открытом доступе

    было 2 · −2

Место мерил по панели хостинга, товары по отчёту Яндекс.Вебмастера, теми же инструментами, что и точки отсчёта. Дополнительные 40 ГБ квоты заказчик отключила, счёт за хостинг вернулся к 2 919 ₽ в месяц. Фид Яндекс принял без замечаний 12 июня; до этого магазина в товарном блоке поиска не было вовсе.

Скорость осталась без цифры. Ускорение было самой большой частью работы: кэширование средствами хостинга эффекта не дало, свой кэш дал, и писем о недопустимой нагрузке за оставшиеся пять месяцев не пришло ни одного. Но в тот же день заказчик докупила процессорные ядра, время ответа я смотрел на глаз, и разделить вклад не могу. Написать «стало быстрее» без числа значит нарушить то, ради чего этот сайт сделан; поставить цифру задним числом значит нарушить это вдвойне.

Все кейсы

  • Экран проекта: Даримобайл: интернет-магазин мобильной техники со своим бэкендом на FastAPI

    e-commerce / розница техники · 2026

    Даримобайл: интернет-магазин мобильной техники со своим бэкендом на FastAPI

    Каталог с фильтрацией, карточки товаров, корзина и оформление заказов. Свой бэкенд на FastAPI и PostgreSQL, окружения в Docker, деплой при пуше в main через GitHub Actions.

    Next.js · TypeScript · Tailwind · FastAPI · PostgreSQL · Docker · GitHub Actions

    Подробнее о проекте

  • Экран проекта: Шаблон сайта сети фитнес-клубов

    Шаблон

    фитнес / сети клубов · 2026

    Шаблон сайта сети фитнес-клубов

    Шаблон сайта сети из трёх клубов: каталог из 15 направлений, расписание с записью, калькулятор абонемента на четыре срока и личный кабинет клиента с загруженностью зала. Next.js и Tailwind, деплой на Vercel.

    Next.js · Tailwind · Vercel

    Подробнее о проекте

  • Экран проекта: Pacemaker Agency: промо-сайт агентства спортивного маркетинга на Headless WordPress

    спортивный маркетинг · 2024

    Pacemaker Agency: промо-сайт агентства спортивного маркетинга на Headless WordPress

    Промо-сайт агентства полного цикла: спецпроекты, фото- и видеопродакшн, SMM. Next.js на Headless WordPress — команда обновляет кейсы и офферы сама. Навигация ведёт от ценностного предложения через кейсы к форме заявки.

    Next.js · Headless WordPress · Tailwind

    Подробнее о проекте

Нужно похожее?

Расскажите, что происходит сейчас, — отвечу, как это можно решить.