Fix: Mejorar entrypoint.sh para sincronizar variables de Docker con .env

This commit is contained in:
2026-04-22 23:37:07 -06:00
parent a5e6f761b7
commit 6d9f987e0a

View File

@@ -6,81 +6,204 @@ echo "========================================"
echo " Nomina Ventas - Entrypoint"
echo "========================================"
# Verificar que el código existe en /var/www/html
if [ ! -f /var/www/html/artisan ]; then
echo "ERROR: No se encontró el código en /var/www/html"
echo "Montando volumen con el código..."
exit 1
fi
# Asegurar que existan los directorios necesarios (importante para volúmenes montados)
mkdir -p /var/www/html/storage/framework/{cache,sessions,views}
mkdir -p /var/www/html/storage/logs
mkdir -p /var/www/html/bootstrap/cache
# Asegurar permisos
chown -R laravel:laravel /var/www/html/storage
chown -R laravel:laravel /var/www/html/bootstrap/cache
chmod -R 775 /var/www/html/storage
chmod -R 775 /var/www/html/bootstrap/cache
# ===== GENERAR O ACTUALIZAR .env =====
echo "Intentando sincronizar .env desde variables de Docker..."
echo "========================================"
echo " Sincronizando variables de entorno..."
echo "========================================"
# Generamos el contenido en un archivo temporal
cat > /tmp/.env.tmp << EOF
APP_NAME="${APP_NAME:-Laravel}"
echo "APP_NAME=${APP_NAME:-}"
echo "APP_ENV=${APP_ENV:-}"
echo "APP_DEBUG=${APP_DEBUG:-}"
echo "APP_URL=${APP_URL:-}"
echo "DB_HOST=${DB_HOST:-}"
echo "DB_PORT=${DB_PORT:-}"
echo "DB_DATABASE=${DB_DATABASE:-}"
echo "DB_USERNAME=${DB_USERNAME:-}"
echo "DB_PASSWORD=${DB_PASSWORD:-}"
echo "APP_KEY=${APP_KEY:-}"
# Determinar archivo .env a usar
ENV_FILE="/var/www/html/.env"
TEMP_ENV="/tmp/.env.build"
# Verificar si ya existe un .env con valores válidos
if [ -f "$ENV_FILE" ]; then
echo ">>> Detectado archivo .env existente"
# Si hay variables de Docker con valores, actualizar el .env existente
if [ -n "$APP_NAME" ]; then
echo ">>> Actualizando APP_NAME..."
sed -i "s|^APP_NAME=.*|APP_NAME=\"$APP_NAME\"|" "$ENV_FILE"
fi
if [ -n "$APP_ENV" ]; then
sed -i "s|^APP_ENV=.*|APP_ENV=$APP_ENV|" "$ENV_FILE"
fi
if [ -n "$APP_DEBUG" ]; then
sed -i "s|^APP_DEBUG=.*|APP_DEBUG=$APP_DEBUG|" "$ENV_FILE"
fi
if [ -n "$APP_URL" ]; then
sed -i "s|^APP_URL=.*|APP_URL=$APP_URL|" "$ENV_FILE"
fi
if [ -n "$APP_KEY" ]; then
sed -i "s|^APP_KEY=.*|APP_KEY=$APP_KEY|" "$ENV_FILE"
fi
if [ -n "$DB_HOST" ]; then
sed -i "s|^DB_HOST=.*|DB_HOST=$DB_HOST|" "$ENV_FILE"
fi
if [ -n "$DB_PORT" ]; then
sed -i "s|^DB_PORT=.*|DB_PORT=$DB_PORT|" "$ENV_FILE"
fi
if [ -n "$DB_DATABASE" ]; then
sed -i "s|^DB_DATABASE=.*|DB_DATABASE=$DB_DATABASE|" "$ENV_FILE"
fi
if [ -n "$DB_USERNAME" ]; then
sed -i "s|^DB_USERNAME=.*|DB_USERNAME=$DB_USERNAME|" "$ENV_FILE"
fi
if [ -n "$DB_PASSWORD" ]; then
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD='$DB_PASSWORD'|" "$ENV_FILE"
fi
if [ -n "$APP_LOCALE" ]; then
sed -i "s|^APP_LOCALE=.*|APP_LOCALE=$APP_LOCALE|" "$ENV_FILE"
fi
if [ -n "$APP_FALLBACK_LOCALE" ]; then
sed -i "s|^APP_FALLBACK_LOCALE=.*|APP_FALLBACK_LOCALE=$APP_FALLBACK_LOCALE|" "$ENV_FILE"
fi
if [ -n "$SESSION_DRIVER" ]; then
sed -i "s|^SESSION_DRIVER=.*|SESSION_DRIVER=$SESSION_DRIVER|" "$ENV_FILE"
fi
if [ -n "$SESSION_LIFETIME" ]; then
sed -i "s|^SESSION_LIFETIME=.*|SESSION_LIFETIME=$SESSION_LIFETIME|" "$ENV_FILE"
fi
if [ -n "$SESSION_ENCRYPT" ]; then
sed -i "s|^SESSION_ENCRYPT=.*|SESSION_ENCRYPT=$SESSION_ENCRYPT|" "$ENV_FILE"
fi
if [ -n "$BCRYPT_ROUNDS" ]; then
sed -i "s|^BCRYPT_ROUNDS=.*|BCRYPT_ROUNDS=$BCRYPT_ROUNDS|" "$ENV_FILE"
fi
if [ -n "$LOG_CHANNEL" ]; then
sed -i "s|^LOG_CHANNEL=.*|LOG_CHANNEL=$LOG_CHANNEL|" "$ENV_FILE"
fi
if [ -n "$LOG_LEVEL" ]; then
sed -i "s|^LOG_LEVEL=.*|LOG_LEVEL=$LOG_LEVEL|" "$ENV_FILE"
fi
if [ -n "$TELEGRAM_BOT_TOKEN" ]; then
sed -i "s|^TELEGRAM_BOT_TOKEN=.*|TELEGRAM_BOT_TOKEN=$TELEGRAM_BOT_TOKEN|" "$ENV_FILE"
fi
if [ -n "$TELEGRAM_WEBHOOK_URL" ]; then
sed -i "s|^TELEGRAM_WEBHOOK_URL=.*|TELEGRAM_WEBHOOK_URL=$TELEGRAM_WEBHOOK_URL|" "$ENV_FILE"
fi
# Verificar si APP_KEY necesita generarse
CURRENT_KEY=$(grep "^APP_KEY=" "$ENV_FILE" | cut -d'=' -f2-)
if [ -z "$CURRENT_KEY" ] || [ "$CURRENT_KEY" == "base64:" ]; then
echo ">>> Generando APP_KEY..."
NEW_KEY=$(php /var/www/html/artisan key:generate --show --no-ansi 2>/dev/null || true)
if [ -n "$NEW_KEY" ]; then
sed -i "s|^APP_KEY=.*|APP_KEY=$NEW_KEY|" "$ENV_FILE"
export APP_KEY=$NEW_KEY
fi
fi
chown laravel:laravel "$ENV_FILE"
chmod 640 "$ENV_FILE"
echo ">>> Archivo .env actualizado con variables de Docker"
else
echo ">>> No existe .env, generando uno nuevo..."
# Generar APP_KEY si no existe
if [ -z "$APP_KEY" ]; then
echo ">>> Generando APP_KEY..."
NEW_KEY=$(php /var/www/html/artisan key:generate --show --no-ansi 2>/dev/null || true)
APP_KEY=$NEW_KEY
fi
cat > "$TEMP_ENV" << ENVEOF
APP_NAME="${APP_NAME:-Nomina Ventas}"
APP_ENV="${APP_ENV:-production}"
APP_KEY=${APP_KEY}
APP_DEBUG=${APP_DEBUG:-false}
APP_URL=${APP_URL:-http://localhost}
APP_LOCALE=${APP_LOCALE:-es}
APP_FALLBACK_LOCALE=${APP_FALLBACK_LOCALE:-es}
LOG_CHANNEL=${LOG_CHANNEL:-stack}
LOG_LEVEL=${LOG_LEVEL:-debug}
DB_CONNECTION=${DB_CONNECTION:-mysql}
DB_HOST=${DB_HOST:-127.0.0.1}
DB_PORT=${DB_PORT:-3306}
DB_DATABASE=${DB_DATABASE:-laravel}
DB_USERNAME=${DB_USERNAME:-root}
APP_DEBUG="${APP_DEBUG:-false}"
APP_URL="${APP_URL:-http://localhost}"
APP_LOCALE="${APP_LOCALE:-es}"
APP_FALLBACK_LOCALE="${APP_FALLBACK_LOCALE:-es}"
APP_FAKER_LOCALE="${APP_FAKER_LOCALE:-es_MX}"
APP_MAINTENANCE_DRIVER="${APP_MAINTENANCE_DRIVER:-file}"
BCRYPT_ROUNDS="${BCRYPT_ROUNDS:-12}"
LOG_CHANNEL="${LOG_CHANNEL:-stack}"
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL="${LOG_LEVEL:-debug}"
DB_CONNECTION="${DB_CONNECTION:-mysql}"
DB_HOST="${DB_HOST:-127.0.0.1}"
DB_PORT="${DB_PORT:-3306}"
DB_DATABASE="${DB_DATABASE:-laravel}"
DB_USERNAME="${DB_USERNAME:-root}"
DB_PASSWORD='${DB_PASSWORD}'
SESSION_DRIVER=${SESSION_DRIVER:-file}
SESSION_LIFETIME=${SESSION_LIFETIME:-120}
SESSION_ENCRYPT=${SESSION_ENCRYPT:-false}
SESSION_PATH=${SESSION_PATH:-/}
SESSION_DOMAIN=${SESSION_DOMAIN:-null}
BROADCAST_CONNECTION=${BROADCAST_CONNECTION:-log}
FILESYSTEM_DISK=${FILESYSTEM_DISK:-local}
QUEUE_CONNECTION=${QUEUE_CONNECTION:-sync}
CACHE_STORE=${CACHE_STORE:-database}
TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
TELEGRAM_WEBHOOK_URL=${TELEGRAM_WEBHOOK_URL}
BCRYPT_ROUNDS=${BCRYPT_ROUNDS:-12}
EOF
SESSION_DRIVER="${SESSION_DRIVER:-database}"
SESSION_LIFETIME="${SESSION_LIFETIME:-120}"
SESSION_ENCRYPT="${SESSION_ENCRYPT:-true}"
SESSION_PATH="/"
SESSION_DOMAIN=null
BROADCAST_CONNECTION="${BROADCAST_CONNECTION:-log}"
FILESYSTEM_DISK="${FILESYSTEM_DISK:-local}"
QUEUE_CONNECTION="${QUEUE_CONNECTION:-database}"
CACHE_STORE="${CACHE_STORE:-database}"
VITE_APP_NAME="\${APP_NAME}"
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN}"
TELEGRAM_WEBHOOK_URL="${TELEGRAM_WEBHOOK_URL}"
ENVEOF
# Intentar mover el temporal al destino final
if cp /tmp/.env.tmp /var/www/html/.env 2>/dev/null; then
# Si pudimos copiarlo, aplicamos permisos
chown laravel:laravel /var/www/html/.env
chmod 640 /var/www/html/.env
# Generar APP_KEY si falta (solo si es escribible)
if [ -z "$APP_KEY" ] || [ "$APP_KEY" == "" ]; then
echo "APP_KEY no detectada, generando una nueva..."
NEW_KEY=$(php /var/www/html/artisan key:generate --show --no-ansi)
sed -i "s|APP_KEY=|APP_KEY=$NEW_KEY|g" /var/www/html/.env
export APP_KEY=$NEW_KEY
if [ -f "$TEMP_ENV" ]; then
mv "$TEMP_ENV" "$ENV_FILE"
chown laravel:laravel "$ENV_FILE"
chmod 640 "$ENV_FILE"
echo ">>> Archivo .env creado"
fi
echo "✅ Archivo .env sincronizado correctamente."
else
echo "⚠️ ADVERTENCIA: No se pudo escribir en /var/www/html/.env"
echo " Probablemente esté montado como volumen de solo lectura (:ro)."
echo " Se usarán los valores del archivo montado externamente."
fi
rm -f /tmp/.env.tmp
# ===== LIMPIAR CACHE =====
echo ">> Limpiando cache..."
# Verificar contenido del .env
echo ""
echo ">>> Contenido actual de .env:"
grep -E "^(APP_NAME|APP_ENV|APP_DEBUG|APP_URL|DB_HOST|DB_PORT|DB_DATABASE|APP_KEY)=" "$ENV_FILE" 2>/dev/null || echo "No se pudo leer el .env"
echo ""
# Limpiar cache
echo "========================================"
echo " Limpiando cache..."
echo "========================================"
php /var/www/html/artisan view:clear 2>/dev/null || true
php /var/www/html/artisan config:clear 2>/dev/null || true
php /var/www/html/artisan cache:clear 2>/dev/null || true
@@ -89,9 +212,12 @@ php /var/www/html/artisan route:clear 2>/dev/null || true
echo ">> Cacheando configuración..."
php /var/www/html/artisan config:cache 2>&1 || true
# ===== VERIFICAR =====
php /var/www/html/artisan about 2>&1 | head -10 || true
echo "========================================"
echo " Estado de la aplicación"
echo "========================================"
php /var/www/html/artisan about 2>&1 | head -15 || true
echo ""
echo "========================================"
echo " Iniciando servicios..."
echo "========================================"