У меня есть клиент, который управляет виллами на Бали. Бронирования приходят из Airbnb, Booking.com, напрямую через сайт. Финансы считаются в Google Sheets. Аналитика — в голове. Коммуникации с гостями — в WhatsApp. Всё разрозненно, ничего не связано друг с другом.
Я решил собрать единую платформу: бронирования, финансы, аналитика, управление виллами, нотификации — в одном месте. Назвал Villa Metrics. И поставил себе цель: рабочий прототип за один день.
Стек
Выбор технологий был быстрым. Django 5 + Django REST Framework для backend. React 18 + Vite 5 для frontend. PostgreSQL 16 для базы. Docker Compose, чтобы всё это собрать в четыре контейнера.
Python 3.12 как основной язык. Никаких экзотических зависимостей — только проверенные библиотеки: celery, django-cors-headers, python-decouple, dj-database-url.
# docker-compose.yml — четыре сервиса
services:
db:
image: postgres:16
ports:
- "5470:5432"
backend:
build: ./backend
ports:
- "8070:8000"
celery-worker:
build: ./backend
command: celery -A config worker -l info
frontend:
build: ./frontend
ports:
- "3070:3000"
Модели данных
Ядро системы — пять основных моделей. Properties (виллы), Bookings (бронирования), Finances (транзакции), Analytics (метрики), Notifications (уведомления). Плюс User с расширенным профилем.
Модель Property хранит всё про виллу: название, адрес, количество спален, фотографии, ценообразование по сезонам. Booking связан с Property и содержит даты, гостя, источник бронирования, статус, стоимость.
class Booking(models.Model):
property = models.ForeignKey(Property, on_delete=models.CASCADE)
guest_name = models.CharField(max_length=255)
check_in = models.DateField()
check_out = models.DateField()
source = models.CharField(choices=BOOKING_SOURCES, max_length=50)
total_amount = models.DecimalField(max_digits=12, decimal_places=2)
status = models.CharField(choices=BOOKING_STATUSES, max_length=20)
Финансовая модель учитывает доходы и расходы по каждой вилле. Категории расходов: обслуживание, коммунальные, зарплаты персоналу, комиссии площадок. Всё привязано к конкретной вилле и периоду.
Интеграция с Hostaway
Hostaway — channel manager, который объединяет Airbnb, Booking.com, VRBO и другие площадки в один интерфейс. API у них REST-based, документация приличная.
Написал клиент для Hostaway API: синхронизация бронирований, получение списка объектов, обновление календарей. При первом запуске всё прошло гладко — pull бронирований заработал с первой попытки.
А вот с webhook'ами пришлось повозиться. Hostaway шлёт POST-запрос при новом бронировании, но формат payload отличается от того, что описан в документации. Два часа ушло на отладку — оказалось, что поле listingMapId иногда приходит как string, иногда как integer. Добавил приведение типов, заработало.
UI: тёплая тропическая тема
React-приложение с нуля. Компонентная библиотека с design tokens — цвета, отступы, типографика, тени. Тёплая палитра: песочные оттенки, зелёный для подтверждений, терракотовый для акцентов.
// design-tokens.js
export const colors = {
sand: '#F5E6D3',
ocean: '#2B6CB0',
palm: '#2D5016',
terracotta: '#C4532D',
sunset: '#ED8936',
};
Dashboard показывает ключевые метрики: загрузка вилл, доход за месяц, предстоящие заезды, просроченные платежи. Боковое меню с навигацией по разделам: бронирования, виллы, финансы, аналитика.
Авторизация — JWT-токены. Логин, регистрация, восстановление пароля. Ничего необычного, но работает надёжно.
Система нотификаций
Отдельная модель Notification с типами: новое бронирование, отмена, платёж, напоминание о заезде. Каждая нотификация привязана к пользователю и может быть отмечена как прочитанная.
На фронтенде — колокольчик в хедере с бейджом непрочитанных. Dropdown со списком последних уведомлений. Пока без push-нотификаций — это следующий шаг.
Claude Code Agent Teams
Как я уложился в один день? Claude Code с Agent Teams. Формулирую задачу, агенты работают параллельно. Один пишет модели и миграции, второй — сериализаторы и вьюхи, третий — React-компоненты.
60 коммитов за день. Не все из них идеальные — были и fix typo, и fix import, и actually fix the import this time. Но к вечеру система работала.
Самый большой блок — финансовый модуль. 12 коммитов только на модели, сериализаторы, фильтры и агрегации. Django ORM с annotate и aggregate отлично справляется с аналитическими запросами.
Результат
К концу дня 20 января 2026 года у меня был работающий прототип. Django 5 backend с REST API на 15+ эндпоинтов. React 18 frontend с design system и адаптивной вёрсткой. Docker Compose поднимает всё за одну команду.
60 коммитов. Четыре Docker-контейнера. Пять основных моделей. Интеграция с Hostaway. Тёплый тропический UI. И одна система нотификаций, которая скоро будет слать push.
Не идеально, но работает. А на следующий день я займусь мобильной адаптацией — потому что менеджеры вилл на Бали живут в телефонах, а не за десктопами.