Кейсы / 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