Рисуй загаданное слово — друзья угадывают в чате. Кто быстрее, тот и в дамках.
Минималистичная реалтайм-игра в духе Skribbl для компании друзей. Хост создаёт лобби, кидает ссылку — и поехали.
🎮 Играть: drawbitch.duckdns.org
- 🔗 Лобби по ссылке — хост создаёт комнату, задаёт секунды на ход и число ходов, делится ссылкой.
- 👥 Без регистрации — заходишь, вводишь имя, играешь.
- 🎨 Рисование в реальном времени — холст, 8 цветов, 3 размера кисти, ластик, очистка. Штрихи летят всем мгновенно по WebSocket.
- 💬 Угадайка в чате — пишешь догадку; угадал — очки начисляются, слово не палится остальным.
- ⚡ Очки за скорость — чем быстрее угадал, тем больше очков; рисующий получает бонус за каждого угадавшего.
- 🔄 Авто-переподключение — закрыл вкладку или потерял связь? Возвращаешься по той же ссылке со своими очками.
- 👑 Передача хоста — если хост ушёл, роль переходит следующему.
| Слой | Технологии |
|---|---|
| Бэкенд | Python 3.14, FastAPI, WebSocket, uv. Состояние игры — в памяти, без БД. |
| Фронтенд | Next.js 16 (standalone), React 19, TypeScript, HTML5 Canvas. |
| Инфра | Docker, GitHub Actions → GHCR, nginx + TLS, авто-деплой по cron. |
| Главная — создать лобби или войти по ссылке | Зал ожидания — игроки, настройки, приглашение |
![]() |
![]() |
| Выбор слова — рисующему дают 3 на выбор | Финал — итоговая таблица и «играть снова» |
![]() |
![]() |
Рисующий видит слово и инструменты, угадывающие — только маску:
- Открой приложение и нажми «Создать лобби».
- Скопируй ссылку-приглашение и скинь друзьям (нужно ≥2 игроков).
- Все вводят имена; хост задаёт секунды на ход и число ходов и жмёт «Старт».
- Игроки по очереди рисуют загаданное слово, остальные угадывают в чате.
- После заданного числа ходов — итоговая таблица, и лобби снова готово к новой игре.
Нужны uv и node 24+.
# 1) бэкенд → http://localhost:8000
cd backend && uv sync && uv run uvicorn app.main:app --reload
# 2) фронтенд → http://localhost:3000 (в другом терминале)
cd frontend && npm install && npm run devОткрой http://localhost:3000, создай лобби, открой ссылку во второй вкладке/на телефоне, введите имена и нажмите «Старт».
Либо весь стек в Docker:
make dev # docker compose up --buildmake check # бэкенд: ruff + WPS + mypy + pytest (покрытие ≥85%)
cd frontend && npm run typecheck && npm run buildПрод: https://drawbitch.duckdns.org. Сервис живёт в Docker compose (backend +
frontend), наружу смотрит общий nginx (TLS, роутинг по домену; /ws и /api →
бэкенд). Контейнеры слушают только loopback хоста.
git push в master запускает GitHub Actions: тесты → сборка образов
drawbitch-backend и drawbitch-frontend → публикация в GHCR.
На сервере (один раз):
- Положить
docker-compose.prod.ymlиdeploy/(например,git clone). - Заменить домен
drawbitch.duckdns.orgна свой вdocker-compose.prod.yml(CORS) иdeploy/nginx/draw-bitch.conf; владельца образов (troyan-dy) — на свой GitHub. - Подключить
deploy/nginx/draw-bitch.confк общему nginx и выпустить TLS-сертификат (Let's Encrypt webroot →/var/www/certbot). - Добавить cron на
deploy/auto-update.sh: тянет свежие образы из GHCR и пересоздаёт контейнеры при изменении.
# первый старт на сервере
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -dcertbot certonly --webroot -w /var/www/certbot -d drawbitch.duckdns.org- Состояние игры эфемерно (в памяти бэкенда): перезапуск/деплой обрывает активные игры — для вечеринок это приемлемо, БД не нужна.
- WebSocket идёт через тот же домен: nginx роутит
/wsи/apiна бэкенд, остальное — на фронтенд. Бэкенд наружу закрыт (только loopback). - Архитектура и устройство игры подробно описаны в CLAUDE.md.





