
PetZone — платформа помощи животным · 2025
Платформа усыновления животных, которую наконец-то может читать поиск
Полностековая платформа усыновления: бэкенд на .NET с clean architecture, React SPA на шести языках и prerender-pipeline, чтобы single-page app ранжировался в Google.
SPA, которую наконец-то могут сканировать поисковики — страницы животных читаются сервером на шести языках
Проблема
PetZone помогает животным найти дом — но усыновление случается только тогда, когда люди могут найти объявления. Приложение было сделано как client-rendered React SPA: отлично для UX и ужасно для SEO — поисковикам отдавалась пустая HTML-оболочка, поэтому страницы животных почти не ранжировались. Плюс аудитория мультиязычная (платформа на 6 языках), что умножает SEO-площадь и шанс ошибиться.
Подход
Разделил на две отдельные задачи — надёжный бэкенд и поисковая видимость поверх SPA — и поставлял слоями:
- Бэкенд .NET в clean architecture — слои Domain, Use Cases, Infrastructure, Contracts и API, отдельный нотификационный микросервис. Доменные и интеграционные тесты — поведение зафиксировано, а не «надеемся».
- SEO-лендинги — страницы по видам (собаки, кошки…) и обогащённые DTO животных (название вида/породы), чтобы в каждом объявлении был реальный индексируемый контент, а не только ID.
- Prerender-pipeline — шаг сборки, рендерящий ключевые маршруты в статический HTML и генерирующий sitemap, чтобы краулеры получали полноценные страницы, а пользователи — быстрый SPA.
Стек и почему
- Clean architecture в .NET — в домене (животные, объявления, волонтёры) есть реальные правила; изоляция от инфраструктуры держала их тестируемыми, а API — тонким.
- React + Vite SPA с i18next — быстрый app-like UX на 6 локалях без тяжёлого фреймворка.
- Prerender + sitemap вместо полного SSR-переписывания — получил SEO-выгоду без выбрасывания рабочего SPA и удвоения сложности хостинга. Прагматичное решение победило «правильное».
- In-memory кэш вместо Redis — убрал целый кусок инфраструктуры, когда профайл показал, что внешний кэш на этом масштабе не окупает себя.
Результат
- Страницы животных и видов теперь читаются сервером на всех поддерживаемых языках — краулеры видят контент, а не пустую оболочку.
- Бэкенд покрыт тестами на доменном и интеграционном уровне — изменения доезжают в прод уверенно.
- Инфраструктура со временем упростилась (убрали Redis), а не усложнилась.
Что было сложно
SEO на client-rendered SPA — классическая ловушка: «правильное» решение — полное переписывание на SSR, что здесь означало бы месяцы и более рискованный деплой. Сложное было в том, чтобы не поддаться этому и вместо этого сделать prerender-шаг, дающий краулерам статический HTML для каждого маршрута на каждом языке, без разветвления кодовой базы на «SSR-режим» и «SPA-режим». Правильно сделать мультиязычные sitemap и canonical URL было кропотливой частью — сделаешь не так, и Google видит шесть копий одной страницы.
Другие проекты

Сайт-портфолио, который приводит клиентов колористу
2026Zvezdochka — студия окрашивания волос, Одесса
Образ-тяжёлый мультиязычный сайт-портфолио и запись для профессионального колориста — быстрые галереи из объектного хранилища, отзывы, курсы и прямые каналы записи.
Собственный мультиязычный дом, превращающий Instagram-трафик в записи

Каталог продуктов, превращающий посетителей в запросы прайса
2026SunCold — поставщик контейнеров и солнечного оборудования
Мультиязычный B2B-каталог и lead-gen сайт для поставщика контейнеров и солнечного оборудования — быстрые страницы продуктов, форма запроса прайса, SEO-контент (блог/FAQ), чтобы приводить покупателей.
Self-serve каталог и воронка запросов прайса, которые сами зарабатывают поисковый трафик
Нужно что-то подобное?
Беру небольшое число проектов одновременно. Если это похоже на вашу задачу — напишите.