diff --git a/database/migrations/path/2025_09_11_115824_seed_seeders.php b/database/migrations/path/2025_09_11_115824_seed_seeders.php deleted file mode 100644 index 9182762..0000000 --- a/database/migrations/path/2025_09_11_115824_seed_seeders.php +++ /dev/null @@ -1,61 +0,0 @@ -shouldSeed()) { - (new DevSeeder)->run(); - - $this->createPassportClient(); - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - } - - /** - * Verificar si debe ejecutar el seeding - */ - private function shouldSeed(): bool - { - // Verificar si ya existen usuarios del sistema - $usersExist = DB::table('users') - ->whereIn('email', ['developer@notsoweb.com', 'admin@notsoweb.com']) - ->exists(); - - return !$usersExist; - } - - /** - * Crear cliente Passport si no existe - */ - private function createPassportClient(): void - { - // Verificar si ya existe un cliente personal con el nombre "Holos" - $clientExists = DB::table('oauth_clients') - ->where('name', 'Holos') - ->where('personal_access_client', true) - ->exists(); - - if (!$clientExists) { - Artisan::call('passport:client', [ - '--personal' => true, - '--name' => 'Holos', - '--no-interaction' => true - ]); - } - } -}; diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index dabad11..564944f 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -4,6 +4,12 @@ services: context: . dockerfile: dockerfile.dev working_dir: /var/www/holos.backend + environment: + - DB_HOST=mysql + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_DATABASE=${DB_DATABASE} + - DB_PORT=${DB_PORT} volumes: - ./:/var/www/holos.backend - /var/www/holos.backend/vendor diff --git a/docker-compose.yml b/docker-compose.yml index c35fa2b..1b98444 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,6 +4,12 @@ services: context: . dockerfile: dockerfile working_dir: /var/www/holos.backend + environment: + - DB_HOST=mysql + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - DB_DATABASE=${DB_DATABASE} + - DB_PORT=${DB_PORT} volumes: - app_storage:/var/www/holos.backend/storage networks: diff --git a/dockerfile b/dockerfile index c3b2f67..e32797a 100644 --- a/dockerfile +++ b/dockerfile @@ -12,7 +12,8 @@ RUN apt-get update && apt-get install -y\ libxml2-dev \ zip \ unzip \ - libzip-dev + libzip-dev \ + openssl RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip @@ -24,11 +25,12 @@ RUN composer install --no-dev --no-scripts --optimize-autoloader --no-interactio COPY . . -RUN php artisan package:discover --ansi \ - && php artisan storage:link --force || true +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh RUN chown -R www-data:www-data /var/www/holos.backend/storage /var/www/holos.backend/bootstrap/cache EXPOSE 9000 -CMD ["sh", "-c", "sleep 10 && php artisan migrate --force && php artisan migrate --path=database/migrations/path --force && php-fpm"] +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["php-fpm"] diff --git a/dockerfile.dev b/dockerfile.dev index dba94be..6edfe9b 100644 --- a/dockerfile.dev +++ b/dockerfile.dev @@ -13,7 +13,8 @@ RUN apt-get update && apt-get install -y\ zip \ unzip \ libzip-dev\ - nano + nano \ + openssl RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip @@ -25,11 +26,15 @@ RUN composer install --optimize-autoloader --no-interaction --no-scripts COPY . . -RUN php artisan package:discover --ansi \ - && php artisan storage:link --force || true +COPY entrypoint-dev.sh /usr/local/bin/entrypoint-dev.sh +RUN chmod +x /usr/local/bin/entrypoint-dev.sh + +RUN mkdir -p storage/app/keys storage/logs bootstrap/cache RUN chown -R www-data:www-data /var/www/holos.backend/storage /var/www/holos.backend/bootstrap/cache +RUN chmod -R 775 /var/www/holos.backend/storage /var/www/holos.backend/bootstrap/cache EXPOSE 9000 -CMD ["sh", "-c", "sleep 10 && php artisan migrate --force && php artisan migrate --path=database/migrations/path --force && php-fpm"] +ENTRYPOINT ["/usr/local/bin/entrypoint-dev.sh"] +CMD ["php-fpm"] diff --git a/entrypoint-dev.sh b/entrypoint-dev.sh new file mode 100644 index 0000000..0320cc8 --- /dev/null +++ b/entrypoint-dev.sh @@ -0,0 +1,113 @@ +#!/bin/bash +set -e + +echo "=== Iniciando entrypoint DESARROLLO ===" + +# Variables desde Docker environment +DB_HOST=${DB_HOST:-mysql} +DB_USERNAME=${DB_USERNAME:-root} +DB_PASSWORD=${DB_PASSWORD:-} +DB_DATABASE=${DB_DATABASE:-laravel} +MAX_RETRIES=30 +RETRY_COUNT=0 + +echo "Configuración de BD: Host=${DB_HOST}, Usuario=${DB_USERNAME}, Base=${DB_DATABASE}" + +# Función para verificar conectividad con MySQL usando PHP +check_mysql() { + php -r " + try { + \$pdo = new PDO('mysql:host=${DB_HOST};port=3306', '${DB_USERNAME}', '${DB_PASSWORD}'); + \$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + exit(0); + } catch (Exception \$e) { + exit(1); + } + " +} + +# Esperar a que MySQL esté disponible +echo "Esperando conexión a MySQL..." +until check_mysql; do + RETRY_COUNT=$((RETRY_COUNT + 1)) + if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then + echo "ERROR: No se pudo conectar a MySQL después de $MAX_RETRIES intentos" + exit 1 + fi + echo "Intento $RETRY_COUNT/$MAX_RETRIES - Esperando a MySQL..." + sleep 2 +done + +echo "✓ MySQL está disponible" + +# Comandos de inicialización para desarrollo +echo "Ejecutando comandos de inicialización de DESARROLLO..." + +# Instalar dependencias (incluye dev) +echo "Instalando dependencias de desarrollo..." +composer install --optimize-autoloader --no-interaction + +echo "Ejecutando package:discover..." +php artisan package:discover --ansi + +echo "Creando enlaces simbólicos..." +php artisan storage:link --force || true + +echo "Ejecutando configuración de desarrollo..." +composer run env:dev + +echo "Creando directorio de claves Passport..." +mkdir -p storage/app/keys + +echo "Generando claves de Passport..." +php artisan passport:keys --force || true + +# Verificar que las claves se crearon +if [ ! -f "storage/app/keys/oauth-private.key" ] || [ ! -f "storage/app/keys/oauth-public.key" ]; then + echo "ERROR: Las claves de Passport no se generaron correctamente" + echo "Intentando generar manualmente..." + + # Generar claves manualmente usando OpenSSL + openssl genrsa -out storage/app/keys/oauth-private.key 4096 + openssl rsa -in storage/app/keys/oauth-private.key -pubout -out storage/app/keys/oauth-public.key + + echo "✓ Claves generadas manualmente" +fi + +# Establecer permisos correctos para las claves +chmod 600 storage/app/keys/oauth-private.key +chmod 644 storage/app/keys/oauth-public.key +chown www-data:www-data storage/app/keys/oauth-*.key + +echo "✓ Claves de Passport verificadas" + +# Para desarrollo, siempre verificar migraciones +echo "=== VERIFICANDO BASE DE DATOS DESARROLLO ===" + +# Verificar si necesita migraciones +if php artisan migrate:status | grep -q "Pending"; then + echo "Ejecutando migraciones pendientes..." + php artisan migrate --force +fi + +# Verificar si la base de datos tiene datos +USER_COUNT=$(php -r " + require 'vendor/autoload.php'; + \$app = require 'bootstrap/app.php'; + \$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + echo \App\Models\User::count(); +") + +if [ "$USER_COUNT" -eq "0" ]; then + echo "Base de datos vacía, ejecutando seeders de desarrollo..." + composer run db:dev +else + echo "✓ Base de datos ya tiene datos ($USER_COUNT usuarios)" +fi + +echo "✓ Configuración de desarrollo completada" + +echo "=== Iniciando PHP-FPM DESARROLLO ===" + +# Iniciar PHP-FPM +exec "$@" diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..0bf890d --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,105 @@ +#!/bin/bash +set -e + +echo "=== Iniciando entrypoint ===" + +# Variables desde Docker environment +DB_HOST=${DB_HOST:-mysql} +DB_USERNAME=${DB_USERNAME:-root} +DB_PASSWORD=${DB_PASSWORD:-} +DB_DATABASE=${DB_DATABASE:-laravel} +MAX_RETRIES=30 +RETRY_COUNT=0 + +echo "Configuración de BD: Host=${DB_HOST}, Usuario=${DB_USERNAME}, Base=${DB_DATABASE}" + +# Función para verificar conectividad con MySQL usando PHP +check_mysql() { + php -r " + try { + \$pdo = new PDO('mysql:host=${DB_HOST};port=3306', '${DB_USERNAME}', '${DB_PASSWORD}'); + \$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + exit(0); + } catch (Exception \$e) { + exit(1); + } + " +} + +# Esperar a que MySQL esté disponible +echo "Esperando conexión a MySQL..." +until check_mysql; do + RETRY_COUNT=$((RETRY_COUNT + 1)) + if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then + echo "ERROR: No se pudo conectar a MySQL después de $MAX_RETRIES intentos" + exit 1 + fi + echo "Intento $RETRY_COUNT/$MAX_RETRIES - Esperando a MySQL..." + sleep 2 +done + +echo "✓ MySQL está disponible" + +# Comandos de inicialización +echo "Ejecutando comandos de inicialización..." + +echo "Ejecutando package:discover..." +php artisan package:discover --ansi + +echo "Creando enlaces simbólicos..." +php artisan storage:link --force || true + +echo "Ejecutando configuración de producción..." +composer run env:prod + +echo "Creando directorio de claves Passport..." +mkdir -p storage/app/keys + +echo "Generando claves de Passport..." +php artisan passport:keys --force || true + +# Verificar que las claves se crearon +if [ ! -f "storage/app/keys/oauth-private.key" ] || [ ! -f "storage/app/keys/oauth-public.key" ]; then + echo "ERROR: Las claves de Passport no se generaron correctamente" + echo "Intentando generar manualmente..." + + # Generar claves manualmente usando OpenSSL + openssl genrsa -out storage/app/keys/oauth-private.key 4096 + openssl rsa -in storage/app/keys/oauth-private.key -pubout -out storage/app/keys/oauth-public.key + + echo "✓ Claves generadas manualmente" +fi + +# Establecer permisos correctos para las claves +chmod 600 storage/app/keys/oauth-private.key +chmod 644 storage/app/keys/oauth-public.key +chown www-data:www-data storage/app/keys/oauth-*.key + +echo "✓ Claves de Passport verificadas" + +# Archivo de control para primera ejecución +FIRST_RUN_FLAG="/var/www/holos.backend/.first_run_completed" + +# Solo en la primera ejecución +if [ ! -f "$FIRST_RUN_FLAG" ]; then + echo "=== PRIMERA EJECUCIÓN DETECTADA ===" + + echo "Ejecutando migraciones y seeders..." + if composer run db:prod; then + echo "✓ db:prod completado" + else + echo "ERROR: Falló db:prod" + exit 1 + fi + + # Marcar como completado + touch "$FIRST_RUN_FLAG" + echo "✓ Primera ejecución completada exitosamente" +else + echo "✓ No es primera ejecución, omitiendo setup inicial" +fi + +echo "=== Iniciando PHP-FPM ===" + +# Iniciar PHP-FPM +exec "$@"