3

WebTech

Личный кабинет

Проекты, коммерческие предложения, документы и отчёты — в одном месте.

Войти Зарегистрироваться Забыли пароль?
Технологический стек

Laravel + Vue.js + MySQL: предсказуемый стек для систем, которые живут годами

Laravel отвечает за доменную логику, права и интеграции, Vue 3 — за интерфейс, который не перезагружает страницу, MySQL хранит данные с честными индексами и планом запросов. Мы не «пишем на модном», а выбираем стек под задачу — и здесь объясняем, почему в большинстве корпоративных проектов выигрывает именно эта связка, а также в каких случаях мы предложим другой вариант.

  • Фиксированная смета после технического аудита
  • Нагрузочный тест до релиза, а не после инцидента
  • Миграция с legacy-стека без остановки бизнеса

Состав стека

обновляется вместе с проектом
Laravel 12 PHP 8.4
Бэкенд, домен, API

Маршруты, валидация, очереди, политики доступа, миграции схемы.

Vue 3 Composition API
Интерфейс, SPA и виджеты

Интерактивные таблицы, фильтры, дашборды, кабинеты, онлайн-редакторы.

MySQL 8 InnoDB
Данные и отчётность

Транзакции, индексы, реплики для чтения, партиционирование истории.

Версии, которые мы берём в новые проекты. Для существующих систем работаем на тех версиях, что уже в проде.

3 слоя
backend · frontend · данные
1 язык
PHP 8.4 + TypeScript по одному контракту
LTS
версии с длинной поддержкой
Ваш код
репозиторий и документация у вас
Область применения

Что мы строим на Laravel + Vue + MySQL

Стек проверен на системах, где важны не «вау-эффекты», а стабильность, права доступа, отчётность и интеграции с чужим софтом. Ниже — типы задач, под которые он подходит лучше всего.

CRM и ERP под процессы

Сделки, заказы, склад, производство, финансы, роли и аудит. Vue даёт быстрые таблицы и фильтры, Laravel — правила и интеграции, MySQL — целостность.

Личные кабинеты и порталы

Кабинет клиента, партнёра или сотрудника: авторизация, 2FA, документы, платежи, тикеты, история операций. Vue-слой работает поверх Blade или как отдельное SPA к API.

Маркетплейсы и e-commerce

Каталог, корзина, оплата, доставка, личный кабинет продавца, выгрузки в маркетплейсы. MySQL держит тяжёлые выборки каталога, Laravel — очереди синхронизаций.

SaaS-платформы и подписки

Мультитенантность, тарифы и лимиты, биллинг, вебхуки, роли организаций. Laravel-очереди и планировщик снимают с веба всё, что не обязано выполняться в запросе.

API и интеграционные шины

REST/JSON-API для мобильных приложений и партнёров, вебхуки, идемпотентность, версионирование, лимиты, журнал вызовов — на Laravel это пишется без самодельных велосипедов.

Аналитика и внутренние дашборды

Отчёты по продажам, воронке, складу и марже. Vue рисует графики и кросс-фильтры, MySQL — агрегаты, материализованные сводки и реплика для тяжёлых выборок.

Разбор стека

Три слоя — три зоны ответственности

Стек работает, когда у каждого слоя есть чёткая роль и запрет лезть в чужую. Ниже — что именно мы поручаем Laravel, Vue и MySQL, какие правила соблюдаем и как это выглядит в коде.

Выберите слой, чтобы посмотреть код и правила

Домен, доступ, интеграции

Единственное место, где живут бизнес-правила

Laravel закрывает то, что в самописном бэкенде превращается в месяцы работы: аутентификация и 2FA, разграничение прав, очереди и ретраи, планировщик, валидация, миграции схемы, кэш, наблюдаемость. Мы не пишем своё там, где фреймворк уже дал проверенное решение.

Наши правила слоя

  • Сервисный слой и действия (actions) — не «толстые» контроллеры: логика тестируется без HTTP.
  • Политики и роли: доступ проверяется на сервере, интерфейс лишь скрывает недоступное.
  • Form Request для валидации: правила и сообщения в одном месте, одинаковые для API и веба.
  • Очереди (Redis + Horizon) для писем, выгрузок, синхронизаций и тяжёлых отчётов.
  • API Resource как контракт: фронтенд получает стабильную структуру, а не сырую модель.
  • Laravel Octane там, где важна пропускная способность: меньше накладных расходов на bootstrap.
Laravel: действие + контракт API + проверка прав
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 обслуживает оба варианта.

Наши правила слоя

  • Composition API и composables: логика переиспользуется между экранами, а не копируется.
  • TypeScript на критичных экранах: тип ответа API и формы ловится на сборке, а не в проде.
  • Vite и разделение бандла: страница грузит только нужный ей код.
  • Оптимистичные обновления и честные состояния загрузки — интерфейс не «моргает» пустотой.
  • TanStack Query / Pinia там, где важен кэш запросов и инвалидация после мутаций.
  • Доступность: клавиатурная навигация, фокус, aria-атрибуты в таблицах и модальных окнах.
Vue 3: composable загрузки с отменой и пагинацией
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 }
}

Целостность и скорость выборок

Схема, индексы и план запроса — часть архитектуры

Большинство «медленных систем» — это не медленный код, а запрос, который читает миллион строк без индекса. Поэтому схему, ключи и индексы мы проектируем до первой строки кода, а не после жалоб пользователей.

Наши правила слоя

  • Нормализация до 3НФ в транзакционном ядре, денормализация — только осознанно и с обоснованием.
  • Индексы под реальные запросы: составные, покрывающие, с контролем селективности.
  • EXPLAIN на каждый тяжёлый запрос: type, rows, filtered — до релиза, а не после инцидента.
  • Реплика для чтения для отчётов и выгрузок, чтобы аналитика не тормозила работу менеджеров.
  • Партиционирование и архив истории: горячая таблица остаётся маленькой.
  • Резервные копии с проверкой восстановления: бэкап, который не восстанавливали, бэкапом не является.
MySQL: индекс под запрос и проверка плана
-- Запрос списка заказов организации за период с фильтром по статусу
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 — без религии

Мы выбираем не «самый современный», а наименее дорогой в поддержке вариант под ваш сценарий. Ниже — три рабочие схемы: что в каком случае берём и чем за это платим.

Blade-страницы с Vue-островками

Подходит: Контентные страницы, кабинеты с редкой интерактивностью, SEO-критичные разделы

Страницу отдаёт Laravel, а Vue подключается только там, где нужен живой интерфейс: калькулятор, фильтр каталога, форма с подсказками, таблица. Меньше кода, мгновенная первая отрисовка, отличная индексация.

Плюсы

  • Быстрый первый экран и корректный SEO из коробки
  • Минимум JS на странице
  • Простая отладка — нет отдельного фронтенд-деплоя

Чем платим

  • Переходы между разделами — полная загрузка страницы
  • Состояние между экранами живёт недолго

Vue-приложение поверх Laravel API

Подходит: Ежедневная работа в системе: CRM, ERP, диспетчерские, админки с сотнями экранов

Laravel — только API и домен, Vue — приложение целиком. Экран не перезагружается, состояние и кэш живут в браузере. Требует дисциплины: контракт API, версионирование, авторизация через токены или сессию с CSRF.

Плюсы

  • Скорость работы пользователя и меньше нагрузки на сервер
  • Переиспользование API для мобильного приложения
  • Чёткая граница фронта и бэка

Чем платим

  • Дороже старт: нужен контракт и работа с состояниями
  • SSR/SEO требуют отдельного решения

Inertia: SPA-ощущение без отдельного API

Подходит: Панели и кабинеты средней сложности, когда нужен один деплой и меньше связующего кода

Laravel отдаёт Vue-страницы напрямую, без ручного написания API-слоя: контроллер возвращает Inertia-ответ, фронтенд получает пропсы. Один язык маршрутизации, одна авторизация, один деплой.

Плюсы

  • Нет дублирования: нет отдельного слоя API под каждый экран
  • Серверные права и валидация остаются на месте
  • Быстрый старт проекта

Чем платим

  • Публичного API «из коробки» нет — мобильное приложение потребует отдельной работы
  • Не подходит, если API нужен другим командам
Инженерные практики

Что входит в разработку на этом стеке

Это не список «плюшек», а минимальные требования, который проект на Laravel + Vue + MySQL должен выполнить, чтобы его можно было безопасно развивать через два года.

Данные

Схема данных и миграции

Миграции под контролем, обратимость, тестовые данные. Схема описана документацией, а не «памятью разработчика».

Безопасность

Права и аудит

Роли, политики, журнал действий: кто, что и когда изменил. Требование почти любого корпоративного контура.

Производительность

Очереди и планировщик

Redis + Horizon: письма, выгрузки, синхронизации и отчёты не блокируют интерфейс пользователя.

Качество

Тесты

Покрытие доменной логики и API, фабрики и фикстуры. Регресс ловится в CI, а не на проде.

Процесс

CI/CD

Линтеры, статический анализ, автотесты, сборка фронтенда и деплой по тегу — автоматически.

Эксплуатация

Наблюдаемость

Логи с контекстом, метрики, алерты по ошибкам и медленным запросам, трассировка ключевых сценариев.

Эксплуатация

Резервное копирование

Регулярные бэкапы MySQL с проверкой восстановления и понятным RPO/RTO, а не «бэкап где-то есть».

Передача

Документация

README, схема данных, описание интеграций и инструкция по развёртыванию. Передача без устных легенд.

Производительность

Нагрузочный тест

Прогон профиля «пиковый день» до релиза: находим узкие места в запросах и очередях заранее.

Производительность

Ориентиры, которые мы закладываем в архитектуру

Ниже — целевые показатели для типового корпоративного контура. Это не универсальные обещания: цифры подтверждаются нагрузочным тестом на вашем профиле трафика, объёме данных и железе.

Целевые показатели

Отклик API на типовой выборке до 200 мс
Первый экран списка (LCP) до 2,5 с
Отчёт по 1 млн строк (реплика) до 3 с
Доля запросов без обращения к БД (кэш) от 60 %

Шкала показывает приоритет показателя в наших проектах, а не замер конкретной системы: итоговые цифры зависят от профиля трафика, объёма данных и железа.

N+1 запросы

Самая частая причина «медленного Laravel». Лечится жадной загрузкой связей и запретом на запросы внутри циклов — это правило код-ревью.

Индексы и план запроса

Составной индекс под конкретный запрос меняет время выборки на порядки. Проверяем EXPLAIN, а не догадываемся.

Кэш

Справочники, права, агрегаты — в Redis с осознанной инвалидацией. Кэш без стратегии сброса вреднее его отсутствия.

Очереди

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

Фронтенд-бандл

Разделение чанков, ленивые маршруты, отсутствие «на всякий случай» подключённых библиотек.

Реплика для чтения

Аналитика и выгрузки уходят на реплику: рабочие места менеджеров не конкурируют с отчётами.

Честное сравнение

Где этот стек выигрывает, а где мы предложим другой

Стек — не вера, а инструмент с областью применения. Ниже сравнение с альтернативами по критериям, которые реально влияют на стоимость владения. Мы намеренно указали и проигрыши.

сильная сторона работает с оговорками слабое место
Сравнение стека Laravel + Vue + MySQL с альтернативами
Критерий Laravel + Vue + MySQL WordPress + плагины React + Node + MongoDB Конструктор / no-code
Своя бизнес-логика сильная сторона слабое место сильная сторона с оговорками
Скорость первого запуска с оговорками сильная сторона слабое место сильная сторона
Стоимость владения на 3–5 лет сильная сторона с оговорками с оговорками слабое место
Сложные отчёты и агрегаты сильная сторона слабое место с оговорками слабое место
Транзакции и целостность данных сильная сторона с оговорками с оговорками с оговорками
Realtime-нагрузка (чаты, трекинг) с оговорками слабое место сильная сторона слабое место
Огромные документные массивы с оговорками слабое место сильная сторона слабое место
Владение исходным кодом сильная сторона с оговорками сильная сторона слабое место
Найм команды на рынке РФ сильная сторона сильная сторона с оговорками слабое место

Вывод короткий: для корпоративных систем с правами, отчётами и интеграциями стек Laravel + Vue + MySQL — оптимальный баланс стоимости владения. Если проект про реальное время или про миллиарды документов, честнее взять другой стек — и мы это скажем на первой встрече, а не на третьем спринте.

Границы применимости

Когда мы НЕ будем предлагать этот стек

Отказ от проекта на первой встрече дешевле для обеих сторон, чем переписывание на третьем месяце. Вот случаи, где мы честно уводим клиента на другое решение.

Стек не подойдёт

Тяжёлый realtime

Чаты, трекинг, котировки, игры с тысячами одновременных соединений — здесь лучше Node.js, Go или Elixir. Laravel остаётся для домена, а шина событий строится отдельно.

Документные данные без схемы

Если сущности принципиально разнородны и меняются каждый день, реляционная схема станет тормозом — рассмотрим MongoDB или PostgreSQL с JSONB.

Простейший лендинг

Одна страница с формой не требует команды и бэкенда: конструктор или статический сайт обойдутся в разы дешевле.

Проект без бюджета на поддержку

Своя система требует сопровождения и развития. Если это не заложено, честнее готовое коробочное решение.

Когда стек — правильный выбор

  • Своя логика: согласования, воронки, тарифы, нестандартный документооборот.
  • Много ролей и тонких прав доступа, нужен аудит действий.
  • Отчётность и агрегаты по большим таблицам с историей.
  • Интеграции с 1С, телефонией, банками, маркетплейсами, чужими API.
  • Система, которая должна жить и развиваться 5+ лет без переписывания.
  • Нужен и публичный сайт, и рабочий кабинет в одном контуре.
Команда

Кто работает над проектом

Состав фиксируется до старта и не «подменяется» в процессе. Заказчик всегда знает, с кем говорит и кто отвечает за результат.

Техлид / архитектор

Схема данных, границы модулей, контракты API, код-ревью, технические решения.

20–40 % времени проекта

Backend-разработчик (Laravel)

Домен, интеграции, очереди, права, миграции, автотесты бэкенда.

1–3 человека

Frontend-разработчик (Vue)

Интерфейсы, состояние, доступность, сборка через Vite, связка с API.

1–2 человека

Тестировщик / QA

Тест-планы по сценариям, регресс, приёмка релизов, проверка прав доступа.

от 0,5 ставки

Проектный менеджер

План, риски, демо каждые две недели, приоритеты и единая точка правды по срокам.

на весь срок

DevOps

Окружения, CI/CD, мониторинг, бэкапы, нагрузочное тестирование.

по этапам

Процесс

Как проходит проект

Одинаковые этапы для любого объёма: разница только в длительности. Демо — каждые две недели, смета — фиксируется после аудита.

  1. Диагностика и аудит

    3–7 дней

    Разбираем процессы, данные и интеграции, считаем объём. На выходе — карта системы, риски, уровень сложности и вилка бюджета. Бесплатно.

  2. Проектирование

    1–2 недели

    Схема данных, модули, роли, контракты API, прототипы ключевых экранов, план релизов. Здесь дешевле всего менять решения.

  3. Разработка итерациями

    от 3 недель

    Спринты по две недели: бэкенд, фронтенд и тесты идут вместе, а не «сначала всё, потом интеграция». В конце каждого спринта — демо на стенде.

  4. Тестирование и нагрузка

    1–2 недели

    Автотесты, ручные сценарии, проверка прав, нагрузочный прогон профиля «пиковый день», устранение узких мест в запросах.

  5. Внедрение и обучение

    3–10 дней

    Перенос данных, обучение сотрудников, регламенты, параллельная работа со старой системой до полного перехода.

  6. Поддержка и развитие

    по SLA

    Мониторинг, бэкапы, обновления, доработки по бэклогу. Каждый месяц — отчёт по инцидентам и выполненным задачам.

Инфраструктура

Как это разворачивается и живёт в проде

Система может стоять в вашем контуре, в российском облаке или у нас на сопровождении. Код и схема данных при этом не меняются — меняется только окружение.

Веб-сервер и PHP-FPM

Nginx + PHP-FPM 8.4 либо Laravel Octane (FrankenPHP/RoadRunner) там, где нужна максимальная пропускная способность.

MySQL и реплики

InnoDB, реплика для чтения и отчётов, ежедневные полные и почасовые инкрементальные бэкапы с проверкой восстановления.

Redis

Кэш, сессии, очереди и блокировки. Отдельная база под очереди — чтобы очистка кэша не влияла на фоновые задачи.

Очереди и Horizon

Дашборд очередей, ретраи, таймауты, алерты по упавшим задачам. Видно, что и почему не доехало.

Сборка и деплой

Vite-сборка как артефакт, миграции отдельным шагом, деплой по тегу, откат на предыдущий релиз одной командой.

Мониторинг

Метрики, медленные запросы, ошибки и алерты в Telegram. Инцидент виден до того, как о нём напишет пользователь.

Сроки и бюджет

Порядок стоимости на стеке

Ниже ориентиры для проектов «под ключ» с командой. Точная смета — только после аудита: объём интеграций и состояние данных влияют на цену сильнее, чем число экранов.

Кабинет или внутренний сервис

от 600 тыс ₽

Срок: 4–8 недель

Одна роль или узкий круг пользователей: кабинет, портал, внутренний сервис, админка с отчётностью.

  • Проектирование схемы и API
  • Авторизация, роли, аудит
  • 1–2 интеграции
  • Тесты доменной логики
  • Развёртывание и обучение
Обсудить проект
Чаще всего

CRM / ERP под процессы

от 1,8 млн ₽

Срок: 3–6 месяцев

Полноценная система с модулями, правами, отчётностью и интеграциями — самый частый формат проекта на этом стеке.

  • Модульная архитектура
  • Сложные роли и согласования
  • Обмен с 1С, банками, телефонией
  • Реплика, очереди, мониторинг
  • Нагрузочный тест и SLA
Обсудить проект

Платформа / холдинг

от 4 млн ₽

Срок: от 6 месяцев

Мультитенантная или мультифилиальная система, несколько контуров, мобильное приложение, своя команда сопровождения.

  • Мультитенантность и лимиты
  • Выделенный архитектор
  • Высоконагруженный контур
  • Мобильный клиент к API
  • Передача команде заказчика
Обсудить проект

Во всех вариантах: фиксированная смета этапа, исходный код и документация передаются заказчику, оплата по этапам. Поддержка — отдельным договором от 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. Систему можно передать другой команде без «устных легенд»: архитектурные решения зафиксированы, а не живут в голове одного разработчика.

Развёртывание возможно в вашем контуре, в российском облаке или на нашем сопровождении. Для корпоративных заказчиков это часто решающий фактор: данные не покидают контролируемую инфраструктуру, а доступ администратора подтверждается вторым фактором и фиксируется журналом действий.

Когда стек работает годами

Долгая жизнь системы зависит не от выбора фреймворка, а от дисциплины: миграции под контролем, доменная логика отделена от контроллеров, тяжёлые операции вынесены в очереди, схема данных описана, а тесты ловят регресс до релиза. Мы закладываем это с первого спринта, потому что добавить порядок в готовую систему дороже, чем построить её аккуратно.

Отдельное внимание — обновлениям зависимостей и версиям с длинной поддержкой. Мы не берём в новые проекты экспериментальные технологии и не используем стек, для которого на рынке сложно найти команду: поддержка должна быть возможна без нас.

Обсудим проект на Laravel + Vue + MySQL?

Расскажите, какую систему нужно построить или что уже не справляется. На первой встрече разберём процессы и данные, оценим объём, предложим схему архитектуры и назовём порядок сроков и бюджета — без обязательств. Первый шаг — диагностика и аудит.