Александр Вахтин › avvahtin Сбер ID
AI-агенты, данные и веб-сервисы на Python: от идеи до продакшена
Рейтинг
217
№ 5 920 в каталоге
Отзывы
0
Профессионализм
-/10
Коммуникация
- /10
Город
Москва
Опыт работы
8 лет
На сайте с
2026 года
Юридический статус
ИП

Сбор на игру в один клик: веб-сервис за месяц в одиночку

Используемые навыки FastAPI OAuth Администрирование баз данных Микросервисы Тестирование ПО (QA)

Описание

Играть по вечерам хочется многим, но собраться мешает неловкость. Написать приятелю или коллеге «пойдём сегодня в доту?» — это личное приглашение, и отказ на него тоже личный. Проще не писать, и игра не случается.

Сервис mutl снимает эту неловкость. Человек вешает заявку на вечер — её сразу видят все его компании, в личку никому писать не нужно. Кто хочет, сам видит «в пятницу Dota 2, 3 из 5 мест» и жмёт «Буду». К началу сама открывается голосовая комната, всем записавшимся приходит напоминание.

Сделать нужно было всё целиком: сайт и приложение, Telegram-бота, голосовые серверы, админку и выкладку на собственный сервер. И так, чтобы продукт можно было развивать дальше, а не переписывать через полгода.

ОГРАНИЧЕНИЯ

— Внешних сервисов пять: Steam, Telegram, TeamSpeak, почта и push в браузере. Ни один не должен ронять сайт, если недоступен или не настроен.
— Заявки, запись, комнаты и напоминания завязаны на время: напоминание не может прийти раньше, чем создана комната.
— Голос должен работать в России без VPN, поэтому комнаты — на TeamSpeak.
— Два языка интерфейса: русский и английский.

Решение

Сделал проект один и целиком — от первой строки до работающего сайта на своём домене: архитектуру, сервер, интерфейс, Telegram-бота, голосовую инфраструктуру, админку и выкладку. Весь код в репозитории мой.

АРХИТЕКТУРА
Модульный монолит из шести частей: вход и профили, спейсы, заявки, комнаты, уведомления, каталог игр — плюс служебный слой админки. Заявки — ядро, и оно ничего не знает о комнатах и уведомлениях: ядро сообщает «заявку создали», «состав изменился», а кто на это отреагирует — не его забота. Поэтому новый канал уведомлений или другой голосовой сервис добавляются без правок в логике записи. Двадцать ключевых решений записаны вместе с отвергнутыми вариантами и причинами.

ВХОД И СПЕЙСЫ
Три способа войти: почта с паролем, Steam и Telegram. Через Steam и Telegram аккаунт появляется в один клик, без пароля и почты. Спейс — это своя компания: в него вступают по ссылке-приглашению, приглашать может любой участник.

ЗАПИСЬ БЕЗ ОБИД
Места занимаются в порядке нажатия «Буду», за лимитом — очередь, где каждый видит свою позицию. Выкинуть записавшегося нельзя: такой операции нет нигде в API. Освободилось место — следующий продвигается сам и получает уведомление.

ГОЛОСОВЫЕ КОМНАТЫ
Канал TeamSpeak создаётся сам за 65 минут до начала и удаляется через 8 часов. Лишние пять минут не случайны: напоминание «за час» обязано прийти уже со ссылкой на готовую комнату. Пароль и ссылку видят только записавшиеся. Серверы работают пулом: их число задаётся одной настройкой, конфигурация собирается генератором, а при заполнении пула на 70% администратор получает сигнал.

НАПОМИНАНИЯ
Три канала: колокольчик на сайте, Telegram-бот и push в браузере. Разрешение на push спрашиваю не с порога, а после первого «Буду» — вопросом «Напомнить за час до игры?». Компанию можно заглушить целиком одним переключателем.

STEAM БЕЗ ВРАНЬЯ
Библиотеки синхронизируются, и на заявке видно, у скольких участников игра уже есть. Закрытый профиль — это «данных нет», а не «игры нет». Для бесплатных игр счётчик не строится вовсе: Steam добавляет их в библиотеку только после первого запуска, и цифра бы врала.

НЕ НАСТРОЕНО — ЗНАЧИТ ВЫКЛЮЧЕНО
Нет токена бота, ключа Steam, пароля TeamSpeak или почтового сервера — соответствующая функция тихо выключается, а сайт продолжает работать. Проект поднимается локально без единого секрета.

ИНТЕРФЕЙС
Next.js, русский и английский, телефон — отдельный сценарий, а не узкая копия десктопа. Клиент к серверу генерируется из схемы API, поэтому расхождение ловится на сборке, а не у пользователя. Контраст и размер кнопок проверяются тестами.

КАЧЕСТВО И ВЫКЛАДКА
438 автотестов на сервере и 53 файла тестов интерфейса. Каждый пуш в основную ветку проходит проверки, собирает образы и выкатывается на сервер сам, а откат на прежнюю версию идёт без пересборки. Всё время хранится в UTC на уровне схемы базы, поэтому сдвиг на час исключён заранее.

Результат

Сервис работает на своём домене: лендинг на двух языках, вход, спейсы, заявки, запись с очередью, голосовые комнаты, напоминания в трёх каналах, каталог игр и админка. Первая выкладка на боевой сервер прошла на шестой день, дальше обновления выкатываются сами.

Что это даёт тому, кто заказывает похожий продукт:

— Срок и один исполнитель. От пустого репозитория до работающего сервиса — месяц. Сервер, интерфейс, бота, голосовые серверы и выкладку делал один человек, поэтому не было ни передачи работы между подрядчиками, ни расхождений на стыках.
— Продукт можно менять. Части связаны через события, и правка в одном месте не расходится волной по остальным. Двадцать записанных решений объясняют, почему всё устроено именно так, — это снимает главный риск при передаче проекта другому разработчику.
— Сайт не зависит от чужих сервисов. Интеграция без ключа или токена выключает одну функцию, а не весь сервис.
— Обновления без страха. Выкладка идёт только после 438 зелёных тестов и откатывается на прежнюю версию без пересборки.

Артефакты: работающий сайт, репозиторий с инструкцией развёртывания «от чистого сервера до работающего сервиса» и записанные архитектурные решения.

Оценили проект:

Другие проекты

Все проекты →
Веб-разработка и IT Этажность 237 000 зданий: парсинг 2ГИС и OpenStreetMap
Этажность 237 000 зданий: парсинг 2ГИС и OpenStreetMap
55
Веб-разработка и IT Сквозная аналитика amoCRM, Битрикс24 и 1С: отчёты за минуты
Сквозная аналитика amoCRM, Битрикс24 и 1С: отчёты за минуты
58
ИИ и Нейросети AI-агент по данным бизнеса: вопрос словами — готовый дашборд
AI-агент по данным бизнеса: вопрос словами — готовый дашборд
80
Веб-разработка и IT Премии и отчёт по выручке: 1 запуск вместо рабочего дня
Премии и отчёт по выручке: 1 запуск вместо рабочего дня
63