<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Afu Tse (Chainiz)</title>
    <description>The latest articles on DEV Community by Afu Tse (Chainiz) (@chainiz).</description>
    <link>https://dev.to/chainiz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2992158%2F16abbe92-50ce-496c-b6b8-a42d4697f90e.jpg</url>
      <title>DEV Community: Afu Tse (Chainiz)</title>
      <link>https://dev.to/chainiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chainiz"/>
    <language>en</language>
    <item>
      <title>AWS Graviton: Cómo mejorar el Precio-Rendimiento de tus workloads en AWS</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Wed, 10 Jun 2026 21:51:10 +0000</pubDate>
      <link>https://dev.to/chainiz/aws-graviton-como-mejorar-el-precio-rendimiento-de-tus-workloads-en-aws-bo2</link>
      <guid>https://dev.to/chainiz/aws-graviton-como-mejorar-el-precio-rendimiento-de-tus-workloads-en-aws-bo2</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Reducir costos en la nube suele requerir iniciativas complejas: optimización de recursos, rediseño de arquitecturas, revisión de licencias o implementación de prácticas FinOps.&lt;/p&gt;

&lt;p&gt;Sin embargo, existe una optimización que muchas organizaciones pasan por alto: migrar workloads desde instancias x86 tradicionales hacia instancias basadas en AWS Graviton.&lt;/p&gt;

&lt;p&gt;AWS Graviton es una familia de procesadores ARM64 diseñados por Amazon para ejecutar cargas de trabajo cloud-native con una mejor relación entre costo, rendimiento y consumo energético.&lt;/p&gt;

&lt;p&gt;Este artículo analiza qué es AWS Graviton, cuándo conviene utilizarlo y qué resultados reales han obtenido empresas que ya lo usan en producción.&lt;/p&gt;




&lt;h2&gt;
  
  
  El Problema: Más Costos Sin Más Valor
&lt;/h2&gt;

&lt;p&gt;Muchas organizaciones ejecutan aplicaciones sobre procesadores Intel o AMD simplemente porque siempre lo han hecho.&lt;/p&gt;

&lt;p&gt;Sin embargo, gran parte de las aplicaciones modernas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs REST&lt;/li&gt;
&lt;li&gt;Microservicios&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No requieren características específicas de x86.&lt;/p&gt;

&lt;p&gt;En estos escenarios, seguir utilizando instancias tradicionales puede significar pagar más por resultados similares.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es AWS Graviton?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/ec2/graviton/" rel="noopener noreferrer"&gt;AWS Graviton&lt;/a&gt; es una familia de procesadores ARM desarrollados por Amazon Web Services específicamente para la nube.&lt;/p&gt;

&lt;p&gt;A diferencia de los procesadores genéricos utilizados en centros de datos tradicionales, Graviton fue diseñado para las cargas de trabajo más comunes dentro de AWS.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generación&lt;/th&gt;
&lt;th&gt;Año&lt;/th&gt;
&lt;th&gt;Características&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graviton&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Primera generación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton2&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Mejor rendimiento y menor costo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton3&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Optimización para cómputo intensivo y Machine Learning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Más núcleos, memoria y rendimiento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Beneficios de AWS Graviton
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Menor costo operativo
&lt;/h3&gt;

&lt;p&gt;Las instancias Graviton suelen ser más económicas que sus equivalentes x86.&lt;/p&gt;

&lt;p&gt;En muchos escenarios los ahorros directos oscilan entre 10% y 25%.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Mejor precio-rendimiento
&lt;/h3&gt;

&lt;p&gt;AWS promociona Graviton principalmente por su mejora en precio-rendimiento.&lt;/p&gt;

&lt;p&gt;Esto significa obtener más capacidad de procesamiento por cada dólar invertido.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Menor consumo energético
&lt;/h3&gt;

&lt;p&gt;Los procesadores ARM se caracterizan por su eficiencia energética.&lt;/p&gt;

&lt;p&gt;Esto contribuye a reducir el consumo eléctrico y la huella de carbono de las cargas de trabajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Compatibilidad con el ecosistema moderno
&lt;/h3&gt;

&lt;p&gt;Graviton funciona de forma nativa con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Kubernetes (EKS)&lt;/li&gt;
&lt;li&gt;ECS&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;.NET&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparativa de Costos
&lt;/h2&gt;

&lt;p&gt;Tomemos una instancia de propósito general con características similares.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;x86 (M7i)&lt;/th&gt;
&lt;th&gt;ARM (M7g)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vCPU&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memoria&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precio por hora&lt;/td&gt;
&lt;td&gt;$0.096 USD&lt;/td&gt;
&lt;td&gt;$0.077 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diferencia&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;~20% menos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Cluster Kubernetes
&lt;/h3&gt;

&lt;p&gt;Supongamos un cluster EKS con 20 nodos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;x86&lt;/th&gt;
&lt;th&gt;Graviton&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Costo mensual&lt;/td&gt;
&lt;td&gt;$1,402 USD&lt;/td&gt;
&lt;td&gt;$1,124 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ahorro mensual&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$278 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ahorro anual&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$3,336 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; AWS suele hablar de hasta 40% mejor precio-rendimiento, no necesariamente 40% menos costo. El beneficio combina ahorro económico y mayor rendimiento. En muchos casos, la reducción directa de costos se encuentra entre 10% y 25%.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Benchmarks Verificados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Amazon RDS PostgreSQL
&lt;/h3&gt;

&lt;p&gt;AWS ejecutó benchmarks sobre Amazon RDS PostgreSQL comparando Graviton4 con generaciones anteriores. Los resultados mostraron:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Graviton4 vs Graviton3&lt;/th&gt;
&lt;th&gt;Graviton4 vs Graviton2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Queries por segundo&lt;/td&gt;
&lt;td&gt;+23%&lt;/td&gt;
&lt;td&gt;+41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queries por dólar&lt;/td&gt;
&lt;td&gt;+23%&lt;/td&gt;
&lt;td&gt;+34%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latencia&lt;/td&gt;
&lt;td&gt;-19%&lt;/td&gt;
&lt;td&gt;-29%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fuente:&lt;br&gt;
&lt;a href="https://aws.amazon.com/blogs/database/leveling-up-amazon-rds-with-aws-graviton4-benchmarks/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/database/leveling-up-amazon-rds-with-aws-graviton4-benchmarks/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Casos de Éxito
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Salesforce
&lt;/h3&gt;

&lt;p&gt;Migró infraestructura analítica basada en Vertica hacia instancias AWS Graviton.&lt;/p&gt;

&lt;p&gt;Resultados obtenidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15% reducción de costos&lt;/li&gt;
&lt;li&gt;40%+ mejora en consultas&lt;/li&gt;
&lt;li&gt;30%+ mejora en dashboards complejos&lt;/li&gt;
&lt;li&gt;30% mejora en tasa de éxito de cargas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fuente: &lt;a href="https://aws.amazon.com/solutions/case-studies/salesforce-graviton-case-study/" rel="noopener noreferrer"&gt;https://aws.amazon.com/solutions/case-studies/salesforce-graviton-case-study/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Supabase
&lt;/h3&gt;

&lt;p&gt;Migró PostgreSQL y APIs desde instancias T3a hacia T4g.&lt;/p&gt;

&lt;p&gt;Resultados obtenidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;28% mejor rendimiento&lt;/li&gt;
&lt;li&gt;10% menor costo por instancia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fuente: &lt;a href="https://aws.amazon.com/ec2/graviton/customers/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/graviton/customers/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ably
&lt;/h3&gt;

&lt;p&gt;Migró la mayoría de sus workloads Java, Go y Ruby.&lt;/p&gt;

&lt;p&gt;Resultados obtenidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hasta 40% mejor precio-rendimiento&lt;/li&gt;
&lt;li&gt;Migración realizada por un único ingeniero en pocos meses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fuente: &lt;a href="https://aws.amazon.com/ec2/graviton/customers/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/graviton/customers/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quantcast
&lt;/h3&gt;

&lt;p&gt;Migró su base de datos distribuida Kamke.&lt;/p&gt;

&lt;p&gt;Resultados obtenidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40% mejor precio-rendimiento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fuente: &lt;a href="https://aws.amazon.com/ec2/graviton/customers/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/graviton/customers/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sprinklr
&lt;/h3&gt;

&lt;p&gt;Migró microservicios y workloads intensivos de almacenamiento hacia Graviton4.&lt;/p&gt;

&lt;p&gt;Resultados obtenidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15% mejora de rendimiento en microservicios Java&lt;/li&gt;
&lt;li&gt;30% mejora en workloads storage-intensive&lt;/li&gt;
&lt;li&gt;20% menos núcleos requeridos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fuente: &lt;a href="https://aws.amazon.com/solutions/case-studies/sprinklr-case-study-graviton/" rel="noopener noreferrer"&gt;https://aws.amazon.com/solutions/case-studies/sprinklr-case-study-graviton/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué Debo Validar Antes de Migrar?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compatibilidad ARM64
&lt;/h3&gt;

&lt;p&gt;Verifica que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tu aplicación soporte ARM64&lt;/li&gt;
&lt;li&gt;Tus dependencias soporten ARM64&lt;/li&gt;
&lt;li&gt;Tus imágenes Docker tengan versión ARM64&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Multi-Arquitectura
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; my-app:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;p&gt;Asegúrate de que tus pipelines soporten compilación multi-arquitectura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benchmarking
&lt;/h3&gt;

&lt;p&gt;Antes de migrar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Despliega la aplicación en x86.&lt;/li&gt;
&lt;li&gt;Despliega la misma aplicación en Graviton.&lt;/li&gt;
&lt;li&gt;Ejecuta pruebas de carga.&lt;/li&gt;
&lt;li&gt;Compara:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Throughput&lt;/li&gt;
&lt;li&gt;Latencia&lt;/li&gt;
&lt;li&gt;Uso de CPU&lt;/li&gt;
&lt;li&gt;Consumo de memoria&lt;/li&gt;
&lt;li&gt;Costo por hora&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ¿Cuándo Tiene Sentido Migrar?
&lt;/h2&gt;

&lt;p&gt;AWS Graviton suele ser una excelente opción para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes (EKS)&lt;/li&gt;
&lt;li&gt;Microservicios&lt;/li&gt;
&lt;li&gt;APIs REST&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Procesamiento de datos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puede requerir más análisis cuando existen dependencias propietarias o binarios que únicamente soportan x86.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;AWS Graviton ya no es una tecnología emergente.&lt;/p&gt;

&lt;p&gt;Empresas como Salesforce, Supabase, Ably, Quantcast y Sprinklr ejecutan workloads críticos sobre Graviton obteniendo mejoras medibles en costos y rendimiento.&lt;/p&gt;

&lt;p&gt;Los resultados publicados muestran:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entre 10% y 25% de ahorro directo en costos.&lt;/li&gt;
&lt;li&gt;Hasta 40% mejor precio-rendimiento.&lt;/li&gt;
&lt;li&gt;Mejoras significativas en throughput y latencia.&lt;/li&gt;
&lt;li&gt;Menor consumo energético.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para equipos DevOps, Platform Engineering y FinOps, Graviton representa una de las optimizaciones con mejor retorno de inversión disponibles actualmente en AWS.&lt;/p&gt;

&lt;p&gt;La mejor forma de evaluar su impacto es sencilla:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Despliega una prueba de concepto, mide los resultados y deja que los números hablen por sí solos.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AWS Graviton: &lt;a href="https://aws.amazon.com/ec2/graviton/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/graviton/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS Graviton Customers: &lt;a href="https://aws.amazon.com/ec2/graviton/customers" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/graviton/customers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Salesforce Case Study: &lt;a href="https://aws.amazon.com/solutions/case-studies/salesforce-graviton-case-study/" rel="noopener noreferrer"&gt;https://aws.amazon.com/solutions/case-studies/salesforce-graviton-case-study/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sprinklr Case Study: &lt;a href="https://aws.amazon.com/solutions/case-studies/sprinklr-case-study-graviton/" rel="noopener noreferrer"&gt;https://aws.amazon.com/solutions/case-studies/sprinklr-case-study-graviton/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS Pricing Calculator: &lt;a href="https://calculator.aws/" rel="noopener noreferrer"&gt;https://calculator.aws/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amazon EKS: &lt;a href="https://aws.amazon.com/eks/" rel="noopener noreferrer"&gt;https://aws.amazon.com/eks/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker Multi-Platform Builds: &lt;a href="https://docs.docker.com/build/building/multi-platform/" rel="noopener noreferrer"&gt;https://docs.docker.com/build/building/multi-platform/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FinOps Foundation: &lt;a href="https://www.finops.org/" rel="noopener noreferrer"&gt;https://www.finops.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Los resultados pueden variar según la carga de trabajo, la región AWS, la arquitectura de la aplicación y el tipo de instancia utilizado. Se recomienda realizar pruebas de rendimiento antes de una migración a producción.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>aws</category>
      <category>arm</category>
      <category>finops</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Deploy OpenClaw on AWS Lightsail without manual headaches</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:43:34 +0000</pubDate>
      <link>https://dev.to/chainiz/deploy-openclaw-on-aws-lightsail-without-manual-headaches-1m9d</link>
      <guid>https://dev.to/chainiz/deploy-openclaw-on-aws-lightsail-without-manual-headaches-1m9d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is an English adaptation of the original Spanish post:&lt;br&gt;
&lt;a href="https://dev.to/chainiz/desplegar-openclaw-en-aws-lightsail-sin-sufrir-7lh"&gt;Desplegar OpenClaw en AWS Lightsail sin sufrir 😎&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want to deploy OpenClaw on AWS Lightsail in a simple, repeatable way without fighting through manual steps every time, a great option is to use &lt;code&gt;AWS CDK + Python + uv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, I’ll show you how to provision the required infrastructure using Infrastructure as Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🦀 OpenClaw + AWS Lightsail + IaC&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why automate this?
&lt;/h2&gt;

&lt;p&gt;Doing it manually once is fine.&lt;/p&gt;

&lt;p&gt;Doing it manually again and again? Not so fun.&lt;/p&gt;

&lt;p&gt;With Infrastructure as Code, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer manual errors&lt;/li&gt;
&lt;li&gt;Consistent deployments&lt;/li&gt;
&lt;li&gt;Fully repeatable environments&lt;/li&gt;
&lt;li&gt;Faster setup for your team&lt;/li&gt;
&lt;li&gt;Everything versioned in Git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not just to create a Lightsail instance. The goal is to have a deployment process that you can reproduce, destroy, improve, and run again whenever needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this stack create?
&lt;/h2&gt;

&lt;p&gt;This project provisions an OpenClaw environment on AWS Lightsail, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An OpenClaw Lightsail instance: &lt;code&gt;openclaw_ls_1_0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Public ports: &lt;code&gt;22&lt;/code&gt;, &lt;code&gt;80&lt;/code&gt;, and &lt;code&gt;443&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A static public Lightsail IP&lt;/li&gt;
&lt;li&gt;Optional snapshots&lt;/li&gt;
&lt;li&gt;IAM role automation for Amazon Bedrock&lt;/li&gt;
&lt;li&gt;Automatic association and disassociation of the static public IP during the stack lifecycle&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have the following installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python &lt;code&gt;3.11+&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;uv, for Python package and project management&lt;/li&gt;
&lt;li&gt;Node.js &lt;code&gt;22 LTS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AWS CLI v2&lt;/li&gt;
&lt;li&gt;AWS CDK CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can install the AWS CDK CLI globally with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; aws-cdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  0. Clone the repository
&lt;/h2&gt;

&lt;p&gt;Clone the project repository: &lt;a href="https://github.com/r3xakead0/aws-cdk-lightsail-openclaw" rel="noopener noreferrer"&gt;aws-cdk-lightsail-openclaw&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/r3xakead0/aws-cdk-lightsail-openclaw.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-cdk-lightsail-openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Prepare your local environment
&lt;/h2&gt;

&lt;p&gt;Before synthesizing or deploying the stack, prepare your local environment by installing the project dependencies and validating that your AWS credentials are configured correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check installed versions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
uv &lt;span class="nt"&gt;--version&lt;/span&gt;
node &lt;span class="nt"&gt;--version&lt;/span&gt;
aws &lt;span class="nt"&gt;--version&lt;/span&gt;
cdk &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;uv installed&lt;/li&gt;
&lt;li&gt;Node.js 22 LTS&lt;/li&gt;
&lt;li&gt;AWS CLI v2&lt;/li&gt;
&lt;li&gt;AWS CDK CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install project dependencies
&lt;/h3&gt;

&lt;p&gt;From the root of the repository, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure your AWS credentials
&lt;/h3&gt;

&lt;p&gt;If you do not have AWS credentials configured yet, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need to provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Access Key ID&lt;/li&gt;
&lt;li&gt;AWS Secret Access Key&lt;/li&gt;
&lt;li&gt;Default region, for example us-east-1&lt;/li&gt;
&lt;li&gt;Default output format, for example json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use AWS profiles, export the profile before continuing.&lt;/p&gt;

&lt;p&gt;For macOS/Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;TU_PROFILE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TU_PROFILE&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validate AWS access
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see an output similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456789012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::X234X67X901X:user/your-user"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Review the configuration file
&lt;/h2&gt;

&lt;p&gt;Open the following file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;config/dev.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate the main fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;account&lt;/li&gt;
&lt;li&gt;region, for example &lt;code&gt;us-east-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;availability_zone, for example &lt;code&gt;us-east-1a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;key_pair_name, for example &lt;code&gt;openclaw-dev-key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ssh_cidr&lt;/li&gt;
&lt;li&gt;enable_auto_snapshot, which is &lt;code&gt;false&lt;/code&gt; by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This file defines the environment-specific configuration for your deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Create or import the Lightsail key pair
&lt;/h2&gt;

&lt;p&gt;This part is important: the key pair must be a Lightsail key pair, not an EC2 key pair.&lt;/p&gt;

&lt;p&gt;It also needs to exist in the same region defined in your configuration file.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS/Linux
&lt;/h3&gt;

&lt;p&gt;Generate the key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-m&lt;/span&gt; PEM &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/openclaw-dev-key &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"openclaw-lightsail"&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/openclaw-dev-key
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/openclaw-dev-key.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import it into Lightsail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lightsail import-key-pair &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-pair-name&lt;/span&gt; openclaw-dev-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--public-key-base64&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/openclaw-dev-key.pub&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate that the key pair exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lightsail get-key-pairs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"keyPairs[?name=='openclaw-dev-key'].name"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;

&lt;p&gt;Generate the key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-keygen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rsa&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PEM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openclaw-lightsail"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import it into Lightsail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key.pub"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lightsail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;import-key-pair&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--key-pair-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;openclaw-dev-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--public-key-base64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lightsail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get-key-pairs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keyPairs[?name=='openclaw-dev-key'].name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Bootstrap CDK
&lt;/h2&gt;

&lt;p&gt;You only need to bootstrap once per AWS account and region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/bootstrap &amp;lt;ACCOUNT_ID&amp;gt; &amp;lt;REGION&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\bootstrap.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AccountId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;REGION&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Run synth and diff
&lt;/h2&gt;

&lt;p&gt;Before deploying, it is a good idea to synthesize the CloudFormation template and review the changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/synth
./scripts/linux-mac/dev/diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\synth.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\scripts\windows\dev\diff.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The diff step helps you review what CDK is going to create, update, or remove before applying the deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Deploy
&lt;/h2&gt;

&lt;p&gt;Now deploy the stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\deploy.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the deployment finishes, you should see outputs such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;InstanceName&lt;/li&gt;
&lt;li&gt;StaticIpName&lt;/li&gt;
&lt;li&gt;PublicIp&lt;/li&gt;
&lt;li&gt;BedrockRoleArn&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Verify that everything is running
&lt;/h2&gt;

&lt;p&gt;Connect to the instance using SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/openclaw-dev-key ubuntu@&amp;lt;PUBLIC_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ubuntu&lt;/span&gt;&lt;span class="err"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PUBLIC_IP&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run a quick check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;http://&amp;lt;PUBLIC_IP&amp;gt;&lt;/code&gt; in your browser&lt;/li&gt;
&lt;li&gt;Verify the instance in the Lightsail console&lt;/li&gt;
&lt;li&gt;Confirm that the Bedrock IAM role exists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, your OpenClaw deployment should be up and running on AWS Lightsail.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Destroy the stack when you are done
&lt;/h2&gt;

&lt;p&gt;If this is just a test environment, do not forget to destroy the resources when you finish to avoid unnecessary costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\destroy.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;The KeyPair does not exist&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This usually means one of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The key pair was not created or imported into Lightsail&lt;/li&gt;
&lt;li&gt;The key pair exists in another region&lt;/li&gt;
&lt;li&gt;The key pair is an EC2 key pair instead of a Lightsail key pair&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To fix it, create or import the key pair in Lightsail and make sure it is in the correct AWS region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack stuck in &lt;code&gt;ROLLBACK_COMPLETE&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If the stack failed and ended in &lt;code&gt;ROLLBACK_COMPLETE&lt;/code&gt;, delete the failed stack and deploy again.&lt;/p&gt;

&lt;h3&gt;
  
  
  CDK Node.js warning
&lt;/h3&gt;

&lt;p&gt;If CDK shows a warning related to Node.js, make sure you are using Node.js 22 LTS.&lt;/p&gt;

&lt;p&gt;If you use nvm, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm use
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The main idea behind this project is not only to deploy an instance.&lt;/p&gt;

&lt;p&gt;The real value is having a repeatable deployment process that does not depend on lost notes, forgotten manual steps, or one-time console configurations.&lt;/p&gt;

&lt;p&gt;With AWS CDK, Python, uv, and Lightsail, you can keep the setup simple while still applying Infrastructure as Code practices from the beginning.&lt;/p&gt;

&lt;p&gt;This makes the deployment easier to reproduce, easier to destroy, and easier to improve over time.&lt;/p&gt;

</description>
      <category>python</category>
      <category>awscdk</category>
      <category>openclaw</category>
      <category>aws</category>
    </item>
    <item>
      <title>Desplegar OpenClaw en AWS Lightsail sin sufrir 😎</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:09:45 +0000</pubDate>
      <link>https://dev.to/chainiz/desplegar-openclaw-en-aws-lightsail-sin-sufrir-7lh</link>
      <guid>https://dev.to/chainiz/desplegar-openclaw-en-aws-lightsail-sin-sufrir-7lh</guid>
      <description>&lt;p&gt;Si deseas desplegar OpenClaw en AWS Lightsail de manera simple, sencilla, repetible y sin pelear con pasos manuales, una buena opción es usar &lt;em&gt;AWS CDK + Python + uv&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;En este tutorial te muestro cómo levantar toda la infraestructura con Infrastructure as Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🦀 OpenClaw + AWS Lightsail + IaC&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué automatizar esto?
&lt;/h2&gt;

&lt;p&gt;Porque hacerlo a mano una vez está bien, pero repetirlo muchas veces es &lt;em&gt;"pesado"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Con IaC (Infrastructure as Code) ganas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos errores humanos&lt;/li&gt;
&lt;li&gt;Despliegues consistentes&lt;/li&gt;
&lt;li&gt;Repetibilidad total (crear y destruir cuando quieras)&lt;/li&gt;
&lt;li&gt;Más velocidad para tu equipo&lt;/li&gt;
&lt;li&gt;Todo versionado en Git&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Que crea este stack o proyecto?
&lt;/h2&gt;

&lt;p&gt;Tu infraestructura en Lightsail con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instancia OpenClaw (&lt;code&gt;openclaw_ls_1_0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Puertos públicos &lt;code&gt;22&lt;/code&gt;, &lt;code&gt;80&lt;/code&gt;, &lt;code&gt;443&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;IP estática pública de Lightsail&lt;/li&gt;
&lt;li&gt;Snapshots opcionales&lt;/li&gt;
&lt;li&gt;Automatización de rol IAM para Bedrock&lt;/li&gt;
&lt;li&gt;Asociación/desasociación automática de la IP estática pública durante el ciclo de vida del stack&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pre requisitos rápidos
&lt;/h2&gt;

&lt;p&gt;Necesitas tener instalado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python &lt;code&gt;3.11+&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;uv (Gestor de paquetes y proyectos)&lt;/li&gt;
&lt;li&gt;Node.js &lt;code&gt;22 LTS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AWS CLI v2&lt;/li&gt;
&lt;li&gt;AWS CDK CLI (&lt;code&gt;npm i -g aws-cdk&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  0) Clona el repositorio
&lt;/h2&gt;

&lt;p&gt;Clonar el repositorio de github del proyecto &lt;a href="https://github.com/r3xakead0/aws-cdk-lightsail-openclaw" rel="noopener noreferrer"&gt;aws-cdk-lightsail-openclaw&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/r3xakead0/aws-cdk-lightsail-openclaw.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-cdk-lightsail-openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1) Prepara el entorno local
&lt;/h2&gt;

&lt;p&gt;Antes de sintetizar o desplegar el stack, prepara tu entorno local instalando las dependencias del proyecto y validando que tus credenciales de AWS estén configuradas correctamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifica las versiones instaladas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
uv &lt;span class="nt"&gt;--version&lt;/span&gt;
node &lt;span class="nt"&gt;--version&lt;/span&gt;
aws &lt;span class="nt"&gt;--version&lt;/span&gt;
cdk &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Asegúrate de tener:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;uv instalado&lt;/li&gt;
&lt;li&gt;Node.js 22 LTS&lt;/li&gt;
&lt;li&gt;AWS CLI v2&lt;/li&gt;
&lt;li&gt;AWS CDK CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instala las dependencias del proyecto
&lt;/h3&gt;

&lt;p&gt;Desde la raíz del repositorio, ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configura tus credenciales de AWS
&lt;/h3&gt;

&lt;p&gt;Si todavía no tienes credenciales configuradas, ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ingresa tu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Access Key ID&lt;/li&gt;
&lt;li&gt;AWS Secret Access Key&lt;/li&gt;
&lt;li&gt;Default region, por ejemplo us-east-1&lt;/li&gt;
&lt;li&gt;Default output format, por ejemplo json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si usas perfiles de AWS, puedes exportar el perfil antes de continuar:&lt;/p&gt;

&lt;p&gt;macOS/Linux&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;TU_PROFILE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows PowerShell&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TU_PROFILE&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Valida el acceso a AWS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberías ver una salida similar a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456789012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::123456789012:user/your-user"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2) Revisa el archivo de configuración
&lt;/h2&gt;

&lt;p&gt;Archivo: &lt;code&gt;config/dev.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Asegúrate de validar estos campos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;región&lt;/code&gt; (ej. &lt;code&gt;us-east-1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;availability_zone&lt;/code&gt; (ej. &lt;code&gt;us-east-1a&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;key_pair_name&lt;/code&gt; (ej. &lt;code&gt;openclaw-dev-key&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh_cidr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enable_auto_snapshot&lt;/code&gt; (&lt;code&gt;false&lt;/code&gt; por defecto)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3) Crea/importa el key pair en Lightsail
&lt;/h2&gt;

&lt;p&gt;Importante: tiene que ser de Lightsail (no EC2) y en la misma region especificada en el archivo de configuración.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS/Linux
&lt;/h3&gt;

&lt;p&gt;Genera la clave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-m&lt;/span&gt; PEM &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/openclaw-dev-key &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"openclaw-lightsail"&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/openclaw-dev-key
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/openclaw-dev-key.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Impórtala:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lightsail import-key-pair &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-pair-name&lt;/span&gt; openclaw-dev-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--public-key-base64&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/openclaw-dev-key.pub&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valídala:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lightsail get-key-pairs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"keyPairs[?name=='openclaw-dev-key'].name"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;

&lt;p&gt;Genera la clave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-keygen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rsa&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PEM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openclaw-lightsail"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Impórtala:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key.pub"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lightsail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;import-key-pair&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--key-pair-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;openclaw-dev-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--public-key-base64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valídala:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lightsail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get-key-pairs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keyPairs[?name=='openclaw-dev-key'].name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4) Bootstrap (solo una vez por cuenta/region)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/bootstrap &amp;lt;ACCOUNT_ID&amp;gt; &amp;lt;REGION&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\bootstrap.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AccountId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;REGION&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5) Synth + Diff (para revisar antes de desplegar)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/synth
./scripts/linux-mac/dev/diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\synth.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\scripts\windows\dev\diff.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6) Deploy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\deploy.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando termine, verás outputs como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;InstanceName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StaticIpName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PublicIp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BedrockRoleArn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7) Verifica que todo este vivo
&lt;/h2&gt;

&lt;p&gt;Conéctate por SSH:&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/openclaw-dev-key ubuntu@&amp;lt;PUBLIC_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="bp"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;\.ssh\openclaw-dev-key"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ubuntu&lt;/span&gt;&lt;span class="err"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PUBLIC_IP&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chequeo rápido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;abre &lt;code&gt;http://&amp;lt;PUBLIC_IP&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;revisa la instancia en consola de Lightsail&lt;/li&gt;
&lt;li&gt;confirma que el rol de Bedrock existe en IAM&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8) Destroy cuando termines (para no gastar de mas)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/linux-mac/dev/destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows PowerShell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\scripts\windows\dev\destroy.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución de problemas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;The KeyPair does not exist&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;El key pair no esta en Lightsail, esta en otra region o es de EC2.&lt;/li&gt;
&lt;li&gt;Solución: crealo/importalo en Lightsail y en la region correcta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stack en &lt;code&gt;ROLLBACK_COMPLETE&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Borra el stack fallido y vuelve a desplegar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Warning de Node en CDK
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ejecuta &lt;code&gt;nvm use&lt;/code&gt; para usar Node 22 LTS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;La idea no es solo desplegar una instancia, sino dejar el proceso listo para repetirse sin depender de pasos manuales ni configuraciones perdidas.&lt;/p&gt;

</description>
      <category>python</category>
      <category>awscdk</category>
      <category>openclaw</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Instalación de JFrog Artifactory OSS en Ubuntu 22.04 (Jammy) + PostgreSQL - Guia Completa</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Fri, 06 Feb 2026 13:58:22 +0000</pubDate>
      <link>https://dev.to/chainiz/instalacion-de-jfrog-artifactory-oss-en-ubuntu-2204-jammy-postgresql-guia-completa-7dc</link>
      <guid>https://dev.to/chainiz/instalacion-de-jfrog-artifactory-oss-en-ubuntu-2204-jammy-postgresql-guia-completa-7dc</guid>
      <description>&lt;p&gt;Tutorial paso a paso para instalar &lt;strong&gt;JFrog Artifactory OSS&lt;/strong&gt; en &lt;strong&gt;Ubuntu 22.04 (Jammy)&lt;/strong&gt; usando &lt;strong&gt;PostgreSQL&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Nota: Este setup no está pensado para producción. Cambia contraseñas, restringe accesos y revisa backups/SSL antes de usarlo en entornos reales.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Contenido
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Requisitos&lt;/li&gt;
&lt;li&gt;Arquitectura&lt;/li&gt;
&lt;li&gt;0. Preparación de Ubuntu 22.04 (Jammy)&lt;/li&gt;
&lt;li&gt;1. Base de datos PostgreSQL&lt;/li&gt;
&lt;li&gt;2. Instalar Artifactory OSS&lt;/li&gt;
&lt;li&gt;3. Configurar Artifactory OSS para usar PostgreSQL&lt;/li&gt;
&lt;li&gt;4. Iniciar Artifactory&lt;/li&gt;
&lt;li&gt;5. Abrir puertos (firewall)&lt;/li&gt;
&lt;li&gt;6. Entrar a la UI y credenciales por defecto&lt;/li&gt;
&lt;li&gt;Comandos útiles&lt;/li&gt;
&lt;li&gt;Referencias&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;VM con &lt;strong&gt;Ubuntu 22.04 (Jammy)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Acceso &lt;strong&gt;sudo&lt;/strong&gt; (superusuario)&lt;/li&gt;
&lt;li&gt;Conectividad a internet para bajar paquetes&lt;/li&gt;
&lt;li&gt;Puertos abiertos en firewall (al menos &lt;strong&gt;8082&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Arquitectura
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faion4mg95fwz3x53gcda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faion4mg95fwz3x53gcda.png" alt="Diagram" width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  0. Preparación de Ubuntu 22.04 (Jammy)
&lt;/h2&gt;

&lt;p&gt;Confirmar que estás en Jammy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsb_release &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt8giced7v5vrmy3f3r6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt8giced7v5vrmy3f3r6.png" alt="lsb_release" width="354" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;o&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8i2tyoamihde2mb8rer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8i2tyoamihde2mb8rer.png" alt="os-release" width="751" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Actualizar librerías:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. Base de datos PostgreSQL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Instalar PostgreSQL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; postgresql postgresql-contrib
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; postgresql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status postgresql &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 Crear la base de datos y usuario para Artifactory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; postgres psql &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;&lt;span class="sh"&gt;'
CREATE USER artifactory WITH PASSWORD 'ArtifactoryDemo123!';
CREATE DATABASE artifactory OWNER artifactory ENCODING 'UTF8';
GRANT ALL PRIVILEGES ON DATABASE artifactory TO artifactory;
&lt;/span&gt;&lt;span class="no"&gt;SQL
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Recomendación: cambia esta contraseña si la VM no es 100% privada.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Instalar Artifactory OSS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Agregar repositorio + key
&lt;/h3&gt;

&lt;p&gt;Agregar el repo OSS (para Jammy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://releases.jfrog.io/artifactory/artifactory-debs jammy main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agregar la key GPG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-qO&lt;/span&gt; - https://releases.jfrog.io/artifactory/api/gpg/key/public | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Instalar Artifactory OSS (Open Source)
&lt;/h3&gt;

&lt;p&gt;JFrog recomienda tener &lt;code&gt;net-tools&lt;/code&gt; como prerequisito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; net-tools
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; jfrog-artifactory-oss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Configurar Artifactory OSS para usar PostgreSQL
&lt;/h2&gt;

&lt;p&gt;La configuración principal está en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;JFROG_HOME&lt;/code&gt; por defecto: &lt;code&gt;/opt/jfrog&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Archivo: &lt;code&gt;/opt/jfrog/artifactory/var/etc/system.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.1 Detener Artifactory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop artifactory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Editar &lt;code&gt;system.yaml&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Abrir el archivo &lt;code&gt;system.yaml&lt;/code&gt; con editor VIM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /opt/jfrog/artifactory/var/etc/system.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agregar/ajustar esta sección &lt;code&gt;shared&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;org.postgresql.Driver&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jdbc:postgresql://127.0.0.1:5432/artifactory&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;artifactory&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ArtifactoryDemo123!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Iniciar Artifactory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start artifactory.service
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status artifactory.service &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ver logs si hace falta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; artifactory &lt;span class="nt"&gt;-n&lt;/span&gt; 200 &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Abrir puertos (firewall)
&lt;/h2&gt;

&lt;p&gt;Para la UI normalmente se usa &lt;strong&gt;8082&lt;/strong&gt; (y a veces &lt;strong&gt;8081&lt;/strong&gt; según el setup). Para este caso, abre al menos &lt;strong&gt;8082&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 8082/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Entrar a la UI y credenciales por defecto
&lt;/h2&gt;

&lt;p&gt;Abrir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://&amp;lt;TU_IP&amp;gt;:8082/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://&amp;lt;TU_IP&amp;gt;:8082/ui/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Login directo: &lt;code&gt;http://&amp;lt;TU_IP&amp;gt;:8082/ui/login&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Credenciales por defecto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;admin / password&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Cambia la contraseña apenas puedas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Fix rápido (OSS): deshabilitar jfconnect (workaround login “stuck”)
&lt;/h3&gt;

&lt;p&gt;Si al iniciar sesión el botón queda inactivo o se “queda pegado” el login (reportado en OSS 7.125.x), aplica este workaround:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edita:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /opt/jfrog/artifactory/var/etc/system.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Agrega esto a nivel raíz (top-level), NO dentro de &lt;code&gt;shared&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jfconnect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reinicia:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart artifactory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Prueba de nuevo: http://:8082/ui/ o http://:8082/ui/login&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comandos útiles
&lt;/h2&gt;

&lt;p&gt;Estado del servicio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status artifactory &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs recientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; artifactory &lt;span class="nt"&gt;-n&lt;/span&gt; 200 &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reiniciar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart artifactory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifica que el puertos está escuchando y en qué interfaz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-lntp&lt;/span&gt; | egrep &lt;span class="s1"&gt;':8081|:8082'&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://127.0.0.1:8082/ | &lt;span class="nb"&gt;head
&lt;/span&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://127.0.0.1:8081/ | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JFrog Platform Installation Documentation: &lt;a href="https://jfrog.com/help/r/jfrog-platform-installation-documentation" rel="noopener noreferrer"&gt;https://jfrog.com/help/r/jfrog-platform-installation-documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install Artifactory on Debian/Ubuntu (APT): &lt;a href="https://jfrog.com/help/r/jfrog-installation-setup-documentation/install-artifactory-on-debian" rel="noopener noreferrer"&gt;https://jfrog.com/help/r/jfrog-installation-setup-documentation/install-artifactory-on-debian&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Documentation: &lt;a href="https://www.postgresql.org/docs/" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ubuntu</category>
      <category>postgres</category>
      <category>jfrog</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Implementar un sitio web estático en Cloudflare Pages usando Terraform y Wrangler CLI</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Sun, 25 Jan 2026 22:58:01 +0000</pubDate>
      <link>https://dev.to/chainiz/implementar-un-sitio-web-estatico-en-cloudflare-pages-usando-terraform-y-wrangler-cli-b70</link>
      <guid>https://dev.to/chainiz/implementar-un-sitio-web-estatico-en-cloudflare-pages-usando-terraform-y-wrangler-cli-b70</guid>
      <description>&lt;p&gt;En este tutorial, aprenderá a implementar un sitio web estático en &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; usando &lt;strong&gt;Terraform&lt;/strong&gt; para el aprovisionamiento de infraestructura y &lt;strong&gt;Wrangler CLI&lt;/strong&gt; para la implementación manual.&lt;/p&gt;

&lt;p&gt;Este enfoque le permite administrar su proyecto de Cloudflare Pages como Infraestructura como Código (IaC), manteniendo un proceso de implementación simple y flexible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Qué aprenderás
&lt;/h2&gt;

&lt;p&gt;Al finalizar este tutorial, podrás:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aprovisionar un proyecto de Cloudflare Pages con Terraform&lt;/li&gt;
&lt;li&gt;Implementar un sitio web estático con la CLI de Wrangler&lt;/li&gt;
&lt;li&gt;Configurar un dominio personalizado (opcional)&lt;/li&gt;
&lt;li&gt;Administrar tu infraestructura de forma limpia y reproducible&lt;/li&gt;
&lt;li&gt;Destruir todos los recursos de forma segura cuando ya no sean necesarios&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ¿Por qué Cloudflare Pages + Terraform?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt; ofrece una plataforma rápida, global y sin servidor para alojar sitios web estáticos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt; te permite definir y versionar tu infraestructura, lo que garantiza la consistencia y repetibilidad de tus implementaciones.&lt;/p&gt;

&lt;p&gt;La combinación de ambas herramientas te ofrece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infraestructura como Código&lt;/li&gt;
&lt;li&gt;CDN global rápida&lt;/li&gt;
&lt;li&gt;Implementación sencilla de sitios estáticos&lt;/li&gt;
&lt;li&gt;Gestión sencilla de dominios&lt;/li&gt;
&lt;li&gt;Separación clara entre infraestructura y aplicación&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Requisitos Previos
&lt;/h2&gt;

&lt;p&gt;Antes de comenzar, asegúrese de tener:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; instalado (versión 1.10.0 o superior)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuenta de Cloudflare&lt;/strong&gt; con acceso a Pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Token de Cloudflare&lt;/strong&gt; con permisos de Cloudflare Pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js y npm&lt;/strong&gt; instalados (para Wrangler CLI)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Estructura del Proyecto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflare-tf-staticweb/
└── infrastructure/           # Carpeta con archivos terraform
    ├── main.tf               # Configuración de Terraform
    ├── providers.tf          # Configuración de providers
    ├── variables.tf          # Definición de variables
    ├── cloudflare.tf         # Recursos de Cloudflare Pages
    ├── outputs.tf            # Outputs del proyecto
    ├── terraform.tfvars      # Variables (no versionar)
└── website/                  # Carpeta con el sitio web estático
    └── index.html            # Contiene el HTLM de la página principal
    └── styles.css            # Contiene el CSS de la página principal
    └── script.js             # Contiene el JS de la página principal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Variables
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;th&gt;Requerida&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cloudflare_api_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API Token de Cloudflare&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cloudflare_account_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account ID de Cloudflare&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nombre del proyecto&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;"my-website"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;custom_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dominio personalizado&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;""&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Configuración Inicial
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Crear el Proyecto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear la estructura de carpetas&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;cloudflare-tf-staticweb
&lt;span class="nb"&gt;cd &lt;/span&gt;cloudflare-tf-staticweb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configurar la Infraestructura
&lt;/h3&gt;

&lt;p&gt;En la carpeta "cloudflare-tf-staticweb"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear la carpeta de la infraestructura&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;infrastructure

&lt;span class="c"&gt;# Accede a la carpeta infraestructura&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "main.tf"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; main.tf
terraform {
  required_version = "&amp;gt;= 1.10.0"

  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "~&amp;gt; 4.0"
    }
  }
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "provider.tf"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; provider.tf
provider "cloudflare" {
  api_token = var.cloudflare_api_token
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "variables.tf"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; variables.tf
variable "cloudflare_api_token" {
  description = "The API token for Cloudflare account"
  type        = string
  sensitive   = true
}

variable "cloudflare_account_id" {
  description = "Cloudflare Account ID (visible on dashboard)"
  type        = string
}

variable "project_name" {
  description = "Project name in Cloudflare Pages"
  type        = string
  default     = "my-website"
}

variable "custom_domain" {
  description = "Custom domain (optional, leave blank if not used)"
  type        = string
  default     = ""
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "outputs.tf"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; outputs.tf
output "pages_project_url" {
  description = "Full URL of the Cloudflare Pages project"
  value       = "https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cloudflare_pages_project&lt;/span&gt;&lt;span class="p"&gt;.website.subdomain&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"
}

output "pages_project_subdomain" {
  description = "Subdomain assigned by Cloudflare Pages"
  value       = cloudflare_pages_project.website.subdomain
}

output "project_id" {
  description = "Cloudflare project ID"
  value       = cloudflare_pages_project.website.id
}

output "project_name" {
  description = "Project Name"
  value       = cloudflare_pages_project.website.name
}

output "custom_domain_url" {
  description = "Custom domain URL (if configured)"
  value       = var.custom_domain != "" ? "https://&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.custom_domain&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;" : "Not configured"
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "cloudflare.tf"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; cloudflare.tf
resource "cloudflare_pages_project" "website" {
  account_id        = var.cloudflare_account_id
  name              = var.project_name
  production_branch = "main"

  build_config {
    build_command   = ""        # No build required for static HTML
    destination_dir = "website" # Folder containing index.html
    root_dir        = ""        # Repository root
  }

  # Environment variables (if needed in the future)
  deployment_configs {
    production {
      environment_variables = {
        ENVIRONMENT = "production"
      }
    }

    preview {
      environment_variables = {
        ENVIRONMENT = "preview"
      }
    }
  }

}

# Custom domain (optional)
resource "cloudflare_pages_domain" "custom_domain" {
  count        = var.custom_domain != "" ? 1 : 0
  account_id   = var.cloudflare_account_id
  project_name = cloudflare_pages_project.website.name
  domain       = var.custom_domain
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Configurar la pagina web
&lt;/h3&gt;

&lt;p&gt;En la carpeta "cloudflare-tf-staticweb"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear la carpeta del sitio web&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;website

&lt;span class="c"&gt;# Accede a la del sitio web&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "index.html"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.html &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Simple Web App&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" href="styles.css"&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;h1 id="greeting"&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;
        &amp;lt;input type="text" id="nameInput" placeholder="Enter your name"&amp;gt;
        &amp;lt;button id="updateBtn"&amp;gt;Update Greeting&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src="script.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "styles.css"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; styles.css &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}

.container {
    background: white;
    padding: 2rem;
    border-radius: 10px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
    text-align: center;
    max-width: 400px;
    width: 90%;
}

h1 {
    color: #333;
    margin-bottom: 1.5rem;
    font-size: 2rem;
}

input {
    padding: 0.8rem;
    width: 100%;
    margin-bottom: 1rem;
    border: 2px solid #ddd;
    border-radius: 5px;
    font-size: 1rem;
}

input:focus {
    outline: none;
    border-color: #2575fc;
}

button {
    background: #2575fc;
    color: white;
    border: none;
    padding: 0.8rem 1.5rem;
    border-radius: 5px;
    cursor: pointer;
    font-size: 1rem;
    transition: background 0.3s;
}

button:hover {
    background: #1a68e8;
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "script.js"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; script.js &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
// Get DOM elements
const greetingElement = document.getElementById('greeting');
const nameInput = document.getElementById('nameInput');
const updateButton = document.getElementById('updateBtn');

// Update greeting when button is clicked
updateButton.addEventListener('click', () =&amp;gt; {
    const name = nameInput.value.trim();

    if (name) {
        greetingElement.textContent = `Hello, &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;!`;
        nameInput.value = ''; // Clear input
    } else {
        greetingElement.textContent = 'Please enter your name!';
        setTimeout(() =&amp;gt; {
            greetingElement.textContent = 'Hello, World!';
        }, 2000);
    }
});

// Also update on Enter key press
nameInput.addEventListener('keypress', (e) =&amp;gt; {
    if (e.key === 'Enter') {
        updateButton.click();
    }
});
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Obtener tu Account ID en Cloudflare
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ve al &lt;a href="https://dash.cloudflare.com" rel="noopener noreferrer"&gt;Cloudflare Dashboard&lt;/a&gt; → Account Home&lt;/li&gt;
&lt;li&gt;Click en los 3 puntos la lado del &lt;strong&gt;"Account Name"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click en &lt;strong&gt;"Copy account ID"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnh3hjldt9o9pbdux5n0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnh3hjldt9o9pbdux5n0.png" alt="Get Account ID" width="612" height="190"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5. Crear API Token en Cloudflare
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ve a &lt;a href="https://dash.cloudflare.com" rel="noopener noreferrer"&gt;Cloudflare Dashboard&lt;/a&gt; → Manage Account → Account API Tokens&lt;/li&gt;
&lt;li&gt;Click en &lt;strong&gt;"Create Token"&lt;/strong&gt; → &lt;strong&gt;"Create Custom Token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configura los permisos necesarios:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token name: Terraform Cloudflare Pages

Permissions:
├── Account
│   ├── Cloudflare Pages → Edit
│   └── Account Settings → Read
└── Zone (opcional, solo si usas dominio personalizado)
    └── DNS → Edit

Zone Resources:
└── Include → All zones from an account → Your_Account
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kznsv0q49mq7cmpajw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kznsv0q49mq7cmpajw6.png" alt="Create Custom Token" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click en &lt;strong&gt;"Continue to summary"&lt;/strong&gt; → &lt;strong&gt;"Create Token"&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Copia el token&lt;/strong&gt; inmediatamente (solo se muestra una vez)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  6. Actualizar Configuración
&lt;/h3&gt;

&lt;p&gt;Crear el archivos de variables y asignar los valores&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cloudflare_account_id&lt;/strong&gt; obtenido del paso 4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cloudflare_api_token&lt;/strong&gt; obtenido del paso 5
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crear el archivo "terraform.tfvars"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; terraform.tfvars
# Cloudflare Account ID
cloudflare_account_id = "your-account-id-here"


# Cloudflare API Token
cloudflare_api_token = "your-token"

# Project name
project_name = "my-website"

# Custom domain (optional, leave blank if not used)
custom_domain = ""
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crear la Infraestructura con Terraform
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Accede a la carpeta infraestructura
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Inicializar Terraform
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Validar la configuración
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform validate
terraform &lt;span class="nb"&gt;fmt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Planificar cambios
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Aplicar cambios
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto creará el proyecto de Cloudflare Pages, pero aún no habrá contenido desplegado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ver outputs
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Desplegar el Sitio Web con Wrangler
&lt;/h3&gt;

&lt;p&gt;Una vez que Terraform haya creado el proyecto, despliega tu sitio:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Instalar Wrangler (solo la primera vez)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; wrangler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Autenticar con Cloudflare
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wrangler login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto abrirá un navegador para que autorices Wrangler.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Desplegar el sitio
&lt;/h4&gt;

&lt;p&gt;Desde la raíz del proyecto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wrangler pages deploy website &lt;span class="nt"&gt;--project-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Reemplaza &lt;code&gt;my-website&lt;/code&gt; con el valor de tu variable &lt;code&gt;project_name&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4. Verificar el despliegue
&lt;/h4&gt;

&lt;p&gt;Visita la URL mostrada en el output de Terraform o en el resultado del comando deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform output pages_project_url

pages_project_url &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://my-website-xxx.pages.dev"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnfyk6whqr5aduakkayc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnfyk6whqr5aduakkayc.png" alt="website" width="717" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Despliegues Futuros
&lt;/h3&gt;

&lt;p&gt;Para actualizar tu sitio después de hacer cambios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Edita tus archivos en website/&lt;/li&gt;
&lt;li&gt;Despliega de nuevo
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wrangler pages deploy website &lt;span class="nt"&gt;--project-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Reemplaza &lt;code&gt;my-website&lt;/code&gt; con el valor de tu variable &lt;code&gt;project_name&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Dominio Personalizado
&lt;/h2&gt;

&lt;p&gt;Para agregar un dominio personalizado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Actualiza &lt;code&gt;terraform.tfvars&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;custom_domain&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"www.tudominio.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Asegúrate de que el dominio esté en Cloudflare&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aplica los cambios&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Destruir Recursos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy &lt;span class="nt"&gt;-auto-approve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Recursos Adicionales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs" rel="noopener noreferrer"&gt;Documentación de Terraform Cloudflare Provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/pages/" rel="noopener noreferrer"&gt;Documentación de Cloudflare Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/workers/wrangler/" rel="noopener noreferrer"&gt;Wrangler CLI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloudflare</category>
      <category>terraform</category>
      <category>infrastructureascode</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Valkey vs Redis – Explicación simple y practica</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Thu, 08 Jan 2026 21:59:36 +0000</pubDate>
      <link>https://dev.to/chainiz/valkey-vs-redis-explicacion-simple-y-practica-lai</link>
      <guid>https://dev.to/chainiz/valkey-vs-redis-explicacion-simple-y-practica-lai</guid>
      <description>&lt;h2&gt;
  
  
  🔑 ¿Qué es Valkey?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Valkey&lt;/strong&gt; es un &lt;strong&gt;fork open-source de Redis&lt;/strong&gt;, creado en &lt;strong&gt;2024&lt;/strong&gt;, totalmente compatible, creado tras el cambio de licencia de Redis para mantener una alternativa 100% open source y &lt;strong&gt;respaldado por la Linux Foundation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Surge como respuesta al &lt;strong&gt;cambio de licencia de Redis&lt;/strong&gt; (Redis ≥ 7.4), que dejó de ser open source bajo los estándares de la OSI.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Objetivo de Valkey&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mantener un Redis &lt;strong&gt;100% open source&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Compatibilidad total con Redis (comandos, protocolo, clientes)&lt;/li&gt;
&lt;li&gt;Gobernanza comunitaria y neutral&lt;/li&gt;
&lt;li&gt;Sin vendor lock-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En la práctica:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Valkey es Redis, pero con licencia abierta y desarrollo comunitario.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 ¿Para qué sirve Valkey?
&lt;/h2&gt;

&lt;p&gt;Exactamente los mismos casos de uso que Redis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache in-memory&lt;/li&gt;
&lt;li&gt;Session store&lt;/li&gt;
&lt;li&gt;Pub/Sub&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Distributed locks&lt;/li&gt;
&lt;li&gt;Streams&lt;/li&gt;
&lt;li&gt;Leaderboards&lt;/li&gt;
&lt;li&gt;Replication&lt;/li&gt;
&lt;li&gt;Persistence (RDB / AOF)&lt;/li&gt;
&lt;li&gt;Redis Cluster&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚖️ Valkey vs Redis (comparación rápida)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Valkey&lt;/th&gt;
&lt;th&gt;Redis (≥ 7.4)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;✅ Open Source (BSD/Apache-style)&lt;/td&gt;
&lt;td&gt;❌ RSAL / SSPL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gobernanza&lt;/td&gt;
&lt;td&gt;Linux Foundation&lt;/td&gt;
&lt;td&gt;Redis Inc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compatibilidad&lt;/td&gt;
&lt;td&gt;100% Redis&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso comercial&lt;/td&gt;
&lt;td&gt;✅ Libre&lt;/td&gt;
&lt;td&gt;⚠️ Restricciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor lock-in&lt;/td&gt;
&lt;td&gt;❌ Bajo&lt;/td&gt;
&lt;td&gt;⚠️ Mayor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud friendly&lt;/td&gt;
&lt;td&gt;✅ Sí&lt;/td&gt;
&lt;td&gt;⚠️ Limitado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soporte K8s&lt;/td&gt;
&lt;td&gt;✅ Excelente&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 La licencia: el punto clave
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redis hoy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Licencia RSAL / SSPL&lt;/li&gt;
&lt;li&gt;No considerada open source por la OSI&lt;/li&gt;
&lt;li&gt;Restricciones para SaaS y cloud providers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Valkey
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open source real&lt;/li&gt;
&lt;li&gt;Uso comercial sin restricciones&lt;/li&gt;
&lt;li&gt;Ideal para empresas, educación y gobiernos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por eso &lt;strong&gt;AWS, Google, Oracle y otros proveedores apoyan Valkey&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Demo 1 – Valkey local con Docker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; valkey &lt;span class="nt"&gt;-p&lt;/span&gt; 6379:6379 valkey/valkey:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv4ubt3ek2u9tlgrmu4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv4ubt3ek2u9tlgrmu4m.png" alt="docker run" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prueba rápida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli ping
&lt;span class="c"&gt;# PONG&lt;/span&gt;

redis-cli &lt;span class="nb"&gt;set &lt;/span&gt;demo &lt;span class="s2"&gt;"hola valkey"&lt;/span&gt;
redis-cli get demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foi7szg2kyzmph654qev2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foi7szg2kyzmph654qev2.png" alt="redis-cli" width="696" height="214"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Demo 2 – Pub/Sub
&lt;/h2&gt;

&lt;p&gt;Terminal A:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli subscribe events
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekf2dsemgylimldveovh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekf2dsemgylimldveovh.png" alt="redis-cli subscribe" width="626" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal B:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli publish events &lt;span class="s2"&gt;"mensaje desde valkey"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0mxmc7mia608oqrvk9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0mxmc7mia608oqrvk9g.png" alt="redis-cli publish" width="800" height="69"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal A:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze1a4mrplzsnypa3bjwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze1a4mrplzsnypa3bjwn.png" alt="redis-cli subscribe result" width="630" height="288"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  ☸️ Demo 3 – Valkey en Kubernetes
&lt;/h2&gt;

&lt;p&gt;Crear el archivo "valkey.yaml"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Namespace&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Headless Service required by StatefulSet&lt;/span&gt;
  &lt;span class="na"&gt;clusterIP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;None&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6379&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6379&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;StatefulSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey/valkey:latest&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
              &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6379&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/data&lt;/span&gt;
          &lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;tcpSocket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6379&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
          &lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;tcpSocket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6379&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;volumeClaimTemplates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
      &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ReadWriteOnce&lt;/span&gt;
        &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1Gi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desplegar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; valkey.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acceso desde un pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; vcli &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis:7 &lt;span class="nt"&gt;--&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecuta el ping para validar conexion&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli &lt;span class="nt"&gt;-h&lt;/span&gt; valkey.demo.svc.cluster.local ping
PONG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Código fuente : &lt;a href="https://github.com/r3xakead0/k8s-valkey-demo" rel="noopener noreferrer"&gt;k8s-valkey-demo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔄 ¿Tengo que cambiar código si vengo de Redis?
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;No.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mismos comandos&lt;/li&gt;
&lt;li&gt;Mismo protocolo RESP&lt;/li&gt;
&lt;li&gt;Mismos clientes (&lt;code&gt;redis-cli&lt;/code&gt;, &lt;code&gt;node-redis&lt;/code&gt;, &lt;code&gt;ioredis&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo cambia la imagen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;valkey/valkey&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Conclusión
&lt;/h2&gt;

&lt;p&gt;Si estás construyendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;SaaS&lt;/li&gt;
&lt;li&gt;Plataformas cloud&lt;/li&gt;
&lt;li&gt;Proyectos open source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Valkey es la opción recomendada hoy&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>redis</category>
      <category>valkey</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Develop Kubernetes Services Locally (Yes, Really) with Telepresence</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Wed, 07 Jan 2026 19:19:26 +0000</pubDate>
      <link>https://dev.to/chainiz/develop-kubernetes-services-locally-yes-really-with-telepresence-16pg</link>
      <guid>https://dev.to/chainiz/develop-kubernetes-services-locally-yes-really-with-telepresence-16pg</guid>
      <description>&lt;h2&gt;
  
  
  🚀 What is Telepresence?
&lt;/h2&gt;

&lt;p&gt;Telepresence￼is a development tool that lets you connect your local machine directly to a Kubernetes cluster — as if your app were running inside the cluster, even though it’s actually running on your laptop.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 Build, run, and debug Kubernetes services locally, without rebuilding Docker images or redeploying on every change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 What do developers use Telepresence for?
&lt;/h2&gt;

&lt;p&gt;Telepresence shines in day-to-day Kubernetes development:&lt;/p&gt;

&lt;p&gt;✅ Local development against a real cluster&lt;br&gt;
• Your application runs locally&lt;br&gt;
• But it consumes real cluster resources:&lt;br&gt;
• Services&lt;br&gt;
• ConfigMaps&lt;br&gt;
• Secrets&lt;br&gt;
• Internal APIs&lt;/p&gt;

&lt;p&gt;No mocks. No fakes. Just real infrastructure.&lt;/p&gt;

&lt;p&gt;✅ Intercepting Service traffic&lt;br&gt;
• Telepresence can intercept traffic destined for a Kubernetes Service&lt;br&gt;
• That traffic is transparently redirected to your local app&lt;/p&gt;

&lt;p&gt;From the cluster’s point of view, nothing changes.&lt;/p&gt;

&lt;p&gt;✅ Fast, comfortable debugging&lt;br&gt;
• Use local logs&lt;br&gt;
• Attach debuggers (VS Code, IntelliJ, etc.)&lt;br&gt;
• Hot reload&lt;br&gt;
• Breakpoints&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🙌 All without modifying or risking remote or production environments.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  😖 The problem Telepresence solves
&lt;/h2&gt;

&lt;p&gt;❌ Traditional Kubernetes workflow&lt;/p&gt;

&lt;p&gt;Every tiny change usually means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Modify code&lt;/li&gt;
&lt;li&gt;docker build&lt;/li&gt;
&lt;li&gt;docker push&lt;/li&gt;
&lt;li&gt;kubectl apply&lt;/li&gt;
&lt;li&gt;Wait for rollout&lt;/li&gt;
&lt;li&gt;Test&lt;/li&gt;
&lt;li&gt;Repeat 😵‍💫&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s minutes per iteration — and it kills productivity.&lt;/p&gt;



&lt;p&gt;✅ With Telepresence&lt;/p&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change code locally&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Test instantly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⏱️ Feedback in seconds, not minutes.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ How does Telepresence work?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n45x6yc2qkj49yxakt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n45x6yc2qkj49yxakt9.png" alt="flow" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High-level flow:&lt;br&gt;
 • Connects to your Kubernetes cluster&lt;br&gt;
 • Deploys a Traffic Manager (proxy)&lt;br&gt;
 • Intercepts traffic for a Service&lt;br&gt;
 • Forwards that traffic to your local machine&lt;/p&gt;

&lt;p&gt;From Kubernetes’ perspective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 Your app still exists in the cluster — it just happens to live on your local machine.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧪 Simple example
&lt;/h2&gt;

&lt;p&gt;Without Telepresence&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;Service → Pod &lt;span class="k"&gt;in &lt;/span&gt;Kubernetes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Telepresence&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;Service → your laptop &lt;span class="o"&gt;(&lt;/span&gt;localhost:9000&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else stays the same:&lt;br&gt;
• Databases&lt;br&gt;
• Other microservices&lt;br&gt;
• Secrets&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 Source code: &lt;a href="https://github.com/r3xakead0/minikube-telepresence-demo" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌟 Why you should care
&lt;/h2&gt;

&lt;p&gt;• ⚡ Much faster development cycles&lt;br&gt;
• 🧪 Real debugging against real infrastructure&lt;br&gt;
• 🛡️ Lower risk (no touching prod clusters)&lt;br&gt;
• 🧩 Perfect fit for Kubernetes &amp;amp; microservices&lt;/p&gt;

&lt;p&gt;If you work with Kubernetes daily, Telepresence can seriously change how fast — and how comfortably — you build software.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://telepresence.io/" rel="noopener noreferrer"&gt;Telepresence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>telepresence</category>
    </item>
    <item>
      <title>Ejecuta tus servicios de Kubernetes desde tu local con Telepresence</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Wed, 07 Jan 2026 18:51:56 +0000</pubDate>
      <link>https://dev.to/chainiz/ejecuta-tus-servicios-de-kubernetes-desde-tu-local-con-telepresence-c44</link>
      <guid>https://dev.to/chainiz/ejecuta-tus-servicios-de-kubernetes-desde-tu-local-con-telepresence-c44</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Telepresence?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://telepresence.io/" rel="noopener noreferrer"&gt;Telepresence&lt;/a&gt; es una herramienta de desarrollo que te permite conectar tu computadora local a un clúster de Kubernetes como si tu aplicación local estuviera corriendo dentro del cluster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En pocas palabras:&lt;br&gt;
🔥 Te deja desarrollar y depurar servicios de Kubernetes sin construir imágenes Docker ni hacer deploy cada vez.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ¿Para qué se usa Telepresence?
&lt;/h2&gt;

&lt;p&gt;Se usa principalmente para:&lt;/p&gt;

&lt;p&gt;✅ Desarrollo local contra Kubernetes real&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tu app corre localmente&lt;/li&gt;
&lt;li&gt;Pero consume Services, ConfigMaps, Secrets y APIs reales del cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Interceptar tráfico de un Service&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redirige el tráfico que iba a un Service del cluster&lt;/li&gt;
&lt;li&gt;Hacia tu aplicación local&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Debugging rápido&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puedes usar logs locales&lt;/li&gt;
&lt;li&gt;Debuggers (VS Code, IntelliJ)&lt;/li&gt;
&lt;li&gt;Hot reload&lt;/li&gt;
&lt;li&gt;Breakpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🙌 Todo sin tocar el cluster remoto y/o productivo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ¿Por qué Telepresence es de gran ayuda?
&lt;/h2&gt;

&lt;p&gt;Porque soluciona dolores reales del desarrollo con Kubernetes.&lt;/p&gt;

&lt;p&gt;❌ Sin Telepresence (El problema tradicional)&lt;/p&gt;

&lt;p&gt;Cada cambio implica:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cambiar código&lt;/li&gt;
&lt;li&gt;docker build&lt;/li&gt;
&lt;li&gt;docker push&lt;/li&gt;
&lt;li&gt;kubectl apply&lt;/li&gt;
&lt;li&gt;Esperar el rollout&lt;/li&gt;
&lt;li&gt;Probar&lt;/li&gt;
&lt;li&gt;Repetir 😵‍💫&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto puede tomar minutos por cambio.&lt;/p&gt;

&lt;p&gt;✅ Con Telepresence&lt;/p&gt;

&lt;p&gt;El flujo se vuelve:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cambias código local&lt;/li&gt;
&lt;li&gt;Guardas&lt;/li&gt;
&lt;li&gt;Pruebas inmediatamente&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⏱️ Cambios en segundos, no minutos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ¿Cómo funciona Telepresence?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n45x6yc2qkj49yxakt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n45x6yc2qkj49yxakt9.png" alt="flow" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flujo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se conecta al cluster&lt;/li&gt;
&lt;li&gt;Inserta un proxy (Traffic Manager)&lt;/li&gt;
&lt;li&gt;Intercepta el tráfico de un Service&lt;/li&gt;
&lt;li&gt;Lo envía a tu máquina&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Desde Kubernetes:&lt;br&gt;
👉 Parece que tu app sigue ahí, pero en realidad está en tu computadora.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Ejemplo
&lt;/h2&gt;

&lt;p&gt;Sin Telepresence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;echo Service → Pod en Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con Telepresence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;echo Service → tu laptop (localhost:9000)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y el resto del cluster se mantiene igual&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Otros microservicios&lt;/li&gt;
&lt;li&gt;Secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 Codigo fuente: &lt;a href="https://github.com/r3xakead0/minikube-telepresence-demo" rel="noopener noreferrer"&gt;minikube-telepresence-demo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Beneficios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo muchísimo más rápido&lt;/li&gt;
&lt;li&gt;Debug real contra infraestructura real&lt;/li&gt;
&lt;li&gt;Menor riesgo (no tocas ambientes remotos y/o productivos)&lt;/li&gt;
&lt;li&gt;Ideal para Kubernetes + microservicios&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Ejecuta Qwen3 + Ollama + Open WebUI en Docker: Tu propio AI Chat local 🧠</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Fri, 02 Jan 2026 22:15:41 +0000</pubDate>
      <link>https://dev.to/chainiz/ejecuta-qwen3-ollama-open-webui-en-docker-tu-propio-ai-chat-local-405m</link>
      <guid>https://dev.to/chainiz/ejecuta-qwen3-ollama-open-webui-en-docker-tu-propio-ai-chat-local-405m</guid>
      <description>&lt;p&gt;¿Quieres montar tu propio entorno de IA local con un modelo potente sin pagar por la nube? &lt;/p&gt;

&lt;p&gt;Con el repositorio &lt;strong&gt;qwen3-container&lt;/strong&gt; puedes hacerlo fácilmente usando Docker Compose, Ollama y Open WebUI 👇&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 &lt;a href="https://github.com/r3xakead0/qwen3-container" rel="noopener noreferrer"&gt;código fuente&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🔥 En este post te explico qué es, cómo funciona y por qué es útil este proyecto.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 ¿Qué es Qwen3?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ollama.com/library/qwen3" rel="noopener noreferrer"&gt;Qwen3&lt;/a&gt;&lt;/strong&gt; es la última generación de modelos de lenguaje grande (LLM) de &lt;strong&gt;Alibaba Cloud&lt;/strong&gt; — disponible en múltiples tamaños y con capacidades impresionantes de generación de texto, razonamiento y tareas complejas.  ￼&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 ¿Qué hace este repositorio?
&lt;/h2&gt;

&lt;p&gt;El proyecto qwen3-container ofrece un stack listo para producción local que combina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;Ollama&lt;/strong&gt; — runtime local para LLMs, con Qwen3 precargado&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Open WebUI&lt;/strong&gt; — interfaz web tipo chat para interactuar con el modelo&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Docker + Docker Compose&lt;/strong&gt; — para levantar todo con un solo comando&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto te permite tener un chat local basado en Qwen3 sin depender de APIs externas ni costos por tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ ¿Cómo funciona el stack?
&lt;/h2&gt;

&lt;p&gt;El proyecto define dos servicios principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📌 &lt;strong&gt;ollama-qwen3&lt;/strong&gt;&lt;br&gt;
Ejecuta el modelo Qwen3 dentro de Ollama y expone una API REST en &lt;code&gt;localhost:11434&lt;/code&gt;.  ￼&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📌 &lt;strong&gt;open-webui&lt;/strong&gt;&lt;br&gt;
Proporciona una interfaz de chat en &lt;code&gt;localhost:3000&lt;/code&gt; desde el navegador, donde puedes conversar con Qwen3 sin programar nada.  ￼&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffaogmfdgsyddgonyixsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffaogmfdgsyddgonyixsh.png" alt="arquitectura" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Instalación rápida
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clona el repositorio
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/r3xakead0/qwen3-container.git
&lt;span class="nb"&gt;cd &lt;/span&gt;qwen3-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configura tu .env (puedes basarte en .env.example)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Genera un secreto seguro&lt;/span&gt;
openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Levanta los contenedores
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kdt4o4o5eze7mu30i87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kdt4o4o5eze7mu30i87.png" alt="docker compose" width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Acceder&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📡 API: &lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsqyiza7yja4yl3okoxdj.png" alt="api" width="388" height="155"&gt;
&lt;/li&gt;
&lt;li&gt;🧠 UI chat: &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2ol0f6n01iliog32cua.png" alt="chat" width="800" height="586"&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 ¿Por qué usar esto?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Privacidad y control:&lt;/strong&gt; tus datos nunca salen de tu máquina&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Sin dependencia de la nube:&lt;/strong&gt; ni tokens ni facturación&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Desarrollo rápido:&lt;/strong&gt; ideal para prototipos, PoCs o herramientas internas&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Personalización:&lt;/strong&gt; puedes enchufar el API de Ollama a tus propias apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este stack es ideal si estás trabajando con soluciones de IA local o quieres explorar modelos open-weight como Qwen3 sin pagar por servicios externos.  ￼&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 &lt;a href="https://www.alibabacloud.com/blog/build-your-own-local-qwen-3-ai-with-ollama-%2B-open-webui-docker_602358" rel="noopener noreferrer"&gt;Articulo de referencia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Recomendaciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;👉 Cambia el valor de WEBUI_SECRET_KEY por un secreto largo y seguro.  ￼&lt;/li&gt;
&lt;li&gt;👉 Una vez inicializado, deshabilita el registro de nuevos usuarios para proteger tu instancia. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>qwen</category>
      <category>llm</category>
      <category>docker</category>
      <category>spanish</category>
    </item>
    <item>
      <title>🐧 Comandos de procesamiento de texto en Linux: guía práctica</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Mon, 29 Dec 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/chainiz/comandos-de-procesamiento-de-texto-en-linux-guia-practica-f7f</link>
      <guid>https://dev.to/chainiz/comandos-de-procesamiento-de-texto-en-linux-guia-practica-f7f</guid>
      <description>&lt;p&gt;Este post explica de forma &lt;strong&gt;didáctica y con ejemplos reales&lt;/strong&gt; los comandos más usados para procesamiento de texto en Linux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sort&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uniq&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para &lt;strong&gt;logs, DevOps, SysAdmin y entrevistas técnicas&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ grep – Buscar texto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Buscar errores en un log
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Buscar sin distinguir mayúsculas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Contar coincidencias
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mostrar número de línea
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"Exception"&lt;/span&gt; app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ awk – Trabajar con columnas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mostrar primera columna
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver usuarios conectados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;who&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Logs Nginx: IP y URL con error 404
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'$9 == 404 {print $1, $7}'&lt;/span&gt; access.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sumar valores (ej. tráfico total)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{sum += $10} END {print sum}'&lt;/span&gt; access.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ sed – Editar texto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reemplazar texto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/http/https/'&lt;/span&gt; archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reemplazo global
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/http/https/g'&lt;/span&gt; archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Eliminar líneas vacías
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'/^$/d'&lt;/span&gt; archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cambiar configuración directamente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/DEBUG=false/DEBUG=true/'&lt;/span&gt; app.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ sort – Ordenar datos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ordenar alfabéticamente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;usuarios.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ordenar números
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; numeros.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ordenar por columna
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; 2 archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ordenar tamaños reales
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; 5 &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5️⃣ uniq – Eliminar duplicados
&lt;/h2&gt;

&lt;p&gt;⚠️ &lt;code&gt;uniq&lt;/code&gt; funciona correctamente solo si los datos están ordenados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminar duplicados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;nombres.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Contar repeticiones
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;nombres.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mostrar solo duplicados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sort &lt;/span&gt;nombres.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔥 Casos reales combinados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  IPs que más requests hacen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-nr&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  URLs con más errores 404
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'$9 == 404 {print $7}'&lt;/span&gt; access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-nr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Errores más frecuentes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; app.log | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $5}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-nr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Resumen rápido
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;Uso principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;grep&lt;/td&gt;
&lt;td&gt;Buscar texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awk&lt;/td&gt;
&lt;td&gt;Procesar columnas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sed&lt;/td&gt;
&lt;td&gt;Editar texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sort&lt;/td&gt;
&lt;td&gt;Ordenar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uniq&lt;/td&gt;
&lt;td&gt;Quitar duplicados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;📌 &lt;strong&gt;Tip DevOps&lt;/strong&gt;: estos comandos son fundamentales para analizar logs de &lt;strong&gt;Docker, Kubernetes, Nginx, AWS, GCP y Azure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;¡Guárdalo, practícalo y úsalo en entrevistas! 🚀&lt;/p&gt;

</description>
      <category>linux</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Reemplacé Docker por Podman para ejecutar LLMs locales (Ollama + DeepSeek)</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Sun, 28 Dec 2025 17:31:53 +0000</pubDate>
      <link>https://dev.to/chainiz/reemplace-docker-por-podman-para-ejecutar-llms-locales-ollama-deepseek-49ac</link>
      <guid>https://dev.to/chainiz/reemplace-docker-por-podman-para-ejecutar-llms-locales-ollama-deepseek-49ac</guid>
      <description>&lt;p&gt;Durante mucho tiempo, mis experimentos locales con IA siguieron el camino habitual:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Docker, docker-compose, descargar un modelo, levantar una UI y listo."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pero en algún punto empecé a querer algo más limpio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contenedores rootless (sin raíz)&lt;/li&gt;
&lt;li&gt;Mejor alineación con Linux de nivel enterprise&lt;/li&gt;
&lt;li&gt;Sin depender de un daemon de Docker corriendo en segundo plano&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahí fue cuando decidí reconstruir mi stack local de LLMs usando Podman.&lt;/p&gt;

&lt;p&gt;Este post documenta el resultado:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Ollama + Open WebUI + DeepSeek R1 ejecutándose localmente con Podman Compose"&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Por qué Podman?
&lt;/h2&gt;

&lt;p&gt;Si trabajas en cloud o platform engineering, seguramente ya viste esta tendencia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podman no usa daemon&lt;/li&gt;
&lt;li&gt;Corre rootless por defecto&lt;/li&gt;
&lt;li&gt;Se integra muy bien con systemd&lt;/li&gt;
&lt;li&gt;Cada vez es más estándar en distribuciones Linux enterprise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para mí, el objetivo era simple:&lt;br&gt;
ejecutar LLMs locales de la misma forma en que ejecutaría servicios en producción.&lt;/p&gt;


&lt;h2&gt;
  
  
  El stack
&lt;/h2&gt;

&lt;p&gt;Esto es lo que terminé usando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; → runtime y API de modelos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open WebUI&lt;/strong&gt; → interfaz tipo chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek R1 (1.5B)&lt;/strong&gt; → liviano pero sorprendentemente capaz&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Podman Compose&lt;/strong&gt; → orquestación&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volúmenes de Podman&lt;/strong&gt; → persistencia de datos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos los contenedores corren dentro de un solo Podman Pod, lo que significa: una red compartida, comunicación por localhost y cero magia rara de DNS.&lt;/p&gt;


&lt;h2&gt;
  
  
  Arquitectura
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fliqlafel2z4bvd8dwkqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fliqlafel2z4bvd8dwkqc.png" alt="arquitectura" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  El archivo Compose
&lt;/h2&gt;

&lt;p&gt;El corazón de este setup es el &lt;strong&gt;podman-compose.yml&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama-deepseek&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11434:11434"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama-data:/root/.ollama:Z&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;40s&lt;/span&gt;

  &lt;span class="na"&gt;open-webui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/open-webui/open-webui:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;open-webui&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_BASE_URL=http://ollama:11434&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-secret-key-change-me-in-production}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ENABLE_SIGNUP=${ENABLE_SIGNUP:-true}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;open-webui-data:/app/backend/data:Z&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;model-loader&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;model-loader&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_HOST=http://ollama:11434&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pull"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-r1:1.5b"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on-failure&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
  &lt;span class="na"&gt;open-webui-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/r3xakead0/deepseek-containers/tree/main/podman" rel="noopener noreferrer"&gt;Codigo fuente&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un detalle pequeño pero importante:&lt;br&gt;
no uso sh -c para el model loader, ya que la imagen de ollama no garantiza un shell, así que llamo al binario directamente.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ejecución
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Primer acceso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abres &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Creas el usuario admin inicial (comportamiento esperado)&lt;/li&gt;
&lt;li&gt;Empiezas a chatear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes validar Ollama directamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Qué me gusta de este setup
&lt;/h2&gt;

&lt;p&gt;Después de usarlo un tiempo, hay varias cosas que destacan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No hay daemon de Docker corriendo&lt;/li&gt;
&lt;li&gt;Todo funciona en modo rootless&lt;/li&gt;
&lt;li&gt;Separación clara entre runtime, UI y datos&lt;/li&gt;
&lt;li&gt;Fácil de convertir en servicios systemd más adelante (&lt;a href="https://podman-desktop.io/blog/podman-quadlet" rel="noopener noreferrer"&gt;Quadlet&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Y lo más importante:&lt;br&gt;
&lt;em&gt;"Esto se siente como infraestructura, no como un demo"&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Notas de seguridad (Importante)
&lt;/h2&gt;

&lt;p&gt;Si vas a exponer esto más allá de localhost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cambia WEBUI_SECRET_KEY&lt;/li&gt;
&lt;li&gt;Desactiva registros públicos después de crear el primer usuario&lt;/li&gt;
&lt;li&gt;Considera un reverse proxy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Que sea local no significa que deba ser inseguro.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Ejecutar LLMs localmente no tiene por qué ser desordenado.&lt;br&gt;
Con Podman + Ollama obtienes un setup que se siente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Limpio&lt;/li&gt;
&lt;li&gt;Reproducible&lt;/li&gt;
&lt;li&gt;cercano a producción&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si ya usas Podman en tus workloads, este stack encaja perfecto.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>deepseek</category>
      <category>spanish</category>
      <category>podman</category>
    </item>
    <item>
      <title>Running DeepSeek R1 + Ollama + Open WebUI with Podman Compose</title>
      <dc:creator>Afu Tse (Chainiz)</dc:creator>
      <pubDate>Sun, 28 Dec 2025 17:07:16 +0000</pubDate>
      <link>https://dev.to/chainiz/running-deepseek-r1-ollama-open-webui-with-podman-compose-4ggn</link>
      <guid>https://dev.to/chainiz/running-deepseek-r1-ollama-open-webui-with-podman-compose-4ggn</guid>
      <description>&lt;p&gt;If you want to run local LLMs with a clean, containerized setup without Docker, this guide shows how to deploy &lt;strong&gt;DeepSeek R1 + Ollama + Open WebUI&lt;/strong&gt; using &lt;strong&gt;Podman Compose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This setup is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local AI experimentation&lt;/li&gt;
&lt;li&gt;Developers who prefer rootless containers&lt;/li&gt;
&lt;li&gt;Teams standardizing on Podman instead of Docker&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why use Podman?
&lt;/h2&gt;

&lt;p&gt;Using Podman is recommended because it is more secure and better aligned with Kubernetes: it runs containers rootless by default, does not rely on a daemon, reduces the attack surface, and fits better in enterprise and CI/CD environments. In addition, it is Docker-compatible at the command level, officially supported by Red Hat, and ideal for Linux servers and production, especially when security and compliance are a priority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The stack runs inside a single Podman Pod, meaning all containers share the same network namespace.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; → model runtime &amp;amp; API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open WebUI&lt;/strong&gt; → chat-style web interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Loader&lt;/strong&gt; → one-shot container to pull the model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volumes&lt;/strong&gt; → persistent storage for models and app data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tvfldqbd771d7gxj49q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tvfldqbd771d7gxj49q.png" alt="architecture" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://podman.io/docs/installation" rel="noopener noreferrer"&gt;Podman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://podman-desktop.io/docs/compose" rel="noopener noreferrer"&gt;Podman Compose&lt;/a&gt; (podman compose or podman-compose)&lt;/li&gt;
&lt;li&gt;Free ports:

&lt;ul&gt;
&lt;li&gt;11434 (Ollama API)&lt;/li&gt;
&lt;li&gt;3000 (Open WebUI)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;On SELinux-enabled systems, volumes are mounted using :Z to avoid permission issues.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  podman-compose.yml
&lt;/h2&gt;

&lt;p&gt;Here is the core compose file powering the stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama-deepseek&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11434:11434"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama-data:/root/.ollama:Z&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;40s&lt;/span&gt;

  &lt;span class="na"&gt;open-webui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/open-webui/open-webui:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;open-webui&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_BASE_URL=http://ollama:11434&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-secret-key-change-me-in-production}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ENABLE_SIGNUP=${ENABLE_SIGNUP:-true}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;open-webui-data:/app/backend/data:Z&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;model-loader&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;model-loader&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_HOST=http://ollama:11434&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pull"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-r1:1.5b"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on-failure&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
  &lt;span class="na"&gt;open-webui-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/r3xakead0/deepseek-containers/tree/main/podman" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Create a .env file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;WEBUI_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;change-me-to-a-long-random-secret
&lt;span class="nv"&gt;ENABLE_SIGNUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a secure secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Run the Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose &lt;span class="nt"&gt;-f&lt;/span&gt; podman-compose.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman ps
podman compose &lt;span class="nt"&gt;-f&lt;/span&gt; podman-compose.yml ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open WebUI → &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ollama API → &lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;On first access, Open WebUI will prompt you to create the initial admin user (expected behavior).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;Verify Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Ollama is running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the model is missing, pull it manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama-deepseek ollama pull deepseek-r1:1.5b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Stop &amp;amp; Teardown
&lt;/h2&gt;

&lt;p&gt;Stop containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove containers (keep data):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full cleanup (⚠️ deletes models and users):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose down &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always change WEBUI_SECRET_KEY&lt;/li&gt;
&lt;li&gt;After creating the first admin user, disable public signups:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ENABLE_SIGNUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then recreate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;podman compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--force-recreate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Running LLMs locally doesn’t have to be messy.&lt;br&gt;
With Podman + Ollama, you get a setup that feels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean&lt;/li&gt;
&lt;li&gt;reproducible&lt;/li&gt;
&lt;li&gt;and production-adjacent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re already using Podman for your workloads, this stack fits right &lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>podman</category>
      <category>llm</category>
      <category>containers</category>
    </item>
  </channel>
</rss>
