Покер для планирования командных задач в реальном времени
🃏 Создайте комнату · 🔗 Поделитесь ссылкой · ✅ Голосуйте · 👀 Открывайте карты · 📊 Смотрите результат
- 🃏 Стандартная Fibonacci-like колода:
1, 2, 3, 5, 8, 13, 21, ?, ☕ - ⚡ Real-time комнаты через WebSocket
/api/ws - 🔐 Голоса скрыты до раскрытия раунда
- 👑 Host-only действия: показать карты и начать новый раунд
- ✅ Настройка: может ли ведущий голосовать
- 📱 QR-код и копирование ссылки для приглашения
- 🧠 Без базы данных: состояние комнат хранится в памяти сервера
- Nuxt 4
- Vue 3
<script setup> - Pinia
- Tailwind CSS v4
- Nitro WebSockets /
crossws lucide-vue-nextqrcode- Docker + Docker Compose
npm install
npm run devПриложение будет доступно на:
http://localhost:3007
npm run dev # dev server на 3007
npm run build # production build
npm run preview # preview build на 3007Запуск через Makefile:
make upОстановка:
make downЭквивалентные команды:
docker compose up --build -d --remove-orphans
docker compose down --remove-orphansDocker-контейнер слушает порт 3007, и наружу проброшен тот же порт:
http://localhost:3007
HOST=0.0.0.0
PORT=3007
NODE_ENV=productionПример nginx reverse proxy для Nuxt/Nitro + WebSocket /api/ws:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name poker.example.com;
client_max_body_size 5m;
location / {
proxy_pass http://127.0.0.1:3007;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}server/utils/rooms.tsхранит комнаты в памяти и сериализует безопасный room state.server/routes/api/ws.tsобрабатывает WebSocket-команды комнаты.app/composables/useRoomSocket.tsуправляет подключением, reconnect и ping.app/stores/room.tsхранит клиентское состояние комнаты.app/pages/room/[id].vueсобирает основной room UI.
Во время голосования сервер не отдаёт значения голосов. Значения появляются только после reveal_votes.
vote: room.status === 'revealed' ? user.vote : null