R_ShipDays

TS Observatory

Платформа авторских аудиогидов по городам

TS Observatory — PWA с авторскими аудиогидами: на фото собора или галереи стоят точки, тап открывает историю с текстом и аудио. Гид работает без интернета, продаётся через Stripe в евро и ЮKassa в рублях, а контент ведётся в собственной панели на трёх языках.

Статус
В продакшене, идёт третий этап
Период
Август — октябрь 2026
Формат
Заказ клиента, поэтапная разработка
Роль
Архитектура, бэкенд, фронтенд, платежи, DevOps
Главная страница TS Observatory: авторские аудиогиды по городам
роутов API
≈45роутов API
страница Next.js
21страница Next.js
языка контента
3языка контента
коммитов
97коммитов
Фасад Дуомо с пронумерованными точками аудиогида
Главная механика: точки на фото объекта, тап открывает историю и аудио
Мобильная панель точки с текстом, аудиогидом и карточками
Панель точки на телефоне: аудио, карточки, переход к следующей точке

Задача

Автору гидов нужна была платформа, где турист покупает гид по городу или отдельному объекту, слушает историю у каждой точки и не зависит от мобильного интернета за границей.

Что сделано

  • Интерактивные точки на фото объекта: координаты в процентах, не съезжают на любом экране
  • Аудиоплеер работает при заблокированном экране и управляется кнопками наушников
  • Офлайн-режим: Service Worker хранит интерфейс, аудио и тайлы карты, весь город скачивается одной кнопкой с докачкой
  • Покупка без регистрации: сначала оплата, потом аккаунт; первая точка объекта бесплатно
  • Stripe Checkout в евро и ЮKassa в рублях (Мир, СБП, карты) с чеком по 54-ФЗ
  • Панель управления: роли, черновики и публикация, журнал действий, редактор точек мышью по фото
  • Дашборд владельца: выручка, воронка, глубина прохождения гидов
  • Три языка (RU, EN, IT) в интерфейсе, контенте и аудиодорожках
  • Карта на MapLibre и OpenStreetMap с маршрутом прогулки и геолокацией

Инженерные решения

  • Вебхук Stripe проверяется по HMAC-подписи с окном времени, доступ выдаётся только по оплаченной сессии
  • Уведомлениям ЮKassa не верим: платёж перечитывается через API, запросы принимаются только из её подсетей
  • Идемпотентность платежей через уникальный ключ «провайдер + внешний ID»
  • Платное аудио отдаётся по подписанным ссылкам MinIO с ограниченным сроком жизни
  • Собственная аналитика воронки включается только после согласия пользователя (152-ФЗ)

Инфраструктура и DevOps

  • CI: gofmt, go vet, go test -race, накат и откат миграций на PostgreSQL 17; для фронтенда typecheck, lint, build
  • Матричная сборка образов API и web в GHCR, деплой с ожиданием /healthz
  • Миграции на staging и production запускаются отдельным ручным workflow
  • Журнал инцидентов в базе с уведомлениями в Telegram
  • Cloudflare в режиме Full (strict), редиректы с .ru и .online на основной домен

Стек

  • Go
  • PostgreSQL
  • MinIO
  • Next.js 16
  • React 19
  • TypeScript
  • MapLibre
  • Stripe
  • ЮKassa
  • Cloudflare

Нужен похожий проект?

Короткий бриф в Telegram, ответ лично от меня в течение дня.