https://github.com/earhackerdem/clase4
Laravel 12 con Docker: MySQL 8.4, Redis, Nginx, phpMyAdmin y Mailpit. Incluye configuración de slow query logging para optimización de base de datos.
https://github.com/earhackerdem/clase4
development-environment docker laravel laravel12 mailpit mysql nginx php8 phpmyadmin redis slow-query-log
Last synced: about 2 months ago
JSON representation
Laravel 12 con Docker: MySQL 8.4, Redis, Nginx, phpMyAdmin y Mailpit. Incluye configuración de slow query logging para optimización de base de datos.
- Host: GitHub
- URL: https://github.com/earhackerdem/clase4
- Owner: earhackerdem
- Created: 2025-10-18T20:54:24.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-10-25T02:07:47.000Z (8 months ago)
- Last Synced: 2025-10-27T14:38:26.343Z (7 months ago)
- Topics: development-environment, docker, laravel, laravel12, mailpit, mysql, nginx, php8, phpmyadmin, redis, slow-query-log
- Language: Blade
- Size: 177 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Laravel 12 - Entorno de Desarrollo con Docker
Proyecto Laravel 12 configurado con Docker, MySQL 8.4, Redis, Nginx, phpMyAdmin y Mailpit.
## Inicio Rápido
```bash
git clone https://github.com/earhackerdem/clase4
cd clase4
chmod +x docker-setup.sh
./docker-setup.sh
```
Accede a:
- **Laravel**: http://localhost:8000
- **phpMyAdmin**: http://localhost:8080
- **Mailpit**: http://localhost:8025
## Stack Tecnológico
- **Laravel**: 12.x
- **PHP**: 8.3-FPM
- **MySQL**: 8.4 LTS
- **Redis**: 7 Alpine
- **Nginx**: Latest Alpine
- **phpMyAdmin**: Latest
- **Mailpit**: Latest (captura de emails)
## Características
### MySQL con Logging de Queries Lentas
El entorno está configurado para registrar queries lentas automáticamente:
- **Umbral**: 1 segundo (`long_query_time = 1`)
- **Log de queries sin índices**: Activado
- **Performance Schema**: Habilitado para análisis avanzado
- **Ubicación del log**: `storage/logs/mysql/slow-query.log`
### Servicios Adicionales
- **phpMyAdmin**: Administración visual de MySQL en `http://localhost:8080`
- **Mailpit**: Captura de emails de desarrollo en `http://localhost:8025`
- **Redis**: Para cache, sesiones y colas
## Requisitos Previos
- Docker (versión 20.10 o superior)
- Docker Compose v2 (integrado con Docker)
- Make (opcional, pero recomendado)
> **Nota**: Este proyecto usa `docker compose` (v2, sin guión) en lugar de `docker-compose` (v1, legacy). Es totalmente compatible con **Linux, macOS y WSL2**. El script de setup detecta automáticamente el sistema operativo y configura los permisos correctamente.
## Instalación Rápida (Recomendada)
### Opción 1: Setup Automatizado
El script `docker-setup.sh` configura todo automáticamente:
```bash
# 1. Clonar el repositorio
git clone https://github.com/earhackerdem/clase4
cd clase4
# 2. Ejecutar el script de setup
chmod +x docker-setup.sh
./docker-setup.sh
```
El script realizará automáticamente:
- ✅ Verificación de Docker y Docker Compose
- ✅ Detección automática de UID/GID del usuario
- ✅ Creación de `.env` desde `.env.example`
- ✅ Configuración de permisos correctos
- ✅ Construcción de imágenes Docker
- ✅ Levantamiento de contenedores
- ✅ Instalación de dependencias de Composer
- ✅ Generación de `APP_KEY`
- ✅ Ejecución de migraciones y seeders
- ✅ Optimización de la aplicación
Después de la ejecución exitosa, la aplicación estará lista en:
- **Laravel**: http://localhost:8000
- **phpMyAdmin**: http://localhost:8080
- **Mailpit**: http://localhost:8025
### Opción 2: Instalación Manual
Si prefieres configurar manualmente:
#### 1. Clonar el repositorio
```bash
git clone https://github.com/earhackerdem/clase4
cd clase4
```
#### 2. Configurar variables de entorno
```bash
# Copiar archivo de ejemplo
cp .env.example .env
# Configurar UID/GID para permisos correctos (Linux/WSL)
echo "UID=$(id -u)" >> .env
echo "GID=$(id -g)" >> .env
```
#### 3. Levantar el entorno
Con Make:
```bash
make build # Construir imágenes
make up # Levantar contenedores
make composer install # Instalar dependencias
make artisan key:generate # Generar APP_KEY
make migrate-seed # Ejecutar migraciones y seeders
```
Sin Make (usando `docker compose`):
```bash
docker compose build
docker compose up -d
docker compose exec app composer install
docker compose exec app php artisan key:generate
docker compose exec app php artisan migrate --seed
```
#### 4. Acceder a la aplicación
- **Aplicación Laravel**: http://localhost:8000
- **phpMyAdmin**: http://localhost:8080
- Usuario: `root`
- Contraseña: `password`
- **Mailpit (UI)**: http://localhost:8025
## Comandos Make Disponibles
### Gestión de Contenedores
```bash
make help # Mostrar todos los comandos disponibles
make build # Construir los contenedores
make up # Levantar los contenedores
make down # Detener los contenedores
make restart # Reiniciar los contenedores
make logs # Ver logs de todos los servicios
make logs-app # Ver logs de la aplicación
make logs-mysql # Ver logs de MySQL
make logs-nginx # Ver logs de Nginx
```
### Acceso a Contenedores
```bash
make shell # Acceder al shell del contenedor (usuario laravel)
make shell-root # Acceder al shell como root
make mysql # Acceder al cliente MySQL
make mysql-root # Acceder a MySQL como root
make redis-cli # Acceder al cliente Redis
```
### Laravel & Artisan
```bash
make composer install # Ejecutar composer install
make composer require vendor/package # Añadir paquete
make artisan make:model Post # Crear modelo
make artisan route:list # Listar rutas
make migrate # Ejecutar migraciones
make migrate-fresh # Recrear BD y migrar
make seed # Ejecutar seeders
make migrate-seed # Migrar y poblar
make test # Ejecutar tests
make pint # Formatear código (Laravel Pint)
make pint-test # Verificar código sin modificar
```
### Cache y Optimización
```bash
make cache-clear # Limpiar todas las cachés
make optimize # Optimizar la aplicación
make optimize-clear # Limpiar optimizaciones
```
### Colas
```bash
make queue-work # Ejecutar queue worker
make queue-listen # Escuchar cola en tiempo real
```
### MySQL - Monitoreo de Queries Lentas
```bash
make test-slow-query # Generar query lenta de prueba (2 segundos por defecto)
make test-slow-query SECONDS=5 # Generar query lenta personalizada (5 segundos)
make slow-queries # Ver últimas 50 líneas del log de queries lentas
make mysql-status # Ver estado y configuración de slow queries
make mysql-processlist # Ver procesos activos de MySQL
```
### Instalación Completa
```bash
make fresh-install # Build + Up + Migrate + Seed
```
## Monitoreo de Queries Lentas
### Ver Queries Lentas
```bash
# Desde el host
make slow-queries
# O directamente
tail -f storage/logs/mysql/slow-query.log
```
### Analizar Queries con Performance Schema
```bash
# Acceder a MySQL
make mysql-root
# Ver queries más lentas
SELECT
DIGEST_TEXT as query,
COUNT_STAR as exec_count,
AVG_TIMER_WAIT/1000000000000 as avg_time_sec,
MAX_TIMER_WAIT/1000000000000 as max_time_sec
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
ORDER BY AVG_TIMER_WAIT DESC
LIMIT 10;
```
### Verificar Configuración de Slow Query Log
```bash
make mysql-status
# O manualmente
docker compose exec mysql mysql -u root -ppassword -e "
SHOW VARIABLES LIKE '%slow%';
SHOW STATUS LIKE '%Slow_queries%';
"
```
## Script de Setup Automatizado
El proyecto incluye un script bash (`docker-setup.sh`) que automatiza toda la configuración inicial:
### Características del Script
1. **Verificación de Dependencias**
- Verifica que Docker esté corriendo
- Verifica que Docker Compose v2 esté instalado
2. **Configuración Automática de Permisos**
- Detecta automáticamente el UID y GID del usuario actual
- Actualiza el archivo `.env` con los valores correctos
- Evita problemas de permisos en Linux/WSL
3. **Configuración del Entorno**
- Copia `.env.example` a `.env` si no existe
- Crea todos los directorios necesarios
- Configura permisos correctos para `storage/` y `bootstrap/cache/`
4. **Construcción y Despliegue**
- Construye las imágenes Docker con cache limpio
- Levanta todos los contenedores
- Espera a que MySQL esté listo (con timeout de 60 segundos)
5. **Configuración de Laravel**
- Instala dependencias de Composer
- Genera `APP_KEY` automáticamente
- Ejecuta migraciones y seeders
- Limpia y optimiza cachés
### Uso del Script
```bash
# Dar permisos de ejecución (solo la primera vez)
chmod +x docker-setup.sh
# Ejecutar
./docker-setup.sh
```
### Salida del Script
El script muestra progreso en 12 pasos con indicadores visuales:
```
[1/12] Verificando Docker...
[2/12] Verificando Docker Compose...
[3/12] Detectando UID y GID del usuario...
[4/12] Configurando archivo .env...
[5/12] Creando directorios necesarios...
[6/12] Deteniendo contenedores previos...
[7/12] Construyendo imágenes Docker...
[8/12] Levantando contenedores...
[9/12] Esperando a que MySQL esté listo...
[10/12] Instalando dependencias de Composer...
[11/12] Generando APP_KEY...
[12/12] Ejecutando migraciones y seeders...
```
Al finalizar, muestra las URLs de acceso y comandos útiles.
## Estructura del Proyecto
```
clase4/
├── docker/
│ ├── mysql/
│ │ └── my.cnf # Configuración MySQL con slow query log
│ ├── nginx/
│ │ └── default.conf # Configuración Nginx
│ └── php/
│ ├── php.ini # Configuración PHP
│ └── opcache.ini # Configuración OPcache
├── storage/
│ └── logs/
│ └── mysql/ # Logs de MySQL (slow-query.log)
├── docker-compose.yml # Definición de servicios Docker
├── Dockerfile # Imagen PHP personalizada
├── docker-setup.sh # Script de configuración automatizada
├── Makefile # Comandos útiles (usa docker compose v2)
└── README.md # Esta documentación
```
## Configuración de MySQL
### Slow Query Log
El slow query log está configurado en `docker/mysql/my.cnf`:
```ini
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 1 # Queries que toman > 1 segundo
log_queries_not_using_indexes = 1 # Log queries sin índices
```
### Performance Schema
El Performance Schema está habilitado para análisis avanzado:
```ini
performance_schema = ON
performance-schema-instrument = 'statement/%=ON'
performance-schema-consumer-events-statements-history-long = ON
```
## Solución de Problemas
### Comando docker-compose no encontrado
Este proyecto usa `docker compose` (v2) en lugar de `docker-compose` (v1). Si obtienes un error:
```bash
# ❌ No usar (versión legacy)
docker-compose up
# ✅ Usar (versión moderna)
docker compose up
```
Si necesitas instalar Docker Compose v2:
- **Linux/WSL**: Instala Docker Desktop o el plugin de Compose v2
- **macOS**: Actualiza Docker Desktop
- Más info: https://docs.docker.com/compose/install/
### Permisos en Linux/WSL/macOS
**Solución Automática** (Recomendada):
```bash
# El script detecta automáticamente tu sistema operativo (Linux/macOS/WSL)
# y configura UID/GID correctamente
./docker-setup.sh
```
**Solución Manual**:
Si tienes problemas de permisos, ajusta UID/GID en `.env`:
```bash
# Obtener tu UID/GID
id -u # UID
id -g # GID
# Actualizar .env (Linux/WSL)
sed -i "s/^UID=.*/UID=$(id -u)/" .env
sed -i "s/^GID=.*/GID=$(id -g)/" .env
# Actualizar .env (macOS)
sed -i '' "s/^UID=.*/UID=$(id -u)/" .env
sed -i '' "s/^GID=.*/GID=$(id -g)/" .env
# Reconstruir
make down
make build
make up
```
> **Nota**: El script `docker-setup.sh` detecta automáticamente tu sistema operativo y usa la sintaxis correcta de `sed` para cada plataforma.
### Permisos de Logs de MySQL
Si no puedes leer los logs de MySQL sin `sudo`:
```bash
# Opción 1: Usar el comando make
make fix-permissions
# Opción 2: Re-ejecutar el script de setup
./docker-setup.sh
# Opción 3: Leer desde el contenedor (siempre funciona)
docker compose exec mysql cat /var/log/mysql/slow-query.log
```
**Nota**: El script `docker-setup.sh` ajusta automáticamente los permisos durante la instalación inicial.
### Puerto Ocupado
Si un puerto está ocupado, modifica en `.env`:
```bash
APP_PORT=8001 # En lugar de 8000
PHPMYADMIN_PORT=8081 # En lugar de 8080
```
### Ver Logs de Errores
```bash
# Logs de la aplicación
make logs-app
# Logs de MySQL
make logs-mysql
# Logs de Nginx
make logs-nginx
# Logs de Laravel
tail -f storage/logs/laravel.log
```
### Base de Datos No Conecta
```bash
# Verificar que MySQL esté saludable
docker compose ps
# Reintentar conexión
make restart
make migrate
```
### Limpiar Todo y Empezar de Nuevo
```bash
# Opción 1: Reinstalación automática
./docker-setup.sh
# Opción 2: Manual
make down
docker compose down -v # Incluye volúmenes
make fresh-install
# Opción 3: Limpieza completa con volúmenes
docker compose down -v --remove-orphans
rm -rf vendor storage/logs/* bootstrap/cache/*
./docker-setup.sh
```
## Testing de Queries Lentas
Para probar el logging de queries lentas, usa el comando Make:
```bash
# Generar query lenta de 2 segundos (por defecto)
make test-slow-query
# Generar query lenta personalizada
make test-slow-query SECONDS=3
make test-slow-query SECONDS=10
# Ver el resultado en el log
make slow-queries
```
También puedes hacerlo manualmente:
```bash
# Vía tinker
make shell
php artisan tinker
DB::statement('SELECT SLEEP(2)');
exit
# O directamente desde MySQL
make mysql
SELECT SLEEP(3);
exit
```
## Variables de Entorno Importantes
```env
# Base de datos
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
# Mail (Mailpit)
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
# Puertos Docker
APP_PORT=8000
PHPMYADMIN_PORT=8080
MAILPIT_UI_PORT=8025
```
## Recursos Adicionales
- [Documentación Laravel 12](https://laravel.com/docs/12.x)
- [MySQL 8.4 Slow Query Log](https://dev.mysql.com/doc/refman/8.4/en/slow-query-log.html)
- [MySQL Performance Schema](https://dev.mysql.com/doc/refman/8.4/en/performance-schema.html)
- [Docker Compose](https://docs.docker.com/compose/)
## Licencia
Este proyecto está bajo la licencia MIT, al igual que Laravel.