varios detalles de la vida laboral

Hace unos momentos me contactaron de la startup en que dí la plática del otro día, para decirme sobre un problema que tuvieron con una nueva imagen de Debian en OVHcloud. Es el proveedor.

A lo mejor no todos los lugares de Kentucky Fried Chicken siguen las mismas normas y hay muchas posibilidades de que algo esté mal y que no seas tú, sino la operación o el proveedor. No me meto a contar historias de terror de proveedores, pero hay una incredulidad compartida de que los nuevos servers no funcionen igual en ese proveedor. Sobrevendidos, probablemente.

Si el proveedor falla y el cliente insiste, yo me deslindo. No en este caso, regla general. Nuestro trabajo en sistemas depende de usar y ser proveedores de calidad.

Comento varios detalles de los que me acordé y son relevantes:

  • En 1992-1994 fui a una entrevista de trabajo a otro lugar antes de cambiarme de cadena de supermercados. El puesto que querían en este lugar de otro giro era para manejo de análisis de contratación y selección de personal, flujo de caja y contabilidad. Tenían un problema fuerte con una computadora cuando llegué a la entrevista. Comenté que llevaba tres años manejando computadoras y que, si querían, la revisaba. Era una PC Printaform de las genéricas. Además de que querían pagar un tercio de lo normal y que lo que publicaron del sueldo era por error, querían que les dijera qué procesador y memoria tenía la computadora sin prenderla. Les dije que era imposible al ser una «caja blanca» genérica color hueso que se armaba a la medida, y me dijeron que ellos me llamaban. Muchas banderas rojas, ninguna mía. Pero esas PC venían con DR-DOS 6.0; ¡qué tiempos!
  • Otra: en 2008, llego un día al trabajo después de un «oso» memorable del director (empresa de software para una aseguradora) que se negaba a pagar un bono del 40%, y me encuentro con que mi usuario y mi dirección IP tenían bloqueado el puerto 25 (no podía ver correo), las actualizaciones de antivirus y el firewall. Simplemente les pedí que decidieran si me iban a dejar trabajar, y dos días después me fui con liquidación completa. Lugar muy raro. ¿Cómo esperan que programes sin correo y sin poder actualizar el navegador cuando haces programación web para bases Oracle?
  • En 1995, una semana antes de entrar a las gaseras, fui a una entrevista en un despacho de abogados. Necesitaban un programador de planta que les hiciera varias cosas; se habló todo y firmé contrato. Estaba por pasar a donde iba a ser mi lugar cuando me dicen: «Por cierto, se paga mensualmente, no quincenalmente como dijimos, y es de lunes a sábado de 9 a 7, no lunes a viernes de 8 a 5. El contrato está mal, ¿tienes problema?». Les dije que no, les pedí ver el contrato (donde claro que no venía lo que decían) y lo rompí guardando mi firma. Un despacho de abogados, ¡Dios santo!

Una de las cosas que hago cuando voy a salir de un lugar de trabajo o se va a pasar el control de un servidor, es justamente decir que yo no paso el control de los servidores si son propios y no de ellos. Si estaban en MIS servidores y no de la empresa del cliente, son MIS SERVIDORES, no de ellos. Si hay un problema de configuración la culpa es mía, y si todo está bien el mérito es de ellos, así que lo sano es deslindarme y que lo hagan solos. Les doy un respaldo, que generen su servidor y que lo configuren solitos. Algo por el estilo pasa con este cliente: les demostré que el proveedor tiene problemas y quieren usarlo de todos modos. Es como querer sacar premio de puntualidad y faltar al trabajo o a la escuela

Como digo siempre: un servidor es tan bueno como su admin.

Las personas son diferentes

Uno de los principios básicos de los rosacruces y otras teorías o movimientos filosóficos es: «Solo hay una ley sagrada: la ley de la desigualdad entre los hombres». Incluso se menciona en Zanoni, de Bulwer-Lytton, y creo que en algunos libros atribuidos indistintamente a los fundadores de los rosacruces o a Eliphas Levi.

La idea parece acertada.

Hay algunas situaciones en las que pienso mientras, para variar, saco respaldos en segundo plano y sigo moviendo biofuels y municiones en EVE Online. Sin ser por orden de importancia:

Los recuerdos y la realidad no son lo mismo. He oído de personas valiosas y tranquilas, como mi suegra, una versión de eventos que no sucedió pero que ella cree sinceramente. O mi papá, que me hablaba de cuando fue a recogerme a la escuela el día del temblor del 85; pero no fue así, me regresé solo y otra historia de la familia demuestra mi dicho. Mi papá, de plano, estaba dormido ese día. Por otro lado, sobre la secta destructiva, en su momento oí dos o tres versiones diferentes del mismo evento. O en el caso del hospital que estaba viendo para el servicio social: si no le pagan a los proveedores por su tiempo y el material, no van a trabajar, y no lo digo por mí. Que se inventen otro pretexto es su asunto.

Un concepto básico de la contabilidad es lo fungible o intercambiable de un objeto. Por ejemplo, un kilo de arroz de una marca y un periodo de tiempo es intercambiable por otro similar, aunque la calidad cambie año con año. Un coche nuevo que no se ha usado es igual a otro de las mismas condiciones y colores; pero, con el paso del tiempo, son diferentes para fines legales, contables y de seguro. No solo por el dueño, sino por la memoria de lo que el coche ha pasado.

¿Por qué tantos reniegan de su memoria?

En el juego EVE Online, existen unas 500 capacidades diferentes que se aprenden en niveles (slots) del 1 al 5. A veces, aprender del nivel 4 al 5 de cada habilidad tarda desde tres días hasta dos meses. Puedo comprar y comparar las habilidades de los pilotos, pero no su experiencia. Unos la tienen y otros no. Eso me dice a veces que debo aprender para poder vender un piloto sin efectos secundarios. Un obrero regular parece igual a otro, pero, como vi desde mi trabajo en los supermercados, una jefa de cocina buena era la diferencia entre vender 500 mil mensuales o 17 mil. Sí. No le dieron aumento a esa jefa y quisieron poner a otra que además usaba latería golpeada; las ventas del departamento se fueron al demonio.

La memoria puede ser experiencia o traumas, entre otras cosas. Huir de los recuerdos malos no sirve de nada. Esperar que no pase algo de nuevo es normal, pero la prevención cuenta. Algunas cosas tienen fecha de expiración en el mundo real y otras no. A veces, la situación cambia de una manera que simplemente no puedes prever.

Por ejemplo, nadie en su sano juicio entrena ciertas cosas a Nivel 5 en EVE Online. Conocí a una persona interesada en la música con instrumentos medievales que hizo su tesis de doctorado sobre la importancia de los gatos negros en la cultura medieval; hija de un millonario, claro. Entrenar “Takmahl Technology 5” en el juego es, a veces, contraproducente. El Nivel IV es mejor, e incluso nunca he tenido que usar el nivel III. Es el equivalente al doctorado en la importancia de los gatos negros.

Otro caso que recuerdo es el de una dama que conocí: estudió Biología Marina en una escuela de paga en la Ciudad de México, pero no quería mudarse de la ciudad para ejercer. O uno de los líderes de la secta, a quien le dio por llamarse a sí mismo «Licenciado en Astrofísica Onírica» y, en otra de sus identidades, decía ser abogado especialista en Derecho Informático por la UNAM, especialidad y cédula que no existían.

Aquí surge un derivado interesante sobre la fungibilidad o el intercambio de las cosas. Entre 2010 y 2011, una de las identidades de la secta se inventó una historia sobre europeos de una secta en el pueblo de Chipilo que usaban walkie-talkies. Era un indicio más de locura de los de la secta, y tan poco razonable que tenía que verificarlo. Parecía ser cuento chino y lo era, por lo mismo otra identidad probable y confirmada después. ¿Para que mentir? Dio la casualidad de que en esa época yo estaba desarrollando un sistema para detectar variaciones de temperatura en camiones refrigerados que transportaban leche a una fábrica. Hice una llamada a mi cliente y me dijeron que ellos vendían a empresas artesanales de quesos; además, me invitaron a ir a Chipilo esos días.

He visitado comunidades raras en el país, principalmente en Chiapas y Oaxaca, además de algunas en Guerrero, Puebla y Yucatán, absolutamente increíbles por lo surrealistas. Pero lo que encontré en Chipilo era más parecido a las comunidades Amish de Estados Unidos: un pueblo de unos 3 a 5 mil habitantes, descendientes de italianos, que efectivamente usaban walkie-talkies, pero debido a una señal de internet que entonces era infame y porque es lo habitual en las fábricas (celulares eran caros, frágiles e inútiles) Hay que ser claros: no puedes dejar celulares demasiado tiempo en un refrigerador; no son de uso rudo. Los recibos de roaming y la pérdida de señal siguen siendo problemas vigentes.

En la plática con las personas de una fábrica local surgió la oportunidad de hacer un demo sobre el mecanismo de cambios de temperatura y sus alertas. Surgió un detalle comercial normal y, cuando comenté sobre controles de inventarios en cámaras de refrigeración, el tema se extendió. Íbamos de pasada para una visita de una hora y terminamos yéndonos a altas horas de la noche. En los meses siguientes realicé proyectos de control de merma (cuando cortas mantequillas o quesos y no sabes cuánto servirá o cuánto se irá a la basura por daño estético), pero lo más interesante fue que de ahí surgió un cliente en Puebla.

Ese cliente es el que me interesa para esta narración. Una fábrica de quesos tenía un problema de 15 toneladas (rubro que yo ya conocía por mi trabajo en la Central de Abastos en el año 2000). El problema era, literalmente, un queso pecorino del que no conocían la calidad ni estaba rotulado por lote, fruto de diversos experimentos. Ese queso se conserva bien por años, pero algún idiota a cargo del área iba almacenando por fecha y no por lote, tina, tipo de queso ni receta.

Así, tenían el 40% de los bienes de la empresa concentrados en un producto que no podían vender, del que no sabían la calidad y que no era fungible. Hice un presupuesto y un plan de recuperación con un ingeniero químico, que incluía un sistema de jueces. El problema era que los costos para cumplir con las normas sanitarias más elementales volvían incosteable cualquier control de calidad.

No sé qué hicieron al final con esas quince toneladas de queso.

 Aquel queso eran 15 toneladas y el cálculo entonces era de unos 200 mil USD. Las pruebas de calidad se enfocaban en el lote actual, pero el control del inventario estaba hecho solo en kilos. Al mismo tiempo, el producto ocupaba cámaras refrigeradas que costaban dinero. Hay cosas que no puedes conservar sin pagar el precio; el queso sin refrigeración se pierde. He estado en bodegas de galletas de 150 metros cuadrados por 12 de alto, llenas de galletas de animalitos que se vendían al gobierno. Allí, el costo no era solo el almacenamiento, sino las medidas de previsión ante las ratas.

La memoria es un bien similar. Hay cuidados que se deben tener con el cerebro basándose en la observación y notas propias  (por eso sirven los libros de Plutarco y similares) que, aunque puedan tener cierto sesgo o subjetividad, son lo más razonable posible. Escribo este blog desde 2004 como un «palacio de la memoria», un almacén tanto de ideas como de sucesos. Hay que refrescar la memoria con baños de realidad y observación directa.

Otro caso: hace unos cinco meses, el sistema Kehjari en EVE Online tenía en baja seguridad la única fábrica a la redonda. Hice allí en solitario el 40% de las municiones que mencioné antes. Hace una semana, aprovechando el final del evento que facilita la logística, fui a ver si olvidaba algo.

Oh, oh… problemas. Había de 40 a 60 personas. Tres días seguidos en un sistema que comúnmente estaba vacío y no tiene nada especial. No hay registro de muertes de naves o NPC. ¿Qué estaban haciendo allí? Los índices industriales eran buenos, pero no estaban construyendo. Daré un vistazo más en dos semanas y otro en un mes y medio. La memoria me dice que es un buen lugar; la visibilidad me dice que hay peligro. Si ves a un vago en motocicleta a 15 metros delante de ti, no es paranoia: es el simple hecho de que nadie en su sano juicio hace tiempo en esa zona en una moto.

La  memoria no es un bien tal cual. Debe ser tratada como un sistema de auditoría continua. Verificación de primera segunda y tercera mano, que además es necesaria para planes de contingencia. Si sabes lo que ganas no te compras un Iphone 25 que no necesitas ni te vas de vacaciones a Europa cuatro meses y te asustas con las tarejtas de crédito después. Son casos de problemas de memoria. La memoria y la realidad, simplemente son y alterarlas no sirve de nada.

Se conectan la termodinámica (el queso que se pudre), la seguridad física (el vago en la moto) y la inteligencia militar en EVE (el sistema Kehjari) en una sola lección de supervivencia.

La mayoría de los problemas de memoria que he visto vienen de personas que quieren sentirse muy listas y piensan que pueden mentirse sobre sus propios recursos. Se mienten sobre sentirse amados o sobre el uso eficiente de su tiempo. Crean historias falsas que ellos mismos terminan creyendo, pero que no resisten la menor verificación. Allí es donde aparecen las vidas desperdiciadas y las 15 toneladas de queso. Y los recibos de tarjeta de crédito o del internet que no pueden pagar por falta de previsión.

Mucho de mi razonamiento se basa en Santo Tomás: «ver para creer». Uso la observación directa y digital. En los juegos, consulto sitios de terceros para ver estadísticas de muertes y precios; eso me da una idea, pero la memoria debe ser verificada. A veces, simplemente debes contar.

Ahora mismo interactúo con cinco alianzas y tres personajes solitarios con reglas especiales. Son ocho  grupos de personajes diferentes sin contacto entre sí. Tienen memoria, sus valores te llevan a la memoria y sus reglas también. Estoy en medio de asuntos similares al mundo real, donde la «memoria RAM» subió de precio: varios clientes del juego piden a mis industriales ciertas cosas. Se viene una guerra. La memoria no es intercambiable.

En los 90, hubo una serie de Punisher llamada War Zone (Diario de Guerra), escrita por Chuck Dixon. La idea de las entradas era similar a esto. A diferencia de otras personas, yo mantengo la realidad muy a la mano, aunque separada. La gente del trabajo debe saber de la secta en ocasiones, pero no tienen por qué saber otras cosas. Como cuando un tipo le levantó la mano a una cajera y acabó en el hospital porque yo lo mandé allí; él vivía con la «memoria» de que no pasaba nada. Para la cajera y para mí era obvio que su propia madre y su exnovio eran tóxicos, pero ellos tenían su propio manejo de la realidad.

Es un asunto de organización. De ahí viene la idea de la realidad sin concesiones. Tengo cosas pequeñas que hacer en el mundo real, pero crear planes de contingencia para la producción en tres alianzas a la vez y realizar el inventario de materiales es muy parecido a mi trabajo de sistemas y a mi formación contable.

Lo que importa es lo que haces, no lo que hiciste o lo que dices que hiciste. En este caso, lo que me toca es verificar mis inventarios y prepararme para la guerra. Al igual que las notas de Punisher War Zone tomaban sentido después, lo mismo pasó en Chipilo. Es exactamente lo que no hicieron aquellos que terminaron con 15 toneladas de queso inútil.

La solución pragmática erasimple. Anotar lo sucedido como era. Al igual que lo pragmático era entonces usar walkie-talkies en lugar de celulares. Y probablemente sigue siendo igual.

Intercambios y pensamientos

Ya di la plática que tenía pendiente con una startup en México que tenía problemas con su SpringBoot. Me falta pasar cosas en limpio antes de publicar. Cobré algo normal, no por la plática sino por la configuración de tres servidores, que fue sobre todo una prueba de concepto.

Mientras escribo pienso en otros intercambios de tiempo por dinero. Al mismo tiempo tengo cuatro pilotos conectados en Eve Online, moviendo municiones y algo llamado Biofuels. Eve es uno de los pocos juegos donde el multiboxing está permitido (usar varias cuentas a la vez). Creo que puede ser interesante por términos de uso del tiempo eso como ejemplo, pero tengo que expresarlo más bien en una serie de ideas sueltas que llevan a un fin, sin orden cronológico.

Cuando estoy con un cliente por tiempo, es decir, que me paga por dar apoyo y/o desarrollar ciertas horas a su personal (ejemplo cliente de los monolitos o las gaseras), la mayor parte de mi tiempo se iba en estas actividades:

  • Respaldos.
  • Levantarme e ir a ver a los usuarios (5, 10, 20, 30…) sobre si necesitaban algo en lo que pudiera ayudarles.
  • Correr un proceso de detección de incidencias al que llamaba Barrido. Con eso evitaba que cosas que sucedieron antes volvieran a pasar.
  • Y la mayor parte de desarrollo era a nuevas necesidades.

Pero por ejemplo, no acepto clientes de hospedaje web o dominios que no sean de conocidos. ¿Razón? Durante 2007 varias identidades de Julio Diana y su secta. O que en 2012 un cliente que corrí por falta de pago de él, trató de ir con otra empresa reconocida en el ramo de lo que yo daba el servicio, y lo que no sabía él era que yo era el nuevo responsable técnico de allí.

Entre 1998 y 2001 tuve varios clientes que querían pagar en especie. Sea equipo de cómputo o coches. Era razonable entonces, ahora sería razonable en ciertos límites. Pero era cambiar mi tiempo por hacerles un sistema por su bien. Y en el caso del coche era un permiso de compra-venta donde, aprovechando que otro de mis clientes era una agencia de coches, era yo un intermediario entre dos clientes.

Muchos de los problemas de salud de los jóvenes se debe a que de jóvenes cambian salud por dinero, y luego de grandes quieren cambiar dinero por salud. Pero muchas cosas son… automáticas. Incluido el desperdicio de tiempo o el uso eficiente del mismo.

En mis 30s, después de los eventos de 2001, mi uso del tiempo era levantarme, bañarme, ir al trabajo, comer, regresar, ver cosas de mi familia (si estaba a la mano) o cosas de clientes, dormirme. Los fines de semana ir al cine. Mi pareja de entonces había sido acosada por AÑOS por la secta que nos acosó desde el 2000. A ella le tocaron nueve años de acoso, a mí 17. Pero a lo que voy, es que mi tiempo no tenía desperdicio. Entre la presión de la secta y problemas del lado de su familia, esta persona, mi pareja de entonces, empezó a crearse problemas familiares con ellos (supongo que por la sensación de control y poder de mi ingreso vs los de ellos) y creó muchísimos problemas, llevando a que en venganza me mataran a mis perros.

Mientras escribo años después, veo que el uso del tiempo tiene que ver con paciencia e intercambios, no de tiempo por valores, sino por atención. Ejemplo, mi atención estaba en los clientes de los últimos años entre clientes, proveedores y mi familia. Además de atención en mi propia mente.

Yo pensaba, y pienso incluso al ir al Oxxo. La primera vez que vas a un trabajo sueles poner mucha atención a los detalles y después no, vas en babia. O pensando en algo útil, que es la excepción y no la regla.

En México son pocas las empresas donde su gente de sistemas no cabe en una camioneta grande. Por ejemplo, en Gas Express Nieto llegamos a ser 12 y… ¡¡21!! De los cuales los usuarios solo querían hablar conmigo y con otra persona, ni siquiera con el jefe del área, porque éramos los únicos que poníamos atención y resolvíamos sus problemas. Eramos 21 que parecíamos 2. Y en empresas de desarrollo, la velocidad de la mayoría y sus errores hacen que los reales quepan en una camioneta. Cuando salí de las gaseras eramos TRES personas de haber sido  21 y me fui porque no quise cambiarme de ciudad.

¿Alguna vez has ido al Oxxo mientras piensas en otra cosa? ¿O vas a comprar comida de perro a una hora que decidiste el día anterior? Las dos cosas son válidas; son uso eficiente del tiempo.

Ahora bien. Si una empresa quiere usar una tecnología gigantesca para coordinar a tres personas de sistemas, lo más seguro es que tarde o temprano corran a dos de ellos. A veces conservan a sus amigos, o a veces me conservan a mí, que resuelvo los problemas. Por ejemplo, de las gaseras del 2000, en 2026 soy el único que sigue en sistemas. Hay otro que sé por referencia que dizque coordina algo en un estacionamiento (programadores) y paga mal, pero no es público y en su momento no hacía nada. En todo caso, manipulaba. Yo me muevo abiertamente. De la empresa de 2020 en la pandemia, éramos siete (desde 2014). Yo el único externo. Y soy el único que sigue cobrando en 2026.

Los clientes y usuarios de mis sistemas que se quedaron acostumbrados a mi nivel de servicio me buscan años después. Tuve un caso muy chistoso en 2011. Una red en la que puse el cableado en 2000  (antes de los problemas del 2001 ) me buscó el cliente por correo en 2011 para mentarme la madre y decirme que qué pasó con la garantía. No entendía yo ni quién era. ¿Más garantía que funcionar diez años sin mantenimiento? ¿Mejor uso del tiempo? Es un poco complicado.

Un contrato es, en muchos aspectos, un acuerdo formalizado para restringir libertades. Un contrato de trabajo es cambiar tu tiempo en dar un servicio por dinero. La compra de algo es decir: «te doy este dinero o este kilo de frijoles» y ya no voy a disfrutar de él.

Me ha tocado ver personas que no quieren formalizar este cambio de libertades. Pero hay libertades que no lo son. Me rijo por un código moral y valores que para observadores externos son más parecidos al estoicismo de Marco Aurelio y al libro del I Ching que a otra cosa. Hay personas que me han dicho que por disciplina parezco un soldado.

Pero no obedezco órdenes idiotas, y de momento no le pongo especial interés a la condición física, porque a los casi 54 tengo cosas más interesantes que hacer.

En su momento me pagaron, por ejemplo, con una camioneta Ram Charger en Guadalajara a cambio de arreglarles un desastre contable y creo que les dí como 20 mil pesos de ahorita. Era un intercambio decente, y el equivalente a unos… cinco meses de sueldo de ahorita o un año de muchas personas.

Comentaba ayer que, al ir a comprar papel de baño en el súper, vi unas pizzas que se veían decentes y económicas. Y sabiendo que los panecitos (bocadillos rellenos de panadería) no están mal, me pareció adecuado hacer un intercambio. Podríamos llamarlo criterio de oportunidad. En realidad, lo he visto también en la compra de casas.

Mi padre decía que el dinero en efectivo vale el doble. Si es cierto, me ha ayudado a hacer buenos tratos; aunque nunca he generado la cantidad de dinero que podía hacer mi papá, sí he estado cerca. Sin embargo, no es lo que me importa. (y si, se que el dinero en efectivo tiene sus problemas en épocas de devaluación o de muy bajos intereses pero eso es tema aparte)

Un ejemplo (usando cantidades simuladas y no actualizadas). Hace unos 30 años me comenta el antiguo dueño de mi departamento que si no estaba interesado en otro. Ese valía unos 950 mil. Yo tenía 670. Pues la persona necesitaba el dinero, así que se quedó con 640 por los gastos de notario y yo con un segundo departamento. ¿Lo podría haber hecho gastando mi tiempo y dinero en tonterías? No.

Lo único que NO estoy haciendo ahorita con mi tiempo que debería estar haciendo es sacar a pasear a mis perros, pero eso me crearía otro problema que no detallaré aquí.

Comenté también que en 1999 o 2000 tuve un Pontiac Sunfire de agencia por unas tres semanas y que me di cuenta de que no lo necesitaba. Lo regresé por las circunstancias (era indispensable uno similar para la empresa asi que me regresaron el dinero) . Tengo un Motorola G31 en lugar de un iPhone 25. Usando el ejemplo de Eve Online, hace como unos siete meses compré una cantidad impresionante de material de PI (explotación planetaria) y además el equivalente a 6,270,000 m³ de Biofuels; o usando un símil, es algo así como comprar un mes y medio de suscripción de algo aparentemente inútil y en un lugar peligroso. Y eso era el Biofuel, eracomo el doble de cosas útiles. Pero en el trato aquel, mi ganancia fue en un solo movimiento como de 2 o 3 meses de suscripción, solo que esa parte era en especie. Yo no iba a usar el biofuel, o por lo menos no tanto, y en otro uso eficiente del tiempo, lo saqué en diciembre en segundo plano en una operación de evento Winter Nexus de 80 naves. Y ahorita, además de juntar las municiones, he ido juntando como producto secundario el Biofuel y vendiéndolo.

Un ejemplo. Trabajé en una fábrica de galletas que enviaba tráileres llenos a la frontera con USA y a veces regresaban vacíos. Digo: a veces. Después me tocó hacer un sistema para coordinar la importación y transporte de sopas Maruchan/Nissin en esos tráileres vacíos.

Algo por el estilo pasa con el tiempo. No se trata de divertirte, sino de no desperdiciar. No es ir en dos direcciones a la vez, sino moverte cuando es necesario. ¿Alguna vez has mandado a tu hija al mandado? Pues seguro sí. . Mi familia sabe defenderse y no la mandaría a un lugar peligroso, pero sí al Oxxo. Así que mientras escribo tengo pilotos de Eve en modo automático moviendo biofuels, y ya vendí el 75%. Y con eso me sobra para comprar otra cosa, que es a lo que voy.

Conozco varias personas que tienen coches BMW y problemas de dinero. En el juego estoy pensando en comprar un carguero Avalanche (que mueve muchísimo material a la vez y es el único que tiene capacidades de combate), pero es porque implica un ahorro en tiempo y puedo venderlo después. Cabe destacar que puede cargar mas de lo que necesito, que cualquiera de mis cargueros actuales. Pero la idea es del uso del tiempo. Por ejemplo, hace unos años compré un piloto especializado en una nave que tenía potencial. Moví con él 30 Jump Freighters Rhea fuera de null, ganando unos diez meses de suscripción, y vendí después al piloto al mismo precio. Solo gasté la transferencia. Fue un uso eficiente del tiempo porque no solo moví las naves, sino que las moví llenas.

Sería en este caso un intercambio de sacar Biofuels y Venderlos, por la Avalanche. En la Avalanche, el blindaje no estorba a la carga; es una estructura pensada desde el origen para resistir sin dejar de ser útil.

Pero tu tiempo no tiene reversa. Se pueden cometer errores como manejar a muy alta velocidad y matarte, o comprar un BMW que no necesitas y que en la vida real se deprecia. En este caso estamos hablando de un riesgo nulo, equivalente a un mes de suscripción, dinero virtual que obtuve de vender algo aparentemente inútil pero  que dió como opción da la posibilidad de ahorrar tiempo dentro del juego. En vez de mover unos 670 viajes, es posible que lo haga en 30. Y si no me gusta o no funciona, puedo venderlo con una pérdida del 10%. Y es más util que el Biofuel en medio de ninguna parte.

Es un trato justo. Se trata del uso eficiente del tiempo. El dinero es secundario, en la vida real y en el juego. Y soy más de una camioneta Ram Charger que de un BMW; la finalidad es la misma: ahorrar tiempo. No como sustituto de inseguridades personales. Un occator en Eve en lugar de un un Hulk o Rattlesnake. Es el equivalente de usar un Seat en lugar de un BMW.

Y mientras escribo, cuatro pilotos en simultáneo movieron el 15% del valor de la Avalanche (entre los cuatro) en una ruta de 60 saltos.

En lo que decido que hago, mis cuatro pilotos despegan su OCCATOR en un viaje de vuelta, y no vacios.

Mientras tú descansas, alguien trabaja.

Finales del Evento

Tengo gustos simples.

Ayer tuvimos una reunión en una de mis casas con personas de «Ojos Alerta» (el grupo de los Azulejos). En la plática salieron varios temas sobre indicadores y, para explicar un punto, puse un ejemplo.

El 2001 fue para mí un año complicado. Una de las cosas que comenté es que, en ese entonces, una pizzería vendía pizzas tradicionales simples (nada de «dos por uno») la hawaiana grande costaba 50 pesos de aquel tiempo. Ayer, mientras comíamos unas pizzas cuadradas que venden unos vecinos a 330 pesos (éramos seis y compramos dos, así que fueron 660 pesos), pensaba que esos 16 USD realmente valen la pena por su calidad. La pizza de 4 USD no era mala tampoco.

Sin embargo, cuando pasé a comprar papel higiénico a un Bodega Aurrerá sobre la carretera, vendían en la tienda una pizza de caja de pepperoni simple en 79 pesos. Como parte de un experimento la compré y nos la comimos; no estaba mal. Pero hay tres detalles curiosos que comenté:

  1. Podemos decir que la calidad de la pizza de $50 de 2001 y la de $79 de 2026 es similar.

  2. Empecé a trabajar en 1991. Mi casa, donde fue la reunión, se construyó también en 1991. Aunque la compré hace menos de diez años, en su momento hice cuentas sobre cuántos meses de mi sueldo inicial se necesitaban para comprar esa casa (en su estado original, sin mejoras).

  3. Mi hija empezó a trabajar el año pasado. Da la casualidad de que, si proyectamos su sueldo por el número de meses del cálculo anterior, le bastaría para comprarse una casa simple en Atizapán u otras partes del Estado de México.

Mi hija, como muchos jóvenes, desperdicia su dinero. Yo conseguí un ascenso en mi trabajo el primer día y, para fines prácticos, al final de ese primer año (entre bonos y otras cosas) ganaba el triple o quizá el cuádruple. Además, hice trabajos adicionales en mi tiempo libre. El primer proyecto fuerte de sistemas que realicé fue en 1991: organizar una red Lantastic para una migración de SAT 92 y escaneos para discos láser. Éramos ocho personas; yo no estaba a cargo, pero ese dinero me sirvió para generar reservas.

Terminé ese año con casi dos años de mi sueldo original ahorrados, sumado a la venta de mi camioneta Ram Charger al llegar a México (comprada en Guadalajara con mi propio dinero). Mis fondos de reserva equivalían a tres años de sueldo original. Lo interesante es que, con poco más de eso y una diferencia de 1,000 USD (un mes de sueldo actual de entonces), me compré mi primera casa.

A lo que voy es que la situación de mi hija es similar. En aquella época de 1991 las pizzas no eran populares; se conocían, pero se popularizaron más o menos cuando abrió el Pizza Hut pequeño en Polanco, a la altura de París Londres. El uso de los recursos generacionales es diferente, pero incluso en 2001, cuando todo salió mal, había una equivalencia. Realmente las pizzas de $50 y la de $79 tenían buen sabor, aunque ahora, como adultos, podamos comprar las cuadradas de $330 (así como yo compraba Pizza Hut para mí solo en 1996 y 2002).

El fin y el principio

¿Qué tiene que ver esto con el final del evento? El I Ching tiene dos hexagramas, el 63 y el 64, que hablan de «después de la consumación» y «antes de la consumación». Como dice el libro, muchas veces hay que considerar las cosas como un nuevo principio. La mayoría de las personas caen en la trampa de esperar para «darse un premio». Yo raramente lo hago. Los regalos que doy a mi familia o parejas nunca son excesivos (ocasionalmente sí), pero son decentes; en cambio, mis autorregalos suelen costar una quinta parte de eso. Mi padre se regalaba libros; yo, por ejemplo, este fin de año regalé unos 2,500 a 3,000 pesos en la casa y mi autorregalo fueron algo de 400 pesos(el precio de venta al transferir / vender un personaje de eve online) y dos objetos útiles de 100.

He comprado celulares y computadoras nuevas, pero siempre como instrumentos de trabajo, no como premios. En 2017 armé una computadora estándar para estándares de EE. UU., pero comprada aquí en México por unos 1,500 USD. Sigue siendo mi «caballito de batalla» nueve años después. La compré porque preveía un aumento en el precio de la memoria RAM y armar un equipo con 32 GB en ese entonces era una buena idea. Hace tres semanas, por el mismo motivo, le añadí 8 GB extra por 600 MXN (para un total de 16 GB Kingston Fury) a una PC secundaria con cuatro monitores. No fue un premio, fue una inversión previendo un aumento. No fue un fin de ciclo, ni miedo.

Capacidad de trabajo, deseo de trabajo y previsión.

Movimientos en el vacío.

Mientras escribo esto, con la otra mano acaricio un perro y estoy volando en Eve Online. Son las 19:04 y llevo «Nanite Repair Paste», un producto especializado que fabrico en un lado del universo para llevarlo al otro. Tengo otros dos pilotos en automático. Hoy es el último día del evento de fin de año y la última oportunidad para realizar ciertas evacuaciones seguras (si sabes lo que haces) hasta finales de año. Ya saqué y vendí las naves que mencioné en otros posts (las Thorax y Cormorant). Saqué las municiones y las puse en lugar seguro, pero concentrarlas me tomará semanas. No tengo prisa. Eso me pasa por transformar casi un año de materiales / minerales en dos años de municiones, ambos a valor de venta. Al regresar de la venta de Nanite usaré el viaje de regreso para hacer un pequeño paso de la concentración de municiones para no moverme en blanco. Aprovechar el tiempo en la medida de lo posible, por previsión. En unos meses las municiones se habrán ordenado solas en apariencia.

Mi nave de transporte simple, una Occator, espera mi siguiente movimiento; tengo menos de un minuto para decidir. No grabo la imagen porque mi monitor de 25 pulgadas (modelo 2015) generaría un archivo de más de 3 MB, demasiado grande para los estándares de WordPress.

Voy haciendo aproximaciones sucesivas. Realizo pequeños movimientos con la nave, como en un coche: aunque tenga la vista en la pantalla o en la carretera, la memoria corporal y la inercia mueven tanto la nave como la vida de varias personas.

Me explico: el año pasado, el «cliente de los monolitos» no me pagó durante cinco meses. Pero yo no vivía de ese dinero; para mí era un extra equivalente a unos diez meses del sueldo inicial de mi hija, pero un ingreso secundario al fin. No me muevo por codicia ni por la falacia del «costo hundido». Me muevo por honor, valores y, a veces, por previsión razonable.

Por ejemplo, llevo semanas con una presentación y levantando servidores secundarios para un cliente eventual, lo cual me impidió dedicar tiempo a lo que quería hacer en Eve Online. Tengo un personaje donde concentro industria y recursos, pero tenía pertenencias en cuatro lugares muy peligrosos y unos veinte medianamente peligrosos. El lugar más crítico ahora es donde se mueven los restos de Pandemic Horde. Moverme allí no tiene sentido; no porque sean enemigos, sino porque si vas a hacer algo que requiere 80 viajes en silencio y vale unos cinco meses de suscripción, no lo puedes hacer en sistema donde hay 200 pilotos en promedio, mitad amigos mitad enemigos con cualquiera de mis personajes, así que no hay prisa, me haya pagado el cliente o no.

En otro de los lugares peligrosos decidí no hacer nada por la logística de este cliente y dejé ahí el equivalente a una semana de suscripción. Haré preparativos y lo sacaré el próximo año. Aun así, todos los objetivos pequeños se cumplieron, mantuve mi mente en paz y logré el 85% de lo que quería hacer.

Sí, el fin de año es un nuevo principio. Pero no me preocupo. Es, como comentaba ayer, un túnel que es a la vez presente, pasado y futuro, guiado siempre por los mismos valores.

Capacidad de trabajo, deseo de trabajo y previsión.

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.  Gemini usa el maven pero puedes adaptarlo a usar el build de gradle.

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

 

Parte 3 :Stack Lamp y Quarkus Dev

Tiempo para realizar lo mencionado aquí ? dos horas y con breaks.

Costo? Como anoté en las tres primeras partes esto fue un encargo para cliente. Desde el momento enb que entré a terminal en máquina limpia, hasta que cloné en la parte 5 fueron poco menos de tres días y no dedicados a esto..

La eficiencia técnica se traduce directamente en agilidad económica: mientras que el costo operativo de este stack en Vultr es de apenas 20 USD al mes, el proceso completo de implementación, desde el inicio de la configuración hasta la generación y clonación de la imagen final para el cliente, representó un gasto ínfimo de tan solo 2.33 USD. Esta cifra no solo cubre el tiempo de cómputo, sino también la transferencia de datos entre servidores durante el despliegue de la imagen maestra.

Es la prueba de que un servidor de alta densidad, basado en Debian 13 y optimizado quirúrgicamente, permite realizar despliegues masivos y entregas de infraestructura crítica por una fracción del costo de los proveedores tradicionales. No es solo gastar menos, es la capacidad de replicar entornos profesionales de producción en cuestión de minutos y por el precio de un café, manteniendo la soberanía total sobre el sistema y los datos del cliente.

En artículos anteriores levantamos con Debian un stack spring boot en un LAMP de 4gb y 80 disco duro. Quedé para terminar de poner un ejemplo con thymeleaf de un carrito de compras modificado de algo que está en internet sabiendo que hay limitaciones, pero como prueba de concepto.

Al mismo tiempo creo que es buena idea por una paridad por el manual de LEMP, levantar aquí Quarkus en modo dev, como prueba de concepto.

Al mismo tiempo hay tres ideas que me gustaría comentar antes para que se entienda mejor.

  • Dentro de grupos tradicionales, de mi trabajo fuera de sistemas, se usa el término de COMPARTIR, IMPONER Y ORGANIZAR. Lo que estoy haciendo aqui y que hacen los de código libre como el del carrito de compras, es compartir. Si, tiene sus riesgos. Una persona decente evita IMPONER a menos que no le quede otro remedio. Pero en muchos trabajos te IMPONEN algo que no funciona y que se lleva a la empresa entre las patas y  te acusan a ti. A mi me pasó solo una vez por el 2000 cuando trataron de usar PDO y access para mas de 50 usuarios simultáneos a pesar que les dije que access colapsa con 5 usuarios desde AÑOS antes. Mi trabajo es en muchos aspectos ORGANIZAR y tratar de arreglar desastres e incorporar nuevas solicitudes a un esquema simplificado.
  • Con el paso del tiempo los sistemas se degradan y no solo por la obsolesencia programada o cambios de versiones. No sabes que basura le ponen al servidor después. O tu proveedor te empieza a hacer balooning. (dar menos memoria o cpu que la que les pagas) O cambios de proveedor porque el cliente quiere reducción de costos aunque sea 20% mas lento y 1% mas barato. Pero es importante que tengas presente que debes documentar que hiciste, que instalaste y que está. En código decir que versión de lenguaje o librería se usa.
    • No es raro que alguien se equivoque si tiene dos servidores y trabaje en el servidor equivocado. Eso puede causar conflictos y a veces reinstalar todo el server. Por eso es que en muchos lugares no te quieren decir que tienen porque lo que tienen es miedo y no tienen ni idea de como lo hicieron funcionar después de un dedazo. «servidores en pincitas» digamos.
  • Hay cosas que siempre fueron mala idea y nunca funcionaron aunque te digan lo contrario. En 2022 Tuve que alterar un sistema php 5.6 Laravel 5.2 hecho en 2017 que siempre ponía una frase en Alemán. La tecnología eraobsoleta ya entonces (2017).  o cuando en 2006 me dieron un sistema en visual basic raro, y luego descubrí que habían sido dos programadores originales. Me dieron el código de uno y la base de datos de otro. Y aunque usé mucho del primero, cuando TRES años después aceptaron que me dieron de dos personas diferentes, me hubiera resultado mucho mejor haberlo hecho de cero con la base de datos existente porque uno usaba colecciones a lo bestia y el segundo diseñó para sql 2000 cuando el server real era sql 7. Si SQL7, no sql 2005 o sql 2008 (sql2005 por cierto hubiera sido peor pero eso es otra historia de terror por los problemas que introdujo 2005 en adelante). Por favor… Verifica que versiones tienes de base de datos, sistema operativo , lenguajes de operación como primer paso. A lo mejor no te dejan verificarlo y trabajas doble pero mientras te pagan. Y pon por escrito plataforma destino y lo que te dijeron que tenían.

Asi que por completitud, vamos a instalar en debian 13 de 4 gb ram  con LAMP el quarkus dev y veremos en otro tema lo del carrito de compras, notando problemas que tiene, aciertos que tiene y agradeciendo la aportación original, adaptandola a tiempos modernos y sin darle hardening. Es vital recordarle al lector que un código bajado de internet es un punto de partida, no un producto final para producción.

1 Quarkus:

De entrada es buena práctica de seguridad cambiar el puerto a algo diferente, Y en este caso es necesario. Por lo mismo como es «Modo Dev», recuerda que por defecto usa el puerto 8080, que ya tenemos ocupado por el «TestServer» de Spring. Por eso verás que uso 8081 en el  comando de arranque:

Esto lo harás mas adelante.

# Arrancando Quarkus en el puerto 8081 para no chocar con Spring
./mvnw quarkus:dev -Dquarkus.http.port=8081

 

1.1. El Ajuste en Apache (El Puente)

Para que el mundo vea ese Quarkus en el 8081 a través de tu dominio, necesitamos añadir el puente en tu archivo de configuración SSL. Esto mantiene la coherencia con lo que hicimos antes:

Apache

# Añadir dentro de /etc/apache2/sites-available/tu-dominio.com-le-ssl.conf

# Proxy para Quarkus Dev Mode
ProxyPass /quarkus http://127.0.0.1:8081
ProxyPassReverse /quarkus http://127.0.0.1:8081

El fragmento te debe quedar así

# Proxy para el Backend de Spring Boot
ProxyPreserveHost On
ProxyPass /api/ http://127.0.0.1:8080/api
ProxyPassReverse /api/ http://127.0.0.1:8080/api

# Proxy para Quarkus Dev Mode
ProxyPass /quarkus http://127.0.0.1:8081
ProxyPassReverse /quarkus http://127.0.0.1:8081

 

1.2. ¿Por qué «Modo Dev» en un servidor?

Es importante explicar que, aunque en producción usaríamos un ejecutable nativo, el modo Dev en el servidor nos permite:

  • Live Coding: Cambias el código y los cambios se ven al refrescar el navegador (vía Apache).
  • Dev UI: Quarkus levanta una interfaz increíble en /q/dev que facilita mucho la vida del programador.
  • Pero… meterme en llas diferencia de modos de nativo y graal es mucho mas tardado. Así que dev sirve perfectamente para demostrar que Quarkus está instalado.

1.3. El Código «Hola Mundo» Ultraligero será el default

1.3.1 Preparar el terreno (Directorios y Permisos)
Como estamos bajo la filosofía de ORGANIZAR, vamos a crear una carpeta específica dentro de /var/www/ para que conviva con tus otros proyectos.

OJO : Quarkus no se «instala» en el sistema como un servicio tradicional (como un apt install).

Quarkus es un framework basado en Maven o Gradle. Lo que «instalas» es la estructura de tu proyecto y el ejecutable vive dentro de la carpeta que tú decidas. En nuestro caso, la «instalación» es el proyecto mismo que generamos.

# Crear la carpeta del proyecto
mkdir -p /var/www/quarkus-app
# Dar propiedad al usuario actual para poder trabajar sin sudo constante
chown -R $USER:$USER /var/www/quarkus-app
cd /var/www/quarkus-app

1.3.2. Reinstalando Maven y Gradle.

Estas dos herramientas siempre sirven. Teóricamente tienes Maven por Spring, pero casi siempre instalo los dos para detectar y solucionar problemas de permisos, versiones, y gradle es mi preferido aunque sea antiguo porque sufre menos corrupción y menos afectado por problemas de permisos. Uno es un camión de carga (maven) y el otro es un sedán con buen motor y que consume menos ram (gradle). Es mi punto de vista.

Tratar de usar java springboot o quarkus sin maven o sin gradle es como tratar de tomar agua sin vaso y sin manos.

# Actualizamos repositorios
apt update

# Instalar Maven (El estándar para la mayoría de proyectos Spring/Quarkus)
apt install maven -y

# Verificar Maven
mvn -version
Para Gradle, si prefieres tenerlo disponible (muchos devs de la «Tribu Spring» lo aman por ser más rápido que Maven):

Bash

apt install gradle -y

# Verificar Gradle
gradle -v

 

1.3.3. Generar el proyecto Quarkus de cero

Fijate que uso un directorio con mis iniciales. Usa lo que tu quieras.

En lugar de descargar un ZIP, usaremos el comando de Maven (que ya deberías tener por el paso de Spring o la reinstalación del paso previo) para generar la estructura básica. Esto garantiza que se cree el directorio com/aoa/ que mencionamos:

mvn io.quarkus.platform:quarkus-maven-plugin:3.6.4:create \
-DprojectGroupId=com.aoa \
-DprojectArtifactId=monitoreo-quarkus \
-DclassName=»com.aoa.GreetingResource» \
-Dpath=»/quarkus»

cd monitoreo-quarkus

La primera vez que corres el comando de generación, Maven descargará medio internet. No te asustes. Es el «costo de entrada» para tener todas las dependencias organizadas. Si eres como yo, quizá te den ganas de llorar al ver TODO lo que se instala para un hola mundo. Se positivo, velo como «area de oportunidad» o «menos competencia»

Verás un letrero con letras verdes diciendo BUILD SUCESS. Si no lo ves algo hiciste mal y no debes proseguir.

Antes de que el usuario intente arrancar Quarkus en el punto 1.3.3, necesita saber que el archivo de configuración debe estar listo, de lo contrario chocará con Spring. Puedes añadir esto:

1.3.4 El ADN del proyecto (Puertos)

Entra a la carpeta y dile a Quarkus quién es y por dónde debe hablar:

Asegúrate de que tenga estas líneas para que Apache pueda encontrarlo… Añade estas líneas para asegurar la paz con Apache y Spring:

  • mkdir -p src/main/resources
  • nano src/main/resources/application.properties

Properties

quarkus.http.port=8081
quarkus.http.host=127.0.0.1

Recuerda que siempre debes Verificar y Recargar Apache

Antes de reiniciar, siempre es bueno verificar que no dejamos algún error de dedo (como un espacio antes de <VirtualHost> o una comilla curva de WordPress).

  • # 1. Test de configuración (Busca el «Syntax OK»)
  • apache2ctl configtest
  • # 2. Si todo está bien, recargamos
  • systemctl restart apache2

1.3.5 El problema de las versiones.

Recuerdas que dijimos que tenemos SDK 21 ? Pues Maven, Gradle, tus compañeros tu jefe o lo que sea pueden estar seguros que el servidor no tiene lo que quieres. Y eso debes primer asegurarte que es lo que tienes. Aqui tenemos SDK 21. Pero Maven puede que tenga una versión diferente.

Revisa con Maven que tienes :

  • mvn -version

Te debe decir que tienes 21.0.9 Si no busca en internet y revisa por si las dudas en que servidor estás.

Si estás en el servidor correcto y debes corregirlo empezamos antes que nada, por editar el pom.xml de maven, su configuración. o vas a obtener un feo letrero rojo que diga «release version 21 not supported»

La solución rápida (El ajuste en el pom.xml)
Debemos decirle explícitamente a Maven que use la versión 21. Entra al archivo de configuración de tu proyecto:

  • cd /var/www/quarkus-app/monitoreo-quarkus
  • nano pom.xml
    Busca la etiqueta <properties> (está al principio) y asegúrate de que estas dos líneas digan 21:

<maven.compiler.release>21</maven.compiler.release>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>

¿Por qué pasa esto?
Como puse antes: «Verifica que versiones tienes… como primer paso». Aquí tienes el ejemplo vivo. Tienes el JDK 21 instalado (la máquina), pero Maven está tratando de usar un nivel de lenguaje que no reconoce o que cree que no está soportado por el compilador actual.

Bonus:

  • Una vez me pasó hace años que estaban tratando de echar a andar quarkus en un servidor equivocado. Lo instalaron en uno y se queajban que no existia la carpeta de archivos.

Segundo paso : «Verifica que versiones tienes… y en que servidor estás como segundo paso»

1.3.6 El momento de la verdad (Arrancar Quarkus)

la diferencia entre texto inútil y código, son los permisos.

Porque ?

A veces alguien mete mano. En windows lo hace el sistema operativo mismo. Pero si no eres el que usa el server en exclusiva, se precavido y si no también.

  • cd /var/www/quarkus-app/monitoreo-quarkus
  • chmod +x mvnw

A veces el BUILD SUCCESS de la generación del proyecto nos miente dándonos una falsa sensación de seguridad. El wrapper (mvnw) es un script de shell, y en Linux, un script sin permiso de ejecución es solo un archivo de texto inútil. No olvides el chmod +x mvnw o te quedarás mirando la pantalla sin entender por qué el comando no hace nada cuando ayer si funcionaba.

Ahora que Apache ya tiene el puente construido hacia el puerto 8081, solo falta que alguien esté escuchando del otro lado. Corre el comando que ya tenías:

  • cd /var/www/quarkus-app/monitoreo-quarkus
  • ./mvnw quarkus:dev -Dquarkus.http.port=8081

Esto es vital. Cuando corres Quarkus en una terminal de un servidor remoto (vía SSH), a veces el modo dev intenta abrir una ventana o se queda esperando una entrada de teclado. Además, necesitamos que acepte conexiones externas (a través de Apache).

¿Por qué hacerlo así?

Al crear el directorio com.aoa mediante el plugin de Maven, ya tienes un archivo llamado GreetingResource.java listo para ser modificado. No tienes que crear rutas manualmente.

1.3.7 Verificación Final de Quarkus

Si todo ha salido bien, al final de la lluvia de logs y de descargar la media mitad de internet que te faltaba verás un mensaje que dice: Listening on: http://127.0.0.1:8081

Ahora, la prueba de fuego no es entrar por el puerto 3000 o 8081 directamente (que deberían estar cerrados en el firewall), sino a través de nuestro puente blindado:

Abre en tu navegador: https://tu-dominio.com/quarkus

Deberías ver una página que dice «Hello from Quarkus REST» (o lo que hayas puesto en tu GreetingResource.java).

¿Por qué es esto un éxito?

Atravesaste el Proxy de Apache: Tu servidor web principal está redirigiendo el tráfico correctamente.

SSL funcionando: Entraste por HTTPS sin errores de certificado.

Aislamiento de puertos: Tienes Spring en el 8080 y Quarkus en el 8081 conviviendo en paz en el mismo Debian 13.

La pantalla debe ser como esto:

así que por la módica cantidad  de 20 USD o menos tienes instalado springboot php lamp quarkus maven y gradle, e incluso con 10 USD puedes en 2 gb ram para pruebas.

Una llamada al monitoreo ahora nos lleva a esto, que significa en palabras comunes que para pruebas es suficiente con 2 gb de ram te digan lo que te digan las LLM u otras personas de sistemas. Si usas Un stack decente como Debian 13.

Estado del Servidor (Debian 13)
Memoria RAM: 1475 MB usados de 3916 MB (37.67%)

Disco Duro: 15.32 GB usados de 74.56 GB (20.54%)

Carga de CPU (1, 5, 15 min): 0, 0.052734375, 0.0595703125

Que te parece horrible y maravilloso y te hace dudar del futuro de internet ? Si. No es posible que necesites  1475 MB de ram para un hola mundo. Además de una conexión estable y descargar varios gigabytes.

Y por eso muchos programadores que van poniendo basura tras basura en una base sucia, acaban cambiando de profesión. Las buenas prácticas te permiten proseguir, pero muchas empresas gastan demasiado por malas prácticas, y malas elecciones de framework o demás.

No van a durar mucho en México empresas medianas que usen la nube para esto. Si ves que hay cuatro o cinco personas que no hacen nada y les pagan, la empresa quiza puede. Pero esto es igual o mas costoso en la nube que un programador bueno y a veces implementado peor. Preocúpate cuando haya problemas para pagar nómina o nube.

No me extrañaría que se cambie a algo más en 2029, en lugar de springboot que es 2014. Sea Quarkus Javelin o algo mas que salga. Springboot será legacy.

El carrito de compras lo pondré en parte 4.

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 dejabanentrara 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

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.