Skip to main contentSaltar al contenido principal
Andrés Morales

Hardening de Linux VPS, Caddy HTTP/3 y Resiliencia Móvil: Del Chatbot Comercial a la Producción Estable

AM

Andrés Morales

AI & Full-Stack Systems Architect

•4 min
#DevOps#Linux#Caddy#Next.js#AI Automation#Cybersecurity

Vista de arquitectura y monitoreo en escritorio

El Reto Técnico de la Jornada

Operar como Senior Full-Stack & AI Automation Engineer significa no limitarse a redactar prompts o diseñar interfaces en React: implica responsabilizarse del ciclo operativo de extremo a extremo, desde el kernel de Linux hasta los microsegundos del renderizado en navegadores móviles.

Hoy enfrentamos tres frentes críticos simultáneos:

  1. Estabilidad de Servicios y Dominios Multi-Tenant: Incidentes de routing en landings clave (clepsidravioleta, briefs desalineados y colisión de dominios secundarios).
  2. Bugs de Runtime en Safari iOS: Reportes de «se rompió el sitio» específicos de iPhone, derivados de componentes no tolerantes a hidratación y duplicidad de botones flotantes de WhatsApp.
  3. Hardening de Infraestructura y Respaldo Inmutable: Consolidación del perímetro defensivo en nuestro Linux VPS con cortafuegos estricto, mitigación de intrusiones y snapshots cifrados automatizados hacia un canal privado en Telegram.

1. Hardening del VPS: Caddy HTTP/3, UFW y Fail2ban

Nuestra premisa de infraestructura es minimalismo y tolerancia a fallos. Descartamos configuraciones barrocas en favor de políticas estrictas por defecto.

Cortafuegos UFW y Mitigación

Configuramos el firewall para rechazar cualquier tráfico que no corresponda a los túneles administrativos y de tráfico web seguro:

# Política base: DROP entrante estricto
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH bastión'
sudo ufw allow 80/tcp comment 'HTTP ACME challenge'
sudo ufw allow 443/tcp comment 'HTTPS TLS 1.3'
sudo ufw allow 443/udp comment 'HTTP/3 QUIC'
sudo ufw enable

Adicionalmente, desplegamos Fail2ban con dos cárceles operativas (sshd y docker-auth) para mitigar escaneos de fuerza bruta de manera inmediata.

Caddy con HTTP/3 Nativo

En el borde, Caddy gestiona la terminación TLS 1.3 y la negociación HTTP/3 vía UDP/443 sin fricciones, aislando cada vhost para que un cambio en un dominio satélite jamás impacte los servicios centrales:

gatocolectivo.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:3000 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
    }
    header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    header X-Content-Type-Options "nosniff"
    header X-Frame-Options "DENY"
}

Backups Automatizados a Telegram Vault

Para la persistencia, evitamos depender de almacenamiento local efímero. Un script programado en systemd empaqueta snapshots de base de datos, los comprime con cifrado y los transmite directamente a nuestro canal privado de Telegram vía Bot API:

#!/usr/bin/env bash
set -euo pipefail
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
ARCHIVE="/tmp/db_snapshot_${BACKUP_DATE}.sql.gz"

# Dump & compresión
docker exec -t postgres_prod pg_dump -U postgres app_db | gzip -9 > "$ARCHIVE"

# Envío seguro al Telegram Vault
curl -s -F chat_id="${TELEGRAM_ADMIN_CHAT_ID}" \
     -F document=@"${ARCHIVE}" \
     -F caption="🛡️ Snapshot automatizado DB: ${BACKUP_DATE}" \
     "https://api.telegram.org/bot${TELEGRAM_BACKUP_BOT_TOKEN}/sendDocument"

rm -f "$ARCHIVE"

2. Depuración Frontend: Safari iOS y Microinteracciones

Depuración de componentes en vista móvil

El error «se rompió el sitio» reportado en iPhone provenía de una colisión entre el hook de hidratación del menú hamburguesa y el evento táctil en WebKit móvil, sumado a un bundle duplicado que inyectaba dos triggers flotantes de WhatsApp.

Solución al Menú Móvil y Evitar Layout Shifts

Refactorizamos el menú móvil desacoplando el estado global del portal DOM y garantizando una renderización segura sin disparar WebKit quirks:

// components/navigation/MobileMenu.tsx
"use client";

import { useState, useEffect } from "react";
import Link from "next/link";

export function MobileMenu() {
  const [isOpen, setIsOpen] = useState(false);

  // Prevenir scroll de fondo de forma segura en iOS WebKit
  useEffect(() => {
    document.body.style.overflow = isOpen ? "hidden" : "unset";
    return () => { document.body.style.overflow = "unset"; };
  }, [isOpen]);

  return (
    <nav className="md:hidden" aria-label="Navegación móvil">
      <button
        onClick={() => setIsOpen((prev) => !prev)}
        className="p-2 text-white focus:outline-none focus:ring-2 focus:ring-accent-500"
        aria-expanded={isOpen}
        aria-label="Alternar menú"
      >
        <span className="sr-only">Abrir menú principal</span>
        <div className={`hamburger-icon ${isOpen ? "open" : ""}`} />
      </button>

      {isOpen && (
        <div className="fixed inset-0 z-50 bg-black/90 backdrop-blur-md flex flex-col items-center justify-center space-y-6">
          <Link href="/brief" onClick={() => setIsOpen(false)} className="text-xl font-medium text-white hover:text-accent-400 transition-colors">
            Completar Brief
          </Link>
          <Link href="/portfolio" onClick={() => setIsOpen(false)} className="text-xl font-medium text-zinc-300 hover:text-white transition-colors">
            Portafolio
          </Link>
        </div>
      )}
    </nav>
  );
}

Asimismo, unificamos el componente de mensajería eliminando el botón huérfano para mantener un único punto de contacto flotante consistente.


3. Asistente Conversacional para WhatsApp: Criterio Técnico Primero

Diseñamos e implementamos la especificación para el agente técnico de WhatsApp, asegurando un tono consultivo de alto nivel:

  • Respuestas técnicas antes de la guía comercial: Si preguntan por integraciones, se analiza la viabilidad en 1-2 líneas sin enviar al usuario a enlaces genéricos.
  • Cero presupuestos a ciegas: No se ofrecen cifras sin conocer stack, proveedores o volumen de datos.
  • Calificación contextual sin fricción: Si el cliente tiene urgencia, se hacen 2 preguntas puntuales en el chat y se estructura la propuesta a la medida.

Cálculo y componente de impacto ROI


Conclusión y Aprendizajes

La excelencia técnica no radica en acumular capas complejas, sino en dominar los fundamentos: cortafuegos sencillos pero impenetrables, proxies rápidos con protocolos modernos (HTTP/3), interfaces móviles probadas en WebKit real y automatizaciones que salvaguardan los datos del negocio silenciosamente cada noche.

¿Tienes cuellos de botella en tu infraestructura o necesitas automatizaciones de IA verdaderamente robustas para tu operación?

👉 Conoce más de mis soluciones y casos de estudio en andresmorales.com.co.

CONSULTORÍA & ARQUITECTURA

¿Quieres automatizar tu operación o acelerar tu producto digital?

Diseño pipelines con IA, modernizo stacks en Next.js y blindo servidores con cero fricción técnica. Hablemos de números y arquitectura.

Automatización IA · UI/UX · Producción

Haz la cosa.Sin boilerplate.

Estudio independiente desde Cali. Flujos de automatización, UI hecha a mano y web end-to-end — para equipos que prefieren tenerlo listo a discutirlo.

Hablemos
2,014Fundado en 2014

Del brief al deploy, el estudio mantiene todo en un solo lugar: alcance, diseño, construcción, entrega. Los briefs llegan al escritorio, los entregables al cliente.

Andrés Morales