{"id":32497314,"url":"https://github.com/earhackerdem/clase4","last_synced_at":"2026-04-14T05:33:51.803Z","repository":{"id":319534116,"uuid":"1078985229","full_name":"earhackerdem/clase4","owner":"earhackerdem","description":"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.","archived":false,"fork":false,"pushed_at":"2025-10-25T02:07:47.000Z","size":181,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-27T14:38:26.343Z","etag":null,"topics":["development-environment","docker","laravel","laravel12","mailpit","mysql","nginx","php8","phpmyadmin","redis","slow-query-log"],"latest_commit_sha":null,"homepage":null,"language":"Blade","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/earhackerdem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-18T20:54:24.000Z","updated_at":"2025-10-25T02:07:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"2fa6a018-16c6-4d7f-b6c8-83ea37d99cbe","html_url":"https://github.com/earhackerdem/clase4","commit_stats":null,"previous_names":["earhackerdem/clase4"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/earhackerdem/clase4","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earhackerdem%2Fclase4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earhackerdem%2Fclase4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earhackerdem%2Fclase4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earhackerdem%2Fclase4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/earhackerdem","download_url":"https://codeload.github.com/earhackerdem/clase4/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earhackerdem%2Fclase4/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31784253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["development-environment","docker","laravel","laravel12","mailpit","mysql","nginx","php8","phpmyadmin","redis","slow-query-log"],"created_at":"2025-10-27T14:27:39.884Z","updated_at":"2026-04-14T05:33:51.789Z","avatar_url":"https://github.com/earhackerdem.png","language":"Blade","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Laravel 12 - Entorno de Desarrollo con Docker\n\nProyecto Laravel 12 configurado con Docker, MySQL 8.4, Redis, Nginx, phpMyAdmin y Mailpit.\n\n## Inicio Rápido\n\n```bash\ngit clone https://github.com/earhackerdem/clase4\ncd clase4\nchmod +x docker-setup.sh\n./docker-setup.sh\n```\n\nAccede a:\n- **Laravel**: http://localhost:8000\n- **phpMyAdmin**: http://localhost:8080\n- **Mailpit**: http://localhost:8025\n\n## Stack Tecnológico\n\n- **Laravel**: 12.x\n- **PHP**: 8.3-FPM\n- **MySQL**: 8.4 LTS\n- **Redis**: 7 Alpine\n- **Nginx**: Latest Alpine\n- **phpMyAdmin**: Latest\n- **Mailpit**: Latest (captura de emails)\n\n## Características\n\n### MySQL con Logging de Queries Lentas\n\nEl entorno está configurado para registrar queries lentas automáticamente:\n\n- **Umbral**: 1 segundo (`long_query_time = 1`)\n- **Log de queries sin índices**: Activado\n- **Performance Schema**: Habilitado para análisis avanzado\n- **Ubicación del log**: `storage/logs/mysql/slow-query.log`\n\n### Servicios Adicionales\n\n- **phpMyAdmin**: Administración visual de MySQL en `http://localhost:8080`\n- **Mailpit**: Captura de emails de desarrollo en `http://localhost:8025`\n- **Redis**: Para cache, sesiones y colas\n\n## Requisitos Previos\n\n- Docker (versión 20.10 o superior)\n- Docker Compose v2 (integrado con Docker)\n- Make (opcional, pero recomendado)\n\n\u003e **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.\n\n## Instalación Rápida (Recomendada)\n\n### Opción 1: Setup Automatizado\n\nEl script `docker-setup.sh` configura todo automáticamente:\n\n```bash\n# 1. Clonar el repositorio\ngit clone https://github.com/earhackerdem/clase4\ncd clase4\n\n# 2. Ejecutar el script de setup\nchmod +x docker-setup.sh\n./docker-setup.sh\n```\n\nEl script realizará automáticamente:\n- ✅ Verificación de Docker y Docker Compose\n- ✅ Detección automática de UID/GID del usuario\n- ✅ Creación de `.env` desde `.env.example`\n- ✅ Configuración de permisos correctos\n- ✅ Construcción de imágenes Docker\n- ✅ Levantamiento de contenedores\n- ✅ Instalación de dependencias de Composer\n- ✅ Generación de `APP_KEY`\n- ✅ Ejecución de migraciones y seeders\n- ✅ Optimización de la aplicación\n\nDespués de la ejecución exitosa, la aplicación estará lista en:\n- **Laravel**: http://localhost:8000\n- **phpMyAdmin**: http://localhost:8080\n- **Mailpit**: http://localhost:8025\n\n### Opción 2: Instalación Manual\n\nSi prefieres configurar manualmente:\n\n#### 1. Clonar el repositorio\n\n```bash\ngit clone https://github.com/earhackerdem/clase4\ncd clase4\n```\n\n#### 2. Configurar variables de entorno\n\n```bash\n# Copiar archivo de ejemplo\ncp .env.example .env\n\n# Configurar UID/GID para permisos correctos (Linux/WSL)\necho \"UID=$(id -u)\" \u003e\u003e .env\necho \"GID=$(id -g)\" \u003e\u003e .env\n```\n\n#### 3. Levantar el entorno\n\nCon Make:\n```bash\nmake build              # Construir imágenes\nmake up                 # Levantar contenedores\nmake composer install   # Instalar dependencias\nmake artisan key:generate  # Generar APP_KEY\nmake migrate-seed       # Ejecutar migraciones y seeders\n```\n\nSin Make (usando `docker compose`):\n```bash\ndocker compose build\ndocker compose up -d\ndocker compose exec app composer install\ndocker compose exec app php artisan key:generate\ndocker compose exec app php artisan migrate --seed\n```\n\n#### 4. Acceder a la aplicación\n\n- **Aplicación Laravel**: http://localhost:8000\n- **phpMyAdmin**: http://localhost:8080\n  - Usuario: `root`\n  - Contraseña: `password`\n- **Mailpit (UI)**: http://localhost:8025\n\n## Comandos Make Disponibles\n\n### Gestión de Contenedores\n\n```bash\nmake help          # Mostrar todos los comandos disponibles\nmake build         # Construir los contenedores\nmake up            # Levantar los contenedores\nmake down          # Detener los contenedores\nmake restart       # Reiniciar los contenedores\nmake logs          # Ver logs de todos los servicios\nmake logs-app      # Ver logs de la aplicación\nmake logs-mysql    # Ver logs de MySQL\nmake logs-nginx    # Ver logs de Nginx\n```\n\n### Acceso a Contenedores\n\n```bash\nmake shell         # Acceder al shell del contenedor (usuario laravel)\nmake shell-root    # Acceder al shell como root\nmake mysql         # Acceder al cliente MySQL\nmake mysql-root    # Acceder a MySQL como root\nmake redis-cli     # Acceder al cliente Redis\n```\n\n### Laravel \u0026 Artisan\n\n```bash\nmake composer install               # Ejecutar composer install\nmake composer require vendor/package  # Añadir paquete\nmake artisan make:model Post        # Crear modelo\nmake artisan route:list             # Listar rutas\nmake migrate                        # Ejecutar migraciones\nmake migrate-fresh                  # Recrear BD y migrar\nmake seed                           # Ejecutar seeders\nmake migrate-seed                   # Migrar y poblar\nmake test                           # Ejecutar tests\nmake pint                           # Formatear código (Laravel Pint)\nmake pint-test                      # Verificar código sin modificar\n```\n\n### Cache y Optimización\n\n```bash\nmake cache-clear     # Limpiar todas las cachés\nmake optimize        # Optimizar la aplicación\nmake optimize-clear  # Limpiar optimizaciones\n```\n\n### Colas\n\n```bash\nmake queue-work      # Ejecutar queue worker\nmake queue-listen    # Escuchar cola en tiempo real\n```\n\n### MySQL - Monitoreo de Queries Lentas\n\n```bash\nmake test-slow-query           # Generar query lenta de prueba (2 segundos por defecto)\nmake test-slow-query SECONDS=5 # Generar query lenta personalizada (5 segundos)\nmake slow-queries              # Ver últimas 50 líneas del log de queries lentas\nmake mysql-status              # Ver estado y configuración de slow queries\nmake mysql-processlist         # Ver procesos activos de MySQL\n```\n\n### Instalación Completa\n\n```bash\nmake fresh-install   # Build + Up + Migrate + Seed\n```\n\n## Monitoreo de Queries Lentas\n\n### Ver Queries Lentas\n\n```bash\n# Desde el host\nmake slow-queries\n\n# O directamente\ntail -f storage/logs/mysql/slow-query.log\n```\n\n### Analizar Queries con Performance Schema\n\n```bash\n# Acceder a MySQL\nmake mysql-root\n\n# Ver queries más lentas\nSELECT\n    DIGEST_TEXT as query,\n    COUNT_STAR as exec_count,\n    AVG_TIMER_WAIT/1000000000000 as avg_time_sec,\n    MAX_TIMER_WAIT/1000000000000 as max_time_sec\nFROM performance_schema.events_statements_summary_by_digest\nWHERE DIGEST_TEXT IS NOT NULL\nORDER BY AVG_TIMER_WAIT DESC\nLIMIT 10;\n```\n\n### Verificar Configuración de Slow Query Log\n\n```bash\nmake mysql-status\n\n# O manualmente\ndocker compose exec mysql mysql -u root -ppassword -e \"\n    SHOW VARIABLES LIKE '%slow%';\n    SHOW STATUS LIKE '%Slow_queries%';\n\"\n```\n\n## Script de Setup Automatizado\n\nEl proyecto incluye un script bash (`docker-setup.sh`) que automatiza toda la configuración inicial:\n\n### Características del Script\n\n1. **Verificación de Dependencias**\n   - Verifica que Docker esté corriendo\n   - Verifica que Docker Compose v2 esté instalado\n\n2. **Configuración Automática de Permisos**\n   - Detecta automáticamente el UID y GID del usuario actual\n   - Actualiza el archivo `.env` con los valores correctos\n   - Evita problemas de permisos en Linux/WSL\n\n3. **Configuración del Entorno**\n   - Copia `.env.example` a `.env` si no existe\n   - Crea todos los directorios necesarios\n   - Configura permisos correctos para `storage/` y `bootstrap/cache/`\n\n4. **Construcción y Despliegue**\n   - Construye las imágenes Docker con cache limpio\n   - Levanta todos los contenedores\n   - Espera a que MySQL esté listo (con timeout de 60 segundos)\n\n5. **Configuración de Laravel**\n   - Instala dependencias de Composer\n   - Genera `APP_KEY` automáticamente\n   - Ejecuta migraciones y seeders\n   - Limpia y optimiza cachés\n\n### Uso del Script\n\n```bash\n# Dar permisos de ejecución (solo la primera vez)\nchmod +x docker-setup.sh\n\n# Ejecutar\n./docker-setup.sh\n```\n\n### Salida del Script\n\nEl script muestra progreso en 12 pasos con indicadores visuales:\n```\n[1/12] Verificando Docker...\n[2/12] Verificando Docker Compose...\n[3/12] Detectando UID y GID del usuario...\n[4/12] Configurando archivo .env...\n[5/12] Creando directorios necesarios...\n[6/12] Deteniendo contenedores previos...\n[7/12] Construyendo imágenes Docker...\n[8/12] Levantando contenedores...\n[9/12] Esperando a que MySQL esté listo...\n[10/12] Instalando dependencias de Composer...\n[11/12] Generando APP_KEY...\n[12/12] Ejecutando migraciones y seeders...\n```\n\nAl finalizar, muestra las URLs de acceso y comandos útiles.\n\n## Estructura del Proyecto\n\n```\nclase4/\n├── docker/\n│   ├── mysql/\n│   │   └── my.cnf              # Configuración MySQL con slow query log\n│   ├── nginx/\n│   │   └── default.conf        # Configuración Nginx\n│   └── php/\n│       ├── php.ini             # Configuración PHP\n│       └── opcache.ini         # Configuración OPcache\n├── storage/\n│   └── logs/\n│       └── mysql/              # Logs de MySQL (slow-query.log)\n├── docker-compose.yml          # Definición de servicios Docker\n├── Dockerfile                  # Imagen PHP personalizada\n├── docker-setup.sh             # Script de configuración automatizada\n├── Makefile                    # Comandos útiles (usa docker compose v2)\n└── README.md                   # Esta documentación\n```\n\n## Configuración de MySQL\n\n### Slow Query Log\n\nEl slow query log está configurado en `docker/mysql/my.cnf`:\n\n```ini\nslow_query_log = 1\nslow_query_log_file = /var/log/mysql/slow-query.log\nlong_query_time = 1                    # Queries que toman \u003e 1 segundo\nlog_queries_not_using_indexes = 1      # Log queries sin índices\n```\n\n### Performance Schema\n\nEl Performance Schema está habilitado para análisis avanzado:\n\n```ini\nperformance_schema = ON\nperformance-schema-instrument = 'statement/%=ON'\nperformance-schema-consumer-events-statements-history-long = ON\n```\n\n## Solución de Problemas\n\n### Comando docker-compose no encontrado\n\nEste proyecto usa `docker compose` (v2) en lugar de `docker-compose` (v1). Si obtienes un error:\n\n```bash\n# ❌ No usar (versión legacy)\ndocker-compose up\n\n# ✅ Usar (versión moderna)\ndocker compose up\n```\n\nSi necesitas instalar Docker Compose v2:\n- **Linux/WSL**: Instala Docker Desktop o el plugin de Compose v2\n- **macOS**: Actualiza Docker Desktop\n- Más info: https://docs.docker.com/compose/install/\n\n### Permisos en Linux/WSL/macOS\n\n**Solución Automática** (Recomendada):\n```bash\n# El script detecta automáticamente tu sistema operativo (Linux/macOS/WSL)\n# y configura UID/GID correctamente\n./docker-setup.sh\n```\n\n**Solución Manual**:\nSi tienes problemas de permisos, ajusta UID/GID en `.env`:\n\n```bash\n# Obtener tu UID/GID\nid -u  # UID\nid -g  # GID\n\n# Actualizar .env (Linux/WSL)\nsed -i \"s/^UID=.*/UID=$(id -u)/\" .env\nsed -i \"s/^GID=.*/GID=$(id -g)/\" .env\n\n# Actualizar .env (macOS)\nsed -i '' \"s/^UID=.*/UID=$(id -u)/\" .env\nsed -i '' \"s/^GID=.*/GID=$(id -g)/\" .env\n\n# Reconstruir\nmake down\nmake build\nmake up\n```\n\n\u003e **Nota**: El script `docker-setup.sh` detecta automáticamente tu sistema operativo y usa la sintaxis correcta de `sed` para cada plataforma.\n\n### Permisos de Logs de MySQL\n\nSi no puedes leer los logs de MySQL sin `sudo`:\n\n```bash\n# Opción 1: Usar el comando make\nmake fix-permissions\n\n# Opción 2: Re-ejecutar el script de setup\n./docker-setup.sh\n\n# Opción 3: Leer desde el contenedor (siempre funciona)\ndocker compose exec mysql cat /var/log/mysql/slow-query.log\n```\n\n**Nota**: El script `docker-setup.sh` ajusta automáticamente los permisos durante la instalación inicial.\n\n### Puerto Ocupado\n\nSi un puerto está ocupado, modifica en `.env`:\n\n```bash\nAPP_PORT=8001           # En lugar de 8000\nPHPMYADMIN_PORT=8081    # En lugar de 8080\n```\n\n### Ver Logs de Errores\n\n```bash\n# Logs de la aplicación\nmake logs-app\n\n# Logs de MySQL\nmake logs-mysql\n\n# Logs de Nginx\nmake logs-nginx\n\n# Logs de Laravel\ntail -f storage/logs/laravel.log\n```\n\n### Base de Datos No Conecta\n\n```bash\n# Verificar que MySQL esté saludable\ndocker compose ps\n\n# Reintentar conexión\nmake restart\nmake migrate\n```\n\n### Limpiar Todo y Empezar de Nuevo\n\n```bash\n# Opción 1: Reinstalación automática\n./docker-setup.sh\n\n# Opción 2: Manual\nmake down\ndocker compose down -v  # Incluye volúmenes\nmake fresh-install\n\n# Opción 3: Limpieza completa con volúmenes\ndocker compose down -v --remove-orphans\nrm -rf vendor storage/logs/* bootstrap/cache/*\n./docker-setup.sh\n```\n\n## Testing de Queries Lentas\n\nPara probar el logging de queries lentas, usa el comando Make:\n\n```bash\n# Generar query lenta de 2 segundos (por defecto)\nmake test-slow-query\n\n# Generar query lenta personalizada\nmake test-slow-query SECONDS=3\nmake test-slow-query SECONDS=10\n\n# Ver el resultado en el log\nmake slow-queries\n```\n\nTambién puedes hacerlo manualmente:\n\n```bash\n# Vía tinker\nmake shell\nphp artisan tinker\nDB::statement('SELECT SLEEP(2)');\nexit\n\n# O directamente desde MySQL\nmake mysql\nSELECT SLEEP(3);\nexit\n```\n\n## Variables de Entorno Importantes\n\n```env\n# Base de datos\nDB_CONNECTION=mysql\nDB_HOST=mysql\nDB_PORT=3306\nDB_DATABASE=laravel\nDB_USERNAME=laravel\nDB_PASSWORD=password\n\n# Redis\nREDIS_HOST=redis\nREDIS_PORT=6379\nCACHE_STORE=redis\nSESSION_DRIVER=redis\nQUEUE_CONNECTION=redis\n\n# Mail (Mailpit)\nMAIL_MAILER=smtp\nMAIL_HOST=mailpit\nMAIL_PORT=1025\n\n# Puertos Docker\nAPP_PORT=8000\nPHPMYADMIN_PORT=8080\nMAILPIT_UI_PORT=8025\n```\n\n## Recursos Adicionales\n\n- [Documentación Laravel 12](https://laravel.com/docs/12.x)\n- [MySQL 8.4 Slow Query Log](https://dev.mysql.com/doc/refman/8.4/en/slow-query-log.html)\n- [MySQL Performance Schema](https://dev.mysql.com/doc/refman/8.4/en/performance-schema.html)\n- [Docker Compose](https://docs.docker.com/compose/)\n\n## Licencia\n\nEste proyecto está bajo la licencia MIT, al igual que Laravel.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fearhackerdem%2Fclase4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fearhackerdem%2Fclase4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fearhackerdem%2Fclase4/lists"}