Plataforma web full-stack accesible para salud dirigida a personas mayores y con baja habilidad tecnológica en Salta y NOA.
- Descripción
- Características
- Arquitectura
- Requisitos Previos
- Instalación Local
- Desarrollo
- Despliegue en Producción
- Variables de Entorno
- Datos de Prueba
- Testing
- Principios Éticos
Plataforma Salud Fabi es una solución completa de salud digital que proporciona:
- Clases Educativas: Videos y materiales sobre salud, nutrición y bienestar
- Calculadora IMC: Cálculo de Índice de Masa Corporal con recomendaciones personalizadas
- Predictor de Enfermedades: Orientación basada en síntomas (ML) - NO diagnóstico médico
- Diseño Accesible: WCAG AA, textos grandes, alto contraste, navegación simple
- Autenticación Segura: WebAuthn/FIDO2 con fallback a contraseña/OTP
- ✅ Diseño responsivo móvil-first
- ✅ Accesibilidad WCAG AA
- ✅ Autenticación WebAuthn + fallback OTP
- ✅ Gestión de estado con Zustand
- ✅ Componentes reutilizables y accesibles
- ✅ REST API con TypeScript
- ✅ Autenticación JWT + WebAuthn
- ✅ Validación de datos con Zod
- ✅ Rate limiting y seguridad con Helmet
- ✅ MongoDB Atlas para persistencia
- ✅ Predictor de enfermedades orientativo
- ✅ API REST con FastAPI
- ✅ Datos sintéticos de ejemplo (reemplazar con datos reales)
- ✅ Disclaimer ético en todas las respuestas
┌─────────────────┐
│ Frontend │
│ Next.js │ ← Vercel
│ (Port 3000) │
└────────┬────────┘
│
↓
┌─────────────────┐
│ Backend API │
│ Express │ ← Railway
│ (Port 3001) │
└────────┬────────┘
│
┌────┴────┐
↓ ↓
┌─────────┐ ┌──────────────┐
│ MongoDB │ │ ML Service │
│ Atlas │ │ FastAPI │ ← Railway
│ │ │ (Port 8001) │
└─────────┘ └──────────────┘
- Node.js 20.x o superior
- npm 10.x o superior
- Python 3.11 o superior
- MongoDB (Atlas recomendado para producción)
- Docker (opcional, para desarrollo local)
git clone <url-del-repositorio> cd Proyecto\ fabi
Copiar el archivo .env.example y crear archivos .env para cada servicio:
# Frontend cp .env.example frontend/.env.local # Backend cp .env.example backend/.env # ML Service cp .env.example ml-service/.env
Editar los archivos .env con tus configuraciones:
NODE_ENV=development PORT=3001 FRONTEND_URL=http://localhost:3000 # MongoDB Atlas - IMPORTANTE: Reemplaza con tu cluster MONGODB_URI=mongodb+srv://fabiproyecto:roPAh6QTV9rZktwJ@freelanceseguro-cluster.XXXXX.mongodb.net/fabi_bd?retryWrites=true&w=majority # Obtén el host completo de tu cluster en MongoDB Atlas: # 1. Ve a tu cluster en MongoDB Atlas # 2. Click en "Connect" > "Connect your application" # 3. Copia la URI y reemplaza XXXXX con tu host JWT_SECRET=tu-secreto-jwt-seguro-min-32-caracteres JWT_EXPIRES_IN=7d # Email (configurar con tu SMTP) EMAIL_SMTP_HOST=smtp.gmail.com EMAIL_SMTP_PORT=587 EMAIL_SMTP_USER=tu-email@gmail.com EMAIL_SMTP_PASS=tu-app-password # WebAuthn WEBAUTHN_RP_NAME=Plataforma Salud Fabi WEBAUTHN_RP_ID=localhost WEBAUTHN_ORIGIN=http://localhost:3000 ML_SERVICE_URL=http://localhost:8001
NEXT_PUBLIC_API_URL=http://localhost:3001 NEXT_PUBLIC_ML_URL=http://localhost:8001
# Frontend cd frontend npm install # Backend cd ../backend npm install # ML Service cd ../ml-service pip install -r requirements.txt
npm run install:all
cd backend
npm run seedEsto creará usuarios de ejemplo:
- Admin:
admin@saludfabi.com/password123 - Docente:
docente@saludfabi.com/password123 - Usuario:
usuario@saludfabi.com/password123
docker-compose up
Servicios disponibles:
- Frontend: http://localhost:3000
- Backend API: http://localhost:3001
- ML Service: http://localhost:8001
- MongoDB: localhost:27017
# Terminal 1 - Backend cd backend npm run dev # Terminal 2 - Frontend cd frontend npm run dev # Terminal 3 - ML Service cd ml-service python -m uvicorn app.main:app --reload --port 8001
- Crear cuenta en MongoDB Atlas
- Crear cluster (Free tier disponible)
- Configurar usuario de base de datos:
- Username:
fabiproyecto - Password:
roPAh6QTV9rZktwJ - Cluster name:
freelanceseguro-cluster
- Username:
- Whitelist IP:
0.0.0.0/0(permitir todas - configurar mejor en producción) - Obtener connection string y actualizar
MONGODB_URIen variables de entorno
- Instalar Vercel CLI:
npm i -g vercel
- Deploy desde el directorio frontend:
cd frontend
vercel-
Configurar variables de entorno en Vercel Dashboard:
NEXT_PUBLIC_API_URL: URL de tu backend en RailwayNEXT_PUBLIC_ML_URL: URL de tu ML service en Railway
-
Para producción:
vercel --prod
- Crear cuenta en Railway
- Crear nuevo proyecto
- Deploy desde GitHub o CLI:
# Opción A: Conectar repositorio de GitHub # - Ve a Railway Dashboard # - New Project > Deploy from GitHub # - Selecciona el repositorio y carpeta "backend" # Opción B: Railway CLI cd backend railway login railway init railway up
-
Configurar variables de entorno en Railway Dashboard:
NODE_ENV=productionPORT=3001MONGODB_URI=<tu-uri-de-mongodb-atlas>JWT_SECRET=<secreto-seguro>FRONTEND_URL=<url-de-vercel>ML_SERVICE_URL=<url-ml-service-railway>- Copiar todas las demás variables necesarias
-
Railway generará una URL pública para tu API
- Crear otro servicio en Railway
- Deploy:
cd ml-service
railway init
railway up- Configurar variables:
ML_PORT=8001
-
Comprar dominio en Namecheap
-
Configurar DNS en Namecheap:
Para Frontend (Vercel):
Type: CNAME
Host: @
Value: cname.vercel-dns.com
TTL: Automatic
Para Backend API:
Type: CNAME
Host: api
Value: <tu-proyecto>.up.railway.app
TTL: Automatic
Para ML Service:
Type: CNAME
Host: ml
Value: <tu-proyecto-ml>.up.railway.app
TTL: Automatic
-
En Vercel Dashboard:
- Settings > Domains > Add Domain
- Agregar tu dominio personalizado
-
Actualizar variables de entorno de producción:
NEXT_PUBLIC_API_URL=https://api.tudominio.comFRONTEND_URL=https://tudominio.comWEBAUTHN_RP_ID=tudominio.comWEBAUTHN_ORIGIN=https://tudominio.com
- Vercel: SSL automático con Let's Encrypt
- Railway: SSL automático incluido
- Namecheap: Certificados disponibles (opcional si usas Vercel/Railway)
| Variable | Descripción | Ejemplo |
|---|---|---|
NEXT_PUBLIC_API_URL |
URL del backend API | http://localhost:3001 |
NEXT_PUBLIC_ML_URL |
URL del servicio ML | http://localhost:8001 |
| Variable | Descripción | Requerido |
|---|---|---|
NODE_ENV |
Entorno (development/production) | ✅ |
PORT |
Puerto del servidor | ✅ |
MONGODB_URI |
URI de MongoDB Atlas | ✅ |
JWT_SECRET |
Secreto para JWT (mín 32 caracteres) | ✅ |
JWT_EXPIRES_IN |
Tiempo de expiración JWT | ❌ |
FRONTEND_URL |
URL del frontend | ✅ |
ML_SERVICE_URL |
URL del servicio ML | ✅ |
EMAIL_SMTP_HOST |
Host SMTP para emails | ❌ |
EMAIL_SMTP_USER |
Usuario SMTP | ❌ |
EMAIL_SMTP_PASS |
Contraseña SMTP | ❌ |
WEBAUTHN_RP_NAME |
Nombre para WebAuthn | ❌ |
WEBAUTHN_RP_ID |
ID relying party WebAuthn | ✅ |
WEBAUTHN_ORIGIN |
Origin para WebAuthn | ✅ |
| Variable | Descripción | Requerido |
|---|---|---|
ML_PORT |
Puerto del servicio | ❌ |
ML_LOG_LEVEL |
Nivel de logging | ❌ |
Después de ejecutar npm run seed:
| Rol | Password | |
|---|---|---|
| Admin | admin@saludfabi.com | password123 |
| Docente | docente@saludfabi.com | password123 |
| Usuario | usuario@saludfabi.com | password123 |
- Usuario: Ver clases, calcular IMC, usar predictor, editar perfil
- Docente: Todo lo anterior + crear/editar/eliminar clases propias
- Admin: Acceso completo + gestión de usuarios
cd frontend npm test
cd backend npm test
Esta plataforma se rige por los siguientes principios:
- No Reemplazo Médico: Información orientativa, no diagnóstico
- Privacidad: Datos de salud protegidos con máxima confidencialidad
- Accesibilidad: Diseño inclusivo para personas mayores
- Transparencia: Uso claro de datos y algoritmos
- Consentimiento Informado: Usuario autoriza cada funcionalidad
El predictor de enfermedades usa datos sintéticos de ejemplo. Para producción:
- Reemplazar
ml-service/app/predictor.pycon modelo entrenado con datos reales - Usar datasets validados de fuentes confiables (ej: datos abiertos de salud pública)
- Validar con profesionales médicos
- Realizar auditorías éticas del algoritmo
# Desarrollo con recarga automática npm run dev # Build para producción npm run build # Iniciar en producción npm start # Linting npm run lint # Tests npm test # Seed de base de datos npm run seed # Docker docker-compose up docker-compose down
Ver CODE_OF_CONDUCT.md para principios éticos y de contribución.
MIT License - Ver LICENSE
Para consultas: info@saludfabi.com
Desarrollado con accesibilidad y ética en salud ❤️
🩺 Esta plataforma NO reemplaza la atención médica profesional