Un backend robusto construido con Node.js, Express.js y MongoDB para gestión de usuarios con autenticación JWT y sistema de roles.
- Características
- Tecnologías
- Requisitos Previos
- Instalación
- Configuración
- Uso con Docker
- Ejecución
- Estructura del Proyecto
- API Endpoints
- Sistema de Roles
- Logging
- Contribución
- ✅ Autenticación JWT con cookies seguras
- ✅ Sistema de roles (admin, moderator, user)
- ✅ CRUD completo de usuarios
- ✅ Middleware de autenticación y autorización
- ✅ Validaciones de datos robustas
- ✅ Logging con Winston
- ✅ Manejo de errores centralizado
- ✅ Soporte para Docker
- ✅ Variables de entorno configurables
- ✅ Base de datos MongoDB con Mongoose
- Backend: Node.js + Express.js
- Base de Datos: MongoDB + Mongoose
- Autenticación: JWT (JSON Web Tokens)
- Logging: Winston
- Conteneurización: Docker + Docker Compose
- Variables de Entorno: dotenv
{
"express": "^5.1.0",
"mongoose": "^8.18.2",
"jsonwebtoken": "^9.0.2",
"cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"dotenv": "^17.2.2",
"winston": "^3.17.0"
}- Node.js (v16 o superior)
- npm o yarn
- MongoDB (local o remoto)
- Docker y Docker Compose (opcional, pero recomendado)
-
Clonar el repositorio
git clone <url-del-repositorio> cd StabiGen
-
Instalar dependencias
npm install
-
Crear archivo de variables de entorno
# Crear .env en la raíz del proyecto touch .env
Crear un archivo .env en la raíz del proyecto con las siguientes variables:
# Puerto del servidor
PORT=3000
# URI de conexión a MongoDB
MONGODB_URI=mongodb://admin:admin123@localhost:27017/StabiGen?authSource=admin
# JWT Secret (genera una clave secreta fuerte)
JWT_SECRET=tu_jwt_secret_muy_seguro_aqui
# Entorno de desarrollo
NODE_ENV=developmentSi usas MongoDB local, asegúrate de:
- Tener MongoDB ejecutándose en tu sistema
- Crear una base de datos llamada
StabiGen - Configurar las credenciales apropiadas
El proyecto incluye un archivo docker-compose.yml que configura automáticamente MongoDB:
services:
mongodb:
image: mongo:latest
container_name: stabigen-mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin123
MONGO_INITDB_DATABASE: StabiGen
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
- ./mongo-init:/docker-entrypoint-initdb.d
volumes:
mongodb_data:
driver: local-
Iniciar MongoDB con Docker Compose
docker-compose up -d
-
Verificar que el contenedor esté ejecutándose
docker-compose ps
-
Ver logs del contenedor
docker-compose logs mongodb
-
Detener los servicios
docker-compose down
-
Detener y eliminar volúmenes (CUIDADO: elimina todos los datos)
docker-compose down -v
- Usuario:
admin - Contraseña:
admin123 - Base de datos:
StabiGen - Puerto:
27017 - URI de conexión:
mongodb://admin:admin123@localhost:27017/StabiGen?authSource=admin
-
Iniciar MongoDB
docker-compose up -d
-
Iniciar el servidor en modo desarrollo
npm run dev
-
Asegúrate de tener MongoDB ejecutándose localmente
-
Iniciar el servidor
npm run dev
El servidor estará disponible en: http://localhost:3000
Los logs se guardan en la carpeta logs/:
combined.log: Todos los logserror.log: Solo errores
StabiGen/
├── app.js # Punto de entrada de la aplicación
├── package.json # Dependencias y scripts
├── docker-compose.yml # Configuración de Docker
├── logs/ # Archivos de log
│ ├── combined.log
│ └── error.log
├── mongo-init/ # Scripts de inicialización de MongoDB
└── src/
├── config/ # Configuraciones
│ ├── envs.js # Variables de entorno
│ └── logger.js # Configuración de Winston
├── constants/ # Constantes de la aplicación
│ └── http-status.js # Códigos de estado HTTP
├── controllers/ # Controladores de la API
│ ├── auth.controller.js
│ └── user.controller.js
├── db/ # Configuración de base de datos
│ └── database.js
├── middleware/ # Middlewares personalizados
│ ├── asyncHandler.js
│ ├── auth.middleware.js
│ └── private.middleware.js
├── models/ # Modelos de Mongoose
│ └── user.js
├── routes/ # Definición de rutas
│ ├── auth.routes.js
│ └── users.routes.js
├── services/ # Servicios de negocio
│ └── user.service.js
├── utils/ # Utilidades
│ ├── cookies.js
│ ├── errors.js
│ ├── format.js
│ └── jwt.js
└── validations/ # Validaciones de entrada
├── auth.validation.js
└── user.validation.js
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/auth/sign-up |
Registrar nuevo usuario |
| POST | /api/auth/sign-in |
Iniciar sesión |
| POST | /api/auth/sign-out |
Cerrar sesión |
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/auth/me |
Obtener perfil actual | Todos |
| GET | /api/auth/private-route |
Ruta de ejemplo privada | admin, moderator |
| Método | Endpoint | Descripción | Roles |
|---|---|---|---|
| GET | /api/users |
Listar todos los usuarios | admin |
| GET | /api/users/stats |
Estadísticas de usuarios | admin |
| GET | /api/users/:id |
Ver perfil específico | admin o propio |
| POST | /api/users |
Crear nuevo usuario | admin |
| PUT | /api/users/:id |
Actualizar usuario | admin o propio |
| DELETE | /api/users/:id |
Eliminar usuario | admin |
| PUT | /api/users/:id/toggle-status |
Activar/desactivar usuario | admin |
curl -X POST http://localhost:3000/api/auth/sign-up \
-H "Content-Type: application/json" \
-d '{
"name": "Juan Pérez",
"email": "juan@example.com",
"password": "mi_password_seguro"
}'curl -X POST http://localhost:3000/api/auth/sign-in \
-H "Content-Type: application/json" \
-d '{
"email": "juan@example.com",
"password": "mi_password_seguro"
}'La aplicación implementa un sistema de roles con tres niveles:
-
user (por defecto)
- Puede ver y editar su propio perfil
- Acceso limitado a recursos
-
moderator
- Acceso a rutas privadas específicas
- Puede realizar acciones de moderación
-
admin
- Acceso completo al sistema
- Gestión de usuarios (CRUD)
- Acceso a estadísticas
- Puede cambiar roles de otros usuarios
{
name: String, // Nombre del usuario
email: String, // Email único
password: String, // Contraseña hasheada
role: String, // "user", "moderator", "admin"
isActive: Boolean, // Estado activo/inactivo
createdAt: Date, // Fecha de creación
updatedAt: Date // Fecha de actualización
}El sistema utiliza Winston para el logging con los siguientes niveles:
- error: Errores de la aplicación
- warn: Advertencias
- info: Información general
- debug: Información de depuración
logs/error.log: Solo erroreslogs/combined.log: Todos los logs
Los logs se configuran en src/config/logger.js y incluyen:
- Timestamp
- Nivel de log
- Mensaje
- Stack trace (para errores)
-
Error de conexión a MongoDB
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017Solución: Verificar que MongoDB esté ejecutándose con Docker Compose
-
Error de variables de entorno
Error Missing Environment Variables: - MONGODB_URISolución: Crear archivo
.envcon las variables requeridas -
Error de autenticación JWT
JsonWebTokenError: invalid signatureSolución: Verificar que
JWT_SECRETesté configurado correctamente
# Ver logs en tiempo real
docker-compose logs -f mongodb
# Conectar a MongoDB desde terminal
docker exec -it stabigen-mongodb mongosh -u admin -p admin123
# Reiniciar completamente el proyecto
docker-compose down -v && docker-compose up -d
npm run dev- Fork el repositorio
- Crear una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abrir un Pull Request
- Usar ES6+ modules
- Seguir convenciones de nombres en camelCase
- Documentar funciones complejas
- Mantener archivos organizados por funcionalidad
- Implementar manejo de errores apropiado
Este proyecto está bajo la Licencia ISC.
Desarrollado con ❤️ por luneska usando Node.js y MongoDB
Para más información o soporte, abre un issue en el repositorio.