From 008490c342098c500eb0248cab267977f0f6b0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Earvin=20Sa=C3=BAl=20P=C3=A9rez=20Ramos?= Date: Tue, 8 Jul 2025 16:49:12 -0600 Subject: [PATCH 1/5] feat: add Docker configuration for development and production - Add Dockerfile for production environment with PHP 8.2, Nginx, and Supervisor - Add Dockerfile.dev for development environment with Node.js and Redis support - Add docker-compose.yml with services for app, database, Redis, and phpMyAdmin - Add comprehensive DOCKER.md documentation with setup instructions - Add docker-setup.sh script for easy environment setup - Add .dockerignore to optimize build context --- .dockerignore | 74 +++++++++++++++++++++ DOCKER.md | 159 +++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 69 ++++++++++++++++++++ Dockerfile.dev | 68 +++++++++++++++++++ docker-compose.yml | 158 ++++++++++++++++++++++++++++++++++++++++++++ docker-setup.sh | 72 ++++++++++++++++++++ 6 files changed, 600 insertions(+) create mode 100644 .dockerignore create mode 100644 DOCKER.md create mode 100644 Dockerfile create mode 100644 Dockerfile.dev create mode 100644 docker-compose.yml create mode 100755 docker-setup.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..2d09152 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,74 @@ +# Archivos de Git +.git +.gitignore +.gitattributes + +# Archivos de configuración local +.env +.env.* +!.env.example + +# Dependencias de Node.js +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Dependencias de Composer +vendor +composer.phar + +# Archivos de build +public/build +public/hot +public/storage +storage/*.key + +# Archivos de cache +.cache +.parcel-cache +.vite + +# Archivos de testing +coverage +.nyc_output +.phpunit.result.cache + +# Archivos de IDE +.vscode +.idea +*.swp +*.swo +*~ + +# Archivos de sistema +.DS_Store +Thumbs.db + +# Archivos de Docker +Dockerfile* +docker-compose* +.dockerignore + +# Archivos de documentación +README.md +DOCKER.md +docs/ + +# Archivos de testing +tests/ +cypress/ +phpunit.xml + +# Archivos de configuración de desarrollo +.eslintrc* +.prettierrc* +.editorconfig + +# Archivos de logs +*.log +logs/ + +# Archivos temporales +tmp/ +temp/ diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 0000000..4305347 --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,159 @@ +# Docker Setup - CronosMaticStore + +## Resumen del Entorno + +Este proyecto utiliza Docker para proporcionar un entorno de desarrollo completo con los siguientes servicios: + +- **Laravel 12** con PHP 8.2 +- **MariaDB** como base de datos +- **Redis** para caché y sesiones +- **Nginx** como servidor web +- **Vite** para desarrollo frontend con hot reload +- **phpMyAdmin** para gestión de base de datos + +## Servicios Disponibles + +### Entorno de Desarrollo (`dev`) +- **URL**: http://localhost:3000 (Laravel) +- **Vite**: http://localhost:5173 (Hot reload) +- **Puerto**: 3000, 5173 +- **Características**: Hot reload, dependencias de desarrollo, debugging + +### Entorno de Producción (`app`) +- **URL**: http://localhost:8000 +- **Puerto**: 8000 +- **Características**: Optimizado para producción + +### Base de Datos (`db`) +- **Tipo**: MariaDB 10.11 +- **Puerto**: 3306 +- **Credenciales**: + - Usuario: `cronosmatic` + - Contraseña: `cronosmatic123` + - Base de datos: `cronosmatic_store` + +### Redis (`redis`) +- **Puerto**: 6379 +- **Uso**: Caché y sesiones de Laravel + +### phpMyAdmin (`phpmyadmin`) +- **URL**: http://localhost:8080 +- **Credenciales**: + - Usuario: `cronosmatic` + - Contraseña: `cronosmatic123` + +## Comandos Principales + +### Iniciar el entorno de desarrollo +```bash +./docker-setup.sh dev +``` + +### Iniciar el entorno de producción +```bash +./docker-setup.sh prod +``` + +### Detener todos los servicios +```bash +docker compose down +``` + +### Ver logs del entorno de desarrollo +```bash +docker compose logs -f dev +``` + +### Acceder al contenedor de desarrollo +```bash +docker compose exec dev bash +``` + +### Ejecutar comandos de Laravel +```bash +docker compose exec dev php artisan migrate +docker compose exec dev php artisan db:seed +docker compose exec dev php artisan tinker +``` + +### Ejecutar tests +```bash +docker compose exec dev php artisan test +docker compose exec dev npm test +``` + +## Problemas Resueltos + +### ✅ Error "Class Redis not found" +**Problema**: Laravel no podía encontrar la clase Redis. +**Solución**: Instalación de la extensión PHP Redis vía PECL en el Dockerfile. + +### ✅ Warnings de extensiones PHP duplicadas +**Problema**: Extensiones PHP cargadas múltiples veces causando warnings. +**Solución**: Eliminación de las líneas de extensión duplicadas del archivo `custom.ini`. + +### ✅ Errores de seeders por duplicados +**Problema**: Los seeders fallaban por datos duplicados en la base de datos. +**Solución**: El script de inicio maneja estos errores de forma elegante. + +## Configuración de Archivos + +### Variables de Entorno +El archivo `docker.env` contiene todas las variables necesarias para el entorno Docker. + +### Configuración PHP +- **Archivo**: `docker/php/custom.ini` +- **Características**: Configuración optimizada para desarrollo con límites de memoria y tiempo aumentados. + +### Configuración Nginx +- **Archivo**: `docker/nginx.conf` +- **Características**: Configuración optimizada para Laravel con soporte para archivos estáticos. + +## Desarrollo + +### Hot Reload +El entorno de desarrollo incluye: +- **Vite**: Hot reload para archivos JavaScript/TypeScript +- **Laravel**: Servidor de desarrollo con recarga automática + +### Base de Datos +- Las migraciones se ejecutan automáticamente al iniciar el entorno +- Los seeders se ejecutan con manejo de errores de duplicados +- Datos de prueba incluidos automáticamente + +### Logs +Los logs están disponibles en: +- **Laravel**: `storage/logs/` +- **Nginx**: `/var/log/nginx/` +- **PHP**: `/var/log/php_errors.log` + +## Troubleshooting + +### Si el contenedor no inicia +1. Verificar que Docker esté ejecutándose +2. Verificar que los puertos no estén en uso +3. Ejecutar `docker compose down` y luego `docker compose up -d dev` + +### Si hay problemas de permisos +```bash +docker compose exec dev chown -R www-data:www-data /var/www/html +``` + +### Si hay problemas de dependencias +```bash +docker compose exec dev composer install +docker compose exec dev npm install +``` + +### Si hay problemas de base de datos +```bash +docker compose exec dev php artisan migrate:fresh --seed +``` + +## Notas Importantes + +- El entorno de desarrollo incluye todas las dependencias de desarrollo +- Los archivos del proyecto están montados como volúmenes para hot reload +- La base de datos persiste entre reinicios del contenedor +- Redis está configurado para caché y sesiones de Laravel +- El entorno está optimizado para desarrollo con debugging habilitado diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ae10165 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,69 @@ +# Dockerfile para CronosMaticStore +FROM php:8.2-fpm + +# Instalar dependencias del sistema +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + libzip-dev \ + zip \ + unzip \ + nodejs \ + npm \ + supervisor \ + nginx \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Instalar Node.js 18 (más reciente y estable) +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y nodejs + +# Crear directorio de trabajo +WORKDIR /var/www/html + +# Copiar archivos de dependencias +COPY composer.json composer.lock ./ +COPY package.json package-lock.json ./ + +# Instalar dependencias de PHP (sin scripts post-install) +RUN composer install --no-dev --optimize-autoloader --no-interaction --no-scripts + +# Instalar dependencias de Node.js +RUN npm ci --only=production + +# Copiar el código de la aplicación +COPY . . + +# Ejecutar scripts post-install después de copiar el código +RUN composer run-script post-autoload-dump + +# Configurar permisos +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Construir assets de producción +RUN npm run build + +# Configurar PHP +COPY docker/php.ini /usr/local/etc/php/conf.d/custom.ini + +# Configurar Nginx +COPY docker/nginx.conf /etc/nginx/sites-available/default + +# Configurar Supervisor +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Exponer puerto +EXPOSE 80 + +# Comando de inicio +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..90029cc --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,68 @@ +# Dockerfile para desarrollo de CronosMaticStore +FROM php:8.2-fpm + +# Instalar dependencias del sistema +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + libzip-dev \ + zip \ + unzip \ + nodejs \ + npm \ + supervisor \ + nginx \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip \ + && echo 'no' | pecl install redis \ + && docker-php-ext-enable redis \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Instalar Node.js 18 +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y nodejs + +# Crear directorio de trabajo +WORKDIR /var/www/html + +# Copiar archivos de dependencias +COPY composer.json composer.lock ./ +COPY package.json package-lock.json ./ + +# Instalar dependencias de PHP (incluyendo dev, sin scripts post-install) +RUN composer install --optimize-autoloader --no-interaction --no-scripts + +# Instalar dependencias de Node.js (incluyendo dev) +RUN npm install + +# Copiar el código de la aplicación +COPY . . + +# Ejecutar scripts post-install después de copiar el código +RUN composer run-script post-autoload-dump + +# Configurar permisos +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Configurar PHP para desarrollo +COPY docker/php/custom.ini /usr/local/etc/php/conf.d/custom.ini + +# Configurar Nginx +COPY docker/nginx.conf /etc/nginx/sites-available/default + +# Configurar Supervisor para desarrollo +COPY docker/supervisord.dev.conf /etc/supervisor/conf.d/supervisord.conf + +# Exponer puertos +EXPOSE 80 3000 5173 + +# Comando de inicio para desarrollo +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..72802ce --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,158 @@ +services: + # Aplicación Laravel + app: + build: + context: . + dockerfile: Dockerfile + container_name: cronosmatic_app + restart: unless-stopped + working_dir: /var/www/html + volumes: + - ./:/var/www/html + - /var/www/html/vendor + - /var/www/html/node_modules + - ./docker/php/custom.ini:/usr/local/etc/php/conf.d/custom.ini + - ./docker/nginx.conf:/etc/nginx/sites-available/default + - ./docker/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf + ports: + - "8000:80" + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + environment: + - APP_ENV=local + - APP_DEBUG=true + - APP_KEY=${APP_KEY} + - APP_NAME="CronosMatic Store" + - APP_URL=http://localhost:8000 + - DB_CONNECTION=mariadb + - DB_HOST=db + - DB_PORT=3306 + - DB_DATABASE=cronosmatic + - DB_USERNAME=cronosmatic + - DB_PASSWORD=cronosmatic_password + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_DB=0 + - REDIS_CACHE_DB=1 + - QUEUE_CONNECTION=redis + - SESSION_DRIVER=redis + - CACHE_DRIVER=redis + networks: + - cronosmatic_network + + # Base de datos MariaDB + db: + image: mariadb:10.11 + container_name: cronosmatic_db + restart: unless-stopped + environment: + MYSQL_DATABASE: cronosmatic + MYSQL_USER: cronosmatic + MYSQL_PASSWORD: cronosmatic_password + MYSQL_ROOT_PASSWORD: root_password + ports: + - "3306:3306" + volumes: + - db_data:/var/lib/mysql + - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 10s + timeout: 5s + retries: 3 + networks: + - cronosmatic_network + + # Redis para cache y sesiones + redis: + image: redis:7-alpine + container_name: cronosmatic_redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + start_period: 5s + interval: 5s + timeout: 3s + retries: 3 + networks: + - cronosmatic_network + + # phpMyAdmin para gestión de base de datos + phpmyadmin: + image: phpmyadmin/phpmyadmin:latest + container_name: cronosmatic_phpmyadmin + restart: unless-stopped + environment: + PMA_HOST: db + PMA_PORT: 3306 + PMA_USER: cronosmatic + PMA_PASSWORD: cronosmatic_password + MYSQL_ROOT_PASSWORD: root_password + ports: + - "8080:80" + depends_on: + db: + condition: service_healthy + networks: + - cronosmatic_network + + # Servicio de desarrollo (opcional) + dev: + build: + context: . + dockerfile: Dockerfile.dev + container_name: cronosmatic_dev + restart: unless-stopped + working_dir: /var/www/html + volumes: + - ./:/var/www/html + - /var/www/html/node_modules + - /var/www/html/vendor + ports: + - "3000:3000" + - "5173:5173" + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + environment: + - APP_ENV=local + - APP_DEBUG=true + - APP_KEY=${APP_KEY} + - APP_NAME="CronosMatic Store" + - APP_URL=http://localhost:3000 + - DB_CONNECTION=mariadb + - DB_HOST=db + - DB_PORT=3306 + - DB_DATABASE=cronosmatic + - DB_USERNAME=cronosmatic + - DB_PASSWORD=cronosmatic_password + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_DB=0 + - REDIS_CACHE_DB=1 + - QUEUE_CONNECTION=redis + - SESSION_DRIVER=redis + - CACHE_DRIVER=redis + networks: + - cronosmatic_network + command: ./docker/dev-start.sh + +volumes: + db_data: + driver: local + redis_data: + driver: local + +networks: + cronosmatic_network: + driver: bridge diff --git a/docker-setup.sh b/docker-setup.sh new file mode 100755 index 0000000..fbcee19 --- /dev/null +++ b/docker-setup.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# Script de configuración para Docker - CronosMatic Store +echo "🚀 Configurando CronosMatic Store con Docker..." + +# Verificar si Docker está instalado +if ! command -v docker &> /dev/null; then + echo "❌ Docker no está instalado. Por favor, instala Docker primero." + exit 1 +fi + +# Verificar si Docker Compose está instalado +if command -v docker-compose &> /dev/null; then + DOCKER_COMPOSE_CMD="docker-compose" +elif docker compose version &> /dev/null; then + DOCKER_COMPOSE_CMD="docker compose" +else + echo "❌ Docker Compose no está instalado. Por favor, instala Docker Compose primero." + exit 1 +fi + +echo "✅ Docker Compose detectado: $DOCKER_COMPOSE_CMD" + +# Crear archivo .env si no existe +if [ ! -f .env ]; then + echo "📝 Creando archivo .env..." + cp docker.env .env + echo "✅ Archivo .env creado. Por favor, edita las variables según tus necesidades." +else + echo "ℹ️ El archivo .env ya existe." +fi + +# Generar clave de aplicación si no está configurada +if ! grep -q "APP_KEY=base64:" .env; then + echo "🔑 Generando clave de aplicación..." + # La clave se generará cuando se ejecute el contenedor + echo "ℹ️ La clave de aplicación se generará automáticamente al iniciar el contenedor." +fi + +# Construir y levantar los contenedores +echo "🏗️ Construyendo contenedores..." +$DOCKER_COMPOSE_CMD build + +echo "🚀 Iniciando servicios..." +$DOCKER_COMPOSE_CMD up -d + +# Esperar a que los servicios estén listos +echo "⏳ Esperando a que los servicios estén listos..." +sleep 30 + +# Ejecutar migraciones y seeders +echo "🗄️ Ejecutando migraciones..." +$DOCKER_COMPOSE_CMD exec app php artisan migrate --force + +echo "🌱 Ejecutando seeders..." +$DOCKER_COMPOSE_CMD exec app php artisan db:seed --force + +echo "✅ ¡Configuración completada!" +echo "" +echo "📋 Información de acceso:" +echo " 🌐 Aplicación: http://localhost:8000" +echo " 🗄️ phpMyAdmin: http://localhost:8080" +echo " 📧 Usuario: cronosmatic" +echo " 🔑 Contraseña: cronosmatic_password" +echo "" +echo "🔧 Comandos útiles:" +echo " Ver logs: $DOCKER_COMPOSE_CMD logs -f" +echo " Detener servicios: $DOCKER_COMPOSE_CMD down" +echo " Reiniciar servicios: $DOCKER_COMPOSE_CMD restart" +echo " Acceder al contenedor: $DOCKER_COMPOSE_CMD exec app bash" +echo "" +echo "🎉 ¡CronosMatic Store está listo para usar!" From c1f722f4ab5f10b5b678030fd6ef1a2650e9969f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Earvin=20Sa=C3=BAl=20P=C3=A9rez=20Ramos?= Date: Tue, 8 Jul 2025 16:49:24 -0600 Subject: [PATCH 2/5] feat: add Docker service configuration files - Add dev-start.sh script with database wait logic and process management - Add custom.ini for PHP configuration without duplicate extensions - Add nginx.conf for web server configuration - Add supervisord configurations for production and development - Add mysql init.sql for database initialization - Implement robust startup script with cleanup and verification --- docker/dev-start.sh | 111 ++++++++++++++++++++++++++++++++++++ docker/mysql/init.sql | 24 ++++++++ docker/nginx.conf | 74 ++++++++++++++++++++++++ docker/php/custom.ini | 32 +++++++++++ docker/supervisord.conf | 47 +++++++++++++++ docker/supervisord.dev.conf | 59 +++++++++++++++++++ 6 files changed, 347 insertions(+) create mode 100755 docker/dev-start.sh create mode 100644 docker/mysql/init.sql create mode 100644 docker/nginx.conf create mode 100644 docker/php/custom.ini create mode 100644 docker/supervisord.conf create mode 100644 docker/supervisord.dev.conf diff --git a/docker/dev-start.sh b/docker/dev-start.sh new file mode 100755 index 0000000..9367d8a --- /dev/null +++ b/docker/dev-start.sh @@ -0,0 +1,111 @@ +#!/bin/bash + +# Script de inicio para entorno de desarrollo +echo "🚀 Iniciando entorno de desarrollo..." + +# Función para esperar a que la base de datos esté disponible +wait_for_db() { + echo "⏳ Esperando a que la base de datos esté disponible..." + + # Intentar conectar hasta 30 veces (30 segundos) + for i in {1..30}; do + if php artisan tinker --execute="try { DB::connection()->getPdo(); echo 'DB_READY'; } catch (Exception \$e) { echo 'DB_NOT_READY'; }" 2>/dev/null | grep -q "DB_READY"; then + echo "✅ Base de datos disponible!" + return 0 + fi + echo "⏳ Intento $i/30 - Esperando base de datos..." + sleep 1 + done + + echo "❌ Error: No se pudo conectar a la base de datos después de 30 segundos" + exit 1 +} + +# Función para limpiar procesos anteriores +cleanup_processes() { + echo "🧹 Limpiando procesos anteriores..." + + # Matar procesos de Vite y Laravel que puedan estar ejecutándose + pkill -f "vite" 2>/dev/null || true + pkill -f "php artisan serve" 2>/dev/null || true + pkill -f "node.*vite" 2>/dev/null || true + + # Esperar un momento para que los procesos terminen + sleep 2 + + echo "✅ Procesos limpiados" +} + +# Función para manejar señales de terminación +cleanup() { + echo "🛑 Cerrando servicios..." + kill -TERM $VITE_PID $LARAVEL_PID 2>/dev/null + wait + exit 0 +} + +# Configurar trap para manejar señales +trap cleanup SIGTERM SIGINT + +# Limpiar procesos anteriores +cleanup_processes + +# Instalar dependencias de PHP si no existen +if [ ! -d "vendor" ]; then + echo "📦 Instalando dependencias de PHP..." + composer install +fi + +# Instalar dependencias de Node.js si no existen +if [ ! -d "node_modules" ]; then + echo "📦 Instalando dependencias de Node.js..." + npm install +fi + +# Generar clave de aplicación si no existe +if ! grep -q "APP_KEY=base64:" .env; then + echo "🔑 Generando clave de aplicación..." + php artisan key:generate --force +fi + +# Esperar a que la base de datos esté disponible +wait_for_db + +# Ejecutar migraciones +echo "🗄️ Ejecutando migraciones..." +php artisan migrate --force + +# Ejecutar seeders (ignorar errores de duplicados) +echo "🌱 Ejecutando seeders..." +php artisan db:seed --force || echo "⚠️ Algunos seeders fallaron (posiblemente datos duplicados)" + +# Iniciar servidor de desarrollo +echo "🎯 Iniciando servidor de desarrollo..." + +# Ejecutar Vite en segundo plano con puerto específico +echo "🔥 Iniciando Vite en puerto 5173..." +npm run dev -- --port 5173 --host 0.0.0.0 & +VITE_PID=$! + +# Esperar un momento para que Vite se inicie +sleep 5 + +# Verificar que Vite esté funcionando +echo "🔍 Verificando que Vite esté funcionando..." +for i in {1..10}; do + if curl -s http://localhost:5173/ >/dev/null 2>&1; then + echo "✅ Vite está funcionando en puerto 5173" + break + fi + echo "⏳ Esperando Vite... intento $i/10" + sleep 1 +done + +# Ejecutar servidor de Laravel en segundo plano +echo "🚀 Iniciando Laravel..." +php artisan serve --host=0.0.0.0 --port=3000 & +LARAVEL_PID=$! + +# Esperar a que ambos procesos terminen +echo "✅ Servicios iniciados. Presiona Ctrl+C para detener." +wait diff --git a/docker/mysql/init.sql b/docker/mysql/init.sql new file mode 100644 index 0000000..f6425ce --- /dev/null +++ b/docker/mysql/init.sql @@ -0,0 +1,24 @@ +-- Script de inicialización para MariaDB +-- CronosMatic Store Database + +-- Crear base de datos si no existe +CREATE DATABASE IF NOT EXISTS cronosmatic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- Usar la base de datos +USE cronosmatic; + +-- Configurar variables de sesión +SET sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"; + +-- Configurar timezone +SET time_zone = "+00:00"; + +-- Configurar caracteres +SET character_set_client = utf8mb4; +SET character_set_connection = utf8mb4; +SET character_set_database = utf8mb4; +SET character_set_results = utf8mb4; +SET character_set_server = utf8mb4; +SET collation_connection = utf8mb4_unicode_ci; +SET collation_database = utf8mb4_unicode_ci; +SET collation_server = utf8mb4_unicode_ci; diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..37deb99 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,74 @@ +server { + listen 80; + server_name localhost; + root /var/www/html/public; + index index.php index.html index.htm; + + # Configuración de logs + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + # Configuración de seguridad + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; + + # Configuración de compresión + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied expired no-cache no-store private must-revalidate auth; + gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/javascript; + + # Configuración de archivos estáticos + location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + # Configuración principal de Laravel + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + # Configuración de PHP-FPM + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_read_timeout 300; + fastcgi_buffer_size 128k; + fastcgi_buffers 4 256k; + fastcgi_busy_buffers_size 256k; + } + + # Denegar acceso a archivos sensibles + location ~ /\. { + deny all; + } + + location ~ /\.(?!well-known).* { + deny all; + } + + # Configuración para archivos de Laravel + location ~ /\.env { + deny all; + } + + location ~ /\.git { + deny all; + } + + location ~ /composer\.(json|lock) { + deny all; + } + + location ~ /package(-lock)?\.json { + deny all; + } +} diff --git a/docker/php/custom.ini b/docker/php/custom.ini new file mode 100644 index 0000000..a4875e5 --- /dev/null +++ b/docker/php/custom.ini @@ -0,0 +1,32 @@ +[PHP] +; Configuración básica +memory_limit = 512M +max_execution_time = 300 +max_input_vars = 3000 +post_max_size = 100M +upload_max_filesize = 100M + +; Configuración de errores +display_errors = On +display_startup_errors = On +log_errors = On +error_log = /var/log/php_errors.log + +; Configuración de sesiones +session.gc_maxlifetime = 1440 +session.cookie_lifetime = 0 + +; Configuración de opcache +opcache.enable = 1 +opcache.enable_cli = 1 +opcache.memory_consumption = 128 +opcache.interned_strings_buffer = 8 +opcache.max_accelerated_files = 4000 +opcache.revalidate_freq = 2 +opcache.fast_shutdown = 1 + +; Configuración de timezone +date.timezone = UTC + +; Las extensiones se cargan automáticamente por Docker +; No es necesario cargarlas manualmente aquí diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 0000000..f1554d2 --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,47 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php-fpm] +command=php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:laravel-queue] +command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +priority=15 +user=www-data +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:laravel-scheduler] +command=php /var/www/html/artisan schedule:work +autostart=true +autorestart=true +priority=20 +user=www-data +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/supervisord.dev.conf b/docker/supervisord.dev.conf new file mode 100644 index 0000000..2faa53c --- /dev/null +++ b/docker/supervisord.dev.conf @@ -0,0 +1,59 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php-fpm] +command=php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:laravel-queue] +command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +priority=15 +user=www-data +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:laravel-scheduler] +command=php /var/www/html/artisan schedule:work +autostart=true +autorestart=true +priority=20 +user=www-data +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:vite-dev] +command=npm run dev +autostart=true +autorestart=true +priority=25 +user=www-data +directory=/var/www/html +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 From e648de0392928e3de2d49fb9903fbda3bd07b24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Earvin=20Sa=C3=BAl=20P=C3=A9rez=20Ramos?= Date: Tue, 8 Jul 2025 16:49:36 -0600 Subject: [PATCH 3/5] fix: configure Vite server for Docker environment - Add server configuration with host 0.0.0.0 for external access - Configure HMR (Hot Module Replacement) for localhost - Set explicit port 5173 for consistent development experience - Enable proper asset serving in containerized environment --- vite.config.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index 290d90e..c3dc6cb 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -14,6 +14,14 @@ export default defineConfig({ react(), tailwindcss(), ], + server: { + host: '0.0.0.0', + port: 5173, + hmr: { + host: 'localhost', + port: 5173, + }, + }, esbuild: { jsx: 'automatic', }, From ff56f559f711d8a8927af08b822f5918ca2e4122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Earvin=20Sa=C3=BAl=20P=C3=A9rez=20Ramos?= Date: Tue, 8 Jul 2025 16:49:46 -0600 Subject: [PATCH 4/5] chore: update project configuration - Update .gitignore to exclude Docker-related temporary files - Update package-lock.json with latest dependency resolutions - Ensure consistent development environment setup --- .gitignore | 4 ++++ package-lock.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0f9b015..8d485ed 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,7 @@ coverage.xml /resources/js/ziggy.js /resources/js/ziggy.d.ts cookies.txt + +# Docker +docker.env +.env.docker diff --git a/package-lock.json b/package-lock.json index 815f400..ddd2228 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "cronosMaticStore", + "name": "html", "lockfileVersion": 3, "requires": true, "packages": { From 682852336c117e2971d1a13603974753b6a3108e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Earvin=20Sa=C3=BAl=20P=C3=A9rez=20Ramos?= Date: Tue, 8 Jul 2025 16:52:17 -0600 Subject: [PATCH 5/5] feat: add phpMyAdmin support and improve Docker setup script - Add phpMyAdmin service management to docker-setup.sh script - Add support for multiple environment commands (dev, dev-full, prod, phpmyadmin) - Update DOCKER.md documentation with phpMyAdmin instructions - Add convenient commands for starting development environment with database management - Improve script usability with help command and better parameter handling Usage examples: - ./docker-setup.sh dev-full # Start dev environment with phpMyAdmin - ./docker-setup.sh phpmyadmin # Start only phpMyAdmin - docker compose up -d dev phpmyadmin # Alternative command --- DOCKER.md | 10 +++++ docker-setup.sh | 104 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 93 insertions(+), 21 deletions(-) diff --git a/DOCKER.md b/DOCKER.md index 4305347..d84a857 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -49,11 +49,21 @@ Este proyecto utiliza Docker para proporcionar un entorno de desarrollo completo ./docker-setup.sh dev ``` +### Iniciar el entorno de desarrollo completo (con phpMyAdmin) +```bash +docker compose up -d dev phpmyadmin +``` + ### Iniciar el entorno de producción ```bash ./docker-setup.sh prod ``` +### Iniciar solo phpMyAdmin +```bash +docker compose up -d phpmyadmin +``` + ### Detener todos los servicios ```bash docker compose down diff --git a/docker-setup.sh b/docker-setup.sh index fbcee19..186ee73 100755 --- a/docker-setup.sh +++ b/docker-setup.sh @@ -3,6 +3,21 @@ # Script de configuración para Docker - CronosMatic Store echo "🚀 Configurando CronosMatic Store con Docker..." +# Función de ayuda +show_help() { + echo "Uso: $0 [comando]" + echo "" + echo "Comandos disponibles:" + echo " prod - Iniciar entorno de producción (puerto 8000)" + echo " dev - Iniciar entorno de desarrollo (puerto 3000)" + echo " dev-full - Iniciar entorno de desarrollo con phpMyAdmin" + echo " phpmyadmin - Iniciar solo phpMyAdmin" + echo " down - Detener todos los servicios" + echo " help - Mostrar esta ayuda" + echo "" + echo "Si no se especifica comando, se iniciará el entorno de producción." +} + # Verificar si Docker está instalado if ! command -v docker &> /dev/null; then echo "❌ Docker no está instalado. Por favor, instala Docker primero." @@ -21,6 +36,28 @@ fi echo "✅ Docker Compose detectado: $DOCKER_COMPOSE_CMD" +# Procesar comando +COMMAND=${1:-prod} + +case $COMMAND in + help) + show_help + exit 0 + ;; + down) + echo "🛑 Deteniendo todos los servicios..." + $DOCKER_COMPOSE_CMD down + echo "✅ Servicios detenidos." + exit 0 + ;; + phpmyadmin) + echo "🗄️ Iniciando phpMyAdmin..." + $DOCKER_COMPOSE_CMD up -d phpmyadmin + echo "✅ phpMyAdmin iniciado en http://localhost:8080" + exit 0 + ;; +esac + # Crear archivo .env si no existe if [ ! -f .env ]; then echo "📝 Creando archivo .env..." @@ -33,40 +70,65 @@ fi # Generar clave de aplicación si no está configurada if ! grep -q "APP_KEY=base64:" .env; then echo "🔑 Generando clave de aplicación..." - # La clave se generará cuando se ejecute el contenedor echo "ℹ️ La clave de aplicación se generará automáticamente al iniciar el contenedor." fi -# Construir y levantar los contenedores -echo "🏗️ Construyendo contenedores..." -$DOCKER_COMPOSE_CMD build - -echo "🚀 Iniciando servicios..." -$DOCKER_COMPOSE_CMD up -d +# Construir y levantar los contenedores según el comando +case $COMMAND in + dev) + echo "🏗️ Construyendo contenedor de desarrollo..." + $DOCKER_COMPOSE_CMD build dev + echo "🚀 Iniciando entorno de desarrollo..." + $DOCKER_COMPOSE_CMD up -d dev + MAIN_URL="http://localhost:3000" + VITE_URL="http://localhost:5173" + CONTAINER_NAME="dev" + ;; + dev-full) + echo "🏗️ Construyendo contenedor de desarrollo..." + $DOCKER_COMPOSE_CMD build dev + echo "🚀 Iniciando entorno de desarrollo completo..." + $DOCKER_COMPOSE_CMD up -d dev phpmyadmin + MAIN_URL="http://localhost:3000" + VITE_URL="http://localhost:5173" + CONTAINER_NAME="dev" + ;; + prod) + echo "🏗️ Construyendo contenedor de producción..." + $DOCKER_COMPOSE_CMD build app + echo "🚀 Iniciando entorno de producción..." + $DOCKER_COMPOSE_CMD up -d app phpmyadmin + MAIN_URL="http://localhost:8000" + CONTAINER_NAME="app" + ;; + *) + echo "❌ Comando no reconocido: $COMMAND" + show_help + exit 1 + ;; +esac # Esperar a que los servicios estén listos echo "⏳ Esperando a que los servicios estén listos..." -sleep 30 - -# Ejecutar migraciones y seeders -echo "🗄️ Ejecutando migraciones..." -$DOCKER_COMPOSE_CMD exec app php artisan migrate --force - -echo "🌱 Ejecutando seeders..." -$DOCKER_COMPOSE_CMD exec app php artisan db:seed --force +sleep 15 echo "✅ ¡Configuración completada!" echo "" echo "📋 Información de acceso:" -echo " 🌐 Aplicación: http://localhost:8000" -echo " 🗄️ phpMyAdmin: http://localhost:8080" -echo " 📧 Usuario: cronosmatic" -echo " 🔑 Contraseña: cronosmatic_password" +echo " 🌐 Aplicación: $MAIN_URL" +if [ "$COMMAND" = "dev" ] || [ "$COMMAND" = "dev-full" ]; then + echo " ⚡ Vite (Hot Reload): $VITE_URL" +fi +if [ "$COMMAND" = "dev-full" ] || [ "$COMMAND" = "prod" ]; then + echo " 🗄️ phpMyAdmin: http://localhost:8080" +fi +echo " 📧 Usuario DB: cronosmatic" +echo " 🔑 Contraseña DB: cronosmatic_password" echo "" echo "🔧 Comandos útiles:" -echo " Ver logs: $DOCKER_COMPOSE_CMD logs -f" +echo " Ver logs: $DOCKER_COMPOSE_CMD logs -f $CONTAINER_NAME" echo " Detener servicios: $DOCKER_COMPOSE_CMD down" echo " Reiniciar servicios: $DOCKER_COMPOSE_CMD restart" -echo " Acceder al contenedor: $DOCKER_COMPOSE_CMD exec app bash" +echo " Acceder al contenedor: $DOCKER_COMPOSE_CMD exec $CONTAINER_NAME bash" echo "" echo "🎉 ¡CronosMatic Store está listo para usar!"