<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[padz.dev: Platform Engineering]]></title><description><![CDATA[Um deep-dive nos bastidores da engenharia de plataforma. Kubernetes, CI/CD, infraestrutura como código e os desafios práticos de operar sistemas modernos em produção. ]]></description><link>https://blog.padz.dev/s/platform-engineering</link><image><url>https://substackcdn.com/image/fetch/$s_!d0XQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f3aae4-c6f9-4a2b-9671-b0ff6175501a_512x512.png</url><title>padz.dev: Platform Engineering</title><link>https://blog.padz.dev/s/platform-engineering</link></image><generator>Substack</generator><lastBuildDate>Sun, 19 Apr 2026 06:31:09 GMT</lastBuildDate><atom:link href="https://blog.padz.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Bruno Padilha]]></copyright><language><![CDATA[pt-br]]></language><webMaster><![CDATA[brunopadz@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[brunopadz@substack.com]]></itunes:email><itunes:name><![CDATA[Bruno Padilha]]></itunes:name></itunes:owner><itunes:author><![CDATA[Bruno Padilha]]></itunes:author><googleplay:owner><![CDATA[brunopadz@substack.com]]></googleplay:owner><googleplay:email><![CDATA[brunopadz@substack.com]]></googleplay:email><googleplay:author><![CDATA[Bruno Padilha]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[O que eu aprendi em quase 20 anos construindo (e quebrando) infraestrutura]]></title><description><![CDATA[Boas pr&#225;ticas para quem est&#225; come&#231;ando um projeto do zero. Sem hype, sem atalhos, s&#243; o que realmente funciona.]]></description><link>https://blog.padz.dev/p/o-que-eu-aprendi-em-quase-20-anos</link><guid isPermaLink="false">https://blog.padz.dev/p/o-que-eu-aprendi-em-quase-20-anos</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Fri, 11 Jul 2025 13:57:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uAKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uAKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1337668,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/168012508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@ryanquintal?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Ryan Quintal</a> no <a href="https://unsplash.com/photos/yellow-lego-block-lot-G-HRuwCTR7c?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Em quase 20 anos da minha trajet&#243;ria profissional aprendi bastante depois de participar de v&#225;rios projetos, tanto aqueles de infra mais ra&#237;z, quanto migra&#231;&#245;es para cloud, Kubernetes e por a&#237; vai. Em algumas vezes tomei decis&#245;es erradas, mas o importante disso &#233; o aprendizado. E nada mais justo do que repassar esse conhecimento a diante.</p><p>Por isso, eu vejo muitas pessoas (desde os que est&#227;o come&#231;ando agora at&#233; os mais experientes) tomando decis&#245;es ou querendo surfar a onda do hype, ou como costum&#225;vamos dizer na Leroy Merlin, sendo &#8220;bleeding-edge&#8221;.</p><p>Esse post &#233; para quem est&#225; trabalhando em projetos greenfield, stealths ou come&#231;ando do zero.</p><h2>1 - Escolha tecnologias maduras (boring tech)</h2><p>Sim, escolha tecnologias maduras ao iniciar novos projetos. Aquele novo orquestrador de conteiner, aquele novo servi&#231;o da AWS ou aquele framework novo que promete ser 20% mais r&#225;pido que o framework que voc&#234; utiliza n&#227;o vale todo o overhead operacional. </p><p>Sim, &#233; legal usar e testar novas tecnologias, eu gosto e todo mundo gosta, mas cuidado ao usar em projetos novos. As vezes o tempo gasto dando manuten&#231;&#227;o em algo que &#8220;ningu&#233;m usa&#8221;, seria muito mais &#250;til se aproveitado trabalhando em melhorias reais de performance.</p><h2>2 - Infra as Code desde o in&#237;cio</h2><p>Simples como o t&#237;tulo. Provisionar infra n&#227;o &#233; mais o famoso &#8220;next, next, finish&#8221; na console da AWS (ou qualquer outra cloud). Sem saber o que e como foi feito s&#243; vai gerar mais d&#237;vida t&#233;cnica e impossibilitar de recriar o ambiente em caso de necessidade.</p><p>Sem contar as in&#250;meras vantagens que IaC traz, como rastreabilidade, consist&#234;ncia e redu&#231;&#227;o de erros, j&#225; que o c&#243;digo pode ser revisado e testado.</p><h2>3 - Seguran&#231;a planejada, n&#227;o acidental</h2><p>Adicionar seguran&#231;a depois que o projeto j&#225; est&#225; rodando, ou depois de um incidente &#233; muito (mas muito) mais dif&#237;cil do que construir desde o dia zero. Come&#231;ar com o menor privil&#233;gio poss&#237;vel em roles, keys e etc j&#225; &#233; um baita come&#231;o. Use IRSA ou Pod Identity na AWS.</p><p>Se seu escopo for al&#233;m da cloud, <a href="https://github.com/dependabot">Dependabot</a> (ou <a href="https://github.com/renovatebot">Renovatebot</a>) e <a href="https://github.com/aquasecurity/trivy-action">Trivy</a> salvam muito.</p><h2>4 - Automatize tudo</h2><p>&#201; o mesmo ponto de Infra as Code. N&#227;o se trata de velocidade e sim de consist&#234;ncia. Processos manuais criam silos de conhecimento e pontos &#250;nicos de falha.</p><p>O m&#237;nimo aceit&#225;vel &#233; ter um fluxo de deploy automatizado tanto para infraestrutura quanto para o c&#243;digo.</p><h2>5 - Documente decis&#245;es</h2><p>N&#227;o adianta s&#243; documentar seu c&#243;digo, documente suas decis&#245;es e os motivos de escolher determinadas arquiteturas. </p><p>Um bom in&#237;cio &#233; escrever <a href="https://adr.github.io/">ADRs</a> (Architectural Decision Records). N&#227;o precisa ser nada rebuscado, um markdown em um reposit&#243;rio no GitHub j&#225; ajuda. Com certeza, vai ajudar as pr&#243;ximas pessoas do seu time a entender o por que as coisas s&#227;o do jeito que s&#227;o.</p><h2>6 - Se questione o &#8220;por que&#8221;</h2><p>Esse vai de encontro com o ponto acima.</p><p>A arquitetura das aplica&#231;&#245;es (ou infraestrutura) devem servir ao neg&#243;cio, n&#227;o ao contr&#225;rio. Tecnologia n&#227;o &#233; o objetivo, &#233; o meio. Mantenha as coisas simples, com prop&#243;sitos e alinhado ao neg&#243;cio.</p><p>Provavelmente voc&#234; n&#227;o precisa de microservi&#231;os para um MVP.</p><h2>7 - Planeje para falhas</h2><p>Uma hora seu servi&#231;o, sua infra, seu DNS vai falhar. Toda rede tem problemas. Desenhe sua arquitetura esperando que isso vai acontecer em algum momento. <br><br>Aprendi com um antigo gestor durante uma migra&#231;&#227;o de servidores Microsoft Exchange 2003 para 2010 (ainda existe isso?), o seguinte pensamento: </p><blockquote><p>Quem tem um, n&#227;o tem nenhum.<br>Quem tem dois, tem um.<br>Quem tem tr&#234;s, tem dois. </p></blockquote><p>E &#233; sobre isso. Tenha no m&#237;nimo duas r&#233;plicas do que &#233; core para o neg&#243;cio.</p><h2>8 - Observabilidade</h2><p>O papo de observabilidade n&#227;o &#233; monitora&#231;&#227;o j&#225; t&#225; batido. Identifique seus SLIs e defina SLOs para acompanh&#225;-los. Novamente, tecnologia a favor do neg&#243;cio e n&#227;o ao contr&#225;rio.</p><p>Comece instrumentando seu c&#243;digo e pontos chaves da infraestrutura. A <a href="https://grafana.com/go/webinar/getting-started-with-grafana-lgtm-stack/">stack LGTM</a> &#233; um &#243;timo ponto de partida.</p>]]></content:encoded></item><item><title><![CDATA[Atualizando Keycloak usando Helm Chart da Bitnami]]></title><description><![CDATA[Um guia r&#225;pido e f&#225;cil de seguir, escrito com base em desafios enfrentados ao atualizar o Keycloak provisionado com Helm Chart da Bitnami.]]></description><link>https://blog.padz.dev/p/atualizando-keycloak-usando-helm</link><guid isPermaLink="false">https://blog.padz.dev/p/atualizando-keycloak-usando-helm</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Mon, 13 Jan 2025 13:30:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o-PF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o-PF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o-PF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8617529,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o-PF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@miracleday?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Elena Mozhvilo</a> no <a href="https://unsplash.com/photos/black-and-silver-hand-tool-set-RhXAO8OXyDY?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p><em>An english version is coming soon. Stay tuned. &#128515;</em></p><h2>Uma breve introdu&#231;&#227;o</h2><p>Sempre fui contra utilizar os <a href="https://github.com/bitnami/charts">Helm Charts da Bitnami</a> - as imagens dos conteineres s&#227;o super modificadas e no caso do Keycloak especificamente, &#233; uma confus&#227;o enorme com as ENV VARs para configur&#225;-lo (<code>KC_*</code>), as ENV VARs para configurar o conteiner da Bitnami (<code>KEYCLOAK_*</code>) e a documenta&#231;&#227;o n&#227;o &#233; das melhores. Mas n&#227;o posso negar que em alguns momentos esses Charts ajudam a subir algo r&#225;pido, e foi por esse motivo que o time que trabalho decidiu subir dessa forma, ao inv&#233;s de utilizar o <a href="https://www.keycloak.org/operator/installation">Keycloak Operator</a>. </p><p>No fim do ano passado, puxei a iniciativa de atualizar as int&#226;ncias de Keycloak que utilizamos na <a href="https://pier.digital">Pier</a> com outros Staff Engineers para suportar algumas funcionalidades que seriam interessantes implementar em algumas aplica&#231;&#245;es. Foi um trabalho de formiguinha, mas deu certo. Nesse post, irei explicar o processo e dar algumas dicas.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XQzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQzP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 424w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 848w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1272w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png" width="641" height="760" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55636,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XQzP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 424w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 848w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1272w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Print do doc no Notion que montei para o processo. Foram 20 tentativas. &#128558;&#8205;&#128168;</figcaption></figure></div><p>Vale ressaltar que nem todos ambientes s&#227;o iguais, no nosso caso, utilizamos <a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/">ALB Ingress Controller</a> no AWS EKS, rodando Kubernetes 1.31.</p><p>Ap&#243;s uma pergunta no grupo Cloud &amp; Infra da comunidade <a href="https://www.linkedin.com/company/platformrocks/posts/?feedView=all">Platform Engineering</a> no Whatsapp, resolvi escrever esse post para ajudar outras pessoas. Espero que possa te ajudar tamb&#233;m!</p><h2>Dicas de ouro</h2><p>A ideia era atualizar para a &#250;ltima vers&#227;o do Keycloak (26.0.7) e meu primeiro erro foi tentar subir da vers&#227;o 22 direto para 26 e subindo a vers&#227;o do Helm Chart da 16 para 24. E as coisas n&#227;o funcionam assim. </p><p>Por isso, <strong>fa&#231;a upgrades sequenciais</strong>, tanto do Keycloak quanto do Helm Chart. Entre as major versions do Keycloak, o banco &#233; atualizado diversas vezes e n&#227;o senti seguran&#231;a na execu&#231;&#227;o das migrations entre a 22 e a 26, principalmente pela alta customiza&#231;&#227;o da imagem feita pela Bitnami. Os Helm Charts tamb&#233;m devem ser atualizados de forma sequencial, por&#233;m, nem sempre atualiza&#231;&#245;es entre major versions funcionam bem. </p><p>Segunda dica, antes de cada upgrade <strong>leia o <a href="https://www.keycloak.org/docs/latest/upgrading/">Upgrading Guide</a></strong> na documenta&#231;&#227;o oficial do Keycloak. A doc n&#227;o &#233; das melhores, mas explica mudan&#231;as significativas como altera&#231;&#227;o do <a href="https://www.keycloak.org/docs/latest/upgrading/#new-hostname-options">hostname_v1 para hostname_v2</a> e na API.</p><p>A terceira dica &#233;, <strong>testar, testar e testar</strong>. Verifique se o login na console de administra&#231;&#227;o est&#225; funcionando e o principal, se sua aplica&#231;&#227;o continua funcionando conforme o esperado.</p><h2>Atualizando</h2><p>Os values utilizados a partir da vers&#227;o 16.0.3 do Chart (Keycloak 22.0.1) est&#227;o nesse <a href="https://gist.github.com/brunopadz/8fa2f5e67a458f5fd880399dc812c4e3">Gist</a>. Eu usarei o mesmo YAML como refer&#234;ncia at&#233; a vers&#227;o 24.2.3 e mencionando apenas as mudan&#231;as, caso voc&#234; n&#227;o queira ir at&#233; a &#250;ltima vers&#227;o do Chart. </p><h4>Upgrades sem mudan&#231;as nos values</h4><ul><li><p>Helm Chart: 16.0.3 &#8594; 17.3.6 / Keycloak: 22.0.5</p></li><li><p>Helm Chart: 17.3.6 &#8594; 18.7.1 / Keycloak: 23.0.7</p></li><li><p>Helm Chart: 18.7.1 &#8594; 19.4.1 / Keycloak: 23.0.7</p><ul><li><p>Voc&#234; pode pular esse upgrade e ir direto para a 19.4.1, caso queira ir para a vers&#227;o 24.0.2 do Keycloak.</p></li></ul></li><li><p>Helm Chart: 19.4.1 &#8594; 21.0.0 / Keycloak: 24.0.2</p></li><li><p>Helm Chart: 21.0.0 &#8594; 21.1.3 / Keycloak: 24.0.4</p></li><li><p>Helm Chart: 21.1.3 &#8594; 21.2.2 / Keycloak: 24.0.4</p><ul><li><p>Voc&#234; pode pular esse upgrade e ir direto para a 21.3.4, caso queira ir para a vers&#227;o 24.0.5 do Keycloak.</p></li></ul></li><li><p>Helm Chart: 21.2.2 &#8594; 21.3.4 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.3.4 &#8594; 21.4.6 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.4.64 &#8594; 21.5.0 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.5.0 &#8594; 21.6.0 / Keycloak: 24.0.5</p></li></ul><h4>Upgrades com mudan&#231;as nos values</h4><p>A partir da vers&#227;o 21.6.0, uma s&#233;rie de releases foram lan&#231;adas tentando corrigir v&#225;rios bugs, regress&#245;es e etc&#8230; um caos completo. </p><p>Voc&#234; tamb&#233;m ir&#225; notar que eu voltei para a 21.5.0. Isso se deve ao fato de puro troubleshooting, tentando quebrar minha cabe&#231;a para entender a bagun&#231;a feita pelos mantenedores e comunidade.</p><ul><li><p>Helm Chart: 21.5.0 &#8594; 22.1.0 / Keycloak: 25.0.2</p><ul><li><p>Mudan&#231;as:</p><ul><li><p><code>proxy: none</code> - Isso se deve ao fato da remo&#231;&#227;o de como o Keycloak trata requests atr&#225;s de um proxy reverso. </p></li><li><p><code>proxyHeaders: forwarded</code> - Devido a mudan&#231;a acima, existe uma nova forma de tratar e configurar os proxy headers atr&#225;s de um ingress ou proxy reverso. Vale a pena ler a <a href="https://www.keycloak.org/server/reverseproxy">documenta&#231;&#227;o oficial</a> sobre o tema.</p></li><li><p><code>ingress.controller: gce</code> - Alguns usu&#225;rios utilizando o <a href="https://github.com/kubernetes/ingress-gce">ingress-gce</a>, setam <code>/*</code> no <code>ingress.path</code>, assim como eu, utilizando o ALB Ingress Controller. Setar <code>gce</code> nesse par&#226;metro vai fazer com que ao utilizar <code>/*</code>, o ingress rule n&#227;o quebre.</p></li><li><p><code>hostnameStrict: false</code> - Ajustando o configura&#231;&#227;o de hostname v2 do Keycloak.</p></li></ul></li></ul></li><li><p>Helm Chart: 22.1.0 &#8594; 24.0.0 / Keycloak: 26.0.0</p><ul><li><p>Sem mudan&#231;as</p></li></ul></li><li><p>Helm Chart: 24.0.0 &#8594; 24.2.3 / Keycloak: 26.0.7</p><ul><li><p>As mudan&#231;as realizadas aqui foram feitas para resolver problemas que tivemos no nosso cen&#225;rio:</p><ul><li><p><code>global.security.allowInsecureImages: true</code> - Utilizamos uma imagem customizada do Keycloak onde inserimos temas e mais alguns componentes desenvolvidos internamente. Mais infos <a href="https://github.com/bitnami/charts/issues/30850">aqui</a>.</p></li><li><p><code>proxyHeaders: xforwarded</code> - Ap&#243;s iniciarmos os testes, alguns fluxos de autentica&#231;&#227;o retornavam erros relacionados aos cookies. Setar <code>xforwarded</code> resolveu o problema.</p></li></ul></li></ul></li></ul><p>O resultado final dessa saga, voc&#234; pode conferir nesse <a href="https://gist.github.com/brunopadz/99199015d5e63b4674402d40f16a6a98">Gist</a>.</p><h2>Notas finais</h2><p>Eu levei um dia e meio para ler e entender todas as mudan&#231;as feitas no Helm Chart entre as vers&#245;es 16.0.3 e a 24.2.3. Recomendo n&#227;o s&#243; para o Keycloak, mas para qualquer Chart da Bitnami fazer o mesmo. Anotar e documentar o processo &#233; importante para n&#227;o perder o fio da meada.</p><p>Se atentar as mudan&#231;as na API do Keycloak no <a href="https://www.keycloak.org/docs/latest/upgrading/">Upgrading Guide</a> &#233; super importante tamb&#233;m. No nosso caso tivemos que fazer alguns ajustes nas aplica&#231;&#245;es, ent&#227;o tenha tudo mapeado.</p><p>Espero que esse post possa ajudar a comunidade de alguma forma.</p><p>At&#233; mais!</p>]]></content:encoded></item></channel></rss>