К содержимому
firstpaint

Кейсы / 01

Маркетплейс аренды водной техники

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

роль
Full-stack, единственный разработчик
срок
6 недель до продакшена
год
2026
формат
Маркетплейс, клиенты и партнёры

задача

Заказчику нужна была площадка аренды водного транспорта по модели «Booking для прокатов»: клиент выбирает город, дату и тип техники, бронирует конкретный слот и платит онлайн, а площадка зарабатывает на комиссии с каждой брони.

Две трудности были заложены с самого начала. Во-первых, прокатчики ведут расписание кто где: в Google Календаре, в Яндексе, в блокноте, — и двойная бронь убивает доверие к площадке за один сезон. Во-вторых, основной канал привлечения — поиск: нужно было занять выдачу по запросам вида «аренда катера в городе N» без армии контент-менеджеров.

решение

Бронирование построено как конечный автомат статусов с расчётом цены по периодам, слотами с шагом 15 минут и хранением времени в UTC — клиенту оно показывается в часовом поясе города лодки. Оплата картой и через СБП идёт через платёжный шлюз с фискальными чеками; все операции с деньгами проходят через леджер балансов: «в ожидании», «доступно к выводу», возвраты, выплаты. Гонки между выплатой, возвратом и поздним платежом закрыты блокировками строк и идемпотентной обработкой вебхуков.

Календари синхронизируются в обе стороны: Google — через OAuth и инкрементальную выгрузку, Яндекс — через CalDAV с разворотом повторяющихся событий. Внешнее событие закрывает слот, конфликт не ломает бронь, а поднимает уведомление прокатчику.

SEO-страницы генерируются из справочников: город × тип техники × фасет. Страница открывается для индексации, только когда за ней есть достаточно предложений, иначе уходит в noindex; смена адреса автоматически создаёт 301 со схлопыванием цепочек, снятая лодка отдаёт 410. Публичная часть рендерится на сервере с кэшированием, а маршрутизация и редиректы решаются на стороне Nuxt по прогретому манифесту — без запроса в бэкенд на каждый хит.

Вокруг этого — всё, что нужно живой площадке: вход по коду из SMS или flash call, модерация партнёров и фото, realtime-чат по брони с фильтром контактов (чтобы сделки не уходили мимо комиссии), уведомления в почту, Telegram и MAX, админ-панель на 36 разделов с аудит-логом и входом под пользователем.

как работал

Монорепозиторий из API и фронтенда, все команды — через один Justfile, деплой одной командой на VPS заказчика. Бэкенд покрыт тестами на Pest — почти сотня файлов. Перед сдачей провёл 16 доменных аудитов: соответствие ТЗ, жизненный цикл брони, платежи, конкурентный доступ, безопасность — с отчётами и исправлениями по каждому.

результат

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

Запуск за шесть недель силами одного инженера: 46 моделей данных, около 130 API-маршрутов, 53 страницы, три кабинета (клиент, партнёр, администратор). Деньги, календари и SEO-сетка — три самые рискованные части — сделаны с самого начала как следует, а не отложены «на потом».

стек подробно

фронтенд
Nuxt, Vue, TypeScript, Pinia, Tailwind CSS, shadcn-vue (Reka UI), vee-validate + zod, TanStack Table
карты и медиа
MapLibre GL, Embla, PhotoSwipe, self-hosted imgproxy с подписанными URL и водяным знаком
бэкенд
Laravel, Octane, Sanctum, spatie/laravel-permission, Scramble (OpenAPI)
админка
Filament — 36 ресурсов, аудит-лог, модерация, выплаты, возвраты
данные
PostgreSQL, Redis (кэш с тегами, очереди, rate limit), Horizon, Pulse
realtime
Laravel Reverb (WebSocket), Laravel Echo
платежи
Платёжный шлюз с картами, СБП и фискальными чеками; леджер балансов, возвраты, выплаты
интеграции
Google Calendar (OAuth), Яндекс Календарь (CalDAV), SMS и flash call, боты Telegram и MAX
SEO
SSR с кэшированием в Nitro, программная сетка страниц, schema.org, sitemap, 301 и 410
инфраструктура
Docker Compose, nginx, VPS; отдельные демоны для очередей, планировщика, WebSocket и ботов
качество
Pest (≈100 тестовых файлов), Pint, Biome, GitHub Actions

Похожая задача?