CRM и ERP под процессы
Сделки, заказы, склад, производство, финансы, роли и аудит. Vue даёт быстрые таблицы и фильтры, Laravel — правила и интеграции, MySQL — целостность.
Выберите тему — соберём контекст
Laravel отвечает за доменную логику, права и интеграции, Vue 3 — за интерфейс, который не перезагружает страницу, MySQL хранит данные с честными индексами и планом запросов. Мы не «пишем на модном», а выбираем стек под задачу — и здесь объясняем, почему в большинстве корпоративных проектов выигрывает именно эта связка, а также в каких случаях мы предложим другой вариант.
Состав стека
обновляется вместе с проектомМаршруты, валидация, очереди, политики доступа, миграции схемы.
Интерактивные таблицы, фильтры, дашборды, кабинеты, онлайн-редакторы.
Транзакции, индексы, реплики для чтения, партиционирование истории.
Версии, которые мы берём в новые проекты. Для существующих систем работаем на тех версиях, что уже в проде.
Стек проверен на системах, где важны не «вау-эффекты», а стабильность, права доступа, отчётность и интеграции с чужим софтом. Ниже — типы задач, под которые он подходит лучше всего.
Сделки, заказы, склад, производство, финансы, роли и аудит. Vue даёт быстрые таблицы и фильтры, Laravel — правила и интеграции, MySQL — целостность.
Кабинет клиента, партнёра или сотрудника: авторизация, 2FA, документы, платежи, тикеты, история операций. Vue-слой работает поверх Blade или как отдельное SPA к API.
Каталог, корзина, оплата, доставка, личный кабинет продавца, выгрузки в маркетплейсы. MySQL держит тяжёлые выборки каталога, Laravel — очереди синхронизаций.
Мультитенантность, тарифы и лимиты, биллинг, вебхуки, роли организаций. Laravel-очереди и планировщик снимают с веба всё, что не обязано выполняться в запросе.
REST/JSON-API для мобильных приложений и партнёров, вебхуки, идемпотентность, версионирование, лимиты, журнал вызовов — на Laravel это пишется без самодельных велосипедов.
Отчёты по продажам, воронке, складу и марже. Vue рисует графики и кросс-фильтры, MySQL — агрегаты, материализованные сводки и реплика для тяжёлых выборок.
Стек работает, когда у каждого слоя есть чёткая роль и запрет лезть в чужую. Ниже — что именно мы поручаем Laravel, Vue и MySQL, какие правила соблюдаем и как это выглядит в коде.
Выберите слой, чтобы посмотреть код и правила
Домен, доступ, интеграции
Laravel закрывает то, что в самописном бэкенде превращается в месяцы работы: аутентификация и 2FA, разграничение прав, очереди и ретраи, планировщик, валидация, миграции схемы, кэш, наблюдаемость. Мы не пишем своё там, где фреймворк уже дал проверенное решение.
Наши правила слоя
final class PlaceOrder
{
public function __construct(private Inventory $inventory) {}
public function handle(User $user, Cart $cart): Order
{
Gate::authorize('place-order', $cart);
return DB::transaction(function () use ($user, $cart) {
$this->inventory->reserve($cart->items);
return $user->orders()->create([
'number' => OrderNumber::next(),
'total' => $cart->total(),
'placed_at' => now(),
]);
});
}
}
// Контракт ответа не меняется от рефакторинга модели
class OrderResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'number' => $this->number,
'total' => (int) $this->total,
'items' => OrderItemResource::collection($this->whenLoaded('items')),
];
}
}
Интерфейс и состояние
Vue не требует переписывать сайт в SPA. Мы применяем его точечно: островком внутри Blade там, где нужен живой интерфейс, и полноценным приложением там, где пользователь работает в системе весь день. Один и тот же API обслуживает оба варианта.
Наши правила слоя
export function useOrders(filters: Ref<Filters>) {
const page = ref(1)
const query = computed(() => ({
...filters.value,
page: page.value,
}))
const { data, isPending, error } = useQuery({
queryKey: ['orders', query],
queryFn: ({ signal }) =>
api.get<Paginated<Order>>('/api/orders', { params: query.value, signal }),
placeholderData: keepPreviousData,
})
watch(filters, () => { page.value = 1 }, { deep: true })
return { orders: computed(() => data.value?.items ?? []), page, isPending, error }
}
Целостность и скорость выборок
Большинство «медленных систем» — это не медленный код, а запрос, который читает миллион строк без индекса. Поэтому схему, ключи и индексы мы проектируем до первой строки кода, а не после жалоб пользователей.
Наши правила слоя
-- Запрос списка заказов организации за период с фильтром по статусу
SELECT id, number, total, placed_at
FROM orders
WHERE organization_id = ?
AND status IN ('paid', 'shipped')
AND placed_at >= ?
ORDER BY placed_at DESC
LIMIT 50;
-- Составной индекс: равенство -> диапазон -> сортировка
ALTER TABLE orders
ADD INDEX orders_org_status_placed_idx (organization_id, status, placed_at);
-- Проверяем, что индекс реально используется
EXPLAIN ANALYZE
SELECT ... ;
-- Ожидаем: type=range, key=orders_org_status_placed_idx, rows << COUNT(*)
Мы выбираем не «самый современный», а наименее дорогой в поддержке вариант под ваш сценарий. Ниже — три рабочие схемы: что в каком случае берём и чем за это платим.
Страницу отдаёт Laravel, а Vue подключается только там, где нужен живой интерфейс: калькулятор, фильтр каталога, форма с подсказками, таблица. Меньше кода, мгновенная первая отрисовка, отличная индексация.
Плюсы
Чем платим
Laravel — только API и домен, Vue — приложение целиком. Экран не перезагружается, состояние и кэш живут в браузере. Требует дисциплины: контракт API, версионирование, авторизация через токены или сессию с CSRF.
Плюсы
Чем платим
Laravel отдаёт Vue-страницы напрямую, без ручного написания API-слоя: контроллер возвращает Inertia-ответ, фронтенд получает пропсы. Один язык маршрутизации, одна авторизация, один деплой.
Плюсы
Чем платим
Это не список «плюшек», а минимальные требования, который проект на Laravel + Vue + MySQL должен выполнить, чтобы его можно было безопасно развивать через два года.
Миграции под контролем, обратимость, тестовые данные. Схема описана документацией, а не «памятью разработчика».
Роли, политики, журнал действий: кто, что и когда изменил. Требование почти любого корпоративного контура.
Redis + Horizon: письма, выгрузки, синхронизации и отчёты не блокируют интерфейс пользователя.
Покрытие доменной логики и API, фабрики и фикстуры. Регресс ловится в CI, а не на проде.
Линтеры, статический анализ, автотесты, сборка фронтенда и деплой по тегу — автоматически.
Логи с контекстом, метрики, алерты по ошибкам и медленным запросам, трассировка ключевых сценариев.
Регулярные бэкапы MySQL с проверкой восстановления и понятным RPO/RTO, а не «бэкап где-то есть».
README, схема данных, описание интеграций и инструкция по развёртыванию. Передача без устных легенд.
Прогон профиля «пиковый день» до релиза: находим узкие места в запросах и очередях заранее.
Ниже — целевые показатели для типового корпоративного контура. Это не универсальные обещания: цифры подтверждаются нагрузочным тестом на вашем профиле трафика, объёме данных и железе.
Целевые показатели
Шкала показывает приоритет показателя в наших проектах, а не замер конкретной системы: итоговые цифры зависят от профиля трафика, объёма данных и железа.
Самая частая причина «медленного Laravel». Лечится жадной загрузкой связей и запретом на запросы внутри циклов — это правило код-ревью.
Составной индекс под конкретный запрос меняет время выборки на порядки. Проверяем EXPLAIN, а не догадываемся.
Справочники, права, агрегаты — в Redis с осознанной инвалидацией. Кэш без стратегии сброса вреднее его отсутствия.
Письма, выгрузки, вебхуки и импорт — вне пользовательского запроса. Пользователь не ждёт чужую интеграцию.
Разделение чанков, ленивые маршруты, отсутствие «на всякий случай» подключённых библиотек.
Аналитика и выгрузки уходят на реплику: рабочие места менеджеров не конкурируют с отчётами.
Стек — не вера, а инструмент с областью применения. Ниже сравнение с альтернативами по критериям, которые реально влияют на стоимость владения. Мы намеренно указали и проигрыши.
| Критерий | Laravel + Vue + MySQL | WordPress + плагины | React + Node + MongoDB | Конструктор / no-code |
|---|---|---|---|---|
| Своя бизнес-логика | сильная сторона | слабое место | сильная сторона | с оговорками |
| Скорость первого запуска | с оговорками | сильная сторона | слабое место | сильная сторона |
| Стоимость владения на 3–5 лет | сильная сторона | с оговорками | с оговорками | слабое место |
| Сложные отчёты и агрегаты | сильная сторона | слабое место | с оговорками | слабое место |
| Транзакции и целостность данных | сильная сторона | с оговорками | с оговорками | с оговорками |
| Realtime-нагрузка (чаты, трекинг) | с оговорками | слабое место | сильная сторона | слабое место |
| Огромные документные массивы | с оговорками | слабое место | сильная сторона | слабое место |
| Владение исходным кодом | сильная сторона | с оговорками | сильная сторона | слабое место |
| Найм команды на рынке РФ | сильная сторона | сильная сторона | с оговорками | слабое место |
Вывод короткий: для корпоративных систем с правами, отчётами и интеграциями стек Laravel + Vue + MySQL — оптимальный баланс стоимости владения. Если проект про реальное время или про миллиарды документов, честнее взять другой стек — и мы это скажем на первой встрече, а не на третьем спринте.
Отказ от проекта на первой встрече дешевле для обеих сторон, чем переписывание на третьем месяце. Вот случаи, где мы честно уводим клиента на другое решение.
Стек не подойдёт
Чаты, трекинг, котировки, игры с тысячами одновременных соединений — здесь лучше Node.js, Go или Elixir. Laravel остаётся для домена, а шина событий строится отдельно.
Если сущности принципиально разнородны и меняются каждый день, реляционная схема станет тормозом — рассмотрим MongoDB или PostgreSQL с JSONB.
Одна страница с формой не требует команды и бэкенда: конструктор или статический сайт обойдутся в разы дешевле.
Своя система требует сопровождения и развития. Если это не заложено, честнее готовое коробочное решение.
Когда стек — правильный выбор
Состав фиксируется до старта и не «подменяется» в процессе. Заказчик всегда знает, с кем говорит и кто отвечает за результат.
Схема данных, границы модулей, контракты API, код-ревью, технические решения.
20–40 % времени проекта
Домен, интеграции, очереди, права, миграции, автотесты бэкенда.
1–3 человека
Интерфейсы, состояние, доступность, сборка через Vite, связка с API.
1–2 человека
Тест-планы по сценариям, регресс, приёмка релизов, проверка прав доступа.
от 0,5 ставки
План, риски, демо каждые две недели, приоритеты и единая точка правды по срокам.
на весь срок
Окружения, CI/CD, мониторинг, бэкапы, нагрузочное тестирование.
по этапам
Одинаковые этапы для любого объёма: разница только в длительности. Демо — каждые две недели, смета — фиксируется после аудита.
Разбираем процессы, данные и интеграции, считаем объём. На выходе — карта системы, риски, уровень сложности и вилка бюджета. Бесплатно.
Схема данных, модули, роли, контракты API, прототипы ключевых экранов, план релизов. Здесь дешевле всего менять решения.
Спринты по две недели: бэкенд, фронтенд и тесты идут вместе, а не «сначала всё, потом интеграция». В конце каждого спринта — демо на стенде.
Автотесты, ручные сценарии, проверка прав, нагрузочный прогон профиля «пиковый день», устранение узких мест в запросах.
Перенос данных, обучение сотрудников, регламенты, параллельная работа со старой системой до полного перехода.
Мониторинг, бэкапы, обновления, доработки по бэклогу. Каждый месяц — отчёт по инцидентам и выполненным задачам.
Система может стоять в вашем контуре, в российском облаке или у нас на сопровождении. Код и схема данных при этом не меняются — меняется только окружение.
Nginx + PHP-FPM 8.4 либо Laravel Octane (FrankenPHP/RoadRunner) там, где нужна максимальная пропускная способность.
InnoDB, реплика для чтения и отчётов, ежедневные полные и почасовые инкрементальные бэкапы с проверкой восстановления.
Кэш, сессии, очереди и блокировки. Отдельная база под очереди — чтобы очистка кэша не влияла на фоновые задачи.
Дашборд очередей, ретраи, таймауты, алерты по упавшим задачам. Видно, что и почему не доехало.
Vite-сборка как артефакт, миграции отдельным шагом, деплой по тегу, откат на предыдущий релиз одной командой.
Метрики, медленные запросы, ошибки и алерты в Telegram. Инцидент виден до того, как о нём напишет пользователь.
Ниже ориентиры для проектов «под ключ» с командой. Точная смета — только после аудита: объём интеграций и состояние данных влияют на цену сильнее, чем число экранов.
от 600 тыс ₽
Срок: 4–8 недель
Одна роль или узкий круг пользователей: кабинет, портал, внутренний сервис, админка с отчётностью.
от 1,8 млн ₽
Срок: 3–6 месяцев
Полноценная система с модулями, правами, отчётностью и интеграциями — самый частый формат проекта на этом стеке.
от 4 млн ₽
Срок: от 6 месяцев
Мультитенантная или мультифилиальная система, несколько контуров, мобильное приложение, своя команда сопровождения.
Во всех вариантах: фиксированная смета этапа, исходный код и документация передаются заказчику, оплата по этапам. Поддержка — отдельным договором от 60 тыс ₽/мес.
Laravel даёт самый короткий путь от задачи до рабочего кода: аутентификация, права, очереди, планировщик, миграции и тестирование уже решены и проверены большим сообществом. Symfony выбираем для проектов, где нужна максимально строгая компонентная архитектура и уже есть команда с этим опытом — на первой встрече это обсуждается отдельно.
Не всегда. Если интерфейс — это формы и списки с редкой перезагрузкой, Blade справится дешевле, и мы так и сделаем. Vue нужен там, где пользователь работает в системе весь день: живые таблицы, фильтры без перезагрузки, дашборды, редакторы, drag-and-drop. Смешанный вариант — Blade-страницы с Vue-островками — часто оптимален по стоимости.
Сначала диагностика, а не смена базы. В большинстве случаев проблему решают индексы и переписанные запросы: EXPLAIN, устранение N+1, кэш, реплика для чтения, партиционирование истории, материализованные сводки. Переход на другую СУБД — дорогая операция, и мы предлагаем её только когда исчерпаны дешёвые шаги и они не дали результата.
Да, это цель, а не риск. Мы пишем на стандартных механизмах фреймворка, без «умных» самописных слоёв, и передаём README, схему данных, описание интеграций, инструкцию по развёртыванию и тесты. По желанию проводим обучение команды и парное программирование на их задачах.
Постепенно и без остановки бизнеса: сначала выносим один модуль, ставим его рядом со старым, синхронизируем данные и переключаем пользователей. Так делается до тех пор, пока старый контур не останется пустым. Проект «выключить всё и переписать за год» мы не берём — риск слишком высок.
Мы. До релиза проводится нагрузочный прогон на согласованном профиле (число пользователей, объём данных, пиковые сценарии), а безопасность закрывается по чек-листу: права на сервере, защита от массового присвоения полей, CSRF, ограничение частоты запросов, 2FA для администраторов, аудит действий, бэкапы с проверкой восстановления.
Да, если архитектура выбрана как «Laravel API + фронтенд». Контракт документируется и версионируется, авторизация — токены Sanctum/Passport, лимиты и журнал вызовов. Это одна из причин, почему мы часто рекомендуем схему с отдельным API, даже когда мобильное приложение пока только в планах: добавить его позже без переписывания бэкенда уже не получится.
Laravel, Vue и MySQL — не случайный набор из модных названий, а разделение ответственности, которое снижает стоимость владения системой. Laravel закрывает серверную часть: права доступа, валидацию, очереди, планировщик, миграции и тесты. Vue берёт на себя интерфейс: реактивные таблицы, фильтры, формы и дашборды, которые не заставляют пользователя ждать перезагрузки. MySQL хранит данные в реляционной схеме с транзакциями, индексами и понятным планом запросов.
Каждый слой можно менять отдельно. Если интерфейс устареет, его переписывают, не трогая бизнес-логику. Если вырастет нагрузка, добавляют реплику для чтения, кэш и очереди. Если появится мобильное приложение, его подключают к тому же API, что и веб-интерфейс.
Исходный код в вашем репозитории, документацию по схеме данных и интеграциям, инструкцию по развёртыванию, автотесты и настроенный CI. Систему можно передать другой команде без «устных легенд»: архитектурные решения зафиксированы, а не живут в голове одного разработчика.
Развёртывание возможно в вашем контуре, в российском облаке или на нашем сопровождении. Для корпоративных заказчиков это часто решающий фактор: данные не покидают контролируемую инфраструктуру, а доступ администратора подтверждается вторым фактором и фиксируется журналом действий.
Долгая жизнь системы зависит не от выбора фреймворка, а от дисциплины: миграции под контролем, доменная логика отделена от контроллеров, тяжёлые операции вынесены в очереди, схема данных описана, а тесты ловят регресс до релиза. Мы закладываем это с первого спринта, потому что добавить порядок в готовую систему дороже, чем построить её аккуратно.
Отдельное внимание — обновлениям зависимостей и версиям с длинной поддержкой. Мы не берём в новые проекты экспериментальные технологии и не используем стек, для которого на рынке сложно найти команду: поддержка должна быть возможна без нас.
Расскажите, какую систему нужно построить или что уже не справляется. На первой встрече разберём процессы и данные, оценим объём, предложим схему архитектуры и назовём порядок сроков и бюджета — без обязательств. Первый шаг — диагностика и аудит.
Cookie и аналитика
Мы используем необходимые cookie для работы сайта и форм. Аналитические cookie (Яндекс.Метрика, включая запись сессий) подключаем только с вашего согласия — от него можно отказаться. Подробнее: Политика использования cookie и обработка персональных данных.