🗣️ Semáforo Descarte
Guía Definitiva de Implementación — GitHub + Firebase + Vercel
Stack: React 18.2 + Vite 5.0 + Firebase v10.7 + Firestore | 7 simulaciones exitosas
🔑 DATOS CRÍTICOS — Ten esto a mano antes de empezar
| Qué | Valor exacto | Dónde se usa |
|---|---|---|
| Nombre del proyecto | semaforo-descarte | Firebase, GitHub, Vercel |
| Email admin Firebase | admin@semaforo.app | Authentication → Añadir usuario |
| Contraseña admin Firebase | Semaforo2025! | Authentication → Añadir usuario |
| Colección Firestore | accesos | Firestore Database |
| Repo GitHub | semaforo-descarte | Private repository |
| Nombre ZIP | semaforo-descarte.zip | Carpeta del proyecto |
| Códigos acceso | ACC001 hasta ACC100 | Hardcoded en app |
| storageBucket (nuevo formato) | semaforo-descarte.firebasestorage.app | Variable VITE_ |
Firebase ahora genera
.firebasestorage.app en lugar de .appspot.com.Usa el valor EXACTO que aparece en tu Firebase Console → Project Settings → tu app web.
📊 Progreso de implementación:
Crear cuenta GitHub
⏱️ 5 min | Gratis🌐 Ir a GitHub y registrarse
Clic en "Sign up" → rellena email, contraseña y username → confirma email.
Crear proyecto Firebase
⏱️ 5 min🔥 Ir a Firebase Console
Inicia sesión con tu cuenta de Google (Gmail).
➕ Crear nuevo proyecto
- Clic en "Crear un proyecto"
- Nombre del proyecto:
semaforo-descarte - Desactiva Google Analytics (no es necesario)
- Clic en "Crear proyecto" → espera 30 segundos
semaforo-descarte.Configurar Firestore, Auth y obtener credenciales
⏱️ 12 min | Paso más importante🗄️ Paso 3A — Activar Firestore Database
- Menú izquierdo → Firestore Database
- Clic en "Crear base de datos"
- Selecciona "Comenzar en modo de producción"
- Ubicación:
us-central1(o la que aparezca por defecto) - Clic en "Listo"
Espera ~20 segundos a que se active.
🔐 Paso 3B — Reglas de Firestore
Una vez creada la base de datos → pestaña "Reglas" → borra todo → pega esto:
Clic en "Publicar".
🔑 Paso 3C — Activar Email/Password Authentication
- Menú izquierdo → Authentication
- Clic en "Comenzar"
- Pestaña "Método de acceso"
- Clic en "Correo electrónico/contraseña"
- Activa el primer toggle ("Correo electrónico/contraseña")
- Clic en "Guardar"
📱 Paso 3D — Añadir App Web (obtener credenciales)
Aquí es donde usas la opción "Add Firebase to your web app":
- En Firebase Console → haz clic en el ⚙️ (engranaje) → "Configuración del proyecto"
- Baja hasta la sección "Tus apps"
- Clic en el ícono </> (Web)
- Apodo de la app:
semaforo-descarte-web - NO marques "Firebase Hosting" (usaremos Vercel)
- Clic en "Registrar app"
Firebase te mostrará exactamente esto (el bloque firebaseConfig):
// Import the functions you need from the SDKs you need import { initializeApp } from "firebase/app"; // Your web app's Firebase configuration const firebaseConfig = { apiKey: "AIzaSyD-ejemplo123abc456def789ghi_ESTE-ES-TU-API-KEY", authDomain: "semaforo-descarte.firebaseapp.com", projectId: "semaforo-descarte", storageBucket: "semaforo-descarte.firebasestorage.app", messagingSenderId: "123456789012", appId: "1:123456789012:web:abcdef1234567890" };
Lo necesitas para el siguiente paso. No cierres Firebase Console hasta haber configurado el .env.
Después de copiar → clic en "Ir a la consola" (no necesitas instalar SDK).
Crear usuario Admin en Firebase Authentication
⏱️ 3 min | Solo 1 usuario👤 EL ÚNICO USUARIO QUE DEBES CREAR EN FIREBASE:
| Campo | Valor EXACTO |
|---|---|
| admin@semaforo.app | |
| Contraseña | Semaforo2025! |
Este usuario solo sirve para acceder al Panel Admin.
Los padres/usuarios usan códigos de acceso (ACC001-ACC100), NO Firebase Auth.
🛠️ Cómo crear el usuario admin
- En Firebase Console → Authentication
- Pestaña "Usuarios"
- Clic en "Añadir usuario"
- Email:
admin@semaforo.app - Contraseña:
Semaforo2025! - Clic en "Añadir usuario"
✓ Usuario creado correctamente Identificador Proveedores Creado UID admin@semaforo.app Email/Cont. Hoy abc123xyz...
Los 100 padres/usuarios de la app usan códigos ACC001-ACC100 (hardcoded en la app, no requieren Firebase Auth).
Extraer ZIP y configurar .env.local
⏱️ 8 min | Paso CRÍTICOEsta app usa Vite (no Create React App). Las variables DEBEN empezar con
VITE_.import.meta.env.VITE_FIREBASE_API_KEY ← así las lee la app.Si usas
REACT_APP_ o sin prefijo → Firebase NO funcionará.
📦 Paso 5A — Extraer semaforo-descarte.zip
- Descarga
semaforo-descarte.zip - Clic derecho → "Extraer aquí"
- Se crea carpeta
semaforo-descarte - Muévela a Desktop para fácil acceso
src/ (componentes, páginas, estilos)package.json (nombre: semaforo-descarte).env.example ← plantillavercel.json ← deploy automático.gitignore ← protege el .env📄 Paso 5B — Crear archivo .env.local
Dentro de la carpeta semaforo-descarte:
- Clic derecho en espacio vacío → "Nuevo" → "Documento de texto"
- Nómbralo
.env.local(con punto al inicio, SIN .txt) - Abre con Notepad o VS Code
Si lo guardas como
.env.local.txt no funcionará.Para evitarlo: usa VS Code → Archivo → Guardar Como → escribe
.env.local
🔑 Paso 5C — Pegar credenciales Firebase
Tienes en Notepad el bloque de Firebase. Conviértelo así:
De (Firebase Console te da esto):
A (esto va en tu .env.local — solo los valores, sin comillas):
❌ Mal:
VITE_FIREBASE_API_KEY = "AIzaSy..."✅ Bien:
VITE_FIREBASE_API_KEY=AIzaSy...
💾 Paso 5D — Guardar y verificar
Guarda el archivo .env.local en la raíz de semaforo-descarte/
semaforo-descarte/
├── .env.local ← TU ARCHIVO (no se sube a GitHub)
├── .env.example ← plantilla de referencia
├── .gitignore ← protege el .env
├── package.json
├── vercel.json
├── vite.config.js
├── index.html
└── src/
Instalar Git y subir a GitHub
⏱️ 15 min⬇️ Paso 6A — Instalar Git para Windows
Ejecuta el instalador → Siguiente en todo (opciones por defecto están bien).
Verifica instalación en CMD:
C:\Users\TuNombre> git --version
git version 2.43.0.windows.1
⚙️ Paso 6B — Configurar identidad Git (primera vez)
Reemplaza con tu nombre y el email de GitHub.
📂 Paso 6C — Crear repositorio en GitHub
- GitHub.com → Clic en "+" (arriba derecha) → "New repository"
- Repository name:
semaforo-descarte - Visibilidad: "Private" ← importante
- NO marques ninguna opción adicional (README, .gitignore, license)
- Clic en "Create repository"
🔧 Paso 6D — Abrir Git Bash en la carpeta del proyecto
- Navega a carpeta
semaforo-descarteen el Explorador de Windows - Clic derecho en espacio vacío → "Open Git Bash here"
- Aparece una ventana de terminal negra
📤 Paso 6E — Inicializar y subir código
En Git Bash, ejecuta estos comandos (uno por uno):
$ git init Initialized empty Git repository in C:/Users/.../semaforo-descarte/.git/ $ git add . (no output - normal) $ git commit -m "Semaforo Descarte v1 - Deploy inicial" [main (root-commit) abc1234] Semaforo Descarte v1 - Deploy inicial 24 files changed, 1234 insertions(+)
Ahora vincula con GitHub (copia la URL de TU repo en GitHub):
Reemplaza TU_USUARIO con tu usuario de GitHub.
$ git push -u origin main Enumerating objects: 31, done. Counting objects: 100% (31/31), done. Delta compression using up to 8 threads Compressing objects: 100% (28/28), done. Writing objects: 100% (31/31), 45.23 KiB | 5.03 MiB/s, done. Total 31 (delta 2), reused 0 (delta 0), pack-reused 0 Branch 'main' set up to track remote branch 'main' from 'origin'.
🔐 Paso 6F — Si pide usuario y contraseña
GitHub ya NO acepta contraseña normal. Necesitas un Personal Access Token:
- GitHub → Tu foto (arriba derecha) → Settings
- Baja al final → Developer settings
- Personal access tokens → Tokens (classic)
- Clic en "Generate new token (classic)"
- Nota:
semaforo-descarte-deploy - Expiration:
90 days - Marca: ✅ repo (todo lo de repo)
- Clic en "Generate token"
- Copia el token AHORA (solo lo ves una vez)
Usa el token como "contraseña" cuando Git Bash te la pida.
Deploy en Vercel con Variables de Entorno
⏱️ 10 min | El momento de la verdad🚀 Paso 7A — Registrarse en Vercel
- Clic en "Sign Up"
- Selecciona "Continue with GitHub"
- Autoriza Vercel a acceder a GitHub
📊 Paso 7B — Importar repositorio
- Dashboard Vercel → "Add New..." → "Project"
- Busca
semaforo-descarteen la lista - Clic en "Import"
Import Git Repository 📁 semaforo-descarte Private [Import]
⚙️ Paso 7C — Configuración automática (Vite detectado)
Vite ← auto-detectado ✅npm run build ✅dist ✅npm install ✅No cambies nada aquí, Vercel detecta Vite automáticamente.
AÑADIR LAS 6 VARIABLES DE ENTORNO ANTES DE HACER DEPLOY
Si haces Deploy sin estas variables → Firebase falla → la app no funciona.
🔑 Paso 7D — Añadir Variables de Entorno en Vercel
En la página de configuración, baja hasta "Environment Variables".
Añade estas 6 variables (Name + Value por cada una):
Name Value ────────────────────────────────────────────────────────────────── VITE_FIREBASE_API_KEY AIzaSyD-tu-api-key-real-de-firebase VITE_FIREBASE_AUTH_DOMAIN semaforo-descarte.firebaseapp.com VITE_FIREBASE_PROJECT_ID semaforo-descarte VITE_FIREBASE_STORAGE_BUCKET semaforo-descarte.firebasestorage.app VITE_FIREBASE_MESSAGING_SENDER_ID 123456789012 VITE_FIREBASE_APP_ID 1:123456789012:web:abcdef1234567890 ────────────────────────────────────────────────────────────────── 6 variables added ✅
.env.local.Vercel los inyecta en el build (equivalente a tu archivo .env.local local).
🚀 Paso 7E — Deploy
- Confirma que las 6 variables VITE_ están añadidas
- Clic en el botón azul "Deploy"
- Vercel clona el repo → instala deps → hace build
- Espera 2-4 minutos
[00:01] Cloning github.com/TU_USUARIO/semaforo-descarte (Branch: main) [00:03] Running "npm install" [00:18] added 421 packages in 15s [00:20] Running "npm run build" [00:21] vite v5.0.8 building for production... [00:26] transforming... [00:28] ✓ 421 modules transformed. [00:29] dist/index.html 0.77 kB [00:29] dist/assets/index.css 18.69 kB [00:29] dist/assets/index.js 1,194 kB [00:30] ✓ built in 6.5s [00:32] Build completed. Uploading output... [00:35] ✅ Deployment completed!
🎉 Paso 7F — ¡Tu app está en vivo!
Vercel te muestra:
🎉 Congratulations! Your deployment is live. Production Deployment https://semaforo-descarte.vercel.app Domains: ✓ semaforo-descarte.vercel.app (Production) ✓ semaforo-descarte-TU_USUARIO.vercel.app (Alias) Build time: 6.5s Status: ● Ready
¡Esa URL es tu app en vivo! Compártela con padres.
Probar la app en vivo
⏱️ 10 min | Verificación final🧪 Test 1 — Código de acceso regular
- Abre
https://semaforo-descarte.vercel.app - Ingresa código:
ACC001 - Acepta el disclaimer
- Selecciona rango de edad
- Responde las preguntas → ve el resultado
✅ Pantalla de Login carga → ACC001 funciona ✅ Disclaimer aparece correctamente ✅ 8 rangos de edad disponibles ✅ Preguntas se muestran una a una ✅ Resultado final con semáforo ✅ Botón WhatsApp funciona ✅ Botón PDF descarga correctamente
🔒 Test 2 — Verificar single-use (no repetición)
- Ingresa NUEVAMENTE con
ACC001 - Debe mostrar directamente el resultado anterior
- No debe permitir repetir el test
🛡️ Test 3 — Panel Admin
- En login → clic en "🔐 Acceso de administrador"
- Email:
admin@semaforo.app - Contraseña:
Semaforo2025! - Debe cargar el Panel Admin con los 100 códigos
- ACC001 debe aparecer como ✓ Usado con el resultado
✅ Login admin funciona (Firebase Auth) ✅ Panel carga 100 códigos ACC001-ACC100 ✅ ACC001 aparece como "Usado" ✅ Se puede editar nombre/email/teléfono ✅ Filtros y búsqueda funcionan
📱 Test 4 — Multi-dispositivo
Abre la URL en tu teléfono → ingresa con un código distinto (ej: ACC002)
Completa el test → luego en PC verifica en el Panel Admin → debe aparecer ACC002 como usado.
Tu app Semáforo Descarte está en vivo con:
✅ React 18 + Vite 5 + Firebase v10
✅ 100 códigos de acceso single-use
✅ Firestore sincronizado en tiempo real
✅ Panel Admin protegido con Firebase Auth
✅ PDF + WhatsApp funcionando
✅ Responsive (móvil + desktop)
❓ Preguntas Frecuentes
¿Por qué el email admin es admin@semaforo.app y no un Gmail real?
admin@semaforo.app funciona perfectamente porque Firebase solo valida el formato, no que el dominio exista realmente.Ventajas:
- Profesional (no expone tu Gmail personal)
- Fácil de recordar
- Está hardcodeado en la app para seguridad extra
Semaforo2025! es la que debes usar siempre en el Panel Admin.
¿Qué hace exactamente Firestore en esta app?
accesos con documentos por código:accesos/
├── ACC001/
│ ├── usado: true
│ ├── nombre: "Juan Pérez"
│ ├── email: "juan@mail.com"
│ ├── telefono: "999888777"
│ ├── respuestasTemporales: "EDAD=19-24|1:S|2:N|..."
│ └── resultadoTest/
│ ├── ageRange: "19-24"
│ ├── severity: "amarillo"
│ ├── totalAlerts: 2
│ ├── answers: "EDAD=19-24|1:S|2:N|3:S..."
│ └── timestamp: "2025-01-15T14:30:00Z"
└── ACC002/
└── usado: false
¿Por qué storageBucket tiene .firebasestorage.app y no .appspot.com?
- Proyectos antiguos:
proyecto.appspot.com - Proyectos nuevos (2024+):
proyecto.firebasestorage.app
No intentes adivinar el formato, cópialo directamente del bloque
firebaseConfig.
Hice deploy en Vercel pero Firebase falla (API key inválida)
Solución:
- Vercel → Tu proyecto → Settings
- → Environment Variables
- Verifica que las 6 variables VITE_ estén presentes
- Verifica que los valores no tengan comillas ni espacios
- Guarda cambios
- → Deployments → clic en los 3 puntos → "Redeploy"
- Espera 3 minutos
¿Cuánto cuesta en producción real?
- Vercel Hobby: Gratis, 100GB bandwidth/mes, ilimitados deploys
- Firestore Spark: 50k lecturas/día, 20k escrituras/día gratis
- Firebase Auth: 10k MAU gratis
- GitHub Private: Gratis
¿Cómo actualizo la app después del deploy?
git add . git commit -m "Actualización" git pushVercel detecta automáticamente el push y redeploya en 2-3 minutos.
No necesitas hacer nada en Vercel manualmente.
¿Puedo usar un dominio propio como semaforo.com?
- Clic en "Add" → escribe tu dominio
- Vercel te da los registros DNS que debes añadir en tu proveedor
- En 24-48h el dominio apunta a tu app