<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo de Sem categoria - Ramon Domingos Blog</title>
	<atom:link href="https://ramondomingos.com.br/category/sem-categoria/feed/" rel="self" type="application/rss+xml" />
	<link>https://ramondomingos.com.br/category/sem-categoria/</link>
	<description>Conteúdo sobre tecnologia e engenharia de software.</description>
	<lastBuildDate>Thu, 18 Jun 2026 19:24:30 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</generator>

<image>
	<url>https://ramondomingos.com.br/wp-content/uploads/2023/09/cropped-Logotipo_bold_minimalista_amarelo_para_blog__1_-removebg-preview-32x32.png</url>
	<title>Arquivo de Sem categoria - Ramon Domingos Blog</title>
	<link>https://ramondomingos.com.br/category/sem-categoria/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Sotaques Digitais: um modelo brasileiro consegue entender o português do jeito que a gente fala?</title>
		<link>https://ramondomingos.com.br/sotaques-digitais-um-modelo-brasileiro-consegue-entender-o-portugues-do-jeito-que-a-gente-fala/</link>
					<comments>https://ramondomingos.com.br/sotaques-digitais-um-modelo-brasileiro-consegue-entender-o-portugues-do-jeito-que-a-gente-fala/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Thu, 18 Jun 2026 19:24:28 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=341</guid>

					<description><![CDATA[<p>Mandei essa frase para três LLMs: &#8220;Véi, Brasília é tudo longe de tudo. Pra ir na padaria são 15 minutos de carro. Pelo menos as tesourinhas ajudam no trânsito.&#8221; O Llama-3.3-70B (Meta) respondeu que&#160;tesourinhas&#160;eram motocicletas. O GPT-4o-mini (OpenAI) ficou em cima do muro — disse que poderiam ser rotatórias&#160;ou desvios, sem convicção. O Sabiá-4 (Maritaca&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/sotaques-digitais-um-modelo-brasileiro-consegue-entender-o-portugues-do-jeito-que-a-gente-fala/">Sotaques Digitais: um modelo brasileiro consegue entender o português do jeito que a gente fala?</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Mandei essa frase para três LLMs:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>&#8220;Véi, Brasília é tudo longe de tudo. Pra ir na padaria são 15 minutos de carro. Pelo menos as tesourinhas ajudam no trânsito.&#8221;</em></p>
</blockquote>



<p class="wp-block-paragraph">O Llama-3.3-70B (Meta) respondeu que&nbsp;<em>tesourinhas</em>&nbsp;eram motocicletas.</p>



<p class="wp-block-paragraph">O GPT-4o-mini (OpenAI) ficou em cima do muro — disse que poderiam ser rotatórias&nbsp;<em>ou desvios</em>, sem convicção.</p>



<p class="wp-block-paragraph">O Sabiá-4 (Maritaca AI) acertou direto: passagens de nível, infraestrutura característica do plano urbanístico de Brasília. Quem conhece a cidade sabe.</p>



<p class="wp-block-paragraph">Esse foi o cenário mais revelador de um benchmark que passei semanas construindo — e que mostra por que um modelo nacional importa.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é o Sotaques Digitais</h2>



<p class="wp-block-paragraph">O&nbsp;<strong>Sotaques Digitais</strong>&nbsp;é um benchmark que criei para testar LLMs numa tarefa específica: entender o português brasileiro como ele é usado no dia a dia digital — redes sociais, WhatsApp, atendimento ao cliente, avaliações de produto.</p>



<p class="wp-block-paragraph">São&nbsp;<strong>90 cenários</strong>&nbsp;divididos em três categorias:</p>



<ul class="wp-block-list">
<li><strong>Ironia</strong> (30 cenários) — sarcasmo, antífrase, ironia situacional em contextos digitais</li>



<li><strong>Expressões Idiomáticas</strong> (30 cenários) — expressões do cotidiano brasileiro contemporâneo</li>



<li><strong>Regionalismos</strong> (30 cenários) — vocabulário e referências culturais das 5 macrorregiões</li>
</ul>



<p class="wp-block-paragraph">Os modelos comparados:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Modelo</th><th class="has-text-align-left" data-align="left">Empresa</th><th class="has-text-align-left" data-align="left">Tipo</th></tr></thead><tbody><tr><td><strong>Sabiá-4</strong></td><td>Maritaca AI <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f1e7-1f1f7.png" alt="🇧🇷" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Nacional, especializado em PT-BR</td></tr><tr><td><strong>GPT-4o-mini</strong></td><td>OpenAI</td><td>Global, multilíngue</td></tr><tr><td><strong>Llama-3.3-70B</strong></td><td>Meta (via Groq)</td><td>Open source, multilíngue</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Como funciona a avaliação</h2>



<p class="wp-block-paragraph">Cada modelo recebeu o mesmo prompt para todos os cenários — sem dica de categoria, sem instrução extra. A instrução era simples:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>&#8220;Analise o texto abaixo e explique o que o autor realmente quis dizer, considerando o contexto cultural e linguístico do português brasileiro.&#8221;</em></p>
</blockquote>



<p class="wp-block-paragraph">As respostas foram avaliadas pelo&nbsp;<strong>GPT-4o como juiz</strong>&nbsp;(metodologia LLM-as-a-Judge), em uma escala de 1 a 5 ancorada em gatilhos semânticos específicos de cada cenário. Por exemplo, para um cenário de ironia, o juiz verificava se o modelo detectou o tom sarcástico e não interpretou o elogio literalmente.</p>



<p class="wp-block-paragraph">Todo o código está no&nbsp;<a href="https://github.com/ramondomiingos/ptbr-irony-idioms-regionalism-benchmark">GitHub</a>&nbsp;e o dataset está disponível no&nbsp;<a href="https://huggingface.co/datasets/ramondomiingos/ptbr-irony-idioms-regionalism">Hugging Face</a>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Os resultados</h2>



<h3 class="wp-block-heading">Visão geral</h3>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="460" src="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig1_geral-1024x460.png" alt="Desempenho geral por modelo" class="wp-image-342" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig1_geral-1024x460.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig1_geral-300x135.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig1_geral-768x345.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig1_geral.png 1032w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Desempenho geral por modelo</figcaption></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Modelo</th><th class="has-text-align-left" data-align="left">Média (1–5)</th><th class="has-text-align-left" data-align="left">Desvio Padrão</th></tr></thead><tbody><tr><td>GPT-4o-mini</td><td>4,94</td><td>0,23</td></tr><tr><td>Sabiá-4</td><td>4,89</td><td>0,44</td></tr><tr><td>Llama-3.3-70B</td><td>4,76</td><td>0,64</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A diferença entre Sabiá-4 e GPT-4o-mini é de 0,05 ponto em uma escala de 5. Marginal. O Llama varia quase três vezes mais que o GPT-4o-mini — desempenho menos previsível ao longo dos cenários.</p>



<h3 class="wp-block-heading">Por categoria</h3>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="505" src="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig2_categorias-1024x505.png" alt="" class="wp-image-343" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig2_categorias-1024x505.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig2_categorias-300x148.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig2_categorias-768x378.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig2_categorias.png 1185w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Desempenho por categoria</figcaption></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Categoria</th><th class="has-text-align-left" data-align="left">Sabiá-4</th><th class="has-text-align-left" data-align="left">GPT-4o-mini</th><th class="has-text-align-left" data-align="left">Llama-3.3-70B</th></tr></thead><tbody><tr><td>Ironia</td><td><strong>5,00</strong></td><td>4,93</td><td>4,97</td></tr><tr><td>Expressão Idiomática</td><td><strong>4,97</strong></td><td>4,93</td><td>4,83</td></tr><tr><td>Regionalismo</td><td>4,70</td><td>4,97</td><td>4,47</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Aqui o Sabiá-4 aparece em seu melhor momento.</p>



<p class="wp-block-paragraph">Em <strong>Ironia</strong>, o Sabiá-4 atingiu nota máxima — 5,00 — superando os dois concorrentes globais. O mesmo em <strong>Expressões Idiomáticas</strong>. Em ambas as categorias, o fenômeno testado está no coração do português brasileiro informal: exatamente o tipo de dado que um modelo treinado com foco no idioma tende a internalizar melhor.</p>



<h3 class="wp-block-heading">Regionalismos por macrorregião</h3>



<figure class="wp-block-image size-full"><img decoding="async" width="1009" height="584" src="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig3_regioes.png" alt="" class="wp-image-344" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig3_regioes.png 1009w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig3_regioes-300x174.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig3_regioes-768x445.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /><figcaption class="wp-element-caption">Mapa de calor de regionalismos</figcaption></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Região</th><th class="has-text-align-left" data-align="left">Sabiá-4</th><th class="has-text-align-left" data-align="left">GPT-4o-mini</th><th class="has-text-align-left" data-align="left">Llama-3.3-70B</th></tr></thead><tbody><tr><td>Norte</td><td>4,83</td><td>5,00</td><td>4,83</td></tr><tr><td>Nordeste</td><td>4,67</td><td>5,00</td><td>4,67</td></tr><tr><td>Centro-Oeste</td><td><strong>5,00</strong></td><td>4,83</td><td>4,17</td></tr><tr><td>Sudeste</td><td>4,33</td><td>5,00</td><td>4,17</td></tr><tr><td>Sul</td><td>4,67</td><td>5,00</td><td>4,50</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">No <strong>Centro-Oeste</strong>, o Sabiá-4 liderou com nota máxima — exatamente a região onde estava o cenário das <em>tesourinhas</em>. O Llama desabou para 4,17 no Centro-Oeste e no Sudeste.</p>



<h3 class="wp-block-heading">Distribuição de erros</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="360" src="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig4_distribuicao-1-1024x360.png" alt="" class="wp-image-346" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/06/fig4_distribuicao-1-1024x360.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig4_distribuicao-1-300x106.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig4_distribuicao-1-768x270.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/06/fig4_distribuicao-1.png 1484w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Distribuição de scores</figcaption></figure>



<p class="wp-block-paragraph">Sabiá-4 e GPT-4o-mini erraram em apenas 2 cenários cada (scores abaixo de 4). O Llama teve 6 cenários com erros.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Os casos mais interessantes</h2>



<h3 class="wp-block-heading">&#8220;As tesourinhas ajudam no trânsito&#8221; — só o Sabiá acertou</h3>



<p class="wp-block-paragraph">Este foi o único cenário em que os três modelos tiveram notas diferentes entre si, com o Sabiá-4 claramente à frente:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Modelo</th><th class="has-text-align-left" data-align="left">Nota</th><th class="has-text-align-left" data-align="left">O que disse</th></tr></thead><tbody><tr><td><strong>Sabiá-4</strong></td><td><strong>5</strong></td><td>Identificou corretamente: passagens de nível do urbanismo de Brasília</td></tr><tr><td>GPT-4o-mini</td><td>4</td><td>Ficou em dúvida: &#8220;podem ser rotatórias ou desvios&#8221;</td></tr><tr><td>Llama-3.3-70B</td><td>2</td><td>Errou: interpretou como motocicletas</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><em>Tesourinhas</em>&nbsp;é um termo muito específico do cotidiano de Brasília. Esse conhecimento não aparece em grandes portais — ele vive em fóruns locais, grupos de WhatsApp, reportagens do DF. Um modelo que prioriza representação do português brasileiro tem mais chance de capturá-lo.</p>



<h3 class="wp-block-heading">&#8220;O rolê de ontem foi sinistro&#8221; — ninguém acertou</h3>



<p class="wp-block-paragraph">O Sabiá-4 e o Llama interpretaram&nbsp;<em>sinistro</em>&nbsp;pelo sentido padrão — algo negativo. Mas no contexto paulistano,&nbsp;<em>sinistro</em>&nbsp;é gíria para &#8220;incrível&#8221;. Gírias que invertem o sentido original de uma palavra são o desafio mais difícil para qualquer modelo: elas evoluem rápido, aparecem concentradas em comunidades específicas, e o sinal de treino é pequeno.</p>



<p class="wp-block-paragraph">GPT-4o-mini foi o único que acertou nesse cenário.</p>



<h3 class="wp-block-heading">&#8220;Bergamota&#8221; e &#8220;de buenas&#8221; no Sul</h3>



<p class="wp-block-paragraph">Os modelos identificaram marcadores regionais como&nbsp;<em>bah</em>&nbsp;e&nbsp;<em>trilegal</em>, mas erraram em&nbsp;<em>bergamota</em>&nbsp;(nome regional para tangerina no Sul) e&nbsp;<em>de buenas</em>&nbsp;(estar tranquilo, sem problema). O contexto regional era claro — o erro foi no vocabulário específico.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que isso nos diz</h2>



<p class="wp-block-paragraph">Um modelo nacional competindo com gigantes globais em seu próprio idioma é, por si só, um resultado relevante. Mas os dados mostram algo mais específico:&nbsp;<strong>o Sabiá-4 é melhor onde o português brasileiro é mais cultural e menos lexical</strong>&nbsp;— ironia, subentendidos, tom informal.</p>



<p class="wp-block-paragraph">Regionalismos são o desafio mais difícil para todos. Esse tipo de conhecimento está espalhado na internet de forma fragmentada: portais regionais, grupos locais, comunidades específicas. Capturá-lo vai exigir curadoria intencional — e é exatamente o tipo de aposta que faz sentido para um modelo nacional fazer.</p>



<p class="wp-block-paragraph">O Llama-3.3-70B mostrou que ter 70 bilhões de parâmetros não substitui representação cultural nos dados de treino.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que isso nos diz</h2>



<p class="wp-block-paragraph">O resultado central desse benchmark é:&nbsp;<strong>o Sabiá-4 compete de igual para igual com modelos globais em português brasileiro</strong>, e em duas das três categorias testadas — Ironia e Expressões Idiomáticas — ele lidera.</p>



<p class="wp-block-paragraph">Regionalismos foram o maior desafio para todos. A explicação mais provável é que esse tipo de fenômeno depende de conhecimento enciclopédico muito específico — saber que&nbsp;<em>sinistro</em>&nbsp;é elogio em SP, que&nbsp;<em>tesourinhas</em>&nbsp;são rotatórias em Brasília, que&nbsp;<em>bergamota</em>&nbsp;é tangerina no Sul. Esse conhecimento está espalhado na internet de forma fragmentada, em portais regionais, fóruns e redes sociais locais. Capturá-lo bem vai depender de curadoria intencional de dados regionais — uma oportunidade clara para modelos nacionais que priorizem essa cobertura.</p>



<p class="wp-block-paragraph">O Llama-3.3-70B mostrou que ter 70 bilhões de parâmetros não é suficiente quando falta representação cultural específica nos dados de treino.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Como reproduzir</h2>



<p class="wp-block-paragraph">O benchmark é totalmente aberto e reproduzível. Você precisa de três API keys (Maritaca AI, OpenAI e Groq — o Groq é gratuito) e rodar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git clone https://github.com/ramondomiingos/ptbr-irony-idioms-regionalism-benchmark
cd ptbr-irony-idioms-regionalism-benchmark
python3.12 -m venv .venv &amp;&amp; .venv/bin/pip install -r requirements.txt
cp .env.example .env  # preencher as keys
.venv/bin/python src/run_benchmark.py --dry-run  # testa com 3 cenários
.venv/bin/python src/run_benchmark.py            # benchmark completo
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clone</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">https://github.com/ramondomiingos/ptbr-irony-idioms-regionalism-benchmark</span></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ptbr-irony-idioms-regionalism-benchmark</span></span>
<span class="line"><span style="color: #88C0D0">python3.12</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-m</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">venv</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.venv</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">.venv/bin/pip</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-r</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requirements.txt</span></span>
<span class="line"><span style="color: #88C0D0">cp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.env.example</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.env</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88"># preencher as keys</span></span>
<span class="line"><span style="color: #88C0D0">.venv/bin/python</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">src/run_benchmark.py</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--dry-run</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88"># testa com 3 cenários</span></span>
<span class="line"><span style="color: #88C0D0">.venv/bin/python</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">src/run_benchmark.py</span><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># benchmark completo</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O custo total para rodar os 90 cenários nos 3 modelos mais o juiz GPT-4o é de aproximadamente&nbsp;<strong>$2–4</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Próximos passos</h2>



<p class="wp-block-paragraph">O benchmark segue em desenvolvimento. Os próximos passos são:</p>



<ul class="wp-block-list">
<li>Calcular concordância entre anotadores (IAA) para fortalecer a metodologia</li>



<li>Expandir para 500+ cenários com mais variantes regionais e gírias recentes</li>



<li>Submeter para o PROPOR 2026</li>
</ul>



<p class="wp-block-paragraph">O dataset está disponível no&nbsp;<a href="https://huggingface.co/datasets/ramondomiingos/ptbr-irony-idioms-regionalism">Hugging Face</a>&nbsp;com licença CC BY 4.0 — qualquer pessoa pode usar, estender ou testar outros modelos com ele.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Se quiser conversar sobre o projeto, me encontra no <a href="https://linkedin.com/in/ramondomiingos">LinkedIn</a> </em>ou comentar aqui no post.</p>



<p class="wp-block-paragraph"></p>
<p>O post <a href="https://ramondomingos.com.br/sotaques-digitais-um-modelo-brasileiro-consegue-entender-o-portugues-do-jeito-que-a-gente-fala/">Sotaques Digitais: um modelo brasileiro consegue entender o português do jeito que a gente fala?</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/sotaques-digitais-um-modelo-brasileiro-consegue-entender-o-portugues-do-jeito-que-a-gente-fala/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Do Risco à Inovação: Como Transformamos a Conformidade à LGPD em Propriedade Intelectual Patenteada</title>
		<link>https://ramondomingos.com.br/do-risco-a-inovacao-como-transformamos-a-conformidade-a-lgpd-em-propriedade-intelectual-patenteada/</link>
					<comments>https://ramondomingos.com.br/do-risco-a-inovacao-como-transformamos-a-conformidade-a-lgpd-em-propriedade-intelectual-patenteada/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Wed, 06 May 2026 19:13:30 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=335</guid>

					<description><![CDATA[<p>A adequação à Lei Geral de Proteção de Dados (LGPD) e ao GDPR frequentemente é vista pelas empresas como um centro de custo — um checklist regulatório complexo que consome recursos e impõe freios ao desenvolvimento de novas funcionalidades. Mas e se a busca pela conformidade for, na verdade, um dos maiores catalisadores de inovação&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/do-risco-a-inovacao-como-transformamos-a-conformidade-a-lgpd-em-propriedade-intelectual-patenteada/">Do Risco à Inovação: Como Transformamos a Conformidade à LGPD em Propriedade Intelectual Patenteada</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A adequação à Lei Geral de Proteção de Dados (LGPD) e ao GDPR frequentemente é vista pelas empresas como um centro de custo — um checklist regulatório complexo que consome recursos e impõe freios ao desenvolvimento de novas funcionalidades. Mas e se a busca pela conformidade for, na verdade, um dos maiores catalisadores de inovação técnica e diferencial competitivo para o negócio?</p>



<p class="wp-block-paragraph">Recentemente, concluí meu mestrado em Engenharia de Software na <strong>Universidade Federal do Rio Grande do Norte (UFRN)</strong>, focado exatamente nessa interseção entre privacidade, conformidade e arquitetura de sistemas distribuídos. O resultado dessa jornada foi muito além da academia: desenvolvemos uma solução tão disruptiva para o mercado que o <strong>componente central da pesquisa foi oficialmente patenteado</strong>.</p>



<p class="wp-block-paragraph">Neste post, quero compartilhar a visão de mercado por trás desse projeto e como resolvemos um dos gargalos mais caros da governança de dados moderna.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O Gargalo: O Direito ao Esquecimento em Larga Escala</h2>



<p class="wp-block-paragraph">Para empresas que operam com sistemas legados ou arquiteturas modernas baseadas em microsserviços, o cumprimento do <strong>Direito ao Esquecimento</strong> (a exclusão definitiva dos dados a pedido do titular) é um pesadelo operacional.</p>



<p class="wp-block-paragraph">Em estruturas complexas, os dados de um único cliente não estão centralizados. Eles estão espalhados por dezenas de bancos de dados relacionais e não-relacionais, filas de mensageria, data lakes e caches. Quando um usuário solicita a exclusão:</p>



<ul class="wp-block-list">
<li><strong>O risco operacional aumenta:</strong> Como garantir, de forma auditável, que o dado foi apagado em <em>todos</em> os pontos sem causar inconsistências no sistema?</li>



<li><strong>O custo financeiro dispara:</strong> Interromper times de engenharia para criar soluções customizadas e manuais de exclusão a cada nova API é financeiramente insustentável.</li>



<li><strong>A segurança jurídica fica fragilizada:</strong> Sem uma orquestração automatizada, o risco de falha humana e sanções administrativas pesadas (como as multas da LGPD) permanece alto.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">A Solução: Governança Nativa por Meio de Middleware</h2>



<p class="wp-block-paragraph">A tese central da pesquisa desenvolvida na UFRN, que agora se tornou propriedade intelectual protegida, parte do princípio do <em>Privacy by Design</em>. Em vez de forçar cada microsserviço ou equipe de desenvolvimento a criar sua própria lógica de exclusão e conformidade, centralizamos essa inteligência em uma camada agnóstica: um <strong>middleware de orquestração</strong>.</p>



<p class="wp-block-paragraph">O componente patenteado funciona como um maestro invisível em sistemas distribuídos. Ele intercepta de forma segura as requisições de privacidade, mapeia as dependências de dados e garante que o fluxo de exclusão ocorra de forma resiliente, assíncrona e totalmente auditável — sem comprometer a performance, a escalabilidade ou a disponibilidade do ecossistema de software da empresa.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="926" src="https://ramondomingos.com.br/wp-content/uploads/2026/05/image-1024x926.png" alt="" class="wp-image-336" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/05/image-1024x926.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/05/image-300x271.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/05/image-768x695.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/05/image-1536x1389.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2026/05/image.png 1694w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Registro oficial do componente de arquitetura distribuída voltado para conformidade nativa à LGPD.</figcaption></figure>



<p class="wp-block-paragraph">Para o negócio, isso significa:</p>



<ol start="1" class="wp-block-list">
<li><strong>Mitigação Absoluta de Risco:</strong> Processos automatizados e à prova de falhas, gerando relatórios de conformidade prontos para auditorias.</li>



<li><strong>Eficiência de Engenharia:</strong> Os times de desenvolvimento voltam a focar nas regras de negócio e no produto, pois a governança de dados passa a ser uma engrenagem nativa da infraestrutura.</li>



<li><strong>Valor de Mercado:</strong> Empresas que protegem a privacidade dos clientes com tecnologia proprietária e escalável aumentam drasticamente seu valuation e sua confiabilidade no mercado B2B e B2C.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O Próximo Capítulo: Ciência de Ponta com Impacto no Mercado</h2>



<p class="wp-block-paragraph">A conquista da patente e a conclusão do mestrado coroam um ciclo de validação rigorosa. Ela prova que a pesquisa científica de ponta realizada no Brasil, quando alinhada às dores reais do mercado corporativo, é capaz de gerar ativos de altíssimo valor.</p>



<p class="wp-block-paragraph">Garantir a privacidade não precisa ser um freio para a inovação; pode ser o motor que posiciona sua infraestrutura tecnológica anos à frente da concorrência.</p>



<p class="wp-block-paragraph"><em>Gostaria de expressar meu profundo agradecimento à <strong>UFRN</strong> por toda a infraestrutura e suporte, e em especial ao meu orientador, <strong>Prof. Dr. Eiji Adachi Medeiros Barbosa</strong>, cuja orientação brilhante e visão estratégica foram fundamentais para transformar uma inquietação acadêmica em um componente tecnológico patenteado de impacto real. O futuro da engenharia de software é, obrigatoriamente, privado e seguro — e estamos prontos para ele.</em></p>
<p>O post <a href="https://ramondomingos.com.br/do-risco-a-inovacao-como-transformamos-a-conformidade-a-lgpd-em-propriedade-intelectual-patenteada/">Do Risco à Inovação: Como Transformamos a Conformidade à LGPD em Propriedade Intelectual Patenteada</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/do-risco-a-inovacao-como-transformamos-a-conformidade-a-lgpd-em-propriedade-intelectual-patenteada/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</title>
		<link>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/</link>
					<comments>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 15:41:10 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=291</guid>

					<description><![CDATA[<p>Muitas vezes este blog é um espaço de tutoriais, atualizações de frameworks e resoluções de bugs. Mas hoje, o commit é diferente. Recentemente, fechei um dos ciclos mais intensos da minha trajetória acadêmica e profissional: defendi meu mestrado. Se você me perguntasse há alguns meses como eu estava, a resposta técnica seria, processamento em 100%&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/">Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Muitas vezes este blog é um espaço de tutoriais, atualizações de frameworks e resoluções de bugs. Mas hoje, o <em>commit</em> é diferente. Recentemente, fechei um dos ciclos mais intensos da minha trajetória acadêmica e profissional: <strong>defendi meu mestrado.</strong></p>



<p class="wp-block-paragraph">Se você me perguntasse há alguns meses como eu estava, a resposta técnica seria, processamento em 100% de CPU, com vazamento de memória constante, pod em CrashLoopBackOff, <em>race conditions</em> , <em>deadlocks</em>  e <em>resource exhaustion</em>;  Mas a resposta humana é mais profunda. Olhar para a ata de defesa assinada não foi apenas o recebimento de um título; foi o momento em que o silêncio finalmente venceu o barulho mental de anos de cobrança.</p>



<h4 class="wp-block-heading">A Síndrome do Impostor: O Bug no Sistema</h4>



<p class="wp-block-paragraph">No mundo técnico, somos treinados para ter respostas. No mestrado, a primeira lição é aceitar que não sabemos quase nada. E é aí que a <strong>Síndrome do Impostor</strong> se instala.</p>



<p class="wp-block-paragraph">Em muitas noites, enquanto eu revisava o capítulo de teoria sobre <strong>Middleware, processamento distribuído</strong>, uma voz no fundo da mente dizia: <em>&#8220;Em algum momento, a banca vai perceber que eu não sou tão bom quanto pareço, passar na seleção foi pura sorte&#8221;</em>.</p>



<p class="wp-block-paragraph">A verdade que aprendi é que a síndrome do impostor não é um erro de sistema; ela é uma consequência de estar na fronteira do conhecimento. Se você sente que não sabe tudo, é porque finalmente chegou onde ninguém mais pisou exatamente do seu jeito. O título não cura a síndrome, mas te ensina que você é capaz de entregar resultados mesmo quando não se sente um &#8220;expert&#8221;.</p>



<h4 class="wp-block-heading">Atalhos que são, na verdade, Labirintos &#8211; DICA PARA QUEM TA COMEÇANDO NA PESQUISA! </h4>



<p class="wp-block-paragraph">Para quem está entrando agora no mestrado ou começando uma pesquisa, o instinto de desenvolvedor, o de otimizar processos, pode ser perigoso. No mestrado, <strong>atalhos raramente funcionam</strong>. </p>



<p class="wp-block-paragraph">RETIRE SEU CHAPEUZINHO DE DEV <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e2.png" alt="🧢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> E BOTE O DE PESQUISADOR<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3a9.png" alt="🎩" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<ul class="wp-block-list">
<li><strong>O atalho da leitura rápida:</strong> Tentar escrever sua fundamentação sem ler os artigos clássicos a fundo é como construir um sistema em cima de uma biblioteca que você não entende. Mais cedo ou mais tarde, o código quebra e você terá que refazer tudo do zero.</li>



<li><strong>Confie no processo</strong>: O seu orientador(a) ja fez isso várias vezes, ele/a sabe a ordem dos passos, se perder faz parte do processo, uma hora voce encontra o seu caminho.</li>



<li><strong>O atalho da &#8220;Ferramenta da Moda&#8221;:</strong> Não escolha um método ou tecnologia só porque ela está no topo do Hype Cycle. Se a ferramenta não resolve o seu problema científico, ela é apenas ruído acumulado no seu cronograma.</li>



<li><strong>O atalho do isolamento:</strong> Achar que pesquisar é um ato solitário é o erro mais comum. O mestrado é um esporte de equipe. O tempo que você economiza não falando com seu orientador ou com seus pares, você perde dando voltas em problemas que uma conversa de 15 minutos resolveria.</li>
</ul>



<h4 class="wp-block-heading">Conselhos de quem &#8220;sobreviveu&#8221; ao Quilômetro Zero</h4>



<p class="wp-block-paragraph">Se você está começando hoje, aqui estão três coisas que eu gostaria de ter ouvido logo no primeiro dia:</p>



<ol class="wp-block-list">
<li><strong>Documente seus &#8220;Erros&#8221;:</strong> No desenvolvimento, amamos logs. Na pesquisa, o resultado que deu errado também é ciência. Anote por que aquela abordagem não funcionou. Isso vale ouro na hora de escrever a conclusão.</li>



<li><strong>Defina seu MVP (Minimum Viable Thesis):</strong> O mestrado não é para resolver todos os problemas do mundo, mas para resolver UM problema com profundidade. Foque no coração da sua contribuição e deixe a perfumaria para o doutorado.</li>



<li><strong>Saúde Mental é Infraestrutura:</strong> Se o seu hardware (você) pifar, o software (a tese) não roda. Reserve janelas de tempo onde a tese não existe. Se puder, faça terapia, isso me ajudou muito. Normalmente, sua vida não irá parar para você fazer seu mestrado, problemas pessoais, familiares, e do trabalho irão continuar acontecendo, e irão concorrer com esse novo projeto.</li>
</ol>



<h4 class="wp-block-heading">Conclusão: A Realização é um Processo</h4>



<p class="wp-block-paragraph">A sensação de realização não veio na assinatura da ata, mas na percepção de que hoje sou capaz de encarar um problema complexo e sem resposta sem entrar em pânico. O mestrado me deu o título de Mestre, mas a jornada me deu a resiliência de quem sabe que, para debugar a vida, é preciso paciência e muitas iterações.</p>



<p class="wp-block-paragraph">Obrigado por me acompanharem nesta jornada técnica (e agora pessoal). Se você está no meio desse furacão chamado mestrado, saiba que o &#8220;deployment&#8221; final vale cada linha de esforço. </p>



<p class="wp-block-paragraph">E eu acho que já estou com saudades da UFRN&#8230;.</p>



<p class="wp-block-paragraph"></p>
<p>O post <a href="https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/">Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</title>
		<link>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/</link>
					<comments>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 29 Jul 2025 20:45:24 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=284</guid>

					<description><![CDATA[<p>No cotidiano do engenheiro de software, frequentemente nos deparamos com desafios complexos de integração de sistemas. Um conceito que surge bastante em discussões sobre sincronização de dados é o Dual Write. Pode parecer um termo técnico, mas vou tentar explicar de forma acessível para que todos, independentemente da área, possam entender o que é e&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/">O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">No cotidiano do engenheiro de software, frequentemente nos deparamos com desafios complexos de integração de sistemas. Um conceito que surge bastante em discussões sobre sincronização de dados é o <strong>Dual Write</strong>. Pode parecer um termo técnico, mas vou tentar explicar de forma acessível para que todos, independentemente da área, possam entender o que é e por que é importante.</p>



<h3 class="wp-block-heading">A Base: O Que Acontece Quando Você Salva Dados?</h3>



<p class="wp-block-paragraph">Imagine que você está usando um aplicativo bancário para transferir dinheiro. Quando você clica em &#8220;confirmar&#8221;, o sistema precisa registrar essa transação. Na maioria das vezes, essa informação é escrita em um <strong>banco de dados primário</strong>. Tudo simples até aqui, certo?</p>



<h3 class="wp-block-heading">Entendendo o Dual Write</h3>



<p class="wp-block-paragraph">O Dual Write (escrita dupla, em tradução livre) é exatamente o que o nome sugere: <strong>o processo de escrever os mesmos dados em dois sistemas de armazenamento de dados diferentes, de forma simultânea ou quase simultânea</strong>.</p>



<p class="wp-block-paragraph">Pense no nosso exemplo do aplicativo bancário. Se, além do banco de dados principal do banco, a informação da sua transação também fosse registrada <em>ao mesmo tempo</em> em um sistema de relatórios ou em um data warehouse para análise de dados. Isso seria um cenário de Dual Write.</p>



<h3 class="wp-block-heading">Por Que Usamos Dual Write?</h3>



<p class="wp-block-paragraph">Existem várias razões pelas quais um engenheiro de software escolheria implementar o Dual Write. As mais comuns incluem:</p>



<ul class="wp-block-list">
<li><strong>Sincronização de Dados em Tempo Real:</strong> Em muitos cenários, precisamos que as informações estejam atualizadas em múltiplos sistemas imediatamente. Por exemplo, se uma venda é feita no sistema de e-commerce, o estoque no sistema de gerenciamento de armazém precisa ser atualizado instantaneamente. O Dual Write garante que ambos os sistemas recebam a informação ao mesmo tempo.</li>



<li><strong>Redundância e Recuperação de Desastres:</strong> Ao escrever dados em dois lugares, você cria uma cópia de segurança. Se um sistema falhar, o outro ainda tem os dados, o que ajuda na recuperação e garante a continuidade do negócio.</li>



<li><strong>Integração de Sistemas Distintos:</strong> Às vezes, diferentes departamentos usam sistemas diferentes que precisam da mesma informação. Em vez de construir integrações complexas que puxam e empurram dados de um lado para o outro, o Dual Write pode ser uma solução mais direta para manter ambos atualizados.</li>



<li><strong>Desempenho Otimizado:</strong> Em alguns casos, um sistema pode ser otimizado para transações rápidas (por exemplo, um banco de dados de pedidos), enquanto outro é otimizado para análises complexas (um data warehouse). O Dual Write permite que cada sistema use os dados da forma mais eficiente para sua finalidade.</li>
</ul>



<h3 class="wp-block-heading">Os Desafios do Dual Write</h3>



<p class="wp-block-paragraph">Apesar de seus benefícios, o Dual Write não é uma bala de prata e apresenta seus próprios desafios:</p>



<ul class="wp-block-list">
<li><strong>Consistência dos Dados:</strong> O maior desafio é garantir que os dados sejam exatamente os mesmos em ambos os sistemas. O que acontece se uma escrita em um sistema falha e no outro não? É preciso ter mecanismos robustos para lidar com essas falhas e garantir a <strong>consistência</strong>.</li>



<li><strong>Complexidade na Implementação:</strong> Gerenciar duas escritas simultâneas, lidar com erros, retentativas e garantir a ordem correta das operações pode tornar a arquitetura do sistema mais complexa.</li>



<li><strong>Desempenho:</strong> Embora possa otimizar o desempenho para propósitos específicos, o Dual Write adiciona uma sobrecarga, pois cada operação de escrita precisa ser realizada duas vezes. Isso pode impactar a latência, especialmente se os sistemas estiverem geograficamente distantes.</li>



<li><strong>Tratamento de Conflitos:</strong> Se ambos os sistemas permitirem escritas independentes, pode haver conflitos que precisam ser resolvidos de forma inteligente para evitar dados inconsistentes.</li>
</ul>



<h3 class="wp-block-heading">Alternativas ao Dual Write</h3>



<p class="wp-block-paragraph">É importante mencionar que o Dual Write não é a única forma de sincronizar dados. Existem outras abordagens, como:</p>



<ul class="wp-block-list">
<li><strong>Event-Driven Architecture (Arquitetura Orientada a Eventos):</strong> Onde um sistema publica um &#8220;evento&#8221; (ex: &#8220;pedido criado&#8221;) e outros sistemas interessados escutam e reagem a esse evento, atualizando seus próprios dados. Isso é geralmente mais robusto e escalável para cenários complexos.</li>



<li><strong>ETL (Extract, Transform, Load):</strong> Processos que extraem dados de uma fonte, os transformam e os carregam em um destino. Isso geralmente acontece em lotes e é mais comum para data warehouses ou sistemas de relatórios onde a latência de tempo real não é crítica.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1024x1024.png" alt="" class="wp-image-285" srcset="https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1024x1024.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-300x300.png 300w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-150x150.png 150w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-768x768.png 768w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1536x1536.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading"></h3>



<p class="wp-block-paragraph">O Dual Write é uma técnica valiosa no arsenal de um engenheiro de software para manter sistemas em sincronia. Embora ofereça benefícios significativos em termos de sincronização em tempo real e redundância, é crucial entender seus desafios e considerar se é a melhor abordagem para um determinado problema. A escolha da estratégia de sincronização de dados depende das necessidades específicas do negócio, da tolerância a falhas e dos requisitos de desempenho.</p>



<p class="wp-block-paragraph">Espero que esta explicação tenha desmistificado o Dual Write para vocês! Se tiverem alguma dúvida ou quiserem compartilhar suas experiências, deixem um comentário.</p>
<p>O post <a href="https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/">O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</title>
		<link>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/</link>
					<comments>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Fri, 11 Jul 2025 16:57:49 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=278</guid>

					<description><![CDATA[<p>É com uma enorme alegria e um grande alívio que venho compartilhar uma excelente notícia: fui qualificado no meu mestrado! Este é um marco muito importante na minha jornada acadêmica e pessoal, e quero aproveitar para contar um pouco sobre essa experiência e, claro, apresentar o tema que me consumiu (no bom sentido!) nos últimos&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/">Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">É com uma enorme alegria e um grande alívio que venho compartilhar uma excelente notícia: <strong>fui qualificado no meu mestrado</strong>! Este é um marco muito importante na minha jornada acadêmica e pessoal, e quero aproveitar para contar um pouco sobre essa experiência e, claro, apresentar o tema que me consumiu (no bom sentido!) nos últimos tempos.<br><br>A qualificação é um momento de grande tensão, mas também de muito aprendizado. Foram meses de dedicação intensa, de imersão profunda na literatura, de noites de poucas horas de sono e de muito café. Enfrentar a banca, com professores tão experientes como <strong>Eiji Adachi Medeiros Barbosa (presidente,orientador), Frederico Araujo da Silva Lopes (membro interno) e Carlos Eduardo da Silva (membro externo)</strong>, foi desafiador, mas incrivelmente enriquecedor. As perguntas e sugestões foram cruciais para lapidar ainda mais a minha pesquisa e me deixam ainda mais motivado(a) para a próxima etapa.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Meu Tema: Adaptando-se à LGPD com Middleware em Sistemas Distribuídos</h3>



<p class="wp-block-paragraph">Minha pesquisa, intitulada &#8220;<strong>Adaptação à LGPD: Proposta de Middleware para a Implementação do Direito ao Esquecimento em Sistemas Distribuídos</strong>&#8220;, mergulha em um desafio crescente para muitas empresas: como garantir o <strong>direito ao esquecimento</strong> de dados, exigido pela <strong>LGPD</strong>, em sistemas modernos baseados em <strong>microsserviços</strong>?</p>



<p class="wp-block-paragraph">Para quem não está familiarizado, sistemas de microsserviços são complexos, com dados espalhados e gerenciados de forma independente. Isso torna a exclusão consistente e confiável de dados uma tarefa manual e suscetível a erros, com grandes ramificações legais se não for bem executada.</p>



<p class="wp-block-paragraph">É aí que entra a minha proposta! Desenvolvi uma solução de <strong>middleware automatizada</strong>, utilizando o padrão <em>two-phase commit (2PC)</em>, para orquestrar a exclusão de dados de forma consistente e segura nesses ambientes distribuídos. Além disso, criei uma biblioteca que pode ser facilmente importada em códigos existentes, simplificando a vida dos desenvolvedores e facilitando a adesão às regulamentações. Em minhas 118 páginas de trabalho, detalho a arquitetura e avalio o desempenho dessa abordagem, demonstrando sua eficácia para um problema que hoje é repleto de complexidade manual.</p>



<p class="wp-block-paragraph">Em resumo, o objetivo é oferecer uma solução robusta e escalável que capacite as organizações a gerenciar efetivamente a exclusão de dados em ambientes de microsserviços, promovendo maior confiança e adesão às regulamentações de proteção de dados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Quem é próximo a mim, sabe que eu, mesmo fazendo um trabalho bom, fico diversas vezes inseguro; Em relação a essa apresentação não poderia ser diferente; Quando eu vi meu nome no site da UFRN, com a data da defesa (<a href="https://sigaa.ufrn.br/sigaa/public/programa/noticias_desc.jsf?lc=pt_BR&amp;id=7872&amp;noticia=182750128">link</a>), começou o nervosismo, o medo de não responder adequadamente alguma pergunta, mesmo estando imerso no tema por 2 anos.</p>



<p class="wp-block-paragraph">Minha dica pra quem chegou nesse momento:</p>



<p class="wp-block-paragraph">Os professores estão ali para contribuir como seu trabalho, para ele ficar mais maduro;</p>



<p class="wp-block-paragraph">Seu orientador JAMAIS iria deixar você levar algo que não esteja suficiente para aquele momento;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="576" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-576x1024.jpeg" alt="" class="wp-image-279" srcset="https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-576x1024.jpeg 576w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-169x300.jpeg 169w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-768x1365.jpeg 768w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-864x1536.jpeg 864w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-1152x2048.jpeg 1152w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-scaled.jpeg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Este é um passo gigante e sou imensamente grato a todos que me apoiaram nessa jornada. A energia agora se renova para os próximos desafios até a defesa final!</p>
<p>O post <a href="https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/">Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</title>
		<link>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/</link>
					<comments>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 17:51:52 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=270</guid>

					<description><![CDATA[<p>Olá, pessoal! Se você notou um silêncio maior do que o normal por aqui, tem uma boa razão para isso: estou imerso na escrita da minha tese de mestrado! Como muitos de vocês que trabalham com TI e buscam aprofundar seus conhecimentos, sei que a jornada acadêmica exige uma dedicação enorme. Conciliar as horas de&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/">Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Olá, pessoal!</p>



<p class="wp-block-paragraph">Se você notou um silêncio maior do que o normal por aqui, tem uma boa razão para isso: estou imerso na escrita da minha tese de mestrado! Como muitos de vocês que trabalham com TI e buscam aprofundar seus conhecimentos, sei que a jornada acadêmica exige uma dedicação enorme.</p>



<p class="wp-block-paragraph">Conciliar as horas de pesquisa, escrita e revisão com a rotina de um blog de TI e o meu trabalho, é, sem dúvida, um desafio. Confesso que tem sido uma verdadeira maratona, mas estou aprendendo muito no processo – tanto sobre o tema da minha tese quanto sobre <strong>gerenciamento de tempo e prioridades</strong>!</p>



<p class="wp-block-paragraph">Ainda não quero detalhar muito sobre o assunto da tese, mas em breve, espero trazer alguns insights e, quem sabe, até um post mais aprofundado sobre a minha pesquisa. Por enquanto, a prioridade máxima é entregar um trabalho de qualidade.</p>



<p class="wp-block-paragraph">Agradeço a compreensão de todos vocês e prometo que, assim que tiver um fôlego, voltarei com conteúdo novo e interessante. Enquanto isso, continuem explorando os posts antigos e deixando seus comentários!</p>



<p class="wp-block-paragraph">Em breve, mais novidades!</p>



<p class="wp-block-paragraph">Um abraço,</p>
<p>O post <a href="https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/">Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</title>
		<link>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/</link>
					<comments>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Fri, 18 Apr 2025 01:49:51 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=263</guid>

					<description><![CDATA[<p>Em aplicações distribuídas ou mesmo em backends complexos construídos com FastAPI, rastrear o caminho completo de uma requisição pode ser um desafio. Quando ocorrem erros ou gargalos de performance, saber exatamente qual serviço ou parte do código foi o responsável é crucial para um debugging eficiente. É aí que entram os Trace IDs (IDs de&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/">Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Em aplicações distribuídas ou mesmo em backends complexos construídos com FastAPI, rastrear o caminho completo de uma requisição pode ser um desafio. Quando ocorrem erros ou gargalos de performance, saber exatamente qual serviço ou parte do código foi o responsável é crucial para um debugging eficiente.</p>



<p class="wp-block-paragraph">É aí que entram os <strong>Trace IDs</strong> (IDs de rastreamento)! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Um Trace ID é um identificador único gerado para cada requisição que entra na sua aplicação. Esse ID é propagado por todos os serviços e componentes envolvidos no processamento daquela requisição, permitindo que você correlacione logs e métricas de diferentes partes do sistema.</p>



<p class="wp-block-paragraph"><strong>Por que usar Trace IDs no seu FastAPI?</strong></p>



<ul class="wp-block-list">
<li><strong>Debugging Facilitado:</strong> Rastreie o fluxo completo de uma requisição, desde o ponto de entrada até a resposta final, identificando exatamente onde ocorreu um erro ou lentidão.</li>



<li><strong>Análise de Performance:</strong> Visualize o tempo gasto em cada etapa do processamento, identificando gargalos e áreas para otimização.</li>



<li><strong>Observabilidade Aprimorada:</strong> Integre com ferramentas de logging e monitoramento (como ELK Stack, Grafana Loki, Datadog) para ter uma visão centralizada do comportamento da sua aplicação.</li>



<li><strong>Microserviços:</strong> Essencial em arquiteturas de microsserviços para entender a interação entre diferentes serviços em uma única requisição.</li>
</ul>



<p class="wp-block-paragraph"><strong>Como implementar Trace IDs no FastAPI?</strong></p>



<p class="wp-block-paragraph">Existem algumas maneiras de implementar Trace IDs no seu FastAPI:</p>



<p class="wp-block-paragraph"><strong>1. Middleware Personalizado:</strong></p>



<p class="wp-block-paragraph">Você pode criar um middleware personalizado para gerar um Trace ID para cada requisição e adicioná-lo aos headers da requisição e/ou ao contexto da aplicação.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from fastapi import FastAPI, Request, Response
from uuid import uuid4
import logging

app = FastAPI()
logger = logging.getLogger(__name__)

TRACE_ID_HEADER = &quot;X-Request-ID&quot;

@app.middleware(&quot;http&quot;)
async def add_trace_id(request: Request, call_next):
    trace_id = request.headers.get(TRACE_ID_HEADER) or str(uuid4())
    request.state.trace_id = trace_id
    response: Response = await call_next(request)
    response.headers[TRACE_ID_HEADER] = trace_id
    logger.info(f&quot;Request: {request.method} {request.url} - Trace ID: {trace_id}&quot;)
    return response

@app.get(&quot;/&quot;)
async def read_root(request: Request):
    trace_id = request.state.trace_id
    logger.info(f&quot;Processing root endpoint - Trace ID: {trace_id}&quot;)
    return {&quot;Hello&quot;: &quot;World&quot;, &quot;trace_id&quot;: trace_id}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastapi </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastAPI</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Response</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> uuid </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> uuid4</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">app </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastAPI</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">logger </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">getLogger</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">__name__</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">TRACE_ID_HEADER </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">X-Request-ID</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">middleware</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">add_trace_id</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">call_next</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">TRACE_ID_HEADER</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">or</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">uuid4</span><span style="color: #ECEFF4">())</span></span>
<span class="line"><span style="color: #D8DEE9FF">    request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">call_next</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">TRACE_ID_HEADER</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Request: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> - Trace ID: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">trace_id</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> response</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_root</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Processing root endpoint - Trace ID: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">trace_id</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">trace_id</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> trace_id</span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Explicação:</strong></p>



<ul class="wp-block-list">
<li>O middleware <code>add_trace_id</code> é executado para cada requisição HTTP.</li>



<li>Ele tenta obter um Trace ID do header <code>X-Request-ID</code> (uma prática comum). Se não existir, gera um novo UUID.</li>



<li>O Trace ID é armazenado no <code>request.state</code> para ser acessado em outras partes da sua aplicação.</li>



<li>O Trace ID também é adicionado como um header na resposta.</li>



<li>Você pode incluir o Trace ID nos seus logs para facilitar o rastreamento.</li>
</ul>



<p class="wp-block-paragraph"><strong>2. Utilizando Bibliotecas de Observabilidade:</strong></p>



<p class="wp-block-paragraph">Bibliotecas como <strong>Opentracing</strong> ou <strong>Opentelemetry</strong> oferecem soluções mais completas para tracing distribuído, incluindo a geração e propagação de Trace IDs, além de integração com diversas ferramentas de observabilidade.</p>



<p class="wp-block-paragraph"><strong>Exemplo com Opentelemetry (simplificado):</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from fastapi import FastAPI, Request
from opentelemetry import trace
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

app = FastAPI()
propagator = TraceContextTextMapPropagator()
tracer = trace.get_tracer(__name__)

@app.middleware(&quot;http&quot;)
async def trace_request(request: Request, call_next):
    carrier = {}
    for k, v in request.headers.items():
        carrier[k] = v
    context = propagator.extract(carrier)
    with tracer.start_as_current_span(f&quot;{request.method} {request.url.path}&quot;, context=context) as span:
        span.set_attribute(&quot;http.method&quot;, request.method)
        span.set_attribute(&quot;http.url&quot;, str(request.url))
        response = await call_next(request)
        span.set_attribute(&quot;http.status_code&quot;, response.status_code)
        return response

@app.get(&quot;/&quot;)
async def read_root():
    current_span = trace.get_current_span()
    current_span.set_attribute(&quot;greeting&quot;, &quot;Hello World&quot;)
    return {&quot;Hello&quot;: &quot;World&quot;}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastapi </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastAPI</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Request</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> opentelemetry </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> trace</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> opentelemetry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">propagation</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">tracecontext </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> TraceContextTextMapPropagator</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">app </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastAPI</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">propagator </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">TraceContextTextMapPropagator</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">tracer </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get_tracer</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">__name__</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">middleware</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">trace_request</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">call_next</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    carrier </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> k</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> v </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">        carrier</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">k</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> v</span></span>
<span class="line"><span style="color: #D8DEE9FF">    context </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> propagator</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">extract</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">carrier</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> tracer</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">start_as_current_span</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;</span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">path</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">context</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">context</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> span</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.method</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.url</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">        response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">call_next</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.status_code</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">status_code</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> response</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_root</span><span style="color: #ECEFF4">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">    current_span </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get_current_span</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">    current_span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">greeting</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Considerações Importantes:</strong></p>



<ul class="wp-block-list">
<li><strong>Propagação:</strong> Em arquiteturas com múltiplos serviços, é crucial garantir que o Trace ID seja propagado corretamente entre as chamadas HTTP. Isso geralmente envolve passar o Trace ID em headers HTTP.</li>



<li><strong>Logging:</strong> Configure sua solução de logging para incluir o Trace ID em cada log, permitindo a correlação de eventos relacionados à mesma requisição.</li>



<li><strong>Ferramentas de Observabilidade:</strong> Integre sua aplicação com ferramentas de observabilidade para visualizar os traces, analisar a performance e identificar problemas de forma mais intuitiva.</li>
</ul>



<p class="wp-block-paragraph">Implementar Trace IDs no seu FastAPI é um investimento valioso que melhora significativamente a capacidade de entender, depurar e otimizar sua aplicação, especialmente em cenários mais complexos. Comece com um middleware simples e explore bibliotecas de observabilidade para uma solução mais robusta! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>O post <a href="https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/">Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</title>
		<link>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/</link>
					<comments>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Wed, 25 Sep 2024 16:31:38 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=254</guid>

					<description><![CDATA[<p>Olá, devs! Já pararam para pensar na importância de entender como seus projetos são utilizados? Enquanto o pessoal de marketing se concentra em analisar os dados para criar estratégias, os desenvolvedores têm um papel fundamental em garantir que os dados coletados sejam precisos e completos. Neste post, vamos explorar por que o Google Analytics é&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/">Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Olá, devs! </p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-text-align-left wp-block-paragraph">Recentemente consegui minha <a href="https://skillshop.credential.net/012ceb69-932e-44ff-b11d-57b112b85a2c">certificação Individual do Google Analytics </a>, e no início da jornada de estudo me perguntei, isso é para o pessoal de  Marketing ou para desenvolvedor?  Mas ao final, entendi que todo mundo precisa entender um pouco de analytics. Fazer sua aplicação gerar dados é fundamental, para identificar insights de todos os aspectos da aplicação. No fundo, ser guiados por dados é mais importante do que seguir seu sentimento.  E ter um google analytcs bem configurado, promoverá esses dados para toda equipe.</p>
</blockquote>
</blockquote>



<p class="wp-block-paragraph">Já pararam para pensar na importância de entender como seus projetos são utilizados? Enquanto o pessoal de marketing se concentra em analisar os dados para criar estratégias, os desenvolvedores têm um papel fundamental em garantir que os dados coletados sejam precisos e completos. Neste post, vamos explorar por que o Google Analytics é uma ferramenta importante para desenvolvedores coletar esses dados, nesse post especialmente iremos aplicar o GA numa aplicação  Next.js, mas facilmente é adaptável para outras aplicações, Te guiarei passo a passo na instalação e configuração do funil de vendas. Identificando desde o início da sessão, a primeira visita ao site, até efetuar a compra no checkout. Podendo assim, identificar a porcentagem de abandono de carrinhos, por exemplo.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">P<strong>or que os Desenvolvedores Devem Entender o Google Analytics?</strong></p>



<ul class="wp-block-list">
<li><strong>Otimização de Desempenho:</strong> Ao acompanhar métricas como tempo de carregamento de página, taxa de rejeição e erros, os desenvolvedores podem identificar gargalos e implementar melhorias para otimizar a experiência do usuário.</li>



<li><strong>Qualidade do Código:</strong> Analisando eventos e interações do usuário, é possível identificar bugs e problemas de usabilidade que podem passar despercebidos em testes.</li>



<li><strong>Validação de Hipóteses:</strong> Ao desenvolver novas funcionalidades, o Google Analytics permite validar se as mudanças estão tendo o impacto esperado nos usuários.</li>



<li><strong>Integração com Outras Ferramentas:</strong> O Google Analytics pode ser integrado com outras ferramentas de desenvolvimento, como ferramentas de monitoramento de desempenho e sistemas de versionamento, proporcionando uma visão mais completa do ciclo de vida do software.</li>
</ul>



<p class="wp-block-paragraph"><strong>Instalando o Google Analytics com Funil de Vendas em um Aplicação Next.js</strong></p>



<ul class="wp-block-list">
<li><strong>Criar uma Conta no Google Analytics:</strong> Se você ainda não tem uma conta, acesse o Google Analytics e crie uma nova propriedade para o seu site. (Provavelmente o marketing da empresa ja possuirá ) </li>



<li><strong>Obter o Código de Rastreamento:</strong> Após criar a propriedade, você receberá um código de rastreamento único.</li>



<li><strong>Instalar o Pacote do Google Analytics:</strong> No seu projeto Next.js, instale o pacote oficial do Google Analytics.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" npm install @google/analytics" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">npm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@google/analytics</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Configurar o Rastreamento:</strong> Crie um componente customizado para envolver o seu aplicativo e enviar os dados para o Google Analytics.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const GoogleAnalytics = () =&gt; {
return (&lt;&gt;
/* 1. Initialize the Google tag and gtag.js library */
   &lt;!-- Google tag (gtag.js) --&gt;
   &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=TAG_ID&quot;&gt;&lt;/script&gt;
   &lt;script&gt;
     window.dataLayer = window.dataLayer || [];
     function gtag(){dataLayer.push(arguments)};
     gtag('js', new Date());
     gtag('config', 'TAG_ID');
   &lt;/script&gt;
   &lt;/&gt;
   )
   
export { GoogleAnalytics };" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">&lt;&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">/* 1. Initialize the Google tag and gtag.js library */</span></span>
<span class="line"><span style="color: #D8DEE9FF">   &lt;!-- Google tag (gtag.js) --&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;script</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">src</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://www.googletagmanager.com/gtag/js?id=TAG_ID</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;&lt;/script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">     window.dataLayer = window.dataLayer || [];</span></span>
<span class="line"><span style="color: #D8DEE9FF">     function gtag()</span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">dataLayer</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">push</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">arguments</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">}</span><span style="color: #D8DEE9FF">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">     gtag(&#39;js&#39;, new Date());</span></span>
<span class="line"><span style="color: #D8DEE9FF">     gtag(&#39;config&#39;, &#39;TAG_ID&#39;);</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;/script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;/&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   )</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<ul class="wp-block-list">
<li>Use esse componente no layout principal da sua aplicação.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import { GoogleAnalytics } from &quot;seu_componente_google-analytics&quot;;
export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}&gt;) {
  return (
    &lt;html&gt;
      &lt;body&gt;
        {children}
        &lt;GoogleAnalytics /&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  );
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">seu_componente_google-analytics</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">RootLayout</span><span style="color: #ECEFF4">({</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">children</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> Readonly</span><span style="color: #ECEFF4">&lt;{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  children</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> React</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">ReactNode</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}&gt;)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;html&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">children</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;/body&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;/html&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  )</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<h2 class="wp-block-heading">Eventos principais</h2>



<p class="wp-block-paragraph">Para criar um funil de vendas, você precisa mapear alguns eventos:</p>



<ol class="wp-block-list">
<li>Início da sessão (o número de usuários que acionaram o evento  <a href="https://support.google.com/analytics/answer/9234069#session_start">session_start</a>)</li>



<li>Ver produto (o número de usuários que acionaram o evento  <a href="https://support.google.com/analytics/answer/9267735">view_item</a>)</li>



<li>Adicionar ao carrinho (o número de usuários que acionaram o evento <a href="https://support.google.com/analytics/answer/9267735">add_to_cart</a>)</li>



<li>Iniciar checkout (o número de usuários que acionaram o evento <a href="https://support.google.com/analytics/answer/9267735">begin_checkout</a>)</li>



<li>Compra (o número de usuários que acionaram  o evento <a href="https://support.google.com/analytics/answer/9267735">purchase</a> ou <a href="https://support.google.com/analytics/answer/9234069#in-app-purchase">in_app_purchase</a>)</li>
</ol>



<p class="wp-block-paragraph">Nos links de cada evento tem o formato de dados que devem ser enviados junto do evento, alguns não precisa enviar nada além do titulo do evento. É muito importante enviar exatamente os campos necessários, dados faltando, ou em excesso irá fazer com que o evento seja descartado.</p>



<p class="wp-block-paragraph">Para fazer o envio, basicamente será necessário usa a função, gtag. Aconselho criar uma função mais generalista e reutilizar em todos os lugares, pois será importante caso precise debugar, adicionar o <em>debug_mode:true</em>, em cada envio.)</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" window.gtag(&quot;event&quot;, event,eventParams ) " style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9">eventParams</span><span style="color: #D8DEE9FF"> ) </span></span></code></pre></div>



<p class="wp-block-paragraph">Exemplo para adicionar um  ou mais item ao carrinho:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="gtag(&quot;event&quot;, &quot;add_to_cart&quot;, {
  currency: &quot;BRL&quot;,
  value: 9.99,
  items: [
    {
      item_id: &quot;SKU_12345&quot;,
      item_name: &quot;Stan and Friends Tee&quot;,
      index: 0,
      price: 9.99,
      quantity: 1
    }
  ]
});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">add_to_cart</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">currency</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">BRL</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> [</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Stan and Friends Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ]</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Exemplo de purchase:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="gtag(&quot;event&quot;, &quot;purchase&quot;, {
    transaction_id: &quot;T_12345&quot;,
    value: 25.42,
    tax: 4.90,
    shipping: 5.99,
    currency: &quot;USD&quot;,
    coupon: &quot;SUMMER_SALE&quot;,
    items: [
     {
      item_id: &quot;SKU_12345&quot;,
      item_name: &quot;Stan and Friends Tee&quot;,
      affiliation: &quot;Google Merchandise Store&quot;,
      coupon: &quot;SUMMER_FUN&quot;,
      discount: 2.22,
      index: 0,
      item_brand: &quot;Google&quot;,
      item_category: &quot;Apparel&quot;,
      item_category2: &quot;Adult&quot;,
      item_category3: &quot;Shirts&quot;,
      item_category4: &quot;Crew&quot;,
      item_category5: &quot;Short sleeve&quot;,
      item_list_id: &quot;related_products&quot;,
      item_list_name: &quot;Related Products&quot;,
      item_variant: &quot;green&quot;,
      location_id: &quot;ChIJIQBpAG2ahYAR_6128GcTUEo&quot;,
      price: 9.99,
      quantity: 1
    },
    {
      item_id: &quot;SKU_12346&quot;,
      item_name: &quot;Google Grey Women's Tee&quot;,
      affiliation: &quot;Google Merchandise Store&quot;,
      coupon: &quot;SUMMER_FUN&quot;,
      discount: 3.33,
      index: 1,
      item_brand: &quot;Google&quot;,
      item_category: &quot;Apparel&quot;,
      item_category2: &quot;Adult&quot;,
      item_category3: &quot;Shirts&quot;,
      item_category4: &quot;Crew&quot;,
      item_category5: &quot;Short sleeve&quot;,
      item_list_id: &quot;related_products&quot;,
      item_list_name: &quot;Related Products&quot;,
      item_variant: &quot;gray&quot;,
      location_id: &quot;ChIJIQBpAG2ahYAR_6128GcTUEo&quot;,
      price: 20.99,
      promotion_id: &quot;P_12345&quot;,
      promotion_name: &quot;Summer Sale&quot;,
      quantity: 1
    }]
});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">purchase</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">transaction_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">T_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">25.42</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">tax</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4.90</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">shipping</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">currency</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">USD</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_SALE</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> [</span></span>
<span class="line"><span style="color: #D8DEE9FF">     </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Stan and Friends Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">affiliation</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Merchandise Store</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_FUN</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">discount</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2.22</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_brand</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Apparel</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category2</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Adult</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category3</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Shirts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category4</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Crew</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category5</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Short sleeve</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">related_products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Related Products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_variant</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">green</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">location_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ChIJIQBpAG2ahYAR_6128GcTUEo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12346</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Grey Women&#39;s Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">affiliation</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Merchandise Store</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_FUN</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">discount</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3.33</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_brand</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Apparel</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category2</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Adult</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category3</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Shirts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category4</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Crew</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category5</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Short sleeve</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">related_products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Related Products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_variant</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">gray</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">location_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ChIJIQBpAG2ahYAR_6128GcTUEo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">20.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">promotion_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">P_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">promotion_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Summer Sale</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">]</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Visualizando o funil de vendas. Em Relatório > Monetization/sales/vendas > Purchase Journey.  Ficará algo parecido com isso:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="506" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image.png" alt="" class="wp-image-256" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image.png 1000w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-300x152.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-768x389.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading">Debug view</h2>



<p class="wp-block-paragraph">Os dados do GA podem demorar ate 24h para surgirem nos relatório. Para você acompanhar em tempo real os eventos chegando, voce pode adicionar o modo debug,</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" window.gtag(&quot;event&quot;, event,{ ...eventParams, debug_mode: true});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">,{</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9">eventParams</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">debug_mode</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p class="wp-block-paragraph">(lembra que falei de criar uma função e reutilizar?)</p>



<p class="wp-block-paragraph">Em admin > Data Display > Debug view. Você irá acompanhar em tempo real todos os eventos. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="561" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1024x561.png" alt="" class="wp-image-258" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1024x561.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-300x164.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-768x421.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1536x841.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-2048x1122.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Eventos que possuem parâmetros, como <strong>items</strong> ficará assim:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="806" height="511" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2.png" alt="" class="wp-image-259" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2.png 806w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2-300x190.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2-768x487.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></figure>



<p class="wp-block-paragraph">Você pode estranhar o preço. Mas nesse <a href="https://stackoverflow.com/questions/67224841/ga4-price-is-appended-with-multiple-zeros">link do StackOverflow</a>, encontrei esse reposta:</p>



<p class="wp-block-paragraph">Isso não é um problema em relatórios reais e só aparece no DebugView.</p>



<p class="wp-block-paragraph">Internamente, o valor é multiplicado por 1000000 para que possa ser armazenado como um inteiro para economizar espaço. A ferramenta de depuração falha em convertê-lo de volta, mas relatórios reais parecem acertar.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="332" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-1024x332.png" alt="" class="wp-image-260" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-1024x332.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-300x97.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-768x249.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3.png 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Dominar o Google Analytics é uma habilidade fundamental para qualquer desenvolvedor que busca criar produtos digitais de sucesso. Ao entender como os usuários interagem com seus aplicativos, você pode tomar decisões mais informadas e entregar experiências cada vez melhores.</p>



<p class="wp-block-paragraph"><strong>Dicas Extras:</strong></p>



<ul class="wp-block-list">
<li><strong>Personalização:</strong> Explore as opções de personalização do Google Analytics para criar relatórios personalizados e segmentar seus dados.</li>



<li><strong>Integrações:</strong> Descubra as diversas integrações do Google Analytics com outras ferramentas para obter uma visão mais completa dos seus dados.</li>



<li><strong>Aprendizado Contínuo:</strong> O Google Analytics está em constante evolução. Mantenha-se atualizado sobre as novas funcionalidades e recursos.</li>
</ul>



<p class="wp-block-paragraph">E aí, gostou deste guia? Compartilhe suas experiências nos comentários e me diga quais outras ferramentas você utiliza para analisar seus projetos.</p>
<p>O post <a href="https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/">Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</title>
		<link>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/</link>
					<comments>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 21:52:42 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=247</guid>

					<description><![CDATA[<p>Este projeto tem repositório no github: https://github.com/ramondomiingos/PPGTI2001-cloud-computing/. Então, alguns códigos mais extensos estão apenas lá, e não aqui, principalmente os .yaml . Mas sempre irei botar o link para o exato arquivo que estou me referenciando. Este projeto foi a avaliação da disciplina Computação em Nuvem, PPGTI2001, do mestrado da UFRN. É necessário criar um&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/">Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Este projeto tem repositório no github: <a href="https://github.com/ramondomiingos/PPGTI2001-cloud-computing/">https://github.com/ramondomiingos/PPGTI2001-cloud-computing/</a>. Então, alguns códigos mais extensos estão apenas lá, e não aqui, principalmente os .yaml . Mas sempre irei botar o link para o exato arquivo que estou me referenciando.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-1024x1024.png" alt="" class="wp-image-249" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-1024x1024.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-300x300.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-150x150.png 150w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-768x768.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial.png 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Este projeto foi a avaliação da disciplina Computação em Nuvem, PPGTI2001, do mestrado da UFRN. É necessário criar um pod com vários contêineres, deve ser gerado e atender aos seguintes requisitos:</p>



<p class="wp-block-paragraph">&#8211; O pod deve ter 4 containers e deve ser criado usando um Manifesto do Kubernetes (arquivo yaml);</p>



<p class="wp-block-paragraph">Alunos:</p>



<p class="wp-block-paragraph">-Ramon Domingos Duarte Oliveira </p>



<p class="wp-block-paragraph">&#8211; <a href="https://www.linkedin.com/in/gerfesson/">Gerfesson Santos da Nóbrega</a></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Já que você ja aprendeu a configurar o k8s em sua máquina, conforme o<a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/"> post anterior</a>, agra vamos subir as aplicações.</p>



<p class="wp-block-paragraph"><strong>front,back, cache e mongodb.</strong></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading"><strong>Sobre aplicativos</strong></h2>



<h2 class="wp-block-heading"><strong>API</strong></h2>



<p class="wp-block-paragraph">API de registro de produto</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="{

&quot;nome&quot;: &quot;PEN_BLACK&quot;,

&quot;description&quot;: &quot;caneta preta, com corpo transparente&quot;,

&quot;qtdDisponível&quot;: 12

}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">nome</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">PEN_BLACK</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">description</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">caneta preta, com corpo transparente</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">qtdDisponível</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">12</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<ul class="wp-block-list">
<li>/produto `(get, post)`</li>



<li>/produto/:id `(put, delete, get)`</li>
</ul>



<h2 class="wp-block-heading"><strong> FRONT</strong></h2>



<p class="wp-block-paragraph">Aplicativo que consome a API, exibindo listagens e formulários.</p>



<p class="wp-block-paragraph">Usando<a href=" https://refine.dev/"> https://refine.dev/</a> como modelo base.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="249" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1024x249.png" alt="" class="wp-image-248" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1024x249.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-300x73.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-768x187.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1536x374.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3.png 1935w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Docker-compose</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="version: '3.7'
services:
  redis-service:
    container_name: redis-database
    image: 'bitnami/redis:latest'
    ports:
      - &quot;6379:6379&quot;
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
  front:
    build:
      context: ./front
      dockerfile: Dockerfile
    container_name: front
    expose:
      - '3000'
    ports:
      - '3000:3000'
    environment:
      API_URL: api
      NEXT_PUBLIC_API_URL: api
      NEXT_PUBLIC_API_URL_PORT: 8002
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    container_name: api
    expose:
      - '8002'
    ports:
      - '8002:8001'
    environment:
      - PORT=8001
      - REDIS_URL=redis-service
      - REDIS_PORT=6379
      - REDIS_EXPIRE=10
      - MONGO_USERNAME=root
      - MONGO_PASSWORD=example
      - MONGO_URL=mongo:27017
      - MONGO_DB=product
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - '27017:27017'" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">version</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3.7</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">redis-service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">redis-database</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">bitnami/redis:latest</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">6379:6379</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ALLOW_EMPTY_PASSWORD=yes</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">front</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./front</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">front</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">expose</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3000</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3000:3000</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">API_URL</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">NEXT_PUBLIC_API_URL</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">NEXT_PUBLIC_API_URL_PORT</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8002</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">api</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">expose</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">8002</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">8002:8001</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PORT=8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_URL=redis-service</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_PORT=6379</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_EXPIRE=10</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_USERNAME=root</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_PASSWORD=example</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_URL=mongo:27017</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_DB=product</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">mongo</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mongo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">always</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">MONGO_INITDB_ROOT_USERNAME</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">root</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">MONGO_INITDB_ROOT_PASSWORD</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">example</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">27017:27017</span><span style="color: #ECEFF4">&#39;</span></span></code></pre></div>



<p class="wp-block-paragraph">Para executar usando apenas docker-compose use:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="docker-compose up" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">docker-compose</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">up</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Serviços:</h2>



<ul class="wp-block-list">
<li>mongo: MongoDB para registro de produtos</li>



<li>redis: cache para solicitações frequentes</li>



<li>api: API REST para conectar-se ao banco de dados.</li>



<li>front: Frente usando React.</li>
</ul>



<h2 class="wp-block-heading"><strong>Kubernets</strong></h2>



<p class="wp-block-paragraph"><strong> Etapa 1: Envie estas imagens para DockerHub pessoal (opcional)</strong></p>



<p class="wp-block-paragraph">Para construir a imagem da API</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd api
docker build -t &lt;your_username&gt;/api-products .
docker push  &lt;your_username&gt;/api-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/api-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/api-products</span></span></code></pre></div>



<p class="wp-block-paragraph">Para construir a imagem do front</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd frontend
docker build -t &lt;your_username&gt;/front-products .
docker push  &lt;your_username&gt;/front-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">frontend</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/front-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/front-products</span></span></code></pre></div>



<p class="wp-block-paragraph">Se você criar imagens personalizadas, vá para os arquivos `k8s/*-deployment` e altere a imagem para a sua.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">As imagens MONGO e REDIS são imagens oficiais, já estão disponíveis no dockerhub para uso.</p>



<p class="has-medium-font-size wp-block-paragraph"><em> Espera-se que o ambiente da máquina já esteja pré-configurado e domine um trabalhador unido, usando o comando `kubeadm join &#8211;token`</em></p>



<h2 class="wp-block-heading"><strong> Etapa 2: Criar namespace</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get ns

kubectl create namespace products-application

kubectl get ns

kubectl config get-contexts

kubectl config set-context --current --namespace=products-application" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">products-application</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get-contexts</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">set-context</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--current</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--namespace=products-application</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>[output]</strong></p>



<p class="wp-block-paragraph"><em>kubectl config set-context &#8211;current &#8211;namespace=products-application</em></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl config get-contexts" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get-contexts</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>[output]</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>CURRENT</td><td>NAME</td><td>CLUSTER</td><td>AUTHINFO</td><td>NAMESPACE</td></tr><tr><td>*</td><td>kubernetes-admin@kubernetes </td><td>kubernetes</td><td>kubernetes-admin </td><td>products-api</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading"><strong>Etapa 3: crie uma implantação</strong></h2>



<p class="wp-block-paragraph">Nos arquivos de implantação, há detalhes sobre o <strong>**image docker**</strong> e um <strong>**imagePullPolicy**</strong>. Neste exemplo é Sempre,</p>



<p class="wp-block-paragraph">para Sempre implantar, obtenha uma nova imagem para o dockerhub.</p>



<p class="wp-block-paragraph">O comando de linha é</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl create deployment redis --image=redis --port=5701" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">redis</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--image=redis</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--port=5701</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">mas, no diretório <a href="https://github.com/ramondomiingos/PPGTI2001-cloud-computing/tree/main/k8s">k8s</a> tem 4 arquivos yaml para [api,front,mongo,redis]-deployment.yaml</p>



<p class="wp-block-paragraph">exempo do api-deployment</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="apiVersion: apps/v1
kind: Deployment
metadata:
metadata:
  annotations:
   
   
metadata:   
  annotations:
   
   
  labels:
    app: api
  name: api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      annotations:
      annotations:
       
       
      annotations: 
       
       
      labels:
        app: api
    spec:
      containers:
        - env:
            - name: MONGO_DB
              value: product
            - name: MONGO_PASSWORD
              value: example
            - name: MONGO_URL
              value: $(MONGO_SERVICE_HOST):27017
            - name: MONGO_USERNAME
              value: root
            - name: PORT
              value: &quot;8001&quot;
            - name: REDIS_EXPIRE
              value: &quot;10&quot;
            - name: REDIS_PORT
              value: &quot;6379&quot;
            - name: REDIS_URL
              value: $(REDIS_SERVICE_SERVICE_HOST)
          image:  ramondomiingos/api-products
          imagePullPolicy: Always
          name: api
          ports:
            - containerPort: 8001
              hostPort: 8001
              protocol: TCP
      restartPolicy: Always" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apps/v1</span></span>
<span class="line"><span style="color: #8FBCBB">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Deployment</span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #8FBCBB">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">replicas</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">selector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">containers</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">env</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_DB</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">product</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_PASSWORD</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">example</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_URL</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">$(MONGO_SERVICE_HOST):27017</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_USERNAME</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">root</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PORT</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8001</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_EXPIRE</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">10</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_PORT</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">6379</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_URL</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">$(REDIS_SERVICE_SERVICE_HOST)</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">ramondomiingos/api-products</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">imagePullPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Always</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">restartPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Always</span></span></code></pre></div>



<p class="wp-block-paragraph">Os outros estão na mesma pasta [mongo, redis e front] </p>



<p class="wp-block-paragraph"><strong>### Etapa 4: crie um serviço</strong></p>



<p class="wp-block-paragraph">para expor a aplicação para fora do k8s, é necessário criar um serviço</p>



<p class="wp-block-paragraph">Você pode criar com um comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl create service nodeport web-products --tcp=3000:3000 --node-port=30300" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl create service nodeport web-products --tcp=3000:3000 --node-port=30300</span></span></code></pre></div>



<p class="wp-block-paragraph">confira a criação</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get service" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl get service</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>TYPE</td><td>CLUSTER-IP</td><td>EXTERNAL-IP </td><td>PORT(S) </td><td>AGE</td></tr><tr><td>web-products </td><td>NodePort</td><td>10.97.135.212 </td><td>&lt;none&gt; </td><td>3000:30300 | TCP</td><td> 3s </td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>No diretório k8s tem 4 arquivos yaml para [api,front,mongo,redis]-service.yaml</strong></p>



<h2 class="wp-block-heading"><strong>Etapa 5: Envie arquivos para o nó MASTER.</strong></h2>



<p class="wp-block-paragraph">na pasta `k8s`tem 9 arquivos implantação e serviço para [api, front, mongo e Redis]</p>



<p class="wp-block-paragraph">e 1 arquivo para <strong>**ingress**</strong>;</p>



<p class="wp-block-paragraph">envie este arquivo para o seu mestre (pode usar scp)</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="scp k8s/* remote_username@10.10.0.2:/remote/directory" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">scp k8s/* remote_username@10.10.0.2:/remote/directory</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>### Etapa 6: Aplicar arquivo de especificação</strong></p>



<p class="wp-block-paragraph">Em sequência é necessário aplicar este arquivo e verificar os pods.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl apply -f ." style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl apply -f .</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">&#8220;`</p>



<p class="wp-block-paragraph"><strong>**[</strong><strong>output</strong><strong>]**</strong></p>



<p class="wp-block-paragraph">For apply all files use `kubectl apply -f .`</p>



<p class="wp-block-paragraph"><strong>**[</strong><strong>output</strong><strong>]**</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="~kubectl apply -f .

deployment.apps/api created

service/api created

deployment.apps/front created

service/front created

deployment.apps/mongo created

service/mongo created

deployment.apps/redis-service created

service/redis-service created" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">~</span><span style="color: #D8DEE9FF">kubectl apply -f </span><span style="color: #88C0D0">.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/api</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/api</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/front</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/front</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/mongo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/mongo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/redis-service</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/redis-service</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get pods" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pods</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>outpu</strong>t</p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>0/4</td><td>ContainerCreating</td><td>0</td><td>40s</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">enquanto os contêineres são criados, verifique os logs com:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl logs web-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">web-products</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Se demorar muito para criar os containers com sucesso, verifique os logs individualmente para ver se ocorreu algum erro, se necessário corrija e aplique este arquivo novamente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl logs web-products -c [redis-service, mongo, frontend, api]" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">web-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-c</span><span style="color: #D8DEE9FF"> [redis-service, </span><span style="color: #A3BE8C">mongo,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">frontend,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api]</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>&gt; erro example:</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>3/4</td><td>CrashLoopBackOff</td><td>0</td><td>10m </td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">depois de alguns segundos, você pode executar este mesmo comando e verá:</p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>4/4</td><td>Running</td><td>0</td><td>22s</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading"><strong>Etapa 7: Verifique sua aplicação.</strong></h2>



<p class="wp-block-paragraph">Vá para o navegador, visite `<strong>http://&lt;ip-worker&gt;:3000</strong>` e veja o aplicativo.</p>



<p class="wp-block-paragraph">3000 é a porta exposta em arquivos yaml.</p>



<p class="wp-block-paragraph"><em><strong>Não contemplei volumes persistentes.</strong></em></p>



<h2 class="wp-block-heading"><strong> Aprendizagem pessoal</strong></h2>



<p class="wp-block-paragraph">&#8211; No nosso cenário precisamos expor a api, já que as requisições feitas pelo front eram do lado do cliente, usar um IP interno não funcionaria.</p>



<p class="wp-block-paragraph">&#8211; Todos os pods possuem muitas variáveis de ambiente no formato `&lt;NAME&gt;_SERVICE_HOST` para identificar outros serviços e podem ser usados em yaml como ambientes de configuração. [Exemplo](k8s/api-deployment.yaml) linha 39.</p>



<p class="wp-block-paragraph">&#8211; Para ver todos os ambientes você pode usar `kubectl exec &lt;pod-name&gt; printenv`.</p>



<p class="wp-block-paragraph">&#8211; Outro formato para URL é `&lt;service-name&gt;.&lt;namespace|default&gt;.svc.cluster.local:&lt;service-port&gt;`;</p>
<p>O post <a href="https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/">Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</title>
		<link>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/</link>
					<comments>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 16:48:11 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=241</guid>

					<description><![CDATA[<p>Você já ouviu falar sobre Kubernetes, a popular plataforma de orquestração de contêineres, e está ansioso para experimentá-la? Neste guia, vamos explorar como configurar um cluster Kubernetes em duas máquinas virtuais: uma para ser o Main (master) e outra para ser o nó de trabalho (worker). Vamos começar! Pré-Requisitos Antes de começarmos, certifique-se de que&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/">Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Você já ouviu falar sobre Kubernetes, a popular plataforma de orquestração de contêineres, e está ansioso para experimentá-la? Neste guia, vamos explorar como configurar um cluster Kubernetes em duas máquinas virtuais: uma para ser o Main (master) e outra para ser o nó de trabalho (worker). Vamos começar!</p>



<h2 class="wp-block-heading">Pré-Requisitos</h2>



<p class="wp-block-paragraph">Antes de começarmos, certifique-se de que você tem:</p>



<ul class="wp-block-list">
<li>Duas máquinas virtuais rodando um sistema operacional Linux (pode ser Ubuntu, CentOS, ou outro de sua preferência).</li>



<li>Conhecimento básico de administração de sistemas Linux.</li>



<li>Acesso root ou permissões de sudo em ambas as máquinas.</li>



<li>Conexão de rede entre as duas máquinas.</li>
</ul>



<h2 class="wp-block-heading">Passo 1: Configuração da Máquina Mestre (Master)</h2>



<p class="wp-block-paragraph">Na máquina que você deseja configurar como mestre, siga estes passos:</p>



<ol class="wp-block-list">
<li>Atualize o sistema operacional:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt update &amp;&amp; sudo apt upgrade -y
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">upgrade</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="2">
<li>Instale o Docker, que é um pré-requisito para o Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt install docker.io -y
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">docker.io</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="3">
<li>Configure o repositório do Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="codesudo apt-get update &amp;&amp; sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo &quot;deb https://apt.kubernetes.io/ kubernetes-xenial main&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">codesudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-transport-https</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">curl</span></span>
<span class="line"><span style="color: #88C0D0">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-s</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">https://packages.cloud.google.com/apt/doc/apt-key.gpg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-key</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span></span>
<span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">deb https://apt.kubernetes.io/ kubernetes-xenial main</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tee</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/apt/sources.list.d/kubernetes.list</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="4">
<li>Instale o Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt-get install -y kubelet kubeadm kubectl" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubelet</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubectl</span></span></code></pre></div>



<ol class="wp-block-list" start="5">
<li>Inicie o cluster Kubernetes no nó mestre (master):</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo kubeadm init
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">init</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="6">
<li>Após a inicialização, siga as instruções fornecidas pelo kubeadm para configurar o seu ambiente local do Kubernetes. Isso inclui a configuração do diretório do kubeconfig e a instalação de uma rede de pod. Por exemplo:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-p</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">cp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/kubernetes/admin.conf</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube/config</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">chown</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">$(</span><span style="color: #88C0D0">id</span><span style="color: #A3BE8C"> -u</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">:</span><span style="color: #ECEFF4">$(</span><span style="color: #88C0D0">id</span><span style="color: #A3BE8C"> -g</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube/config</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="7">
<li>Verifique o status do nó mestre (master):</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get nodes" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nodes</span></span></code></pre></div>



<h2 class="wp-block-heading">Passo 2: Configuração da Máquina de Trabalho (Worker)</h2>



<p class="wp-block-paragraph">Agora, vamos configurar a máquina que atuará como o nó de trabalho (worker). Repita os passos 1 a 4 da configuração da máquina mestre, e depois siga estas etapas adicionais:</p>



<ol class="wp-block-list">
<li>Junte o nó de trabalho ao cluster Kubernetes. Use o comando <code>kubeadm join</code> fornecido pelo comando <code>kubeadm init</code> que você executou na máquina mestre. Ele deve se parecer com algo assim:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo kubeadm join &lt;endereço_do_master&gt;:&lt;porta&gt; --token &lt;token&gt; --discovery-token-ca-cert-hash sha256:&lt;hash&gt;" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">join</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">endereço_do_maste</span><span style="color: #D8DEE9FF">r</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">:</span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">port</span><span style="color: #D8DEE9FF">a</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--token</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">toke</span><span style="color: #D8DEE9FF">n</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--discovery-token-ca-cert-hash</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sha256:</span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">has</span><span style="color: #D8DEE9FF">h</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Substitua <code>&lt;endereço_do_master>:&lt;porta></code>, <code>&lt;token></code> e <code>&lt;hash></code> pelos valores fornecidos pelo comando <code>kubeadm init</code> na máquina main.</p>



<ol class="wp-block-list" start="2">
<li>Depois que o nó de trabalho se juntar com sucesso ao cluster, volte para a máquina mestre e verifique o status dos nós:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get nodes" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nodes</span></span></code></pre></div>



<pre class="wp-block-preformatted"></pre>



<p class="wp-block-paragraph">Você deve ver ambos os nós listados como &#8220;Ready&#8221;.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Parabéns! Você configurou com sucesso um cluster Kubernetes com um nó mestre e um nó de trabalho. Agora você pode começar a implantar e gerenciar seus aplicativos em contêineres de forma escalável e eficiente.</p>



<p class="wp-block-paragraph">Este guia forneceu apenas uma introdução básica ao Kubernetes. Existem muitos outros recursos e conceitos avançados para explorar, como implantações, serviços, e balanceamento de carga. Continue aprendendo e experimentando para dominar totalmente o poder do Kubernetes!</p>



<p class="wp-block-paragraph">Espero que este guia seja útil em sua jornada com Kubernetes. Se precisar de mais ajuda ou tiver alguma dúvida, sinta-se à vontade para entrar em contato.</p>
<p>O post <a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/">Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
