Олег Десятников
0 ∙ 0 отзывовFullstack-разработчик Vue 3 / Laravel · 7+ лет опыта
Офлайн
15 дней
На сайте
с августа 2026
Работает в категориях
Описание услуг
👋 Fullstack-разработчик: Vue 3 + TypeScript на фронте, Laravel и NestJS на бэке, 7+ лет коммерческой разработки. 🛠 Делаю SPA и админ-панели (таблицы на тысячи строк, формы, роли доступа), REST API и интеграции — платежи, CRM, 1С, вебхуки, — чаты и уведомления на WebSocket, сайты на Nuxt с серверным рендерингом, доработку WordPress и WooCommerce, Telegram-ботов и мини-приложения, автоматизацию и парсинг, Docker и выкладку на сервер. 🧰 Стек: Vue 3, TypeScript, Pinia, Quasar, PrimeVue, Nuxt, Laravel, PHP 8, NestJS, Node.js, MySQL, Redis, Docker, Nginx. 🎯 Беру и новые проекты, и доработку существующих, включая брошенные прошлыми подрядчиками: смотрю код до старта и честно говорю, сколько времени займёт задача. Чужой код читаю и продолжаю, а не предлагаю переписать всё заново. 🤝 Работаю по безопасной сделке, отвечаю в течение часа.
- Отзывы
- Портфолио
- Проекты
Ко мне приходят с интерфейсом, в котором сотрудники проводят весь рабочий день: списки на тысячи строк с фильтрами и сортировкой, формы с валидацией, разграничение прав, данные, которые должны обновляться сами. Обычно это два сценария. Либо проект запускается с нуля и нужно сразу заложить архитектуру, чтобы через полгода в него можно было добавлять разделы. Либо фронтенд писали несколько команд подряд, он оброс копиями компонентов, и каждая новая правка ломает соседний экран.
Собираю SPA на Vue 3 с Composition API и строгой типизацией TypeScript. Состояние на Pinia, маршруты с проверкой прав, база компонентов Quasar или PrimeVue. Повторяющееся выношу в общие компоненты: таблица с серверной пагинацией и фильтрами, формы, модалки, уведомления, чтобы новый раздел собирался из готового, а не писался заново. Где нужны живые данные, подключаю WebSocket. Легаси перевожу с Vue 2 на Vue 3, Vuex меняю на Pinia, попутно разбирая дубли компонентов и приводя стили к одному виду.
Интерфейс перестаёт быть узким местом: страницы открываются предсказуемо, новые разделы собираются из готовых блоков, типизация ловит ошибки до выкладки. По этой схеме собран фронтенд платформы мониторинга чрезвычайных ситуаций, которую я запускал с нуля и вёл почти два года: карты, происшествия, реагирование, отчётность, роли операторов экстренных служб.
Задача звучит просто: нужен API для приложения или сайта. За ней обычно стоит остальное. Права доступа, чтобы менеджер не видел чужие заказы. Долгие операции вроде выгрузок и рассылок, которые нельзя делать в запросе пользователя. Обмен с внешними сервисами, где важно, что происходит при их сбое. Отдельная история, когда проект достался от прошлого подрядчика и его нужно сначала понять, а потом уже дорабатывать.
Пишу на Laravel по слоям: контроллеры тонкие, логика в сервисах, ответы через ресурсы, единый формат ошибок для фронтенда. Долгое уношу в очереди и планировщик, кеш и счётчики держу в Redis. Модели и миграции проектирую со связями, на созданные методы пишу тесты. Интеграции делаю по документации сервиса, с обработкой отказов и повторами. Окружение поднимаю в Docker, чтобы у всей команды оно совпадало.
Получается backend, который переживает второй месяц эксплуатации: понятная структура, читаемые ошибки, тяжёлые операции не блокируют интерфейс. Проекты с наследством привожу в рабочее состояние без остановки разработки: сначала разбор и описание того, что есть, потом правки по частям.
Живые данные нужны там, где пользователь не должен нажимать F5: чат поддержки, уведомления о новых заявках, статус заказа, совместная работа нескольких операторов над одним списком. Сложность не в самом сокете, а в деталях: кто имеет право слушать этот канал, что происходит при обрыве связи, как не отправить сообщение всем подряд, когда оно адресовано одному.
Делаю сервис на NestJS с TypeScript от контроллера до клиента. Socket.IO или чистый WebSocket с авторизацией соединения, адресной и широковещательной доставкой событий. Модульная архитектура, DTO и валидация на входе. Состояние и очереди на Redis, чтобы переживать перезапуск и обрывы. REST и WebSocket живут рядом на одном контракте данных, поэтому фронтенд получает те же поля обоими путями.
Собран полноценный real-time чат с серверной частью: авторизация сокетов, адресная доставка, стабильное поведение при потере связи. Пользователь видит изменения сразу, а не после обновления страницы, и при этом никто не получает чужих событий.
Обычный SPA хорош внутри кабинета, но плох там, где страницу должны находить поисковики и открывать люди со слабым интернетом. Каталог, лендинг, блог, витрина услуг: клиенту нужно, чтобы контент отдавался сразу готовой страницей, метатеги были на месте, а не подставлялись скриптом, и чтобы всё это работало на том же стеке, что и остальной проект.
Делаю на Nuxt: серверный рендеринг для динамики, статическая генерация там, где содержимое меняется редко. Метатеги и микроразметка на каждой странице, честные ссылки, карта сайта. Стек тот же, что и в SPA: Vue 3, TypeScript, Pinia, поэтому компоненты переиспользуются. Данные беру из любого API, будь то Laravel, NestJS или внешний сервис. Сборка на Vite, выкладка на сервер клиента.
Страницы открываются быстро и приходят в браузер уже собранными, поисковик видит текст, а не пустой контейнер. Проект остаётся в одном стеке с остальной системой, поэтому одна команда ведёт и кабинет, и публичную часть.
У клиента есть работающий сайт, который приносит заявки, и его не нужно переделывать. Нужно поправить вёрстку и блоки, добавить шаблон страницы, починить адаптив на телефонах, настроить магазин, подключить оплату или выгрузку заказов. Часто предыдущий разработчик пропал, а тема и плагины правились прямо в файлах, поэтому обновление ломает вид.
Разбираюсь в том, что уже стоит, и правлю точечно: тема и шаблоны, блоки, адаптив, поля товара. Плагины настраиваю, чужой код дорабатываю, под отдельную задачу пишу свой плагин, чтобы правки не терялись при обновлении. В WooCommerce подключаю оплату и доставку, настраиваю выгрузку заказов. Интеграции по API с CRM и платёжными сервисами. Отдельно занимаюсь скоростью: кеш, картинки, переезд на другой хостинг.
Сайт продолжает работать и зарабатывать, а правки перестают слетать при обновлениях. Клиент получает понятную структуру доработок вместо предложения переписать всё заново.
Типичная картина: сотрудник каждый день открывает несколько сайтов, копирует данные в таблицу, сверяет цены или заявки и тратит на это часы. Или наоборот, нужно регулярно заносить данные в чужой личный кабинет, где нет API. Задача не в разовой выгрузке, а в том, чтобы это происходило само, по расписанию, и было видно, что прогон прошёл.
Пишу парсеры каталогов и сайтов с выгрузкой в CSV, таблицу или базу клиента. Там, где данные отдаются только после входа в кабинет, работаю сценарием в живом браузере: авторизация, формы, пагинация. Капчу закрываю через сервисы распознавания, без ручного участия. Ставлю запуск по расписанию, отчёт присылаю в Telegram или на почту. Закладываю повторы при сбоях, лимиты и журнал прогонов, чтобы поломка была видна сразу.
Ручная работа исчезает из ежедневных обязанностей, данные появляются в одном формате и в срок. Если источник изменился, это видно по журналу, а не по тому, что через неделю кто-то заметил пустую таблицу.
Пока проект живёт на одной машине, всё держится на памяти разработчика: где какие версии, что запускать, как выкладывать. Новый человек в команде тратит день на запуск, а выкладка превращается в набор шагов, которые легко перепутать. Клиент при этом хочет простого: чтобы проект поднимался предсказуемо и обновлялся без простоя.
Собираю docker-compose под проект: PHP-FPM или Node, Nginx, MySQL или PostgreSQL, Redis. Настраиваю Nginx: домены, HTTPS через Let's Encrypt, статика и загрузки. Выкладку на VPS делаю сценарием: сборка фронтенда, миграции, перезапуск очередей и планировщика. Добавляю автодеплой по push и возможность откатиться на прошлую версию. Логи и мониторинг настраиваю так, чтобы было видно, что именно упало.
Проект поднимается одной командой на любой машине, у всей команды одинаковое окружение. Выкладка перестаёт быть событием, а откат занимает минуту вместо вечера в консоли.
Интеграция редко бывает сложной в демонстрации и почти всегда сложна в жизни. Оплата прошла, а вебхук не дошёл. CRM ответила ошибкой, и заявка потерялась. Сервис изменил формат ответа, и обмен встал молча. Клиенту нужно, чтобы данные ходили в обе стороны и чтобы при сбое было понятно, где именно они застряли.
Подключаю платёжные системы с полным циклом: оплата, вебхуки статусов, возвраты, проверка подписи запроса. Обмен с CRM и учётными системами настраиваю в обе стороны, с очередью и повторами. Уведомления развожу по каналам: почта, Telegram, сообщения в интерфейсе. Каждый обмен пишу в журнал, чтобы по конкретному заказу было видно, что и когда ушло. Отказ внешнего сервиса обрабатываю отдельно, а не считаю его невозможным.
Заявки и платежи перестают теряться между системами, а разбор спорной ситуации занимает минуты: видно запрос, ответ и время. Сбой внешнего сервиса не роняет заказ, операция повторяется сама.
Клиенту нужен канал, в котором пользователь уже сидит: приём заявок без сайта, уведомления о статусе заказа, запись на услугу, внутренний бот для сотрудников. Иногда бота хватает, иногда нужен полноценный интерфейс с формами и оплатой, но открывать его человек должен там же, в Telegram, а не в браузере.
Делаю бота с понятным сценарием: команды, кнопки, шаги анкеты, сохранение ответов в базу или таблицу. Где нужен интерфейс, собираю mini app на Vue 3 с авторизацией через данные Telegram, чтобы пользователь не вводил логин. Подключаю оплату и уведомления, админскую часть выношу отдельно. Сервер на Laravel или NestJS, состояние диалогов в Redis, запуск в Docker.
Заявки приходят в мессенджер и сразу попадают в систему, сотрудники получают уведомления без отдельного приложения. Мини-приложение выглядит как обычный кабинет, но открывается в два касания из чата.
📊 Ко мне приходят с интерфейсом, в котором сотрудники проводят весь рабочий день: списки на тысячи строк с фильтрами и сортировкой, формы с валидацией, разграничение прав, данные, которые должны обновляться сами.
🛠 Как делаю. Собираю SPA на Vue 3 с Composition API и строгой типизацией TypeScript. Состояние на Pinia, маршруты с проверкой прав, база компонентов Quasar или PrimeVue. Повторяющееся выношу в общие компоненты: таблица с серверной пагинацией и фильтрами, формы, модалки, уведомления, чтобы новый раздел собирался из готового, а не писался заново.
✅ Что получает заказчик. Интерфейс перестаёт быть узким местом: страницы открываются предсказуемо, новые разделы собираются из готовых блоков, типизация ловит ошибки до выкладки. По этой схеме собран фронтенд платформы мониторинга чрезвычайных ситуаций, которую я запускал с нуля и вёл почти два года: карты, происшествия, реагирование, отчётность, роли операторов экстренных служб.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
⚙️ Задача звучит просто: нужен API для приложения или сайта.
🛠 Как делаю. Пишу на Laravel по слоям: контроллеры тонкие, логика в сервисах, ответы через ресурсы, единый формат ошибок для фронтенда. Долгое уношу в очереди и планировщик, кеш и счётчики держу в Redis. Модели и миграции проектирую со связями, на созданные методы пишу тесты.
✅ Что получает заказчик. Получается backend, который переживает второй месяц эксплуатации: понятная структура, читаемые ошибки, тяжёлые операции не блокируют интерфейс. Проекты с наследством привожу в рабочее состояние без остановки разработки: сначала разбор и описание того, что есть, потом правки по частям.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
⚡️ Живые данные нужны там, где пользователь не должен нажимать F5: чат поддержки, уведомления о новых заявках, статус заказа, совместная работа нескольких операторов над одним списком. Сложность не в самом сокете, а в деталях: кто имеет право слушать этот канал, что происходит при обрыве связи, как не отправить сообщение всем подряд, когда оно адресовано одному.
🛠 Как делаю. Делаю сервис на NestJS с TypeScript от контроллера до клиента. Socket.IO или чистый WebSocket с авторизацией соединения, адресной и широковещательной доставкой событий.
✅ Что получает заказчик. Собран полноценный real-time чат с серверной частью: авторизация сокетов, адресная доставка, стабильное поведение при потере связи. Пользователь видит изменения сразу, а не после обновления страницы, и при этом никто не получает чужих событий.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
🚀 Обычный SPA хорош внутри кабинета, но плох там, где страницу должны находить поисковики и открывать люди со слабым интернетом. Каталог, лендинг, блог, витрина услуг: клиенту нужно, чтобы контент отдавался сразу готовой страницей, метатеги были на месте, а не подставлялись скриптом, и чтобы всё это работало на том же стеке, что и остальной проект.
🛠 Как делаю. Делаю на Nuxt: серверный рендеринг для динамики, статическая генерация там, где содержимое меняется редко. Метатеги и микроразметка на каждой странице, честные ссылки, карта сайта. Стек тот же, что и в SPA: Vue 3, TypeScript, Pinia, поэтому компоненты переиспользуются.
✅ Что получает заказчик. Страницы открываются быстро и приходят в браузер уже собранными, поисковик видит текст, а не пустой контейнер. Проект остаётся в одном стеке с остальной системой, поэтому одна команда ведёт и кабинет, и публичную часть.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
🛒 У клиента есть работающий сайт, который приносит заявки, и его не нужно переделывать. Нужно поправить вёрстку и блоки, добавить шаблон страницы, починить адаптив на телефонах, настроить магазин, подключить оплату или выгрузку заказов.
🛠 Как делаю. Разбираюсь в том, что уже стоит, и правлю точечно: тема и шаблоны, блоки, адаптив, поля товара. Плагины настраиваю, чужой код дорабатываю, под отдельную задачу пишу свой плагин, чтобы правки не терялись при обновлении. В WooCommerce подключаю оплату и доставку, настраиваю выгрузку заказов.
✅ Что получает заказчик. Сайт продолжает работать и зарабатывать, а правки перестают слетать при обновлениях. Клиент получает понятную структуру доработок вместо предложения переписать всё заново.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
🕷 Типичная картина: сотрудник каждый день открывает несколько сайтов, копирует данные в таблицу, сверяет цены или заявки и тратит на это часы. Или наоборот, нужно регулярно заносить данные в чужой личный кабинет, где нет API.
🛠 Как делаю. Пишу парсеры каталогов и сайтов с выгрузкой в CSV, таблицу или базу клиента. Там, где данные отдаются только после входа в кабинет, работаю сценарием в живом браузере: авторизация, формы, пагинация. Капчу закрываю через сервисы распознавания, без ручного участия.
✅ Что получает заказчик. Ручная работа исчезает из ежедневных обязанностей, данные появляются в одном формате и в срок. Если источник изменился, это видно по журналу, а не по тому, что через неделю кто-то заметил пустую таблицу.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
🐳 Пока проект живёт на одной машине, всё держится на памяти разработчика: где какие версии, что запускать, как выкладывать. Новый человек в команде тратит день на запуск, а выкладка превращается в набор шагов, которые легко перепутать.
🛠 Как делаю. Собираю docker-compose под проект: PHP-FPM или Node, Nginx, MySQL или PostgreSQL, Redis. Настраиваю Nginx: домены, HTTPS через Let's Encrypt, статика и загрузки. Выкладку на VPS делаю сценарием: сборка фронтенда, миграции, перезапуск очередей и планировщика.
✅ Что получает заказчик. Проект поднимается одной командой на любой машине, у всей команды одинаковое окружение. Выкладка перестаёт быть событием, а откат занимает минуту вместо вечера в консоли.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
🔌 Интеграция редко бывает сложной в демонстрации и почти всегда сложна в жизни.
🛠 Как делаю. Подключаю платёжные системы с полным циклом: оплата, вебхуки статусов, возвраты, проверка подписи запроса. Обмен с CRM и учётными системами настраиваю в обе стороны, с очередью и повторами. Уведомления развожу по каналам: почта, Telegram, сообщения в интерфейсе.
✅ Что получает заказчик. Заявки и платежи перестают теряться между системами, а разбор спорной ситуации занимает минуты: видно запрос, ответ и время. Сбой внешнего сервиса не роняет заказ, операция повторяется сама.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.
📱 Клиенту нужен канал, в котором пользователь уже сидит: приём заявок без сайта, уведомления о статусе заказа, запись на услугу, внутренний бот для сотрудников. Иногда бота хватает, иногда нужен полноценный интерфейс с формами и оплатой, но открывать его человек должен там же, в Telegram, а не в браузере.
🛠 Как делаю. Делаю бота с понятным сценарием: команды, кнопки, шаги анкеты, сохранение ответов в базу или таблицу. Где нужен интерфейс, собираю mini app на Vue 3 с авторизацией через данные Telegram, чтобы пользователь не вводил логин. Подключаю оплату и уведомления, админскую часть выношу отдельно.
✅ Что получает заказчик. Заявки приходят в мессенджер и сразу попадают в систему, сотрудники получают уведомления без отдельного приложения. Мини-приложение выглядит как обычный кабинет, но открывается в два касания из чата.
🤝 Работаю по безопасной сделке, отвечаю в течение часа.

















