ADD: Se crearon los scripts para ejecutar comandos artisan

This commit is contained in:
Juan Felipe Zapata Moreno 2025-09-14 17:08:51 -06:00
parent 6ff33f6ccb
commit 05d819687e
7 changed files with 245 additions and 69 deletions

View File

@ -1,61 +0,0 @@
<?php
use Database\Seeders\DevSeeder;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// Solo ejecutar en desarrollo y si no existen datos
if ($this->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
]);
}
}
};

View File

@ -4,6 +4,12 @@ services:
context: . context: .
dockerfile: dockerfile.dev dockerfile: dockerfile.dev
working_dir: /var/www/holos.backend 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: volumes:
- ./:/var/www/holos.backend - ./:/var/www/holos.backend
- /var/www/holos.backend/vendor - /var/www/holos.backend/vendor

View File

@ -4,6 +4,12 @@ services:
context: . context: .
dockerfile: dockerfile dockerfile: dockerfile
working_dir: /var/www/holos.backend 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: volumes:
- app_storage:/var/www/holos.backend/storage - app_storage:/var/www/holos.backend/storage
networks: networks:

View File

@ -12,7 +12,8 @@ RUN apt-get update && apt-get install -y\
libxml2-dev \ libxml2-dev \
zip \ zip \
unzip \ unzip \
libzip-dev libzip-dev \
openssl
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip 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 . . COPY . .
RUN php artisan package:discover --ansi \ COPY entrypoint.sh /usr/local/bin/entrypoint.sh
&& php artisan storage:link --force || true 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 RUN chown -R www-data:www-data /var/www/holos.backend/storage /var/www/holos.backend/bootstrap/cache
EXPOSE 9000 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"]

View File

@ -13,7 +13,8 @@ RUN apt-get update && apt-get install -y\
zip \ zip \
unzip \ unzip \
libzip-dev\ libzip-dev\
nano nano \
openssl
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip 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 . . COPY . .
RUN php artisan package:discover --ansi \ COPY entrypoint-dev.sh /usr/local/bin/entrypoint-dev.sh
&& php artisan storage:link --force || true 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 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 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"]

113
entrypoint-dev.sh Normal file
View File

@ -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 "$@"

105
entrypoint.sh Normal file
View File

@ -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 "$@"