VPS 5: Implementación de una aplicación full-stack
Posted on February 3, 2025 • 10 minutes • 2033 words • Other languages: English
- Qué es “Roundest Pokémon”?
- ¿Qué vamos a necesitar?
- Agregar recurso PostgreSQL
- pgAdmin
- Crear una aplicación de GitHub en Coolify
- Despliegue mediante GitHub App
- Uso de recursos del VPS
- Una conclusión sentimental para el blog de VPS
Esta es la quinta y última parte de mi VPS blog series .
Qué es “Roundest Pokémon”?
“Roundest Pokémon” es un ejercicio de programación común que consiste en un juego de votación interactivo para decidir qué Pokémon es el más redondo.
Vamos a añadirle una novedad: la posibilidad de elegir qué sistema de backend procesa la votación.
Esta característica nos ayudará a ilustrar cómo se pueden implementar diferentes sistemas y trabajar juntos sin problemas, todos implementados en el VPS bajo un proyecto Coolify.
¿Qué vamos a necesitar?
- Una base de datos (voy a usar Postgres
)
- Un administrador de base de datos: no es crucial para la aplicación en sí, pero es necesario para crear y editar esquemas si no quieres confiar en la función DDL Auto de Hibernate . Voy a usar pgAdmin .
- La aplicación frontend (yo usé Next.js).
- Las diferentes aplicaciones backend:
Todas las aplicaciones fueron escritas por mí. En el futuro, publicaré artículos sobre ellas.
Agregar recurso PostgreSQL
- Crea un nuevo proyecto:
- Haz clic en Projects en el menú de la izquierda.
- Haz clic en Add a new project.
- Nómbralo “roundest_pokemon”.
- Haz clic en Create. Deberías tener un proyecto “roundest_pokemon” creado.
- Agrega un nuevo recurso PostgreSQL:
- Ve a tu proyecto “roundest_pokemon”.
- Haz clic en + New.
- En Databases, selecciona Postgres.
- Selecciona la opción predeterminada, ya que aquí solo necesitamos una base de datos SQL simple.
- Deje todo como está predeterminado y haga clic en Start.
¿Cómo podemos gestionar la base de datos?
- Exponer la base de datos al Internet: una opción totalmente válida, pero que implicaría:
- Cambiar las configuraciones del firewall para exponer un nuevo puerto.
- Estar en riesgo de sufrir ataques de fuerza bruta.
- Utilizar una interfaz web para gestionar la base de datos sin exponerla públicamente: mantiene la base de datos privada a la vez que permite ejecutar consultas dentro de la red interna.
Optemos por el segundo enfoque.
pgAdmin
Agregar el recurso Docker
-
Ve al proyecto “roundest_pokemon”.
- Es muy importante que esté dentro del mismo proyecto, de lo contrario, pgAdmin no podrá acceder a la base de datos ya creada.
-
Haz clic en + New.
-
En Docker Based, seleccione Docker Image.
-
Se solicitará que indique un nombre de imagen. Escribe
dpage/pgadmin4
y haga clic en Guardar. -
Asígnele un dominio (como
https://pgadmin4.yourdomain.com
) y haz clic en Guardar. -
En Enviroment Variables, agregue las credenciales que se usarán para iniciar sesión en pgAdmin:
PGADMIN_DEFAULT_EMAIL
PGADMIN_DEFAULT_PASSWORD
(caracteres alfanuméricos, no símbolos)
Agregar un nuevo servidor
-
Ve a
pgadmin4.yourdomain.com
e inicia sesión con las credenciales que ingresaste en las variables de entorno dedpage/pgadmin4
. -
Una vez dentro, ve a Add new server.
-
En General, puedes darle el nombre que quieras
-
En Connection, debes completar:
- Host name/address: el nombre del host de la URL interna de PostgreSQL (está entre
@
y:5432
). - Port: por defecto es
5432
. - Username: el nombre de usuario de PostgreSQL.
- Host name/address: el nombre del host de la URL interna de PostgreSQL (está entre
-
Al guardar, se te pedirá la contraseña.
Ahora puedes ejecutar consultas a la base de datos, manteniéndola segura dentro de la red interna.
Rellenar datos iniciales
-
En la barra lateral izquierda, en Servers -> el servidor que acabas de agregar -> Databases -> Schemas, haz clic derecho y seleccione Query Tool. Se abrirá una consola de consulta.
-
Pega y ejecuta este script sql que crea una tabla para los Pokémon + inserta Pokémon de primera generación, con 0 votos iniciales.
-
Recupere los datos creados para comprobar que todo esté bien.
SELECT * FROM pokemons;
Crear un usuario específico para su aplicación
Crear un usuario específico para su aplicación (en lugar de usar el superusuario de postgres predeterminado u otras cuentas de administrador) es una práctica recomendada de seguridad y operativa.
Creemos un usuario con acceso limitado al esquema público:
-- Create backend_app_user
CREATE USER backend_app_user WITH PASSWORD 'your_secure_password_here';
-- Grant Basic Connection Permissions
GRANT CONNECT ON DATABASE postgres TO backend_app_user;
-- Grant Schema Permissions
GRANT USAGE ON SCHEMA public TO backend_app_user;
-- Grant Table Permissions: For existing tables
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO backend_app_user;
-- Grant Table Permissions: For future tables (default privileges)
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO backend_app_user;
-- Grant Sequence Permissions: For existing sequences
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO backend_app_user;
-- Grant Sequence Permissions: For future sequences
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO backend_app_user;
Crear una aplicación de GitHub en Coolify
¿Por qué?
- Para implementar repositorios privados.
- Para habilitar despliegues automáticas a través de webhooks.
¿Cómo?
- Accede a las fuentes en Coolify:
- Navega hasta Sources en tu panel de Coolify.
- Haz clic en Add para crear una nueva aplicación de GitHub.
- Configura la aplicación de GitHub:
-
Proporciona un nombre único para tu aplicación de GitHub (por ejemplo,
coolify-pollito-tech
). El nombre es único a nivel global en GitHub. -
Establece el Webhook Endpoint a la HTTPS URL de tu instancia de Coolify (el HTTP puede causar problemas de entrega del webhook).
-
Haz clic en Register Now para continuar en GitHub.
-
- Configurar el acceso al repositorio en GitHub:
- Siga el principio de “privilegio mínimo”, otorgue acceso solo a los repositorios que planea implementar.
- Haz clic en Install para finalizar la configuración de la aplicación de GitHub.
- Verificar los permisos en Coolify:
-
Regresa a Coolify y haz clic en Refetch para confirmar que la aplicación de GitHub tiene los permisos correctos.
-
Una configuración exitosa mostrará que la aplicación tiene acceso a los repositorios seleccionados.
-
Para agregar nuevos repositorios más tarde, haz clic en Update Repositories. Esto lo redireccionará a GitHub, donde puede actualizar el acceso al repositorio.
Despliegue mediante GitHub App
Spring Boot
Implementemos una de las aplicaciones backend.
- Dirígete a tu proyecto “roundest_pokemon”.
- Es muy importante que estés dentro del mismo proyecto, de lo contrario, la aplicación no podrá acceder a la base de datos ya creada.
- Haz clic en + New.
- En Git Based, selecciona Repositorio privado (con aplicación de GitHub).
- Elige el repositorio que contiene la aplicación.
- Puedes dejar todo lo demás como predeterminado, ya que lo configuras en el siguiente paso.
- Configurar los ajustes de la aplicación:
- Application Type: este repositorio cuenta con un Dockerfile que yo personalmente he probado un poco y hasta ahora parece funcionar bien. Así que selecciona Dockerfile.
- Agrega tu custom domain (por ejemplo,
app.your-domain.com
) - Si te desplazas un poco hacia abajo, encontrarás la sección Network. Para estas aplicaciones de backend, en Ports exposes, establece
8080
. El puerto puede variar entre diferentes tipos de aplicaciones. - En Environment Variables, agregue todas las que necesite la aplicación. En esta aplicación en particular, necesito el host de la base de datos, el puerto, la base de datos, el nombre de usuario y la contraseña. Recuerde utilizar el usuario y la contraseña de la base de datos específica que creamos anteriormente.
- Deploy: Coolify hará lo siguiente:
- Clonará el repositorio.
- Construirá la imagen de Docker usando el archivo Dockerfile.
- Desplegará el contenedor con las variables de entorno y dominio configurado.
Visite “https://app.your-domain.com ” para confirmar que la aplicación esté activa.
Baile y repita para todas las aplicaciones Spring Boot similares.
Next.js
El proceso de implementación de las aplicaciones Next.js es casi idéntico al backend de Spring Boot, con un cambio de configuración clave:
- Vaya a su proyecto (por ejemplo, “roundest_pokemon”).
- Se aplica requisito de estar en el mismo proyecto, esto garantiza que el frontend pueda comunicarse con los servicios del backend.
- Haga clic en + New -> Private Repository (with GitHub App).
- Seleccione su repositorio Next.js.
- Configurar los ajustes de la aplicación:
- Application Type: seleccione Nixpacks . Detecta automáticamente Next.js y maneja las optimizaciones de compilación.
- Agregue su dominio frontend (por ejemplo,
vote.your-domain.com
). - En la sección Network: Establezca el puerto expuesto en
3000
(puerto predeterminado de Next.js). - Agregue cualquier Environment Variable requerida.
- Deploy.
Puedes interactuar con mi resultado final aquí . No prometo mantenerlo disponible para siempre, ya que puedo usar este VPS para otros proyectos que puedan necesitar la totalidad del poder computacional.
Uso de recursos del VPS
Esta captura de pantalla captura el VPS ejecutándose inactivo y muestra varias métricas de recursos.
Recordemos que este VPS está ejecutando:
- Una aplicación Next.js.
- Una aplicación Java.
- Una aplicación Kotlin.
- Una aplicación Groovy.
- Una base de datos (Postgres).
- Un gestor de bases de datos (pgadmin).
- Glances (monitorización).
- Coolify, el panel de administración desde donde gestionamos las aplicaciones.
Descripción general del sistema
- CPU: el sistema utiliza aproximadamente el 8,1 % de la CPU, y la mayor parte del uso proviene de procesos en segundo plano.
- Memoria: el 34,3 % de la RAM está en uso, con algo de swap space asignado pero no utilizado activamente.
- Promedio de carga: la carga del sistema sigue siendo baja, con un promedio de 15 minutos de 0,26, lo que indica una actividad mínima.
- E/S de disco: no se producen operaciones de lectura/escritura significativas, lo que significa que no hay un uso intensivo del disco.
- Red: actividad mínima de la red, con solo unos pocos kilobytes de datos transferidos.
Actividad de contenedores y procesos
- Hay varios contenedores Docker en ejecución, pero la mayoría están inactivos.
- Los procesos que más consumen CPU incluyen:
python3
ejecutandoglances
para monitoreo.dockerd
administrando contenedores.- Servicios en segundo plano como
redis-server
yphp-fpm
, necesarios para Coolify - Procesos
java
(los sistemas backend).
Alertas críticas
El sistema ha registrado alertas de alto uso de CPU en el pasado debido a java
, python3
y dockerd
. Esto ocurrió durante la implementación de los servicios de backend.
Una conclusión sentimental para el blog de VPS
Esta se ha convertido en mi serie de blog favorita de todas las que he escrito.
Quiero tomarme un momento para reflexionar sobre lo lejos que hemos llegado juntos. Cuando preguntamos por primera vez: “¿Qué es un VPS?”
- En la Parte 1, reconocimos el atractivo de la tecnología sin servidor y, al mismo tiempo, abrazamos el valor de tener el control de tu propio servidor. No necesitas construir el próximo Facebook para merecer una infraestructura que sea confiable, flexible y tuya.
- En la Parte 2, nos pusimos manos a la obra y construimos una base: elegimos un proveedor, reforzamos la seguridad y sentamos las bases para todo lo que vendría después. No fue glamoroso, pero, como plantar un árbol, echó raíces para el crecimiento.
- Luego vino la Parte 3, donde Coolify entró en escena, transformando nuestro VPS de un lienzo en blanco a un poderoso conjunto de herramientas. Con proxies, HTTPS y firewalls, convertimos la complejidad en simplicidad, demostrando que la administración de servidores moderna puede ser sólida y accesible.
- La Parte 4 le dio vida a nuestro servidor con Glances, un panel de control en tiempo real protegido por Caddy.
- Finalmente, en la Parte 5, implementamos una aplicación completa con una base de datos.
Esta serie trata sobre el placer de crear un espacio que es completamente tuyo, libre de los caprichos de los precios opacos de la nube y soluciones mágicas. Se trata de la confianza silenciosa: saber que, incluso si tu aplicación sigue siendo pequeña, se ejecutará sin problemas, de forma segura y en tus términos.
A medida que avanza, recuerde que todo experto fue alguna vez un principiante que utilizó SSH por primera vez. El servidor es un compañero, no un crítico. Experimenta, rompe cosas (¡y luego arréglelas!) y celebra los logros, ya sea que se trate de aplicar una regla de firewall o implementar esa primera aplicación.
Si has seguido este tutorial, ahora no solo tienes un VPS, sino también el conocimiento para adaptarlo a lo que tus proyectos requieran. Sigue experimentando, aprendiendo y, lo más importante, sigue creando cosas que te importen.
¡Te deseo un feliz hosting! ~Pollito <🐤/>