Parte 4. Como clonar el ejemplo parzibyte

Origen: https://github.com/parzibyte/sistema-ventas-spring-boot

Destino debian 13

No usarse en producción. Es muy buen ejemplo de frontend bien manejado y de back end que hace que te te corran o multen a la empresa o las dos cosas. En el siguiente tema explico porqué.

El código no lo hice yo. Es de calidad basnte buena para 2019 con sus puntos de falla y me sirve paraexplicar cosas en cursos de spring boot o de qarqkus.

Normalmente se prestaa  dudas si es Gardle o Maven. Aqui estan los dos archivos.  Parece que usa el maven pero puedes adaptarlo a usar el build de gradle. No. en realidad es Gradle  y dejaron el pom del Maven.

Esto que sigue es Creado por GEMINI.

Repito no lo escribí yo.

Solo asegúrate de que al copiar el script de Bash al servidor, las comillas no se hayan convertido en «comillas tipográficas» (« » o “ ”) por el editor del blog, ya que Linux solo reconoce las comillas simples ' o dobles " rectas. Si el usuario copia las inclinadas, el script fallará.

Guía de Despliegue: Sistema de Ventas Spring Boot

1. Requisitos Previos en el Servidor

Antes de clonar, asegúrate de tener instaladas las herramientas base:

  • Java JDK 8: (Fundamental, ya que el pom.xml apunta a esta versión).

  • Gradle y Maven: Para gestionar las dependencias y compilar. Parece que el real es GRADLE build.

  • MariaDB/MySQL: Funcionando.

Bash

# En Debian/Ubuntu
sudo apt update
sudo apt install openjdk-8-jdk maven mariadb-server

2. Espejo (Mirror) o Clonación a Gitea

Para tener el código bajo tu control en tu instancia de Gitea:

  1. Entra a tu panel de Gitea.

  2. Haz clic en el botón «+» y selecciona «Nueva migración».

  3. En «URL de migración», pega: https://github.com/parzibyte/sistema-ventas-spring-boot.git.

  4. Asígnale el nombre sistema-ventas y guárdalo.

3. Clonación desde Gitea al Directorio de Trabajo

Ahora, desde la terminal de tu servidor, descarga el código desde tu repositorio:

Bash

cd /var/www/  # O tu ruta preferida
git clone http://tu-ip-gitea:3000/tu-usuario/sistema-ventas.git
cd sistema-ventas

4. Configuración de la Base de Datos

Debes crear la base de datos manualmente. Entra a MySQL:

SQL

CREATE DATABASE ventas_springboot;

Importante: Como vimos que el código usa Float y MyISAM, no intentes forzar InnoDB en este punto para evitar conflictos con el hibernate_sequence que trae el proyecto.

5. Configuración de Acceso (application.properties)

Este archivo es el que vincula el Back-End con la DB. Como el repo original podría no traerlo configurado para tu entorno, créalo:

Bash

nano src/main/resources/application.properties

Pega y ajusta lo siguiente:

Properties

spring.datasource.url=jdbc:mysql://localhost:3306/ventas_springboot?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=tu_contraseña_aqui

# ddl-auto=update creará las tablas automáticamente al arrancar
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false

6. Compilación y Empaquetado

Aquí es donde Maven leerá el pom.xml y descargará los cientos de archivos que mencionamos:

Bash

# Limpia versiones previas y empaqueta el JAR saltando los tests
mvn clean package -DskipTests

Si todo sale bien, verás un mensaje de BUILD SUCCESS y un archivo generado en target/gs-rest-service-0.1.0.jar.

7. Ejecución del Sistema

Para correrlo de forma simple:

Bash

java -jar target/gs-rest-service-0.1.0.jar

Para dejarlo corriendo en segundo plano (como un servicio):

Bash

nohup java -jar target/gs-rest-service-0.1.0.jar > log_ventas.txt 2>&1 &





Script que puedes hacer paso por paso.

Este script hace todo el trabajo sucio: baja los cambios, compila, detiene la versión anterior y levanta la nueva.

1. El Script de Automatización (actualizar_sistema.sh)
Crea este archivo en la raíz de donde clonaste el proyecto:

Bash

#!/bin/bash

# — CONFIGURACIÓN —
APP_NAME=»sistema-ventas-springboot»
JAR_PATH=»target/gs-rest-service-0.1.0.jar»
LOG_FILE=»ejecucion_sistema.log»

echo «— Iniciando actualización de $APP_NAME —»

# 1. Bajar cambios de tu Gitea
echo «[1/4] Sincronizando con Gitea…»
git pull origin master

# 2. Compilar con Maven
echo «[2/4] Compilando y empaquetando (Maven)…»
mvn clean package -DskipTests

if [ $? -ne 0 ]; then
echo «ERROR: La compilación falló. Revisa el código.»
exit 1
fi

# 3. Detener el proceso anterior si existe
echo «[3/4] Deteniendo instancia anterior…»
PID=$(pgrep -f $JAR_PATH)
if [ -z «$PID» ]; then
echo «No había ninguna instancia corriendo.»
else
kill -9 $PID
echo «Instancia (PID: $PID) detenida.»
fi

# 4. Levantar la nueva versión
echo «[4/4] Levantando nueva versión…»
nohup java -jar $JAR_PATH > $LOG_FILE 2>&1 &

echo «— Proceso terminado con éxito —»
echo «Puedes ver el log en tiempo real con: tail -f $LOG_FILE»

Bonus Gitea actions simplificado

Para que este script funcione en tu servidor, el usuario (o tú) debe seguir estos pasos finales:

Dar permisos de ejecución:

Bash

chmod +x actualizar_sistema.sh
Ejecutarlo cada vez que haya cambios:

Bash

./actualizar_sistema.sh
3. El «Toque Maestro»: Webhook de Gitea (Opcional)
Si quieres que sea 100% automático (que al darle push desde tu laptop a Gitea, el servidor se actualice solo):

En Gitea, ve a la configuración de tu repositorio: Settings > Webhooks.

Añade un Webhook de tipo Gitea.

En la URL del objetivo, pon la dirección de un pequeño script que ejecute ./actualizar_sistema.sh con todas las ordenes anteriores

 

Cine de terror y servidores

He comentado que crecí solamente con mi papá desde los diez meses de edad. Volví a ver a mi mamá eventualmente a eso de los siete años y solo los vi juntos una vez en mi vida  (cinco minutos) entre 1982 y 1984. Mi papá lo manejó tan bien que, durante muchos años, no me di cuenta de que otras familias tenían papá y mamá. Y qué bueno que me quedé con él después del divorcio, por cierto.

Pero una de las cosas que hacía mi papá era llevarme, desde los seis o siete años(1978-1979) aprox, a ciclos de películas de todo tipo en los cines Bella Época y Elektra. Comprabas un abono y podías ver unas 30 películas diferentes en una misma semana. Así que, cuando no viajaba con él por trabajo, después de comer y ver qué tarea había, tocaba ir los dos al cine. Fácilmente estuve ahí unas veinte semanas al año.

Me tocó ver varias veces ciclos de películas de terror de todo tipo. No las infames de Ed Wood, pero sí todas las de Nosferatu, Frankenstein, Drácula, La cosa y El bebé de Rosemary. Cuando vinieron mis primas Marcela y Angélica de Guadalajara, yo tenía unos ocho años y él nos llevó a los tres a ver como cinco películas de terror adicionales en el Bella Época. Mis primas debían de tener unos 9 y 12 años.

El caso es que hoy, buscando información para un cliente al que tengo que ir a ver, vi una fotografía y me acordé de un 30 de abril donde vi unas películas infames. Ya las busqué y sí existen: El terror del pueblo chico, que era literalmente un western musical actuado por enanos; y una llamada Los marcianos se llevaron a Santa Claus. Y era SERIA no era comedia. Sí, no las imaginé.

Entre esos recuerdos hay secuencias que a uno NO se le olvidan. La surrealista escena de los enanos en el bar parece de pesadilla pero, sí, no la imaginé.

https://en.wikipedia.org/wiki/The_Terror_of_Tiny_Town

Y hubo otras secuencias. Por ejemplo, recuerdo varias de películas de terror. En una, unas mujeres vueltas vampiro eran reclutadas a lo Charles Manson, con medallones que les permitían moverse de día en centros comerciales y negaban a sus familiares. U otras de terror ambientadas en cazas de brujas en la Inglaterra de 1600 y en Salem, incluyendo hachazos, sorpresas y vampiros. No eran malas; no era comedia de terror, sino terror para adultos en lo que cabe.

Se me pasaba decir que el género de películas no era terror tal cual, sino algo que los italianos llaman giallo, que es una mezcla de terror ,slasher, thriller, etc y no solo italiano. Por ejemplo, de la del Dr. Phibes me acuerdo bien por las motivaciones absolutamente creíbles y por unos cinco asesinatos de los que tengo presentes unos tres. A la que matan desde el piso de arriba con el ácido, por ejemplo.

https://en.wikipedia.org/wiki/The_Abominable_Dr._Phibes

https://en.wikipedia.org/wiki/Giallo

Aunque parezca que eran puras de terror, no. También me tocaron las películas de Mario Lanza y Fred Astaire. No sé cuántas veces vi Las siete colinas de Roma. O las de El Gordo y el Flaco (Fra Diavolo, por ejemplo). O películas de los Barrymore. Musicales de Howard Keel. El Ladrón de Bagdad. Beau Geste. Películas de esa época: El prisionero de Zenda, Shane, el desconocido.

¡¡¡Shane!!!

El ciclo de películas llegó a su fin más o menos en 1982. Recuerdo que por entonces fui a ver una con mi papá llamada Happy Birthday to Me, que aunque tenga reseñas negativas, la volví a ver y era buena película. Dos o tres muertes memorables; el argumento no era predecible, ni entonces a los 10 años ni a los 35 cuando la volví a ver. Pero para esas alturas, creo que fue la última película de terror que vi. Sé de qué van Pesadilla en la calle del infierno, Chucky y todas esas, pero me dan flojera.

El caso es que, en 1982, había visto más películas de terror (giallo) y clásicas que nadie que yo supiera a mi edad. Dificultades financieras en casa, más cambios en la política de los abonos y la programación, hicieron que a mediados de 1983 dejáramos de ir a esos cines. Y creo que en el 1982 ya no me dejaban entrar por la edad a películas de terror por nuevas leyes. Todavía recuerdo, en 1984, haber visto en el Elektra cinco veces seguidas The Last Starfighter. ¡Peliculón de ciencia ficción!

¿Qué tiene que ver esto con servidores? Pues el surrealismo.

Literalmente, me he encontrado con que hablen de un «superservidor» con un GB de RAM en 2010 por el que pagaban 1500-1600 USD mensuales (20 mil pesos) en la empresa de satélites (el de la guitarra eléctrica), o cómo cuando he tenido que arreglar desastres de microservicios que me recordaban al Mago de Oz y al western de los enanos.

He revisado mucho código fuente ajeno, muchos documentos de Word y Excel creados por profesionistas, pero hay una sensación de sorpresa que me da a veces descubrir servidores ajenos. Como dato, en el año 2012 rescaté de un rancho a dos cachorritas de perro de 15 días, antes de que las matara su papá, y las tuve conmigo hasta su muerte por edad. Una de ellas era una chihuahua miniaturizada y con pelo estilo diente de león. De chiquita parecía otra cosa. Pero dos veterinarios, al verla, dijeron: «¿Y esto qué es?».

Así me pasa al ver ciertos servidores.

Seguiré las guías mañana. Tengo dos tareas de la universidad y que ir a cobrarle a un cliente en el mundo real.

Checklists de Prompts Inteligencia Artificial

Hace unos 35 años empecé a usar un método de control de prioridades, llamado «Administración por objetivos». Que yo recuerde, el creador es Drucker antes que yo naciera, mediados de los 50s. En algunos libros vi puntos de referencia y en los 80s salieron varios libros más que llegaron a México cuando ya eran principios conocidos.

Por ejemplo, yo las usaba desde los 80s para mi vida personal, y cuando empecé a trabajar en 1991, usé APO para dar soluciones, sobre objetivos realistas u útiles, pero no arbitrarios.

Pues resulta que hace rato me puse a leer un libro sobre Inteligencia Artificial que escribió un cliente mío. No doy el nombre porque los de la secta (una que me atacó durante años y que seguro me lee de repente después de su oso) podrían atacarlo, pero el caso es que era un libro sobre Inteligencia Artificial y sus usos para usar experiencia propia, sumado a enfoque de IA e iteraciones. En lo personal es un uso de sentido común.

Además de la parte sobre ética, y que me consta que yo lo introduje a Claude LLM al cliente hace unos meses, el enfoque hizo el libro fácil de leer. Pero lo que me llamó mucho la atención era un checklist de cómo realizar consultas «prompt» a la IA. Sí, parece que son de sentido común pero para mí los elementos son evidentes si conoces APO y nunca se me habría ocurrido formalizarlo de este modo específico para prompts de IA. Su checklist es excelente.

Solo puse una mejora: constraints o reglas, es decir, limitaciones de lo que puedes o no puedes hacer de manera ética o financiera. Y eso el autor del libro lo menciona como de pasada en la parte de ética, pero es una guía muy buena.

Checklist de elaboración de Prompts para IA.

  • Tarea clara
  • Contexto Relevante
  • Ejemplo o modelo
    • Constraints o reglas – independientes del Contexto
  • Persona Asumida (Rol o Punto de vista)
  • Tono deseado
  • Formato Específico (lista tabla, esquema pasos)

Fubar y la Horda o las sorpresas brutales

Este tema es una pequeña reflexión acerca de la relación entre unos eventos que pasaron hace un mes y hace unos ocho años en EVE Online. También tiene cierta relación con eventos de geopolítica del mundo real.

El sábado, conversando en las reuniones en los azulejos, me acordé de un evento que comenté en la mesa sobre el juego EVE Online allá por 2017 y una nave Titán perdida que, por suerte, nos salvó de una masacre solo por aterrizar frente a nuestros enemigos y en perfecta posición de tiro hacia ellos.

Tengo que aclarar que, cuando hablo de la Horda, no me refiero a la Horda de World of Warcraft, sino a la alianza PANDEMIC HORDE de Eve Online. En lo personal, tengo 17 de 70 personajes en la Horda en WOW y 53 en la Alianza, debido a lo confusa que es su ciudad principal, a pesar de que puedo vivir en Dalaran y de lo bien que se ven los orcos de piel roja en armadura.

Yo uso claves gráficas similares al “clima de oficina” y, en este caso, aunque no entro a WoW desde hace uno o dos años, este es un warrior orco rojo comerciante en el reino de la Horda.

En computación, desde hace muchísimos años, en lugar de hablar de x y y, es común usar el término foo y bar, o foo-bar, para explicar conceptos ligados con una consecuencia. Van más o menos así: si foo es comer, bar es pagar la cuenta e ir al baño.

En el juego de simulador espacial EVE Online existen tres zonas de niveles de seguridad: High Sec, Null Sec y Low Sec. Después de mi primer año entendí que, en Null, parecías volverte parte de alianzas que estaban en pleito con todo el mundo. Casi como debe ser en la vida real ser parte de una pandilla, no de un país. Así como las pandillas y las naciones claman su territorio, lo mismo pasa en Null. Te toca ser soldado bajo el control de alguien más, o siervo destruido. Ya tenía la idea de esto desde hace ocho años, pero quise confirmarlo y entré al mismo tiempo a unos seis o siete lugares diferentes de Null, con distintos personajes no relacionados entre sí.

El mejor para mí fue Lateral. Estaba minando hielo con una corporación más o menos decente, en Low Sec (que tiene sus peligros), y recibimos la oferta de ir a Null con una alianza llamada FUBAR, que además tenía una alianza adicional llamada ICON.

La alianza FUBAR, yo siempre pensé que venía de FOO-BAR, pero ahora tiene otro significado en EVE Online. Es un acrónimo de “F*ed Up Beyond All Recognition” o “jodido más allá de lo creíble”. Es una expresión usada en la comunidad de EVE Online para referirse a eventos mayores y catastróficos, como la desaparición de alianzas, coaliciones o pérdidas masivas de flotas.

Voy a tratar de resumir la situación. FUBAR estaba fuerte en apariencia. Yo era, para fines prácticos, el coordinador industrial de varios grupos de ICON y, al momento del evento FUBAR —la desaparición de la alianza FUBAR— tenía 63 POCOS (algo así como estaciones orbitales) y el equivalente de quince naves capitales en construcción, o, en términos de ahora, unos cuatro años de suscripción en materiales en el horno. Y eso representaba solo 1/8 de mis bienes.

Hay algunos puntos a destacar:

  • Quizá ese tiempo fue para mí el más feliz en EVE, por cuestiones de logística. Como premio a lo que estaba haciendo, y haciendo yo un pago simbólico, mi propia corporación de un solo hombre tenía una serie de tres sistemas para mí. Eran las regiones Inmensesea y Fountain.
  • Seguir los procesos planetarios entre unos 30 personajes y coordinar las flotas industriales con defensa incluida y sus naves era similar a hacer deployments de código.

Pero un día…

  • Se hizo una reunión en Teamspeak, que se usaba antes de Discord. Éramos unos cinco de ICON, seis o siete de FUBAR y alguien de una coalición llamada Atlas.
  • Me llamó la atención algo. No sé qué.
  • Y empecé a pensar que, así como en mi trabajo siempre estoy listo para robo de computadora, incendio de servidores, etc., tenía que revisar el plan de contingencia de evacuación de Inmensesea si hacía falta.

Catástrofe.

De repente todo FUBAR desapareció. Y no había dinero de por medio. No es que hubieran robado el capital. Yo tenía bastante idea de las finanzas de ICON. No eran de lo más sanas, pero había razones para pensar que FUBAR tenía el mismo grado de liquidez y, a menos que el líder de la alianza tuviera dinero de su bolsillo, no había nada líquido que llevarse o robar. Solo naves.

Simplemente dejaron de conectarse los Comandantes de Flota, y hubo un descuido en seguir los horarios. En menos de una semana, y realmente de la noche a la mañana, nos enteramos de que llegaba una nueva coalición. Por las rutas de salida que yo tenía, junto con varios de ICON, nos cambiamos a la región Fountain, donde hicimos algo similar. Pero llegó una coalición llamada INIT, que en realidad era una basura. No solo llegaron medio amenazantes, sino que quisieron crear una esclavitud por los recursos de la zona. A mí, por ejemplo, me quisieron expropiar mis 65 POCOS. Lo que hice fue volarlos. Así que levantar nuevos les iba a costar de tres a cuatro horas por cada uno, por lo menos.

Lo interesante es que mi superficie de ataque propia era poca. Al no tener demasiados recursos allí, lo que hice primero en Inmensea y después en Fountain fue irme a producir a otra parte. Por amistades y grupos de jugadores seguí en una corporación en Fountain hasta la pandemia, más o menos, y aproveché para sacar los pocos recursos que me quedaban allí. Lo que me llama la atención es que, de tener más o menos cuatro años de inversión en promedio, al salir de allí ya había vendido o sacado todo , y quedaba como el 3%. Solo tenía un carrier y unas cuantas naves que cabían en él, es decir, unas tres o cuatro naves pequeñas. Y en lugar de 36 personajes en la zona, solo cuatro.

Cabe destacar que, como dije en un principio, sabía que Null era una situación de pandilleros, y que siempre he tenido planes de contingencia. No pongo “todos los huevos en una sola canasta” ni en el mundo real ni en el juego.

Desde que aparecí en el juego han habido tres o cuatro coaliciones grandes: Goons, Pandemic Horde y Test. He tenido personajes con todos ellos. Pandemic Horde me permitía, por su forma de ser, manejar sin tanto lío ciertas naves grandes, como el citado carrier y una nave similar. Test desapareció, para fines prácticos, hace unos años. Goons tienen puntos a favor y en contra. Soy apolítico.

El evento FUBAR más reciente en EVE es la desaparición, para fines prácticos, de Pandemic Horde. En menos de un mes, sus dos corporaciones de jugadores más grandes se han juntado o con los chinos o con la mencionada INIT. Estamos hablando de la desaparición de la segunda coalición o alianza más grande después de Goons DURANTE MAS DE DIEZ AÑOS Y EN MENOS DE UN MES. Literalmente pasaron de 11 mil jugadores a 233, y yo soy dos de esos 233. Evidentemente tengo que ver que hacer con mis naves pero no urge. Ahora, las alianzas grandes son solo Goons, Fraternity, de jugadores chinos, e INIT, que resetearon sus niveles de amistad. Cualquier parecido con Trump es mera coincidencia, pero se pasan el derecho internacional y la decencia por el arco del triunfo.

A mí, de momento, me sorprende. Tengo dos naves que valen uno o dos meses de suscripción en una zona segura con dos personajes de Pandemic Horde. Usarlas en Goons no me conviene y sacarlas de ahí es criminal. Es un poco como tener dinero invertido en un terreno que no quieres ni puedes vender, pero que además no lo necesitas vender.

No sabremos si hubo robo, desidia, traiciones, autodestrucción simple y pura o puñaladas por la espalda en la desaparición de coaliciones o negocios. Por ejemplo, en el asunto del cliente del mundo real, al que llamo “cliente de los monolitos”, pasó el evento FUBAR y me pidieron cometer un delito. Dije que no, y se les cayó la operación. Además, perdieron información de varios años.

El cliente de los monolitos representaba menos de la mitad de mi ingreso.

Yo sigo en High Sec.

Parte 3 Stack Lemp Roundup Gitea y Quarkus

Hice una versión simplificada en este enlace. Si quieresbrincarte los comentarios de aqui, sigue siendo valido el contenido pero el markdown es más resumido.

https://github.com/AlfonsoOrozcoAguilarnoNDA/snippetsMIT/blob/main/instalar_LEMP_debian13.md

El día de hoy terminaré de instalar este servidor Nginx (LEMP) al tiempo que actualizo en otro ya existente, los dos sobre Debian 13. Hay una relación importante entre la memoria y el consumo de ella, y por qué usar Gitea. Joel Spolsky, antiguo programador de Microsoft, hablaba de las doce preguntas y una de ellas tenía que ver con builds / compilaciones de un solo paso. Creo que una vez establecido el front end (en este caso React) no necesitas hacerle muchos cambios, pero sí es común que establezcas nuevas funcionalidades «bajo el capó», en backend, que no se ven. Y en eso Quarkus brilla. Además, usa mucho menos memoria que Spring Boot.

Sin embargo, tengo que hacer una reflexión personal. Casi siempre mi trabajo ha sido arreglar desastres. A veces programando de cero, a veces dando mantenimiento a cosas indescriptibles. He visto consumos gigantescos de hosts que no servían, incluyendo transas de las personas de sistemas. Tecnologías corruptas o mal empleadas.

Usando una metáfora, yo no necesito un iPhone. Uso un teléfono Motorola G31 de unos 150 USD. La principal razón es porque tiene el encendido por huella dactilar, sin presionar botón lateral. Un iPhone o iPad solo me interesaría por las fotos de alta calidad, por documentos de juzgados.

Sin embargo, a nadie lo corrían hace años por contratar IBM. Ahora es algo parecido con Azure y AWS. Principalmente en entorno Azure he visto que universidades públicas reciben dinero para promover Azure y sus recién egresados piensan que es lo único. Usando una metáfora… no todos necesitan un Samsung de alta gama o un iPhone. Lo mismo pasa con Azure y AWS.

En este entendido, a veces el presupuesto o vivir en la punta del cerro, aunque puedas y lo quieras, te complican muchísimo comprar un teléfono de alta gama. Y para estar con línea de cobre, sin línea óptica. Otro ejemplo sería que salir con un billete de 1000 MXN a la calle es como traer nada, porque cambiarlo o que te lo acepten es difícil, y debe ser horrible salir a la calle con 3000 pesos en monedas de a peso. Como dato particular, en viajes a la playa solía usar una bolsa agarrable a la pierna, llena de monedas de 10 pesos, el equivalente de 3000 MXN, y se podía mojar.

Muchos de tus clientes de correo o de host son personas que usan pocos recursos. No falta la princesa o el princeso que si no es iPhone 25 no te mira a los ojos. Pues yo creo que salir a la calle con billetes de 100 y 200 te da movilidad. Se trata de resolver un problema, y Quarkus es maravilloso en eso. Pero si sumas su bajo consumo de memoria con relación a Spring Boot, te encuentras con la facilidad de implementación que hablaba Spolsky. Y eso solo te lo da en Web React / Quarkus, o PHP puro.

Asi que empecemos:

Los 3 puntos clave de hoy para Gitea:

  1. Proxy Inverso (Nginx): Despedirnos del puerto 3000 para entrar por git.tu-dominio.com.
  2. SSL Final: Extender el certificado de Certbot para que el subdominio de Gitea y la ruta /app de React sean inexpugnables.
  3. Ajuste del app.ini: Configurar internamente a Gitea para que reconozca su nueva identidad HTTPS y cerrar el puerto en el firewall.

Es como poner carrocería y blindaje al servidor. Digamos que es  un hardening de nivel medio.

Quarkus es Robusto, independiente y eficiente. Como todo buen devops. =)

Ojo con dos errores comunes por ser wordpress:

  • Las Comillas: Al copiar y pegar en editores como WordPress, las comillas rectas » a veces se convierten en curvas “. Asegúrate de que en los bloques de código (especialmente el de Java y Nginx) se mantengan las comillas rectas, o el compilador dará error.
  • Permisos de Ejecución: En la parte donde creas el servicio systemd, debes asegurarte de que el archivo mvnw tenga permisos de ejecución (chmod +x mvnw). Es un detalle que a veces olvidamos.

 

El Backend : Quarkus

Trataré  de explicar y demostrar por qué prefiero la solidez de Java en quarkus sobre Jakarta , Javelin  y sobre todo sobre el «caos» de Node.js con Express. Lo que sigue es:

  1. Instalar el SDK: GraalVM o OpenJDK 21/25 (para ser modernos y eficientes). Se tarda en compilar
  2. Compilación Nativa: Mostrar cómo Quarkus puede arrancar en milisegundos y consumir una miseria de RAM comparado con Spring Boot tradicional.
  3. NO hago la Conexión a la Base de Datos: Ligar Quarkus con la MariaDB que ya instalamos en la Parte 1.
  4. Al final hay un «anexo» Sobre quarkus en desarrollo. Aquí lo verás en modo DEV. Si lees el anexo que esta al final entiendes porqué. Anexo «Uso de Quarkus en producción usando GraalVM».

El hardening o costuras:

Una vez que Quarkus esté arriba, el reto técnico  es:

  1. Proxy Inverso para la API: Hacer que tu-dominio.com/api apunte a Quarkus, mientras /app sigue apuntando a React.
  2. CORS y Seguridad: Configurar el búnker para que solo tu React pueda hablar con tu Quarkus.
  3. Automatización (CI/CD Local)
    • Como ya tienes Gitea, el siguiente paso de «maestro» es configurar Gitea Actions. No lo explico aquí.
    • Hacer que cuando subas código a tu Gitea, el servidor compile Quarkus y React automáticamente y los ponga en producción sin que tú muevas un dedo.
    • Eso es ser Full Stack/DevOps en 2026.

Importante Paso previo a GITEA Quarkus.

Vamos a crear un subdominio, git.tu-dominio.com , la mayoría usa www.tu-dominio.com ,pero como hay cientos de empresas que venden dominios, a ti te corresponde encontrar como hacer un registro A , que apunte a la dirección IP. Como diría Dorothy de el Mago de Oz, creo que ya no estamnos en cpanel Toto.

No prosigas hasta que hayas hecho ese paso y hayan pasado unos diez minutos.

Ya que estés listo, hay que crear un archivo nuevo.

nano /etc/nginx/sites-available/git.tu-dominio.com

Y ahi pones esto:

server {
listen 80;
server_name git.tu-dominio.com;

# Log de errores para debuggear si algo falla
access_log /var/log/nginx/gitea_access.log;
error_log /var/log/nginx/gitea_error.log;

location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Ajuste para subidas de archivos grandes (ej. commits pesados)
client_max_body_size 512M;
}
}

TIP IMPORTANTE

Notarás que puse client_max_body_size. Puedes ajustarlo, pero es vital. Si no lo pones, cuando quieran subir un repositorio de más de 1MB por HTTP, Nginx les va a escupir un error 413 Request Entity Too Large. Un Devops de 2026 no deja que un límite por defecto arruine su Gitea. En lo personal creo que 256 es mas que suficiente pero  el 512 no sobra.

Que hacemos para enlazar git.tudominio a gitea?

  • Enlazar el archivo: ln -s /etc/nginx/sites-available/git.tu-dominio.com /etc/nginx/sites-enabled/
  • Validar y Reiniciar: nginx -t && systemctl reload nginx
  • Certbot (El momento de la verdad): certbot –nginx -d git.tu-dominio.com (Aquí Certbot leerá tu archivo de Nginx y le inyectará automáticamente las líneas de SSL).
  • Por precaución y por el manejo de puertos lo mejor es probar nuevamente el dry run de cert bot.
    • certbot certonly –dry-run -d git.tu-dominio.com
    • Lo mas seguro es que te de tres o mas opciones. Selecciona la que dice Nginx
      • las versiones más recientes de Certbot aplican el Redirect automáticamente. Antes te preguntaba si querías redirgir automáticamente (Option 2 por defecto) o que, al detectar que ya tienes otros sitios con Redirect, asuma que quieres lo mismo para mantener la coherencia del búnker.

Prueba ahora con http://git.tu-dominio.com y debe abrir normal y con candado verde. VERIFICA que el certificado sea valido.

Que tenemos que hacer ?

Bueno….

en este momento vives en una ip. Lo que significaque si te mueves de zona por ejemplo de Mexico a Estambul,   i de useast a amsterdam en AWS, va sa tener problemas. Vamosa ligar Gitea al nombre del dominio. Además clonar, respaldar o manejar repositorios en direcciones IP y no dominios, es mala práctica además de incómodo.

Vamos a decirle quién es oficialmente.

  • Abre el archivo de configuración: nano /etc/gitea/app.ini
  • Busca la sección [server] y edita estas líneas: (Asegúrate de que tengan el dominio y el HTTPS)
  • [server]
    DOMAIN = git.tu-dominio.com
    HTTP_PORT = 3000
    ROOT_URL = https://git.tu-dominio.com/
    DISABLE_SSH = false
    SSH_DOMAIN = git.tu-dominio.com
    SSH_PORT = 22
    Guarda (Ctrl+O, Enter) y Sal (Ctrl+X).
  • Reinicia Gitea para que lea su nueva identidad: systemctl restart gitea
  • Y como recordarás tenemos el puerto 3000 abierto. Ahora hay cerrarlo, o «colgar el teléfono» porque yaestamosusando el puerto 443 por el SSL
    • ufw delete allow 3000/tcp # Cierra el puerto en el firewall
    • ufw status # Verifica el estado: 

ahora Solo se entra por el subdominio seguro. https://git.tu-dominio.com

¿Ya reiniciaste Gitea? Entra a la web y verifica que en la parte inferior o en los enlaces de clonar ya aparezca tu dominio con HTTPS. Si eso está listo, ya quedó Gitea.

Ahora vamos con Quarkus.

Instalación de Quarkus

Para instalar Quarkus de forma profesional en un entorno Debian (sin llenar el servidor de basura), lo ideal es usar SDKMAN!. Es la herramienta estándar para desarrolladores Java/Quarkus porque te permite gestionar versiones sin pelearte con las variables de entorno manualmente.

Aquí tienes los pasos para dejar el motor listo:

1. Instalar SDKMAN!

Primero, necesitamos zip y unzip (si no los tienes) para que SDKMAN pueda trabajar:

  • apt update && apt install zip unzip curl -y
  • curl -s «https://get.sdkman.io» | bash # instalamos el gestor sdkman
  • source «$HOME/.sdkman/bin/sdkman-init.sh» # la comillas son importantes
  • sdk version # te vaa dar un numero y significaque ya estamos del otro lado y esta instalado.
  • sdk help # probar que si corrió la instalación.

2. Instalar el Java adecuado (El corazón)

Para Quarkus en 2026, lo ideal es Java 21. Vamos a instalar la versión de Temurin (de la fundación Eclipse), que es de las más estables y ligeras:

  • sdk install java 21.0.2-tem # se va a tardar mas que otros procesos …..
  • usa en terminal:    java -version # verificar que todo esté en orden va espacio entre java y version
    • Si estas en una maquina antigua no instalacion limpiapuede ser ue necesites
      • sdk use java 21.0.2-tem
      • Salir y volver a entrar a SSH. Recuerda usar java – version
  • Si obtienes «OpenJDK Runtime Environment», Java ya esta instalado

3. Instalar Quarkus CLI

Ahora sí, instalamos la herramienta de línea de comandos de Quarkus que nos permitirá seguir el proceso. Ejecuta:

  • Ejecuta: sdk install quarkus
  • Verifica con: quarkus –version

Nota Plus. Tengo mis propios medios de verificar servidores, pero prefiero no ponerlos en publico, aisque para fines de este tutorial, haré un monitor de memoria y espacio en uso, usando quarkus y react. Normalmente clonaría uno de mis repositorios privados pero en este caso vamos a hacerlo de cero y simplificado.

3.1 Crear el proyecto «Monitor-Instance»

Es posible que el código este funcionando en un vps, docker, servidor, pero es mas exacto decir que es instancia de Quarkus, y es indiferente o agnóstico a si es Nginx o apache. Así que llamaremos a este proyecto monitor-quarkus-instance y lo pondremos en la carpeta de git que creamos antes.

RECORDATORIO HICIMOS ESTO:

mkdir -p /home/git/proyectos

cd /home/git/proyectos

Vamos a crear el esqueleto pero tenemos que considerar JSON que es lo que consume REACT. Eso lo hacemos con el –extension=resteasy-jackson que ves abajo.

1. Crear el proyecto con el nombre correcto Ubícate en la carpeta que definiste para tus proyectos de Git y genera la app:

  • cd /home/git/proyectos
  • quarkus create app monitor-quarkus-instance –extension=resteasy-jackson
  • cd monitor-quarkus-instance
    • Notaras que te dice sucessfile generated

2. Crear el Recurso (El código del monitor)

Vamos a crear el archivo que lee el «hardware» del servidor. A ti como Admin te interesa ver memoria y uso de disco. Quarkus por defecto crea un GreetingResource.java, vamos a sustituirlo por nuestro monitor:

 

Ojo con esto. CUalquier script kiddie va a estar buscando «stats». Yo usaria un lugar no muy comun, como mis iniciales que son aoa, asi que uso en este ejemplo statsaoa o puede ser statsTUNUMERODEMPLEADO. La lógica es que un bot de escaneo va a buscar /stats, /admin, o /health, pero si lo renombras a algo que solo tú sabes, como statsaoa o un token tipo stats2026aoa, acabas de quitarle el 99% del ruido de los logs de ataques automáticos.

Tienesque tener cuidado que no desaparezcan las comillas. es un error comun.

  • nano src/main/java/org/acme/MonitorResource.java

Pega este código (optimizado para ser ligero):

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

@Path(«/statsaoa»)
public class MonitorResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getStats() {
Map<String, String> stats = new HashMap<>();

// Fecha y hora actual (Instancia)
stats.put(«hora», LocalDateTime.now().format(DateTimeFormatter.ofPattern(«yyyy-MM-dd HH:mm:ss»)));

// Uso de memoria RAM (comando free)
stats.put(«memoria», executeCommand(«free -m | awk ‘NR==2{printf \»%.2f%%\», $3*100/$2 }'»));

// Espacio ocupado en disco (comando df)
stats.put(«disco», executeCommand(«df -h / | awk ‘NR==2{print $5}'»));

return stats;
}

private String executeCommand(String command) {
try {
// El comando debe ir entre comillas
Process process = Runtime.getRuntime().exec(new String[]{«/bin/sh», «-c», command});
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
return reader.readLine();
} catch (Exception e) {
return «Error: » + e.getMessage();
}
}
}

3. Configurar la seguridad (CORS) y el mayordomo del Búnker

Antes de lanzar el motor, necesitamos que Quarkus sepa que tiene permiso para hablar con nuestro Front-end. En el mundo de 2026, los navegadores bloquean cualquier petición que no esté explícitamente autorizada.

Edita el archivo de propiedades:

* nano src/main/resources/application.properties

Añade estas líneas (esto es el equivalente a darle una «lista de invitados» a tu portero o mayordomo):

Properties Pega tal cual

# Permitir que React consuma la API desde tu dominio
quarkus.http.cors=true
quarkus.http.cors.origins=https://tu-dominio.com

4 Hora de probarlo.

Es hora de probar si nuestro código realmente lee el hardware. Ejecuta el modo de desarrollo:

  •  cd /home/git/proyectos/monitor-quarkus-instance
  • chmod +x mvnw # da permisos de ejecución
    • ls -l mvnw  # debes ver color verde una x de  ejecutable en permisos
  • ./mvnw quarkus:dev

(Si es la primera vez, verás que descarga las dependencias. Es el proceso de armar la maquinaria). Una vez que veas que el sistema está listo, abre otra terminal y lanza un ataque de prueba (un simple curl):

Con la letra q te regresa saliendo del shell, al modo terminal. Y debes ver un BUILD SUCCESS en eltras verdes.

Pero no  vas poder probarlo por un detalle simple. Solo esta vivo mientras el modo dev esta presente. Asi que lo normal sería lanzar una segunda terminal de root, pero aveces, por ejemplo vultr no te deja. Asi que lo mejor es que uses powershell o un terminal y hagas desde allí

  • ssh root@tu-ip-de-vultr
    • ahi si puedes abrir las ventanas que quieras. pone el password y ejecuta esto
  • curl http://localhost:8080/statsaoa

Si te responde un JSON con la memoria, el disco y la hora, felicidades: has creado un backend independiente que no le debe nada a nadie.

Y esto es lo que vas a recibir, mas o menos…

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@xxxxxx:~# curl http://localhost:8080/statsaoa
{«memoria»:»43.26%»,»hora»:»2026-01-02 20:27:56″,»disco»:»17%»}root@xxxxxx:~#

Ahora si lo que falta es cerrar la puerta. Cuando entras a tu casa, luego cierras la puerta no ?

Hacer seguro el cierre de puertas:

Como ahora ya sabemos que Quarkus responde en el 8080, vamos a cerrar ese puerto al mundo y dejar que solo Nginx hable con él.

Edita tu archivo de Nginx: nano /etc/nginx/sites-available/tu-dominio.com

Añade esto dentro del bloque server: OJO : La barra después del 8080 es super importante hazme caso y dame las gracias después.

Nginx

location /api/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
} # <— No olvides cerrar la llave

Y despues:

  • systemctl reload nginx # recargamos nginx

Y el final es ?

Un programador de FRONT END haría esto en un widget

import React, { useState, useEffect } from ‘react’;

const MonitorAOA = () => {
const [stats, setStats] = useState(null);

useEffect(() => {
const fetchStats = async () => {
try {
const response = await fetch(‘https://tu-dominio.com/api/statsaoa’);
const data = await response.json();
setStats(data);
} catch (err) {
console.error(«Instancia no responde», err);
}
};
fetchStats();
const timer = setInterval(fetchStats, 30000); // Actualiza cada 30 segundos
return () => clearInterval(timer);
}, []);

if (!stats) return <div>Conectando con la instancia…</div>;

return (
<div style={{ border: ‘1px solid #333′, padding: ’15px’, borderRadius: ‘5px’, backgroundColor: ‘#000’, color: ‘#0f0’ }}>
<h4>SISTEMA DE MONITOREO AOA</h4>
<p>RAM: {stats.memoria}</p>
<p>DISCO: {stats.disco}</p>
<small>Sincronizado: {stats.hora}</small>
</div>
);
};

export default MonitorAOA;

Yo haría algo para que quarkus estuviera siempre activo. Pero tiene sus… peligros y lo que me da de comer. Eso va al final en el anexo.

Para que todo este siempre activo Cómo dejarlo encendido permanentemente (Nivel DevOps)

Para esto usaremos systemd, que es el administrador de procesos de Debian. Es lo mismo que mantiene vivos a Nginx y MariaDB.

1. Crea el archivo de servicio:

Bash

nano /etc/systemd/system/monitor-quarkus.service
2. Pega este contenido (Ajusta tus rutas):

[Unit]
Description=Monitor Quarkus Instance AOA
After=network.target

[Service]
Type=simple
User=root
# Ruta a tu carpeta del proyecto
WorkingDirectory=/home/git/proyectos/monitor-quarkus-instance
# Comando para arrancar en modo producción (usando el script de Maven)
ExecStart=/home/git/proyectos/monitor-quarkus-instance/mvnw quarkus:dev -Dquarkus.http.host=0.0.0.0
Restart=always

[Install]
WantedBy=multi-user.target

3. Activa el «Fantasma»:

systemctl daemon-reload
systemctl enable monitor-quarkus
systemctl start monitor-quarkus

Ahora, aunque cierres PowerShell, te vayas a dormir o reinicies el VPS de Vultr, tu API en https://tu-dominio.com/api/statsaoa seguirá respondiendo.

Verificación final:

systemctl status monitor-quarkus #  Debe estar «active (running)»
curl https://tu-dominio.com/api/statsaoa #  Debe devolver JSON
curl https://git.tu-dominio.com #  Debe abrir Gitea con SSL

 

Y la parte 4:

Tengo ocupaciones del mundo real. Pero me encantaría hacerte entrar al mundo de Gitea Actions o la Compilación Nativa con GraalVM en Quarkus. Si tienes menos recursos, o te harta esperar la compilación de Native Quarkus, javelin está bien para proyectos propios pero no hay mucho mercado, ofertas de trabajo ni desastres que arreglar. Uno no vive solo de la elegancia del código, sino de solucionar problemas donde hay dinero y demanda.

Lo mas seguro es que no lo haga en NGINX una parte 4 con Gitea Actions por lo que explico en el watercooler (abajo de laconclusión), pero que si haga algo muy parecido a este documento, pero para levantar LAMP., con apache, spring boot en debian 13 y React con php. Las razones las verás abajo.

Conclusión:

Al terminar este setup, mi servidor Debian consume apenas unos megas para reportar su estado. No necesité un tablero de control de AWS de 100 dólares, ni una infraestructura pesada que se come la RAM antes de servir la primera petición. Como mi Motorola G31: hace exactamente lo que necesito, es eficiente y el control biométrico (mi endpointstatsaoa) es mío. En 2026, lo simple tiene valor de supervivencia

Si. Estoy consciente que esto es todo menos simple por sí mismo. Ver todo lo que carga la primera vez que cargas quarkus dev es impresionante.  Hay formas mas directas, pero esto es lo mas directo usando Java React. Personalmente creo que algo está mal si la solución eficiente , como esta, usa 2 gb de  ram para tener activo el ecosistema. Y por eso cuando se trata de proyectos propios, me voy por alternativas que no son java. Pero Quarkus es lo mas simple de java. Quarkus es lo mejor de un mal necesario (Java enterprise)

Plática de Watercooler:

En el entorno corporativo a veces las personas con experiencia están dispuestos a darte consejos por años de experiencia, y en USA se dice platica de watercooler a una mezcla entre eso y chismes.. En mi propia oficina suelen venir por café y galletas. En lo personal creo que tenemos complejidad innecesaria. Hay demasiados puntos de falla. Si esto es la versión simplificada imaginate como  estará lo demás.

He tenido casos que despues de explicar esto crean muchos micro services. Y luego me llaman a arreglar desastres.

Dije que podiamos usar giteaa actions . Aqui no lo vi a propósito. Lo uso porque se lo que estoy haciendo. Pero cuando tienes cinco o seis programadores con su propia idea de arquitectura y apis, vas aacabar con decenas de procesos fantasma que consumen la memoria. Tener un /statsaoa es una cosa pero  treinta o demas microservices, aunque diga amazon que es bueno, es incontrolable y te lleva a mas puntos de falla,  mayor costo y a diversos vectores de ataque. Creo que el punto que pone mas complejidad es REACT actualmente.

Un punto: La instalación de ORACLE se suele cobrar aparte. Usando un ejemplo, yo instalo servidores si me pagan por ello o si no hay mas remedio. Es responsabilidad y la autoridad es que me paguen.

Sin embargo, por simplicidad lo primero que hago es ver la queja. Los costos de Egress de Amazon. O de WAFs . Lo primero es irte por un costo estable. Regresate a vultr o un proveedor decente de vps. Reduce ese costo.

Y luego arregla el desastre de decenas de microservices que alguien hizo. Es mi principal fuente de ingresos. Por eso finalmente suelo terminar con algo de vultr o un proveedor de vps que no menciono , con apache, y sacando respaldos por una iguala para defender a la empresa de sus mismos programadores.

Un server es tan bueno como su admin. Te vas a enfrentar a muchos programadores bien intencionados pero mediocres. Y muchos admin que no ven el problema con la complejidad innecesaria de su infraestructura.

ANEXO: Uso de Quarkus en producción usando GraalVM

Para fines didácticos, en este post usamos el modo quarkus:dev. Sin embargo, un verdadero DevOps de 2026 sabe que en producción el motor debe ir «sellado» para maximizar la eficiencia y el ahorro de RAM que tanto hemos defendido.
Este anexo lo suelo pasar impreso en word, asi que lleva un formato diferente.

1. Preparando el motor para el mundo real

Antes de configurar el servicio final, debemos compilar nuestra aplicación para generar el paquete de distribución:

bash
# Ubícate en la carpeta del proyecto
cd /home/git/proyectos/monitor-quarkus-instance

# Compilar para producción (Modo JVM estándar)
./mvnw package

Esto generará una carpeta en target/quarkus-app/ con todo lo necesario.

Verificación:

bash
ls -lh target/quarkus-app/quarkus-run.jar
# Debe mostrar el JAR compilado

2. Ajuste del «Fantasma» (Servicio systemd)

Debemos modificar el archivo /etc/systemd/system/monitor-quarkus.service para que apunte al binario compilado y no al gestor de desarrollo. Aquí tienes las dos rutas posibles:

Opción A: Modo JVM (Estable y rápido)

Nota:

TIP DE RUTA: Como usamos SDKMAN, para saber qué poner en ExecStart, ejecuta en tu terminal: whereis java o readlink -f $(which java) La ruta suele verse así: /root/.sdkman/candidates/java/current/bin/java

Si usas el Java 21 que instalamos con SDKMAN:

ini
[Unit]
Description=Monitor Quarkus Instance AOA (Producción JVM)
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/git/proyectos/monitor-quarkus-instance
# ↓ La clave del cambio está aquí
ExecStart=/usr/bin/java -jar /home/git/proyectos/monitor-quarkus-instance/target/quarkus-app/quarkus-run.jar
Restart=always

[Install]
WantedBy=multi-user.target

Consumo estimado:

  • RAM: ~70-100 MB
  • Inicio: ~2-3 segundos

Opción B: Modo Nativo (El Santo Grial de la eficiencia)

Si decides compilar usando GraalVM para que el servidor arranque en milisegundos y consuma apenas una fracción de RAM (compilación nativa):

Primero, compilar nativo:

bash
#Solo si usas la Opción B (Nativo)
chmod +x target/monitor-quarkus-instance-1.0.0-SNAPSHOT-runner
# Esto tarda 5-10 minutos (es normal)
./mvnw package -Dnative

# Verificar que se creó el binario
ls -lh target/*-runner

Luego, ajustar el servicio:

ini
[Unit]
Description=Monitor Quarkus Instance AOA (Producción Nativa)
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/git/proyectos/monitor-quarkus-instance
# ↓ Apunta al ejecutable nativo
ExecStart=/home/git/proyectos/monitor-quarkus-instance/target/monitor-quarkus-instance-1.0.0-SNAPSHOT-runner
Restart=always

[Install]
WantedBy=multi-user.target

Consumo estimado:

  • RAM: ~30-50 MB (¡3x menos que JVM!)
  • Inicio: ~0.05 segundos (50 milisegundos)

¿Por qué hacer este cambio?

Seguridad:
El modo dev deja herramientas de depuración abiertas que no quieres en la calle. Es como dejar la puerta de tu casa abierta «por si acaso».

Rendimiento:
El paquete quarkus-run.jar está optimizado por el «re-augment» de Quarkus para cargar solo lo necesario. No arrastra todo el peso del desarrollo.

Independencia:
Al usar el ejecutable nativo (Opción B), tu servidor se vuelve una pieza de relojería suiza que no depende ni siquiera de una JVM externa para correr. Es un binario único, como Gitea.

3. Aplicar los Cambios

# 1. Edita el servicio con tu opción elegida
nano /etc/systemd/system/monitor-quarkus.service

# 2. Recarga la configuración de systemd
systemctl daemon-reload

# 3. Reinicia el servicio con el nuevo "piloto"
systemctl restart monitor-quarkus

# 4. Verifica que todo está bien
systemctl status monitor-quarkus

# 5. Prueba el endpoint
curl https://tu-dominio.com/api/statsaoa

Tabla Comparativa (Para Tomar Decisión)

Modo RAM Inicio Build Time Complejidad Recomendado Para
dev ~150 MB Inmediato 0 min Baja Aprendizaje
JVM ~80 MB 2-3 seg 1-2 min Baja Producción normal
Nativo ~40 MB 0.05 seg 5-10 min Media Máxima eficiencia

Nota Final del Autor

Si haces este cambio, recuerda ejecutar systemctl daemon-reload y systemctl restart monitor-quarkus para que el sistema reconozca al nuevo «piloto» de producción.

Mi recomendación: Para empresa mediana (50-150 usuarios/día), el Modo JVM (Opción A) es perfecto. Ahorras el tiempo de compilación nativa y el consumo de RAM sigue siendo ridículamente bajo comparado con Spring Boot o Node.js.

Reserva el Modo Nativo (Opción B) para cuando realmente necesites el último gramo de eficiencia o tengas restricciones extremas de RAM. Es el equivalente a pasar de un Motorola G31 a uno ultra-optimizado que solo hace llamadas y SMS pero dura 2 semanas con una carga.

Punisher Tier 0 Exotic

Eve Online es un juego que no necesita demasiados recursos. Lo que ven aqui es un piloto Omega, que puede ser alpha, muy simple, y entre configurar servidores entré a lo que se le llamaun Tier 0 , que es algo asi como un dungeon facilito.

Pero, mi nave que tiene tres capas de daño, le tocó con un personaje piloto inexperto (en el uso de esa nave) enfrentarse al skybreaker que es en un enemigo pesado. La capa  tres (hull) me la dañó un poco, pero no tanto que tuviera que ir a repararme.

Normalmente no las hago en Exotic, que es un tipo de clima, pero entré a uno y así se ve el efecto de hull dañado.

 

Y un video con mi celular de la batalla, el primer minuto porque mi celular está configurado para máximo de 2 minutos de video.

De momento estaen este enlace: https://serverdeaplicaciones.com/PunisherTier0Exotic.mp4

La cena de fin de año

Por cuestiones de tiempo, y para que no se quejen mis lectores culinarios, comento que lo comrpado este año fue la cena de Sanborns Paquete 5

Paquete 5 – $2,199 (10 personas aprox.)

  • 2 kg Pierna de Cerdo Mechada con Chabacano y Tocino
  • 1.5 L Salsa Gravy
  • 1 kg Puré de Papa
  • 2.5 L Crema de Elote
  • 2 kg Ensalada Waldorf

Normalmente compro mas cosas, pero todavía tenemos ensalda de codito rojo, y lo recién hecho es ensalada rusa con pollo y flan napolitano. Mi esposa iba a hacer lasagna y en el refrigerador no cabe con todo esto si tratamos de hacer pastel de carne, asi que esto parece que será la cena para tres. Hay además recalentado pero no se ni de qué.

2026 Timing, decisiones y posibilidades nuevecitas

31 de diciembre de 2025

A mis 53 años, programando desde los 19, casi titulado como contador, y volando en este momento naves en EVE Online, he aprendido que la vida se trata de timing, decisiones basadas en valores y saber cuándo un recurso vale la pena usarse. No se trata de tener más, sino de tener lo que necesitas cuando lo necesitas. Y a veces, lo mejor es simplemente estar preparado para las posibilidades nuevecitas que cada año trae consigo.

Se acerca el final de un año bastante contradictorio y me veo obligado a pensar, por una de esas razones raras, en algo que normalmente no ocuparía mi tiempo, pero me sirve de ejemplo porque se parece un poco a cómo he manejado mi vida.

El contraste generacional y de objetivos.

Mi hija empezó a trabajar este año, a los 18, en el lugar donde le dije y por las razones que le dije. No entiende completamente mis razones, pero está contenta. Yo empecé a trabajar a los 19, después de unos problemitas que me causó mi papá y que me limitaron en mi trabajo inicial planeado (tuve que hacer otro), y ese primer trabajo deseado ya no sería bueno en esta época. Así que entré a trabajar a los 19 años y trabajé como loco, con tal nivel de bonos en cascada por rendimiento de mi gente que me pude comprar un departamento ese mismo año. A cambio, no pasé el tiempo como mi hija en juventud o confraternizando con compañeros de trabajo o de escuela.

Hice la preparatoria con contabilidad en la Universidad de Guadalajara y salí muy bien preparado. Aunque después terminé la carrera en la Escuela Bancaria y Comercial, no me titulé por problemas de zona geográfica: no podían dar cédula en Guadalajara. Muy buen material, eso sí, pero solo una materia de contabilidades especiales para manejo de ganado, perfume y aleaciones fue realmente nueva. Todo lo demás ya lo sabía. Ahora, treinta años después, estoy terminando la carrera desde cero otra vez, y han sido unas ocho horas las que he aprendido algo real; todo lo demás ya lo sabía.

Desde el hecho de trabajar como DevOps programador y el perfil cruzado de auditor, trato de prevenir riesgos. Mientras otros descansan, por lo general yo trabajo. Así fueron todos mis veintes. En mis treintas me tocó lidiar con muchas empresas y personas autodestructivas, pero siempre me he movido pensando como si fuera diez años mayor.

La filosofía del timing: He comentado también que hay situaciones donde todos son ganadores y no hay competencia. Ejemplo: cruzar la calle. Si no te atropellan, ganaste, pero no importa qué tan buen cruzador de calle seas, a veces no puedes moverte por el tráfico, por seguridad. Un poco como el juego de la ranita.

Así como cruzar la calle tiene timing, a veces las ofertas de Black Friday funcionan en un tiempo específico. Es timing.

En este momento estoy enfermo del estómago, me la pasé yendo al baño una buena parte del 30 y lo que va del 31. Estoy tomando Kaomycin y loperamida, que por lo general con una sola pastilla no vas al baño tres días, y no debes pasarte de la dosis o te puede causar problemas cardíacos. Así que me encuentro simplemente ayudando en lo que cabe a mi esposa con la comida de fin de año, pero no fui a recoger lo que compramos para evitar accidentes en tránsito. Suelo ser de bastante buena salud, pero afortunadamente mi trabajo es en sistemas, y es 31 de diciembre, casi vacaciones.

Las decisiones que tomo están basadas en valores Mi filosofía personal es tratar de no tener pendientes. Pero a veces pasa que por alguna razón algo tiene fecha inicial, o se hace fuera de casa, o no tengo la información necesaria y me debo esperar.

Hay gente que tiene coches finos, casas elegantes y problemas de dinero. Las tres personas con mejores ingresos que conozco tienen problemas serios de dinero porque gastan mas de lo que ganan. Yo estoy tranquilo, y eso que este ha sido un año mediano. Puedo estar agradecido de muchas cosas. Lo que me ha ayudado siempre es tomar decisiones basadas en valores. Mucha gente compra productos de diseñador, piratas o no, o el celular de moda, ganan menos que yo y viven peor que yo. Es un poco como comprarte un casco de motocicleta para según tú invocar una moto, pero en realidad haces gastos que no tienen mucho sentido.

Algo que me hace pensar son cierto tipo de juegos en línea. He comentado en otros lugares mis andanzas desde Everquest y actualmente estoy en EVE Online. Hay juegos que tienen formas de pago que te obligan a meter la tarjeta y eso no lo uso, por ejemplo BDO a menos que quieras aproximadamente 35% de impuestos, y Final Fantasy XIV. Solo juego cosasque tengan pago por Paypal. Los juegos de construir tu casa tipo Conan Exiles no me sirven porque ya tengo casa y no voy a jugar a hacer lo que ya hice, y no voy a jugar Los Sims para tener una vida completa porque ya la tengo.

Mientras escribo estoy volando un piloto en EVE Online, por una línea de negocio secundaria que descubrí este año, pero que debe terminarse de recoger los frutos en unos cinco días. La idea es buena y no me meto en detalles. Pero como secundario de eso, obtuve un mes de suscripción Omega con tres meses en un personaje secundario, eso se llama MCT. Pero me enfrento a un problema derivado de lo mismo: si quiero usarlo debo aplicarlo hoy o a más tardar mañana, o se pierde.

Una ventaja de EVE Online es que puedes vender personajes que ya no usas. De momento tengo doce cuentas Omega pagadas por un año, por lo menos. Algunas diez años, otras cinco. Pero de las cuentas no Omega, no hay ninguna que merezca los tres meses de entrenamiento doble.

Tengo varias cuentas por un principio que aprendí en el primer trabajo que tuve: cualquier trabajo tiene dos responsabilidades. Prever las contingencias del servicio, y capacitar personal cuando puedes. No puedes capacitar a nadie como programador, pero sí a tus usuarios.

A veces no puedes reutilizar tu conocimiento por el lugar de trabajo o por requisitos. Usando un ejemplo, he hecho unos veinte a treinta módulos de control de usuario, con unas siete versiones claramente diferenciadas. Unos cinco sistemas de factura electrónica desde cero. Y en EVE, a veces necesitas ciertas capacitaciones en algunos personajes. Aunque estoy en contra de las certificaciones de software por ser casi todas tomadas del pelo, pues no es raro que para usar una nave en EVE tengas que usar un entrenamiento de un mes que a precio normal son 400 pesos. Lo recupero al vender el personaje. En este caso son 1200 pesos a precio normal los tres meses de capacitación.

A veces te sirve tener en varios lugares pilotos capaces de hacer algo, por posición, localidad, corporación, región o simple casualidad. Así que hay redundancia muchas veces y planes de contingencia. Personalmente tengo ahora varias cuentas no tanto por gusto, sino que he limitado gastos de transferencia o ventas que sí se hacen en dinero, y en vez de tener ocho cuentas como era mi objetivo, tengo doce. Dije antes que este año gané la mitad de lo acostumbrado, pero es más de lo que ganan mi hija y la dama Margarita juntas. De todos modos, el próximo año que todo se regularice probablemente acabo con ocho cuentas.

Así que mientras, en el trabajo, a veces hago módulos más atractivos de usuarios, o de reportes, o de control de respaldos de bases de datos. Y capacito a la gente cómo usarlos.

El problema es que de momento, si no uso una capacitación de tres meses, la pierdo. Pero todo lo que puedo aprender, y quiero aprender, ya lo sé en algún piloto. No trato de conseguir otra casa en el mundo real porque ya tengo suficientes. No necesito más perros. Pero imagínate que te dan un vale gratis para restaurante, pues pensarías qué hay en el menú.

En el juego existen algo llamado Wormholes, o agujeros de gusano, que nunca me han interesado. Tres de mis pilotos tienen las características de localización, que son tres meses más o menos, casi cuatro. Eso permite encontrar atajos o similares. Tengo esas habilidades porque hay personas que lo usan. Tengo dos pilotos que saben y no se arriesgan, pero no tengo nadie que pueda hacerlo en su tiempo libre. Es como si pones a un chef a hacer sándwiches. Usando un ejemplo, este personaje puede hacer sandwiches en estos tres meses y puede ser útil.

Entre mis seis tipos de piloto, hay uno que conservo por el nombre y no tiene gran cosa que hacer. Está en una cuenta con un piloto que pienso vender en un año. Así que la premisa para mí normal es que, aunque tengo tres cuentas que expiran el mismo día, meterle a esa el mes Omega y los tres meses de capacidad a esa. Cuando pase el año, vendo el otro piloto y uso en él el cuarto mes Omega. Pero simplemente no es que esté aburrido… no quiero desperdiciar, pero no hay nada más real en el juego que pueda aprender en tres meses.

Así que creo que lo mejor de momento es usarlo en esa cuenta, y ya veré en qué uso los tres meses de capacitación. No es una decisión que tenga que tomar en este momento, pero es el personaje ideal. El problema no es desperdiciar el entrenamiento, que puedo aplicar después cuando quiera, y lo lógico es hacerlo en este año.

Considerando las premisas, de los puntos disponibles, a menos que vea algo más, lo único medianamente útil y no redundante es hacer un scanning perfecto pero para uso real. Lo demás o no encaja con el personaje o ya lo tengo en otros pilotos. Por ejemplo, no quiero cambiarlo de mi propia alianza, así que sovereignty no aplica, alt de estructuras tampoco, cyno, refiner, miner, tengo ya especializados. Pero esto puede ser útil.

Es como el año nuevo, hay posibilidades nuevecitas. La cuenta está pagada por un año, y así como puedo pensar qué hacer en el próximo año de la vida real, lo mismo en el personaje. Lo curioso es que si no hubiera habido limitación de ingresos, tendría ocho cuentas y no doce, aunque no se oiga intuitivo.

reinstalando Windows 10

A eso de las 14 pm mi computadora se quedó paralizada por sexta vez en una semana en Windows 11. No funcionó decirle que no actualizara Windows y por lo que oigo es generalizado.

Esa PC tiene Bluetooth a través de un USB. Así que instalar mint o alguna distro de escritorio me dejaría sin sonido. No quiero usar la máquina nueva y empacada de hace dos meses y está es lo suficientemente buena con 32 GB de ram y tres discos duros. Además la camara web que tengo no jala con Windows 11.

Podría hacer todo el proceso de mint, distro de Linux que usa nombres de mujeres pero es buenísimo para equipos raros. Si instalo desde una LTS como uliana que creo que es la 19 pero pasarme horas por la demora de los mirrors mientras se actualiza no le veo caso. Creo que de uliana siguen uma, Vanessa Virginia y zeta y han habido problemas con las descargas por falta de mirrors

Y si instalo desde una LTS de Windows de 2,017 lo levanto en 20 minutos.