Deploy De Proyectos Laravel en Host Compartido (Principiantes)
En este post explico con manzanitas 🍎 el paso a paso para el proceso de desplegar una aplicación de Laravel en un servicio de servidor compartido o "shared hosting".
Originally published in https://platzi.com/blog/guia-deploy-laravel/
Este tal vez fue mi primer post pĂşblico sobre algo tĂ©cnico, fue originalmente publicado en el portal de Platzi, y me sorprende la manera en la que lo redactĂ©... Recuerdo que el equipo de Platzi me diĂł muchos consejos para cambiar el tono de mi post, ya que se sometĂan a revisiones y querĂan que todos los posts sonaran similar, pero de igual manera fue algo muy informativo en su momento. Tal vez valga la pena actualizarlo a las nuevas versiones de Laravel, ya que la versiĂłn que andaba manejando en ese entonces fue la v7
, en una de las infinitas iteraciones que ha tenido este sitio 🤣 el repo aĂşn sigue con vida y lo pueden checar aquĂ.
Recuerdo que el objetivo de escribir esta guĂa fue explĂcitamente para principiantes que a penas sabĂan hacer un "hola mundo", pero el equipo de Platzi no me dejĂł titularlo "GuĂa de deploy en Laravel para tontos".
Terminaste tu proyecto en Laravel y estás muy emocionado, ya que lograste programar un sistema web funcional con un framework muy robusto. ¿Y ahora qué?, ¿subo todo el montón de carpetas asà sin más en mi hosting?
Si bien, existen herramientas que nos ayudan a hacer deploy de una manera profesional, aprender a hacer un buen uso de estas nos puede llegar a tomar algo de tiempo. Por este motivo el dĂa de hoy te voy a explicar en 11 sencillos pasos cĂłmo es que puedes hacer deploy a tus proyectos hechos en Laravel sin hacer uso de ninguna herramienta adicional.
Antes de empezar
Primero que nada quiero avisarte que en esta guĂa usaremos la terminal, por tal motivo te recomiendo pases por el Curso de IntroducciĂłn a la Terminal y LĂnea de Comandos para que estĂ©s un poco familiarizado con el tema.
TambiĂ©n es necesario recalcar que tu servicio de hosting necesita brindarte la opciĂłn de acceder a la terminal de tu servidor, y al manejador de archivos. La mayorĂa de los servicios deberĂan tener estas opciones, si no contiene la opciĂłn de acceder a la terminal como tal, busca si se puede acceder por medio de una conexiĂłn SSH (serĂa otro tema muy aparte el explicarte este proceso, busca en la documentaciĂłn de tu servidor de hosting).
Para este tutorial estaremos utilizando cPanel.
1. .gitignore
Primero que nada, hay que tener en claro que Laravel utiliza una tonelada de librerĂas las cuales fueron instaladas con Composer. Esas librerĂas están listadas en dos archivos: composer.lock y composer.json.
Para este primer paso es necesario que tu proyecto estĂ© en un repositorio en la nube, como puede ser en la plataforma de GitHub. No es necesario incluir todas las librerĂas que descargaste, necesitamos excluir algunas carpetas que nuestro proyecto genera automáticamente. ÂżCĂłmo sĂ© cuales carpetas que Laravel genera automáticamente debo excluir? La carpeta principal serĂa la de vendor/ donde se guarda todo lo que Composer descarga, pero si no quieres fallar en este aspecto, dirĂgete a esta página que te genera tus archivos .gitignore automáticos.
En la página le especificamos las tecnologĂas que estamos usando, en este caso mi editor Visual Studio Code me llega a generar carpetas que no son necesarias incluir en nuestro repositorio, asĂ como Laravel y Node en caso de que hayas incluido librerĂas JavaScript con npm.
Lo siguiente es darle a Create y copiar todas las lĂneas que te genera en un archivo que se ubique en la RAĂŤZ de tu proyecto con el nombre de .gitignore.
Con esto ya tenemos excluidas todas las carpetas que no necesitamos, puedes hacer commit de todos tus archivos y subirlos a tu repositorio en la nube.
2. Abrir la Terminal
No, no es la terminal o CMD de tu computadora, tiene que ser la terminal que te ofrece tu servicio de hosting. En mi caso, pago un hosting compartido en la plataforma de Namecheap, la cual tiene como interfaz cPanel.
3. Clonar tu repositorio
Primeramente debemos conocer la estructura que tendrá nuestro directorio en el servidor:
.txthome/ # La raĂz de tu servidor │── public_html/ # Carpeta principal de tu dominio └── repositorio/ # Carpeta de tu repositorio clonado
Las demás carpetas que se encuentren en el mismo nivel ignóralas, ahora solo nos centraremos en public\_html
 y en la carpeta de tu repositorio.
Escribimos el siguiente comando en la terminal:
.bash$ git clone url-del-repositorio
4. Instalar dependencias
Al ejecutar git clone
 automáticamente se nos crea una carpeta con el mismo nombre del repositorio, dentro se descargaron todos los archivos de nuestro proyecto.
.txthome/ │── cloned_laravel_project/ │ ├── .git/ │ ├── app/ │ ├── bootstrap/ │ ├── config/ │ ├── database/ │ ├── public/ │ ├── resources/ │ ├── routes/ │ ├── storage/ │ ├── tests/ │ └── vendor/ │── public_ftp/ └── public_html/
Lo siguiente es posicionarnos dentro de esa carpeta:
.bash$ cd portfolio/
Ya ubicados, instalamos las dependencias con composer
:
.bash$ composer install
Tu servidor deberĂa tener composer instalado, aunque no está de más checar primero con el comando composer -v
.
Una vez hecho esto se instalarán todas las dependencias listadas en composer.lock
y composer.json
, esto puede tardar algunos minutos dependiendo de tu conexiĂłn y la del servidor.
5. Mover carpeta public/
Los archivos base que hacen que nuestra página se visualice están dentro de public/
. Todo lo que está contenido dentro de esa carpeta, tiene que ir dentro de public\_html
.
Nos vamos a nuestra carpeta del repositorio y nos posicionamos dentro de la carpeta public/
.
Seleccionamos todos los archivos y carpetas y damos clic derecho, elegimos la opciĂłn de move:
Nos saldrá una ventana para especificar la ruta a donde moveremos los archivos, simplemente escribimos /public\_html/
 y presionamos en Move files:
Luego de esto notaremos que la carpeta quedĂł vacĂa, y si nos dirigimos a public\_html/
, veremos que todos nuestros archivos están posicionados ahĂ.
6. Editar el index.php
¡Ya casi terminamos! No es asĂ de simple solo mover los archivos de una carpeta a otra, tambiĂ©n necesitamos modificar un par de lĂneas en nuestro archivo index.php
. En cPanel se puede hacer directamente seleccionando el archivo, dando clic derecho y en Edit:
Al presionar Edit sale otra ventana para confirmar que se va a editar el archivo, simplemente aceptamos y continuamos. Se abre otra ventana en la cual vamos a poder visualizar el cĂłdigo como muestro a continuaciĂłn, en donde buscaremos las lĂneas $app = require_once __DIR__.'/../bootstrap/app.php';
y require __DIR__.'/../vendor/autoload.php';
, y la reemplazaremos por lo siguiente:
.php<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/
// require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../cloned_laravel_project/vendor/autoload.php';
/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/
// $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once __DIR__.'/../cloned_laravel_project/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
Como se puede observar, se dejaron comentadas las lĂneas originales en donde se especifican las rutas para la carpeta vendor y bootstrap.
Ahora te explico cĂłmo es que modificamos las nuevas rutas:
__DIR__.’/
 nos hace referencia al directorio raĂz, en este caso esÂpublic\_html
- Debemos regresar un nivel atrás para estar en el home de nuestro servidor conÂ
…/
- Como ya estamos en el home, ya solo queda localizar el archivoÂ
autoload.php
 que está ubicado enÂportfolio/vendor/autoload.php
. - Uniendo todos estos puntos nuestra ruta final quedaÂ
__DIR__.'/../portfolio/vendor/autoload.php'
.
Lo mismo hacemos con la carpeta de bootstrap.
7. Crear la base de datos
cPanel tiene una herramienta para crear bases de datos automáticamente. Nos vamos nuevamente al menú principal y en el buscador escribimos database y entramos en MySQL Databases.
Lo que sigue es demasiado fácil, la primera sección es para crear bases de datos, y basta con solo escribir el nombre y dar clic en Create database.
Todas las bases de datos contienen forzosamente un prefijo con el usuario y un guion bajo, es importante tenerlo en cuenta para cuando se especifique el nombre de la base de datos más adelante.
Más abajo nos dirigimos a crear un nuevo usuario para nuestra base de datos, de igual manera nos obliga a agregar el prefijo en el nombre del usuario.
Una vez hecho esto solo falta darle los privilegios del nuevo usuario a la base de datos correspondiente, más abajo encontraremos esa sección.
Seleccionamos la base de datos correcta y nos manda a otra página en la cual se seleccionarán TODOS los privilegios.
8. Configurar archivo .env
Ya teniendo la base de datos y el usuario hechos, procederemos a configurar el archivo .env
, ese donde establecemos las credenciales de la base de datos, entre otras cosas.
Si seguiste el primer paso del .gitignore
, te darás cuenta de que nos excluyó el archivo original .env
 y solamente nos dejó el .env.example.
 Esto sucede ya que ahà se pudieron haber puesto las contraseñas de alguna API, base de datos externa, etc. al momento de trabajar en local con nuestro proyecto, y es peligroso subir este tipo de archivos confidenciales a un repositorio en GitHub.
En cambio, lo que tenemos que hacer es renombrar el archivo .env.example
 a que diga solo .env
, ya que este contiene la misma informaciĂłn pero con los campos vacĂos.
De igual forma como lo hicimos con el archivo index.php
, lo podemos editar ahĂ mismo, llenando los campos correspondientes:
.txtDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=1234
La dirección del host la debes de conocer, usualmente al haber contratado tu servicio de hosting se te manda toda esta información en un correo electrónico o en tu dashboard.
El puerto casi siempre suele ser 3306.
En este momento la base de datos está vacĂa, pero podemos hacer uso de los comandos artisan
. Para esto tenemos que volver nuevamente a la terminal del servidor. Debes comprobar en todo momento estar ubicado en la carpeta del repositorio, si por alguna razón se ha salido de la terminal, simplemente es entrar y poner cd carpeta-del-repo/
.
Y tan simple como ejecutar php artisan migrate
 para que haga efecto. Si se tiene alguna seed para alimentar la base de datos, agregamos el parámetro --seed
.
OJO
El error más común que salga después de ejecutar las migraciones puede ser el siguiente:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
Esto se soluciona editando el archivo ubicado en app/Providers/AppServiceProvider.php
.
En las primeras lĂneas agregamos use Illuminate\Support\Facades\Schema;
, y en la función boot()
que por defecto está vacĂa, agregamos Schema::defaultStringLength(191);
.
Guardamos los cambios, y no olvides volver a correr el comando php artisan migrate:fresh
 para borrar y volver a hacer las migraciones desde cero y sin errores.
9. Crear el acceso directo a storage/
En caso de que utilices la carpeta de storage/ o no, es importante crear de todas formas el acceso directo para poder acceder desde public_html, recuerda que la carpeta de storage está ubicada en la del repositorio.
Tan simple como correr el comando php artisan storage:link
.
Esto es lo mismo que ejecutar el siguiente cĂłdigo en la terminal:
.bash$ ln -s ~/carpeta-repositorio/storage/app/public/ ~/public_html/storage
10. Dar permisos a storage/ y bootstrap/
Tenemos que dar permisos adicionales para las carpetas storage/
 y bootstrap/
 con el siguiente comando. Recuerda que seguimos posicionados dentro de la carpeta del repositorio.
.bash$ chmod -R o+w storage/ bootstrap/
11. Limpiar caché y generar llave
¡Ya terminamos! Solo queda limpiar el caché de configuración ejecutando php artisan config:cache
.
También se tiene que generar una clave para poder acceder a la página correctamente, con el comando php artisan key:generate
.
Ahora cada vez que hagamos un cambio en el proyecto, lo subimos a GitHub, nos posicionamos de nuevo en la terminal y dentro de la carpeta de nuestro repositorio hacemos git pull origin master
.
Recuerda que si hubo archivos nuevos dentro de la carpeta public, como archivos CSS, JavaScript o imágenes, estas las tendremos que pasar otra vez dentro de public_html.
¡Felicidades! Si llegaste hasta aquĂ significa que lograste hacer deploy a tu proyecto en Laravel sin morir en el intento, tal vez esta guĂa puede parecer muy extensa, pero al final te diste cuenta de que no es nada complicado si realizas los pasos tal como te los detallĂ©.