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.
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.
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.
Como ves, yo le especifiqué las tecnologías que estoy 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 salen a continuación 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.
No, no es la terminal o CMD de tu computadora, tiene que ser la terminal que te ofrece tu servicio de hosting.
Si tienes una barra de búsqueda, escribe terminal o consola y entra en ella.
Primeramente debemos conocer la estructura que tendrá nuestro directorio en el servidor:
** /home/ //La raíz de tu servidor
|
** /public_html/ //Carpeta principal de tu dominio
|
** /repositorio/ //Carpeta del 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:
$ git cloneurl-del-repositorio
La URL de tu repositoriO, en el caso de GitHub, la consigues de la siguiente forma:
Para no entrar en detalles y evitarte problemas, usa la opción de HTTPS, copia el enlace que te brinda y pégalo en el comando anterior. Comúnmente la terminal no reconoce la combinación de teclas Ctrl + C y Ctrl + V, así que te recomiendo que utilices el mouse para hacer eso.
Probablemente te pida ingresar tu usuario y contraseña de GitHub, en este caso no, ya que se han realizado antes otros deploys.
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.
Lo siguiente es posicionarnos dentro de esa carpeta:
$ cd portfolio/
Ya ubicados, instalamos las dependencias con composer:
$ 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.
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í.
¡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 cambiar las siguientes líneas:
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.portfolio/vendor/autoload.php
.__DIR__.’/../portfolio/vendor/autoload.php’
.Lo mismo hacemos con la carpeta de bootstrap.
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.
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:
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 erroror access violation: 1071 Specified key was too long; maxkeylengthis1000 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.
En caso de que salga algún otro problema, déjalo aquí en la sección de comentarios y con gusto te ayudo a resolverlo.
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:
$ ln -s ~/carpeta-repositorio/storage/app/public/ ~/public_html/storage
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.
$ chmod -R o+w storage/ bootstrap/
¡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é.
Laravel es un framework muy extenso y con muchas funcionalidades, puedes hacer cosas que vayan mucho más allá de un simple CRUD, el siguiente paso que quiero que hagas es descubrir esas cosas que no sabías que podías hacer completando el nuevo Curso Avanzado de Laravel.
Recuerda que si tienes dudas o si tuviste problemas en algún paso, puedes dejar un comentario en este post y con gusto te ayudaré a resolverlo.
Amigo no se si es mi impresion o segun he leido el archivo .env no se configura para produccion, este solo es para ambientes de desarollo, lo que se edita en el archivo .env va es en los archivos que estan en la carpeta config y el .env debe eliminarse.
Ahí si tengo total desconocimiento del tema, pero voy a informarme y tal vez arme otro post explicando como usar las variables de entorno para ambientes en producción. ¡Muchas gracias!
Hola @juanda.dev, yo tengo un problema parecido en un host que usa xampp, coloque 2 proyectos cada con un usuario a bd diferente y a veces la variables de entorno se quedan como en memoria, y dan error de acceso a las tablas por que cada usuario tiene acceso a sus propias tablas
Me va casi todo perfecto.
Carga todas las vistas que no requieren uso de la BD.
Cuando intento logearme o registrarme, me tira error 500.
Alguien lo soluciono?
Podrías pasar algún screenshot del mensaje de error
como tal?
Tengo el mismo problema, me podrias ayudar porfa?
hice esta pregunta en starkoverflow no tengo respuestas todavía 😦 https://es.stackoverflow.com/questions/558563/instalando-una-aplicación-laravel-en-un-subdirectorio-apache-linux
Gracias, tengo una dudad ¿Como mejorar el tiempo de carga con Laravel?
Hay 3 comandos muy importantes para correr a nivel de producción:
composer install --optimize-autoloader --no-dev
para quitar de los paquetes que no necesitamos a nivel de producciónphp artisan config:cache
para guardar la configuraciónphp artisan route:cache
para optimizar las rutasVi que se omitieron diversos pasos en la guía que pudieron explicarse 🤔
la carpeta migratios se sube tambien?
Por supuesto que si, todos esos archivos son necesarios. Si seguiste mi consejo de generar tu archivo .gitignore en la página al agregar la esctructura para Laravel te va a generar todos aquellos directorios que no necesitas subir a tu repo en GitHub 😉
Buen día a todos. Soy nuevo en el desarrollo. Soy de Colombia. Realicé un peqeño erp en Laravel para una empresa y tengo dudas de si debería irme con un hosting compartido o si debo usar un vps. La ida es pagar lo menos posible pero que el aplicativo funcione bien. ¿Qué me recomiendan?
gracias, excelente información y muy útil!
justo lo que buscaba gracias!
Muchísimas gracias, justo tenía varias dudas sobre este proceso.
Por favor, recomendaria hacer un nota de recomendacion, que esta guia es para hacer deploy en Hosting Compartidos, ya que en VPS, seria un caso diferente:
!Excelente aporte! Nunca he probado algo más allá del hosting compartido ya que los costos se elevan un poco más, pero tu comentario es de mucha ayuda, gracias!
es posible hacer esto con un host compartido?
o hay algun host que recomienden para este tipo de proyectos?
¡Por supuesto! yo tengo host compartido en la plataforma de Namecheap, aunque es la única que he utilizado en mi vida, estoy satisfecho ya que también su soporte es muy eficiente a la hora de solicitar recursos adicionales o solucionar problemas 😃
recuerdo que en mi primera migración con laravel sufri mucho, gracias por la información
En el Paso 5. Se puede mover todo el contenido de la carpeta generada al hacer un git clone a public_html y crear un archivo .htaccess en esta misma carpeta, con este codigo:
<IfModule mod_rewrite.c>RewriteEngineonRewriteRule ^(.*)$ public/$1 [L]</IfModule>
Creo que es una buena opcion asi no se tiene que modificar archivos del proyecto…
🤘😁
Cuando ejecuto el comando:
composer install
me aparece el siguiente error:Failed to download doctrine/inflector from dist: The Process class relies on proc_open, which isnot available on your PHP installation. Now trying to download from source``` Alguien lo ha solucionado?
Checa que tu versión de PHP sea compatible con la versión que estás usando de Laravel, también que estén habilitadas las extensiones correctas. Aquí puedes checar los requerimientos que te digo, mero arriba hay un input donde cambias a la versión que estás usando de Laravel.
Hola yo instale mi aplicación laravel en un subdominio y estoy autenticando con sanctum pero cuando intento acceder todas las rutas devuelven un error 302 a qué se debe ?
Mi despliegue quedó de la siguiente manera
Subdominio .midomino.com -> app laravel
Dominio .com ->spa con nuxt
Que podría ser ? Muchas gracias
Alguien me podría ayudar, subí 2 apis rest de laravel a un servidor con XAMPP, cada api tiene su propio usuario de bd y cada usuario no comparten su acceso a las dos bd’s, parece que las variables de entorno se quedaran como guardadas en memoria o algo que en algunas ocasiones devuelve “usuario sin acceso a la bd” y es por que intento consulta la una bd que no tiene permisos
Yo tengo problemas con el storage para acceso publico… me puedes apoyar?
me Marca error 403
Alguien sabe como puedo configurar un vps de Hostgator para hacer el deploy de laravel? He hecho de todo lo que encuentro en internet y nada funciona, Alguien ha tenido la experiencia ?
No podia publicar mi servidor de pruebas, muchas gracias excelente aporte