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