# Sergio Caballero

Tutoriales de Tecnología, Recomendaciones y consejos para tus sitios webs

- Site: https://sergiocaballero.com/

## Qué es la inteligencia artificial y cómo empezar a usarla sin conocimientos técnicos

- Link: https://sergiocaballero.com/que-es-la-inteligencia-artificial-guia-principiantes/
- Published: 2026-10-17T06:52:56+00:00
- Author: sergio

Si escuchas hablar de **inteligencia artificial** todos los días pero todavía no
tienes claro qué es exactamente ni cómo empezar a usarla en tu vida o trabajo, esta
guía es para ti. No necesitas saber programar, no necesitas entender cómo funcionan
los algoritmos y no necesitas una inversión inicial. Lo que sí necesitas es una 
explicación honesta de qué puede hacer la IA por ti hoy, con ejemplos concretos 
y sin jerga técnica innecesaria.

## Qué es la inteligencia artificial: explicación sin tecnicismos

La **inteligencia artificial** es tecnología que permite a los ordenadores realizar
tareas que normalmente requieren inteligencia humana: entender texto, reconocer 
imágenes, mantener conversaciones, tomar decisiones o generar contenido. No es un
robot físico ni una mente consciente: es un sistema entrenado con enormes cantidades
de datos que aprende a predecir qué respuesta o acción es más adecuada en cada situación.

La forma más accesible de IA para el usuario común en 2026 son los **modelos de 
lenguaje**, como ChatGPT, Claude o Gemini. Son sistemas con los que puedes conversar
por escrito, hacerles preguntas, pedirles que escriban textos o que analicen información.
No tienen conciencia ni emociones, pero son extraordinariamente buenos procesando
y generando lenguaje.

## Para qué sirve la inteligencia artificial en la vida cotidiana

Antes de hablar de cómo empezar, conviene tener claro para qué sirve realmente la**
inteligencia artificial** en el día a día de una persona sin perfil técnico:

 * **Redactar y mejorar textos:** correos, informes, mensajes profesionales, presentaciones.
 * **Responder preguntas complejas:** investigar un tema, entender un concepto difícil,
   comparar opciones.
 * **Resumir documentos:** contratos, artículos largos, informes de trabajo.
 * **Traducir texto:** con una calidad muy superior a los traductores automáticos
   tradicionales.
 * **Generar ideas:** para proyectos, campañas, nombres de productos, temas de contenido.
 * **Aprender más rápido:** explicaciones personalizadas de cualquier tema, a cualquier
   nivel de profundidad.

## Cómo empezar a usar inteligencia artificial sin conocimientos técnicos: guía paso a paso

### Paso 1: elige una sola herramienta para empezar

El error más común es intentar probar diez herramientas a la vez. Para empezar, 
elige una sola. La recomendación para la mayoría de usuarios sin experiencia es 
ChatGPT en su versión gratuita: es la más intuitiva, la que tiene más recursos de
aprendizaje disponibles y la que cubre el mayor número de casos de uso generales.
Crea una cuenta en [chat.openai.com](https://chat.openai.com/) y empieza a explorar.

### Paso 2: empieza con una tarea real de tu trabajo diario

No experimentes con preguntas abstractas. La **inteligencia artificial** se aprende
mejor cuando la aplicas a algo concreto que necesitas resolver hoy. ¿Tienes que 
escribir un correo difícil? ¿Necesitas resumir un documento largo? ¿Quieres entender
un concepto del trabajo? Empieza por ahí. Verás resultados inmediatos que te darán
contexto sobre qué puede y qué no puede hacer la herramienta.

### Paso 3: aprende a dar instrucciones claras

La calidad de lo que obtienes depende directamente de cómo lo pides. Una instrucción
clara incluye: qué quieres que haga, para quién es el resultado, en qué tono y qué
extensión o formato necesitas. No es necesario ser experto en "prompting" para mejorar:
con solo añadir contexto básico a tus peticiones, los resultados mejoran notablemente.

### Paso 4: verifica siempre la información importante

La **inteligencia artificial** puede generar información incorrecta con total confianza.
No lo hace con mala intención: simplemente está prediciendo qué texto tiene más 
sentido en ese contexto, no verificando hechos. Para cualquier dato importante, 
número, fecha o afirmación crítica, contrasta la respuesta con fuentes externas 
antes de usarla.

### Paso 5: amplía tu uso gradualmente

Una vez que domines una tarea, añade otra. Con el tiempo, construirás una comprensión
práctica de qué funciona y qué no, sin haber leído un solo manual técnico. La curva
de aprendizaje de la IA para usuarios no técnicos es mucho más corta de lo que la
mayoría espera.

Para una visión más completa de las herramientas disponibles y sus diferencias, 
puedes consultar nuestro análisis de [las mejores inteligencias artificiales de 2026](https://sergiocaballero.com/mejores-inteligencias-artificiales-2026)
una vez que hayas experimentado con la primera.

## Mitos sobre la inteligencia artificial que frenan a los principiantes

 * **"Necesito saber programar para usarla":** Falso. Las interfaces conversacionales
   como ChatGPT están diseñadas para funcionar con lenguaje natural, sin ningún 
   código.
 * **"Es solo para jóvenes o técnicos":** Falso. Usuarios de todas las edades y 
   perfiles profesionales usan IA hoy con resultados concretos.
 * **"La IA lo sabe todo y nunca se equivoca":** Falso. Los modelos cometen errores,
   especialmente en datos numéricos, fechas y hechos muy específicos.
 * **"Si la uso, perderé mi trabajo":** La evidencia actual muestra que quienes 
   usan IA bien tienden a volverse más productivos y valiosos, no menos.

## En pocas palabras

La inteligencia artificial es una tecnología conversacional que cualquier persona
puede usar hoy sin conocimientos técnicos. Empieza con ChatGPT gratuito, aplícalo
a una tarea concreta de tu trabajo diario y aprende a dar instrucciones claras. 
El único requisito real es curiosidad y disposición a experimentar. Verifica siempre
la información importante y amplía el uso gradualmente a medida que ganas confianza
con la herramienta.

## Conclusión

No existe razón válida para posponer el primer contacto con la inteligencia artificial.
Las herramientas son accesibles, gratuitas y no requieren experiencia previa. Lo
que sí requieren es empezar. Si quieres seguir aprendiendo con guías prácticas y
sin tecnicismos, visita [sergiocaballero.com](https://sergiocaballero.com/) donde
encontrarás más recursos actualizados para usuarios de todos los niveles.

## Agentes de inteligencia artificial: qué son, cómo funcionan y qué cambian en tu trabajo

- Link: https://sergiocaballero.com/agentes-inteligencia-artificial/
- Published: 2026-10-17T06:52:54+00:00
- Author: sergio

Si creías que los chatbots de IA ya eran una transformación importante, los **agentes
de inteligencia artificial** representan el siguiente salto. A diferencia de un 
asistente conversacional que responde preguntas, un agente de IA puede planificar,
tomar decisiones, ejecutar acciones y completar tareas complejas de forma autónoma,
sin que tengas que supervisar cada paso. Esta guía explica qué son exactamente, 
cómo funcionan en la práctica y qué implicaciones tiene su adopción para profesionales
de cualquier sector.

## Qué son los agentes de inteligencia artificial

Un **agente de inteligencia artificial** es un sistema que puede percibir su entorno,
tomar decisiones y ejecutar acciones para alcanzar un objetivo definido. La diferencia
clave con un chatbot convencional es la autonomía: un chatbot responde una pregunta;
un agente de IA recibe un objetivo y trabaja de forma independiente para conseguirlo,
eligiendo qué pasos dar en el camino.

En términos prácticos, un agente puede navegar por la web, leer documentos, escribir
y ejecutar código, enviar correos, interactuar con APIs externas y encadenar todas
esas acciones de forma coherente para completar una tarea que normalmente requeriría
varias horas de trabajo humano.

## Cómo funcionan los agentes de inteligencia artificial

Los **agentes de IA** operan con un ciclo básico de cuatro fases: percepción, planificación,
acción y evaluación. Primero analizan el objetivo y el contexto disponible. Luego
descomponen el objetivo en subtareas. Después ejecutan cada subtarea usando las 
herramientas disponibles. Finalmente evalúan el resultado y ajustan el plan si algo
no salió como esperaban.

Este ciclo puede repetirse decenas o cientos de veces en minutos. Lo que diferencia
a los mejores agentes de los más básicos es la calidad de esa evaluación intermedia:
los modelos más avanzados detectan cuando una subtarea no ha funcionado y replantean
el enfoque sin necesidad de intervención humana.

## Ejemplos reales de agentes de inteligencia artificial en uso hoy

### Claude Code — Agente de desarrollo de software

Claude Code es uno de los **agentes de inteligencia artificial** más adoptados en
el sector tecnológico. Opera desde la terminal del desarrollador, puede leer y modificar
archivos, ejecutar tests, interpretar los resultados y aplicar correcciones de forma
iterativa. Una tarea que tomaría varias horas de trabajo manual puede completarse
en minutos con supervisión mínima.

### OpenAI Operator — Agente de navegación web

Operator puede navegar por sitios web, rellenar formularios, hacer reservas y completar
procesos online de múltiples pasos como si fuera un usuario humano. Su caso de uso
más citado es la automatización de tareas administrativas que antes requerían que
una persona ejecutara una secuencia manual de acciones en el navegador.

### Agentes de IA en atención al cliente

Varias empresas han implementado **agentes de inteligencia artificial** que no solo
responden preguntas frecuentes, sino que pueden consultar el estado de un pedido
en el sistema de gestión, procesar una devolución, actualizar datos del cliente 
y enviar un correo de confirmación, todo sin intervención humana. La diferencia 
con un chatbot es que el agente completa la transacción, no solo informa sobre ella.

## Diferencia entre un chatbot convencional y un agente de IA

 * **Chatbot:** responde preguntas, genera texto, analiza información que le das.
   Pasivo: solo actúa cuando le preguntas.
 * **Agente de IA:** recibe un objetivo y trabaja de forma autónoma para cumplirlo.
   Activo: toma decisiones, usa herramientas y ejecuta acciones sin esperar instrucción
   en cada paso.

## Riesgos y limitaciones de los agentes de inteligencia artificial que debes conocer

Los **agentes de inteligencia artificial** son poderosos, pero su autonomía implica
riesgos que los chatbots convencionales no tienen:

 * **Errores en cascada:** si el agente toma una decisión incorrecta en una etapa
   temprana, las acciones siguientes pueden amplificar ese error. La supervisión
   en puntos clave del proceso sigue siendo importante.
 * **Acceso a sistemas sensibles:** un agente que puede ejecutar acciones reales
   necesita permisos bien definidos. Darle acceso excesivo a sistemas críticos es
   un riesgo de seguridad.
 * **Interpretación ambigua del objetivo:** si el objetivo no está bien definido,
   el agente puede completar la tarea de una forma técnicamente correcta pero diferente
   a lo que esperabas.
 * **Costos de API:** los agentes que ejecutan muchas acciones pueden generar un
   consumo significativo de tokens en las APIs subyacentes, lo que se traduce en
   costos que escalan con el uso.

Para entender mejor el contexto tecnológico en el que operan estos agentes, te recomendamos
revisar nuestro análisis comparativo de [las mejores herramientas de inteligencia artificial de 2026](https://sergiocaballero.com/mejores-inteligencias-artificiales-2026),
donde explicamos qué modelos están a la base de los agentes más avanzados.

## Cómo prepararse para trabajar con agentes de inteligencia artificial

 * **Empieza con tareas bien definidas y de bajo riesgo:** Los mejores primeros 
   casos de uso son procesos con pasos claros, outputs verificables y sin consecuencias
   graves si algo sale mal.
 * **Define checkpoints de revisión:** No delegar el 100 % sin ningún punto de control.
   Establece momentos en el proceso donde un humano revisa el avance antes de continuar.
 * **Documenta los procesos antes de automatizarlos:** Un agente necesita instrucciones
   claras. Si el proceso no está documentado, el agente lo interpretará, y esa interpretación
   puede no coincidir con lo que esperas.
 * **Aprende los fundamentos de prompting:** La calidad con que defines el objetivo
   inicial del agente determina en gran medida la calidad del resultado final.

## En pocas palabras

Los agentes de inteligencia artificial son sistemas que pueden ejecutar tareas complejas
de forma autónoma, a diferencia de los chatbots que solo responden preguntas. Ya
están en uso en desarrollo de software, atención al cliente y automatización de 
procesos web. Su adopción requiere definir bien el objetivo, establecer puntos de
revisión humana y gestionar los permisos de acceso con cuidado. Para quienes los
usen bien, representan la mayor ganancia de productividad que ofrece la IA en este
momento.

## Conclusión

Los agentes de inteligencia artificial no son ciencia ficción: están disponibles
hoy y ya están transformando cómo trabajan equipos de desarrollo, operaciones y 
atención al cliente en todo el mundo. Entender cómo funcionan y qué cuidados requieren
es el primer paso para adoptarlos de forma inteligente. Para seguir explorando el
futuro de la inteligencia artificial con análisis prácticos y accesibles, visita
[sergiocaballero.com](https://sergiocaballero.com/).

## Las mejores herramientas de IA gratuita

- Link: https://sergiocaballero.com/herramientas-inteligencia-artificial-gratuitas/
- Published: 2026-10-17T06:52:52+00:00
- Author: sergio

No necesitas gastar dinero para empezar a trabajar con inteligencia artificial. 
Existe una cantidad sorprendente de **herramientas de inteligencia artificial gratuitas**
que ofrecen capacidades reales, sin período de prueba limitado ni tarjeta de crédito.
El problema no es la falta de opciones, sino saber cuáles realmente funcionan y 
para qué sirve cada una. Esta guía reúne las mejores alternativas sin costo disponibles
hoy, organizadas por tipo de tarea, con sus ventajas y limitaciones reales.

## Por qué tiene sentido empezar con herramientas de inteligencia artificial gratuitas

Antes de comprometerte con una suscripción mensual, las versiones gratuitas te permiten
entender qué tipo de IA necesitas realmente. Un error muy común es pagar por un 
plan premium de una herramienta que no se adapta a tu flujo de trabajo. Probar primero
con las **herramientas de inteligencia artificial gratuitas** disponibles te da 
contexto real para tomar esa decisión con información concreta.

Además, para muchas tareas cotidianas, el plan gratuito es suficiente. No todos 
los casos de uso requieren el modelo más potente ni las integraciones más avanzadas.

## Mejores herramientas de inteligencia artificial gratuitas para texto y escritura

### ChatGPT (plan gratuito)

El plan gratuito de ChatGPT da acceso al modelo GPT-4o con límite de uso diario.
Es suficiente para redacción, resúmenes, traducciones y análisis de texto en la 
mayoría de casos de uso doméstico y profesional básico. Su principal limitación 
es que no incluye acceso a web en tiempo real ni a las funciones de generación de
imágenes de forma ilimitada.

### Claude (plan gratuito de Anthropic)

La versión gratuita de Claude ofrece acceso al modelo Sonnet, especialmente bueno
para textos largos, análisis de documentos y redacción con matices. Su ventana de
contexto es generosa incluso en el plan sin costo, lo que lo hace útil para trabajar
con PDFs o textos extensos. El límite de mensajes diarios es su restricción principal.

### Gemini (Google)

La versión gratuita de Gemini se integra con la cuenta de Google y permite interactuar
con Drive y Docs sin costo adicional para usuarios con cuenta personal. Es una de
las **herramientas de inteligencia artificial gratuitas** más completas si ya usas
el ecosistema Google en tu día a día.

## Mejores herramientas gratuitas de IA para búsqueda e investigación

### Perplexity AI (versión gratuita)

Perplexity es posiblemente la mejor **herramienta de inteligencia artificial gratuita**
para investigación. Su plan sin costo permite hacer búsquedas con fuentes verificadas
en tiempo real, lo que lo convierte en una alternativa sólida a Google para preguntas
complejas. La versión gratuita limita el número de búsquedas con el modelo Pro, 
pero el modelo estándar es ya considerablemente mejor que una búsqueda convencional.

### Microsoft Copilot (acceso gratuito en Edge)

Integrado directamente en el navegador Edge, el Copilot gratuito de Microsoft permite
resumir páginas web, generar texto y responder preguntas con acceso a internet sin
ningún costo. Es especialmente útil para quienes pasan mucho tiempo investigando
en el navegador.

## Mejores herramientas de inteligencia artificial gratuitas para imágenes

### Bing Image Creator (DALL-E integrado)

Bing Image Creator ofrece generación de imágenes con DALL-E de forma gratuita desde
el navegador. Cada cuenta recibe créditos diarios renovables. Es una de las pocas
opciones que da acceso a un modelo de generación de imágenes de calidad real sin
ningún pago.

### Adobe Firefly (créditos gratuitos)

Adobe Firefly ofrece créditos mensuales gratuitos para generación de imágenes. Su
ventaja respecto a otras opciones es que está entrenado con contenido licenciado,
lo que lo hace más adecuado para uso comercial. Los créditos gratuitos son limitados,
pero suficientes para explorar la herramienta.

## Herramientas de IA gratuitas para código y productividad

### GitHub Copilot (plan gratuito)

Desde finales de 2024, GitHub Copilot ofrece un plan gratuito con un número limitado
de sugerencias mensuales. Para desarrolladores que trabajan en proyectos personales
o estudiantes de programación, es una de las **herramientas de inteligencia artificial
gratuitas** más valiosas disponibles.

### Notion AI (respuestas limitadas gratuitas)

Notion AI incluye un número de respuestas gratuitas para usuarios con cuenta sin
costo. Permite resumir notas, generar listas de tareas, mejorar redacciones y traducir
contenido directamente dentro del espacio de trabajo. Es ideal para quienes ya usan
Notion como sistema de organización personal.

## Comparativa rápida: ¿cuál herramienta de IA gratuita usar según tu necesidad?

 * **Escribir y redactar:** ChatGPT gratuito o Claude gratuito
 * **Investigar con fuentes verificadas:** Perplexity AI gratuito
 * **Generar imágenes:** Bing Image Creator
 * **Navegar y resumir páginas:** Microsoft Copilot en Edge
 * **Programar:** GitHub Copilot gratuito
 * **Organización y notas:** Notion AI
 * **Integración con Google:** Gemini gratuito

Una vez que identifiques cuál se adapta mejor a tu trabajo, puedes considerar el
salto al plan de pago. Para hacer esa comparación con más detalle, consulta nuestro
análisis de [las mejores herramientas de inteligencia artificial de 2026](https://sergiocaballero.com/mejores-inteligencias-artificiales-2026).

## Limitaciones reales de las herramientas de IA gratuitas que debes conocer

 * **Límites de uso:** La mayoría de planes gratuitos tienen un tope de mensajes
   o créditos diarios. Superado ese límite, el acceso se congela hasta el día siguiente.
 * **Modelos menos potentes:** Los planes gratuitos suelen dar acceso a versiones
   menos capaces que los modelos premium. La diferencia es notable en tareas complejas
   de razonamiento o análisis extenso.
 * **Sin acceso a funciones avanzadas:** Memoria persistente, integraciones con 
   terceros, generación de voz o creación de agentes suelen estar reservadas para
   planes de pago.
 * **Privacidad de datos:** En algunos planes gratuitos, las conversaciones pueden
   usarse para entrenar modelos. Si trabajas con información sensible, revisa la
   política de privacidad antes de usarlos.

## En pocas palabras

Existen herramientas de inteligencia artificial gratuitas de calidad real para redacción,
búsqueda, imágenes y programación. ChatGPT, Claude, Perplexity y Bing Image Creator
cubren la mayoría de necesidades sin coste. Sus limitaciones principales son los
topes de uso diario y el acceso a modelos menos potentes que los de pago. Antes 
de suscribirte a cualquier plan premium, prueba la versión gratuita durante al menos
dos semanas para validar que la herramienta encaja con tu flujo de trabajo real.

## Conclusión

Empezar con inteligencia artificial no requiere inversión económica. Las opciones
gratuitas disponibles en 2026 son suficientemente capaces para que cualquier persona,
independientemente de su perfil profesional, pueda experimentar y medir el impacto
antes de pagar. Si quieres mantenerte al día con las novedades y comparativas de
estas herramientas, te invitamos a explorar más contenido en [sergiocaballero.com](https://sergiocaballero.com/).

## Inteligencia artificial para crear contenido: qué herramientas funcionan de verdad

- Link: https://sergiocaballero.com/inteligencia-artificial-para-crear-contenido/
- Published: 2026-10-17T06:52:50+00:00
- Author: sergio

Hay docenas de herramientas que prometen revolucionar tu proceso de creación de 
contenido con **inteligencia artificial para crear contenido**. La realidad es que
algunas funcionan muy bien, otras son mediocres con buena estrategia de marketing,
y unas pocas directamente no cumplen lo que anuncian. Esta guía te muestra, con 
ejemplos y criterios concretos, cuáles merecen tu tiempo y cuáles puedes ignorar,
para que tomes decisiones basadas en resultados reales y no en promesas.

## Qué puede hacer realmente la IA en la creación de contenido

La **inteligencia artificial para crear contenido** no reemplaza la estrategia ni
el criterio editorial. Lo que sí puede hacer es acelerar las partes del proceso 
que más tiempo consumen: generar borradores, adaptar textos a distintos formatos,
crear variaciones de un mismo mensaje para diferentes canales o sugerir estructuras
para artículos. Bien utilizada, puede multiplicar la velocidad de producción sin
sacrificar calidad.

Lo que no puede hacer de forma confiable: verificar hechos en tiempo real, crear
contenido con una voz de marca muy particular sin entrenamiento previo, ni garantizar
que el resultado esté libre de errores factuales. Entender ese límite es el primer
paso para usarla bien.

## Herramientas de inteligencia artificial para crear contenido que realmente funcionan

### ChatGPT — Para borradores, adaptación de tono y variaciones

ChatGPT sigue siendo la referencia en **inteligencia artificial para crear contenido**
escrito. Su capacidad para generar borradores estructurados, reescribir textos en
distintos tonos y adaptar un mismo mensaje para blog, redes sociales o email marketing
lo hace indispensable para equipos de contenido. La calidad del output depende directamente
de la calidad del prompt: con instrucciones detalladas, el resultado puede ser publicable
con ajustes mínimos.

### Jasper — Para equipos con volumen alto de producción

Jasper es una plataforma diseñada específicamente para **crear contenido con inteligencia
artificial** a escala. A diferencia de ChatGPT, incluye flujos de trabajo orientados
a marketing: generador de anuncios, emails de campaña, fichas de producto y artículos
de blog con estructura SEO incorporada. Su precio es considerablemente mayor, pero
se justifica para equipos que producen contenido en volumen.

### Copy.ai — Para copy de marketing y redes sociales

Copy.ai se especializa en textos cortos orientados a conversión: titulares, descripciones
de producto, textos para anuncios y publicaciones de redes sociales. Su interfaz
está diseñada para generar múltiples variaciones rápidamente, lo que lo hace útil
para hacer pruebas A/B de copy sin un redactor dedicado.

### Midjourney v7 — Para contenido visual de alta calidad

Para el componente visual del contenido, Midjourney sigue siendo la referencia en
calidad. La **inteligencia artificial para crear contenido** visual ha alcanzado
un nivel en el que las imágenes generadas son difíciles de distinguir de la fotografía
profesional, lo que abre posibilidades reales para equipos sin presupuesto de producción
fotográfica.

### Runway Gen-3 — Para contenido en video

Runway es la herramienta más sólida actualmente para generación y edición de video
con IA. Permite generar clips a partir de texto, eliminar fondos automáticamente,
aplicar efectos visuales y editar secuencias sin software de edición profesional.
Es la opción más práctica para creadores de contenido que necesitan video sin un
equipo de producción.

## Herramientas que prometen mucho y entregan poco

Existe una categoría de herramientas que comercializan la **inteligencia artificial
para crear contenido** como una solución "automática y sin esfuerzo". En la práctica,
generan textos genéricos, con poco valor diferencial y muy baja densidad de información
útil. Algunos indicadores de alerta:

 * Prometen "artículos SEO completos en un clic" sin revisión humana.
 * No permiten ajustar el tono ni el nivel técnico del contenido.
 * Generan textos que suenan a plantilla, con frases como "en el mundo actual" o"
   es importante destacar que".
 * No ofrecen control sobre las fuentes o referencias utilizadas.

El contenido generado sin supervisión humana tiende a rankear peor en Google y a
generar menor engagement, porque carece del contexto, la experiencia y el criterio
editorial que los lectores y los algoritmos valoran.

## Flujo de trabajo recomendado: cómo integrar la IA en tu proceso de contenido

 * **Planificación:** Usa la IA para generar ideas de temas, ángulos de contenido
   y estructuras de artículos basadas en la intención de búsqueda.
 * **Borrador:** Genera un primer borrador con la herramienta que mejor se adapte
   al formato (ChatGPT para artículos, Copy.ai para copy corto).
 * **Revisión humana:** Edita el borrador aportando experiencia real, datos verificados
   y la voz de tu marca. Este paso es innegociable.
 * **Optimización SEO:** Revisa la densidad de keywords, los metadatos y la estructura
   antes de publicar.
 * **Distribución:** Usa la IA para adaptar el contenido publicado a otros formatos:
   resumen para newsletter, versión corta para redes, hilo para Twitter/X.

Para asegurarte de que tu sitio web está técnicamente preparado para publicar contenido
de forma fluida, también puede ser útil revisar [cómo mantener tu equipo limpio y libre de software no deseado](https://sergiocaballero.com/descargar-adwcleaner-limpiador-de-basura-y-de-virus/)
que ralentice tu flujo de trabajo.

## En pocas palabras

La inteligencia artificial para crear contenido funciona bien como acelerador del
proceso creativo, no como sustituto del criterio editorial. ChatGPT, Jasper y Copy.
ai son las opciones más sólidas para texto; Midjourney lidera en imagen y Runway
en video. Las herramientas que prometen contenido automático sin revisión humana
raramente producen resultados de calidad publicable. El modelo que mejor funciona
es IA para el borrador, humano para la edición y la estrategia.

## Conclusión

Usar inteligencia artificial para crear contenido no significa publicar lo que el
modelo genere sin más. Significa acelerar las partes mecánicas del proceso para 
dedicar más tiempo a lo que realmente diferencia un contenido: la perspectiva, la
experiencia y el valor para el lector. Si quieres seguir explorando herramientas
y estrategias para mejorar tu producción de contenido, visita [sergiocaballero.com](https://sergiocaballero.com/).

## Cómo la inteligencia artificial está cambiando los empleos y qué puedes hacer al respecto

- Link: https://sergiocaballero.com/inteligencia-artificial-y-empleo/
- Published: 2026-10-17T06:52:48+00:00
- Author: sergio

La conversación sobre **inteligencia artificial y empleo** suele caer en dos extremos:
el apocalipsis laboral o el optimismo sin matices. La realidad es más compleja y
más interesante que cualquiera de los dos. La IA no está eliminando empleos de forma
masiva e indiscriminada, pero sí está transformando las tareas que componen esos
empleos, acelerando algunos procesos de sustitución y creando perfiles profesionales
que hace tres años no existían. Esta guía te explica qué está pasando realmente,
qué empleos están en mayor riesgo, y qué habilidades puedes desarrollar para posicionarte
mejor en ese nuevo escenario.

## Qué dice la evidencia sobre inteligencia artificial y empleo

El Foro Económico Mundial estimó en su informe de 2025 que la IA podría desplazar
alrededor de 85 millones de puestos de trabajo para 2030, pero también crear aproximadamente
97 millones de nuevos roles. El saldo neto sería positivo en términos de cantidad,
aunque la distribución geográfica y por sector es muy desigual. Los resultados varían
significativamente según el país, la industria y el nivel de adopción tecnológica
de cada mercado.

Lo que sí muestran múltiples estudios de forma consistente es que la **inteligencia
artificial y el empleo** tienen una relación de complementariedad en la mayoría 
de casos actuales: la IA automatiza tareas específicas dentro de un trabajo, no 
el trabajo completo. Un redactor que usa IA para generar borradores produce más 
contenido, no desaparece del mercado laboral.

## Empleos y tareas con mayor exposición a la automatización por IA

Los trabajos con mayor riesgo de automatización comparten una característica: implican
tareas repetitivas, basadas en reglas y con outputs predecibles. No significa que
esos empleos vayan a desaparecer mañana, sino que las tareas que los componen son
candidatas directas a ser reemplazadas por sistemas de **inteligencia artificial**.

 * **Entrada y procesamiento de datos:** formularios, transcripciones, clasificación
   de documentos.
 * **Atención al cliente básica:** resolución de consultas frecuentes y gestión 
   de reclamaciones estándar.
 * **Traducción básica:** textos técnicos sin matices culturales complejos.
 * **Análisis de datos estructurados:** generación de reportes y dashboards a partir
   de bases de datos.
 * **Redacción de contenido genérico:** descripciones de producto, notas de prensa
   estándar y resúmenes.

## Empleos que la IA no puede reemplazar fácilmente en el corto plazo

Hay categorías de trabajo que requieren habilidades que los modelos actuales de **
inteligencia artificial** no pueden replicar de forma confiable: empatía profunda,
juicio ético en contextos ambiguos, habilidades manuales complejas y creatividad
estratégica.

 * **Trabajos de cuidado:** enfermería, trabajo social, terapia psicológica.
 * **Roles de liderazgo y gestión de personas:** la IA puede apoyar decisiones, 
   pero la responsabilidad y la gestión del factor humano siguen siendo intransferibles.
 * **Trabajos con alta variabilidad física:** plomería, electricidad, construcción
   en entornos complejos.
 * **Roles creativos estratégicos:** dirección creativa, diseño de experiencias 
   y narrativa de marca requieren contexto cultural y emocional que los modelos 
   actuales no dominan.

## Habilidades que te posicionan mejor ante la transformación laboral por IA

### Prompting y uso efectivo de herramientas de IA

Saber usar las herramientas de **inteligencia artificial** disponibles ya es una
habilidad laboral valorada en prácticamente todos los sectores. No se trata de aprender
a programar, sino de saber qué pedirle a la IA, cómo verificar sus outputs y cómo
integrarla en flujos de trabajo reales.

### Pensamiento crítico y verificación de información

A medida que más contenido es generado por IA, la capacidad de evaluar la fiabilidad
de la información se vuelve más valiosa, no menos. Los profesionales que pueden 
distinguir entre un análisis sólido y uno superficialmente convincente tendrán una
ventaja duradera.

### Habilidades interpersonales y comunicación

La negociación, la gestión de conflictos, la construcción de confianza y la comunicación
en contextos emocionalmente complejos son habilidades que la IA no puede replicar.
Invertir en su desarrollo es una estrategia de largo plazo con alta protección ante
la automatización.

Para complementar tu adaptación tecnológica, también puede ser útil asegurarte de
que las herramientas que usas funcionan correctamente. Consulta nuestra guía sobre
[cómo mantener tu sistema Windows actualizado](https://sergiocaballero.com/como-actualizar-drivers-o-controladores-windows-10-y-11/)
para sacar el máximo partido a las herramientas de IA desde tu equipo.

## En pocas palabras

La inteligencia artificial está transformando el mercado laboral de forma gradual,
no apocalíptica. Las tareas repetitivas y predecibles son las más expuestas; los
trabajos que requieren empatía, juicio y creatividad estratégica son los más resilientes.
Aprender a usar herramientas de IA, desarrollar pensamiento crítico y fortalecer
habilidades interpersonales son las tres acciones más efectivas que cualquier profesional
puede tomar hoy para adaptarse a este cambio.

## Conclusión

El impacto de la inteligencia artificial en el empleo no es uniforme ni inevitable
en todos sus detalles. Lo que sí es seguro es que quienes adopten estas herramientas
y desarrollen las habilidades complementarias tendrán mejores posiciones que quienes
las ignoren. Para seguir informado sobre cómo la tecnología está transformando el
trabajo y la vida cotidiana, visita [sergiocaballero.com](https://sergiocaballero.com/).

## Monitorear Linux: CPU, memoria, disco y registros

- Link: https://sergiocaballero.com/como-monitorear-servidor-linux/
- Published: 2026-10-17T06:52:46+00:00
- Author: sergio

Monitorear un servidor Linux sirve para detectar cambios y explicar problemas. Una
cifra aislada, como memoria utilizada o carga elevada, rara vez basta para decidir
que debes ampliar recursos o reiniciar servicios.

Esta guía propone un recorrido de diagnóstico principalmente de lectura. Los ejemplos
usan Ubuntu o Debian; algunas herramientas necesitan paquetes adicionales y permisos
para mostrar información completa. No incluyen un instalador automático ni un servicio
de correo supuesto.

## Empieza por el síntoma del servicio

Anota qué falla, desde cuándo y para quién: peticiones lentas, errores HTTP, rechazos
de conexión o interrupciones. Comprueba desde un cliente exterior y compara con 
una prueba local.

Identifica cambios recientes de despliegue, configuración, certificados o volumen
de datos. Si solo observas el servidor, podrías pasar por alto una dependencia remota
o un problema de DNS.

    ```wp-block-code
    date -Is
    uptime
    nproc
    systemctl --failed
    ```

La fecha ayuda a correlacionar registros. nproc muestra procesadores disponibles
para el proceso, algo relevante cuando existen restricciones de recursos.

## Distingue carga y porcentaje de CPU

La carga media refleja tareas ejecutables y ciertas esperas no interrumpibles; no
es un porcentaje de CPU. Sus valores de 1, 5 y 15 minutos necesitan contexto de 
procesadores y tipo de trabajo.

    ```wp-block-code
    top
    ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 12
    ```

top permite observar cambios; la salida de ps es otra vista y no necesariamente 
utiliza el mismo intervalo de cálculo. Una tarea que ocupa un núcleo completo puede
aparecer con un porcentaje distinto según la herramienta y su modo.

Si sospechas saturación, identifica el proceso y el momento. No lo termines solo
por estar arriba de la lista: puede estar realizando un trabajo legítimo o esperando
otra dependencia.

## Interpreta memoria disponible y swap

    ```wp-block-code
    free -h
    vmstat 1 5
    ```

En free, available estima memoria que podría utilizarse sin intercambiar páginas.
Linux aprovecha RAM para cachés; un valor bajo en free no equivale automáticamente
a falta de memoria.

En vmstat revisa actividad de swap, procesos y cambios durante las muestras. La 
primera salida suele resumir desde el arranque, mientras las siguientes corresponden
al intervalo.

Busca presión sostenida y eventos de falta de memoria antes de atribuir lentitud
a la RAM. Un proceso puede estar limitado por su contenedor o cgroup aunque el host
todavía tenga memoria disponible.

## Separa espacio, inodos y latencia de disco

    ```wp-block-code
    df -h
    df -i
    sudo du -xhd1 /var
    ```

df muestra ocupación de sistemas de archivos; df -i ayuda a detectar agotamiento
de inodos por muchos archivos pequeños. du estima el espacio de archivos accesibles
en un recorrido y puede tardar o generar carga.

Si df y du difieren, considera archivos borrados que un proceso mantiene abiertos,
montajes y permisos. No borres carpetas al azar para igualar ambas cifras.

Para observar actividad de dispositivos, instala sysstat si no está disponible:

    ```wp-block-code
    sudo apt install sysstat
    iostat -xz -y 1 5
    ```

-y omite el primer informe acumulado. Relaciona latencias, cola y transferencias
con el almacenamiento que realmente utiliza la aplicación. Un %util alto no demuestra
por sí solo saturación en cualquier SSD o dispositivo paralelo.

## Comprueba escucha y registros

    ```wp-block-code
    sudo ss -ltnp
    ss -s
    sudo journalctl -u nginx --since '30 minutes ago' --no-pager
    sudo journalctl -k --since '30 minutes ago' --no-pager
    ```

Cambia nginx por la unidad real. Un puerto en escucha demuestra que existe un proceso
esperando conexiones en esa dirección; no confirma que el firewall lo permita ni
que la aplicación responda bien.

Los registros pueden mostrar errores de disco, falta de memoria o reinicios. Conserva
el intervalo relacionado con el incidente y retira secretos o datos personales antes
de compartirlo. Evita recopilar todo el journal sin una necesidad concreta.

## Pasa de observación a alertas útiles

Para el seguimiento continuo utiliza un recolector mantenido, almacenamiento de 
métricas y un canal de notificación probado. El panel por sí solo no avisa a nadie.

Define alertas sobre impacto, como tasa de errores o latencia, y señales preventivas
como tiempo estimado hasta llenar el volumen. Si eliges un umbral de CPU o RAM, 
decide duración y contexto; un pico breve puede ser normal.

Una alerta debe indicar sistema, hora, condición y una primera comprobación. Prueba
entrega, repetición y resolución. Ejecutar mail desde cron no garantiza que exista
un transporte configurado ni que el mensaje llegue.

Si instalas un panel, limita su acceso y autenticación desde el principio. Mantén
una comprobación externa: cuando el servidor completo cae, su propio monitor puede
dejar de enviar señales.

## Preguntas frecuentes

### ¿RAM utilizada al 90 % significa que necesito ampliar el servidor?

No necesariamente. Revisa available, actividad de swap, límites del proceso y síntomas.
La caché recuperable cambia la interpretación.

### ¿Una carga de 4 siempre es mala?

Depende de los recursos y del trabajo en espera. Compárala con procesadores disponibles,
uso de CPU, latencia de disco y comportamiento del servicio.

### ¿Cuánto historial necesito guardar?

El suficiente para comparar con ciclos normales y revisar incidentes, según volumen
y costos. Empieza con una retención explícita y ajusta tras observar el uso real.

## En pocas palabras

Las métricas del sistema explican una parte del problema. Relaciona consumo, latencia,
errores y cambios recientes, y conserva suficiente historial para distinguir una
variación normal de una degradación.

## Conclusión

Construye una línea base y prueba tus alertas antes de necesitarlas. La mejora consiste
en detectar síntomas útiles, reunir evidencia y confirmar la recuperación desde 
la perspectiva del usuario.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/procps/free.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/procps/uptime.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/sysstat/iostat.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/systemd/journalctl.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/procps/vmstat.8.en.html).

## Cron en Linux: tareas, registros y bloqueo de ejecuciones

- Link: https://sergiocaballero.com/como-configurar-cron-jobs-linux/
- Published: 2026-10-17T06:52:44+00:00
- Author: sergio

Cron permite iniciar comandos siguiendo un calendario. Para utilizarlo bien necesitas
entender tanto la expresión horaria como el usuario y entorno desde el que se ejecutará
el trabajo.

Esta guía utiliza cron de Ubuntu o Debian y una prueba sin privilegios de administrador.
Otras implementaciones pueden tener extensiones distintas. Comprueba el manual del
sistema antes de trasladar una expresión entre máquinas.

## Lee los cinco campos en orden

El crontab de un usuario utiliza minuto, hora, día del mes, mes y día de la semana,
seguidos del comando:

    ```wp-block-code
    # minuto hora día-mes mes día-semana comando
    30 2 * * * /ruta/absoluta/tarea
    0 9 * * 1 /ruta/absoluta/tarea
    */15 9-17 * * 1-5 /ruta/absoluta/tarea
    ```

La primera línea programa las 02:30 todos los días; la segunda, las 09:00 de los
lunes; la tercera, los minutos 00, 15, 30 y 45 de cada hora entre 09 y 17, de lunes
a viernes.

No confudas pasos dentro de un campo con un intervalo continuo. */35 en minutos 
selecciona 00 y 35 de cada hora; no mantiene una separación constante de 35 minutos
durante todo el día.

En el cron tradicional descrito aquí, si restringes tanto el día del mes como el
de la semana, basta que coincida cualquiera de los dos. Por eso 0 9 1-7 * 1 no significa
únicamente el primer lunes.

## Identifica la cuenta y conserva la programación

    ```wp-block-code
    whoami
    crontab -l
    systemctl is-active cron
    timedatectl
    ```

Si todavía no existe crontab, el listado puede informar de ello. Antes de editar
uno existente, guarda una copia:

    ```wp-block-code
    crontab -l > "$HOME/crontab-anterior.txt"
    crontab -e
    ```

Revisa que la copia se haya generado correctamente. No utilices crontab -r para 
retirar una sola tarea: elimina toda la programación del usuario.

## Prepara un trabajo verificable

En tu cuenta, crea un directorio:

    ```wp-block-code
    mkdir -p "$HOME/tareas"
    nano "$HOME/tareas/prueba-cron"
    ```

Guarda este script Bash:

    ```wp-block-code
    #!/bin/bash
    set -Eeuo pipefail
    export PATH=/usr/bin:/bin
    base="${HOME:?}/tareas"
    exec 9>"$base/prueba.lock"
    flock -n 9 || { echo "Se omitió una ejecución solapada" >&2; exit 1; }
    printf '%s usuario=%s ejecución correcta\n' "$(date -Is)" "$(id -un)"
    ```

Hazlo ejecutable y comprueba la salida manual:

    ```wp-block-code
    chmod 0700 "$HOME/tareas/prueba-cron"
    "$HOME/tareas/prueba-cron"
    ```

El bloqueo evita dos instancias simultáneas de este script. No coordina automáticamente
otros programas ni garantiza exclusión entre varios servidores.

## Programa una prueba de un minuto

En crontab -e agrega lo siguiente después de sustituir USUARIO por tu nombre real
y confirmar la ruta:

    ```wp-block-code
    SHELL=/bin/sh
    PATH=/usr/local/bin:/usr/bin:/bin
    * * * * * /home/USUARIO/tareas/prueba-cron >> /home/USUARIO/tareas/prueba.log 2>&1
    ```

La carpeta y el archivo de script deben ser accesibles por esa cuenta. La redirección
también necesita permisos de escritura. Espera un par de minutos y revisa:

    ```wp-block-code
    tail -n 10 "$HOME/tareas/prueba.log"
    crontab -l
    ```

Busca horas distintas y el usuario previsto. Después sustituye la frecuencia de 
prueba por la necesaria, por ejemplo 30 2 * * * para ejecución diaria a las 02:30.

Un log con fechas nuevas confirma que la prueba corrió. Para el trabajo real, registra
además su resultado y verifica el producto esperado, como un archivo válido o una
respuesta del sistema destino.

## Entorno, zona horaria y archivos del sistema

Cron no carga necesariamente tu sesión interactiva, alias, entorno virtual ni agente
SSH. Utiliza rutas explícitas y prepara credenciales con permisos limitados. Los
signos % en el comando tienen significado especial en esta implementación; para 
expresiones complejas, utiliza un script.

Comprueba la zona horaria que usa el daemon. Definir TZ dentro del comando puede
cambiar la hora que imprime un programa sin cambiar cuándo lo lanza cron. No asumas
soporte de CRON_TZ en todas las distribuciones.

Los cambios de hora y las tareas perdidas durante un apagado dependen de la implementación
y configuración. Si necesitas recuperación de ejecuciones o calendarios más expresivos,
evalúa un timer de systemd y sus opciones.

En /etc/cron.d y /etc/crontab existe un campo adicional para el usuario:

    ```wp-block-code
    30 2 * * * root /usr/local/sbin/backup-sitio
    ```

No copies ese campo root al crontab personal. Tampoco programes la misma tarea allí
y en /etc/cron.daily salvo que busques dos ejecuciones.

## Preguntas frecuentes

### ¿Cron envía siempre los errores por correo?

No. Necesita un transporte de correo operativo y una configuración que permita entregarlo.
Registra la salida y prueba cualquier canal de aviso que elijas.

### ¿Qué ocurre si la tarea dura más que su intervalo?

Cron puede iniciar otra instancia. Utiliza un bloqueo cuando el solapamiento sea
perjudicial y registra las ejecuciones omitidas.

### ¿Por qué funciona al ejecutarla a mano y falla en cron?

Suelen diferir usuario, directorio, PATH, variables y permisos. Reproduce el entorno,
registra el error y comprueba cada dependencia sin asumir que se carga tu sesión.

## En pocas palabras

Una tarea programada necesita horario, identidad, entorno y evidencia de ejecución.
Cron inicia procesos cuando corresponde; tu script debe controlar errores y evitar
solapamientos cuando puedan causar problemas.

## Conclusión

Prueba primero una tarea pequeña y visible bajo la cuenta definitiva. Después añade
el trabajo real, revisa su salida y documenta qué hacer si falla o no llega a ejecutarse.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/cron/crontab.5.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/util-linux/flock.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/cron/cron.8.en.html).

## Instalar Redis en Linux: acceso, memoria y persistencia

- Link: https://sergiocaballero.com/como-instalar-redis-linux/
- Published: 2026-10-17T06:52:42+00:00
- Author: sergio

Redis utiliza estructuras de datos en memoria y puede servir como caché, almacén
de sesiones y componente de otros servicios. Elegir su configuración depende de 
lo que sucedería si desaparecieran las claves o se rechazaran nuevas escrituras.

Esta guía utiliza el paquete de una distribución Ubuntu o Debian mantenida, con 
una aplicación local. No abre 6379 a internet ni presupone que todas las ramas y
modalidades de Redis tienen los mismos requisitos o licencia.

## Elige el origen del paquete

    ```wp-block-code
    sudo apt update
    apt-cache policy redis-server
    sudo apt install redis-server
    sudo systemctl enable --now redis-server
    redis-server --version
    redis-cli PING
    ```

Antes de añadir un repositorio externo, verifica qué versión requiere tu aplicación
y qué actualizaciones ofrece la distribución. Evita mezclar fuentes o reemplazar
una instalación existente sin respaldar su configuración y datos.

PONG confirma una respuesta del servidor. No demuestra que tus datos persistan, 
que un usuario tenga permisos adecuados o que la red esté restringida.

## Mantén una escucha local

Revisa /etc/redis/redis.conf y sus inclusiones. Para una práctica local, comprueba
estas directivas:

    ```wp-block-code
    bind 127.0.0.1 -::1
    protected-mode yes
    ```

Comprueba también interfaces efectivas con ss. El modo protegido es una defensa 
adicional, no un sustituto de firewall y autenticación.

Si una aplicación está en otra máquina o contenedor, loopback puede no representar
la misma red. Diseña una ruta privada con autenticación y protección del transporte.
No cambies bind a todas las interfaces solo para hacer desaparecer un error de conexión.

## Autentica sin publicar la contraseña

Para una práctica compatible con clientes que usan contraseña del usuario predeterminado,
sustituye el marcador en la configuración:

    ```wp-block-code
    requirepass SUSTITUYE_POR_UNA_CLAVE_UNICA
    ```

Guarda el archivo con acceso limitado al servicio y a administradores. En versiones
con ACL, define para producción usuarios y permisos de comandos y claves según la
aplicación; requirepass por sí solo no separa funciones.

Después de revisar el archivo:

    ```wp-block-code
    sudo systemctl restart redis-server
    sudo ss -ltnp '( sport = :6379 )'
    redis-cli --askpass PING
    ```

--askpass solicita la clave sin incluirla en el argumento del proceso. Sin autenticar,
una nueva conexión debería recibir el rechazo correspondiente. Los comandos de esta
sección asumen la cuenta predeterminada; con una ACL propia debes indicar también
el usuario.

## Haz una prueba de datos con vencimiento

    ```wp-block-code
    redis-cli --askpass SET practica:saludo "Redis disponible" EX 60
    redis-cli --askpass GET practica:saludo
    redis-cli --askpass TTL practica:saludo
    ```

La clave debe devolver el valor y un tiempo restante. Cuando venza, GET dejará de
encontrarla. Esta prueba no mide el rendimiento de tu aplicación ni verifica su 
tolerancia a fallos.

## Decide qué hacer cuando se agote la memoria

Un ejemplo de laboratorio, que debes dimensionar:

    ```wp-block-code
    maxmemory 256mb
    maxmemory-policy noeviction
    ```

Con noeviction, determinadas escrituras fallarán al alcanzar el límite, en vez de
expulsar claves para liberar espacio. La aplicación debe manejar esos errores.

Una caché reconstruible puede utilizar otra política de expulsión, como allkeys-
lru, después de evaluar el patrón de acceso. Aplicarla a sesiones o colas sin estudiar
su funcionamiento puede perder información necesaria.

maxmemory no equivale a un límite estricto de toda la RAM del proceso. Reserva margen
para estructuras internas, buffers y operaciones de persistencia; observa también
el consumo del sistema.

## Persistencia y respaldo cumplen funciones distintas

RDB guarda instantáneas y AOF registra operaciones con la política configurada. 
La pérdida posible de datos depende de cuándo se guarda o sincroniza y de cómo ocurre
el fallo.

Para estudiar AOF, revisa en la documentación de tu versión:

    ```wp-block-code
    appendonly yes
    appendfsync everysec
    ```

No actives o cambies persistencia en una base importante como un experimento. Identifica
archivos, espacio y procedimiento antes, y prueba recuperación en otra instancia.
Copiar solo un archivo elegido a ojo puede omitir partes del formato AOF actual.

La persistencia en el mismo servidor no protege de todas las averías o borrados.
Conserva copias consistentes fuera del equipo según el valor de los datos.

## Observa sin bloquear innecesariamente

    ```wp-block-code
    redis-cli --askpass INFO memory
    redis-cli --askpass INFO persistence
    redis-cli --askpass --scan --pattern 'practica:*'
    ```

SCAN recorre de forma incremental y sigue teniendo costo. Puede devolver duplicados
durante una iteración y no es una instantánea si cambian las claves. Evita KEYS *
como revisión rutinaria en una base grande.

Si Redis no arranca, revisa journalctl y el puerto ocupado. Identifica la instancia
antes de detener procesos; un pkill general puede apagar otro servicio válido.

## Preguntas frecuentes

### ¿Redis siempre pierde todo al reiniciar?

Depende de la persistencia configurada y del estado de sus archivos. No lo asumas
en ningún sentido: realiza una recuperación de prueba con tu configuración.

### ¿Una contraseña hace seguro un puerto público?

No. Restringe la red, protege el transporte y aplica permisos de usuarios y comandos.
La autenticación no cifra por sí misma la conexión.

### ¿Debo renombrar comandos para proteger la base?

Revisa las ACL y recomendaciones de la versión actual. Separar identidades y permisos
suele ofrecer un control más claro que mantener una lista de comandos renombrados.

## En pocas palabras

Redis necesita una política acorde con sus datos: acceso local o protegido, permisos
de comandos, memoria y recuperación. La configuración de una caché puede ser inadecuada
para sesiones, colas u otra información importante.

## Conclusión

Define qué puede perderse antes de ajustar memoria o persistencia. Prueba conexión
y recuperación con la configuración elegida y revisa consumo real, errores y disponibilidad
de las copias.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de redis.io](https://redis.io/docs/latest/operate/oss_and_stack/management/security/).

[Documentación de redis.io](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/).

[Documentación de redis.io](https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/).

[Documentación de redis.io](https://redis.io/docs/latest/develop/reference/eviction/).

[Documentación de redis.io](https://redis.io/docs/latest/commands/scan/).

[Documentación de redis.io](https://redis.io/docs/latest/develop/tools/cli/).

## Fail2ban en Linux: proteger SSH y verificar bloqueos

- Link: https://sergiocaballero.com/como-instalar-fail2ban-seguridad/
- Published: 2026-10-17T06:52:40+00:00
- Author: sergio

Fail2ban observa eventos de servicios y puede bloquear temporalmente direcciones
que cumplen un patrón de intentos fallidos. Ayuda a reducir ciertos abusos repetidos,
pero no sustituye actualizaciones, claves SSH, permisos ni controles de acceso.

Esta práctica utiliza Ubuntu o Debian con SSH registrado en el journal de systemd.
Si tu instalación escribe únicamente en archivos, necesitas otro backend y un logpath
real. No combines ambos modelos sin revisar qué está leyendo cada jail.

## Conserva una salida antes de tocar bloqueos

Mantén abierta una sesión administrativa y comprueba el acceso a la consola del 
proveedor. Si agregas una IP de confianza a ignoreip, utiliza una dirección que 
controles y verifica si cambia; no excluyas redes grandes solo por comodidad.

Confirma el puerto real y que existen eventos SSH:

    ```wp-block-code
    sudo /usr/sbin/sshd -T | grep '^port '
    sudo journalctl -u ssh --since '30 minutes ago'
    ```

El servicio puede llamarse sshd en otra distribución. Una consulta vacía no prueba
que no haya intentos: también puede indicar que estás revisando la unidad equivocada.

## Instala y crea una configuración pequeña

    ```wp-block-code
    sudo apt update
    sudo apt install fail2ban python3-systemd
    sudo nano /etc/fail2ban/jail.d/sshd.local
    ```

Guarda este ejemplo para SSH en 22:

    ```wp-block-code
    [sshd]
    enabled = true
    backend = systemd
    port = 22
    findtime = 10m
    maxretry = 5
    bantime = 10m
    ignoreip = 127.0.0.1/8 ::1
    ```

Cambia port si corresponde y añade una excepción administrativa solo cuando esté
justificada. El backend systemd usa el journal; no añadas un logpath de auth.log
a esta configuración.

No copies todo jail.conf a un archivo local. Un ajuste pequeño permite entender 
qué has cambiado y reduce la posibilidad de conservar valores antiguos durante una
actualización.

La acción de firewall se hereda de los paquetes y ajustes del sistema. Identifica
cuál se utilizará y si es compatible con tu entorno; forzar iptables en todas las
máquinas no resuelve esa comprobación.

## Valida y revisa el jail

    ```wp-block-code
    sudo fail2ban-client -t
    ```

Si la prueba no presenta errores, aplica:

    ```wp-block-code
    sudo systemctl enable --now fail2ban
    sudo systemctl restart fail2ban
    sudo fail2ban-client status
    sudo fail2ban-client status sshd
    sudo journalctl -u fail2ban --since '10 minutes ago'
    ```

La lista debe incluir sshd. Revisa fallos al abrir el journal, errores del filtro
y problemas al ejecutar las acciones. Un jail con cero eventos puede estar funcionando
sin intentos recientes o puede estar leyendo el origen incorrecto.

## Comprueba detección y acción por separado

Para evaluar coincidencias del filtro con los registros disponibles:

    ```wp-block-code
    sudo fail2ban-regex systemd-journal sshd
    ```

Revisa qué líneas coinciden y cuáles no. No necesitas generar una tormenta de intentos
para comprobarlo. En un laboratorio puedes producir unos pocos fallos controlados
desde otro cliente, sin utilizar tu única vía administrativa.

Una segunda prueba verifica la acción de bloqueo. La dirección siguiente pertenece
a un rango de documentación; no es tu IP ni demuestra una conexión real:

    ```wp-block-code
    sudo fail2ban-client set sshd banip 203.0.113.77
    sudo fail2ban-client status sshd
    sudo fail2ban-client set sshd unbanip 203.0.113.77
    ```

Comprueba además las reglas del firewall que usa la acción. Después de retirar el
ban, verifica que desapareció. Esto prueba el recorrido administrativo de la acción;
la detección automática y el bloqueo de un cliente real requieren la prueba separada
de laboratorio.

## Ajusta después de observar

Un umbral bajo puede bloquear usuarios que escriben mal una contraseña, especialmente
detrás de una salida compartida. Un periodo muy largo aumenta el costo de un falso
positivo. Decide valores a partir del servicio y revisa los registros.

Para Nginx o Apache, habilita únicamente jails cuyos filtros y rutas correspondan
a tu configuración. Varias peticiones a wp-login.php no demuestran por sí mismas
una autenticación fallida; un filtro demasiado amplio puede bloquear tráfico legítimo.

Si existe un proxy, CDN o contenedor, identifica qué dirección aparece en el registro
y qué tráfico alcanza la cadena de firewall. No confíes en cabeceras de IP enviadas
por cualquier cliente.

En un bloqueo accidental, entra por la vía de recuperación, revisa el jail y retira
el ban de la IP afectada. Corrige la causa en lugar de vaciar todas las reglas del
firewall.

## Preguntas frecuentes

### ¿Fail2ban impide todos los ataques por fuerza bruta?

No. Depende de eventos reconocibles y de acciones que alcancen el tráfico correspondiente.
Los ataques distribuidos y otros métodos requieren controles adicionales.

### ¿Por qué no existe /var/log/auth.log en mi servidor?

Algunas instalaciones usan el journal u otra configuración de registros. Identifica
el origen disponible y selecciona un backend compatible.

### ¿Puedo bloquear mi propia IP?

Sí. Una sesión abierta puede seguir funcionando o cortarse según la acción y las
reglas. Conserva una consola de recuperación y prueba con otra dirección controlada.

## En pocas palabras

Fail2ban conecta detección en registros con acciones de bloqueo. Debes comprobar
ambas partes y conservar una vía de recuperación; activar el servicio no demuestra
que un jail esté leyendo los eventos correctos.

## Conclusión

Empieza con un solo jail, umbrales moderados y una prueba reversible. Añade servicios
cuando puedas identificar sus registros, comprobar el filtro y validar el alcance
de la acción de red.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de github.com](https://github.com/fail2ban/fail2ban/wiki).

[Documentación de raw.githubusercontent.com](https://raw.githubusercontent.com/fail2ban/fail2ban/master/config/jail.conf).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/fail2ban/fail2ban-regex.1.en.html).

## Backups automáticos en Linux con restauración de prueba

- Link: https://sergiocaballero.com/como-crear-backup-automatico-linux/
- Published: 2026-10-17T06:52:38+00:00
- Author: sergio

Automatizar backups consiste en preparar una recuperación repetible, no solo en 
generar archivos de madrugada. Antes del script define cuánto dato puedes perder,
cuánto tiempo puedes tardar en recuperar y qué necesitas para reconstruir el servicio.

El ejemplo copia archivos estáticos de un sitio y configuración de Apache. No respalda
una base de datos en ejecución ni promete cifrado. Ajusta las rutas, prepara los
permisos y utiliza datos de práctica antes de incorporar información importante.

## Elige qué debe ser consistente

Los archivos que cambian durante tar pueden producir una copia incompleta o incoherente.
Para aplicaciones activas utiliza un procedimiento de pausa, snapshot coordinado
o exportación apropiado.

Una base MariaDB necesita una exportación o herramienta compatible con su motor 
y requisitos de recuperación. Copiar directamente su directorio de datos mientras
escribe no equivale a un respaldo consistente.

Anota también dependencias, versiones, secretos y procedimiento de recuperación.
Guarda los secretos con acceso restringido; no los incluyas en un documento público.

## Prepara un destino protegido

El script se ejecutará como root para leer la configuración y escribirá en un directorio
local privado. Comprueba capacidad antes:

    ```wp-block-code
    sudo install -d -m 0700 /var/backups/sitio
    df -h /var/backups/sitio
    sudo nano /usr/local/sbin/backup-sitio
    ```

Guarda el siguiente contenido. Las rutas var/www/ejemplo y etc/apache2 deben existir;
son relativas a / por el uso de -C.

    ```wp-block-code
    #!/bin/bash
    set -Eeuo pipefail
    umask 077
    export PATH=/usr/sbin:/usr/bin:/sbin:/bin

    destino=/var/backups/sitio
    exec 9>"$destino/.backup.lock"
    flock -n 9 || { echo "Ya existe un backup en curso" >&2; exit 1; }

    temporal=$(mktemp "$destino/.archivo.XXXXXX")
    trap 'rm -f -- "$temporal"' EXIT
    marca=$(date -u +%Y%m%dT%H%M%SZ)
    final="$destino/archivos-$marca-$$.tar.gz"

    tar -czf "$temporal" -C / var/www/ejemplo etc/apache2
    gzip -t "$temporal"
    tar -tzf "$temporal" >/dev/null
    mv -- "$temporal" "$final"
    (
      cd "$destino"
      sha256sum -- "${final##*/}" > "${final##*/}.sha256"
    )
    printf 'Backup completado: %s\n' "$final"
    ```

El nombre temporal evita anunciar como final una compresión fallida. set -o pipefail
ayuda a detectar fallos en tuberías que añadas más adelante. El bloqueo impide dos
ejecuciones simultáneas de este script.

La comprobación gzip y el listado tar detectan algunos problemas del archivo; no
prueban que la aplicación pueda recuperarse. Aquí no se borran respaldos antiguos
automáticamente.

## Haz una primera ejecución visible

    ```wp-block-code
    sudo chmod 0750 /usr/local/sbin/backup-sitio
    sudo /usr/local/sbin/backup-sitio
    sudo ls -lh /var/backups/sitio
    ```

Revisa el estado de salida, tamaño y fecha. Si falla por archivos modificados, no
cambies el script para ignorar cualquier error: corrige la coherencia del origen.

## Restaura en un directorio aislado

Utiliza el nombre real de la copia recién creada. Primero verifica su checksum desde
el directorio que contiene ambos archivos:

    ```wp-block-code
    sudo -i
    cd /var/backups/sitio
    sha256sum -c archivos-NOMBRE_REAL.tar.gz.sha256
    tar -tzf archivos-NOMBRE_REAL.tar.gz
    prueba=$(mktemp -d /var/tmp/restauracion-sitio.XXXXXX)
    tar --no-same-owner -xzf archivos-NOMBRE_REAL.tar.gz -C "$prueba"
    printf 'Revisa la restauración en %s\n' "$prueba"
    exit
    ```

No extraigas una copia no confiable como root. En esta práctica el archivo es propio,
sus rutas se han listado y el destino está vacío. Compara archivos importantes y
realiza una prueba del servicio en otro entorno antes de afirmar que puedes recuperarlo.

## Copia fuera del servidor y controla retención

Configura un destino rclone con una cuenta autorizada y permisos mínimos. Para ensayar
una copia, ajustando el nombre remoto:

    ```wp-block-code
    rclone copy /var/backups/sitio mi-remoto:backups/sitio --include 'archivos-*.tar.gz*' --dry-run
    ```

Ejecuta como una cuenta con permiso para leer el origen y usar esa configuración
rclone. Tras revisar, realiza la copia quitando --dry-run y comprueba el resultado
con rclone check o descargando y restaurando una versión.

copy no elimina archivos antiguos del destino como puede hacer sync. Aun así, un
atacante con las mismas credenciales podría modificar copias: considera versiones,
separación de cuentas o almacenamiento inmutable. El cifrado del destino depende
de su configuración; un tar.gz no cifra datos.

Programa el script con cron después de esta primera restauración y registra su salida.
Define retención por separado, preserva generaciones suficientes y elimina solo 
tras comprobar la copia externa y la política. La ausencia de errores en un log 
vacío no demuestra que una tarea se haya ejecutado.

## Preguntas frecuentes

### ¿Puedo guardar todo en el mismo disco del servidor?

Sirve como etapa local o recuperación rápida, pero una avería o compromiso del equipo
puede afectar también las copias. Mantén otra copia independiente.

### ¿El checksum confirma que los datos son correctos?

Detecta cambios respecto al archivo que lo generó. No demuestra coherencia de la
aplicación, ausencia de datos dañados en origen ni autenticidad si un atacante modifica
ambos archivos.

### ¿Por qué no se añade una contraseña al script de la base de datos?

Las credenciales incrustadas se filtran con facilidad. Usa el mecanismo de autenticación
o archivo protegido correspondiente y revisa los permisos de la identidad que ejecutará
el backup.

## En pocas palabras

Una copia útil necesita origen coherente, errores visibles, destino protegido y 
una restauración comprobada. El archivo local es una primera etapa; no sustituye
almacenamiento externo ni una política de retención.

## Conclusión

Automatiza primero un respaldo que puedas recuperar manualmente. Después incorpora
copia externa, supervisión y retención, comprobando que cada cambio conserva una
ruta de restauración.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/tar/tar.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/bash/bash.1.en.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/util-linux/flock.1.en.html).

[Documentación de rclone.org](https://rclone.org/commands/rclone_copy/).

[Documentación de rclone.org](https://rclone.org/commands/rclone_check/).

## Certbot en Linux: HTTPS y renovación comprobable

- Link: https://sergiocaballero.com/como-instalar-certbot-ssl/
- Published: 2026-10-17T06:52:36+00:00
- Author: sergio

Certbot automatiza la solicitud de certificados TLS y puede configurar Apache o 
Nginx para servir HTTPS. El certificado acredita el dominio validado; no corrige
por sí mismo permisos, vulnerabilidades de una aplicación o configuraciones de acceso.

Esta guía se centra en el ciclo operativo del certificado en Ubuntu o Debian. Se
utiliza el paquete de la distribución cuando está mantenido para esa versión. Certbot
también documenta otros métodos, como snap: elige uno y evita mezclar instalaciones.

## Prepara dominio y servidor

Para el desafío HTTP-01 habitual necesitas que cada nombre solicitado resuelva hacia
el servidor que atenderá la validación y que el puerto 80 sea accesible desde internet.

Revisa registros A y AAAA. Un IPv6 incorrecto puede afectar la validación aunque
IPv4 funcione. Si utilizas un CDN o balanceador, identifica dónde termina TLS y 
quién recibirá la petición del desafío.

Solicita solo nombres que controles y que estén configurados. Añadir www por costumbre
puede hacer fallar una solicitud si ese nombre no resuelve.

## Instala un solo plugin

Para Apache:

    ```wp-block-code
    sudo apt update
    apt-cache policy certbot python3-certbot-apache
    sudo apt install certbot python3-certbot-apache
    sudo apache2ctl configtest
    ```

Para Nginx, como alternativa:

    ```wp-block-code
    sudo apt update
    apt-cache policy certbot python3-certbot-nginx
    sudo apt install certbot python3-certbot-nginx
    sudo nginx -t
    ```

No hace falta instalar ambos servidores. Confirma la versión con certbot --version
y conserva una copia de sus archivos de configuración antes de permitir modificaciones.

## Emite e instala el certificado

Con el virtual host HTTP funcionando en tu dominio, ejecuta solo el comando correspondiente:

    ```wp-block-code
    sudo certbot --apache -d ejemplo.com
    ```

    ```wp-block-code
    sudo certbot --nginx -d ejemplo.com
    ```

Sustituye ejemplo.com. Revisa las condiciones y decisiones que presenta tu versión.
No bases la supervisión en supuestos avisos de correo: necesitas comprobar el certificado
y su fecha de expiración desde tu infraestructura.

Los plugins pueden modificar la configuración web. Revisa los cambios y valida de
nuevo la sintaxis. Si el servicio está detrás de otro terminador TLS, instalar aquí
un certificado no cambia necesariamente lo que reciben los visitantes.

## Comprueba la respuesta pública

    ```wp-block-code
    curl -I https://ejemplo.com/
    curl -I http://ejemplo.com/
    sudo certbot certificates
    ```

Comprueba que HTTPS valida sin omitir errores y que HTTP se redirige según la política
elegida. Si necesitas inspeccionar el certificado servido:

    ```wp-block-code
    openssl s_client -connect ejemplo.com:443 -servername ejemplo.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates
    ```

Este último comando muestra datos del certificado; no reemplaza una validación completa
de confianza o una prueba de la aplicación.

## Verifica cómo se renovará

    ```wp-block-code
    sudo certbot renew --dry-run
    systemctl list-timers --all
    ```

El ensayo de renovación utiliza el entorno de pruebas correspondiente y comprueba
la posibilidad de renovar. No equivale a desplegar un certificado nuevo de producción.

Localiza el timer o cron instalado por tu método y revisa su estado y registros.
No asumas que todos los sistemas utilizan una unidad llamada certbot.timer. Evita
crear otra tarea si ya existe una programación funcional.

Después de una renovación, el proceso que sirve TLS debe cargar el certificado actualizado.
Los plugins suelen integrar esta operación; con certonly y una instalación manual
tendrás que definir y probar un deploy hook adecuado.

## Cuándo cambia el método de validación

Standalone necesita un puerto disponible para levantar su servidor temporal. Detener
Apache cada vez añade interrupciones y exige automatizar ese ciclo; considera el
plugin o webroot cuando corresponda.

DNS-01 es útil para certificados comodín y otros escenarios. Requiere publicar registros
TXT y, para automatizar, proteger las credenciales del proveedor DNS con permisos
limitados. No abras puertos nuevos si has elegido un método que no los necesita.

## Retirada y recuperación

Eliminar una entrada con certbot delete no equivale a revocar el certificado. Antes
de retirarla, quita las referencias del servidor web o podrías impedir su arranque.

Si una clave privada se ha comprometido, sigue el procedimiento de revocación y 
emite una nueva clave y certificado. No fuerces renovaciones repetidas para diagnosticar
un problema: utiliza pruebas, registros y documentación de los límites del servicio.

## Preguntas frecuentes

### ¿El certificado siempre dura 90 días?

La duración depende del perfil y de las políticas vigentes. Comprueba las fechas
reales y permite que el cliente mantenido determine cuándo corresponde renovar.

### ¿Necesito mantener abierto el puerto 80 después de activar HTTPS?

Si renuevas mediante HTTP-01, la validación debe seguir siendo accesible en 80. 
DNS-01 utiliza otro mecanismo y no requiere ese puerto.

### ¿Por qué renew funciona pero el navegador muestra un certificado viejo?

Puede faltar una recarga o el certificado público puede estar servido por un proxy,
CDN o balanceador distinto. Comprueba el punto que termina TLS.

## En pocas palabras

Certbot obtiene y administra certificados, pero la continuidad depende de DNS, validación
de dominio, programación y recarga del servicio. Una emisión inicial correcta no
demuestra que todas las renovaciones futuras funcionarán.

## Conclusión

Guarda el método de instalación y validación elegido. Comprueba la renovación después
de cambiar DNS, firewall, proxy o servidor web y supervisa el certificado que realmente
recibe el visitante.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de certbot.eff.org](https://certbot.eff.org/instructions?os=snap&ws=apache).

[Documentación de eff-certbot.readthedocs.io](https://eff-certbot.readthedocs.io/en/stable/using.html).

[Documentación de letsencrypt.org](https://letsencrypt.org/docs/challenge-types/).

## phpMyAdmin en Ubuntu con acceso por túnel SSH

- Link: https://sergiocaballero.com/como-instalar-phpmyadmin-ubuntu/
- Published: 2026-10-17T06:52:34+00:00
- Author: sergio

phpMyAdmin permite administrar MySQL o MariaDB desde un navegador. Su comodidad 
también concentra operaciones sensibles: consultas, exportaciones, cambios de tablas
y gestión de permisos, según la cuenta utilizada.

Esta guía elige un único escenario: Ubuntu con Apache, PHP mediante módulo y base
de datos local, en una máquina de práctica. El panel escuchará en loopback y se 
abrirá mediante SSH. En un servidor existente con PHP-FPM debes conservar su integración
y adaptar el manejador; no mezcles ambos por copiar comandos.

## Comprueba los requisitos

Necesitas acceso SSH con una cuenta administrativa, Apache y una base de datos funcional.
Crea antes un usuario de base con permisos limitados al proyecto.

El root autenticado mediante socket no suele ser una cuenta adecuada para entrar
desde PHP. No cambies esa protección para conseguir que el formulario lo acepte.

    ```wp-block-code
    sudo apt update
    apt-cache policy phpmyadmin
    sudo apt install apache2 libapache2-mod-php php-mysql php-mbstring php-zip php-curl phpmyadmin
    ```

Durante la configuración del paquete, deja sin seleccionar servidores web para la
integración automática: se definirá un sitio dedicado. La pregunta sobre dbconfig-
common se refiere al almacenamiento de funciones adicionales de phpMyAdmin; sigue
la documentación del paquete para habilitarlo o prescinde de esas funciones en la
práctica.

## Revisa que no exista otra publicación

Antes de habilitar el panel, inspecciona Apache y su configuración de phpMyAdmin:

    ```wp-block-code
    sudo apache2ctl -S
    sudo apache2ctl -M
    sudo ls -l /etc/apache2/conf-enabled/
    ```

Si ya hay un alias global de phpMyAdmin, revísalo y retíralo antes de continuar.
El objetivo es evitar una segunda ruta de acceso desde un sitio público. Cambiar
el nombre del directorio no sustituye esta revisión.

## Crea una escucha privada y un sitio

Edita /etc/apache2/conf-available/pma-local.conf y guarda:

    ```wp-block-code
    Listen 127.0.0.1:8090

    <Directory /usr/share/phpmyadmin>
        Options -Indexes
        AllowOverride None
        Require local
    </Directory>

    <VirtualHost 127.0.0.1:8090>
        ServerName localhost
        DocumentRoot /usr/share/phpmyadmin
        DirectoryIndex index.php
        ErrorLog ${APACHE_LOG_DIR}/pma-local-error.log
        CustomLog ${APACHE_LOG_DIR}/pma-local-access.log combined
    </VirtualHost>
    ```

Este fragmento asume que 8090 está libre y que el módulo PHP ya maneja .php. La 
restricción global del directorio ayuda a cubrir accesos mediante alias, pero otra
configuración más específica puede modificar permisos: revisa el resultado completo.

    ```wp-block-code
    sudo a2enconf pma-local
    sudo apache2ctl configtest
    ```

Si la sintaxis es correcta, aplica el cambio:

    ```wp-block-code
    sudo systemctl restart apache2
    sudo ss -ltnp '( sport = :8090 )'
    curl -I http://127.0.0.1:8090/
    ```

El reinicio puede interrumpir peticiones; se utiliza aquí porque la instalación 
del módulo puede requerirlo. La escucha debe mostrar 127.0.0.1, no 0.0.0.0 ni una
dirección pública.

## Abre el túnel desde tu computadora

Sustituye usuario y servidor por los datos de tu acceso SSH. El siguiente comando
se ejecuta en tu computadora, no dentro del servidor:

    ```wp-block-code
    ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:8090:127.0.0.1:8090 usuario@servidor
    ```

Mientras la conexión siga abierta, visita http://127.0.0.1:8090 en ese equipo. El
tramo remoto viaja cifrado mediante SSH. Esto no justifica publicar HTTP para administradores
en internet ni colocar un proxy público delante del puerto local.

Accede con la cuenta del proyecto y comprueba que solo ve o modifica los recursos
autorizados. Una importación de práctica debe usar datos desechables.

## Verifica también el rechazo

Desde un equipo exterior, el puerto 8090 del servidor no debe ofrecer el panel. 
Revisa además que los sitios públicos no expongan /phpmyadmin ni antiguos enlaces
simbólicos.

Si aparece código PHP en lugar del formulario, deja de utilizar la ruta hasta corregir
el manejador. Si recibes 403 local, revisa reglas Require y registros; si hay un
error de conexión a MySQL, distingue credenciales, socket y servicio.

Las cargas grandes están sujetas a límites de PHP y tiempos de ejecución. Para respaldos
importantes, utiliza herramientas de línea de comandos y una prueba de restauración,
en vez de depender únicamente de la descarga del navegador.

## Preguntas frecuentes

### ¿Ocultar la URL protege phpMyAdmin?

Puede reducir hallazgos casuales, pero no controla quién entra. Mantén restricciones
de red, actualizaciones y permisos de base de datos adecuados.

### ¿Por qué no puedo iniciar sesión como root?

Puede estar configurado para autenticarse por socket mediante el usuario del sistema.
Usa una cuenta específica para el proyecto en lugar de debilitar ese mecanismo.

### ¿Puedo usar la misma configuración con Nginx?

No directamente. Nginx requiere un bloque propio y PHP-FPM con su socket real. Conserva
el mismo objetivo de acceso privado y verifica su configuración por separado.

## En pocas palabras

El panel utiliza los permisos de la cuenta de base de datos y necesita un acceso
de red deliberado. Un puerto en loopback y un túnel SSH permiten una práctica sin
abrir la interfaz a internet.

## Conclusión

Valida primero el manejador PHP, la escucha local y la cuenta limitada. Mantén documentado
cómo accedes al panel y revisa que no aparezca por otro alias o virtual host público.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.phpmyadmin.net](https://docs.phpmyadmin.net/en/latest/setup.html).

[Documentación de httpd.apache.org](https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html).

[Documentación de manpages.debian.org](https://manpages.debian.org/bookworm/openssh-client/ssh.1.en.html).

## Instalar MariaDB en Linux: usuarios y respaldo

- Link: https://sergiocaballero.com/como-instalar-mariadb-linux/
- Published: 2026-10-17T06:52:33+00:00
- Author: sergio

MariaDB es un sistema de bases de datos relacional que comparte origen y muchas 
interfaces con MySQL. Esa cercanía facilita ciertos proyectos y migraciones, pero
no garantiza que todas las versiones, consultas, collations y herramientas sean 
intercambiables.

El recorrido siguiente utiliza los repositorios de una versión de Ubuntu o Debian
con soporte. Mantener ese origen simplifica las actualizaciones del sistema. Si 
necesitas otra rama, revisa primero el soporte del proveedor, la distribución y 
el procedimiento de actualización.

## Instala desde el repositorio elegido

    ```wp-block-code
    sudo apt update
    apt-cache policy mariadb-server
    sudo apt install mariadb-server mariadb-client
    sudo systemctl enable --now mariadb
    systemctl is-active mariadb
    mariadb --version
    ```

apt-cache permite identificar la versión candidata y de dónde llegará. Evita mezclar
paquetes MySQL y MariaDB o añadir repositorios sobre una instalación existente sin
un plan de migración.

Conserva una copia de la configuración antes de modificarla. El servicio puede funcionar
con valores iniciales adecuados para una práctica, sin aplicar ajustes de rendimiento
todavía.

## Entiende cómo entra el administrador

En muchas instalaciones de Debian y Ubuntu, el administrador de la base puede autenticarse
mediante el usuario root del sistema y el socket local:

    ```wp-block-code
    sudo mariadb --protocol=socket
    ```

Dentro del cliente, identifica versión y cuenta efectiva:

    ```wp-block-code
    SELECT VERSION(), CURRENT_USER();
    SHOW CREATE USER 'root'@'localhost';
    ```

Que este acceso no pida una segunda contraseña no significa que cualquiera pueda
entrar como administrador. Depende de los permisos del sistema y del mecanismo configurado.

mariadb-secure-installation puede ayudar a revisar cuentas anónimas, acceso remoto
de root y la base de prueba. Sus preguntas varían por versión. Lee cada cambio y
evita sustituir una autenticación por socket que ya responde a tu política solo 
para seguir una receta.

## Crea una base y una cuenta para la aplicación

En el cliente administrativo, usa una contraseña única en lugar del marcador:

    ```wp-block-code
    CREATE DATABASE proyecto
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

    CREATE USER 'app_proyecto'@'localhost'
      IDENTIFIED BY 'SUSTITUYE_POR_UNA_CLAVE_UNICA';

    GRANT SELECT, INSERT, UPDATE, DELETE
      ON proyecto.* TO 'app_proyecto'@'localhost';

    USE proyecto;
    CREATE TABLE comprobacion (
      id INT PRIMARY KEY,
      mensaje VARCHAR(100) NOT NULL
    );
    SHOW GRANTS FOR 'app_proyecto'@'localhost';
    ```

Estos permisos cubren operaciones de datos en una aplicación sencilla. Un instalador
que crea tablas requiere privilegios distintos; utiliza una identidad de despliegue
y retira sus permisos cuando termine. CREATE USER y GRANT no necesitan un FLUSH 
PRIVILEGES posterior.

Sal del administrador y prueba la cuenta:

    ```wp-block-code
    mariadb --protocol=socket -u app_proyecto -p proyecto
    ```

    ```wp-block-code
    INSERT INTO comprobacion VALUES (1, 'Conexión correcta');
    SELECT * FROM comprobacion;
    ```

La contraseña se introduce cuando la solicita el cliente, sin añadirla como argumento
de shell.

## Limita la conectividad

Si la aplicación vive en la misma máquina, usa el socket o una escucha local según
su conector. Comprueba la configuración efectiva:

    ```wp-block-code
    sudo ss -ltnp '( sport = :3306 )'
    ```

No abras 3306 a internet para resolver un error de autenticación. Una conexión remota
exige reglas de red, transporte protegido y una cuenta cuyo componente Host corresponda
al origen autorizado. localhost y una conexión TCP no deben tratarse como equivalentes
sin revisar el comportamiento del conector.

## Genera un respaldo y restaura aparte

Para la tabla InnoDB de esta práctica, el administrador local puede exportar así
desde una shell Bash:

    ```wp-block-code
    umask 077
    sudo mariadb-dump --single-transaction proyecto > proyecto.sql
    test -s proyecto.sql
    ```

La opción permite una vista consistente de tablas transaccionales, pero no resuelve
cambios DDL concurrentes ni todas las tablas no transaccionales. Una copia completa
del servicio también debe contemplar usuarios, rutinas, eventos y configuración 
según el objetivo de recuperación.

Crea un destino de prueba vacío con un nombre distinto y restaura allí:

    ```wp-block-code
    sudo mariadb -e "CREATE DATABASE proyecto_restaurado CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
    sudo mariadb proyecto_restaurado < proyecto.sql
    sudo mariadb proyecto_restaurado -e "SELECT * FROM comprobacion"
    ```

El archivo no incluye CREATE DATABASE porque se exportó una base sin --databases.
No sobrescribas producción para comprobarlo. Compara contenido y comportamiento 
de la aplicación, además de comprobar que el comando terminó correctamente.

## Rendimiento y compatibilidad con criterio

Antes de aumentar buffers o conexiones, mide memoria disponible, consultas y carga.
Un servidor que también ejecuta PHP necesita reservar recursos para esos procesos.
No existe un porcentaje de RAM que sirva para todos los equipos.

Para migrar desde MySQL, prepara una restauración aislada y pruebas de consultas,
caracteres, autenticación y funciones usadas por la aplicación. El hecho de que 
un cliente logre conectarse no demuestra compatibilidad completa.

## Preguntas frecuentes

### ¿Puedo usar root en la aplicación?

Es preferible una cuenta específica con los permisos necesarios. Separarla facilita
revocar acceso y reduce el alcance de un fallo de la aplicación.

### ¿Debo instalar siempre la versión más reciente de MariaDB?

Elige una rama mantenida que sea compatible con tu sistema y aplicación. Cambiar
de repositorio requiere revisar soporte y actualización, no solo comparar números.

### ¿Un archivo SQL que ocupa espacio demuestra que el respaldo sirve?

No. Comprueba el estado de salida del exportador y realiza una restauración en un
destino aislado, con consultas y validaciones del contenido esperado.

## En pocas palabras

MariaDB requiere algo más que instalar un paquete: autenticación entendida, privilegios
ajustados, conectividad prevista y una copia restaurable. La compatibilidad con 
MySQL debe comprobarse en cada aplicación.

## Conclusión

Empieza con una base de práctica y un usuario limitado. Comprueba consultas y restauración
antes de migrar datos reales o modificar memoria, conexiones y métodos de autenticación.

Para continuar, revisa [Cómo instalar Ubuntu desde una USB: paso a paso](https://sergiocaballero.com/instalar-ubuntu-desde-una-usb/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de mariadb.com](https://mariadb.com/docs/server/server-management/install-and-upgrade-mariadb/installing-mariadb/binary-packages/installing-mariadb-deb-files).

[Documentación de mariadb.com](https://mariadb.com/docs/server/security/user-account-management/authentication-from-mariadb-10-4).

[Documentación de mariadb.com](https://mariadb.com/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump).

## Istio en Kubernetes: prueba tráfico y mTLS con cuidado

- Link: https://sergiocaballero.com/como-instalar-istio-kubernetes/
- Published: 2026-10-17T06:52:31+00:00
- Author: sergio

Istio incorpora funciones de tráfico, identidad y observabilidad para servicios 
en Kubernetes. No es una capa que convenga instalar por defecto en cualquier clúster.
Primero define qué problema resolverás y cómo comprobarás el resultado.

Esta guía utiliza un laboratorio con modo sidecar. Istio también ofrece otros diseños,
como ambient, con requisitos y procedimientos propios; no mezcles instrucciones 
de ambos.

## Comprueba compatibilidad y recursos

Consulta la matriz de Kubernetes e Istio y selecciona una versión mantenida. Reserva
capacidad para el plano de control y proxies.

Instala istioctl desde la release oficial de tu arquitectura y verifica su distribución.
No copies un script de descarga esperando que siempre produzca los mismos archivos.

    ```wp-block-code
    istioctl version --remote=false
    kubectl config current-context
    kubectl get nodes
    ```

## Instala un perfil de laboratorio

Revisa los perfiles disponibles para la versión elegida. Un perfil demo facilita
una práctica, pero no debe presentarse como configuración de producción:

    ```wp-block-code
    istioctl install --set profile=demo
    kubectl -n istio-system get pods
    ```

Lee el resumen y sus requisitos antes de confirmar. Si no tienes recursos suficientes,
corrige el diseño del laboratorio en vez de ignorar estados pendientes.

## Namespace y proxies

    ```wp-block-code
    kubectl create namespace mesh-lab
    kubectl label namespace mesh-lab istio-injection=enabled
    ```

La inyección afecta la creación de pods según la configuración. Una etiqueta añadida
no significa que todos los pods existentes ya tengan proxy.

Despliega una aplicación de prueba y comprueba contenedores y estado. Si necesitas
recrear cargas, hazlo dentro del laboratorio y conserva sus datos.

## Verifica tráfico antes de aplicar restricciones

Comprueba que una petición permitida llega al servicio y observa rutas, logs y configuración
del proxy:

    ```wp-block-code
    istioctl proxy-status
    kubectl -n mesh-lab get pods
    ```

Un estado sincronizado ayuda al diagnóstico, pero no demuestra por sí solo que todas
las comunicaciones estén cifradas o autorizadas.

## Exigir mTLS con un alcance claro

Una política de referencia para el namespace:

    ```wp-block-code
    apiVersion: security.istio.io/v1
    kind: PeerAuthentication
    metadata:
      name: exigir-mtls
      namespace: mesh-lab
    spec:
      mtls:
        mode: STRICT
    ```

Antes de aplicarla, comprueba que los clientes pertinentes puedan utilizar mTLS 
según el diseño. Una carga fuera de ese contexto puede perder acceso.

mTLS autentica y cifra el transporte entre componentes compatibles; no reemplaza
autorización de aplicación ni decide por sí solo qué usuario puede realizar una 
operación.

## Rutas y observabilidad

Si añades reglas de enrutamiento, prueba host, puerto y versión de destino. Una 
configuración aceptada por Kubernetes puede seguir describiendo una ruta que no 
recibe tráfico.

Evita instalar todos los addons sin una pregunta de observación. Cada componente
consume recursos y añade acceso y mantenimiento.

## Retirada y mantenimiento

Planifica actualización de plano de control y proxies conforme a la versión. Documenta
cómo retirar políticas y cargas del laboratorio sin afectar servicios compartidos.

No borres namespaces o componentes de una mesh administrada por otra persona. La
retirada debe respetar dependencias y datos.

## Preguntas frecuentes

### ¿Activar Istio garantiza seguridad de la aplicación?

No. Añade mecanismos que debes configurar y probar; vulnerabilidades, autorización
y datos siguen requiriendo controles.

### ¿Etiquetar un namespace modifica inmediatamente todos sus pods?

No debes asumirlo. Revisa cómo se crean o recrean las cargas y qué proxies están
realmente presentes.

### ¿Puedo aplicar STRICT a todo el clúster desde el primer día?

No es una recomendación general. Evalúa clientes, compatibilidad y efectos en un
alcance controlado antes de ampliar.

## En pocas palabras

Istio añade capacidades de tráfico y seguridad entre servicios, con requisitos de
compatibilidad y operación. Exigir mTLS modifica quién puede comunicarse y debe 
probarse dentro de un alcance controlado.

## Conclusión

Mantén el laboratorio pequeño, documenta rutas y verifica identidad antes de ampliar
políticas. Evalúa si la complejidad de una mesh responde a una necesidad real de
tu aplicación.

Para continuar, revisa [Instalar Kubernetes en Ubuntu desde cero: guía completa](https://sergiocaballero.com/como-instalar-kubernetes-en-ubuntu/)
y [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/).

## Fuentes y documentación

[Documentación de istio.io](https://istio.io/latest/docs/setup/getting-started/).

[Documentación de istio.io](https://istio.io/latest/docs/tasks/security/authentication/mtls-migration/).

## Docker Compose en Debian: instalación y proyecto de prueba

- Link: https://sergiocaballero.com/como-instalar-docker-compose-debian/
- Published: 2026-10-17T06:52:29+00:00
- Author: sergio

En Debian puedes instalar Docker Engine y el plugin Compose desde el repositorio
oficial compatible con tu distribución. No copies la URL de Ubuntu cambiando únicamente
un nombre de versión: el repositorio debe corresponder al sistema.

Consulta versiones y arquitecturas soportadas antes de iniciar. Si ya hay contenedores
o paquetes de runtime, revisa dependencias y datos antes de reemplazar componentes.

## Identifica Debian y arquitectura

    ```wp-block-code
    cat /etc/os-release
    dpkg --print-architecture
    dpkg -l | grep -E 'docker|containerd|runc'
    ```

En derivados, VERSION_CODENAME puede no ser el codename Debian que necesita el repositorio.
Utiliza instrucciones específicas de la distribución.

## Añade clave y repositorio

En una instalación Debian soportada:

    ```wp-block-code
    sudo apt update
    sudo apt install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg \
      -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    . /etc/os-release
    sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
    Types: deb
    URIs: https://download.docker.com/linux/debian
    Suites: $VERSION_CODENAME
    Components: stable
    Architectures: $(dpkg --print-architecture)
    Signed-By: /etc/apt/keyrings/docker.asc
    EOF
    ```

Revisa el archivo y no ignores errores de firma. La documentación oficial enumera
paquetes incompatibles; elimínalos solo después de comprobar que no sostienen otra
plataforma.

## Instala y verifica

    ```wp-block-code
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io \
      docker-buildx-plugin docker-compose-plugin
    sudo docker version
    sudo docker compose version
    sudo docker run --rm hello-world
    ```

Los permisos del daemon requieren una decisión. Añadir usuarios al grupo docker 
concede acceso sensible; cambiar el socket a escritura global no es una reparación
aceptable.

## Primer Compose local

En una carpeta nueva, guarda compose.yaml:

    ```wp-block-code
    services:
      web:
        image: nginx:stable-alpine
        ports:
          - "127.0.0.1:8080:80"
    ```

Valida e inicia:

    ```wp-block-code
    sudo docker compose config --quiet
    sudo docker compose up -d
    curl -I http://127.0.0.1:8080
    sudo docker compose logs --tail 20
    ```

La imagen sigue una etiqueta que puede cambiar. Registra versión o digest si necesitas
reproducir la práctica.

## Detener y mantener

stop conserva contenedores; down retira recursos del proyecto según su configuración.
La opción -v elimina volúmenes y no debe copiarse como limpieza automática de aplicaciones
con datos.

Documenta nombre y carpeta del proyecto y mantén paquetes e imágenes. Actualizar
el motor no actualiza automáticamente las aplicaciones.

## Errores de origen y versión

Si apt no encuentra el paquete, revisa codename, archivo del repositorio y resultado
de apt update. No añadas varios repositorios de distribuciones distintas hasta que
alguno responda.

Si Compose no aparece, comprueba el plugin y utiliza docker compose, con espacio.
Un ejecutable legado puede pertenecer a otra instalación.

## Qué registrar para reproducir la práctica

Conserva versión de Debian, arquitectura, origen de paquetes y salida de versión
del motor y el plugin. Si el proyecto usa un volumen, identifica también su nombre
real y cómo se respalda. Esa información permite distinguir un cambio de distribución
de un problema del archivo Compose.

Antes de actualizar, revisa qué servicios están activos y prueba la recreación en
una copia. No utilices una limpieza global de Docker para resolver un error de un
único proyecto.

## Preguntas frecuentes

### ¿Puedo usar el repositorio Ubuntu en Debian?

No como procedimiento general. Utiliza el origen y versiones que indique Docker 
para Debian.

### ¿Debo ejecutar docker-compose?

Esta guía utiliza el plugin docker compose. Revisa instalaciones antiguas antes 
de mezclar ambos comandos.

### ¿La configuración local ya es una web pública?

No. El puerto está ligado a loopback y faltan decisiones de dominio, TLS, acceso
y mantenimiento.

## En pocas palabras

Debian y Ubuntu tienen procedimientos parecidos, pero no comparten necesariamente
repositorios ni codenames. El plugin Compose debe instalarse desde un origen compatible
con el motor elegido.

## Conclusión

Conserva el origen de paquetes y verifica qué recursos crea cada proyecto. Antes
de añadir bases de datos, aprende a mantener volúmenes y preparar una recuperación.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.docker.com](https://docs.docker.com/engine/install/debian/).

[Documentación de docs.docker.com](https://docs.docker.com/compose/install/linux/).

## Almacenamiento Kubernetes: PVC y datos que sobreviven al pod

- Link: https://sergiocaballero.com/como-configurar-almacenamiento-kubernetes/
- Published: 2026-10-17T06:52:27+00:00
- Author: sergio

Los volúmenes persistentes separan determinados datos del ciclo de vida de un pod.
En Kubernetes, un PVC solicita almacenamiento y una StorageClass puede definir cómo
se aprovisiona. No todos los clústeres tienen las mismas clases ni la misma disponibilidad.

Este ejemplo utiliza PostgreSQL 16 en un namespace de práctica y requiere una StorageClass
predeterminada funcional. Revisa contexto antes de aplicar.

## Comprueba el almacenamiento disponible

    ```wp-block-code
    kubectl config current-context
    kubectl get storageclass
    kubectl get pv
    kubectl create namespace datos-lab
    ```

No copies storageClassName: standard suponiendo que existe en cualquier plataforma.
Si no hay clase predeterminada, selecciona una compatible y añade su nombre a la
solicitud.

## Crea un secreto de prueba

    ```wp-block-code
    umask 077
    openssl rand -hex 24 | tr -d '\n' > password-lab.txt
    kubectl -n datos-lab create secret generic postgres-lab \
      --from-file=password=password-lab.txt
    ```

Protege y retira el archivo local según tu procedimiento. Un Secret Kubernetes no
debe considerarse cifrado y protegido frente a todos los administradores solo por
su nombre; revisa permisos y almacenamiento del clúster.

## Servicio y StatefulSet

    ```wp-block-code
    apiVersion: v1
    kind: Service
    metadata:
      name: postgres-lab
      namespace: datos-lab
    spec:
      clusterIP: None
      selector:
        app: postgres-lab
      ports:
        - port: 5432
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: postgres-lab
      namespace: datos-lab
    spec:
      serviceName: postgres-lab
      replicas: 1
      selector:
        matchLabels:
          app: postgres-lab
      template:
        metadata:
          labels:
            app: postgres-lab
        spec:
          containers:
            - name: postgres
              image: postgres:16
              env:
                - name: POSTGRES_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: postgres-lab
                      key: password
              ports:
                - containerPort: 5432
              volumeMounts:
                - name: datos
                  mountPath: /var/lib/postgresql/data
      volumeClaimTemplates:
        - metadata:
            name: datos
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 2Gi
    ```

La clase, tamaño, permisos y restricciones del proveedor deben revisarse. La imagen
y ruta corresponden a la familia elegida; no cambies de versión mayor sin consultar
su procedimiento.

## Comprueba PVC y datos

    ```wp-block-code
    kubectl -n datos-lab get pods,pvc
    kubectl -n datos-lab describe pvc datos-postgres-lab-0
    kubectl -n datos-lab logs postgres-lab-0
    ```

Crea datos ficticios con un cliente autorizado y verifica su lectura. Después realiza
un reinicio controlado y vuelve a consultar. El pod nuevo debe utilizar el almacenamiento
esperado.

## Acceso y disponibilidad

ReadWriteOnce describe una condición de montaje según el almacenamiento; no significa“
un único proceso puede escribir” ni crea replicación de base de datos.

Un StatefulSet con una réplica sigue teniendo limitaciones ante fallos. La identidad
estable no configura automáticamente replicación, failover o copias.

## Borrado y recuperación

Revisa reclaimPolicy, política de retención de PVC y recursos asociados antes de
eliminar. El efecto puede depender del controlador y de la configuración.

No uses borrar namespace como limpieza rutinaria de una base con datos importantes.
Conserva copia y prueba restauración en otro entorno.

## Revisa el efecto de una reubicación

Una prueba útil es identificar a qué nodo y zona está ligado el volumen. Algunos
tipos de almacenamiento no pueden montarse inmediatamente desde cualquier ubicación.
Si el pod cambia de nodo y queda esperando, consulta eventos y restricciones del
proveedor antes de crear otro volumen vacío.

Tampoco aumentes replicas de esta base suponiendo que obtendrás una copia sincronizada:
cada instancia necesita un diseño de replicación y acceso a datos compatible. La
identidad de StatefulSet organiza recursos, pero no implementa el protocolo de PostgreSQL.

## Preguntas frecuentes

### ¿Un volumen persistente es un backup?

No. Puede conservarse entre pods y aun así perderse por borrado, corrupción o fallo
del almacenamiento.

### ¿Por qué el PVC está Pending?

Puede faltar una clase, capacidad, permisos o un provisionador funcional. Consulta
eventos antes de cambiar el YAML a ciegas.

### ¿StatefulSet replica PostgreSQL automáticamente?

No. Gestiona aspectos de identidad y almacenamiento; la replicación de la base requiere
un diseño específico.

## En pocas palabras

Un PVC solicita almacenamiento con condiciones concretas y depende de la infraestructura
del clúster. La persistencia puede sobrevivir a un pod y seguir siendo vulnerable
a pérdida del disco o borrado.

## Conclusión

Prueba reinicio y recreación controlados y documenta qué recursos conservan los 
datos. Añade un backup externo y una restauración antes de utilizar información 
importante.

Para continuar, revisa [Instalar Kubernetes en Ubuntu desde cero: guía completa](https://sergiocaballero.com/como-instalar-kubernetes-en-ubuntu/)
y [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/).

## Fuentes y documentación

[Documentación de kubernetes.io](https://kubernetes.io/docs/concepts/storage/persistent-volumes/).

[Documentación de kubernetes.io](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/).

## Optimizar imágenes Docker con pruebas y medidas

- Link: https://sergiocaballero.com/como-optimizar-imagenes-docker/
- Published: 2026-10-17T06:52:25+00:00
- Author: sergio

Para optimizar una imagen Docker, identifica qué archivos y dependencias necesita
realmente la aplicación. Después revisa contexto, orden de capas y construcción 
por etapas. No cambies de base solo para obtener un número menor sin comprobar comportamiento.

Esta guía utiliza una aplicación Node como ejemplo. Adapta compilación y pruebas
a tu proyecto y arquitectura.

## Mide una referencia

Registra versión, arquitectura, tamaño y tiempo de construcción bajo condiciones
conocidas. Distingue una construcción con caché de otra limpia.

No publiques porcentajes de mejora sin explicar qué cambió. Un resultado medido 
en una computadora no garantiza el mismo ahorro en otra red o plataforma.

## Limita el contexto

Un .dockerignore puede excluir archivos que no deben llegar al build:

    ```wp-block-code
    node_modules
    .git
    .env
    secrets
    *.pem
    npm-debug.log
    ```

Revisa que no excluyas archivos necesarios. También comprueba que no queden otras
credenciales con nombres diferentes: esta lista no descubre secretos automáticamente.

Copiar un secreto y borrarlo después no garantiza que desaparezca de capas anteriores.
Utiliza mecanismos de build secretos cuando sean necesarios y compatibles.

## Construcción por etapas

Para una aplicación JavaScript sin compilación adicional:

    ```wp-block-code
    FROM node:24-slim AS dependencias
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci --omit=dev

    FROM node:24-slim AS ejecucion
    ENV NODE_ENV=production
    WORKDIR /app
    COPY --from=dependencias /app/node_modules ./node_modules
    COPY --chown=node:node src ./src
    USER node
    EXPOSE 3000
    CMD ["node", "src/index.js"]
    ```

Si utilizas TypeScript, bundling o módulos nativos, necesitas etapas y archivos 
adicionales. No copies este ejemplo suponiendo que ejecuta un script build que no
existe.

## Orden de capas y caché

Copiar primero manifiestos de dependencias permite reutilizar su instalación cuando
solo cambia código. Eso funciona si el lockfile representa correctamente el proyecto.

Una caché rápida no debe ocultar dependencias desactualizadas. Separa la optimización
de builds del proceso de actualización de la base y bibliotecas.

## Usuario y permisos

Ejecutar con un usuario limitado reduce privilegios, pero la aplicación debe poder
leer y escribir en las rutas apropiadas. No le otorgues permisos globales para compensar
un directorio mal elegido.

Dentro de un contenedor, una aplicación web puede necesitar escuchar en una interfaz
alcanzable por su red; la restricción externa se define también al publicar puertos.
Son capas diferentes.

## Compara con pruebas

    ```wp-block-code
    docker build -t app-optimizada:lab .
    docker image inspect app-optimizada:lab
    docker history app-optimizada:lab
    ```

Inspecciona sin compartir configuraciones sensibles. Ejecuta tests, inicio y funciones
críticas con la misma carga. La ausencia de herramientas de depuración puede ser
intencional, pero debes conservar un método de diagnóstico.

## Base, digest y mantenimiento

Una base mínima puede mejorar el peso y complicar módulos o certificados. Compara
slim, Alpine u otras opciones según soporte real.

Fijar un digest facilita reproducibilidad; no reemplaza actualizar. Documenta cómo
revisarás nuevas bases y vulnerabilidades.

## Preguntas frecuentes

### ¿Multi-stage siempre reduce mucho el tamaño?

No. Depende de qué componentes excluyes de la etapa final. Si copias todo de nuevo,
puedes conservar el mismo peso.

### ¿Una imagen menor tiene menos vulnerabilidades?

No necesariamente. Importan componentes, versiones, configuración y explotación 
posible; tamaño no es una medida suficiente.

### ¿Borrar archivos en otro RUN elimina su peso anterior?

No de forma general en capas ya creadas. Diseña el build para no incorporarlos o
utiliza mecanismos apropiados.

## En pocas palabras

Optimizar una imagen significa reducir trabajo y componentes innecesarios manteniendo
funcionalidad y soporte. Las capas y el contexto importan tanto como la elección
de base.

## Conclusión

Conserva una referencia y repite las mismas pruebas después de optimizar. Si ahorras
espacio pero pierdes compatibilidad, mantenimiento o diagnóstico, revisa el equilibrio.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.docker.com](https://docs.docker.com/build/building/multi-stage/).

[Documentación de docs.docker.com](https://docs.docker.com/build/building/best-practices/).

## Alpine en Docker: tamaño y compatibilidad de imágenes

- Link: https://sergiocaballero.com/como-crear-contenedores-alpine-linux/
- Published: 2026-10-17T06:52:23+00:00
- Author: sergio

Alpine Linux es una distribución ligera utilizada como base de imágenes Docker. 
Puede ayudar a reducir tamaño, pero no debe recomendarse para toda aplicación solo
por ese dato. Su uso de musl y herramientas BusyBox puede cambiar compatibilidad
y comportamiento.

Esta guía propone una comparación práctica. Los tamaños dependen de etiqueta, arquitectura
y forma de medición; no se presentan cifras fijas como si fueran universales.

## Define qué estás comparando

Una imagen comprimida en el registro y el tamaño descomprimido en el host son medidas
distintas. Compara la misma aplicación, arquitectura y dependencias.

Una base pequeña puede terminar siendo mayor si necesitas instalar herramientas 
y compiladores adicionales. También puede aumentar tiempo de construcción o dificultad
de diagnóstico.

## musl frente a glibc

Muchas aplicaciones y paquetes precompilados esperan glibc. Alpine utiliza musl,
por lo que determinadas dependencias nativas pueden necesitar otra compilación o
no funcionar igual.

No lo resuelvas mezclando bibliotecas al azar. Revisa soporte de la aplicación y,
si conviene, utiliza una base Debian slim u otra opción compatible.

## Un Dockerfile sencillo

Para una aplicación Node que ya tenga package.json, lockfile y src/index.js:

    ```wp-block-code
    FROM node:24-alpine
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci --omit=dev
    COPY --chown=node:node src ./src
    USER node
    EXPOSE 3000
    CMD ["node", "src/index.js"]
    ```

La familia de Node debe mantenerse y comprobarse. No se utiliza Node.js 20 como 
recomendación actual. Revisa también la versión Alpine incluida en la etiqueta y
las dependencias del proyecto.

## Instalar paquetes con apk

    ```wp-block-code
    RUN apk add --no-cache ca-certificates
    ```

Añade únicamente lo que necesite la aplicación. --no-cache evita conservar ciertos
índices en el flujo habitual, pero no sustituye revisar qué paquetes terminan instalados.

No mezcles una base estable con paquetes edge/testing por HTTP como receta de producción.
Cambiar de repositorio implica compatibilidad y mantenimiento, además del canal 
de descarga.

## Shell y herramientas

Alpine no garantiza Bash ni todas las opciones de herramientas GNU. Un script que
utiliza funciones específicas puede fallar aunque funcione en Ubuntu.

Decide si adaptarás el script a una shell compatible o instalarás la herramienta
necesaria. La solución debe quedar declarada en la imagen, no depender de modificaciones
manuales dentro de un contenedor.

## Pruebas que aportan evidencia

Ejecuta inicio, peticiones, tratamiento de fechas, DNS, TLS y operaciones con módulos
nativos según tu aplicación. Compara resultados con una base alternativa.

No basta con comprobar que el proceso aparece en docker ps. Una biblioteca puede
fallar solo al ejecutar una función particular o procesar ciertos datos.

## Seguridad y mantenimiento

Menos paquetes pueden reducir superficie, pero tamaño y seguridad no son equivalentes.
Revisa vulnerabilidades, configuración y posibilidades de parcheo.

Registra base y digest si necesitas reproducibilidad y establece actualizaciones.
Una imagen pequeña sin mantenimiento sigue siendo un problema.

## Preguntas frecuentes

### ¿Alpine siempre hace la aplicación más rápida?

No. Depende del trabajo, bibliotecas y entorno. Mide condiciones representativas
en vez de deducir rendimiento del tamaño.

### ¿Puedo ejecutar cualquier binario Linux?

No necesariamente. Arquitectura y bibliotecas esperadas importan. Revisa compatibilidad
con musl y dependencias.

### ¿Debo instalar Bash por si acaso?

Solo si lo requiere tu aplicación o procedimiento. Cada componente añadido necesita
un propósito y mantenimiento.

## En pocas palabras

Alpine puede reducir componentes de una imagen, pero utiliza decisiones de sistema
que afectan compatibilidad. La mejor base es la que ejecuta y mantiene bien tu aplicación,
no solo la que descarga menos.

## Conclusión

Construye una prueba equivalente en las bases candidatas y compara funcionamiento
y mantenimiento. Conserva la opción que puedas actualizar y depurar sin añadir complejidad
innecesaria.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.alpinelinux.org](https://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html).

[Documentación de hub.docker.com](https://hub.docker.com/_/node).

## Docker Secrets: diferencias entre Swarm y Compose

- Link: https://sergiocaballero.com/como-usar-docker-secrets/
- Published: 2026-10-17T06:52:22+00:00
- Author: sergio

Las credenciales no deben quedar copiadas dentro de imágenes o repositorios. Docker
ofrece mecanismos para entregarlas a servicios, pero es importante distinguir secretos
de Swarm de archivos declarados por Compose.

Cambiar una variable de entorno por un archivo no crea automáticamente cifrado y
control de acceso completos. Evalúa almacenamiento, permisos y consumidores.

## Secretos de Swarm

Swarm administra secretos para servicios con un modelo propio de distribución y 
protección. Debes tener un clúster autorizado y acceso al manager correspondiente.

Puedes crear un secreto desde un archivo privado:

    ```wp-block-code
    docker secret create db_password_v1 ./secrets/db_password.txt
    docker secret ls
    ```

El archivo debe existir y estar protegido. No utilices una contraseña real escrita
en un echo que permanecerá en el historial.

Asigna el secreto únicamente a los servicios que lo necesitan y comprueba su ubicación
de lectura según la plataforma.

## Archivos en Compose

Un ejemplo para PostgreSQL:

    ```wp-block-code
    services:
      db:
        image: postgres:16
        environment:
          POSTGRES_PASSWORD_FILE: /run/secrets/db_password
        secrets:
          - db_password
        volumes:
          - db_data:/var/lib/postgresql/data
    secrets:
      db_password:
        file: ./secrets/db_password.txt
    volumes:
      db_data:
    ```

La imagen debe soportar la variable _FILE específica. No es una convención que cualquier
aplicación interprete automáticamente.

En Compose sin Swarm, el archivo local sigue existiendo y requiere permisos y tratamiento
de respaldo adecuados. No atribuyas a ese caso todas las garantías de un secreto
administrado por Swarm.

## Preparación y permisos

Genera material aleatorio mediante una herramienta apropiada y conserva la carpeta
fuera de Git. Ajusta propietario y acceso para que el usuario del proceso pueda 
leerlo sin abrirlo a todos.

Un archivo privado que el contenedor no puede leer no se arregla necesariamente 
con chmod 777. Identifica UID, GID y modelo de mounts de la plataforma.

## Lectura en la aplicación

Configura una ruta explícita y maneja el error cuando el archivo falte. No imprimas
el valor para demostrar que se cargó.

Si eliminas saltos de línea, hazlo solo cuando el formato del secreto lo permita.
Un trim genérico puede modificar un valor donde los espacios son significativos.

## Rotación real

Crear un archivo nuevo o actualizar una variable no cambia automáticamente la contraseña
de una base ya inicializada. Debes coordinar el sistema que valida la credencial
y sus consumidores.

En Swarm, utiliza nombres versionados o el procedimiento compatible para reemplazar
un secreto. Comprueba el servicio antes de retirar la versión anterior.

## Qué todavía debes proteger

Los administradores del host, el acceso a Docker, los backups y herramientas de 
diagnóstico pueden formar parte de la superficie de exposición. Revisa también permisos
de CI/CD.

Si un secreto se publicó, retirarlo del archivo actual no deshace la exposición.
Revócalo y revisa dónde pudo conservarse, incluidos commits y artefactos.

## Preguntas frecuentes

### ¿Un archivo secreto de Compose queda cifrado automáticamente?

No debes asumirlo. Revisa el mecanismo de la plataforma y protege el archivo y sus
copias.

### ¿Cualquier variable con sufijo _FILE funciona?

No. La imagen o aplicación debe implementar esa lectura; consulta su documentación.

### ¿Cambiar el archivo rota la contraseña de MySQL o PostgreSQL?

No de forma general. Las variables de inicialización y la administración de una 
cuenta existente son procesos distintos.

## En pocas palabras

Swarm y Compose pueden entregar secretos como archivos, pero sus garantías no son
iguales. La aplicación debe leerlos correctamente y el host y sus respaldos siguen
necesitando protección.

## Conclusión

Identifica quién puede leer cada secreto y prueba su rotación con una aplicación
de laboratorio. Retira credenciales antiguas solo después de verificar que los consumidores
utilizan las nuevas.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.docker.com](https://docs.docker.com/engine/swarm/secrets/).

[Documentación de docs.docker.com](https://docs.docker.com/compose/how-tos/use-secrets/).

## Escalar Kubernetes: HPA, métricas y disponibilidad

- Link: https://sergiocaballero.com/como-escalar-aplicaciones-kubernetes/
- Published: 2026-10-17T06:52:20+00:00
- Author: sergio

Kubernetes puede aumentar o reducir réplicas manualmente o mediante un autoscaler.
Para que eso ayude, la aplicación debe soportar varias instancias y el clúster debe
tener capacidad. Más pods no resuelven automáticamente un cuello de botella en una
base de datos.

Esta guía utiliza una aplicación de práctica y separa escalado de pods de crecimiento
de nodos.

## Prepara la aplicación

Define readiness y recursos adecuados. Para HPA por utilización de CPU, los requests
correspondientes permiten calcular el porcentaje de uso. Los limits no son un requisito
universal equivalente para todas las métricas.

Comprueba que sesiones, archivos y tareas compartidas no dependan de una única instancia.
De lo contrario, escalar puede duplicar trabajo o producir resultados inconsistentes.

## Verifica métricas

    ```wp-block-code
    kubectl top nodes
    kubectl -n practica top pods
    ```

Si no hay métricas, revisa la API y el componente instalado para tu clúster. No 
desactives verificación TLS de metrics-server como arreglo genérico; identifica 
la causa de certificados o conectividad.

## Escalado manual

    ```wp-block-code
    kubectl -n practica scale deployment web-lab --replicas=3
    kubectl -n practica rollout status deployment/web-lab
    kubectl -n practica get pods -o wide
    ```

El deployment debe existir. Comprueba si las réplicas se distribuyen y están preparadas.
Un pod Pending indica que la solicitud de escala no se pudo satisfacer completamente.

## Un HPA basado en CPU

    ```wp-block-code
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: web-lab
      namespace: practica
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: web-lab
      minReplicas: 2
      maxReplicas: 5
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 70
    ```

El porcentaje y las réplicas son decisiones de laboratorio, no recomendaciones universales.
El deployment necesita requests apropiados y la API de métricas debe funcionar.

Evita administrar a la vez la misma cantidad de réplicas con herramientas que se
contradigan. Revisa cómo tu flujo declarativo y el HPA interactúan.

## Prueba carga con límites

Genera carga controlada y observa métricas, decisión del HPA y tiempo que tarda 
la aplicación en estar preparada. Después retira la carga y observa la reducción.

No crees un generador infinito sin plan de parada ni lo ejecutes sobre un servicio
ajeno. En nube, el escalado puede aumentar costos.

## PDB no es una garantía de disponibilidad

Un PodDisruptionBudget limita ciertas interrupciones voluntarias cuando se utilizan
mecanismos que lo respetan. No evita todos los fallos ni sustituye el diseño de 
actualizaciones del controlador.

La disponibilidad también depende de readiness, distribución entre nodos o zonas,
capacidad y tolerancia de la aplicación. No la deduzcas de un único YAML.

## Nodos y datos

Si no hay recursos para nuevos pods, necesitas revisar capacidad y, cuando corresponda,
autoscaling de nodos. Ese mecanismo tiene configuración y límites propios.

Para servicios con estado, comprende requisitos de almacenamiento y replicación 
antes de aumentar réplicas.

## Preguntas frecuentes

### ¿HPA crea máquinas nuevas?

No por sí solo. Ajusta réplicas del objetivo; ampliar nodos requiere otro mecanismo
compatible.

### ¿Los limits son obligatorios para todo HPA?

No como regla general. Los requisitos dependen de las métricas; para utilización
de recursos necesitas los requests pertinentes.

### ¿Un PDB evita cualquier caída durante cambios?

No. Controla un conjunto de interrupciones y no reemplaza arquitectura y pruebas
de disponibilidad.

## En pocas palabras

Escalar pods y ampliar nodos son operaciones diferentes. HPA necesita métricas y
configuración apropiadas; disponibilidad también depende de aplicación, distribución
y datos.

## Conclusión

Prueba carga controlada y observa demanda, réplicas y capacidad disponible. Conserva
límites de presupuesto y revisa qué ocurre cuando la aplicación reduce tamaño o 
pierde un nodo.

Para continuar, revisa [Instalar Kubernetes en Ubuntu desde cero: guía completa](https://sergiocaballero.com/como-instalar-kubernetes-en-ubuntu/)
y [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/).

## Fuentes y documentación

[Documentación de kubernetes.io](https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/).

[Documentación de kubernetes.io](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/).

## Argo CD: primer despliegue GitOps con revisión

- Link: https://sergiocaballero.com/como-usar-gitops-argocd/
- Published: 2026-10-17T06:51:46+00:00
- Author: sergio

GitOps utiliza un repositorio como referencia declarativa de configuración. Argo
CD observa diferencias y puede reconciliarlas en Kubernetes. No significa que cualquier
commit deba aplicarse automáticamente sin revisión.

Utiliza un clúster y repositorio de laboratorio sin secretos. Comprueba contexto
antes de instalar un controlador que tendrá permisos sobre recursos.

## Instala desde una versión oficial revisada

Selecciona una release mantenida y sus instrucciones. El manifiesto stable puede
cambiar; una referencia por versión facilita reproducir el entorno.

    ```wp-block-code
    kubectl config current-context
    kubectl create namespace argocd
    ```

Aplica después el manifiesto elegido siguiendo la documentación y revisa qué permisos
crea. No uses una URL de otra persona que empaquete una instalación desconocida.

## Acceso al panel

Para una prueba, port-forward permite llegar al servicio sin publicarlo mediante
un balanceador:

    ```wp-block-code
    kubectl -n argocd port-forward service/argocd-server 8080:443
    ```

La conexión del ejemplo usa TLS. Verifica la identidad y configura confianza apropiada
antes de introducir credenciales. No conviertas --insecure en una recomendación 
administrativa permanente.

La contraseña inicial y el mecanismo para obtenerla son sensibles. No publiques 
la salida y cambia el acceso inicial según el procedimiento oficial.

## Prepara un repositorio pequeño

Crea manifiestos de una aplicación de práctica en una carpeta y evita recursos compartidos
o de producción. Guarda imagen y configuración con versiones deliberadas.

Una definición de aplicación tiene una estructura como:

    ```wp-block-code
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: practica
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: https://github.com/TU_ORGANIZACION/TU_REPOSITORIO.git
        targetRevision: main
        path: manifests
      destination:
        server: https://kubernetes.default.svc
        namespace: practica
      syncPolicy:
        syncOptions:
          - CreateNamespace=true
    ```

Sustituye el repositorio y revisa permisos y contenido antes de aplicar. El ejemplo
no activa sincronización automática ni eliminación automática.

## Revisa diferencias antes de sincronizar

Comprueba recursos nuevos, modificaciones y eliminaciones. Luego sincroniza manualmente
y verifica la aplicación, no solo el estado mostrado por el controlador.

Si una imagen no descarga o un pod no está listo, consulta eventos y logs de Kubernetes.
Git sincronizado no equivale a aplicación funcional.

## Automatización con límites

self-heal puede corregir diferencias respecto a Git; prune puede eliminar recursos
que ya no estén declarados. Entiende el efecto antes de habilitarlos.

Protege ramas, repositorios y cuentas que modifican manifiestos. Quien cambia el
origen de configuración puede influir en el clúster, por lo que esos permisos forman
parte de la seguridad del despliegue.

## Recuperación

Volver a un commit anterior puede restaurar configuración, pero no deshace por sí
solo una migración de datos. Conserva una estrategia de recuperación independiente.

Para otros equipos, crea proyectos y RBAC con alcance limitado. No compartas la 
cuenta administrativa para todas las tareas.

## Preguntas frecuentes

### ¿GitOps significa publicar cada push?

No. Puedes mantener revisión y sincronización manual. La automatización es una decisión
que debe corresponder al proceso.

### ¿prune solo borra archivos de Git?

No. Puede provocar eliminación de recursos del clúster según la configuración. Revisa
alcance antes de habilitarlo.

### ¿Volver al commit anterior recupera la base de datos?

No automáticamente. Datos y efectos externos requieren respaldo y procedimientos
propios.

## En pocas palabras

Argo CD compara el estado declarado en Git con recursos del clúster. La automatización
requiere límites de acceso y comprensión de los cambios que puede aplicar o eliminar.

## Conclusión

Practica un cambio y su reversión en un namespace aislado. Activa sincronización
automática solo después de revisar permisos, protección de Git y tratamiento de 
datos externos.

Para continuar, revisa [Instalar Kubernetes en Ubuntu desde cero: guía completa](https://sergiocaballero.com/como-instalar-kubernetes-en-ubuntu/)
y [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/).

## Fuentes y documentación

[Documentación de argo-cd.readthedocs.io](https://argo-cd.readthedocs.io/en/stable/getting_started/).

[Documentación de argo-cd.readthedocs.io](https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/).

## RabbitMQ en Docker: colas, confirmaciones y persistencia

- Link: https://sergiocaballero.com/como-instalar-rabbitmq-docker/
- Published: 2026-10-17T06:51:44+00:00
- Author: sergio

RabbitMQ permite desacoplar productores y consumidores mediante colas y otros patrones
de mensajería. Ejecutarlo en Docker facilita una práctica local, pero la entrega
confiable depende de configuración y comportamiento de las aplicaciones.

Este laboratorio publica puertos únicamente en loopback y utiliza credenciales propias.
No se plantea como clúster disponible ante fallos.

## Prepara credenciales de práctica

Define RABBITMQ_DEFAULT_PASS en tu sesión mediante un método privado, sin incluir
una contraseña real en un tutorial o repositorio. El usuario del ejemplo es lab.

Las variables de entorno del contenedor pueden ser accesibles a quienes administran
Docker. Para otros entornos, utiliza el mecanismo de configuración y secretos apropiado
y limita quién controla el daemon.

## Inicia el servicio

    ```wp-block-code
    docker volume create rabbitmq_lab_data
    docker run -d --name rabbitmq-lab \
      -p 127.0.0.1:5672:5672 \
      -p 127.0.0.1:15672:15672 \
      -e RABBITMQ_DEFAULT_USER=lab \
      -e RABBITMQ_DEFAULT_PASS="${RABBITMQ_DEFAULT_PASS:?Define la clave de laboratorio}" \
      -v rabbitmq_lab_data:/var/lib/rabbitmq \
      rabbitmq:4-management
    docker logs --tail 50 rabbitmq-lab
    ```

Revisa soporte y arquitectura de la etiqueta elegida y registra la versión utilizada.
Si la variable de contraseña no está definida, corrige la preparación en lugar de
arrancar con un valor vacío.

## Comprueba el broker y el panel

    ```wp-block-code
    docker exec rabbitmq-lab rabbitmq-diagnostics -q ping
    ```

Accede al panel local y revisa conexiones, canales y colas. La salud del proceso
no comprueba toda la ruta de una aplicación.

Para servicios reales, separa usuario administrativo de cuentas con permisos por
vhost y recursos. No compartas una cuenta con control total para todos los productores.

## Productor y consumidor de prueba

Sigue el tutorial oficial de tu cliente para declarar una cola y enviar mensajes
ficticios. Mantén coherentes las propiedades al declarar la misma cola desde varios
procesos.

Comprueba que un consumidor recibe y procesa el mensaje antes de confirmarlo. Si
confirma demasiado pronto y después falla, el trabajo puede perderse desde la perspectiva
de la aplicación.

## Persistencia no es una sola casilla

Una cola durable, mensajes persistentes, confirmaciones del publicador y acknowledgements
del consumidor resuelven aspectos diferentes. El volumen conserva datos del broker,
pero no corrige una aplicación que confirma operaciones antes de terminarlas.

Diseña consumidores capaces de manejar reentregas. Un fallo de conexión puede dejar
incertidumbre sobre si un mensaje se publicó o procesó; no prometas “exactamente
una vez” sin un diseño que lo sustente.

## Prueba fallos deliberados

En laboratorio, detén un consumidor antes de confirmar y observa qué ocurre. Reinicia
el broker y verifica qué mensajes y colas se conservan según la configuración.

Revisa políticas de reintento y mensajes fallidos para evitar bucles infinitos. 
Define un límite y una vía de diagnóstico para trabajo que no puede completarse.

## Mantenimiento y retirada

Vigila disco, memoria y acumulación de mensajes. Un broker accesible puede estar
bloqueando publicadores por recursos.

Antes de borrar volúmenes, decide qué datos deben conservarse y cómo migrarlos. 
Cambiar credenciales de inicialización no modifica automáticamente usuarios de una
base ya creada.

## Preguntas frecuentes

### ¿Una cola durable hace persistente cualquier mensaje?

No. Debes revisar también propiedades de publicación y confirmaciones. Son decisiones
diferentes.

### ¿Puedo confirmar antes de procesar para ir más rápido?

Eso cambia la garantía de recuperación ante fallos. Confirma según el resultado 
que realmente puedas sostener.

### ¿Un mensaje puede llegar más de una vez?

Sí en determinados escenarios. Diseña idempotencia o controles adecuados en el consumidor.

## En pocas palabras

RabbitMQ entrega mensajes mediante mecanismos que la aplicación debe configurar 
y comprobar. Una cola durable y un volumen no garantizan por sí solos que cada trabajo
se procese exactamente una vez.

## Conclusión

Prueba fallos del consumidor y reinicios del broker con mensajes ficticios. Documenta
reintentos, confirmaciones y comportamiento duplicado antes de integrar trabajo 
importante.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de www.rabbitmq.com](https://www.rabbitmq.com/docs/download).

[Documentación de www.rabbitmq.com](https://www.rabbitmq.com/tutorials/tutorial-two-javascript).

## Monitorear Docker con Prometheus, cAdvisor y Grafana

- Link: https://sergiocaballero.com/como-monitorear-contenedores-docker/
- Published: 2026-10-17T06:51:42+00:00
- Author: sergio

Para observar recursos de contenedores puedes combinar cAdvisor, Prometheus y Grafana.
Cada pieza cumple una función diferente; un dashboard instalado no demuestra que
estén llegando métricas correctas.

Utiliza un host dedicado de laboratorio para revisar mounts y privilegios. cAdvisor
puede necesitar acceso sensible a información del host y su compatibilidad depende
de runtime, cgroups y plataforma.

## Define qué quieres medir

Empieza por CPU, memoria y red de un contenedor identificado. Decide si necesitas
datos del host completo mediante otro exporter y evita atribuir a cAdvisor una cobertura
universal.

Fija versiones compatibles de las imágenes. Revisa la ubicación oficial actual de
cAdvisor en vez de conservar una referencia histórica a un registro sin comprobarla.

## Recopila sin publicar todos los puertos

Configura una red interna de monitoreo. Prometheus puede consultar el exporter por
nombre y puerto interno, sin hacer público el endpoint.

En prometheus.yml, una pieza de referencia es:

    ```wp-block-code
    global:
      scrape_interval: 15s
    scrape_configs:
      - job_name: contenedores
        static_configs:
          - targets: ["cadvisor:8080"]
    ```

El nombre debe coincidir con el servicio real. Verifica la ruta de métricas y los
parámetros requeridos por la versión del exporter.

## Privilegios y mounts de cAdvisor

La documentación puede requerir mounts de directorios del host y opciones adicionales
según la plataforma. Revisa cada acceso: leer métricas no significa que sea apropiado
montar todo el sistema en cualquier servidor.

No agregues privileged: true por ensayo y error sin conocer su alcance. Comprueba
qué necesita tu versión y limita el uso al diseño autorizado.

## Verifica antes de abrir Grafana

En Prometheus revisa el target y consulta:

    ```wp-block-code
    up{job="contenedores"}
    ```

Después comprueba que existen métricas y etiquetas del contenedor que quieres observar.
Si no están, investiga exporter, permisos y runtime; importar otro dashboard no 
crea la información faltante.

## Interpreta CPU y memoria correctamente

Una consulta de CPU puede expresarse como uso de núcleos:

    ```wp-block-code
    rate(container_cpu_usage_seconds_total[5m])
    ```

Multiplicar por 100 puede representar porcentaje de un núcleo, no de toda la máquina.
Para compararlo con una capacidad, define explícitamente el denominador y agrega
etiquetas de forma consciente.

Las métricas de memoria también tienen significados distintos: uso, working set,
caché y límite no son intercambiables. Explica la consulta en el panel.

## Conecta Grafana y adapta dashboards

Utiliza una URL de Prometheus alcanzable desde Grafana, por ejemplo el nombre del
servicio en su red. No uses localhost para otro contenedor.

Revisa consultas, fuente y filtros de un dashboard importado. Un ID popular puede
esperar etiquetas o versiones que no coinciden con tu instalación.

## Alertas y datos

Define una alerta con duración y acción útil y pruébala bajo carga controlada. Un
umbral de memoria no debe generar ruido constante por no considerar el límite real.

Conserva datos y configuración en almacenamiento apropiado, define retención y protege
interfaces y credenciales. No publiques Prometheus, Grafana y cAdvisor indiscriminadamente
a internet.

## Preguntas frecuentes

### ¿Puedo sumar cualquier porcentaje de CPU?

No sin entender unidades, agregación y capacidad. Distingue uso de núcleos de porcentaje
respecto al host o al límite asignado.

### ¿Un dashboard vacío significa que Grafana falló?

Puede faltar recopilación, una fuente correcta o etiquetas compatibles. Revisa las
capas en orden.

### ¿Necesito publicar cAdvisor para que Prometheus lo consulte?

No cuando ambos tienen conectividad interna apropiada. Limita exposición a lo necesario.

## En pocas palabras

El stack separa recopilación y visualización: cAdvisor expone métricas, Prometheus
las conserva y Grafana las representa. Los permisos del exporter y el significado
de cada consulta requieren revisión.

## Conclusión

Comprueba un contenedor conocido y relaciona sus métricas con una actividad controlada.
Documenta unidades y límites y protege paneles y acceso al host antes de ampliar
el monitoreo.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de prometheus.io](https://prometheus.io/docs/guides/cadvisor/).

[Documentación de grafana.com](https://grafana.com/docs/grafana/latest/datasources/prometheus/).

## Redes Docker: conecta servicios sin abrir la base

- Link: https://sergiocaballero.com/como-crear-red-personalizada-docker/
- Published: 2026-10-17T06:51:41+00:00
- Author: sergio

Las redes Docker definen parte de la comunicación entre servicios. Una red bridge
creada por el usuario permite resolver nombres de contenedores y separar proyectos
mejor que conectar todo indiscriminadamente.

Esta guía utiliza dos contenedores de práctica. No necesita publicar puertos en 
el host para demostrar su comunicación.

## Crea y examina la red

    ```wp-block-code
    docker network create red-lab
    docker network inspect red-lab
    ```

Si el nombre ya existe, revisa quién lo utiliza antes de modificarlo. Una red pertenece
a un conjunto de recursos y puede ser compartida por proyectos.

## Ejecuta un servidor y un cliente

    ```wp-block-code
    docker run -d --name servidor-lab --network red-lab nginx:stable-alpine
    docker run --rm --network red-lab busybox:1.37 \
      wget -qO- http://servidor-lab
    ```

El cliente utiliza el nombre del contenedor. No necesita la dirección IP, que puede
cambiar. Esta prueba confirma una petición dentro de esa red, no disponibilidad 
pública.

Las imágenes deben estar disponibles para tu arquitectura. Antes de usar una etiqueta
de referencia en un entorno real, comprueba mantenimiento.

## Puerto interno y publicación

Un servicio puede escuchar dentro de la red sin publicar un puerto del host. EXPOSE
es documentación de imagen y no sustituye una opción de publicación.

Para una aplicación con base de datos, normalmente puedes publicar solo la entrada
web y mantener la base en una red necesaria para los componentes autorizados.

No confundas “sin publicación” con inaccesibilidad frente a todos los actores del
host o de la plataforma. El diseño completo incluye permisos y otras rutas de acceso.

## El mismo concepto en Compose

    ```wp-block-code
    services:
      web:
        image: nginx:stable-alpine
        networks: [frontal]
      base:
        image: redis:8-alpine
        networks: [privada]
    networks:
      frontal: {}
      privada:
        internal: true
    ```

Este fragmento muestra separación; no describe una aplicación que conecte web con
la base. Una aplicación que necesite ambos lados debe pertenecer a las redes apropiadas
y controlar qué retransmite.

Una red internal restringe conectividad según el modelo Docker, pero no sustituye
autenticación, permisos ni protección del host.

## Diagnóstico por capas

Comprueba primero qué redes tiene cada contenedor y qué dirección utiliza el cliente.
Después revisa puerto y listener, y finalmente autenticación y protocolo de la aplicación.

Un nombre resuelto no significa que el servicio esté listo. Un connection refused
no es lo mismo que un rechazo de credenciales.

## Redes externas y retirada

Una red declarada como external en Compose debe existir y tiene un ciclo de vida
distinto al de una red creada por el proyecto. Documenta quién la administra.

Para limpiar, retira los contenedores de práctica y luego la red cuando ya no tenga
consumidores. No desconectes servicios importantes para eliminar una red cuyo nombre
no reconoces.

## Preguntas frecuentes

### ¿Debo usar IP fija para cada contenedor?

No para el caso habitual descrito. Los nombres de servicio y redes adecuadas permiten
evitar dependencias de direcciones que cambian.

### ¿La base necesita un puerto publicado para mi app Docker?

No si ambos se comunican por una red compartida y el servicio escucha correctamente
dentro de ella.

### ¿Separar redes garantiza seguridad completa?

No. Es una capa; también necesitas permisos, autenticación, mantenimiento y pruebas
del recorrido real del tráfico.

## En pocas palabras

Una red definida por el usuario facilita comunicación y resolución de nombres entre
contenedores. Publicar un puerto es otra decisión y no hace falta para toda conexión
interna.

## Conclusión

Dibuja qué servicios deben hablar entre sí y prueba tanto el acceso permitido como
el que debe fallar. Revisa rutas y puertos después de cada cambio de arquitectura.

Para continuar, revisa [Docker: qué es y cómo usarlo para ejecutar contenedores](https://sergiocaballero.com/que-es-docker-y-como-usarlo-para-ejecutar-contenedores/)
y [Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso](https://sergiocaballero.com/como-instalar-docker-ubuntu-24/).

## Fuentes y documentación

[Documentación de docs.docker.com](https://docs.docker.com/engine/network/drivers/bridge/).

[Documentación de docs.docker.com](https://docs.docker.com/compose/how-tos/networking/).
