Saltar al contenido principal

VPS como entorno de producción

· 12 min de lectura
Oscar Adrian Ortiz Bustos

Introducción

En el mundo de la tecnología, es común que nosotros como desarrolladores despleguemos nuestras aplicaciones de manera local. Esto nos brinda la facilidad de poder probar nuestras aplicaciones en un entorno controlado, y nos permite realizar cambios y pruebas rápidamente. Y aunque esto es muy útil muchas veces queremos que nuestras aplicaciones estén disponibles para que los usuarios puedan acceder a ellas en cualquier momento y desde cualquier lugar. Sabemos que hay muchas maneras de poder darle acceso a los usuarios a nuestro entorno de desarrollo local, tal como lo explico en Despliegue local del chatbot.

Sin embargo, en el mundo real, es necesario desplegar las aplicaciones en un servidor, para que los usuarios puedan acceder a ellas desde cualquier parte del mundo. En este artículo, mostraré cómo desplegar una aplicación en un servidor VPS, específicamente en Hostinger.

¿Qué es un VPS?

Un Virtual Private Server (VPS para los amigos) es un tipo de alojamiento web que combina las características de un servidor dedicado con las de un servidor compartido. Esto significa que el servidor está dividido en varios servidores virtuales, cada uno con sus propios recursos y sistema operativo, pero que comparten el mismo hardware.

Es una buena opción si no queremos utilizar un servidor dedicado (o no podemos costearlo), pero necesitamos más recursos que los que nos ofrece un servidor compartido. Además, nos permite tener un control total sobre el servidor, ya que podemos instalar cualquier software que necesitemos.

Me gusta verlo como una computadora en la nube, que podemos utilizar para desplegar nuestras aplicaciones.

¿Por qué usar un VPS?

Una de las principales razones para utilizar un VPS es que nos permite tener un control total sobre el servidor. Esto significa que podemos instalar cualquier software que necesitemos, y podemos configurar el servidor a nuestro gusto. Además, nos permite tener acceso a los recursos del servidor, como la memoria RAM, el espacio en disco, etc.

Ventajas y desventajas

Un VPS tiene muchas ventajas, entre las cuales podemos encontrar:

  1. Escalabilidad y flexibilidad: Podemos escalar el servidor a medida que crece nuestro negocio, y podemos añadir más recursos si es necesario.
  2. Costo-beneficio: Esta asequibilidad hace que el alojamiento de VPS sea una opción atractiva para las pequeñas y medianas empresas que buscan optimizar su presencia en línea sin ir a la quiebra.
  3. Rendimiento: El rendimiento de un VPS es mejor que el de un servidor compartido. Dado que tiene recursos dedicados asignados a él, puede experimentar tiempos de carga más rápidos y un mejor rendimiento general.
  4. Recursos dedicados: El VPS le da acceso a recursos dedicados, como la memoria RAM, el espacio en disco, etc. Esto significa que no tiene que preocuparse de que otros usuarios utilicen sus recursos, ya que tiene su propio servidor virtual.
  5. Mayor seguridad: La seguridad es una de las principales preocupaciones para cualquier presencia en línea. Con un VPS, podemos obtener una seguridad mejorada en comparación con un servidor compartido. Esto se debe a que nuestro servidor está aislado de otros servidores, lo que significa que no tenemos que preocuparnos de que otros usuarios accedan a nuestros datos. Además, se tiene más control sobre las configuraciones de seguridad del servidor, incluyendo el firewall.

Por otro lado, existen algunas desventajas que debemos tener en cuenta:

  1. Recursos limitados: Si bien un VPS proporciona recursos dedicados, todavía nos encontramos con limitaciones en cuanto a la cantidad de CPU, RAM y almacenamiento que se puede asignar. Aunque cabe aclarar que esto depende del plan que contratemos.
  2. Conocimientos técnicos: Aunque no es necesario ser un experto en tecnología para utilizar un VPS, sí es necesario tener algunos conocimientos técnicos para configurar el servidor y mantenerlo. Como usuarios de un VPS nosotros somos los responsables de gestionar y configurar el servidor, la instalación de software, las configuraciones de seguridad y el mantenimiento regular.
  3. Dependencia del proveedor de alojamiento: Si bien un VPS nos da más control sobre el servidor, todavía dependemos del proveedor de alojamiento para la gestión del hardware y el mantenimiento del servidor. Esto significa que si el proveedor de alojamiento tiene problemas técnicos, nuestro sitio web también se verá afectado. Es crucial elegir un proveedor de alojamiento fiable para evitar este tipo de problemas, además de que cuente con soporte técnico las 24 horas del día, los 7 días de la semana.
  4. Posible tiempo de inactividad: Si el servidor se cae, nuestro sitio web también se cae. Esto puede ocurrir debido a problemas técnicos, ataques de hackers, etc. Es importante tener en cuenta que esto puede ocurrir con cualquier tipo de alojamiento, no sólo con un VPS.
  5. Entorno compartido: Si bien el alojamiento VPS ofrece recursos dedicados, todavía funciona dentro de un entorno de servidor físico compartido. Esto significa que el rendimiento general del servidor puede verse afectado por otros usuarios que comparten el mismo servidor físico.

¿Qué es Hostinger?

No me voy a detener mucho en este punto, ya que es un proveedor de alojamiento web, y no es el objetivo de este artículo. Sin embargo, es importante mencionarlo, ya que es el proveedor de alojamiento que utilizo para desplegar mis aplicaciones. Existen muchos otros, entre los más comunes podemos encontrar DigitalOcean, Linode, Vultr, Amazon Web Services, Google Cloud Platform, entre otros.

VPS

Lo primero que tenemos que hacer es crear una cuenta en Hostinger. Una vez creada podemos irnos a la página de VPS y elegir el plan que más nos convenga.

Los planes son:

Planes

En La cueva del NeanderTech usamos el plan KVM 1 que tiene las siguientes características:

  • CPU de 1 núcleo
  • 4GB de RAM
  • 50 GB NVMe de almacenamiento
  • Ancho de banda de 1 TB

Información del VPS

Como podemos ver en la siguiente imagen, una vez que contratamos el plan, podemos ver la información del VPS, como la dirección IP, el nombre de usuario y la contraseña.

Información del VPS

Se está utilizando Ubuntu 22.04 LTS como sistema operativo, que es la versión más reciente de Ubuntu.

Acceso al VPS

Hay distintas formas de acceder al VPS, la más común es a través de SSH. Para ello necesitamos un cliente SSH, en mi caso uso directamente la terminal de mi sistema operativo, que es Ubuntu 22.04 LTS. Sin embargo, también podemos utilizar un cliente SSH como PuTTY o Bitvise. Asegúrate de no tener ningún firewall que bloquee el acceso al puerto 22, que es el puerto por defecto que utiliza SSH.

Para acceder al VPS a través de la terminal, utilizamos el siguiente comando:

ssh <usuario>@<dirección IP>

Por defecto el usuario es root, y la dirección IP la podemos encontrar en la información del VPS. Una vez que ingresamos el comando, se nos pedirá la contraseña, que también podemos encontrar en la información del VPS.

Esa información la podemos encontrar en el panel de control de Hostinger, en la sección de Acceso SSH, como se muestra en la siguiente imagen:

Acceso SSH

Y en la pestaña de "Detalles del plan" se muestra la configuración del VPS, como se muestra en la siguiente imagen:

Detalles del plan

Desplegando la aplicación

Me gustaría mostrar todo el proceso con imágenes, pero por cuestiones de seguridad no puedo mostrar la información del VPS. Sin embargo, voy a explicar los pasos que hay que seguir para configurar el VPS.

Como mencione entre las "Desventajas" de un VPS, es necesario tener algunos conocimientos técnicos para configurar el servidor. En este caso, voy a explicar cómo configurar el VPS para desplegar un servidor de Nginx.

Después de acceder al VPS mediante SSH, lo primero que tenemos que hacer es actualizar el sistema operativo, para ello utilizamos el siguiente comando:

sudo apt update && sudo apt upgrade -y

Como mencioné anteriormente el usuario por defecto es root, pero es una buena práctica crear un nuevo usuario. Para ello utilizamos los siguientes comandos:

sudo adduser <nombre de usuario>

Ese comando nos pedirá una contraseña y algunos datos adicionales. Una vez que se haya creado el usuario, tenemos que darle permisos de administrador, para ello utilizamos el siguiente comando:

sudo usermod -aG sudo <nombre de usuario>
caution

Si no se agrega el usuario al grupo sudo, no podremos utilizar el comando sudo.

Por lo general, Nginx viene instalado por defecto, pero en caso de que no tenemos que instalarlo. Para ello utilizamos el siguiente comando:

sudo apt install nginx

Aplicación flask

La aplicación que vamos a desplegar en esta ocasión es un servidor de Nginx que sirve una aplicación de flask. Para ello tenemos que instalar flask y gunicorn con el siguiente comando:

pip install flask guincorn

Configuración de Nginx

Para configurar Nginx tenemos que crear el archivo /etc/nginx/sites-enabled/flask-app con el siguiente comando:

touch /etc/nginx/sites-enabled/flask-app

Y procedemos a editar el archivo con el siguiente comando:

nvim /etc/nginx/sites-enabled/flask-app
Nota

En La cueva del NeanderTech somos fieles a Neovim, pero puedes utilizar el editor de texto que más te guste.

Nos aseguramos de que el archivo flask-app tenga el siguiente contenido:

server {
listen 80;
server_name <dirección IP>;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Advertencia

Es necesario desvincular el archivo default con el siguiente comando:

sudo unlink /etc/nginx/sites-enabled/default

Para comprobar que la configuración de Nginx es correcta, utilizamos el siguiente comando:

sudo nginx -t

Nos debe de dar una respuesta similar a la siguiente:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

De lo contrario, tenemos que revisar la configuración de Nginx.

Posteriormente es necesario reiniciar Nginx con el siguiente comando:

sudo nginx -s reload

Ahora si ingresamos la dirección IP del VPS en el navegador, lo más probable es que nos muestre un error 502, que significa que no se puede conectar con el servidor. Esto es porque no hemos configurado la aplicación de flask.

Obteniendo archivos

Para poder copiar la aplicación de flask al VPS, necesitamos instalar git con el siguiente comando:

git clone <dirección del repositorio>

También se puede hacer con FTP o scp, pero en este caso vamos a utilizar git.

Una vez que tenemos el repositorio en el VPS, es necesario instalar las dependencias de nuestra aplicación. En este caso suponemos que se tiene un archivo requirements.txt con las dependencias de la aplicación. Se puede instalar globalmente, pero es una buena práctica instalarlo en un entorno virtual. Para ello utilizamos los siguientes comandos:

pip install virtualenv

Y para crear el entorno virtual utilizamos el siguiente comando:

virtualenv <nombre del entorno virtual>

Para activar el entorno virtual utilizamos el siguiente comando:

source <nombre del entorno virtual>/bin/activate

Y para desactivarlo una vez que hayamos terminado utilizamos el siguiente comando:

deactivate

Cada que activemos el entorno virtual, se mostrará el nombre del entorno virtual entre paréntesis en la terminal.

Ahora si, podemos instalar las dependencias de la aplicación con el siguiente comando:

pip install -r requirements.txt
Advertencia

En dado caso de que no esté instalado pip, podemos instalarlo con el siguiente comando:

sudo apt install python3-pip

Esto instalará las dependencias de la aplicación en el entorno virtual.

Cuidado

Es necesario habilitar el puerto 5000 en el firewall, para ello utilizamos el siguiente comando:

sudo ufw allow 5000

O el puerto que se haya configurado en la aplicación.

En la aplicación Flask debemos de colocar el host en la instancia de la aplicación de la siguiente forma:

app.run(host='127.0.0.0', port=5000)

Variables de entorno

Es bastante común que las aplicaciones tengan variables de entorno, por lo que es necesario configurarlas. Y hay varias formas de hacerlo, podría ser hacer un export directamente en nuestro archivo .bashrc o .zshrc, pero en este caso vamos a utilizar un archivo .env.

Configuración de Gunicorn

Guincorn es un servidor HTTP para aplicaciones WSGI escritas en Python. Es importante debido a que Nginx no es capaz de ejecutar aplicaciones de flask directamente, por lo que es necesario utilizar un servidor WSGI.

Para lanzarlo utilizamos el siguiente comando:

gunicorn --workers=3 app:app

El primer app se refiere al nombre del archivo de la aplicación, mientras que el segundo app se refiere al nombre de la aplicación dentro del archivo.

Con esto ya deberíamos de tener nuestra aplicación funcionando, pero si queremos que se ejecute en segundo plano e incluso saliendo de la sesión de SSH, tenemos que utilizar el siguiente comando:

nohup gunicorn --workers=3 app:app &
Advertencia

Si no usamos nohup y salimos de la sesión de SSH, la aplicación se detendrá.

Ahora si ingresamos la dirección IP del VPS en el navegador, deberíamos de ver la aplicación funcionando.

AppDeployed

Conclusión

Como pudimos ver, el despliegue de aplicaciones en un entorno de producción es un paso esencial para permitir a los usuarios acceder a ellas desde cualquier parte del mundo.

El proceso de desplegar una aplicación en un servidor VPS, como lo demostramos con Hostinger, involucra pasos clave. A pesar de no haber podido mostrar imágenes por cuestiones de seguridad, pudimos mostrar los pasos a seguir para desplegar una aplicación de flask en un servidor VPS.

Cada inicio tiene su propio final, y cada final marca un nuevo comienzo.

— Proverbio Chino