<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nuvem Dev</title>
    <description>The latest articles on DEV Community by Nuvem Dev (@nuvemdev).</description>
    <link>https://dev.to/nuvemdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4199270%2F181a0a75-dcd8-4f2e-a6a8-b903d93f3687.png</url>
      <title>DEV Community: Nuvem Dev</title>
      <link>https://dev.to/nuvemdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nuvemdev"/>
    <language>en</language>
    <item>
      <title>Script em Python pra calcular o custo real de uma VPN em promoção</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Fri, 13 Nov 2026 12:03:23 +0000</pubDate>
      <link>https://dev.to/nuvemdev/script-em-python-pra-calcular-o-custo-real-de-uma-vpn-em-promocao-3nbn</link>
      <guid>https://dev.to/nuvemdev/script-em-python-pra-calcular-o-custo-real-de-uma-vpn-em-promocao-3nbn</guid>
      <description>&lt;p&gt;Promoção de VPN costuma mostrar só o preço do primeiro período. O que pesa no bolso é a renovação. Em vez de fazer na calculadora, dá pra resolver em 15 linhas de Python.&lt;/p&gt;

&lt;p&gt;Os números abaixo vêm da página de preços do NordVPN em português, conferida em 13/11/2026 (Black Friday): plano Básico de 2 anos paga US$ 80,73 pelos primeiros 27 meses e renova a US$ 139,08/ano; o Completo paga US$ 107,73 em 27 meses e renova a US$ 219,48/ano.&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# custo_vpn.py&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;custo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;promo_total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meses_promo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renov_ano&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meses_total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meses_total&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;meses_promo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;promo_total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;renov_ano&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resto&lt;/span&gt;

&lt;span class="n"&gt;planos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"Basico 2 anos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;80.73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;139.08&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"Completo 2 anos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;107.73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;219.48&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;meses&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;planos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;custo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{meses:&amp;gt;2} meses | {nome:&amp;lt;16} | total US$ {t:7.2f} | media US$ {t/meses:5.2f}/mes"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 custo_vpn.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída que eu obtive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;27 meses | Basico 2 anos    | total US$   80.73 | media US$  2.99/mes
27 meses | Completo 2 anos  | total US$  107.73 | media US$  3.99/mes
39 meses | Basico 2 anos    | total US$  219.81 | media US$  5.64/mes
39 meses | Completo 2 anos  | total US$  327.21 | media US$  8.39/mes
51 meses | Basico 2 anos    | total US$  358.89 | media US$  7.04/mes
51 meses | Completo 2 anos  | total US$  546.69 | media US$ 10.72/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que dá pra tirar disso
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O "US$ 2,99" só é a média real se você usa exatamente os 27 meses e para.&lt;/li&gt;
&lt;li&gt;Depois da promoção, o Básico custa US$ 139,08 / 12 = US$ 11,59 por mês.&lt;/li&gt;
&lt;li&gt;Quer deixar o script mais útil? Troque &lt;code&gt;renov_ano&lt;/code&gt; pelo valor que aparecer na sua conta e acrescente IOF (cartão internacional) como um multiplicador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dica prática
&lt;/h2&gt;

&lt;p&gt;A renovação automática dá pra cancelar a qualquer momento na conta Nord, e você segue usando até o fim do período. Crie um lembrete no calendário 2 meses antes. O reembolso é de 30 dias após a compra inicial.&lt;/p&gt;

&lt;p&gt;Se quiser ver a oferta: &lt;a href="https://go.nowto.link/nord" rel="noopener noreferrer"&gt;NordVPN&lt;/a&gt; (link de afiliado). A versão em vídeo e a conta explicada estão na newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;Nuvem Dev no Substack&lt;/a&gt;. Outro post parecido, sobre VPS em promoção: &lt;a href="https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Transparência: o link do NordVPN é de afiliado e a Nuvem Dev pode receber comissão, sem custo extra pra você. Preços de 13/11/2026, podem mudar.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>privacy</category>
      <category>vpn</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Calculadora em Python: quanto sua loja Shopify custa no mês 4</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Thu, 12 Nov 2026 12:09:57 +0000</pubDate>
      <link>https://dev.to/nuvemdev/calculadora-em-python-quanto-sua-loja-shopify-custa-no-mes-4-2618</link>
      <guid>https://dev.to/nuvemdev/calculadora-em-python-quanto-sua-loja-shopify-custa-no-mes-4-2618</guid>
      <description>&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3j7i8t09bztttu8dsusr.jpg" alt="poster" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Shopify anuncia "3 dias grátis, depois US$ 1 por mês durante 3 meses". Antes de assinar, eu prefiro ver o custo do primeiro ano em números. Segue um script pequeno.&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# custo_shopify.py&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;primeiro_ano&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;promo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meses_promo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mensal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;39.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;meses_promo&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;promo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;meses_promo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mensal&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;por_venda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taxa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.029&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fixa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;taxa&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fixa&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Primeiro ano (Basic mensal):"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;primeiro_ano&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Primeiro ano se o anual for US$ 29/mês:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;29.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Taxa numa venda de US$ 20:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;por_venda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 custo_shopify.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída esperada pela conta é 354.0 no mensal, 348.0 no anual e 0.88 de taxa numa venda de US$ 20. Os valores de entrada (US$ 39 mensal, US$ 29 anual, 2,9% + US$ 0,30) são os da página brasileira da Shopify em 12/11/2026. Confira na sua tela: a página pode exibir em R$ conforme o local.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a conta mostra
&lt;/h2&gt;

&lt;p&gt;O mês 4 é o que importa. Se a loja ainda não vende, você paga US$ 39 por mês. Ajuste &lt;code&gt;mensal=&lt;/code&gt; e &lt;code&gt;meses_promo=&lt;/code&gt; pro seu caso e acrescente o IOF do cartão (3,5% em compra internacional, confira no seu banco).&lt;/p&gt;

&lt;h2&gt;
  
  
  Quer testar a loja?
&lt;/h2&gt;

&lt;p&gt;Dá pra começar pelo teste grátis: &lt;a href="https://go.nowto.link/shopify" rel="noopener noreferrer"&gt;https://go.nowto.link/shopify&lt;/a&gt; . Mais sobre custos de voz com IA no blog: &lt;a href="https://nuvemdev.wordpress.com/2026/11/11/elevenlabs-gratis-pode-ser-usado-em-video-monetizado-guia-dos-planos-2026/" rel="noopener noreferrer"&gt;https://nuvemdev.wordpress.com/2026/11/11/elevenlabs-gratis-pode-ser-usado-em-video-monetizado-guia-dos-planos-2026/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Divulgação: o link da Shopify é de afiliado; posso receber comissão sem custo extra pra você. Preços podem mudar.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>python</category>
      <category>ecommerce</category>
      <category>braziliandev</category>
    </item>
    <item>
      <title>Script Python pra comparar planos de TTS: preço por mil créditos (ElevenLabs)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Wed, 11 Nov 2026 12:09:53 +0000</pubDate>
      <link>https://dev.to/nuvemdev/script-python-pra-comparar-planos-de-tts-preco-por-mil-creditos-elevenlabs-5a79</link>
      <guid>https://dev.to/nuvemdev/script-python-pra-comparar-planos-de-tts-preco-por-mil-creditos-elevenlabs-5a79</guid>
      <description>&lt;p&gt;Quando você compara planos de voz com IA, o preço mensal engana. O que importa é quanto custa cada mil créditos. Dá pra calcular em 3 linhas de Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fne4ly58bw4bfnw7lxp7q.jpg" alt="Resumo em vídeo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Os dados (elevenlabs.io/pricing, 11/11/2026, em dólar)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Free: US$ 0, 10 mil créditos/mês, &lt;strong&gt;sem licença comercial&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Starter: US$ 6/mês (primeiro mês US$ 1), 30 mil créditos, licença comercial&lt;/li&gt;
&lt;li&gt;Creator: US$ 22/mês (primeiro mês US$ 11), 121 mil créditos
## O script
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;planos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Starter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Creator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cred&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;planos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{nome}: US$ {preco}/mes, {cred} creditos -&amp;gt; US$ {preco/cred*1000:.3f} por 1000 creditos"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 custo.py
Starter: US$ 6/mes, 30000 creditos -&amp;gt; US$ 0.200 por 1000 creditos
Creator: US$ 22/mes, 121000 creditos -&amp;gt; US$ 0.182 por 1000 creditos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que o resultado diz
&lt;/h2&gt;

&lt;p&gt;A diferença entre os dois é de uns 9%. Então não vale subir de plano só pelo "desconto": suba quando você estourar os 30 mil créditos todo mês. E o ponto que pesa mais que preço: o Free não tem licença comercial, então não use em vídeo monetizado.&lt;br&gt;
Se só quer testar, o Piper (TTS offline com voz pt-BR) roda de graça. Mais uma conta de custo parecida, agora com GPU, no meu post da newsletter: &lt;a href="https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e&lt;/a&gt;&lt;br&gt;
Quer testar a ElevenLabs? Meu link: &lt;a href="https://go.nowto.link/elevenlabs" rel="noopener noreferrer"&gt;https://go.nowto.link/elevenlabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Divulgação: o link acima é de afiliado. Posso receber uma comissão se você contratar, sem custo extra pra você. Preços da página oficial na data citada; podem mudar.&lt;/em&gt;__&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Calculando quanto custa alugar GPU por hora (RunPod) com Python</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Tue, 10 Nov 2026 12:11:58 +0000</pubDate>
      <link>https://dev.to/nuvemdev/calculando-quanto-custa-alugar-gpu-por-hora-runpod-com-python-26k3</link>
      <guid>https://dev.to/nuvemdev/calculando-quanto-custa-alugar-gpu-por-hora-runpod-com-python-26k3</guid>
      <description>&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhi78qkwzc4gy7q5ns8sf.jpg" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de alugar uma GPU pra rodar um LLM, vale uma conta rápida. Esse script calcula o custo mensal por GPU a partir das horas de uso por dia. Os preços vieram da página oficial runpod.io/pricing (atualizada em 4/11/2026, em dólar).&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# custo.py&lt;/span&gt;
&lt;span class="n"&gt;gpus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"RTX 3090 (24GB)"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"RTX 4090 (24GB)"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.89&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A100 (80GB)"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.79&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;dias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;gpus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{n}: US$ {p:.2f}/h -&amp;gt; {h:g}h/dia x {dias} dias = US$ {p*h*dias:.2f}/mes | 24h x 30 = US$ {p*24*30:.2f}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Saída real (rodei aqui)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 custo.py 2
RTX 3090 (24GB): US$ 0.50/h -&amp;gt; 2h/dia x 22 dias = US$ 22.00/mes | 24h x 30 = US$ 360.00
RTX 4090 (24GB): US$ 0.89/h -&amp;gt; 2h/dia x 22 dias = US$ 39.16/mes | 24h x 30 = US$ 640.80
A100 (80GB): US$ 1.79/h -&amp;gt; 2h/dia x 22 dias = US$ 78.76/mes | 24h x 30 = US$ 1288.80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que a conta mostra
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2h por dia numa 4090 fica perto de US$ 39 no mês.&lt;/li&gt;
&lt;li&gt;A mesma 4090 ligada 24h por 30 dias passa de US$ 640. O erro caro é esquecer o pod ligado.&lt;/li&gt;
&lt;li&gt;Armazenamento é cobrado à parte: volume disk US$ 0,10/GB/mês rodando e US$ 0,20/GB/mês parado, segundo a mesma página.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dica: troque &lt;code&gt;dias&lt;/code&gt; e as horas pelo seu uso real, e adicione a GPU que você pretende usar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pra continuar
&lt;/h2&gt;

&lt;p&gt;Se o seu modelo é pequeno e o uso é leve, talvez uma VPS comum resolva. Fiz uma conta parecida pra VPS aqui: &lt;a href="https://dev.to/nuvemdev/calculando-o-custo-real-de-uma-vps-em-promocao-com-python-a-conta-do-mes-25-3lc1"&gt;https://dev.to/nuvemdev/calculando-o-custo-real-de-uma-vps-em-promocao-com-python-a-conta-do-mes-25-3lc1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Versão em vídeo e newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se quiser testar a RunPod, meu link: &lt;a href="https://go.nowto.link/runpod" rel="noopener noreferrer"&gt;https://go.nowto.link/runpod&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: o link acima é de afiliado; posso receber comissão sem custo extra pra você. Preços podem mudar, confira na página oficial.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Calculando o custo real de uma VPS em promoção com Python (a conta do mês 25)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Mon, 09 Nov 2026 12:20:23 +0000</pubDate>
      <link>https://dev.to/nuvemdev/calculando-o-custo-real-de-uma-vps-em-promocao-com-python-a-conta-do-mes-25-3lc1</link>
      <guid>https://dev.to/nuvemdev/calculando-o-custo-real-de-uma-vps-em-promocao-com-python-a-conta-do-mes-25-3lc1</guid>
      <description>&lt;p&gt;Preço de VPS em promoção quase sempre vale pra um período fixo. Depois disso vem a renovação. Em vez de fazer a conta de cabeça, escrevi um script curto em Python. Os preços abaixo são os que a página da Hostinger mostrava em 09/11/2026 pro plano KVM 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# custo.py&lt;/span&gt;
&lt;span class="n"&gt;promo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;42.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1031.76&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;77.99&lt;/span&gt;
&lt;span class="n"&gt;meses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="n"&gt;pago&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total24&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;renov&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meses&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"24 meses pagos adiantado: R$ {total24:.2f}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"+ {meses-24} meses a R$ {renov:.2f}: R$ {renov*(meses-24):.2f}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"total {meses} meses: R$ {pago:.2f} | media R$ {pago/meses:.2f}/mes (anuncio: R$ {promo:.2f})"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 custo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída real que eu tive aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;24 meses pagos adiantado: R$ 1031.76
+ 12 meses a R$ 77.99: R$ 935.88
total 36 meses: R$ 1967.64  | media R$ 54.66/mes  (anuncio: R$ 42.99)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que ler disso
&lt;/h2&gt;

&lt;p&gt;A média em 36 meses fica em R$ 54,66, não em R$ 42,99. A diferença é a renovação de R$ 77,99, 81% acima do preço promocional. Troque &lt;code&gt;meses&lt;/code&gt; por 24, 48 ou o prazo que você pretende ficar e veja onde o plano deixa de compensar.&lt;/p&gt;

&lt;p&gt;Dica prática: ponha no script o preço de outro provedor (em dólar, converta pela cotação do dia) e compare a média mensal, não o preço do anúncio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pra rodar o quê?
&lt;/h2&gt;

&lt;p&gt;Uma VPS dessas aguenta Ollama pequeno, n8n ou um monitor de uptime. Eu mostrei como subir o n8n com Docker neste outro post: &lt;a href="https://dev.to/nuvemdev/hospedando-o-n8n-numa-vps-com-docker-passo-a-passo-4e2i"&gt;https://dev.to/nuvemdev/hospedando-o-n8n-numa-vps-com-docker-passo-a-passo-4e2i&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se quiser ver o plano da Hostinger: &lt;a href="https://go.nowto.link/hostinger" rel="noopener noreferrer"&gt;https://go.nowto.link/hostinger&lt;/a&gt; . Alternativa mais barata em dólar: &lt;a href="https://go.nowto.link/racknerd" rel="noopener noreferrer"&gt;https://go.nowto.link/racknerd&lt;/a&gt; . Eu mando mais contas assim na newsletter: &lt;a href="https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com/p/o-preco-da-vps-em-promocao-nao-e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Divulgação: links de afiliado. Se você comprar por eles, posso receber uma comissão, sem custo extra pra você.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>vps</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Monitore seus sites de graça: Uptime Kuma com Docker numa VPS</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Sun, 08 Nov 2026 12:13:39 +0000</pubDate>
      <link>https://dev.to/nuvemdev/monitore-seus-sites-de-graca-uptime-kuma-com-docker-numa-vps-1og7</link>
      <guid>https://dev.to/nuvemdev/monitore-seus-sites-de-graca-uptime-kuma-com-docker-numa-vps-1og7</guid>
      <description>&lt;p&gt;&lt;a href="https://nuvemdev.substack.com/p/seu-site-caiu-e-voce-so-ficou-sabendo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgq8fnxskja7wzo9gn4a.jpg" alt="Uptime Kuma poster" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se o seu site cair às 3 da manhã, você quer saber antes do cliente. O Uptime Kuma faz isso e roda em um container.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que você precisa
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uma VPS com Docker (1 GB de RAM basta para começar)&lt;/li&gt;
&lt;li&gt;Uma porta liberada (3001)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Sobe o container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run -d --restart=always -p 3001:3001 \
  -v uptime-kuma:/app/data \
  --name uptime-kuma louislam/uptime-kuma:2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Confere se está de pé
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps --filter &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;uptime-kuma
curl -I http://localhost:3001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Configura
&lt;/h2&gt;

&lt;p&gt;Abra &lt;code&gt;http://IP-DA-VPS:3001&lt;/code&gt;, crie o usuário admin, clique em &lt;strong&gt;Add New Monitor&lt;/strong&gt;, tipo HTTP(s), cole a URL do site e defina o intervalo. Em &lt;strong&gt;Setup Notification&lt;/strong&gt; escolha Telegram, e-mail ou Discord.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Atualizar depois
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull louislam/uptime-kuma:2
docker stop uptime-kuma &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker rm uptime-kuma
&lt;span class="c"&gt;# rode o comando do passo 1 de novo: os dados ficam no volume&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cuidados
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Não monitore o site a partir do próprio servidor dele: se a máquina cai, o monitor cai junto.&lt;/li&gt;
&lt;li&gt;Coloque um proxy reverso com HTTPS antes de expor o painel na internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Onde rodar
&lt;/h2&gt;

&lt;p&gt;Na tabela da RackNerd (08/11/2026) o plano de 1 GB aparece a US$ 17,99/mês e o de 2 GB a US$ 20,59/mês: &lt;a href="https://go.nowto.link/racknerd" rel="noopener noreferrer"&gt;https://go.nowto.link/racknerd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quer receber mais tutoriais assim? Assine a newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt; . Outro tutorial relacionado: &lt;a href="https://dev.to/nuvemdev"&gt;https://dev.to/nuvemdev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: o link da RackNerd é de afiliado; posso receber comissão sem custo extra pra você.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>selfhosted</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Hospedando o n8n numa VPS com Docker: passo a passo</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Sat, 07 Nov 2026 12:14:59 +0000</pubDate>
      <link>https://dev.to/nuvemdev/hospedando-o-n8n-numa-vps-com-docker-passo-a-passo-4e2i</link>
      <guid>https://dev.to/nuvemdev/hospedando-o-n8n-numa-vps-com-docker-passo-a-passo-4e2i</guid>
      <description>&lt;p&gt;Quer rodar automações sem pagar por execução? O n8n roda bem em Docker. Aqui vai o passo a passo, baseado na documentação oficial (docs.n8n.io). Eu não rodei isso num servidor novo hoje, os comandos são os da doc; ajuste ao seu caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que você precisa
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uma VPS Linux com Docker instalado (2 GB de RAM é um ponto de partida confortável)&lt;/li&gt;
&lt;li&gt;Um domínio, se quiser HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Instale o Docker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl -fsSL https://get.docker.com &lt;span class="o"&gt;|&lt;/span&gt; sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Crie um volume e suba o n8n
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create n8n_data

docker run -d --restart unless-stopped \
  --name n8n \
  -p 5678:5678 \
  -e &lt;span class="nv"&gt;GENERIC_TIMEZONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"America/Sao_Paulo"&lt;/span&gt; \
  -e &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"America/Sao_Paulo"&lt;/span&gt; \
  -e &lt;span class="nv"&gt;N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; \
  -v n8n_data:/home/node/.n8n \
  n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra &lt;a href="http://IP-DA-VPS:5678" rel="noopener noreferrer"&gt;http://IP-DA-VPS:5678&lt;/a&gt; e crie a conta de dono.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Backup do volume
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run --rm -v n8n_data:/data -v &lt;span class="nv"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:/backup alpine \
  tar czf /backup/n8n_data.tar.gz -C /data .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Atualizar
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull n8nio/n8n
docker rm -f n8n
&lt;span class="c"&gt;# rode o docker run do passo 2 de novo (o volume mantém seus fluxos)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cuidados
&lt;/h2&gt;

&lt;p&gt;Não deixe a porta 5678 aberta sem HTTPS e senha forte. Ponha um proxy reverso (Caddy ou Nginx) na frente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual VPS?
&lt;/h2&gt;

&lt;p&gt;Pra testar, a RackNerd lista hoje o plano de 2 GB a US$ 20,59/mês (512 MB a US$ 26,99/ano; confira na página): &lt;a href="https://go.nowto.link/racknerd" rel="noopener noreferrer"&gt;https://go.nowto.link/racknerd&lt;/a&gt;&lt;br&gt;
Mais custos de servidor barato no meu newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: alguns links deste texto são de afiliado. Se você contratar por eles, posso ganhar uma comissão, sem custo extra pra você.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>docker</category>
      <category>automation</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Narração em português grátis e offline com Piper (Python)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Fri, 06 Nov 2026 12:08:50 +0000</pubDate>
      <link>https://dev.to/nuvemdev/narracao-em-portugues-gratis-e-offline-com-piper-python-4ija</link>
      <guid>https://dev.to/nuvemdev/narracao-em-portugues-gratis-e-offline-com-piper-python-4ija</guid>
      <description>&lt;p&gt;Você não precisa de API paga pra narrar vídeo em português. O Piper roda local. Testei os comandos abaixo no Linux, Python 3.12, sem GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Instalar
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install piper-tts
python3 -m piper.download_voices pt_BR-faber-medium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso baixa &lt;code&gt;pt_BR-faber-medium.onnx&lt;/code&gt; e o &lt;code&gt;.json&lt;/code&gt; de configuração pra pasta atual.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Gerar um áudio
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Olá, essa é uma narração gerada offline."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; t.txt
python3 -m piper -m pt_BR-faber-medium.onnx -i t.txt -f t.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma frase curta levou cerca de 3 segundos aqui, CPU comum. O &lt;code&gt;--length-scale 1.1&lt;/code&gt; deixa a fala um pouco mais lenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Narrar uma pasta de roteiros
&lt;/h2&gt;

&lt;p&gt;Um &lt;code&gt;.txt&lt;/code&gt; por cena dentro de &lt;code&gt;roteiro/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;

&lt;span class="no"&gt;MODELO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"pt_BR-faber-medium.onnx"&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arq&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"roteiro"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"*.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;saida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"narracao_{i:02d}.wav"&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"python3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"-m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"piper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"-m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;MODELO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"-i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"-f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"-&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída que obtive com dois roteiros de teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a.txt -&amp;gt; narracao_01.wav
b.txt -&amp;gt; narracao_02.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Juntar com o vídeo (ffmpeg)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg -i video.mp4 -i narracao_01.wav -map 0:v -map 1:a -c:v copy -c:a aac -shortest final.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Limites honestos
&lt;/h2&gt;

&lt;p&gt;A voz é clara, mas menos expressiva que serviços pagos. Pra tutorial e conteúdo informativo funciona bem. Pra anúncio emocional, teste um serviço pago, como o ElevenLabs (&lt;a href="https://go.nowto.link/elevenlabs" rel="noopener noreferrer"&gt;https://go.nowto.link/elevenlabs&lt;/a&gt;). Pela página de preços, o plano grátis deles não tem licença comercial; o Starter, que tem, custa US$ 6 por mês.&lt;/p&gt;

&lt;p&gt;Newsletter completa: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: o link do ElevenLabs é de afiliado; posso ganhar comissão sem custo extra pra você.&lt;/p&gt;

</description>
      <category>python</category>
      <category>tts</category>
      <category>tutorial</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Isolando perfis de navegador com Python e Playwright (e quando usar um anti-detect)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Thu, 05 Nov 2026 12:09:33 +0000</pubDate>
      <link>https://dev.to/nuvemdev/isolando-perfis-de-navegador-com-python-e-playwright-e-quando-usar-um-anti-detect-87h</link>
      <guid>https://dev.to/nuvemdev/isolando-perfis-de-navegador-com-python-e-playwright-e-quando-usar-um-anti-detect-87h</guid>
      <description>&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnz95e7jbn6n3cr55j8m.jpg" alt="Vídeo" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando você tem várias contas (lojas, clientes), o primeiro passo é isolar o ambiente de cada uma. Um anti-detect faz isso com interface pronta. Mas dá pra entender o princípio em 30 linhas de Python com Playwright: cada perfil tem sua própria pasta de dados, então cookies e localStorage não se misturam.&lt;/p&gt;

&lt;p&gt;Aviso: isso é isolamento de sessão, não "invisibilidade". Use só em contas suas ou de clientes, seguindo os termos das plataformas.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Instalar
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install playwright
playwright install chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;playwright&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sync_api&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;

&lt;span class="no"&gt;PERFIS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"loja_a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"pt-BR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1366&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"loja_b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;sync_playwright&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;PERFIS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch_persistent_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"./perfil_{nome}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8765/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;visitas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"""() =&amp;gt; {
            const n = Number(localStorage.getItem('visitas') || 0) + 1;
            localStorage.setItem('visitas', n); return n; }"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"() =&amp;gt; [navigator.language, innerWidth, innerHeight]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"visitas:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visitas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"idioma/tela:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Rodar
&lt;/h2&gt;

&lt;p&gt;Em um terminal, sirva uma página qualquer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;oi&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.html
python3 -m http.server 8765
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No outro, rode o script duas vezes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 perfis.py
python3 perfis.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que eu vi (rodei no sandbox)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;loja_a visitas: 1 idioma/tela: ['pt-BR', 1366, 768]
loja_b visitas: 1 idioma/tela: ['en-US', 1920, 1080]
loja_a visitas: 2 idioma/tela: ['pt-BR', 1366, 768]
loja_b visitas: 2 idioma/tela: ['en-US', 1920, 1080]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada perfil guarda o seu contador (storage separado) e mantém idioma e tela próprios entre execuções.&lt;/p&gt;

&lt;h2&gt;
  
  
  E o anti-detect de verdade?
&lt;/h2&gt;

&lt;p&gt;Ferramentas como AdsPower, Incogniton e Dolphin Anty entregam isso com interface, gestão de proxy por perfil e equipe. Conferi os planos grátis em 05/11/2026: AdsPower tem 2 perfis grátis; Incogniton, 10 perfis nos 2 primeiros meses (depois 3); Dolphin tem plano Free e o Base com 100 perfis por US$ 89/mês. Comparação completa na newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links (afiliado): &lt;a href="https://go.nowto.link/adspower" rel="noopener noreferrer"&gt;AdsPower&lt;/a&gt;, &lt;a href="https://go.nowto.link/incog" rel="noopener noreferrer"&gt;Incogniton&lt;/a&gt;, &lt;a href="https://go.nowto.link/dolphin" rel="noopener noreferrer"&gt;Dolphin Anty&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Transparência: links de afiliado, posso ganhar comissão sem custo extra pra você. Preços podem mudar.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>playwright</category>
      <category>webdev</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Seu primeiro handler no RunPod Serverless: teste local antes de gastar um centavo</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Wed, 04 Nov 2026 12:04:42 +0000</pubDate>
      <link>https://dev.to/nuvemdev/seu-primeiro-handler-no-runpod-serverless-teste-local-antes-de-gastar-um-centavo-5882</link>
      <guid>https://dev.to/nuvemdev/seu-primeiro-handler-no-runpod-serverless-teste-local-antes-de-gastar-um-centavo-5882</guid>
      <description>&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljcoehc1g32fxga1lff0.jpg" alt="Nuvem Dev" width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;
Antes de fazer deploy de qualquer endpoint serverless, dá pra testar o handler na sua máquina. Foi o que eu fiz aqui (runpod SDK 2.1.0).&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Instalar
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install runpod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  2. O handler
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# handler.py&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;runpod&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"texto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"tamanho"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"maiusculo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;runpod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O worker recebe um job com a chave &lt;code&gt;input&lt;/code&gt; e devolve o que você retornar.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Arquivo de teste
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"input":{"texto":"ola nuvem"}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; test_input.json
python handler.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Se existe um &lt;code&gt;test_input.json&lt;/code&gt; na pasta, o SDK usa ele como entrada local. A saída que eu recebi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO   | Job result: {'output': {'tamanho': 9, 'maiusculo': 'OLA NUVEM'}}
INFO   | Local testing complete, exiting.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Onde está o custo de verdade
&lt;/h2&gt;

&lt;p&gt;Em produção, segundo a documentação de preços (04/11/2026), você paga por segundo e o worker flex escala a zero sem requisições. Mas são cobrados o cold start, a execução e o idle timeout (padrão 5 segundos). Se o seu handler carrega um modelo grande, carregue fora da função &lt;code&gt;handler&lt;/code&gt;, no nível do módulo, assim o carregamento acontece uma vez por worker e não a cada job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;runpod&lt;/span&gt;

&lt;span class="c1"&gt;# carrega UMA vez por worker (exemplo: seu modelo aqui)&lt;/span&gt;
&lt;span class="c1"&gt;# modelo = carregar_modelo()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# return modelo(job["input"]["prompt"])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;runpod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Próximo passo
&lt;/h2&gt;

&lt;p&gt;Empacotar num container, criar o endpoint no console e testar com uma requisição. Eu não rodei essa parte, então não vou prometer custo nem tempo de cold start.&lt;/p&gt;

&lt;p&gt;Resumo em vídeo e a newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se quiser criar conta no RunPod: &lt;a href="https://go.nowto.link/runpod" rel="noopener noreferrer"&gt;https://go.nowto.link/runpod&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais tutoriais da Nuvem Dev: veja também o post sobre monitor de VPS com systemd aqui no perfil.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Transparência: o link do RunPod é de afiliado, posso ganhar comissão sem custo extra pra você.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>serverless</category>
      <category>ai</category>
      <category>gpu</category>
    </item>
    <item>
      <title>Calculando o custo de narração com IA por caractere (script em Python)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Tue, 03 Nov 2026 12:06:58 +0000</pubDate>
      <link>https://dev.to/nuvemdev/calculando-o-custo-de-narracao-com-ia-por-caractere-script-em-python-4a8b</link>
      <guid>https://dev.to/nuvemdev/calculando-o-custo-de-narracao-com-ia-por-caractere-script-em-python-4a8b</guid>
      <description>&lt;p&gt;Quando o preço é por caractere, em vez de mensalidade, vale a pena ter um script pra estimar o custo antes de gerar áudio. Este aqui lê um roteiro e calcula quanto ia custar com os preços públicos da API da Murf.&lt;/p&gt;

&lt;p&gt;Preços na página oficial (&lt;a href="https://murf.ai/pricing" rel="noopener noreferrer"&gt;https://murf.ai/pricing&lt;/a&gt;, consultados em 03/11/2026): Falcon 2.1 a US$ 0,01 por 1000 caracteres, Gen2 a US$ 0,03 por 1000 caracteres, e teste grátis com US$ 10 em créditos de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# custo_tts.py&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="no"&gt;PRECOS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"falcon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"gen2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# US$ por 1000 caracteres&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;custo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;PRECOS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"utf-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;PRECOS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{m}: {len(texto)} caracteres -&amp;gt; US$ {custo(texto, m):.4f}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Quer narração com inteligência artificial por centavos?"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; roteiro.txt
python3 custo_tts.py roteiro.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída mostra o custo de cada modelo. Pra um roteiro de 1000 caracteres, dá US$ 0,01 no Falcon e US$ 0,03 no Gen2. Com os US$ 10 do teste, no Falcon são 1 milhão de caracteres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximo passo
&lt;/h2&gt;

&lt;p&gt;Troque o arquivo pelo roteiro real do seu vídeo e compare. Se quiser testar a API, crie a conta de teste da Murf: &lt;a href="https://go.nowto.link/murf" rel="noopener noreferrer"&gt;https://go.nowto.link/murf&lt;/a&gt; . Sobre o idioma, confira se a voz em português do Brasil atende o seu caso antes de gerar muito áudio.&lt;/p&gt;

&lt;p&gt;Mais conteúdo em português sobre IA e servidores: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: o link da Murf é de afiliado, posso receber comissão sem custo extra pra você.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>tts</category>
      <category>braziliandev</category>
    </item>
    <item>
      <title>Monitor de site em Python que roda 24h numa VPS pequena (systemd, sem dependências)</title>
      <dc:creator>Nuvem Dev</dc:creator>
      <pubDate>Mon, 02 Nov 2026 12:11:22 +0000</pubDate>
      <link>https://dev.to/nuvemdev/monitor-de-site-em-python-que-roda-24h-numa-vps-pequena-systemd-sem-dependencias-17k9</link>
      <guid>https://dev.to/nuvemdev/monitor-de-site-em-python-que-roda-24h-numa-vps-pequena-systemd-sem-dependencias-17k9</guid>
      <description>&lt;p&gt;Esse é um daqueles scripts que cabem em qualquer VPS de entrada (512 MB já sobra). Ele checa uma lista de URLs e imprime OK ou FALHOU com o tempo de resposta. Só biblioteca padrão.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. O script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="no"&gt;SITES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"FALHOU {url} ({e})"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"OK {url} {code} {int((time.time()-t)*1000)}ms"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;SITES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%H:%M:%S"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve como &lt;code&gt;/opt/monitor/monitor.py&lt;/code&gt;. Testei aqui: &lt;code&gt;python3 monitor.py https://example.com&lt;/code&gt; devolveu &lt;code&gt;OK https://example.com 200 68ms&lt;/code&gt;, e uma URL inexistente devolveu &lt;code&gt;FALHOU&lt;/code&gt; com o erro.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Rodar a cada 5 minutos com systemd timer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/etc/systemd/system/monitor.service&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//seusite.com.br&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/systemd/system/monitor.timer&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="na"&gt;OnBootSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1min&lt;/span&gt;
&lt;span class="na"&gt;OnUnitActiveSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5min&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now monitor.timer
journalctl -u monitor.service -n 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Os arquivos systemd eu escrevi seguindo a documentação, não rodei num servidor nesta publicação; teste na sua máquina antes de confiar.)&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Onde hospedar
&lt;/h2&gt;

&lt;p&gt;Qualquer VPS Linux serve. A RackNerd lista na página oficial (02/11/2026) um plano de entrada com 512 MB, 1 vCore e 30 GB por US$ 26,99 por ano. Pra um monitor desses é suficiente; pra rodar modelo de IA, não.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbffz9mkg3xmbzqsbay7p.jpg" alt="vídeo resumo" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais testes em pt-BR na newsletter: &lt;a href="https://nuvemdev.substack.com" rel="noopener noreferrer"&gt;https://nuvemdev.substack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Divulgação: o link da RackNerd (&lt;a href="https://go.nowto.link/racknerd" rel="noopener noreferrer"&gt;https://go.nowto.link/racknerd&lt;/a&gt;) é de afiliado; posso ganhar comissão sem custo extra pra você.&lt;/p&gt;

</description>
      <category>python</category>
      <category>linux</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
