El objetivo de esta entrada es explicarles los pasos que realice para colocar una Api Laravel en Servidor Cpanel así como compartirles como revolví algunos detalles con los que me encontré.
En esta guía no estamos ingresando detalles de PHP o configuración si no enfocados al proceso de colocar la api en el servidor Cpanel. Es importante que en Cpanel tengamos configurado la versión de PHP compatible con la que se realizo la Api.
Paso 1. Revisión proyecto local
Verificar que la Api se encuentre correcta en el entorno local, despues de lo cual es recomendable cambiar las siguientes variables en el archivo .env
APP_ENV=production
APP_DEBUG=false
Paso 2.Comprimir el proyecto en un archivo .zip
Paso 3.Configurar Hosting (Cpanel)
Vamos a ingresar al administrador de Cpanel para asegurarnos de que tenga la versión de PHP que necesitamos. Para revisar que versión de PHP requiere tu proyecto lo puedes revisar con el comando
php artisan --version
Con esa información podemos obtener en la pagina oficial de laravel la versión de PHP en la sección #Versiones PHP
Ahora podemos revisar en el servidor que versión tiene de PHP y actualizarla si es necesario, esto lo hacemos desde Avanzado/Configuración PHP
Paso 4. Subir los archivos del proyecto.
Los archivos del proyecto laravel van en la carpeta del Dominio Principal o subdominio donde deseemos montar.
Dominio Principal
Vamos a colocarlo en la carpeta public_html subimos el archivo comprimido .zip una vez que lo realicemos vamos a descomprimir el archivo.
Subdominio
En este caso colocamos la API en un subdominio llamado servicios por lo que cargaremos los .zip que hemos creado, después de subirlo hay que descomprimirlos y podemos borrar los .zip
Paso 5.Modificar archivo Index.php
Este paso es muy importante para indicarle donde se encuentra nuestraa aplicacion laravel, donde estan las rutas etc.
Buscamos el archivo index.php que se encuentra public y lo editamos de la siguiente manera:
require __DIR__.'/CarpetaProyecto/vendor/autoload.php';
$app = require_once __DIR__.'/CarpetaProyecto/bootstrap/app.php';
Si lo tenemos en un subdominio seria de la siguiente manera:
require __DIR__.'/../CarpetaProyecto/vendor/autoload.php';
$app = require_once __DIR__/.././CarpetaProyecto/bootstrap/app.php';
En caso como yo que descomprimi los archivos en la misma carpeta no realice este cambio.
Paso 6.Crear Base de Datos
En este paso debemos crear la base de datos en nuestro servidor en este caso en MySQL, es importante que resguardemos el usuario, contraseña y nombre de la BD que crearemos.
Paso 7.Conectar a Base de Datos
Después de crear la BD debemos editar el archivo .env, con los siguientes datos
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE= "BD"
DB_USERNAME= "usuariocreado"
DB_PASSWORD= "contraseñacreada"
Si todo funciono correctamente y se realizaron los cambios necesarios el proyecto debe estar funcionado correctamente, ejemplo http://hoteldeabejas.org/servicios/
Inconvenientes
Durante mi proceso para colocar esta api en el servidor me tope principalmente con los siguientes dos problemas por lo que quiero compartirles como lo solucione.
Falta de Archivos
Si el proyecto lo descargamos de un repositorio como GitHub hay varias carpetas y archivos que por seguridad no se suben. Como es el caso de la carpeta vendor por que al subir el projecto e intentar ingresar a la url del dominio nos puede aparecer un error como el siguiente:
Warning: require(/home/u437253683/domains/hoteldeabejas.org/public_html/servicios/vendor/autoload.php): failed to open stream: No such file or directory in /home/u437253683/domains/hoteldeabejas.org/public_html/servicios/index.php on line 24
Fatal error: require(): Failed opening required '/home/u437253683/domains/hoteldeabejas.org/public_html/servicios/vendor/autoload.php' (include_path='.:/opt/alt/php74/usr/share/pear') in /home/u437253683/domains/hoteldeabejas.org/public_html/servicios/index.php on line 24
Para resolver esto debemos ejecutar lo siguiente en la consola
composer install
Con esto se vuelve a crear la carpeta vendor.
Error PHP Fatal error: Could not check compatibility between Handler and Illuminate
El siguiente error con el que me encontré me pareció confuso pero tenia que ver con la actualización de Laravel de acuerdo a la documentación oficial.
PHP Fatal error: Could not check compatibility between App\Exceptions\Handler::report(App\Exceptions\Throwable $exception) and Illuminate\Foundation\Exceptions\Handler::report(Throwable $e), because class App\Exceptions\Throwable is not available in /home/u437253683/domains/hoteldeabejas.org/public_html/servicios/app/Exceptions/Handler.php on line 37 PHP Fatal error: Uncaught ReflectionException: Class App\Exceptions\Handler does not exist in/home/u437253683/domains/hoteldeabejas.org/public_html/servicios/vendor/laravel/framework/src/Illuminate/Container/Container.php:830
Laravel 7 utiliza la serie 5.x de los componentes de Symfony por lo que se requieres unos cambios menores para su aplicación.
Estos cambios tienen que ver con los métodos reporte, render etc de Handler que se encuentra en App\Exceptions\Handler
los cuales deben aceptar las instancias de Throwable
en lugar de Exception
Por lo que mi archivo se veía de esta manera:
Archivo con los cambios:
Espero que esta información les pueda ayudar a ser mas sencillo la tarea de colocar su Api en un servidor, así como que los errores que me costo encontrar una solución les puedan guiar para resolver los suyos si se presentan.