car.shipdays.ru
Краудфандинг с игровыми механиками и обновлением в реальном времени
Сбор на Mini JCW в формате игры: машина на фото серая, и каждая деталь проявляется в цвете у всех, кто сейчас на странице, как только на неё скинулись. Оплата через Т-Кассу, обновления в реальном времени по SSE, ранги донатеров и гонка с дедлайном 31 декабря.
- Статус
- В продакшене, сбор идёт
- Период
- Июль — октябрь 2026
- Формат
- Собственный проект
- Роль
- Идея, разработка, деплой

- деталей с отдельным прогрессом
- 12деталей с отдельным прогрессом
- эндпоинтов API
- 5эндпоинтов API
- строк Go
- ≈1 000строк Go
- бинарь вместе с фронтендом
- 1бинарь вместе с фронтендом
Задача
Сделать сбор денег, за которым интересно следить и куда хочется вернуться: с видимым прогрессом, соревнованием и моментом «это я закрыл деталь».
Что сделано
- 12 деталей автомобиля, у каждой свой прогресс и своя зона на фото
- Оплата через Т-Кассу, статус меняет только подтверждённый вебхук
- Обновление у всех открытых вкладок сразу после оплаты (Server-Sent Events)
- Игровой слой: передачи по мере сбора, «призрак графика» до дедлайна, «добей деталь», «последний болт»
- Ранги экипажа по сумме вложений и имена донатеров наклейками на кузове
- Живая лента последних оплат с празднованием установки детали
Инженерные решения
- Подпись вебхука Т-Кассы проверяется по SHA-256-токену
- Идемпотентное подтверждение оплаты: строка блокируется FOR UPDATE, повтор игнорируется
- «Последний болт» без гонок: условие completed_at IS NULL в той же транзакции
- Игровые правила считаются на фронтенде из одного эндпоинта, поэтому меняются без миграций
- Миграции и фронтенд вшиты в Go-бинарь: один образ, один origin
- SSE-хаб с неблокирующей рассылкой и пингом каждые 25 секунд против обрыва прокси
Инфраструктура и DevOps
- Пайплайн: go vet и тесты, образ в GHCR, деплой по SSH с защитой от параллельных запусков
- Контейнер без root, healthcheck
Стек
- Go
- PostgreSQL
- React
- Vite
- SSE
- Т-Касса
- Docker
- GitHub Actions


