Cómo subir Laravel a cPanel y Webuzo paso a paso (sin SSH)

Publicado el
En esta guía subes un proyecto Laravel 13 a un hosting con cPanel o Webuzo usando solo el panel de control: sin acceso SSH y sin el instalador Softaculous. Está pensada para quien ya tiene su proyecto funcionando en su computadora y necesita publicarlo en un hosting compartido.
Antes de empezar
- Tu proyecto Laravel funcionando en tu computadora, con PHP y Composer instalados.
- Un hosting con cPanel o Webuzo y una versión de PHP compatible: Laravel 13 necesita PHP 8.3 o superior (consulta la tabla de compatibilidad Laravel y PHP).
- Una base de datos MySQL si tu aplicación la usa. En nuestros planes, el de 3 GB no incluye MySQL; desde el plan de 5 GB sí.
Paso 1: Prepara el proyecto en tu computadora
Como en el hosting no tendrás terminal, la carpeta vendor/ con las dependencias debe ir ya instalada desde tu computadora.
Usa la misma versión de PHP que tendrá el hosting
Composer elige las dependencias según la versión de PHP de tu computadora. En nuestra prueba, un proyecto preparado con PHP 8.4 no arrancó en un servidor con PHP 8.2 y mostró este mensaje:
Composer detected issues in your platform:
Your Composer dependencies require a PHP version ">= 8.4.1". You are running 8.2.35.
Para evitarlo, usa en tu computadora la misma versión de PHP que vas a elegir en el hosting, o fija esa versión en el proyecto antes de instalar las dependencias:
# Ejemplo: el hosting usará PHP 8.3
composer config platform.php 8.3.0
composer update
Instala las dependencias para producción
composer install --no-dev --optimize-autoloader
Si tu proyecto usa Vite (CSS y JavaScript), compila también los recursos con npm run build: se generará la carpeta public/build.
Ajusta el archivo .env para producción
APP_ENV=production
APP_DEBUG=false
APP_URL=https://tudominio.com
APP_DEBUG=true en producción, cualquier error muestra a los visitantes datos internos de tu aplicación, como rutas y configuración. La documentación de Laravel indica que en producción debe estar siempre en false.Comprime el proyecto en un .zip
Comprime el contenido de la carpeta del proyecto (no hace falta incluir node_modules ni tests). Comprueba que el .zip incluya los archivos ocultos .env y public/.htaccess: en Windows y macOS no se ven por defecto. En nuestra prueba, el .zip de un proyecto nuevo pesó 8,5 MB y tenía unos 7.500 archivos.
Paso 2: Sube y descomprime el proyecto
- Entra a tu panel y abre el Administrador de archivos (tiene el mismo nombre en cPanel y en Webuzo).
- Ve a tu carpeta de inicio (
/home/tuusuario), no apublic_html. - Sube el .zip con el botón Subir y, cuando termine, usa Extraer para descomprimirlo en una carpeta nueva llamada
laravel. - Activa Mostrar archivos ocultos (en cPanel está en Configuración) y comprueba que
laravel/.envexiste.
public_html se puede pedir desde el navegador. Dejando el proyecto fuera, el .env (con las contraseñas de tu base de datos) y el código no quedan expuestos. Solo la carpeta public de Laravel debe ser accesible, como indica la documentación oficial.Paso 3: Copia la carpeta public a public_html
- Entra a
public_htmly borra elindex.htmlo la página por defecto del hosting, si existe. - Abre
laravel/public, selecciona todo su contenido (index.php,.htaccess,favicon.ico,robots.txty la carpetabuildsi existe) y usa Copiar con destino/public_html.
Paso 4: Edita public_html/index.php
El index.php de Laravel busca el resto del proyecto en la carpeta superior. Como el proyecto está en laravel/, hay que cambiar tres rutas y añadir una línea. En el Administrador de archivos, selecciona public_html/index.php y pulsa Editar.
Antes (líneas originales):
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$app->handleRequest(Request::capture());
Después:
if (file_exists($maintenance = __DIR__.'/../laravel/storage/framework/maintenance.php')) {
require __DIR__.'/../laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../laravel/bootstrap/app.php';
$app->usePublicPath(__DIR__);
$app->handleRequest(Request::capture());
La línea usePublicPath(__DIR__) le dice a Laravel que su carpeta pública es ahora public_html. Sin ella, funciones como asset() o los archivos de Vite buscarían en laravel/public.
Paso 5: Elige la versión de PHP del dominio
- Abre Administrador MultiPHP en cPanel o MultiPHP Manager en Webuzo.
- Marca tu dominio, elige PHP 8.4 (o la versión con la que preparaste el proyecto) y aplica el cambio.
public_html/.htaccess. En nuestra prueba, al copiar el .htaccess de Laravel encima del de cPanel, el dominio volvió a la versión de PHP por defecto y la web dio error 500. Si ya te pasó, vuelve a elegir la versión en el Administrador MultiPHP: cPanel añade su bloque al final del .htaccess de Laravel sin estropearlo.En este punto ya puedes abrir tu dominio: si tu proyecto usa SQLite (la opción por defecto de Laravel 13), deberías ver tu aplicación. Si usa MySQL, sigue con el paso 6.
Paso 6: Crea la base de datos MySQL
- cPanel: usa Database Wizard (crea la base de datos, el usuario y los permisos en un solo asistente) o Manage My Databases. Te lo explicamos en cómo crear una base de datos MySQL en cPanel.
- Webuzo: abre Bases de datos, crea la base de datos y el usuario y asígnale todos los privilegios. Guía: base de datos MySQL en Webuzo.
Ambos paneles anteponen tu nombre de usuario: si creas la base app, se llamará tuusuario_app. Usa ese nombre completo en el siguiente paso.
Paso 7: Configura el .env en el servidor
Edita laravel/.env con el Administrador de archivos y completa los datos de la base de datos:
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=tuusuario_app
DB_USERNAME=tuusuario_app
DB_PASSWORD=la-contraseña-del-usuario
En Laravel 13 estas líneas vienen comentadas con #: quita el # del inicio. Revisa también que APP_URL tenga tu dominio con https://.
Paso 8: Ejecuta las migraciones sin SSH (con una tarea cron)
Sin terminal, la forma de ejecutar php artisan migrate es programar una tarea cron que se ejecute una vez y borrarla después.
- Abre Trabajos de cron en cPanel o Tarea programada (Cron) en Webuzo.
- Crea una tarea que se ejecute cada minuto con el comando de tu panel (cambia
tuusuarioy la versión de PHP por las tuyas):
cPanel:
cd /home/tuusuario/laravel && /usr/local/bin/ea-php84 artisan migrate --force >> /home/tuusuario/migracion.log 2>&1
Webuzo:
cd /home/tuusuario/laravel && /usr/local/apps/php84/bin/php artisan migrate --force >> /home/tuusuario/migracion.log 2>&1
- Espera uno o dos minutos y abre
migracion.logen tu carpeta de inicio: cada migración debe terminar enDONE. - Borra la tarea cron. Si la dejas, intentará migrar cada minuto.
El parámetro --force es necesario porque, con APP_ENV=production, Laravel pide confirmación antes de migrar y una tarea cron no puede responder.
php artisan schedule:run cada minuto. Te explicamos cómo crearla en cron jobs en cPanel.Paso 9: Activa el SSL y comprueba tu sitio
En nuestra prueba, ambos paneles emitieron el certificado gratuito de Let’s Encrypt solos al crear la cuenta. Si tu dominio no carga con https://:
- cPanel: abre SSL/TLS Status y pulsa Run AutoSSL. Más detalle en SSL gratis en cPanel.
- Webuzo: sigue la guía para instalar SSL en Webuzo.
Por último, comprueba que https://tudominio.com/.env no muestre el archivo: debe responder con un error 403 o 404.
Errores comunes y cómo resolverlos
El PHP del hosting es más antiguo que el que usaste para preparar el proyecto. Sube la versión en MultiPHP o vuelve a preparar el proyecto con la versión del hosting (paso 1).
Se perdió la versión de PHP que guarda cPanel en el .htaccess. Vuelve a elegirla en el Administrador MultiPHP (paso 5).
Queda un index.html en public_html o no se copió el contenido de laravel/public. Revisa el paso 3.
Revisa en .env el nombre completo de la base y del usuario (con el prefijo tuusuario_) y la contraseña. El detalle del error está en laravel/storage/logs/laravel.log.
Falta la carpeta vendor o está incompleta. Vuelve a ejecutar composer install --no-dev en tu computadora y sube el .zip de nuevo.
No. En nuestros servidores PHP se ejecuta con tu usuario, así que los permisos 755 que dejan los paneles bastan. 777 es inseguro.
cPanel y Webuzo: qué cambia en cada paso
| Paso | cPanel | Webuzo |
|---|---|---|
| Subir y extraer | Administrador de archivos | Administrador de archivos |
| Versión de PHP | Administrador MultiPHP (después de copiar el .htaccess) | MultiPHP Manager |
| Base de datos | Database Wizard / Manage My Databases | Bases de datos |
| Migraciones | Trabajos de cron · /usr/local/bin/ea-php84 | Tarea programada (Cron) · /usr/local/apps/php84/bin/php |
| SSL | Automático (AutoSSL); manual en SSL/TLS Status | Automático (Let’s Encrypt) |
| Acceso SSH | No necesario | No necesario |
Varias versiones de PHP por dominio, MySQL, SSL gratis y soporte en español.
Preguntas frecuentes
database/database.sqlite viaja dentro del proyecto. Para aplicaciones con muchos usuarios simultáneos conviene MySQL..env del servidor). Si hay migraciones nuevas, repite el paso 8 y borra la tarea cron al terminar.Fuentes
Prueba realizada el 26 de octubre de 2026 en servidores de hosting.com.pe.
¿Necesitas hosting rápido y con soporte en español?
Hosting optimizado, SSL gratis y soporte técnico 24/7 desde Perú.
