Guía práctica para crear un Droplet Ubuntu 20.04 para Laravel (Digital Ocean)
Una pequeña historia: (la puedes saltar si buscas directamente el tutorial)
Hace ya varios años decidí tener un droplet (tu propio server virtual) en Digital Ocean y la verdad es que mi vida cambió, en ese momento tuve que aprender comandos de terminal y el por qué de los servicios detrás de la web. Fue una experiencia gratificante, sentí que me ayudó a subir de nivel en cuanto a ofrecer un servicio de programación a mis clientes, si bien mi oferta en ese momento se basaba en WordPress, esto me ahorraba un proveedor externo y desde ese momento, por un fee extra al desarrollo, yo podía incluir el hosting en mi propio server.
Cuando comencé Laravel, me di cuenta que había tomado la mejor decisión, el hecho de tener un droplet en DO, me permitió usar Git, manejar mis propias versiones de los servicios en cualquier capa del LAMP o incluso tener cronjobs personalizados para algunos proyectos.
Hoy en día trabajo para algunas StartUps, casi siempre creamos un sistema basado en Laravel por lo cual uno de mis requerimientos es que el titular o dueño del sistema cree una cuenta en Digital Ocean y afilie sus propios datos de pagos, pues recordemos que estos servicios tienen un cobro mensual y cómo programadores, no debemos ser dueños de las cuentas de proveedores.
Allí es donde entra este tutorial, una guía práctica de configuración de un Droplet con LAMP en Ubuntu 20.04 para Laravel.
Ahora sí, el tutorial ⤵
Selección de imagen
Aquí ya damos por hecho que tienes creada una cuenta en Digital Ocean y el método de pago verificado.
Lo primero que haremos es entrar en https://cloud.digitalocean.com/droplets/new y allí seleccionamos la pestaña Marketplace y buscamos LAMP on Ubuntu 20.04 (en mi opinión la distribución más estable para Laravel)
Selección de plan
Luego, le indicamos que plan queremos, aquí es donde aclaro que depende mucho del proyecto, pero la verdad es que con el plan de $5 es más que suficiente para comenzar cualquier tipo de proyecto, la magia de DO es que luego puedes escalar en RAM, Disco Duro o incluso en servicios de respaldo automático.
Selección de región
Digital Ocean, nos permite seleccionar la ubicación del datacenter en donde queremos que esté nuestro servidor, puedes dejar el de defecto, pero si tu proyecto está más cerca geográficamente de otro datacenter, o te convienen algunas leyes por protección de datos, te recomiendo cambiar la locación.
Últimos toques para crear el droplet
Ahora debes completar los módulos de contraseña, nombre del host y adicionales. Estos módulos son totalmente intuitivos, lo único que debes tener en cuenta es no marcar ningún adicional sino quieres un cobro extra, sin embargo, si tienes la oportunidad, el de respaldo automático por $1 mensual extra, no está mal.
Una vez terminamos de crearlo, nos debe aparecer en la página de proyectos un resumen como este (debes hacer click en el droplet para expandirlo).
En este punto ya hemos creado con éxito nuestra máquina virtual, basada en Ubuntu y con el entorno ideal que necesitamos para Laravel, un entorno LAMP, lo que significa que contiene:
✅ Linux
✅ Apache
✅ Mysql
✅ Php
Muchas personas prefieren instalar el servidor sin ninguno de estos servicios, para luego instalar uno a uno y controlas las versiones que deseas, para esta guía decidí ser lo más practico posible y es por eso que tomamos este camino de la imagen LAMP preconstruida, cómo mínimo nos estamos ahorrando 30min de configuraciones directamente a la terminal.
Ahora, antes de comenzar a instalar nuestro Laravel, necesitamos un par de cosas más:
Configuración del dominio
Estoy dando por hecho que ya tienes un dominio comprado, sino lo tienes, te recomiendo ir a Name Cheap y comprar el que más te guste, a veces, tienen ofertas de dominios con extensiones diferentes a .com en $1.
Lo más importante en este paso, es que el dominio debe estar apuntando a los siguientes NS:
- ns1.digitalocean.com
- ns2.digitalocean.com
Ya con esto, debes entrar a aquí o en el menú lateral Networking > Dominios.
Una vez agregado el dominio, te irás a la página de detalle, y allí verás los records NS que tiene ese registro. En este formulario debes agregar un registro A, marcado un «@» en el campo servidor y seleccionando el droplet que antes creamos en el apartado de «Will Direct To».
El registro A es el que va a permitir apuntar al servidor, si no lo creas, posiblemente al intentar entrar al dominio te dirá que el servidor no fue encontrado.
Es importante hacer todo este proceso con el dominio, pero agregando antes un «www.» Es decir, cómo nuestro ejemplo fue «nombredeldominio.com» ahora debes hacer este proceso de registro de dominio y crear el registro A con el dominio «www.nombredeldominio.com» de esta forma, garantizar que será accesible.
Protip: si quieres agregar los registros de G Suite para manejar los correos electrónicos con Gmail, puedes entrar en la pestaña MX y allí verás un botón de «Add Gmail Records»
Acceso al Servidor
A este punto, nuestro droplet está operativo y debemos acceder a él para continuar, así que, continuando lo práctico de este tutorial, doy por hecho que tienes Putty instalado (si estás en windows) o que usas Linux.
En Win:
putty.exe -ssh root@ipdetudroplet -pw tupassword
En Linux:
> ssh root@ipdetudroplet > tupassword
Con esto entramos en nuestro servidor y de aquí en adelante, estaremos usando la terminal de Linux de nuestro servidor.
Configuración del dominio pt2
Una vez dentro del servidor, debemos encargarnos de crear un virtualhost que apunte a la carpeta de Laravel, en este ejemplo, nuestro proyecto será titulado «demo«.
Generalmente en un servidor apache los sitios web van dentro de la ruta /var/www y esa carpeta le añadimos demo/public que es donde se encuentra el index.php que ejecuta el proyecto Laravel por defecto. Así que la ruta queda /var/www/demo/public
Teniendo eso en cuenta, vamos a modificar un archivo importante de Apache que nos indica las rutas y a qué carpetas van dirigidas.
cd /etc/apache2/sites-enabled nano 000-default.conf
En ese archivo, podemos borrar todo y copiar este código (no olvides personalizar el dominio , tu email y la carpeta donde estará tu proyecto)
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/demo/public <Directory /var/www/demo/public/> Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On RewriteBase /var/www/demo/public </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <IfModule mod_dir.c> DirectoryIndex index.php index.pl index.cgi index.html index.xhtml index.htm </IfModule> </VirtualHost> <VirtualHost *:80> ServerAdmin edo@boozt.la DocumentRoot /var/www/demo/public ServerName nombredeldominio.com ServerAlias www.nombredeldominio.com <Directory /var/www/demo/public> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Ahora solo nos falta reiniciar el apache, pero antes, debemos actualizar nuestros repositorios y activar una extensión de Apache «RewriteEngine» así que pasaremos estos comandos:
sudo apt-get update sudo apt-get dist-upgrade sudo a2enmod rewrite
Una vez realizado esto, ahora si reiniciamos Apache
sudo service apache2 reload
Lo único que nos falta en cuanto a dominios es activar el SSL, pero lo haremos más tarde.
Configuración de Mysql
Esto lo hacemos para obtener una contraseña nueva y segura que podamos usar con nuestro proyecto.
mysql_secure_installation
Aquí, comienza una validación de preguntas para configuraciones extra, donde básicamente le damos «no» a la primera opción que nos pide un plugin validador de passwords, y luego nos pedirá nuestra contraseña dos veces (recuerda este password, será importante). A las demás preguntas, puedes darle «si» con tranquilidad.
Luego de eso, tenemos que crear la base de datos que usaremos para el proyecto, crear un usuario y ajustar los permisos.
sudo mysql
(Si te falla este comando por alguna razón, puedes intentar con root)
sudo mysql -u root -p
Y te pedirá el password que acabamos de crear al configurar el Mysql. Dentro de Mysql, ejecutamos:
CREATE DATABASE demo; CREATE USER 'demouser'@'%' IDENTIFIED WITH mysql_native_password BY 'passwordseguro'; GRANT ALL ON demo.* TO 'demouser'@'%'; exit
Composer & Git
Muchas veces ya están instalados al crear el droplet, sin embargo, aquí están los comandos que debemos correr:
curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer sudo apt-get install git
La hora de clonar el repo
En este punto estoy asumiendo que encontraste este tutorial para instalar tu proyecto laravel en un hosting público, así que ya debes tener un repositorio en GitHub, GitLab, BitBucket o cualquier otra página de este tipo.
Sólo tenemos que ir a la carpeta /var/www/ y allí clonar
cd /var/www/ git clone https://gitlab.com/demogit demo
Una vez clonado, lo siguiente que vamos a hacer, es traer todas las dependencias del proyecto usando composer, así que entraremos en la carpeta del proyecto y pasaremos el siguiente comando:
cd demo sudo composer install
Seguro en este punto te dio error el composer, así que lo más común es que hayan falta dependencias de las extensiones php.
sudo apt-get install php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-intl php7.4-mysql php7.4-xml php7.4-zip
Nota: ajustar la versión del php a la que tengas, puedes verla usando
php -v
Luego de esto, vuelve a correr el comando de composer install y él se encargará de descargar e instalar las dependencias.
Permisos de escritura para carpeta Storage
Esta carpeta la necesita Laravel para los archivos temporales, sin eso lo más seguro es que tengas un error 500 al intentar acceder.
cd /var/www/demo sudo chown -R www-data: storage sudo chmod -R 755 storage
El famoso archivo .env
Este archivo es el que contiene las variables de entorno del proyecto, es por eso que allí tenemos que indicar la conexión con la base de datos, al traer el git, este archivo nunca se copia ya que tiene un gitignore por dentro. Es por eso que debemos crear este archivo:
sudo nano .env
Una vez adentro, podemos modificar y pegar esta plantilla:
APP_NAME="DEMO" APP_ENV=online APP_DEBUG=true APP_URL=localhost DEBUGBAR_ENABLED=false DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=demo DB_USERNAME=demouser DB_PASSWORD=passwordseguro
Luego guardamos el archivo (control + o) y salimos (control + w).
Migrations y Seeders
Una vez conectado el proyecto con la base de datos, lo único que nos falta es instalar la data real, para eso, si tienes un sistema de migrations y seeders en Laravel, sólo tienes que pasar el siguiente comando:
php artisan migrate --seed
Con esto, hemos terminado de implementar nuestro Laravel en un droplet de Digital Ocean. De aquí en adelante sólo debes entrar en la carpeta del proyecto para hacer un git pull constantemente, y con eso tienes las configuraciones básicas de tu server.
Poco a poco le puedes agregar funciones a tu server, cronjobs de seguridad y respaldo, phpmyadmin para base de datos, integración con slack, o incluso certificado SSL gratis. (puedes ver el tutorial de SSL con LetsEncrypt en este link)
¡Si te ha gustado este tuto, déjame tu comentario!