Sistema web completo para gestionar usuarios y enviar notificaciones diarias de cumpleaños por email.
- Backend: PHP 8.1 con arquitectura REST API
- Frontend: React 18 con Material MUI y Bootstrap
- Base de Datos: MySQL 8.0
- Email: EmailJS
- Contenedores: Docker y Docker Compose
birthdays/
├── backend/ # API REST en PHP
│ ├── api/ # Endpoints de la API
│ ├── config/ # Configuración
│ ├── models/ # Modelos de datos
│ ├── utils/ # Utilidades
│ └── public/ # Punto de entrada
├── frontend/ # Aplicación React
│ ├── src/
│ │ ├── components/ # Componentes React
│ │ ├── services/ # Servicios API
│ │ ├── contexts/ # Context API
│ │ └── utils/ # Utilidades
│ └── public/
├── database/ # Scripts SQL
├── docker-compose.yml # Orquestación Docker
├── .env.local # Variables para desarrollo local
├── .env.production # Variables para producción
├── .env.example # Template de variables de entorno
└── switch-env.sh # Script para cambiar entre entornos
- Docker Desktop instalado
- Git
-
Clonar el repositorio
git clone <https://github.com/h-kANAME/bithdays.git> cd birthdays
-
Configurar entorno local
# Usar el script helper para configurar el entorno local ./switch-env.sh local # O manualmente: cp .env.local backend/.env cp .env.local frontend/.env
-
Editar configuración (opcional)
cp .env.example .env
Editar
.envy configurar:- Credenciales de base de datos
- Credenciales de EmailJS
- JWT_SECRET (mínimo 32 caracteres)
-
Iniciar los contenedores
docker-compose up -d
-
Verificar que los servicios estén corriendo
docker-compose ps
-
Acceder a la aplicación
- Frontend: http://localhost:3000
- Backend API: http://localhost:8000
- phpMyAdmin: http://localhost:8080
- Usuario admin:
elopez - Contraseña:
birthdais*
-
Crear cuenta en https://www.emailjs.com/
-
Crear un servicio de email
-
Crear una plantilla con las siguientes variables:
to_emailto_namefecha_actualcumpleanios_listcumpleanios(array)
-
Obtener las credenciales:
- Service ID
- Template ID
- Public Key
-
Agregar las credenciales al archivo
.env
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/auth/login |
Login |
| POST | /api/auth/verify-token |
Verificar token |
| POST | /api/auth/logout |
Logout |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/usuarios?page=1&limit=15&search= |
Listar usuarios |
| GET | /api/usuarios/{id} |
Obtener un usuario |
| POST | /api/usuarios |
Crear usuario |
| PUT | /api/usuarios/{id} |
Actualizar usuario |
| DELETE | /api/usuarios/{id} |
Eliminar usuario |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/destinatarios?page=1&limit=15&search= |
Listar destinatarios |
| GET | /api/destinatarios/{id} |
Obtener un destinatario |
| POST | /api/destinatarios |
Crear destinatario |
| PUT | /api/destinatarios/{id} |
Actualizar destinatario |
| DELETE | /api/destinatarios/{id} |
Eliminar destinatario |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/cron/check-birthdays |
Verificar y enviar cumpleaños del día |
| GET | /api/cron/test-email?email=test@example.com |
Enviar email de prueba |
# Editar crontab
crontab -e
# Agregar línea para ejecutar diariamente a las 8:00 AM
0 8 * * * curl -X GET https://kyz.com.ar/birthdays/backend/public/api/cron/check-birthdays >> /var/log/birthdays-cron.log 2>&1- Subir carpeta
backendal servidor - Configurar archivo
.envcon credenciales de producción - Asegurar que Apache tenga mod_rewrite habilitado
- Configurar virtual host apuntando a
backend/public
-
Compilar la aplicación:
cd frontend npm install npm run build -
Subir carpeta
buildal servidor -
Configurar servidor web para servir archivos estáticos
- Crear base de datos en MySQL
- Ejecutar script:
database/init.sql - Configurar usuario y permisos
# Iniciar servicios
docker-compose up -d
# Detener servicios
docker-compose down
# Ver logs
docker-compose logs -f
# Reconstruir contenedores
docker-compose up -d --build
# Acceder al contenedor de backend
docker exec -it birthdays_backend bash
# Acceder al contenedor de base de datos
docker exec -it birthdays_db mysql -u birthdays_user -p# Backup
docker exec birthdays_db mysqldump -u birthdays_user -plocal_password birthdays_db > backup.sql
# Restore
docker exec -i birthdays_db mysql -u birthdays_user -plocal_password birthdays_db < backup.sqlEl backend está desarrollado en PHP puro sin frameworks, utilizando:
- PDO para acceso a base de datos
- Arquitectura MVC
- JWT para autenticación
- Prepared statements para prevenir SQL injection
El frontend utiliza:
- React 18 con hooks
- Context API para estado global
- Material UI para componentes
- Bootstrap para layout
- Axios para peticiones HTTP
- React Router para navegación
- Contraseñas hasheadas con bcrypt (cost factor 10)
- Tokens JWT con expiración de 30 días
- Validación de inputs en backend y frontend
- Prepared statements para prevenir SQL injection
- Sanitización de datos
- CORS configurado
- Headers de seguridad
# Login
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"usuario":"elopez","password":"birthdais*"}'
# Listar usuarios (requiere token)
curl -X GET http://localhost:8000/api/usuarios \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
# Verificar cumpleaños del día
curl -X GET http://localhost:8000/api/cron/check-birthdays- Verificar que el contenedor de MySQL esté corriendo
- Verificar credenciales en
.env - Esperar a que MySQL termine de inicializar (puede tomar 30 segundos)
- Verificar que REACT_APP_API_URL en
.envsea correcto - Verificar configuración de CORS en
backend/config/cors.php - Verificar que el backend esté corriendo
- Verificar configuración de EmailJS en
.env - Probar endpoint
/api/cron/test-email - Verificar logs del navegador o servidor
Propietario
Para soporte, contactar al administrador del sistema.