Contratar y configurar el VPS
Actualmente, existen muchos proveedores de VPS, pero en este caso utilizo CloudCone. He adquirido un servidor con Ubuntu 22.04, 2 vCPUs y 1GB de RAM. Una vez contratado el servicio, el siguiente paso es configurarlo.
Para ello, accedo al VPS mediante SSH con el siguiente comando:
ssh root@dirección_id -p puerto
Esto me permite conectarme de forma remota y comenzar con la configuración del servidor.
mateo092 ~ / Desktop / projects ssh root@direccion_ip -p puerto root@dirección_ip's password: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-125-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s just raised the bar for easy, resilient and secure K8s cluster deployment. https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Una vez ingresadas las credenciales, procedemos a actualizar los paquetes del sistema con el siguiente comando:
apt update && apt upgrade -y
Esto garantiza que el sistema esté al día con las últimas actualizaciones de seguridad y rendimiento.
root@vps:~# apt update && apt upgrade -y Hit:1 http://de.archive.ubuntu.com/ubuntu jammy InRelease Hit:2 https://deb.nodesource.com/node_18.x nodistro InRelease Get:3 http://de.archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB] Hit:4 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy InRelease Get:5 http://de.archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB] Get:6 http://de.archive.ubuntu.com/ubuntu jammy-security InRelease [129 kB] Fetched 384 kB in 2s (245 kB/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done All packages are up to date. Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done
..more logs
Instalación de dependencias
Para poner en funcionamiento la API de Laravel, es necesario instalar las siguientes dependencias, que incluyen:
- Servidor de base de datos: MySQL
- Servidor web: Nginx
- Control de versiones: Git
- Extensiones de PHP necesarias: para la ejecución de Laravel
- Gestor de paquetes: composer
apt install -y nginx mysql-server php8.3 php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-curl unzip git
Después de instalar PHP, el siguiente paso es instalar Composer, el gestor de paquetes para PHP.
Inicialmente, la instalación se realiza en el directorio de trabajo actual. Sin embargo, para poder utilizar Composer desde cualquier ubicación en el sistema, es necesario moverlo a un directorio accesible globalmente.
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); exit(1); }"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Ejecutando el siguiente comando, se garantizará que Composer esté disponible en todo el sistema, permitiendo su uso sin necesidad de especificar la ruta completa.
mv composer.phar /usr/local/bin/composer
Configuración de MySQL
Para reforzar la seguridad de MySQL, ejecutamos el siguiente comando, que nos guiará a través de una serie de pasos interactivos:
mysql_secure_installation
Este proceso nos permitirá configurar una contraseña segura para el usuario root, eliminar accesos anónimos, deshabilitar el acceso remoto del usuario root y eliminar la base de datos de prueba. Es recomendable aceptar las opciones sugeridas para mejorar la seguridad del servidor.
Securing the MySQL server deployment.
Enter password for user root: (ingresa la contraseña actual de root, si existe)
Would you like to setup VALIDATE PASSWORD plugin? (Y/n): Y
- Esta opción te permite configurar un plugin que valida la fortaleza de las contraseñas.
Please set the password for root here.
New password: (ingresa una nueva contraseña)
Re-enter new password: (confirma la contraseña)
Remove anonymous users? (Y/n): Y
Disallow root login remotely? (Y/n): Y
Remove test database and access to it? (Y/n): Y
Reload privilege tables now? (Y/n): Y
Una vez asegurada la instalación de MySQL, el siguiente paso es crear la base de datos y el usuario para Laravel.
Primero, nos conectamos al servidor MySQL con el siguiente comando:
mysql -u root -p
Si no has configurado una contraseña para el usuario root omite el parametro -p
root@dev-portfolio-vps:~# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 25 Server version: 8.0.41-0ubuntu0.22.04.1 (Ubuntu) Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
Ingresamos la contraseña configurada previamente y, una vez dentro, ejecutamos los siguientes comandos para crear la base de datos, el usuario y asignarle los permisos necesarios:
CREATE DATABASE auth_api_db;
CREATE USER 'auth_api_user'@'localhost' IDENTIFIED BY 'tu_contraseña';
GRANT ALL PRIVILEGES ON auth_api_db.* TO 'auth_api_user'@'localhost';
FLUSH PRIVILEGES;
Esto garantizará que Laravel tenga acceso a la base de datos y pueda operar sin restricciones dentro de ella.
Subir proyecto al VPS
Con MySQL configurado, el siguiente paso es subir el proyecto Laravel al VPS. Para esto, utilizaremos Git.
Nos ubicamos en el directorio donde queremos alojar la aplicación
cd /var/www
Y clonamos el repositorio con el siguiente comando:
git clone https://github.com/CarlosMateoM/laravel-auth-basic-api.git
root@vps:/var/www$ git clone git@github.com:CarlosMateoM/laravel-auth-basic-api.git
Cloning into 'laravel-auth-basic-api'...
remote: Enumerating objects: 111, done.
remote: Counting objects: 100% (111/111), done.
remote: Compressing objects: 100% (77/77), done.
remote: Total 111 (delta 15), reused 111 (delta 15), pack-reused 0 (from 0)
Receiving objects: 100% (111/111), 72.69 KiB | 1005.00 KiB/s, done.
Resolving deltas: 100% (15/15), done.
Una vez completada la clonación, accedemos al directorio del proyecto.
cd laravel-auth-basic-api/
Configuracion del proyecto
Ubicados en el directorio del proyecto instalamos las dependencias ejecutando:
composer install --no-dev --optimize-autoloader
root@vps:/var/www/laravel-auth-basic-api$ composer install --no-dev --optimize-autoloader Installing dependencies from lock file Verifying lock file contents can be installed on current platform. Package operations: 76 installs, 0 updates, 0 removals - Downloading symfony/http-foundation (v7.2.3) - Downloading guzzlehttp/uri-template (v1.0.4) - Downloading symfony/console (v7.2.1) - Downloading laravel/prompts (v0.3.5) - Downloading tijsverkoyen/css-to-inline-styles (v2.3.0) - Downloading symfony/var-dumper (v7.2.3) - Downloading symfony/routing (v7.2.3) - Downloading symfony/mime (v7.2.3) - Downloading egulias/email-validator (4.0.3) - Downloading symfony/mailer (v7.2.3) - Downloading symfony/error-handler (v7.2.3) - Downloading symfony/http-kernel (v7.2.3)
..more logs
Con el proyecto ya clonado y las dependencias instaladas, ahora configuramos las variables de entorno.
Primero, copiamos el archivo de configuración base y lo renombramos:
cp .env.example .env
Luego, editamos el archivo .env para definir los datos de conexión a la base de datos, asegurándonos de usar el nombre de la base de datos, usuario y contraseña que configuramos anteriormente.
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=auth_api_db
DB_USERNAME=auth_api_user
DB_PASSWORD=fadlicv9982lxlxoa
También es importante configurar el servidor de correo, especificando el servicio de email que utilizaremos, las credenciales y el puerto adecuado. Esto garantizará que Laravel pueda enviar correos correctamente, ya sea para notificaciones, restablecimiento de contraseñas u otras funcionalidades del sistema.
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=carlosmateo@example.com
MAIL_PASSWORD=a*************
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=carlosmateo@example.com
MAIL_FROM_NAME="${APP_NAME}"
Ahora que las variables de entorno están configuradas, el siguiente paso es generar la clave de la aplicación y aplicar las configuraciones necesarias.
Generar la clave de la aplicación
Laravel utiliza una clave secreta para cifrar datos sensibles. Para generarla, se debe ejecutar el comando correspondiente, lo que actualizará el valor de APP_KEY
en el archivo de entorno.
php artisan key:generate
Ejecutar migraciones y seeders
Para preparar la base de datos, se deben ejecutar las migraciones, que crearán las tablas necesarias, y los seeders, en caso de que se necesiten datos iniciales.
php artisan migrate --seed
mateo@dev-portfolio-vps:/var/www/laravel-auth-basic-api$ php artisan migrate APPLICATION IN PRODUCTION. ┌ Are you sure you want to run this command? ──────────────────┐ │ Yes │ └──────────────────────────────────────────────────────────────┘ INFO Preparing database. Creating migration table ............................................................................ 43.31ms DONE INFO Running migrations. 0001_01_01_000000_create_users_table ............................................................... 162.36ms DONE 0001_01_01_000001_create_cache_table ................................................................ 50.12ms DONE 0001_01_01_000002_create_jobs_table ................................................................ 119.62ms DONE 2025_02_11_203404_create_personal_access_tokens_table .............................................. 118.95ms DONE
Configurar permisos
Laravel necesita ciertos permisos para escribir en los directorios de almacenamiento y caché. Es importante otorgarlos correctamente para evitar problemas al guardar logs, sesiones y archivos temporales.
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
Limpiar y optimizar configuración
Para mejorar el rendimiento y evitar problemas con cachés antiguas, es recomendable limpiar la caché de configuración, rutas y otros datos almacenados temporalmente.
php artisan config:clear
php artisan cache:clear
php artisan route:cache
php artisan config:cache
Con esto, Laravel ya está listo para funcionar correctamente en el VPS.
Configuracion del servidor web
Llegó el momento de configurar Nginx para que nuestra API esté accesible desde el navegador o cualquier cliente
Crear un archivo de configuración para Nginx
Es necesario definir un nuevo bloque de servidor con la configuración adecuada para que Nginx redirija las solicitudes a Laravel.
cd /etc/nginx/sites-available/
touch auth_api
Este archivo define la configuración del servidor web Nginx para una API Laravel, basada en la documentación oficial, pero con modificaciones para adaptarse a un entorno de API bajo el subdominio auth-api.mateomartinez.dev
server {
listen 80;
listen [::]:80;
server_name auth-api.mateomartinez.dev;
root /srv/auth-api/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Activar la configuración
Una vez creado el archivo de configuración, hay que activarlo enlazándolo a la carpeta de sitios habilitados.
ln auth_api /etc/nginx/sites-enabled/
Habilitar SSL con Certbot
Para asegurar la comunicación entre el cliente y el servidor, vamos a instalar y configurar un certificado SSL con Certbot. Esto nos permitirá habilitar HTTPS en nuestra API y mejorar la seguridad.
Primero, instalamos Certbot y el complemento para Nginx:
sudo apt install certbot python3-certbot-nginx -y
Luego, ejecutamos Certbot para generar el certificado SSL para nuestro subdominio:
sudo certbot --nginx -d auth-api.mateomartinez.dev
Una vez finalizado el proceso, Certbot configurará automáticamente Nginx para usar el certificado. Si es necesario, revisamos el bloque de configuración del servidor y aseguramos que las directivas listen 443 ssl y ssl_certificate estén correctamente definidas.
root@vps:/var/www/laravel-auth-basic-api$ sudo certbot --nginx -d auth-api.mateomartinez.dev [sudo] password for mateo: Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for auth-api.mateomartinez.dev Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/auth-api.mateomartinez.dev/fullchain.pem Key is saved at: /etc/letsencrypt/live/auth-api.mateomartinez.dev/privkey.pem This certificate expires on 2025-05-16. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for auth-api.mateomartinez.dev to /etc/nginx/sites-enabled/auth_api Congratulations! You have successfully enabled HTTPS on https://auth-api.mateomartinez.dev - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Revisar la configuración y reiniciar Nginx
Antes de aplicar los cambios, es importante comprobar que la configuración no tiene errores. Si todo está en orden, se debe reiniciar Nginx para que los ajustes surtan efecto.
nginx -t
root@vps:/etc/nginx/sites-available$ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Con la configuracion correcta, reiniciamos el servidor web para aplicar los cambios.
systemctl restart nginx
Ahora la API Laravel está lista para recibir solicitudes bajo el subdominio configurado.