Crea una partida, comparte el enlace y permite que cada participante juegue desde su teléfono mientras el anfitrión controla el sorteo y una pantalla común muestra el progreso.
- Salas multijugador independientes con códigos fáciles de compartir.
- Cartones únicos de 5 × 5 para cada participante.
- Actualizaciones en tiempo real mediante WebSockets.
- Panel protegido para el anfitrión.
- Regreso sencillo al panel usando el código de sala y el token de anfitrión.
- Vista de proyección con tablero, número actual y código QR.
- Persistencia opcional de partidas y jugadores mediante Neon Postgres.
- Recuperación del cartón y las marcas después de recargar la página.
- Diferentes patrones de victoria: cartón lleno, líneas, diagonal, X (las dos diagonales), cruz y cuadro central.
- Podio de 1, 2 o 3 ganadores, elegido por el anfitrión al crear la partida.
- Validación del bingo en el servidor.
- Interfaz adaptable para móviles, computadoras y pantallas compartidas.
- Metadatos Open Graph, Twitter Cards, favicons e iconos PWA.
- Contenedor Docker preparado para desplegarse en Dokploy.
| Área | Tecnología |
|---|---|
| Servidor | Node.js y Express |
| Tiempo real | Socket.IO |
| Persistencia | Neon Postgres, opcional |
| Interfaz | HTML, CSS y JavaScript sin framework |
| Códigos QR | QRCode |
| Despliegue | Docker y Dokploy |
- Node.js 18 o superior.
- npm.
- Una base de datos Neon Postgres si se desea persistencia entre reinicios.
git clone https://github.com/esdrasclth/bingo.git
cd bingo
npm install
npm startAbre http://localhost:3000 en el navegador.
La base de datos es opcional. Si DATABASE_URL no está configurada, la aplicación funciona completamente en memoria; las partidas activas se perderán al reiniciar el servidor.
Crea un archivo .env o configura las variables directamente en el proveedor de despliegue. Puedes usar .env.example como referencia.
| Variable | Requerida | Descripción |
|---|---|---|
DATABASE_URL |
No | Cadena de conexión de Neon Postgres para persistir partidas. |
PUBLIC_URL |
Recomendada en producción | URL pública sin barra final, por ejemplo https://bingo.ejemplo.com. Se utiliza en Open Graph y enlaces canónicos. |
PORT |
No | Puerto HTTP. El valor predeterminado es 3000. |
Ejemplo:
DATABASE_URL=postgresql://usuario:contraseña@host/base?sslmode=require
PUBLIC_URL=https://bingo.ejemplo.com
PORT=3000No agregues archivos .env, .env.local o credenciales al repositorio.
- Abre bingo.brandsofts.com y selecciona Crear partida.
- Guarda el token de anfitrión mostrado por la aplicación.
- Comparte el enlace para jugadores o el código de la sala.
- Abre el enlace de proyección en una pantalla compartida, si lo necesitas.
- Desde el panel del anfitrión, selecciona el patrón y comienza a sacar bolas.
Si cerraste el panel por accidente, vuelve a la página principal y busca ¿Cerraste el panel?. Pega el token de anfitrión y selecciona Volver a mi panel; la aplicación encontrará la sala activa correspondiente sin pedirte el código.
También puedes abrir directamente /admin/CÓDIGO e introducir allí el token. El token nunca se agrega a la URL y se conserva únicamente en el almacenamiento temporal de la pestaña. La recuperación tiene límite de intentos y una sala que ya expiró o fue eliminada no puede reabrirse con el token.
| Ruta | Descripción |
|---|---|
/ |
Página de inicio para crear una partida o unirse con un código. |
/jugar/:codigo |
Cartón del participante. |
/admin/:codigo |
Panel de control del anfitrión. |
/pantalla/:codigo |
Vista de proyección de la partida. |
/api/salud |
Estado del servicio para healthchecks y monitoreo. |
- Crea una aplicación nueva desde este repositorio de GitHub.
- Selecciona el despliegue mediante
Dockerfile. - Configura el puerto interno
3000. - Agrega
DATABASE_URLyPUBLIC_URLen las variables de entorno. - Asocia el dominio público y habilita HTTPS.
- Despliega la aplicación.
El Dockerfile instala únicamente las dependencias de producción, ejecuta el proceso con un usuario sin privilegios, utiliza tini para un apagado ordenado e incluye un healthcheck contra /api/salud.
Bingo PRO mantiene el estado activo de las salas en memoria y utiliza conexiones WebSocket. Debe ejecutarse con una sola réplica. Para utilizar varias réplicas se necesitaría un adaptador compartido para Socket.IO y coordinación distribuida del estado de las partidas.
.
├── branding/ # Fuentes gráficas y generador de recursos de marca
├── public/ # CSS, JavaScript, manifest e imágenes públicas
├── views/ # Vistas de jugador, anfitrión y proyección
├── db.js # Persistencia opcional en Neon
├── server.js # Servidor HTTP, API, salas y eventos Socket.IO
├── Dockerfile # Imagen de producción
└── package.json
- Los tokens de anfitrión se almacenan mediante hash SHA-256 y se comparan en tiempo constante.
- La validación de cartones, marcas y victorias ocurre en el servidor.
- La creación de partidas tiene límites por dirección IP.
- Las salas inactivas se eliminan automáticamente.
- Las credenciales locales están excluidas mediante
.gitignorey.dockerignore.
Las propuestas y los reportes de fallos son bienvenidos. La guía CONTRIBUTING.md explica cómo levantar el entorno, qué reglas de diseño sostiene el proyecto y qué comprobar antes de abrir un pull request.
Si encuentras una vulnerabilidad, escribe a Esdras.Clother@outlook.com en lugar de abrir un issue público.
Este proyecto se distribuye bajo la licencia MIT.
