Sistema de gestiΓ³n de archivos con control de cuotas de almacenamiento, validaciΓ³n de contenido ZIP y gestiΓ³n de usuarios basado en Symfony y EasyAdmin.
AplicaciΓ³n web que permite a los usuarios subir y gestionar sus archivos con las siguientes caracterΓsticas:
- β Sistema de autenticaciΓ³n con roles (ROLE_USER, ROLE_SUPER_ADMIN)
- π Control de cuotas de almacenamiento por usuario y grupo
- π GestiΓ³n de archivos: subida, visualizaciΓ³n y eliminaciΓ³n
- π ValidaciΓ³n de seguridad: Rechaza extensiones prohibidas (.exe, .bat, .js, .php, .sh)
- ποΈ ValidaciΓ³n de ZIP: Escanea contenido de archivos ZIP antes de subir
- π₯ GestiΓ³n de usuarios y grupos (solo administradores)
- π Seguridad: Cada usuario solo ve sus propios archivos
- π Dashboard con estadΓsticas de uso de almacenamiento en tiempo real
- β‘ ValidaciΓ³n AJAX: ValidaciΓ³n de archivos antes de enviar el formulario con SweetAlert2
- Backend: Symfony 7.x + PHP 8.2
- ORM: Doctrine
- Admin Panel: EasyAdmin Bundle 4
- Frontend: Stimulus + Turbo + Tailwind CSS
- JavaScript: Axios + SweetAlert2
- Base de datos: PostgreSQL 16
- ContainerizaciΓ³n: Docker + Docker Compose + FrankenPHP
- Docker >= 20.10
- Docker Compose >= 2.0
- Node.js >= 18.x (para compilar assets)
- npm >= 9.x
- Git
git clone https://github.com/saulmoralespa/files-dashboard
cd files-dashboardcomposer installNota: Necesitas tener Composer instalado localmente. Si no lo tienes, puedes instalarlo desde getcomposer.org o usar Docker en el Paso 5.
# Copiar archivo de configuraciΓ³n
cp .env.setup .envEditar el archivo .env con tus configuraciones:
# Entorno de aplicaciΓ³n
APP_ENV=dev
APP_SECRET=your-secret-key-here-change-this (opcional en desarrollo)
# ConfiguraciΓ³n de base de datos
DATABASE_URL="postgresql://app:!ChangeMe!@database:5432/app?serverVersion=16&charset=utf8"ParΓ‘metros importantes a revisar:
APP_SECRET: Genera una clave ΓΊnica conopenssl rand -hex 32(opcional en desarrollo)DATABASE_URL: Ajusta usuario, contraseΓ±a y nombre de BD si es necesario- Para producciΓ³n, cambia
APP_ENV=prod
# Instalar dependencias
npm install
# Compilar assets para desarrollo
npm run devPara desarrollo con watch mode:
npm run watch# Construir imΓ‘genes y levantar servicios
docker compose up -d --build
# Verificar que los contenedores estΓ©n corriendo
docker compose psDeberΓas ver:
NAME STATUS
files-dashboard-php Up
files-dashboard-db Up
π‘ Alternativa: Si no instalaste Composer en el Paso 2, puedes hacerlo ahora dentro del contenedor:
docker compose exec php composer install
# Crear base de datos
docker compose exec php bin/console doctrine:database:create --if-not-exists
# Ejecutar migraciones
docker compose exec php bin/console doctrine:migrations:migrate --no-interaction
# Cargar datos de prueba (fixtures)
docker compose exec php bin/console doctrine:fixtures:load --no-interactionAccede a: https://localhost
Si todo estΓ‘ correcto, deberΓas ver la pΓ‘gina de login.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USERS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β id INT PRIMARY KEY AUTO_INCREMENT β
β email VARCHAR(180) UNIQUE NOT NULL β
β roles JSON NOT NULL β
β password VARCHAR(255) NOT NULL β
β quota BIGINT DEFAULT 10 NOT NULL (Cuota en MB) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β 1:N
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FILE_UPLOAD β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β id INT PRIMARY KEY AUTO_INCREMENT β
β user_id INT NOT NULL FOREIGN KEY β users(id) β
β filename VARCHAR(255) NOT NULL (Nombre generado) β
β original_name VARCHAR(255) NOT NULL (Nombre original) β
β size BIGINT NOT NULL (TamaΓ±o en bytes) β
β mime VARCHAR(255) NOT NULL (Tipo MIME) β
β created_at TIMESTAMP NOT NULL β
β updated_at TIMESTAMP NOT NULL β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GROUP β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β id INT PRIMARY KEY AUTO_INCREMENT β
β name VARCHAR(255) NOT NULL β
β quota BIGINT NOT NULL (Cuota en MB) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β N:M (group_user)
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GROUP_USER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β group_id INT FOREIGN KEY β group(id) β
β user_id INT FOREIGN KEY β users(id) β
β PRIMARY KEY (group_id, user_id) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- User β FileUpload: Un usuario tiene muchos archivos (1:N)
- User β Group: RelaciΓ³n muchos a muchos (N:M)
- Sistema de Cuotas:
- Si usuario pertenece a grupo β usa
group.quota - Si no pertenece a grupo β usa
user.quota(default: 10 MB)
- Si usuario pertenece a grupo β usa
- Panel de administraciΓ³n: http://localhost/admin
- Login: http://localhost/login
DespuΓ©s de cargar los fixtures (doctrine:fixtures:load):
- Email:
[email protected] - ContraseΓ±a:
pass#123 - Permisos: Acceso total (usuarios, grupos, archivos de todos)
- Email:
[email protected] - ContraseΓ±a:
pass#123 - Permisos: Solo gestiΓ³n de sus propios archivos
- Cuota individual: Cada usuario tiene una cuota (default: 10 MB)
- Cuota por grupo: Si un usuario pertenece a un grupo, hereda la cuota del grupo (tiene prioridad)
- ValidaciΓ³n: Antes de subir:
(uso_actual + archivo_nuevo) <= cuota - Feedback visual:
- Barra de progreso con colores
- π’ Verde (<70%), π Naranja (70-90%), π΄ Rojo (>90%)
| SituaciΓ³n | Cuota Asignada |
|---|---|
| Usuario sin grupo | 10 MB (default) |
| Usuario con cuota individual de 50 MB | 50 MB |
| Usuario en "Grupo Premium" (100 MB) | 100 MB β (grupo tiene prioridad) |
Por seguridad, NO se permiten las siguientes extensiones:
.exe .bat .js .php .sh
El sistema escanea el contenido de archivos ZIP antes de subirlos:
- β Si el ZIP solo contiene documentos β Subida permitida
- β Si el ZIP contiene
.exe,.bat, etc. β Subida bloqueada
Ejemplo de validaciΓ³n:
usuario selecciona archivo.zip
β
Sistema valida:
1. ExtensiΓ³n del ZIP β
2. TamaΓ±o vs cuota β
3. Abre el ZIP
4. Escanea archivos internos
5. Detecta: virus.exe β
β
Alerta: "ZIP contiene archivos prohibidos: virus.exe"
Campo se limpia automΓ‘ticamente
- Login como admin
- Ir a
/adminβ "Grupos" β "Crear Grupo" - Ingresar:
- Nombre: Ej. "Equipo Marketing"
- Cuota (MB): Ej. 100
- Guardar
- Login como admin
- Ir a
/adminβ "Usuarios" β "Crear Usuario" - Completar formulario:
- Email: [email protected]
- Cuota Individual (MB): 10 (o personalizar)
- Grupos: Seleccionar grupo (opcional)
- Password: contraseΓ±a segura
- Roles: Seleccionar
ROLE_USER
- Guardar
- Editar usuario existente
- Campo "Grupos" β Seleccionar grupo
- Guardar
Resultado: El usuario hereda la cuota del grupo automΓ‘ticamente.
-
Ver archivos:
/adminβ "Mis Archivos"- Dashboard muestra estadΓsticas de uso
-
Subir archivo:
- Click "Subir Nuevo Archivo"
- Seleccionar archivo
- Sistema valida:
- β ExtensiΓ³n permitida
- β Cuota disponible
- β Contenido de ZIP (si aplica)
- Alerta de Γ©xito o error
-
Eliminar archivo:
- Click en ποΈ
- Espacio se libera automΓ‘ticamente
- Ven todos los archivos de todos los usuarios
- Pueden eliminar cualquier archivo
- Ven el propietario de cada archivo
# Ver logs en tiempo real
docker compose logs -f
# Logs del contenedor PHP
docker compose logs -f php
# Detener contenedores
docker compose down
# Detener y eliminar volΓΊmenes (β οΈ borra la BD)
docker compose down -v
# Reiniciar servicio
docker compose restart php
# Acceder al contenedor PHP
docker compose exec php bash
# Acceder a PostgreSQL
docker compose exec database psql -U app -d app# Limpiar cachΓ©
docker compose exec php bin/console cache:clear
# Ver rutas disponibles
docker compose exec php bin/console debug:router
# Crear nueva migraciΓ³n
docker compose exec php bin/console make:migration
# Ejecutar migraciones
docker compose exec php bin/console doctrine:migrations:migrate
# Recargar fixtures (β οΈ borra datos)
docker compose exec php bin/console doctrine:fixtures:load# Compilar assets en desarrollo
npm run dev
# Watch mode (recompila automΓ‘ticamente)
npm run watch
# Build para producciΓ³n
npm run build# Limpiar cachΓ©
make cache-clear
# Ver logs
make logs-php
# Ejecutar migraciones
make db-migrate
# Acceder al shell
make shell