Боевой проект
DevOps · Laravel · Docker

Доска объявлений: развёртывание в Docker и ускорение с 15 секунд до 5

Развернули коммерческий скрипт на Laravel в изолированном Docker-стеке, локализовали под русский, отребрендили и разобрались, почему страница открывалась пятнадцать секунд.

РольРазвёртывание и настройка
СтекLaravel 12 · PHP 8.2
СУБДMariaDB 11 · Redis
Результат15 с → 5–6 с
Задача

Три проблемы в одном проекте

Купленный скрипт доски объявлений нужно было поднять локально — но так, чтобы он не подрался с другими стеками на той же машине (порты СУБД, Redis и админки уже были заняты), заговорил по-русски и открывался за разумное время. На старте главная страница грузилась 13–15 секунд.

Диагностика

Виновата была не база

Первое подозрение — запросы к базе. Замерили: 75–88 запросов складываются примерно в 0.1 секунды, медленных нет ни одного. База чиста, сеть ни при чём. Значит, время уходит до того, как код вообще начал работать.

Настоящая причина — медленный проброс файлов с Windows в контейнер. PHP при настройках по умолчанию проверяет дату изменения каждого файла проекта на каждый запрос. В обычной файловой системе это незаметно; через мост Docker-for-Windows — это тысячи медленных обращений на один заход. Усугубляло то, что лимит кэша скомпилированных файлов стоял на 10 000 при 21 359 PHP-файлах в проекте: кэш переполнялся и перекомпилировал одно и то же по кругу.

Было
15 с
Стало
5–6 с
Лёгкие страницы
~4 с
Главная страница, локальный стенд. Ключевая правка — отключение проверки дат файлов плюс подъём лимита кэша выше реального числа файлов проекта.
Решение

Что сделано

Изолированный Docker-стек

Своё имя проекта, своя сеть, свои тома и порты — стек не конфликтует с уже работающими на машине. В комплекте PHP-FPM, Nginx, MariaDB, Redis и перехватчик почты, чтобы письма не улетали наружу с тестового стенда.

Установка через консоль, а не через мастер

Браузерный мастер установки спотыкался о CSRF, сессии и внешние вызовы. Прошли его детерминированно консольными командами: миграции, наполнение справочников, страна и 2 658 городов, супер-админ, файл-маркер установки. Повторяемо и без сюрпризов.

Русский по умолчанию

Язык переключён в базе, в конфиге и у админа. Отдельно выключено автоопределение по браузеру — иначе английский заголовок от браузера перебивал бы русский дефолт. Здесь же грабли: дефолтный язык кэшируется, без сброса кэша правка не видна.

Ребрендинг ровно по видимой части

Заменили то, что видит пользователь: название, футер, служебные страницы. Функциональный идентификатор скрипта не трогали намеренно — по нему код сравнивает версии, переименование сломало бы логику. Проверено: упоминаний исходного бренда на публичных страницах не осталось.

Кэш и сессии в Redis

Переключение выявило ловушку: конфиг сессий по умолчанию уходил на СУБД и валил приложение пятисоткой. Лечится явным указанием соединения — из тех вещей, которые стоят полчаса, если знаешь, и полдня, если нет.

Результат

Что получилось

×3ускорение главной страницы
2 658городов в справочнике
0конфликтов с другими стеками
18языков доступно, русский по умолчанию

Отдельно зафиксирован путь дальнейшего ускорения до значений меньше секунды — перенос кода в файловую систему Linux вместо монтирования с Windows. Это убирает первопричину, а не симптом, но требует перестройки рабочего окружения, поэтому решение оставлено заказчику как осознанный выбор.

Стек

Технологии

Laravel 12PHP 8.2PHP-FPM NginxMariaDB 11Redis Docker Composeopcacheartisan Mailpit
Название площадки, домен и доступы не публикуются. Замеры приведены с локального стенда — на боевом сервере без монтирования с Windows цифры будут лучше.